mirror of
https://github.com/elliotnunn/lpch.git
synced 2024-06-09 15:29:29 +00:00
Way nicer output
JT entries still incorrect
This commit is contained in:
parent
0c562dac7a
commit
42426b549f
74
patch_rip.py
74
patch_rip.py
|
@ -46,7 +46,12 @@ class Mod:
|
||||||
self.jt_entry = -1
|
self.jt_entry = -1
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '%x:%x/jt%d entries=(%s) refs=(%s)' % (self.start, self.stop, self.jt_entry, ', '.join(str(x) for x in self.entry_points), ', '.join('%x'%x for x in self.references))
|
x = '%05x jt%d:' % (self.start, self.jt_entry)
|
||||||
|
|
||||||
|
leave = sorted(self.references + self.entry_points, key=lambda x: x.offset)
|
||||||
|
|
||||||
|
x += ''.join('\n ' + str(s) for s in leave)
|
||||||
|
return x
|
||||||
|
|
||||||
|
|
||||||
class Ent:
|
class Ent:
|
||||||
|
@ -55,7 +60,42 @@ class Ent:
|
||||||
self.jt_entry = -1
|
self.jt_entry = -1
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '%x/jt%d' % (self.offset, self.jt_entry)
|
return '%05x jt%d:' % (self.offset, self.jt_entry)
|
||||||
|
|
||||||
|
|
||||||
|
class Ref:
|
||||||
|
def __init__(self):
|
||||||
|
self.offset = -1
|
||||||
|
self.opcode = -1
|
||||||
|
self.jt_entry = -1
|
||||||
|
self.force_resident = False
|
||||||
|
|
||||||
|
@property
|
||||||
|
def assembly(self):
|
||||||
|
try:
|
||||||
|
x = (
|
||||||
|
'leaY x,A0',
|
||||||
|
'leaY x,A1',
|
||||||
|
'leaY x,A2',
|
||||||
|
'leaY x,A3',
|
||||||
|
'leaY x,A4',
|
||||||
|
'leaY x,A5',
|
||||||
|
'leaY x,A6',
|
||||||
|
'leaY x,A7',
|
||||||
|
'peaY x',
|
||||||
|
'jsrY x',
|
||||||
|
'jmpY x',
|
||||||
|
)[self.opcode]
|
||||||
|
except IndexError:
|
||||||
|
x = 'unknownY x'
|
||||||
|
|
||||||
|
x = x.replace('x', 'jt%d' % self.jt_entry)
|
||||||
|
x = x.replace('Y', 'Resident' if self.force_resident else '')
|
||||||
|
|
||||||
|
return x
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return '%05x %s' % (self.offset, self.assembly)
|
||||||
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='''
|
parser = argparse.ArgumentParser(description='''
|
||||||
|
@ -240,6 +280,7 @@ for num, data, annotations in lpch_list:
|
||||||
|
|
||||||
modules.append(Mod())
|
modules.append(Mod())
|
||||||
modules[-1].start = 0
|
modules[-1].start = 0
|
||||||
|
modules[-1].__hack_refhead = -1
|
||||||
|
|
||||||
for tok, arg in tokens:
|
for tok, arg in tokens:
|
||||||
if tok == 'skipjt':
|
if tok == 'skipjt':
|
||||||
|
@ -253,6 +294,7 @@ for num, data, annotations in lpch_list:
|
||||||
modules[-1].jt_entry = jt_offset
|
modules[-1].jt_entry = jt_offset
|
||||||
modules.append(Mod())
|
modules.append(Mod())
|
||||||
modules[-1].start = cur_offset
|
modules[-1].start = cur_offset
|
||||||
|
modules[-1].__hack_refhead = -1
|
||||||
|
|
||||||
jt_offset += 1
|
jt_offset += 1
|
||||||
|
|
||||||
|
@ -264,7 +306,7 @@ for num, data, annotations in lpch_list:
|
||||||
jt_offset += 1
|
jt_offset += 1
|
||||||
|
|
||||||
if tok == 'distance=ref_list_head':
|
if tok == 'distance=ref_list_head':
|
||||||
modules[-1].references.append(cur_offset)
|
modules[-1].__hack_refhead = cur_offset
|
||||||
|
|
||||||
modules.pop()
|
modules.pop()
|
||||||
|
|
||||||
|
@ -272,15 +314,21 @@ for num, data, annotations in lpch_list:
|
||||||
|
|
||||||
|
|
||||||
for m in modules:
|
for m in modules:
|
||||||
if m.references:
|
if m.__hack_refhead == -1: continue
|
||||||
ofs, = m.references
|
|
||||||
while 1:
|
while 1:
|
||||||
dist_to_next, = struct.unpack_from('>H', code, offset=ofs)
|
word1, word2 = struct.unpack_from('>HH', code, offset=m.__hack_refhead)
|
||||||
dist_to_next &= 0x7FFF
|
|
||||||
dist_to_next *= 2
|
m.references.append(Ref())
|
||||||
if dist_to_next == 0: break
|
m.references[-1].offset = m.__hack_refhead
|
||||||
ofs += dist_to_next
|
m.references[-1].jt_entry = word2 & 0xFFF
|
||||||
m.references.append(ofs)
|
m.references[-1].opcode = word2 >> 12
|
||||||
|
m.references[-1].force_resident = bool(word1 & 0x8000)
|
||||||
|
|
||||||
|
dist_to_next = word1 & 0x7FFF
|
||||||
|
dist_to_next *= 2
|
||||||
|
if dist_to_next == 0: break
|
||||||
|
m.__hack_refhead += dist_to_next
|
||||||
|
|
||||||
|
|
||||||
if args.pm:
|
if args.pm:
|
||||||
|
@ -292,7 +340,7 @@ for num, data, annotations in lpch_list:
|
||||||
# Now edit the code to look more sexier...
|
# Now edit the code to look more sexier...
|
||||||
for m in modules:
|
for m in modules:
|
||||||
for r in m.references:
|
for r in m.references:
|
||||||
edited_code[r:r+4] = b'NqNq'
|
edited_code[r.offset:r.offset+4] = b'NqNq'
|
||||||
if args.oe:
|
if args.oe:
|
||||||
open(args.oe + str(num), 'wb').write(edited_code)
|
open(args.oe + str(num), 'wb').write(edited_code)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user