From 81cab7182d0b31048f0afc5b25bcf261d9c36463 Mon Sep 17 00:00:00 2001 From: SimoneN64 Date: Mon, 8 Jul 2024 19:21:48 +0200 Subject: [PATCH] Correct RDRAM mask in RSP DMAs --- src/backend/core/RSP.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/backend/core/RSP.cpp b/src/backend/core/RSP.cpp index b154e8d0..dfe61e03 100644 --- a/src/backend/core/RSP.cpp +++ b/src/backend/core/RSP.cpp @@ -119,7 +119,8 @@ template <> void RSP::DMA() { std::array& src = spDMASPAddr.bank ? imem : dmem; u32 mem_address = spDMASPAddr.address & 0xFF8; - u32 dram_address = spDMADRAMAddr.address & 0xFFFFF8; + u32 dram_address = spDMADRAMAddr.address & 0xFFFFFC; + Util::trace("SP DMA from RSP to RDRAM (size: {} B, {:08X} to {:08X})", length, mem_address, dram_address); for (u32 i = 0; i < spDMALen.count + 1; i++) { for(u32 j = 0; j < length; j++) { @@ -129,10 +130,11 @@ template <> void RSP::DMA() { int skip = i == spDMALen.count ? 0 : spDMALen.skip; dram_address += (length + skip); - dram_address &= 0xFFFFF8; + dram_address &= 0xFFFFFC; mem_address += length; mem_address &= 0xFF8; } + Util::trace("Addresses after: RSP: 0x{:08X}, Dram: 0x{:08X}", mem_address, dram_address); lastSuccessfulSPAddr.address = mem_address; lastSuccessfulSPAddr.bank = spDMASPAddr.bank; @@ -148,7 +150,8 @@ template <> void RSP::DMA() { std::array& dst = spDMASPAddr.bank ? imem : dmem; u32 mem_address = spDMASPAddr.address & 0xFF8; - u32 dram_address = spDMADRAMAddr.address & 0xFFFFF8; + u32 dram_address = spDMADRAMAddr.address & 0xFFFFFC; + Util::trace("SP DMA from RDRAM to RSP (size: {} B, {:08X} to {:08X})", length, dram_address, mem_address); for (u32 i = 0; i < spDMALen.count + 1; i++) { for(u32 j = 0; j < length; j++) { @@ -158,10 +161,11 @@ template <> void RSP::DMA() { int skip = i == spDMALen.count ? 0 : spDMALen.skip; dram_address += (length + skip); - dram_address &= 0xFFFFF8; + dram_address &= 0xFFFFFC; mem_address += length; mem_address &= 0xFF8; } + Util::trace("Addresses after: RSP: 0x{:08X}, Dram: 0x{:08X}", mem_address, dram_address); lastSuccessfulSPAddr.address = mem_address; lastSuccessfulSPAddr.bank = spDMASPAddr.bank; @@ -172,7 +176,7 @@ template <> void RSP::DMA() { void RSP::Write(u32 addr, u32 val) { switch (addr) { case 0x04040000: spDMASPAddr.raw = val & 0x1FF8; break; - case 0x04040004: spDMADRAMAddr.raw = val & 0xFFFFF8; break; + case 0x04040004: spDMADRAMAddr.raw = val & 0xFFFFFC; break; case 0x04040008: { spDMALen.raw = val; DMA();