From 010e0f3fd82248bb22218cc96304e5aea78b70fd Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Wed, 11 Oct 2023 10:36:06 -0600 Subject: [PATCH] fix wdc --- src/device/ai.rs | 3 +-- src/device/events.rs | 1 + src/device/mi.rs | 17 +++++++++++++++++ src/device/rsp_interface.rs | 2 +- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/device/ai.rs b/src/device/ai.rs index 3be622e2..cb5aeb33 100644 --- a/src/device/ai.rs +++ b/src/device/ai.rs @@ -71,8 +71,7 @@ pub fn do_dma(device: &mut device::Device) { device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize] + device.ai.fifo[0].duration, dma_event, ); - - device::mi::set_rcp_interrupt(device, device::mi::MI_INTR_AI); + device::mi::schedule_rcp_interrupt(device, device::mi::MI_INTR_AI); } pub fn fifo_push(device: &mut device::Device) { diff --git a/src/device/events.rs b/src/device/events.rs index a8fd78cf..ee5e850f 100644 --- a/src/device/events.rs +++ b/src/device/events.rs @@ -8,6 +8,7 @@ pub enum EventType { PI, DP, SP, + InterruptCheck, SPDma, Compare, EventTypeCount, diff --git a/src/device/mi.rs b/src/device/mi.rs index 6c34397f..be586433 100644 --- a/src/device/mi.rs +++ b/src/device/mi.rs @@ -163,6 +163,23 @@ pub fn set_rcp_interrupt(device: &mut device::Device, interrupt: u32) { device::exceptions::check_pending_interrupts(device) } +pub fn schedule_rcp_interrupt(device: &mut device::Device, interrupt: u32) { + device.mi.regs[MI_INTR_REG as usize] |= interrupt; + + if device.mi.regs[MI_INTR_REG as usize] & device.mi.regs[MI_INTR_MASK_REG as usize] != 0 { + device.cpu.cop0.regs[device::cop0::COP0_CAUSE_REG as usize] &= + !device::cop0::COP0_CAUSE_EXCCODE_MASK; + device.cpu.cop0.regs[device::cop0::COP0_CAUSE_REG as usize] |= device::cop0::COP0_CAUSE_IP2; + } + + device::events::create_event( + device, + device::events::EventType::InterruptCheck, + device.cpu.cop0.regs[device::cop0::COP0_COUNT_REG as usize], + device::exceptions::check_pending_interrupts, + ) +} + pub fn init(device: &mut device::Device) { device.mi.regs[MI_VERSION_REG as usize] = 0x02020102 } diff --git a/src/device/rsp_interface.rs b/src/device/rsp_interface.rs index 37ca1ed6..ab99ea73 100644 --- a/src/device/rsp_interface.rs +++ b/src/device/rsp_interface.rs @@ -332,7 +332,7 @@ pub fn update_sp_status(device: &mut device::Device, w: u32) { } /* set SP interrupt */ if (w & SP_SET_INTR) != 0 && (w & SP_CLR_INTR) == 0 { - device::mi::set_rcp_interrupt(device, device::mi::MI_INTR_SP) + device::mi::schedule_rcp_interrupt(device, device::mi::MI_INTR_SP); } /* clear / set single step */