summaryrefslogtreecommitdiff
path: root/tools/make_shim.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/make_shim.py')
-rw-r--r--tools/make_shim.py102
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: