Core: Move SP_DMA_WRITE into SPRegistersHandler
This commit is contained in:
parent
86aa483a38
commit
f0760ff1cf
|
@ -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;
|
||||
}
|
|
@ -50,6 +50,7 @@ private:
|
|||
SPRegistersHandler & operator=(const SPRegistersHandler &);
|
||||
|
||||
void SP_DMA_READ();
|
||||
void SP_DMA_WRITE();
|
||||
|
||||
CN64System & m_System;
|
||||
CMipsMemoryVM & m_MMU;
|
||||
|
|
|
@ -429,44 +429,3 @@ void CDMA::PI_DMA_WRITE()
|
|||
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;
|
||||
}
|
|
@ -9,7 +9,6 @@ class CDMA :
|
|||
CDMA();
|
||||
|
||||
public:
|
||||
void SP_DMA_WRITE();
|
||||
void PI_DMA_READ();
|
||||
void PI_DMA_WRITE();
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
|
Loading…
Reference in New Issue