diff --git a/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp b/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp index ef3c2d32e..00b197821 100644 --- a/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp +++ b/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp @@ -44,10 +44,10 @@ const uint32_t R4300iOp::SWR_MASK[4] = { 0x00FFFFFF, 0x0000FFFF, 0x000000FF, 0x0 const uint32_t R4300iOp::LWL_MASK[4] = { 0x00000000, 0x000000FF, 0x0000FFFF, 0x00FFFFFF }; const uint32_t R4300iOp::LWR_MASK[4] = { 0xFFFFFF00, 0xFFFF0000, 0xFF000000, 0x0000000 }; -const int32_t R4300iOp::SWL_SHIFT[4] = { 0, 8, 16, 24 }; -const int32_t R4300iOp::SWR_SHIFT[4] = { 24, 16, 8, 0 }; -const int32_t R4300iOp::LWL_SHIFT[4] = { 0, 8, 16, 24 }; -const int32_t R4300iOp::LWR_SHIFT[4] = { 24, 16, 8, 0 }; +const int32_t R4300iOp::SWL_SHIFT[4] = { 0, 8, 16, 24 }; +const int32_t R4300iOp::SWR_SHIFT[4] = { 24, 16, 8, 0 }; +const int32_t R4300iOp::LWL_SHIFT[4] = { 0, 8, 16, 24 }; +const int32_t R4300iOp::LWR_SHIFT[4] = { 24, 16, 8, 0 }; #define TEST_COP1_USABLE_EXCEPTION() \ if ((g_Reg->STATUS_REGISTER & STATUS_CU1) == 0) {\ @@ -1098,13 +1098,13 @@ void R4300iOp::LWU() void R4300iOp::SB() { uint32_t Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset; - g_MMU->SB_Memory(Address, _GPR[m_Opcode.rt].UB[0]); + g_MMU->SB_Memory(Address, _GPR[m_Opcode.rt].UW[0]); } void R4300iOp::SH() { uint32_t Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset; - g_MMU->SH_Memory(Address, _GPR[m_Opcode.rt].UHW[0]); + g_MMU->SH_Memory(Address, _GPR[m_Opcode.rt].UW[0]); } void R4300iOp::SWL() diff --git a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp index 9975a2f4f..8dc2f2ec8 100755 --- a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp +++ b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp @@ -476,7 +476,7 @@ bool CMipsMemoryVM::LD_Memory(uint32_t VAddr, uint64_t& Value) return LD_NonMemory(VAddr, Value); } -bool CMipsMemoryVM::SB_Memory(uint32_t VAddr, uint8_t Value) +bool CMipsMemoryVM::SB_Memory(uint32_t VAddr, uint32_t Value) { if (HaveWriteBP() && g_Debugger->WriteBP8(VAddr) && MemoryBreakpoint()) { @@ -485,7 +485,7 @@ bool CMipsMemoryVM::SB_Memory(uint32_t VAddr, uint8_t Value) uint8_t * MemoryPtr = (uint8_t*)m_MemoryWriteMap[VAddr >> 12]; if (MemoryPtr != (uint8_t *)-1) { - *(uint8_t*)(MemoryPtr + (VAddr ^ 3)) = Value; + *(uint8_t*)(MemoryPtr + (VAddr ^ 3)) = (uint8_t)Value; return true; } if (m_TLB_WriteMap[VAddr >> 12] == -1) @@ -496,7 +496,7 @@ bool CMipsMemoryVM::SB_Memory(uint32_t VAddr, uint8_t Value) return SB_NonMemory(VAddr, Value); } -bool CMipsMemoryVM::SH_Memory(uint32_t VAddr, uint16_t Value) +bool CMipsMemoryVM::SH_Memory(uint32_t VAddr, uint32_t Value) { if ((VAddr & 1) != 0) { @@ -510,7 +510,7 @@ bool CMipsMemoryVM::SH_Memory(uint32_t VAddr, uint16_t Value) uint8_t * MemoryPtr = (uint8_t*)m_MemoryWriteMap[VAddr >> 12]; if (MemoryPtr != (uint8_t *)-1) { - *(uint16_t*)(MemoryPtr + (VAddr ^ 2)) = Value; + *(uint16_t*)(MemoryPtr + (VAddr ^ 2)) = (uint16_t)Value; return true; } uint32_t BaseAddress = m_TLB_ReadMap[VAddr >> 12]; @@ -711,7 +711,7 @@ bool CMipsMemoryVM::LD_NonMemory(uint32_t VAddr, uint64_t & Value) return false; } -bool CMipsMemoryVM::SB_NonMemory(uint32_t VAddr, uint8_t Value) +bool CMipsMemoryVM::SB_NonMemory(uint32_t VAddr, uint32_t Value) { uint32_t BaseAddress = m_TLB_ReadMap[VAddr >> 12]; if (BaseAddress == -1) @@ -734,11 +734,15 @@ bool CMipsMemoryVM::SB_NonMemory(uint32_t VAddr, uint8_t Value) { g_Recompiler->ClearRecompCode_Phys(PAddr & ~0xFFF, 0xFFC, CRecompiler::Remove_ProtectedMem); ::ProtectMemory(m_RDRAM + (PAddr & ~0xFFF), 0xFFC, MEM_READWRITE); - *(uint8_t *)(m_RDRAM + (PAddr ^ 3)) = Value; + *(uint8_t *)(m_RDRAM + (PAddr ^ 3)) = (uint8_t)Value; } break; default: - if (BreakOnUnhandledMemory()) + if (PAddr >= 0x10000000 && PAddr < 0x20000000) + { + m_RomMemoryHandler.Write32(PAddr, Value << ((3 - (PAddr & 3)) * 8), 0xFFFFFFFF); + } + else if (BreakOnUnhandledMemory()) { g_Notify->BreakPoint(__FILE__, __LINE__); } @@ -748,7 +752,7 @@ bool CMipsMemoryVM::SB_NonMemory(uint32_t VAddr, uint8_t Value) return true; } -bool CMipsMemoryVM::SH_NonMemory(uint32_t VAddr, uint16_t Value) +bool CMipsMemoryVM::SH_NonMemory(uint32_t VAddr, uint32_t Value) { uint32_t BaseAddress = m_TLB_ReadMap[VAddr >> 12]; if (BaseAddress == -1) @@ -780,12 +784,16 @@ bool CMipsMemoryVM::SH_NonMemory(uint32_t VAddr, uint16_t Value) { m_TLB_WriteMap[VAddr >> 12] = PAddr - VAddr; } - *(uint16_t *)(m_RDRAM + (PAddr ^ 2)) = Value; + *(uint16_t *)(m_RDRAM + (PAddr ^ 2)) = (uint16_t)Value; } } break; default: - if (BreakOnUnhandledMemory()) + if (PAddr >= 0x10000000 && PAddr < 0x20000000) + { + m_RomMemoryHandler.Write32(PAddr, Value << ((2 - (PAddr & 2)) * 8), 0xFFFFFFFF); + } + else if (BreakOnUnhandledMemory()) { g_Notify->BreakPoint(__FILE__, __LINE__); } @@ -901,7 +909,11 @@ bool CMipsMemoryVM::SD_NonMemory(uint32_t VAddr, uint64_t Value) } break; default: - if (BreakOnUnhandledMemory()) + if (PAddr >= 0x10000000 && PAddr < 0x20000000) + { + m_RomMemoryHandler.Write32(PAddr, (int32_t)(Value >> 32), 0xFFFFFFFF); + } + else if (BreakOnUnhandledMemory()) { g_Notify->BreakPoint(__FILE__, __LINE__); } diff --git a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h index f0010baac..e3730c9e7 100644 --- a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h +++ b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h @@ -88,8 +88,8 @@ public: bool LW_Memory(uint32_t VAddr, uint32_t & Value); bool LD_Memory(uint32_t VAddr, uint64_t & Value); - bool SB_Memory(uint32_t VAddr, uint8_t Value); - bool SH_Memory(uint32_t VAddr, uint16_t Value); + bool SB_Memory(uint32_t VAddr, uint32_t Value); + bool SH_Memory(uint32_t VAddr, uint32_t Value); bool SW_Memory(uint32_t VAddr, uint32_t Value); bool SD_Memory(uint32_t VAddr, uint64_t Value); @@ -140,8 +140,8 @@ private: bool LW_NonMemory(uint32_t VAddr, uint32_t & Value); bool LD_NonMemory(uint32_t VAddr, uint64_t & Value); - bool SB_NonMemory(uint32_t VAddr, uint8_t Value); - bool SH_NonMemory(uint32_t VAddr, uint16_t Value); + bool SB_NonMemory(uint32_t VAddr, uint32_t Value); + bool SH_NonMemory(uint32_t VAddr, uint32_t Value); bool SW_NonMemory(uint32_t VAddr, uint32_t Value); bool SD_NonMemory(uint32_t VAddr, uint64_t Value);