From e59a7c8d6f2c469fcb4cade67556f60f49ccb429 Mon Sep 17 00:00:00 2001 From: yenatch Date: Thu, 10 Jan 2013 03:00:46 -0500 Subject: [PATCH] add symfile generation --- extras/sym.py | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 extras/sym.py diff --git a/extras/sym.py b/extras/sym.py new file mode 100644 index 000000000..445abb155 --- /dev/null +++ b/extras/sym.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + +import json + +# from crystal import load_rom +# from gbz80disasm import load_labels + + +def make_sym_from_json(filename = '../pokecrystal.sym', j = 'labels.json'): + # todo: delete and remake labels.json at runtime + with open(filename, 'w') as sym: + for label in json.load(open(j)): + sym.write('{0:x}:{1:x} {2}\n'.format(label['bank'], label['address']&0x3fff, label['label'])) + + +def make_sym_from_mapfile(filename = '../pokecrystal.sym', mapfile = '../mapfile.txt'): + # todo: sort label definitions by address + + output = '' + # get label definitions + with open(mapfile,'r') as map: + lines = map.readlines() + for line in lines: + # bank # + if 'Bank #' in line: + cur_bank = int(line.lstrip('Bank #').strip(':\n').strip(' (HOME)')) + + # label definition + elif '=' in line: + thing = line.split('=') + spacing = ' ' * 11 # arbitrary + addr = int(thing[0].lstrip(spacing)[1:5],16) + + # rgbds doesn't support wram banks yet, + # so this hack is applied instead + if addr > 0xbfff: # 0xc000+ (wram only) + cur_bank = 0 + if addr > 0xcfff: # 0xd000+ (wram only) + cur_bank = 1 + + # convert to sym format (bank:addr label) + label = thing[1].strip('\n') + output += hex(cur_bank)[2:] + ':' + hex(addr)[2:] + ' ' + label + '\n' + + # dump contents to symfile + with open(filename, 'w') as sym: + sym.write(output) + + +if __name__ == "__main__": + # default behavior: generate sym file from rgbds mapfile + try: make_sym_from_mapfile() + # if no mapfile exists, generate from labels.json + except: make_sym_from_json()