CDROM: Fix interrupt enable register having no effect

This commit is contained in:
Connor McLaughlin 2019-11-08 23:48:09 +10:00
parent c3efc5637a
commit 5eea2f9ced
2 changed files with 13 additions and 3 deletions

View file

@ -311,6 +311,7 @@ void CDROM::WriteRegister(u32 offset, u8 value)
{
Log_DebugPrintf("Interrupt enable register <- 0x%02X", value);
m_interrupt_enable_register = value & INTERRUPT_REGISTER_MASK;
UpdateInterruptRequest();
return;
}
@ -415,8 +416,7 @@ void CDROM::DMARead(u32* words, u32 word_count)
void CDROM::SetInterrupt(Interrupt interrupt)
{
m_interrupt_flag_register = static_cast<u8>(interrupt);
if (HasPendingInterrupt())
m_interrupt_controller->InterruptRequest(InterruptController::IRQ::CDROM);
UpdateInterruptRequest();
}
void CDROM::SetAsyncInterrupt(Interrupt interrupt)
@ -442,7 +442,7 @@ void CDROM::DeliverAsyncInterrupt()
m_response_fifo.PushFromQueue(&m_async_response_fifo);
m_interrupt_flag_register = m_pending_async_interrupt;
m_pending_async_interrupt = 0;
m_interrupt_controller->InterruptRequest(InterruptController::IRQ::CDROM);
UpdateInterruptRequest();
}
void CDROM::SendACKAndStat()
@ -477,6 +477,14 @@ void CDROM::UpdateStatusRegister()
m_dma->SetRequest(DMA::Channel::CDROM, m_status.DRQSTS);
}
void CDROM::UpdateInterruptRequest()
{
if ((m_interrupt_flag_register & m_interrupt_enable_register) == 0)
return;
m_interrupt_controller->InterruptRequest(InterruptController::IRQ::CDROM);
}
TickCount CDROM::GetAckDelayForCommand() const
{
const u32 default_ack_delay = 3000;
@ -937,6 +945,7 @@ void CDROM::ExecuteTestCommand(u8 subcommand)
{
Log_DebugPrintf("Get CDROM BIOS Date/Version");
static constexpr u8 response[] = {0x94, 0x09, 0x19, 0xC0};
// static constexpr u8 response[] = {0x96, 0x09, 0x12, 0xC2};
m_response_fifo.PushRange(response, countof(response));
SetInterrupt(Interrupt::ACK);
EndCommand();

View file

@ -186,6 +186,7 @@ private:
void SendErrorResponse(u8 reason = 0x80);
void SendAsyncErrorResponse(u8 reason = 0x80);
void UpdateStatusRegister();
void UpdateInterruptRequest();
TickCount GetAckDelayForCommand() const;
TickCount GetTicksForRead() const;