summaryrefslogtreecommitdiff
path: root/tools/sort_sym.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/sort_sym.py')
-rw-r--r--tools/sort_sym.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/tools/sort_sym.py b/tools/sort_sym.py
new file mode 100644
index 0000000..f4674e8
--- /dev/null
+++ b/tools/sort_sym.py
@@ -0,0 +1,68 @@
+#!/usr/bin/python3.6
+
+import argparse
+from functools import total_ordering
+
+
+@total_ordering
+class GBSection:
+ ROM0 = 0
+ ROMX = 1
+ VRAM = 2
+ SRAM = 3
+ WRAM0 = 4
+ WRAMX = 5
+
+ __thresholds__ = (0x4000, 0x8000, 0xa000, 0xc000, 0xd000, 0xe000)
+
+ def __init__(self, addr):
+ self.ident = sum(x <= addr for x in self.__thresholds__)
+
+ @property
+ def start(self):
+ if self.ident == self.ROM0:
+ return 0
+ return self.__thresholds__[self.ident - 1]
+
+ @property
+ def end(self):
+ return self.__thresholds__[self.ident]
+
+ def __eq__(self, other):
+ return self.ident == other.ident
+
+ def __lt__(self, other):
+ return self.ident < other.ident
+
+
+def read_sym(filename):
+ with open(filename) as fp:
+ for line in fp:
+ try:
+ line, *rest = line.split(';')
+ pointer, name = line.split()
+ bank, addr = (int(part, 16) for part in pointer.split(':'))
+ yield bank, addr, name
+ except ValueError:
+ continue
+
+
+def sort_key(args):
+ bank, addr, name = args
+ return GBSection(addr), bank, addr, name
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('symfile')
+ args = parser.parse_args()
+
+ symbols = list(read_sym(args.symfile))
+ symbols.sort(key=sort_key)
+ with open(args.symfile, 'w') as fp:
+ for bank, addr, name in symbols:
+ print(f'{bank:02X}:{addr:04X}', name, file=fp)
+
+
+if __name__ == '__main__':
+ main()