From aecce03834844f6c876d903a781443d65dbc11cb Mon Sep 17 00:00:00 2001 From: yenatch Date: Tue, 14 May 2013 18:11:19 -0400 Subject: wram.py: bss and constant parsing --- extras/wram.py | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 extras/wram.py (limited to 'extras/wram.py') diff --git a/extras/wram.py b/extras/wram.py new file mode 100644 index 000000000..00b80c48b --- /dev/null +++ b/extras/wram.py @@ -0,0 +1,60 @@ +# coding: utf-8 + +# RGBDS BSS section and constant parsing. + +def read_bss_sections(bss): + sections = [] + section = {} + address = None + if type(bss) is not list: bss = bss.split('\n') + for line in bss: + if 'SECTION' in line: + if section: sections.append(section) # last section + + address = int(line.split('[')[1].split(']')[0].replace('$',''), 16) + section = { + 'name': line.split('"')[1], + #'type': line.split(',')[1].split('[')[0].strip(), + 'start': address, + 'labels': [], + } + elif ':' in line: + # the only labels that don't use :s so far are enders, + # which we typically don't want to end up in the output + label = line.lstrip().split(':')[0] + if ';' not in label: + section['labels'] += [{'label': label, 'address': address, 'length': 0}] + elif line.lstrip()[:3] == 'ds ': + length = eval(line.lstrip()[3:].split(';')[0].replace('$','0x')) + address += length + if section['labels']: + section['labels'][-1]['length'] += length + sections.append(section) + return sections + +wram_sections = read_bss_sections(open('../wram.asm', 'r').readlines()) + + +def make_wram_labels(): + wram_labels = {} + for section in wram_sections: + for label in section['labels']: + if label['address'] not in wram_labels.keys(): + wram_labels[label['address']] = [] + wram_labels[label['address']] += [label['label']] + return wram_labels + +wram_labels = make_wram_labels() + + +def constants_to_dict(constants): + return dict((eval(constant.split(';')[0].split('EQU')[1].replace('$','0x')), constant.split('EQU')[0].strip()) for constant in constants) + +def scrape_constants(text): + if type(text) is not list: + text = text.split('\n') + return constants_to_dict([line for line in text if 'EQU' in line and ';' not in line.split('EQU')[0]]) + +hram_constants = scrape_constants(open('../hram.asm','r').readlines()) +gbhw_constants = scrape_constants(open('../gbhw.asm','r').readlines()) + -- cgit v1.2.3 From 0fc866caa5664f6e9755138423c1f4caaeed1b78 Mon Sep 17 00:00:00 2001 From: yenatch Date: Tue, 14 May 2013 20:25:43 -0400 Subject: wram: find() instead of split() --- extras/wram.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'extras/wram.py') diff --git a/extras/wram.py b/extras/wram.py index 00b80c48b..bad0b9fa9 100644 --- a/extras/wram.py +++ b/extras/wram.py @@ -8,10 +8,11 @@ def read_bss_sections(bss): address = None if type(bss) is not list: bss = bss.split('\n') for line in bss: + line = line.lstrip() if 'SECTION' in line: if section: sections.append(section) # last section - address = int(line.split('[')[1].split(']')[0].replace('$',''), 16) + address = eval(line[line.find('[')+1:line.find(']')].replace('$','0x')) section = { 'name': line.split('"')[1], #'type': line.split(',')[1].split('[')[0].strip(), @@ -21,11 +22,11 @@ def read_bss_sections(bss): elif ':' in line: # the only labels that don't use :s so far are enders, # which we typically don't want to end up in the output - label = line.lstrip().split(':')[0] + label = line[:line.find(':')] if ';' not in label: section['labels'] += [{'label': label, 'address': address, 'length': 0}] - elif line.lstrip()[:3] == 'ds ': - length = eval(line.lstrip()[3:].split(';')[0].replace('$','0x')) + elif line[:3] == 'ds ': + length = eval(line[3:line.find(';')].replace('$','0x')) address += length if section['labels']: section['labels'][-1]['length'] += length @@ -48,12 +49,12 @@ wram_labels = make_wram_labels() def constants_to_dict(constants): - return dict((eval(constant.split(';')[0].split('EQU')[1].replace('$','0x')), constant.split('EQU')[0].strip()) for constant in constants) + return dict((eval(constant[constant.find('EQU')+3:constant.find(';')].replace('$','0x')), constant[:constant.find('EQU')].strip()) for constant in constants) def scrape_constants(text): if type(text) is not list: text = text.split('\n') - return constants_to_dict([line for line in text if 'EQU' in line and ';' not in line.split('EQU')[0]]) + return constants_to_dict([line for line in text if 'EQU' in line[:line.find(';')]]) hram_constants = scrape_constants(open('../hram.asm','r').readlines()) gbhw_constants = scrape_constants(open('../gbhw.asm','r').readlines()) -- cgit v1.2.3