mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-26 10:19:47 -04:00
752f8ff2e7
docs/SEGMENT_AWARE_CODE.md §5.7. Overlay bytes are segment-free, but a PC is not: a KUSEG, KSEG0 or KSEG1 entry of the same word links, traps, fetches and stamps store PCs in its own segment, so each needs a shard compiled for that segment. Capture kept only the physical word, so every shard was compiled for KSEG0 and #417's gate interpreted the other segments forever. dirty_ram_interp.h adds one sibling bitmap per segment that maps RAM (g_dirty_ram_dispatch_seg_bitmap[3]; 768 KiB for the 8 MiB backing). dirty_ram_dispatch_inner sets the bit for the full PC next to the existing any-segment bit, once per interpreted dispatch. A PC in 0x20000000-0x7FFFFFFF or KSEG2 addresses no RAM in Beetle and gets no bit. dirty_ram_dispatch_evidence_clear() drops both together at every site that dropped dispatch evidence: boot reset, a store into an executed page, DMA preservation and the autocapture epoch. Snapshot jobs copy the siblings. Capture schema v3 adds, per region, "dispatch_entry_segments": {"kuseg": [...], "kseg0": [...], "kseg1": [...]} with each PC spelled in its segment. dispatch_entry_pcs keeps its v2 meaning (dispatched in any segment) and KSEG0 spelling, so existing readers are unaffected. A record without the field is KSEG0 only. Guest behaviour is unchanged: the bitmaps are host-only capture evidence and are not saved in savestates. overlay_capture_retry_test checks the v3 record through both writers (the background epoch and the synchronous final capture), including that a cleared epoch's segment does not outlive it. psx_ram_runtime_map_stubs.c defines the new bitmap, which memory.c's write paths now reference, so psx_ram_runtime_map_test still links on GNU toolchains. The disabled interpreter_perf_guards check follows the evidence clear (it would otherwise contradict overlay_segment_gate's wiring check). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>