Recompiler: Handle stack if it is in IMEM/DMEM
This commit is contained in:
parent
4525e8b6f3
commit
ae6157427f
|
@ -1484,7 +1484,22 @@ void CN64System::SyncCPU(CN64System * const SecondCPU)
|
||||||
#if defined(__aarch64__) || defined(__amd64__) || defined(_M_X64)
|
#if defined(__aarch64__) || defined(__amd64__) || defined(_M_X64)
|
||||||
g_Notify->BreakPoint(__FILE__, __LINE__);
|
g_Notify->BreakPoint(__FILE__, __LINE__);
|
||||||
#else
|
#else
|
||||||
if (m_Recomp->MemoryStackPos() != (uint32_t)(m_MMU_VM.Rdram() + (m_Reg.m_GPR[29].W[0] & 0x1FFFFFFF)))
|
uint32_t StackPointer = (m_Reg.m_GPR[29].W[0] & 0x1FFFFFFF);
|
||||||
|
uint32_t TargetStackPos = 0;
|
||||||
|
if (StackPointer < m_MMU_VM.RdramSize())
|
||||||
|
{
|
||||||
|
TargetStackPos = (uint32_t)(m_MMU_VM.Rdram() + StackPointer);
|
||||||
|
}
|
||||||
|
else if (StackPointer > 0x04000000 && StackPointer < 0x04001000)
|
||||||
|
{
|
||||||
|
TargetStackPos = (uint32_t)(m_MMU_VM.Dmem() + StackPointer - 0x04000000);
|
||||||
|
}
|
||||||
|
else if (StackPointer > 0x04001000 && StackPointer < 0x04002000)
|
||||||
|
{
|
||||||
|
TargetStackPos = (uint32_t)(m_MMU_VM.Imem() + StackPointer - 0x04001000);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_Recomp->MemoryStackPos() != TargetStackPos)
|
||||||
{
|
{
|
||||||
ErrorFound = true;
|
ErrorFound = true;
|
||||||
}
|
}
|
||||||
|
@ -1666,7 +1681,22 @@ void CN64System::DumpSyncErrors(CN64System * SecondCPU)
|
||||||
#if defined(__aarch64__) || defined(__amd64__) || defined(_M_X64)
|
#if defined(__aarch64__) || defined(__amd64__) || defined(_M_X64)
|
||||||
g_Notify->BreakPoint(__FILE__, __LINE__);
|
g_Notify->BreakPoint(__FILE__, __LINE__);
|
||||||
#else
|
#else
|
||||||
if (m_Recomp->MemoryStackPos() != (uint32_t)(m_MMU_VM.Rdram() + (m_Reg.m_GPR[29].W[0] & 0x1FFFFFFF)))
|
uint32_t StackPointer = (m_Reg.m_GPR[29].W[0] & 0x1FFFFFFF);
|
||||||
|
uint32_t TargetStackPos = 0;
|
||||||
|
if (StackPointer < m_MMU_VM.RdramSize())
|
||||||
|
{
|
||||||
|
TargetStackPos = (uint32_t)(m_MMU_VM.Rdram() + StackPointer);
|
||||||
|
}
|
||||||
|
else if (StackPointer > 0x04000000 && StackPointer < 0x04001000)
|
||||||
|
{
|
||||||
|
TargetStackPos = (uint32_t)(m_MMU_VM.Dmem() + StackPointer - 0x04000000);
|
||||||
|
}
|
||||||
|
else if (StackPointer > 0x04001000 && StackPointer < 0x04002000)
|
||||||
|
{
|
||||||
|
TargetStackPos = (uint32_t)(m_MMU_VM.Imem() + StackPointer - 0x04001000);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_Recomp->MemoryStackPos() != TargetStackPos)
|
||||||
{
|
{
|
||||||
Error.LogF("MemoryStack = %X should be: %X\r\n", m_Recomp->MemoryStackPos(), (uint32_t)(m_MMU_VM.Rdram() + (m_Reg.m_GPR[29].W[0] & 0x1FFFFFFF)));
|
Error.LogF("MemoryStack = %X should be: %X\r\n", m_Recomp->MemoryStackPos(), (uint32_t)(m_MMU_VM.Rdram() + (m_Reg.m_GPR[29].W[0] & 0x1FFFFFFF)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -530,9 +530,24 @@ void CRecompiler::ResetMemoryStackPos()
|
||||||
|
|
||||||
uint32_t pAddr = 0;
|
uint32_t pAddr = 0;
|
||||||
if (m_MMU.VAddrToPAddr(m_Registers.m_GPR[29].UW[0], pAddr))
|
if (m_MMU.VAddrToPAddr(m_Registers.m_GPR[29].UW[0], pAddr))
|
||||||
|
{
|
||||||
|
if (pAddr < m_MMU.RdramSize())
|
||||||
{
|
{
|
||||||
m_MemoryStack = (uint32_t)(m_MMU.Rdram() + pAddr);
|
m_MemoryStack = (uint32_t)(m_MMU.Rdram() + pAddr);
|
||||||
}
|
}
|
||||||
|
else if (pAddr > 0x04000000 && pAddr < 0x04001000)
|
||||||
|
{
|
||||||
|
m_MemoryStack = (uint32_t)(m_MMU.Dmem() + pAddr - 0x04000000);
|
||||||
|
}
|
||||||
|
else if (pAddr > 0x04001000 && pAddr < 0x04002000)
|
||||||
|
{
|
||||||
|
m_MemoryStack = (uint32_t)(m_MMU.Imem() + pAddr - 0x04001000);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_Notify->BreakPoint(__FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WriteTrace(TraceRecompiler, TraceError, "Failed to translate SP address (%s)", m_Registers.m_GPR[29].UW[0]);
|
WriteTrace(TraceRecompiler, TraceError, "Failed to translate SP address (%s)", m_Registers.m_GPR[29].UW[0]);
|
||||||
|
|
|
@ -3399,8 +3399,7 @@ void CX86RecompilerOps::LW_KnownAddress(CX86Ops::x86Reg Reg, uint32_t VAddr)
|
||||||
}
|
}
|
||||||
else if (g_DDRom != nullptr && ((PAddr & 0xFF000000) == 0x06000000 && (PAddr - 0x06000000) < g_DDRom->GetRomSize()))
|
else if (g_DDRom != nullptr && ((PAddr & 0xFF000000) == 0x06000000 && (PAddr - 0x06000000) < g_DDRom->GetRomSize()))
|
||||||
{
|
{
|
||||||
// Read from DDROM (TODO: Is DDROM a disk image or the IPL?)
|
m_Assembler.MoveVariableToX86reg(g_DDRom->GetRomAddress() + (PAddr - 0x06000000), stdstr_f("DDRom + %X", (PAddr - 0x06000000)).c_str(), Reg);
|
||||||
m_Assembler.MoveVariableToX86reg(PAddr + g_MMU->Rdram(), stdstr_f("RDRAM + %X", PAddr).c_str(), Reg);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue