mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-28 19:07:47 -04:00
2676edbfb0
The probe answered it: ring_starved = 1,128,960 drains found their slot exhausted while another slot held unread data, and ring_norq_refill = 70 continuations landed where nothing could reach them -- exactly the 70 that surfaced as int1_lost in all three failed ring attempts, with every Setloc retried. deliver_read_sector_without_irq() raises no INT1 because it is a CONTINUATION of a drain already in progress, not a new notification. With one buffer that refill landed in the very buffer being drained, so the DMA flowed seamlessly. A ring reproduces that only if the read pointer follows the refill; leaving it behind strands the continuation and stalls the transfer mid-sector. This is why all three earlier attempts failed identically: they differed only in the notification path, and the notification path was never involved. One line. With it, the sequence the oracle performs becomes reachable: 111 drained from its slot, the continuation 112 held in the next and announced by the pended INT1, 113 in a third -- rather than 113 overwriting 112 and being drained twice. Instrumentation kept: ring_starved is now the regression tripwire. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>