From 77e04afc0c77bac1f18b0b2ade4a0470b2074161 Mon Sep 17 00:00:00 2001 From: Simone Coco Date: Fri, 17 May 2024 12:02:39 +0200 Subject: [PATCH] Fix behaviour of RDRAM in PI DMAs --- src/backend/core/mmio/PI.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/backend/core/mmio/PI.cpp b/src/backend/core/mmio/PI.cpp index 7eb73b05..7c0c761a 100644 --- a/src/backend/core/mmio/PI.cpp +++ b/src/backend/core/mmio/PI.cpp @@ -438,11 +438,15 @@ void PI::Write(u32 addr, u32 val) { len -= dramAddrInternal & 0x7; } rdLen = len; - if(dramAddrInternal >= 0x800000) { - Util::panic("PI DMA RDRAM->CART ADDRESS TOO HIGH"); - } + for (int i = 0; i < len; i++) { - BusWrite(cartAddrInternal + i, mem.mmio.rdp.rdram[BYTE_ADDRESS(dramAddrInternal + i) & RDRAM_DSIZE]); + u32 addr = BYTE_ADDRESS(dramAddrInternal + i) & RDRAM_DSIZE; + if (addr < RDRAM_SIZE) { + BusWrite(cartAddrInternal + i, mem.mmio.rdp.rdram[addr]); + } + else { + BusWrite(cartAddrInternal + i, 0); + } } Util::trace("PI DMA from RDRAM to CARTRIDGE (size: {} B, {:08X} to {:08X})", len, dramAddr, cartAddr); dmaBusy = true; @@ -463,7 +467,10 @@ void PI::Write(u32 addr, u32 val) { } for(u32 i = 0; i < len; i++) { - mem.mmio.rdp.rdram[BYTE_ADDRESS(dramAddrInternal + i) & RDRAM_DSIZE] = BusRead(cartAddrInternal + i); + u32 addr = BYTE_ADDRESS(dramAddrInternal + i) & RDRAM_DSIZE; + if (addr < mem.mmio.rdp.rdram.size()) { + mem.mmio.rdp.rdram[addr] = BusRead(cartAddrInternal + i); + } } dmaBusy = true; Util::trace("PI DMA from CARTRIDGE to RDRAM (size: {} B, {:08X} to {:08X})", len, cartAddr, dramAddr);