From 139b5e27e286965607e54db1beff9a66fd878722 Mon Sep 17 00:00:00 2001 From: Rix Date: Fri, 9 Oct 2026 22:56:41 -0700 Subject: [PATCH] cdrom: an acked response no longer holds back the next one An acked response whose bytes were never read kept its slot, so the next one was never delivered. OpenBIOS's shell acks GetID's INT3 without reading it and sat waiting for INT2 forever; no disc booted. The unread bytes stay readable until the next response replaces them. --- src/core/cdrom.cc | 4 +++- src/core/cdrom.h | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/core/cdrom.cc b/src/core/cdrom.cc index 556ce3f1..4dac7e10 100644 --- a/src/core/cdrom.cc +++ b/src/core/cdrom.cc @@ -293,13 +293,15 @@ class CDRomImpl final : public PCSX::CDRom { void scheduleDMA(uint32_t cycles) { PCSX::g_emulator->m_cpu->schedule(PCSX::Schedule::CDRDMA, cycles); } void scheduleDMA(std::chrono::nanoseconds delay) { scheduleDMA(PCSX::psxRegisters::durationToCycles(delay)); } + // An acknowledged response no longer holds its slot: its unread bytes stay readable + // until the next response replaces them. bool maybeEnqueueResponse(QueueElement &response) { if (m_responseFifo[0].valueEmpty() && !m_responseFifo[1].empty()) { m_responseFifo[0] = m_responseFifo[1]; m_responseFifo[1] = response; return true; } - if (m_responseFifo[0].empty()) { + if (m_responseFifo[0].valueEmpty()) { m_responseFifo[0] = response; return true; } else if (m_responseFifo[1].empty()) { diff --git a/src/core/cdrom.h b/src/core/cdrom.h index eea08b09..3ea48b23 100644 --- a/src/core/cdrom.h +++ b/src/core/cdrom.h @@ -221,7 +221,7 @@ class CDRom { QueueElement m_commandFifo; QueueElement m_commandExecuting; QueueElement m_responseFifo[2]; - bool responseFifoFull() { return !m_responseFifo[0].empty() && !m_responseFifo[1].empty(); } + bool responseFifoFull() { return !m_responseFifo[0].valueEmpty() && !m_responseFifo[1].empty(); } private: friend class Widgets::IsoBrowser;