mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-26 02:11:36 -04:00
9515cb7dfe
idle_skip only skipped loops with zero stores and a single interrupt-check edge, so it never fired on PsyQ libetc's v_wait -- the VSync(0)/VSync(n) spin most PsyQ titles run each frame -- which decrements a stack timeout word every pass and crosses two block edges. New opt-in on top of idle_skip, [runtime] idle_skip_store_counters (PSX_IDLE_SKIP_EXT=0/1 for one run): - an iteration may span up to 8 block edges; the first edge is the anchor and the edge count must be stable; - one word store per iteration to the same RAM/scratchpad address whose value drops by exactly 1 (a register holding it may drop with it). Skips lower the counter by k (never to <= 1) and, for multi-edge loops, land on the anchor strictly before the next device event so an IRQ is taken at the same edge as without the skip. memory.c records the last word store's address and value for the detector. R4 race, 3600 frames from one savestate, held input: cyc, mmio, mc, sp, sc and qc identical every frame; wc differs only by the elided counter stores. Release build on an Apple M4: emulation-thread busy 47.5% -> 34.9% at 60 Hz. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>