35 lines
999 B
Python
35 lines
999 B
Python
|
|
#!/usr/bin/env python3
|
||
|
|
import os
|
||
|
|
fn = os.path.join('binary','Crusader - No Remorse Weapons Main Ram.bin')
|
||
|
|
if not os.path.exists(fn):
|
||
|
|
print('file missing', fn); raise SystemExit(2)
|
||
|
|
with open(fn,'rb') as f:
|
||
|
|
data = f.read()
|
||
|
|
size = len(data)
|
||
|
|
base = 0x6466A
|
||
|
|
stride = 0x26
|
||
|
|
|
||
|
|
def read_name(defOff):
|
||
|
|
end = defOff + stride
|
||
|
|
s = ''
|
||
|
|
for i in range(defOff, min(end, size)):
|
||
|
|
c = data[i]
|
||
|
|
if 32 <= c <= 126:
|
||
|
|
s += chr(c)
|
||
|
|
else:
|
||
|
|
if len(s) >= 2:
|
||
|
|
return s
|
||
|
|
s = ''
|
||
|
|
return s
|
||
|
|
|
||
|
|
for tableStart in (0x64355, 0x64340, 0x64330):
|
||
|
|
print(f'\nDumping table @0x{tableStart:X}')
|
||
|
|
rec = 10
|
||
|
|
for ch in range(40):
|
||
|
|
idxOff = tableStart + ch*rec + 9
|
||
|
|
if idxOff >= size:
|
||
|
|
break
|
||
|
|
sel = data[idxOff]
|
||
|
|
defOff = base + sel*stride
|
||
|
|
name = read_name(defOff) if defOff < size else ''
|
||
|
|
print(f'chan {ch:02d}: sel=0x{sel:02X} ({sel}) -> def@0x{defOff:X} -> {name} (idxOff=0x{idxOff:X})')
|