diff --git a/Source/Project64-core/N64System/MemoryHandler/SPRegistersHandler.cpp b/Source/Project64-core/N64System/MemoryHandler/SPRegistersHandler.cpp index 110955f4a..8e0c00f6e 100644 --- a/Source/Project64-core/N64System/MemoryHandler/SPRegistersHandler.cpp +++ b/Source/Project64-core/N64System/MemoryHandler/SPRegistersHandler.cpp @@ -106,7 +106,7 @@ bool SPRegistersHandler::Write32(uint32_t Address, uint32_t Value, uint32_t Mask break; case 0x0404000C: SP_WR_LEN_REG = (SP_WR_LEN_REG & ~Mask) | (MaskedValue); - m_MMU.SP_DMA_WRITE(); + SP_DMA_WRITE(); break; case 0x04040010: if ((MaskedValue & SP_CLR_HALT) != 0) { SP_STATUS_REG &= ~SP_STATUS_HALT; } @@ -200,3 +200,43 @@ void SPRegistersHandler::SP_DMA_READ() SP_STATUS_REG &= ~SP_STATUS_DMA_BUSY; } +void SPRegistersHandler::SP_DMA_WRITE() +{ + if (g_Reg->SP_DRAM_ADDR_REG > g_MMU->RdramSize()) + { + if (HaveDebugger()) + { + g_Notify->DisplayError(stdstr_f("%s\nSP_DRAM_ADDR_REG not in RDRAM space: %08X", __FUNCTION__, g_Reg->SP_DRAM_ADDR_REG).c_str()); + } + return; + } + + if (g_Reg->SP_WR_LEN_REG + 1 + (g_Reg->SP_MEM_ADDR_REG & 0xFFF) > 0x1000) + { + if (HaveDebugger()) + { + g_Notify->DisplayError("SP DMA WRITE\nCould not fit copy in memory segment"); + } + return; + } + + if ((g_Reg->SP_MEM_ADDR_REG & 3) != 0) + { + g_Notify->BreakPoint(__FILE__, __LINE__); + } + + if ((g_Reg->SP_DRAM_ADDR_REG & 3) != 0) + { + g_Notify->BreakPoint(__FILE__, __LINE__); + } + if (((g_Reg->SP_WR_LEN_REG + 1) & 3) != 0) + { + g_Notify->BreakPoint(__FILE__, __LINE__); + } + + memcpy(g_MMU->Rdram() + g_Reg->SP_DRAM_ADDR_REG, g_MMU->Dmem() + (g_Reg->SP_MEM_ADDR_REG & 0x1FFF), + g_Reg->SP_WR_LEN_REG + 1); + + g_Reg->SP_DMA_BUSY_REG = 0; + g_Reg->SP_STATUS_REG &= ~SP_STATUS_DMA_BUSY; +} \ No newline at end of file diff --git a/Source/Project64-core/N64System/MemoryHandler/SPRegistersHandler.h b/Source/Project64-core/N64System/MemoryHandler/SPRegistersHandler.h index cb8eb74e5..01a6ad2af 100644 --- a/Source/Project64-core/N64System/MemoryHandler/SPRegistersHandler.h +++ b/Source/Project64-core/N64System/MemoryHandler/SPRegistersHandler.h @@ -50,6 +50,7 @@ private: SPRegistersHandler & operator=(const SPRegistersHandler &); void SP_DMA_READ(); + void SP_DMA_WRITE(); CN64System & m_System; CMipsMemoryVM & m_MMU; diff --git a/Source/Project64-core/N64System/Mips/Dma.cpp b/Source/Project64-core/N64System/Mips/Dma.cpp index 014382936..88fc4e412 100644 --- a/Source/Project64-core/N64System/Mips/Dma.cpp +++ b/Source/Project64-core/N64System/Mips/Dma.cpp @@ -428,45 +428,4 @@ void CDMA::PI_DMA_WRITE() g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY; g_Reg->MI_INTR_REG |= MI_INTR_PI; g_Reg->CheckInterrupts(); -} - -void CDMA::SP_DMA_WRITE() -{ - if (g_Reg->SP_DRAM_ADDR_REG > g_MMU->RdramSize()) - { - if (HaveDebugger()) - { - g_Notify->DisplayError(stdstr_f("%s\nSP_DRAM_ADDR_REG not in RDRAM space: %08X", __FUNCTION__, g_Reg->SP_DRAM_ADDR_REG).c_str()); - } - return; - } - - if (g_Reg->SP_WR_LEN_REG + 1 + (g_Reg->SP_MEM_ADDR_REG & 0xFFF) > 0x1000) - { - if (HaveDebugger()) - { - g_Notify->DisplayError("SP DMA WRITE\nCould not fit copy in memory segment"); - } - return; - } - - if ((g_Reg->SP_MEM_ADDR_REG & 3) != 0) - { - g_Notify->BreakPoint(__FILE__, __LINE__); - } - - if ((g_Reg->SP_DRAM_ADDR_REG & 3) != 0) - { - g_Notify->BreakPoint(__FILE__, __LINE__); - } - if (((g_Reg->SP_WR_LEN_REG + 1) & 3) != 0) - { - g_Notify->BreakPoint(__FILE__, __LINE__); - } - - memcpy(g_MMU->Rdram() + g_Reg->SP_DRAM_ADDR_REG, g_MMU->Dmem() + (g_Reg->SP_MEM_ADDR_REG & 0x1FFF), - g_Reg->SP_WR_LEN_REG + 1); - - g_Reg->SP_DMA_BUSY_REG = 0; - g_Reg->SP_STATUS_REG &= ~SP_STATUS_DMA_BUSY; } \ No newline at end of file diff --git a/Source/Project64-core/N64System/Mips/Dma.h b/Source/Project64-core/N64System/Mips/Dma.h index 86011c865..d3344c7c1 100644 --- a/Source/Project64-core/N64System/Mips/Dma.h +++ b/Source/Project64-core/N64System/Mips/Dma.h @@ -9,7 +9,6 @@ class CDMA : CDMA(); public: - void SP_DMA_WRITE(); void PI_DMA_READ(); void PI_DMA_WRITE(); diff --git a/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp b/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp index 72598f25f..94c91db1e 100644 --- a/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp +++ b/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp @@ -6591,11 +6591,12 @@ void CArmRecompilerOps::SW_Register(ArmReg Reg, uint32_t VAddr) m_RegWorkingSet.AfterCallDirect(); break; case 0x0404000C: - MoveArmRegToVariable(Reg, &g_Reg->SP_WR_LEN_REG, "SP_WR_LEN_REG"); + ArmBreakPoint(__FILE__, __LINE__); + /*MoveArmRegToVariable(Reg, &g_Reg->SP_WR_LEN_REG, "SP_WR_LEN_REG"); m_RegWorkingSet.BeforeCallDirect(); MoveConstToArmReg(Arm_R0, (uint32_t)((CDMA *)g_MMU), "(CDMA *)g_MMU"); CallFunction(AddressOf(&CDMA::SP_DMA_WRITE), "CDMA::SP_DMA_WRITE"); - m_RegWorkingSet.AfterCallDirect(); + m_RegWorkingSet.AfterCallDirect();*/ break; case 0x04040010: m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() - g_System->CountPerOp());