SPU: Fire interrupt on DMA reads/writes too
This commit is contained in:
parent
8722757412
commit
26437e31dd
|
@ -544,6 +544,8 @@ void SPU::UpdateDMARequest()
|
||||||
|
|
||||||
u16 SPU::RAMTransferRead()
|
u16 SPU::RAMTransferRead()
|
||||||
{
|
{
|
||||||
|
CheckRAMIRQ(m_transfer_address);
|
||||||
|
|
||||||
u16 value;
|
u16 value;
|
||||||
std::memcpy(&value, &m_ram[m_transfer_address], sizeof(value));
|
std::memcpy(&value, &m_ram[m_transfer_address], sizeof(value));
|
||||||
m_transfer_address = (m_transfer_address + sizeof(value)) & RAM_MASK;
|
m_transfer_address = (m_transfer_address + sizeof(value)) & RAM_MASK;
|
||||||
|
@ -554,8 +556,23 @@ void SPU::RAMTransferWrite(u16 value)
|
||||||
{
|
{
|
||||||
Log_TracePrintf("SPU RAM @ 0x%08X (voice 0x%04X) <- 0x%04X", m_transfer_address,
|
Log_TracePrintf("SPU RAM @ 0x%08X (voice 0x%04X) <- 0x%04X", m_transfer_address,
|
||||||
m_transfer_address >> VOICE_ADDRESS_SHIFT, ZeroExtend32(value));
|
m_transfer_address >> VOICE_ADDRESS_SHIFT, ZeroExtend32(value));
|
||||||
|
|
||||||
std::memcpy(&m_ram[m_transfer_address], &value, sizeof(value));
|
std::memcpy(&m_ram[m_transfer_address], &value, sizeof(value));
|
||||||
m_transfer_address = (m_transfer_address + sizeof(value)) & RAM_MASK;
|
m_transfer_address = (m_transfer_address + sizeof(value)) & RAM_MASK;
|
||||||
|
CheckRAMIRQ(m_transfer_address);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPU::CheckRAMIRQ(u32 address)
|
||||||
|
{
|
||||||
|
if (!m_SPUCNT.irq9_enable)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ZeroExtend32(m_irq_address) * 8 == address)
|
||||||
|
{
|
||||||
|
Log_DebugPrintf("SPU IRQ at address 0x%08X", address);
|
||||||
|
m_SPUSTAT.irq9_flag = true;
|
||||||
|
m_interrupt_controller->InterruptRequest(InterruptController::IRQ::SPU);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPU::Execute(TickCount ticks)
|
void SPU::Execute(TickCount ticks)
|
||||||
|
@ -808,17 +825,7 @@ s16 SPU::Voice::Interpolate() const
|
||||||
void SPU::ReadADPCMBlock(u16 address, ADPCMBlock* block)
|
void SPU::ReadADPCMBlock(u16 address, ADPCMBlock* block)
|
||||||
{
|
{
|
||||||
u32 ram_address = (ZeroExtend32(address) * 8) & RAM_MASK;
|
u32 ram_address = (ZeroExtend32(address) * 8) & RAM_MASK;
|
||||||
|
CheckRAMIRQ(ram_address);
|
||||||
// 16 bytes, so 2 8-byte blocks for the interrupt check
|
|
||||||
if (m_SPUCNT.irq9_enable)
|
|
||||||
{
|
|
||||||
if (m_irq_address == address || m_irq_address == (address + 1))
|
|
||||||
{
|
|
||||||
Log_DebugPrintf("SPU IRQ at address 0x%08X", ram_address);
|
|
||||||
m_SPUSTAT.irq9_flag = true;
|
|
||||||
m_interrupt_controller->InterruptRequest(InterruptController::IRQ::SPU);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// fast path - no wrap-around
|
// fast path - no wrap-around
|
||||||
if ((ram_address + sizeof(ADPCMBlock)) <= RAM_SIZE)
|
if ((ram_address + sizeof(ADPCMBlock)) <= RAM_SIZE)
|
||||||
|
@ -1014,7 +1021,7 @@ void SPU::DrawDebugStateWindow()
|
||||||
ImGui::SameLine(offsets[0]);
|
ImGui::SameLine(offsets[0]);
|
||||||
ImGui::TextColored(m_SPUCNT.irq9_enable ? active_color : inactive_color,
|
ImGui::TextColored(m_SPUCNT.irq9_enable ? active_color : inactive_color,
|
||||||
m_SPUCNT.irq9_enable ? "Enabled @ 0x%04X (actual 0x%08X)" : "Disabled @ 0x%04X (actual 0x%08X)",
|
m_SPUCNT.irq9_enable ? "Enabled @ 0x%04X (actual 0x%08X)" : "Disabled @ 0x%04X (actual 0x%08X)",
|
||||||
m_irq_address, ZeroExtend32(m_irq_address * 8) & RAM_MASK);
|
m_irq_address, (ZeroExtend32(m_irq_address) * 8) & RAM_MASK);
|
||||||
|
|
||||||
ImGui::Text("Volume: ");
|
ImGui::Text("Volume: ");
|
||||||
ImGui::SameLine(offsets[0]);
|
ImGui::SameLine(offsets[0]);
|
||||||
|
|
|
@ -268,6 +268,7 @@ private:
|
||||||
void UpdateDMARequest();
|
void UpdateDMARequest();
|
||||||
u16 RAMTransferRead();
|
u16 RAMTransferRead();
|
||||||
void RAMTransferWrite(u16 value);
|
void RAMTransferWrite(u16 value);
|
||||||
|
void CheckRAMIRQ(u32 address);
|
||||||
|
|
||||||
void ReadADPCMBlock(u16 address, ADPCMBlock* block);
|
void ReadADPCMBlock(u16 address, ADPCMBlock* block);
|
||||||
std::tuple<s32, s32> SampleVoice(u32 voice_index);
|
std::tuple<s32, s32> SampleVoice(u32 voice_index);
|
||||||
|
@ -285,6 +286,7 @@ private:
|
||||||
u32 m_transfer_address = 0;
|
u32 m_transfer_address = 0;
|
||||||
|
|
||||||
u16 m_irq_address = 0;
|
u16 m_irq_address = 0;
|
||||||
|
u16 m_capture_buffer_position = 0;
|
||||||
|
|
||||||
VolumeRegister m_main_volume_left = {};
|
VolumeRegister m_main_volume_left = {};
|
||||||
VolumeRegister m_main_volume_right = {};
|
VolumeRegister m_main_volume_right = {};
|
||||||
|
|
Loading…
Reference in New Issue