mirror of
https://github.com/elliotnunn/lpch.git
synced 2024-10-31 17:04:28 +00:00
Dump jump table
This commit is contained in:
parent
cfc2166597
commit
afc0e44d99
41
patch_rip.py
41
patch_rip.py
@ -52,12 +52,13 @@ class Mod:
|
||||
self.entry_points = []
|
||||
self.references = []
|
||||
self.rom_references = []
|
||||
self.start = -1
|
||||
self.offset = -1
|
||||
self.stop = -1
|
||||
self.jt_entry = -1
|
||||
self.rsrc_id = 0
|
||||
|
||||
def __str__(self):
|
||||
x = '%05x %s:' % (self.start, name(self.jt_entry))
|
||||
x = '%05x %s:' % (self.offset, name(self.jt_entry))
|
||||
|
||||
leave = sorted(self.entry_points + self.references + self.rom_references, key=lambda x: x.offset)
|
||||
|
||||
@ -127,6 +128,7 @@ parser.add_argument('-roms', nargs='+', default=['Plus', 'SE', 'II', 'Portable',
|
||||
parser.add_argument('-pt', action='store_true', help='Print raw module tokens')
|
||||
parser.add_argument('-pm', action='store_true', help='Print information about modules and code references')
|
||||
parser.add_argument('-pr', action='store_true', help='Print information about ROM references')
|
||||
parser.add_argument('-pj', action='store_true', help='Print jump table')
|
||||
parser.add_argument('-oo', action='store', help='Base destination path to dump resources as raw files')
|
||||
parser.add_argument('-oc', action='store', help='Base destination path to dump code files')
|
||||
parser.add_argument('-oe', action='store', help='Base destination path to dump code files with refs changed to NOPs')
|
||||
@ -155,6 +157,8 @@ lpch_list.sort(key=lambda rsrc: (-count_bits(rsrc[0]), rsrc[0]))
|
||||
large_rom_table = []
|
||||
large_jump_table = []
|
||||
|
||||
all_modules = []
|
||||
|
||||
for num, data in lpch_list:
|
||||
if args.oo: open(args.oo + str(num), 'wb').write(data)
|
||||
|
||||
@ -303,8 +307,9 @@ for num, data in lpch_list:
|
||||
modules = []
|
||||
|
||||
modules.append(Mod())
|
||||
modules[-1].start = 0
|
||||
modules[-1].offset = 0
|
||||
modules[-1].__hack_refhead = -1
|
||||
modules[-1].rsrc_id = num
|
||||
|
||||
for tok, arg in tokens:
|
||||
if tok == 'skipjt':
|
||||
@ -320,8 +325,9 @@ for num, data in lpch_list:
|
||||
if tok == 'distance': # to end of module
|
||||
modules[-1].stop = cur_offset
|
||||
modules.append(Mod())
|
||||
modules[-1].start = cur_offset
|
||||
modules[-1].offset = cur_offset
|
||||
modules[-1].__hack_refhead = -1
|
||||
modules[-1].rsrc_id = num
|
||||
|
||||
if tok == 'distance=entry_not_module':
|
||||
modules[-1].entry_points.append(Ent())
|
||||
@ -339,7 +345,7 @@ for num, data in lpch_list:
|
||||
|
||||
|
||||
for m in modules:
|
||||
m.rom_references = [r for r in rom_references if m.start <= r.offset < m.stop]
|
||||
m.rom_references = [r for r in rom_references if m.offset <= r.offset < m.stop]
|
||||
|
||||
|
||||
for m in modules:
|
||||
@ -378,10 +384,35 @@ for num, data in lpch_list:
|
||||
if args.oe:
|
||||
open(args.oe + str(num), 'wb').write(edited_code)
|
||||
|
||||
all_modules.extend(modules)
|
||||
|
||||
|
||||
for el in large_rom_table:
|
||||
assert el is not None
|
||||
|
||||
|
||||
if args.pj:
|
||||
nums = sorted(num for num, data in lpch_list)
|
||||
INDENT = 6
|
||||
WIDTH = INDENT * len(nums) + 4
|
||||
|
||||
line = ''
|
||||
for i, n in enumerate(nums):
|
||||
line = line.ljust(i * INDENT)
|
||||
line += ' ' * ((INDENT+1)//2)
|
||||
line += '%02d' % n
|
||||
print(line)
|
||||
|
||||
all_modules.sort(key=lambda mod: mod.jt_entry)
|
||||
for mod in all_modules:
|
||||
for mod_ent in [mod] + mod.entry_points:
|
||||
line = ' ' * (INDENT * nums.index(mod.rsrc_id))
|
||||
line += '%02d+%05x' % (mod.rsrc_id, mod_ent.offset)
|
||||
line = line.ljust(WIDTH)
|
||||
if isinstance(mod_ent, Ent): line += ' '
|
||||
line += name(mod_ent.jt_entry)
|
||||
print(line)
|
||||
|
||||
# print(large_jump_table)
|
||||
# print(large_rom_table)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user