summaryrefslogtreecommitdiff
path: root/sym.py
diff options
context:
space:
mode:
authoryenatch <yenatch@gmail.com>2013-01-10 03:00:46 -0500
committeryenatch <yenatch@gmail.com>2013-01-10 03:00:46 -0500
commite07544636dc62aaeaeeb6a20fea54676e8422a08 (patch)
tree59c077f69260cc9fe0630b17acde842cc8203577 /sym.py
parent636e7e1ec7498c7d11627d4346dd1233ac51e6c9 (diff)
add symfile generation
original-commit-id: e59a7c8d6f2c469fcb4cade67556f60f49ccb429
Diffstat (limited to 'sym.py')
-rw-r--r--sym.py54
1 files changed, 54 insertions, 0 deletions
diff --git a/sym.py b/sym.py
new file mode 100644
index 0000000..445abb1
--- /dev/null
+++ b/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()