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;
|
break;
|
||||||
case 0x0404000C:
|
case 0x0404000C:
|
||||||
SP_WR_LEN_REG = (SP_WR_LEN_REG & ~Mask) | (MaskedValue);
|
SP_WR_LEN_REG = (SP_WR_LEN_REG & ~Mask) | (MaskedValue);
|
||||||
m_MMU.SP_DMA_WRITE();
|
SP_DMA_WRITE();
|
||||||
break;
|
break;
|
||||||
case 0x04040010:
|
case 0x04040010:
|
||||||
if ((MaskedValue & SP_CLR_HALT) != 0) { SP_STATUS_REG &= ~SP_STATUS_HALT; }
|
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;
|
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 &);
|
SPRegistersHandler & operator=(const SPRegistersHandler &);
|
||||||
|
|
||||||
void SP_DMA_READ();
|
void SP_DMA_READ();
|
||||||
|
void SP_DMA_WRITE();
|
||||||
|
|
||||||
CN64System & m_System;
|
CN64System & m_System;
|
||||||
CMipsMemoryVM & m_MMU;
|
CMipsMemoryVM & m_MMU;
|
||||||
|
|
|
@ -429,44 +429,3 @@ void CDMA::PI_DMA_WRITE()
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
||||||
g_Reg->CheckInterrupts();
|
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();
|
CDMA();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void SP_DMA_WRITE();
|
|
||||||
void PI_DMA_READ();
|
void PI_DMA_READ();
|
||||||
void PI_DMA_WRITE();
|
void PI_DMA_WRITE();
|
||||||
|
|
||||||
|
|
|
@ -6591,11 +6591,12 @@ void CArmRecompilerOps::SW_Register(ArmReg Reg, uint32_t VAddr)
|
||||||
m_RegWorkingSet.AfterCallDirect();
|
m_RegWorkingSet.AfterCallDirect();
|
||||||
break;
|
break;
|
||||||
case 0x0404000C:
|
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();
|
m_RegWorkingSet.BeforeCallDirect();
|
||||||
MoveConstToArmReg(Arm_R0, (uint32_t)((CDMA *)g_MMU), "(CDMA *)g_MMU");
|
MoveConstToArmReg(Arm_R0, (uint32_t)((CDMA *)g_MMU), "(CDMA *)g_MMU");
|
||||||
CallFunction(AddressOf(&CDMA::SP_DMA_WRITE), "CDMA::SP_DMA_WRITE");
|
CallFunction(AddressOf(&CDMA::SP_DMA_WRITE), "CDMA::SP_DMA_WRITE");
|
||||||
m_RegWorkingSet.AfterCallDirect();
|
m_RegWorkingSet.AfterCallDirect();*/
|
||||||
break;
|
break;
|
||||||
case 0x04040010:
|
case 0x04040010:
|
||||||
m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() - g_System->CountPerOp());
|
m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() - g_System->CountPerOp());
|
||||||
|
|
Loading…
Reference in New Issue