The recovered system: fire channels = LBE4ControlsManager buttonGroups (0x40/0x45/0x46/0x47); default groups = the per-mech type-6 controls-map resource in BTL4.RES, installed by the T0 CreateStreamedMappings the port already called -- it needed only the TriggerState attribute (id 0x13 PINNED to the binary value; fireImpulse@0x31C is the binary's TriggerState) and an input feed. Keyboard/harness now push press/release edges into the button groups; the gBT*Trigger bypasses, per-type keyboard split and 1,0 pulse hack are retired -- weapons sharing a button fire TOGETHER (madcat Trigger = 4 weapons). Myomers @4b9550/@4b95b8 misattribution corrected (they are MechWeapon ConfigureMappables/ChooseButton). Verified 2-node: kill through the authentic chain (12 hits vs ~36 pre-groups). Config-mode session (regrouping UI) = the remaining stage, KB-scoped. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
26 lines
861 B
Python
26 lines
861 B
Python
#!/usr/bin/env python3
|
|
"""Disassemble an arbitrary VA range from section_dump.txt: dis_range.py START END"""
|
|
import re, sys
|
|
from capstone import Cs, CS_ARCH_X86, CS_MODE_32
|
|
|
|
DUMP = r"C:\git\bt411\reference\decomp\section_dump.txt"
|
|
START = int(sys.argv[1], 16)
|
|
END = int(sys.argv[2], 16)
|
|
|
|
mem = {}
|
|
pat = re.compile(r'^\s*([0-9a-f]{6,8})\s((?:[0-9a-f]{2,8}\s?)+)')
|
|
with open(DUMP) as f:
|
|
for line in f:
|
|
m = pat.match(line)
|
|
if not m: continue
|
|
addr = int(m.group(1), 16)
|
|
if addr + 16 < START or addr > END: continue
|
|
b = bytes.fromhex(''.join(m.group(2).split()))
|
|
for i, byte in enumerate(b):
|
|
mem[addr+i] = byte
|
|
|
|
code = bytes(mem.get(a, 0xCC) for a in range(START, END))
|
|
md = Cs(CS_ARCH_X86, CS_MODE_32)
|
|
for ins in md.disasm(code, START):
|
|
print(f"{ins.address:08x}: {ins.mnemonic:8s} {ins.op_str}")
|