All inspection goes through the TCP debug server and the always-on ring buffers (see TCP.md). No printf debugging; no arm-trace-then-run; no pause/step to "sync" native and oracle. Free-run, then query the rings.
On first use of any tool (Ghidra, the disc parser, the decoder, a TCP command), cross-check its output against another source and confirm structure + content. Unvalidated tool output invalidates all reasoning built on it.
call_by_address logs a dispatch miss when no generated function exists at a
target. A miss means an entire subroutine was skipped — a silent game-breaking
bug. Resolve all misses (discover the function, fix the finder/loader) before
debugging anything else.
- Sync — define what "the same point in execution" means across native and oracle. Not wall-frame number alone; use a hardware/OS event (VSYNC count, OS-9 call count, sector-read count).
- Dump state from the ring buffer on both sides.
- Diff — find the bytes/registers that differ.
- First divergence — walk the ring backwards to the FIRST frame/block where they diverge. Later differences are consequences.
- Trace the writer / executed edge — for a state bug, find the instruction that wrote the wrong value; for a control-flow bug, the edge that was taken.
- Classify — discovery/codegen, runtime/timing, memory/bus, OS-9 HLE, device (MCD212/CDIC/SLAVE), or game metadata.
- Fix the generator/runtime — never the generated C, never a one-off cfg hint. Fix the class.
- Regenerate → build → run → measure → commit with concrete numbers.
If any step is skipped → STOP and restart.
Because CD-i boots through CD-RTOS, expect the earliest divergences here, in order:
- OS-9 loader /
TRAP #0HLE — wrong relocation, wrong service result, wrong errno in D1. Trace the exact OS-9 call (cdrtos.c logs name + regs). - Memory model / MMU — module loaded at the wrong base, or an MMU mapping not modelled. The bus aborts with the exact address.
- Device programming — MCD212 register the game writes before video comes up; CDIC sector request; SLAVE input poll. Each device aborts loud with the register touched.
- Timing / interrupts — display-line IRQ pacing, CDIC data-ready IRQ.
target behavior · oracle used (CeDImu TCP / Ghidra / disc) · sync point · diff (subsystem, address, expected, actual) · first divergence (frame/block index, not an eyeball) · writer (module + PC + call path) · classification · minimal generator/runtime fix · re-test plan. Missing a section → STOP.