mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-26 02:11:36 -04:00
479c51934a
TX_DATA writes now route through the SIO0 shifter under SIO_MODEL_CYCLE_PACED. Pad and card share the single-byte shifter and TX buffer; bus owner is tagged on the first byte of each SELECT cycle. sio_advance() is driven from psx_advance_cycles() so the shifter and ACK pipeline progress on the guest CPU clock without touching the legacy IRQ countdown. The SELECT-deassert and TX_EN 1->0 paths now restore TX_RDY|TX_EMPTY when they kill an in-flight shifter. Without this, sio_stat retained the TX-clear bits set by SHIFT_START and the next handler busy-waited forever on TX_RDY=0 inside the exception, deadlocking the BIOS. Watchdog dump captured the deadlock at chain handler 0x445C with stat=0x0000 across 4 seconds of PC samples. Diagnostics added (passive/gated): - starvation_ring records SIO MMIO events + periodic PC samples, watchdog dumps to JSONL on TCP-poll starvation - starvation_walk.py queries the dump (last/last_change/why_idle) Validation: shell-only sanity stable; one CROSS press no longer hangs; mc_read_done climbs from 0 -> 30+ with mc_aborts=0. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>