mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-26 10:19:47 -04:00
6b6e2c712e
Overlay shards are compiled at the KSEG0 address of their bytes: captures record 0x80000000|offset and the manifest parser keys entries there. The emitter bakes that segment into every PC a shard produces: the $ra a jal/jalr writes, jump and exception-resume PCs, and I-cache fetch tags. Dispatch matched candidates by the segment-stripped address, so a KUSEG or KSEG1 alias of the same bytes ran the KSEG0 body at the wrong architectural PC. Found in R4 (SLUS-00797) with OpenBIOS: the exception handler enters its RAM patch slots at KUSEG (0x0000281C, 0x0000357C). The kernel-page shard linked $ra=0x8000282C where the interpreter (and hardware) gives 0x0000282C, and fetched 0x8000281C/0x8000357C, missing lines the kernel had just filled with KUSEG tags: +4 cycles per slot, so the next VBlank IRQ landed at a different instruction and warm (native) vs cold (interpreted) overlay-cache runs saved different registers from frame 194 on. A KSEG1 entry would also be charged as cached. PSX_OVERLAY_CODE_SEGMENT (overlay_loader.h) names the rule for capture, the manifest parser, overlay_loader_dispatch and the generated static overlay table: a PC outside it falls to the interpreter, which runs at the PC it was handed. CPS continuations already failed closed this way (their entry switch only knows KSEG0 PCs); function entries now match. overlay_loader_status reports segment_alias_interp. Static game code has the same shape for KUSEG-linked EXEs (the parser normalizes their headers to KSEG0); that needs segment-relative emission and is not changed here. Shard cache tags are unchanged. Tests: test_overlay_segment_gate.py drives the real loader (pair-dedup harness, which also gains the RAM-geometry globals it no longer linked without) with a KSEG0 fixture shard: KUSEG and KSEG1 dispatches stay interpreted and never call it, KSEG0 still runs native. It fails with the gate removed. test_compile_overlays_static_split.py covers the generated static table and rejects a non-KSEG0 entry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>