diff --git a/src/backend/core/Mem.cpp b/src/backend/core/Mem.cpp index 4a5b2b49..1973f5db 100644 --- a/src/backend/core/Mem.cpp +++ b/src/backend/core/Mem.cpp @@ -188,10 +188,11 @@ u8 Mem::Read8(n64::Registers ®s, u32 paddr) { return mmio.rdp.rdram[BYTE_ADDRESS(paddr)]; case RSP_MEM_REGION: { u32 mirrAddr = paddr & 0x1FFF; - if(mirrAddr >= 0x1000) { - return mmio.rsp.imem[BYTE_ADDRESS(paddr) & IMEM_DSIZE]; + if(mirrAddr & 0x1000) { + mirrAddr -= 0x1000; + return mmio.rsp.imem[BYTE_ADDRESS(mirrAddr)]; } else { - return mmio.rsp.dmem[BYTE_ADDRESS(paddr) & DMEM_DSIZE]; + return mmio.rsp.dmem[BYTE_ADDRESS(mirrAddr)]; } } case 0x04040000 ... 0x040FFFFF: @@ -257,10 +258,11 @@ u16 Mem::Read16(n64::Registers ®s, u32 paddr) { return Util::ReadAccess(mmio.rdp.rdram, HALF_ADDRESS(paddr)); case RSP_MEM_REGION: { u32 mirrAddr = paddr & 0x1FFF; - if(mirrAddr >= 0x1000) { - return Util::ReadAccess(mmio.rsp.imem, HALF_ADDRESS(paddr) & IMEM_DSIZE); + if(mirrAddr & 0x1000) { + mirrAddr -= 0x1000; + return Util::ReadAccess(mmio.rsp.imem, HALF_ADDRESS(mirrAddr)); } else { - return Util::ReadAccess(mmio.rsp.dmem, HALF_ADDRESS(paddr) & DMEM_DSIZE); + return Util::ReadAccess(mmio.rsp.dmem, HALF_ADDRESS(mirrAddr)); } } case MMIO_REGION: @@ -297,10 +299,11 @@ u32 Mem::Read32(n64::Registers ®s, u32 paddr) { return Util::ReadAccess(mmio.rdp.rdram, paddr); case RSP_MEM_REGION: { u32 mirrAddr = paddr & 0x1FFF; - if(mirrAddr >= 0x1000) { - return Util::ReadAccess(mmio.rsp.imem, paddr & IMEM_DSIZE); + if(mirrAddr & 0x1000) { + mirrAddr -= 0x1000; + return Util::ReadAccess(mmio.rsp.imem, mirrAddr); } else { - return Util::ReadAccess(mmio.rsp.dmem, paddr & DMEM_DSIZE); + return Util::ReadAccess(mmio.rsp.dmem, mirrAddr); } } case MMIO_REGION: @@ -343,10 +346,11 @@ u64 Mem::Read64(n64::Registers ®s, u32 paddr) { return Util::ReadAccess(mmio.rdp.rdram, paddr); case RSP_MEM_REGION: { u32 mirrAddr = paddr & 0x1FFF; - if(mirrAddr >= 0x1000) { - return Util::ReadAccess(mmio.rsp.imem, paddr & IMEM_DSIZE); + if(mirrAddr & 0x1000) { + mirrAddr -= 0x1000; + return Util::ReadAccess(mmio.rsp.imem, mirrAddr); } else { - return Util::ReadAccess(mmio.rsp.dmem, paddr & DMEM_DSIZE); + return Util::ReadAccess(mmio.rsp.dmem, mirrAddr); } } case MMIO_REGION: @@ -383,13 +387,12 @@ void Mem::Write8(Registers& regs, u32 paddr, u32 val) { break; case RSP_MEM_REGION: { u32 mirrAddr = paddr & 0x1FFF; - val = val << (8 * (3 - (paddr & 3))); - if(mirrAddr >= 0x1000) { - paddr = (paddr & IMEM_SIZE) & ~3; - Util::WriteAccess(mmio.rsp.imem, paddr & IMEM_DSIZE, val); + val = val << (8 * (3 - (mirrAddr & 3))); + mirrAddr = (mirrAddr & 0xFFF) & ~3; + if(mirrAddr & 0x1000) { + Util::WriteAccess(mmio.rsp.imem, mirrAddr, val); } else { - paddr = (paddr & DMEM_SIZE) & ~3; - Util::WriteAccess(mmio.rsp.dmem, paddr & DMEM_DSIZE, val); + Util::WriteAccess(mmio.rsp.dmem, mirrAddr, val); } } break; case MMIO_REGION: @@ -454,13 +457,12 @@ void Mem::Write16(Registers& regs, u32 paddr, u32 val) { break; case RSP_MEM_REGION: { u32 mirrAddr = paddr & 0x1FFF; - val = val << (16 * !(paddr & 2)); - if(mirrAddr >= 0x1000) { - paddr = (paddr & IMEM_SIZE) & ~3; - Util::WriteAccess(mmio.rsp.imem, paddr & IMEM_DSIZE, val); + val = val << (16 * !(mirrAddr & 2)); + mirrAddr = (mirrAddr & 0xFFF) & ~3; + if(mirrAddr & 0x1000) { + Util::WriteAccess(mmio.rsp.imem, mirrAddr, val); } else { - paddr = (paddr & DMEM_SIZE) & ~3; - Util::WriteAccess(mmio.rsp.dmem, paddr & DMEM_DSIZE, val); + Util::WriteAccess(mmio.rsp.dmem, mirrAddr, val); } } break; case MMIO_REGION: @@ -504,7 +506,7 @@ void Mem::Write32(Registers& regs, u32 paddr, u32 val) { break; case RSP_MEM_REGION: { u32 mirrAddr = paddr & 0x1FFF; - if(mirrAddr >= 0x1000) { + if(mirrAddr & 0x1000) { Util::WriteAccess(mmio.rsp.imem, paddr & IMEM_DSIZE, val); } else { Util::WriteAccess(mmio.rsp.dmem, paddr & DMEM_DSIZE, val); @@ -571,7 +573,7 @@ void Mem::Write64(Registers& regs, u32 paddr, u64 val) { case RSP_MEM_REGION: { u32 mirrAddr = paddr & 0x1FFF; val >>= 32; - if(mirrAddr >= 0x1000) { + if(mirrAddr & 0x1000) { Util::WriteAccess(mmio.rsp.imem, paddr & IMEM_DSIZE, val); } else { Util::WriteAccess(mmio.rsp.dmem, paddr & DMEM_DSIZE, val);