diff options
Diffstat (limited to 'tools/make_shim.py')
-rw-r--r-- | tools/make_shim.py | 102 |
1 files changed, 41 insertions, 61 deletions
diff --git a/tools/make_shim.py b/tools/make_shim.py index d5e6e00..65d9362 100644 --- a/tools/make_shim.py +++ b/tools/make_shim.py @@ -1,60 +1,40 @@ #!/usr/bin/env python from __future__ import print_function -from sys import argv, stderr, exit - - -section_list = [ - {'end': 0x4000, 'invalid': False, 'name': "ROM0", 'banked': False}, - {'end': 0x8000, 'invalid': False, 'name': "ROMX", 'banked': True}, - {'end': 0xA000, 'invalid': False, 'name': "VRAM", 'banked': True}, - {'end': 0xC000, 'invalid': False, 'name': "SRAM", 'banked': True}, - {'end': 0xD000, 'invalid': False, 'name': "WRAM0", 'banked': False}, - {'end': 0xE000, 'invalid': False, 'name': "WRAMX", 'banked': True}, - {'end': 0xFE00, 'invalid': True , 'name': "Echo RAM"}, - {'end': 0xFEA0, 'invalid': False, 'name': "OAM", 'banked': False}, - {'end': 0xFF80, 'invalid': True , 'name': "FEXX / IO"}, - {'end': 0xFFFF, 'invalid': False, 'name': "HRAM", 'banked': False} -] - - -argv_id = 1 -file_list = [] -options = [] -while argv_id < len(argv): - arg = argv[argv_id] - - if arg[0] != '-': - file_list.append(arg) - argv_id += 1 - continue - - # An empty '--' stops parsing arguments - if arg == '--': - argv_id += 1 - break - - if arg[1] == '-': - options.append(option[2:]) - elif arg[1] != '-': - for option in arg[1:]: - options.append(option) - - argv_id += 1 - -# Add remaining files to the list -for arg in argv[argv_id:]: - file_list.append(arg) - - -if 'w' in options or 'd' in options: - section_list[4]['end'] = 0xE000 - -if 't' in options: - section_list[0]['end'] = 0x8000 - - -for file_name in file_list: +import argparse +from sys import stderr +from collections import OrderedDict, namedtuple + +Section = namedtuple('Section', ('end', 'invalud', 'banked')) +section_list = OrderedDict( + ROM0=Section(0x4000, False, False), + ROMX=Section(0x8000, False, True), + VRAM=Section(0xA000, False, True), + SRAM=Section(0xC000, False, True), + WRAM0=Section(0xD000, False, False), + WRAMX=Section(0xE000, False, True), + EchoRAM=Section(0xFE00, True, False), + OAM=Section(0xFEA0, False, False), + IO=Section(0xFF80, True, False), + HRAM=Section(0xFFFF, False, False) +) + +parser = argparse.ArgumentParser() +parser.add_argument('files', nargs='+', type=argparse.FileType()) +parser.add_argument('-w', action='store_true') +parser.add_argument('-d', action='store_true') +parser.add_argument('-t', action='store_true') +args = parser.parse_args() + + +if args.w or args.d: + section_list['WRAM0'].end = 0xE000 + +if args.t: + section_list['ROM0'].end = 0x8000 + + +for file_name in args.files: for line in open(file_name, "rt"): # Strip out the comment @@ -68,19 +48,19 @@ for file_name in file_list: bank, pointer = address.split(":") bank = int(bank, 16) pointer = int(pointer, 16) - except: + except ValueError: print("Error: Cannot parse line: %s" % line, file=stderr) - exit(1) + raise from None section = None - for section_type in section_list: - if pointer < section_type['end']: - if section_type['invalid']: + for name, section_type in section_list.items(): + if pointer < section_type.end: + if section_type.invalid: print("Warning: cannot shim '%s' in section type '%s'" % (symbol, section_type['name']), file=stderr) section = False else: - section = section_type['name'] - if not section_type['banked']: + section = name + if not section_type.banked: bank = None break else: |