mirror of
https://github.com/pret/pokegold-spaceworld.git
synced 2026-08-09 11:47:38 -05:00
99 lines
2.8 KiB
Python
99 lines
2.8 KiB
Python
#!/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:
|
|
for line in open(file_name, "rt"):
|
|
|
|
# Strip out the comment
|
|
line = line.split(";")[0].strip()
|
|
if not line:
|
|
continue
|
|
|
|
# Read the address
|
|
try:
|
|
address, symbol = line.split()
|
|
bank, pointer = address.split(":")
|
|
bank = int(bank, 16)
|
|
pointer = int(pointer, 16)
|
|
except:
|
|
print("Error: Cannot parse line: %s" % line, file=stderr)
|
|
exit(1)
|
|
|
|
section = None
|
|
for section_type in section_list:
|
|
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']:
|
|
bank = None
|
|
break
|
|
else:
|
|
# Didn't find a section
|
|
print("Unknown section for '%s'" % line, file=stderr)
|
|
continue
|
|
|
|
if not section:
|
|
# Found section, but cannot shim it
|
|
continue
|
|
|
|
print("SECTION \"Shim for %s\", %s[$%04X]" % (symbol, section, pointer), end='')
|
|
if bank:
|
|
print(", BANK[$%04X]" % bank, end='')
|
|
print("\n%s::\n\n" % symbol)
|