mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-26 02:11:36 -04:00
590c236933
ROOT CAUSE of the Kula World black-screen wedge: a guest wait loop (libcd's CdSync spin) that lives entirely in dirty RAM re-enters the dirty-RAM interpreter once per short (~7-insn) block. The interpreter's only interrupt poll was gated by the PER-INVOCATION (insns_executed & 0xFFF) counter, which short blocks never reach — and when the loop exits to dispatch each iteration that path isn't reached at all. So the interpreter ran millions of instructions with psx_check_interrupts never called, while SR (IEc+IM2) and Cause (IP2) fully satisfied the MIPS interrupt-take condition and i_stat had CDROM+VBLANK pending. The CD IRQ that sets libcd's wait-flag was never serviced; the loop spun ~14s per cycle until a rare timeout re-dispatched. Fix: poll interrupts at the interpreter's per-invocation entry, gated by a global invocation counter (every 64 entries), cpu->pc set for a coherent resume — the interpreter analogue of a static block-leader poll. RESULT: Kula World now boots to its title screen and menu. Diagnosed with the self-stop trap + gdb sampling of SR/Cause/i_stat + the interrupt gate globals (in_exception, total_checks) + g_dirty_ram_insns_run, which isolated 'CPU spinning in the interpreter without polling interrupts'. General fix: any dirty-RAM spin-loop now yields to interrupts. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS