diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2018-06-03 10:24:59 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2018-06-03 10:24:59 -0400 |
commit | 557c9268f05d160461112e429bf3dcbc64e82f12 (patch) | |
tree | 1d8e26a8d724bd0e11f09d346564c57dc29d3a23 /sort_sym.py | |
parent | 3a09446488e1c567820782201584345dc6517011 (diff) |
Add sort_sym.py
Diffstat (limited to 'sort_sym.py')
-rw-r--r-- | sort_sym.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/sort_sym.py b/sort_sym.py new file mode 100644 index 0000000..f4674e8 --- /dev/null +++ b/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() |