Core: Fix up handling VideoInterfaceHandler in recompiler

This commit is contained in:
zilmar 2022-03-14 15:29:10 +10:30
parent 80d8e6edaa
commit df422238c9
2 changed files with 187 additions and 152 deletions

View File

@ -76,7 +76,7 @@ bool VideoInterfaceHandler::Read32(uint32_t Address, uint32_t & Value)
} }
} }
if (LogVideoInterface()) if (GenerateLog() && LogVideoInterface())
{ {
switch (Address & 0x1FFFFFFF) switch (Address & 0x1FFFFFFF)
{ {
@ -106,7 +106,7 @@ bool VideoInterfaceHandler::Read32(uint32_t Address, uint32_t & Value)
bool VideoInterfaceHandler::Write32(uint32_t Address, uint32_t Value, uint32_t Mask) bool VideoInterfaceHandler::Write32(uint32_t Address, uint32_t Value, uint32_t Mask)
{ {
if (LogVideoInterface()) if (GenerateLog() && LogVideoInterface())
{ {
switch (Address & 0x1FFFFFFF) switch (Address & 0x1FFFFFFF)
{ {

View File

@ -187,12 +187,12 @@ void CX86RecompilerOps::PreCompileOpcode(void)
{ {
CPU_Message(" %X %s", m_CompilePC, R4300iOpcodeName(m_Opcode.Hex, m_CompilePC)); CPU_Message(" %X %s", m_CompilePC, R4300iOpcodeName(m_Opcode.Hex, m_CompilePC));
} }
/*if (m_CompilePC == 0x803245C4 && m_PipelineStage == NORMAL) /*if (m_CompilePC == 0x803275F4 && m_PipelineStage == PIPELINE_STAGE_NORMAL)
{ {
X86BreakPoint(__FILE__, __LINE__); X86BreakPoint(__FILE__, __LINE__);
}*/ }
/*if (m_CompilePC >= 0x80000000 && m_CompilePC <= 0x80400000 && m_PipelineStage == NORMAL) /*if (m_CompilePC >= 0x80000000 && m_CompilePC <= 0x80400000 && m_PipelineStage == PIPELINE_STAGE_NORMAL)
{ {
m_RegWorkingSet.WriteBackRegisters(); m_RegWorkingSet.WriteBackRegisters();
UpdateCounters(m_RegWorkingSet, false, true); UpdateCounters(m_RegWorkingSet, false, true);
@ -211,7 +211,7 @@ void CX86RecompilerOps::PreCompileOpcode(void)
/*if ((m_CompilePC == 0x8031C0E4 || m_CompilePC == 0x8031C118 || /*if ((m_CompilePC == 0x8031C0E4 || m_CompilePC == 0x8031C118 ||
m_CompilePC == 0x8031CD88 || m_CompilePC == 0x8031CE24 || m_CompilePC == 0x8031CD88 || m_CompilePC == 0x8031CE24 ||
m_CompilePC == 0x8031CE30 || m_CompilePC == 0x8031CE40) && m_PipelineStage == NORMAL) m_CompilePC == 0x8031CE30 || m_CompilePC == 0x8031CE40) && m_PipelineStage == PIPELINE_STAGE_NORMAL)
{ {
m_RegWorkingSet.WriteBackRegisters(); m_RegWorkingSet.WriteBackRegisters();
UpdateCounters(m_RegWorkingSet, false, true); UpdateCounters(m_RegWorkingSet, false, true);
@ -236,7 +236,7 @@ void CX86RecompilerOps::PreCompileOpcode(void)
m_RegWorkingSet.AfterCallDirect(); m_RegWorkingSet.AfterCallDirect();
}*/ }*/
/*if (m_CompilePC >= 0x801C1AF8 && m_CompilePC <= 0x801C1C00 && m_PipelineStage == NORMAL) /*if (m_CompilePC >= 0x801C1AF8 && m_CompilePC <= 0x801C1C00 && m_PipelineStage == PIPELINE_STAGE_NORMAL)
{ {
UpdateCounters(m_RegWorkingSet,false,true); UpdateCounters(m_RegWorkingSet,false,true);
MoveConstToVariable(m_CompilePC,&g_Reg->m_PROGRAM_COUNTER,"PROGRAM_COUNTER"); MoveConstToVariable(m_CompilePC,&g_Reg->m_PROGRAM_COUNTER,"PROGRAM_COUNTER");
@ -248,12 +248,12 @@ void CX86RecompilerOps::PreCompileOpcode(void)
} }
}*/ }*/
/*if ((m_CompilePC == 0x80263900) && m_PipelineStage == NORMAL) /*if ((m_CompilePC == 0x80263900) && m_PipelineStage == PIPELINE_STAGE_NORMAL)
{ {
X86BreakPoint(__FILEW__,__LINE__); X86BreakPoint(__FILEW__,__LINE__);
}*/ }*/
/*if ((m_CompilePC >= 0x80325D80 && m_CompilePC <= 0x80325DF0) && m_PipelineStage == NORMAL) /*if ((m_CompilePC >= 0x80325D80 && m_CompilePC <= 0x80325DF0) && m_PipelineStage == PIPELINE_STAGE_NORMAL)
{ {
m_RegWorkingSet.WriteBackRegisters(); m_RegWorkingSet.WriteBackRegisters();
UpdateCounters(m_RegWorkingSet,false,true); UpdateCounters(m_RegWorkingSet,false,true);
@ -269,12 +269,12 @@ void CX86RecompilerOps::PreCompileOpcode(void)
#endif #endif
} }
}*/ }*/
/*if ((m_CompilePC == 0x80324E14) && m_PipelineStage == NORMAL) /*if ((m_CompilePC == 0x80324E14) && m_PipelineStage == PIPELINE_STAGE_NORMAL)
{ {
X86BreakPoint(__FILEW__,__LINE__); X86BreakPoint(__FILEW__,__LINE__);
}*/ }*/
/*if (m_CompilePC == 0x80324E18 && m_PipelineStage == NORMAL) /*if (m_CompilePC == 0x80324E18 && m_PipelineStage == PIPELINE_STAGE_NORMAL)
{ {
m_RegWorkingSet.WriteBackRegisters(); m_RegWorkingSet.WriteBackRegisters();
UpdateCounters(m_RegWorkingSet,false,true); UpdateCounters(m_RegWorkingSet,false,true);
@ -290,7 +290,7 @@ void CX86RecompilerOps::PreCompileOpcode(void)
#endif #endif
} }
}*/ }*/
/*if (m_CompilePC >= 0x80324E00 && m_CompilePC <= 0x80324E18 && m_PipelineStage == NORMAL) /*if (m_CompilePC >= 0x80324E00 && m_CompilePC <= 0x80324E18 && m_PipelineStage == PIPELINE_STAGE_NORMAL)
{ {
m_RegWorkingSet.WriteBackRegisters(); m_RegWorkingSet.WriteBackRegisters();
UpdateCounters(m_RegWorkingSet,false,true); UpdateCounters(m_RegWorkingSet,false,true);
@ -306,7 +306,7 @@ void CX86RecompilerOps::PreCompileOpcode(void)
#endif #endif
} }
}*/ }*/
/* if (m_CompilePC == 0x803245CC && m_PipelineStage == NORMAL) /* if (m_CompilePC == 0x803245CC && m_PipelineStage == PIPELINE_STAGE_NORMAL)
{ {
//m_RegWorkingSet.UnMap_AllFPRs(); //m_RegWorkingSet.UnMap_AllFPRs();
g_Notify->BreakPoint(__FILE__, __LINE__); g_Notify->BreakPoint(__FILE__, __LINE__);
@ -314,7 +314,7 @@ void CX86RecompilerOps::PreCompileOpcode(void)
//X86BreakPoint(__FILEW__,__LINE__); //X86BreakPoint(__FILEW__,__LINE__);
//m_RegWorkingSet.UnMap_AllFPRs(); //m_RegWorkingSet.UnMap_AllFPRs();
}*/ }*/
/*if (m_CompilePC >= 0x80179DC4 && m_CompilePC <= 0x80179DF0 && m_PipelineStage == NORMAL) /*if (m_CompilePC >= 0x80179DC4 && m_CompilePC <= 0x80179DF0 && m_PipelineStage == PIPELINE_STAGE_NORMAL)
{ {
m_RegWorkingSet.UnMap_AllFPRs(); m_RegWorkingSet.UnMap_AllFPRs();
}*/ }*/
@ -3221,17 +3221,13 @@ void CX86RecompilerOps::LW_KnownAddress(x86Reg Reg, uint32_t VAddr)
} }
break; break;
case 0x04400000: case 0x04400000:
switch (PAddr)
{
case 0x04400010:
{ {
m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() - g_System->CountPerOp()); m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() - g_System->CountPerOp());
UpdateCounters(m_RegWorkingSet, false, true); UpdateCounters(m_RegWorkingSet, false, true);
m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() + g_System->CountPerOp()); m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() + g_System->CountPerOp());
static uint32_t TempValue = 0;
m_RegWorkingSet.BeforeCallDirect(); m_RegWorkingSet.BeforeCallDirect();
PushImm32("TempValue", (uint32_t)&TempValue); PushImm32("m_TempValue", (uint32_t)&m_TempValue);
PushImm32(PAddr & 0x1FFFFFFF); PushImm32(PAddr & 0x1FFFFFFF);
#ifdef _MSC_VER #ifdef _MSC_VER
MoveConstToX86reg((uint32_t)(MemoryHandler *)&g_MMU->m_VideoInterfaceHandler, x86_ECX); MoveConstToX86reg((uint32_t)(MemoryHandler *)&g_MMU->m_VideoInterfaceHandler, x86_ECX);
@ -3245,14 +3241,6 @@ void CX86RecompilerOps::LW_KnownAddress(x86Reg Reg, uint32_t VAddr)
MoveVariableToX86reg(&m_TempValue, "m_TempValue", Reg); MoveVariableToX86reg(&m_TempValue, "m_TempValue", Reg);
} }
break; break;
default:
MoveConstToX86reg(0, Reg);
if (ShowUnhandledMemory())
{
g_Notify->DisplayError(stdstr_f("%s\nFailed to translate address: %08X", __FUNCTION__, VAddr).c_str());
}
}
break;
case 0x04500000: // AI registers case 0x04500000: // AI registers
switch (PAddr) switch (PAddr)
{ {
@ -10657,6 +10645,28 @@ void CX86RecompilerOps::SW_Const(uint32_t Value, uint32_t VAddr)
} }
break; break;
case 0x04400000: case 0x04400000:
if (GenerateLog() && LogVideoInterface())
{
m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() - g_System->CountPerOp());
UpdateCounters(m_RegWorkingSet, false, true);
m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() + g_System->CountPerOp());
m_RegWorkingSet.BeforeCallDirect();
PushImm32(0xFFFFFFFF);
PushImm32(Value);
PushImm32(PAddr & 0x1FFFFFFF);
#ifdef _MSC_VER
MoveConstToX86reg((uint32_t)(MemoryHandler *)&g_MMU->m_VideoInterfaceHandler, x86_ECX);
Call_Direct((void *)((long**)(MemoryHandler *)&g_MMU->m_VideoInterfaceHandler)[0][1], "VideoInterfaceHandler::Write32");
#else
PushImm32((uint32_t)&g_MMU->m_VideoInterfaceHandler);
Call_Direct(AddressOf(&SPRegistersHandler::Read32), "SPRegistersHandler::Write32");
AddConstToX86Reg(x86_ESP, 16);
#endif
m_RegWorkingSet.AfterCallDirect();
}
else
{
switch (PAddr) switch (PAddr)
{ {
case 0x04400000: case 0x04400000:
@ -10719,6 +10729,7 @@ void CX86RecompilerOps::SW_Const(uint32_t Value, uint32_t VAddr)
g_Notify->DisplayError(stdstr_f("%s\nTrying to store %08X in %08X?", __FUNCTION__, Value, VAddr).c_str()); g_Notify->DisplayError(stdstr_f("%s\nTrying to store %08X in %08X?", __FUNCTION__, Value, VAddr).c_str());
} }
} }
}
break; break;
case 0x04500000: // AI registers case 0x04500000: // AI registers
switch (PAddr) switch (PAddr)
@ -11126,7 +11137,30 @@ void CX86RecompilerOps::SW_Register(x86Reg Reg, uint32_t VAddr)
} }
break; break;
case 0x04400000: case 0x04400000:
switch (PAddr) { if (GenerateLog() && LogVideoInterface())
{
m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() - g_System->CountPerOp());
UpdateCounters(m_RegWorkingSet, false, true);
m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() + g_System->CountPerOp());
m_RegWorkingSet.BeforeCallDirect();
PushImm32(0xFFFFFFFF);
Push(Reg);
PushImm32(PAddr & 0x1FFFFFFF);
#ifdef _MSC_VER
MoveConstToX86reg((uint32_t)(MemoryHandler *)&g_MMU->m_VideoInterfaceHandler, x86_ECX);
Call_Direct((void *)((long**)(MemoryHandler *)&g_MMU->m_VideoInterfaceHandler)[0][1], "VideoInterfaceHandler::Write32");
#else
PushImm32((uint32_t)&g_MMU->m_VideoInterfaceHandler);
Call_Direct(AddressOf(&SPRegistersHandler::Read32), "SPRegistersHandler::Write32");
AddConstToX86Reg(x86_ESP, 16);
#endif
m_RegWorkingSet.AfterCallDirect();
}
else
{
switch (PAddr)
{
case 0x04400000: case 0x04400000:
if (g_Plugins->Gfx()->ViStatusChanged != nullptr) if (g_Plugins->Gfx()->ViStatusChanged != nullptr)
{ {
@ -11167,14 +11201,14 @@ void CX86RecompilerOps::SW_Register(x86Reg Reg, uint32_t VAddr)
case 0x04400010: case 0x04400010:
AndConstToVariable((uint32_t)~MI_INTR_VI, &g_Reg->MI_INTR_REG, "MI_INTR_REG"); AndConstToVariable((uint32_t)~MI_INTR_VI, &g_Reg->MI_INTR_REG, "MI_INTR_REG");
m_RegWorkingSet.BeforeCallDirect(); m_RegWorkingSet.BeforeCallDirect();
#ifdef _MSC_VER #ifdef _MSC_VER
MoveConstToX86reg((uint32_t)g_Reg, x86_ECX); MoveConstToX86reg((uint32_t)g_Reg, x86_ECX);
Call_Direct(AddressOf(&CRegisters::CheckInterrupts), "CRegisters::CheckInterrupts"); Call_Direct(AddressOf(&CRegisters::CheckInterrupts), "CRegisters::CheckInterrupts");
#else #else
PushImm32((uint32_t)g_Reg); PushImm32((uint32_t)g_Reg);
Call_Direct(AddressOf(&CRegisters::CheckInterrupts), "CRegisters::CheckInterrupts"); Call_Direct(AddressOf(&CRegisters::CheckInterrupts), "CRegisters::CheckInterrupts");
AddConstToX86Reg(x86_ESP, 4); AddConstToX86Reg(x86_ESP, 4);
#endif #endif
m_RegWorkingSet.AfterCallDirect(); m_RegWorkingSet.AfterCallDirect();
break; break;
case 0x04400014: MoveX86regToVariable(Reg, &g_Reg->VI_BURST_REG, "VI_BURST_REG"); break; case 0x04400014: MoveX86regToVariable(Reg, &g_Reg->VI_BURST_REG, "VI_BURST_REG"); break;
@ -11193,6 +11227,7 @@ void CX86RecompilerOps::SW_Register(x86Reg Reg, uint32_t VAddr)
g_Notify->DisplayError(stdstr_f("%s\nTrying to store in %08X?", __FUNCTION__, VAddr).c_str()); g_Notify->DisplayError(stdstr_f("%s\nTrying to store in %08X?", __FUNCTION__, VAddr).c_str());
} }
} }
}
break; break;
case 0x04500000: // AI registers case 0x04500000: // AI registers
switch (PAddr) { switch (PAddr) {