lpch/order_rom_refs.py

51 lines
1.8 KiB
Python
Executable File

#!/usr/bin/env python3
import argparse
import re
from os import path
parser = argparse.ArgumentParser(description='''
Determine the order in which various object files make jmpROM, jsrROM etc calls.
This is relevant to matching up the link order with the linkedpatch ROM bind order
''')
parser.add_argument('src', action='store', nargs='+', help='Object files')
parser.add_argument('-1', action='store_true', dest='onlyonce', help='Mention each rom reference only once')
parser.add_argument('-f', '--filter', action='store', dest='filter', help='List of truly included ROM reference names (one per line)')
parser.add_argument('-n', '--number', action='store', dest='number', type=int, help='lpch resource number (helps sub-filter -f)')
args = parser.parse_args()
every = None
right_number = True
if args.number: right_number = False
if args.filter:
every = set()
for l in open(args.filter):
if args.number:
if 'lpch %d' % args.number in l:
right_number = True
elif 'lpch ' in l:
right_number = False
l = l.partition(';')[0].split()
if len(l) == 1:
if right_number:
name = l[0]
every.add(name)
already = set()
for src_path in args.src:
if not args.onlyonce: already = set()
obj_file = open(src_path, 'rb').read()
if obj_file.startswith(b'\x01'):
didprint = False
for m in re.finditer(rb'ROM\$([_A-Za-z][_A-Za-z0-9@%]*)\$', obj_file):
rom_name = m.group(1).decode('mac_roman')
if (every is None or rom_name in every) and rom_name not in already:
if not didprint:
print(path.basename(src_path))
didprint = True
already.add(rom_name)
print(' ' + rom_name)