From c8af4abad885bb52e5c2c5ef3ed399bf989f8120 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Tue, 24 Mar 2020 00:21:22 +1000 Subject: [PATCH] CDROM: Don't queue up a second INT1 when one is still pending --- src/core/cdrom.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/core/cdrom.cpp b/src/core/cdrom.cpp index d05eb1a03..c21cf4843 100644 --- a/src/core/cdrom.cpp +++ b/src/core/cdrom.cpp @@ -422,6 +422,14 @@ void CDROM::SetInterrupt(Interrupt interrupt) void CDROM::SetAsyncInterrupt(Interrupt interrupt) { + if (m_interrupt_flag_register == static_cast(interrupt)) + { + Log_WarningPrintf("Not setting async interrupt %u because there is already one unacknowledged", + static_cast(interrupt)); + m_async_response_fifo.Clear(); + return; + } + Assert(m_pending_async_interrupt == 0); m_pending_async_interrupt = static_cast(interrupt); if (!HasPendingInterrupt()) @@ -1418,13 +1426,6 @@ void CDROM::ProcessDataSector(const u8* raw_sector, const CDImage::SubChannelQ& } } - // Deliver to CPU - if (HasPendingAsyncInterrupt()) - { - Log_WarningPrintf("Data interrupt was not delivered"); - ClearAsyncInterrupt(); - } - // TODO: How does XA relate to this buffering? SectorBuffer* sb = &m_sector_buffers[0]; if (sb->size > 0) @@ -1450,6 +1451,13 @@ void CDROM::ProcessDataSector(const u8* raw_sector, const CDImage::SubChannelQ& sb->size = DATA_SECTOR_OUTPUT_SIZE; } + // Deliver to CPU + if (HasPendingAsyncInterrupt()) + { + Log_WarningPrintf("Data interrupt was not delivered"); + ClearAsyncInterrupt(); + } + m_async_response_fifo.Push(m_secondary_status.bits); SetAsyncInterrupt(Interrupt::DataReady); }