mirror of
https://github.com/elliotnunn/ToolboxToolbox.git
synced 2024-10-31 15:05:13 +00:00
Fix up and commit RezROM
This commit is contained in:
parent
6081cb1e2c
commit
c0b5bc5a39
85
DumpRomResources.py
Executable file
85
DumpRomResources.py
Executable file
@ -0,0 +1,85 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
|
||||||
|
import os
|
||||||
|
import struct
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
COMBO_FIELDS = {
|
||||||
|
0x40: 'AppleTalk1',
|
||||||
|
0x20: 'AppleTalk2',
|
||||||
|
0x30: 'AppleTalk2_NetBoot_FPU',
|
||||||
|
0x08: 'AppleTalk2_NetBoot_NoFPU',
|
||||||
|
0x10: 'NetBoot',
|
||||||
|
0x78: 'AllCombos',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def pad_offset(offset, align):
|
||||||
|
(offset + align - 1) & ~(align - 1)
|
||||||
|
|
||||||
|
|
||||||
|
class Rsrc:
|
||||||
|
def __init__(self, rom_bin, struct_offset):
|
||||||
|
self.struct_offset = struct_offset
|
||||||
|
|
||||||
|
rsrc_s_fmt = '> B 7x L L 4s h c 256p' # Struct actually padded to 16b to fit pstring
|
||||||
|
rsrc_s_len = struct.calcsize(rsrc_s_fmt)
|
||||||
|
rsrc_s = rom_bin[self.struct_offset : self.struct_offset + rsrc_s_len]
|
||||||
|
rsrc_s_tuple = struct.unpack(rsrc_s_fmt, rsrc_s)
|
||||||
|
|
||||||
|
(self.combo_field,
|
||||||
|
self.next_offset, self.data_offset,
|
||||||
|
self.type, self.id,
|
||||||
|
attrs, self.name) = rsrc_s_tuple
|
||||||
|
|
||||||
|
self.combo_field = COMBO_FIELDS.get(self.combo_field, 'UnknownComboField0x%X'%self.combo_field)
|
||||||
|
|
||||||
|
rsrc_s_len_actual = pad_offset(rsrc_s_len - 256 + len(self.name), 16)
|
||||||
|
|
||||||
|
mm_header_fmt = '> L L L'
|
||||||
|
mm_header_len = struct.calcsize(mm_header_fmt)
|
||||||
|
mm_header = rom_bin[self.data_offset - mm_header_len : self.data_offset]
|
||||||
|
mm_header_tuple = struct.unpack(mm_header_fmt, mm_header)
|
||||||
|
|
||||||
|
(mm_attrs, block_len, mm_bogus_ptr_ptr) = mm_header_tuple
|
||||||
|
|
||||||
|
self.data = rom_bin[self.data_offset : self.data_offset + block_len - mm_header_len]
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
_, src, dest = sys.argv
|
||||||
|
except ValueError:
|
||||||
|
print('USAGE: %s SRC.ROM DEST-DIR' % (sys.argv[0]))
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
with open(src, 'rb') as f:
|
||||||
|
rom_bin = f.read()
|
||||||
|
|
||||||
|
os.makedirs(dest)
|
||||||
|
|
||||||
|
(map_offset,) = struct.unpack('>L', rom_bin[0x1A : 0x1A + 4])
|
||||||
|
|
||||||
|
map_s_fmt = '>Lbbhh'
|
||||||
|
map_s_len = struct.calcsize(map_s_fmt)
|
||||||
|
map_s = rom_bin[map_offset:map_offset + map_s_len]
|
||||||
|
(offsetToFirst, maxValidIndex, comboFieldSize, comboVersion, headerSize) = struct.unpack(map_s_fmt, map_s)
|
||||||
|
|
||||||
|
next_offset = offsetToFirst
|
||||||
|
idx = 0
|
||||||
|
while next_offset != 0:
|
||||||
|
r = Rsrc(rom_bin, next_offset)
|
||||||
|
|
||||||
|
fname = '%03d %s %d' % (idx, r.type.decode('ascii'), r.id)
|
||||||
|
if r.name:
|
||||||
|
fname += ' "%s"' % r.name.decode('ascii')
|
||||||
|
if r.combo_field != 'AllCombos':
|
||||||
|
fname += ' (%s)' % r.combo_field
|
||||||
|
|
||||||
|
with open(os.path.join(dest, fname), 'wb') as f:
|
||||||
|
f.write(r.data)
|
||||||
|
|
||||||
|
next_offset = r.next_offset
|
||||||
|
idx += 1
|
Loading…
Reference in New Issue
Block a user