From 6ce012df3e5c85e908f67bef6fad28d72bc07ffe Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Mon, 13 Apr 2026 00:41:02 -0700 Subject: [PATCH] fix: wire cdrom_tick into vblank interval, fire IRQ on command completion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two CDROM issues preventing BIOS from progressing past Sony logo: 1. cdrom_tick() was never called — delayed CDROM responses (GetStatus, Init, Pause) never completed because pending.delay was never decremented. Wired into psx_check_interrupts vblank interval. 2. exec_command() called set_irq() but not fire_cdrom_irq() for immediate responses (GetStat, SetLoc, Demute, etc.). The CDROM IRQ flag was set internally but i_stat bit 2 was never raised, so the BIOS exception handler never delivered CDROM events. BIOS still stalls at same draw count — next bug in chain is EvCB event delivery (TestEvent returns 0 because VBlank events aren't being written to the event control block table). Co-Authored-By: Claude Opus 4.6 (1M context) --- runtime/src/cdrom.c | 4 ++++ runtime/src/interrupts.c | 2 ++ 2 files changed, 6 insertions(+) diff --git a/runtime/src/cdrom.c b/runtime/src/cdrom.c index f7af055a..c9ea0ebb 100644 --- a/runtime/src/cdrom.c +++ b/runtime/src/cdrom.c @@ -286,6 +286,10 @@ static void exec_command(uint8_t cmd) { } param_count = 0; + + /* Fire the CDROM IRQ for the immediate response. + * Delayed responses (pending) fire from process_pending(). */ + fire_cdrom_irq(); } static void process_pending(void) { diff --git a/runtime/src/interrupts.c b/runtime/src/interrupts.c index b307fb18..3b7ecd17 100644 --- a/runtime/src/interrupts.c +++ b/runtime/src/interrupts.c @@ -29,6 +29,7 @@ #include "sio.h" #include "timers.h" #include "gpu.h" +#include "cdrom.h" #include "cpu_state.h" #include #include @@ -102,6 +103,7 @@ void psx_check_interrupts(CPUState* cpu) { i_stat |= (1 << IRQ_VBLANK); gpu_vblank_tick(); /* Toggle LCF (GPUSTAT bit 31) */ timers_tick(33868); /* ~1 NTSC frame worth of cycles */ + cdrom_tick(); /* Process pending CDROM responses */ } }