diff --git a/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64RecompilerOps.cpp b/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64RecompilerOps.cpp index f7314c5a2..6c46824e5 100644 --- a/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64RecompilerOps.cpp +++ b/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64RecompilerOps.cpp @@ -144,6 +144,11 @@ void CAarch64RecompilerOps::LDR() g_Notify->BreakPoint(__FILE__, __LINE__); } +void CAarch64RecompilerOps::RESERVED31() +{ + g_Notify->BreakPoint(__FILE__, __LINE__); +} + void CAarch64RecompilerOps::LB() { g_Notify->BreakPoint(__FILE__, __LINE__); diff --git a/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64RecompilerOps.h b/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64RecompilerOps.h index b03aca356..572c32b00 100644 --- a/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64RecompilerOps.h +++ b/Source/Project64-core/N64System/Recompiler/Aarch64/Aarch64RecompilerOps.h @@ -50,6 +50,7 @@ public: void DADDIU(); void LDL(); void LDR(); + void RESERVED31(); void LB(); void LH(); void LWL(); diff --git a/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp b/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp index 7c6e1a33e..f07d27ff9 100644 --- a/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp +++ b/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.cpp @@ -145,6 +145,11 @@ void CArmRecompilerOps::LDR() g_Notify->BreakPoint(__FILE__, __LINE__); } +void CArmRecompilerOps::RESERVED31() +{ + g_Notify->BreakPoint(__FILE__, __LINE__); +} + void CArmRecompilerOps::LB() { g_Notify->BreakPoint(__FILE__, __LINE__); diff --git a/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.h b/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.h index 13a5a3d40..46533d757 100644 --- a/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.h +++ b/Source/Project64-core/N64System/Recompiler/Arm/ArmRecompilerOps.h @@ -49,6 +49,7 @@ public: void DADDIU(); void LDL(); void LDR(); + void RESERVED31(); void LB(); void LH(); void LWL(); diff --git a/Source/Project64-core/N64System/Recompiler/CodeBlock.cpp b/Source/Project64-core/N64System/Recompiler/CodeBlock.cpp index 827af486f..638d7ce99 100644 --- a/Source/Project64-core/N64System/Recompiler/CodeBlock.cpp +++ b/Source/Project64-core/N64System/Recompiler/CodeBlock.cpp @@ -772,6 +772,10 @@ bool CCodeBlock::AnalyzeInstruction(uint32_t PC, uint32_t & TargetPC, uint32_t & case R4300i_DADDIU: case R4300i_LDL: case R4300i_LDR: + break; + case R4300i_RESERVED31: + EndBlock = true; + break; case R4300i_LB: case R4300i_LH: case R4300i_LWL: diff --git a/Source/Project64-core/N64System/Recompiler/CodeSection.cpp b/Source/Project64-core/N64System/Recompiler/CodeSection.cpp index f97b8dec6..6a12928fa 100644 --- a/Source/Project64-core/N64System/Recompiler/CodeSection.cpp +++ b/Source/Project64-core/N64System/Recompiler/CodeSection.cpp @@ -646,6 +646,7 @@ bool CCodeSection::GenerateNativeCode(uint32_t Test) case R4300i_DADDIU: m_RecompilerOps->DADDIU(); break; case R4300i_LDL: m_RecompilerOps->LDL(); break; case R4300i_LDR: m_RecompilerOps->LDR(); break; + case R4300i_RESERVED31: m_RecompilerOps->RESERVED31(); break; case R4300i_LB: m_RecompilerOps->LB(); break; case R4300i_LH: m_RecompilerOps->LH(); break; case R4300i_LWL: m_RecompilerOps->LWL(); break; diff --git a/Source/Project64-core/N64System/Recompiler/ExitInfo.h b/Source/Project64-core/N64System/Recompiler/ExitInfo.h index 0b17cdec2..dbeafb788 100644 --- a/Source/Project64-core/N64System/Recompiler/ExitInfo.h +++ b/Source/Project64-core/N64System/Recompiler/ExitInfo.h @@ -19,6 +19,7 @@ enum ExitReason ExitReason_ExceptionOverflow, ExitReason_AddressErrorExceptionRead32, ExitReason_AddressErrorExceptionRead64, + ExitReason_IllegalInstruction, }; struct CExitInfo diff --git a/Source/Project64-core/N64System/Recompiler/x64-86/x64RecompilerOps.cpp b/Source/Project64-core/N64System/Recompiler/x64-86/x64RecompilerOps.cpp index e77345c8d..6013b9750 100644 --- a/Source/Project64-core/N64System/Recompiler/x64-86/x64RecompilerOps.cpp +++ b/Source/Project64-core/N64System/Recompiler/x64-86/x64RecompilerOps.cpp @@ -143,6 +143,11 @@ void CX64RecompilerOps::LDR() g_Notify->BreakPoint(__FILE__, __LINE__); } +void CX64RecompilerOps::RESERVED31() +{ + g_Notify->BreakPoint(__FILE__, __LINE__); +} + void CX64RecompilerOps::LB() { g_Notify->BreakPoint(__FILE__, __LINE__); diff --git a/Source/Project64-core/N64System/Recompiler/x64-86/x64RecompilerOps.h b/Source/Project64-core/N64System/Recompiler/x64-86/x64RecompilerOps.h index bc3821714..bc1758a09 100644 --- a/Source/Project64-core/N64System/Recompiler/x64-86/x64RecompilerOps.h +++ b/Source/Project64-core/N64System/Recompiler/x64-86/x64RecompilerOps.h @@ -50,6 +50,7 @@ public: void DADDIU(); void LDL(); void LDR(); + void RESERVED31(); void LB(); void LH(); void LWL(); diff --git a/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp b/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp index b75b841a1..3077e5097 100644 --- a/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp +++ b/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.cpp @@ -3036,6 +3036,13 @@ void CX86RecompilerOps::LH_KnownAddress(CX86Ops::x86Reg Reg, uint32_t VAddr, boo } } +void CX86RecompilerOps::RESERVED31() +{ + m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() + g_System->CountPerOp()); + CompileExit(m_CompilePC, m_CompilePC, m_RegWorkingSet, ExitReason_IllegalInstruction, true, nullptr); + m_PipelineStage = PIPELINE_STAGE_END_BLOCK; +} + void CX86RecompilerOps::LB() { if (m_Opcode.rt == 0) @@ -4499,7 +4506,7 @@ void CX86RecompilerOps::SPECIAL_JALR() void CX86RecompilerOps::SPECIAL_SYSCALL() { m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() + g_System->CountPerOp()); - CompileExit(m_CompilePC, (uint32_t)-1, m_RegWorkingSet, ExitReason_DoSysCall, true, nullptr); + CompileExit(m_CompilePC, m_CompilePC, m_RegWorkingSet, ExitReason_DoSysCall, true, nullptr); m_PipelineStage = PIPELINE_STAGE_END_BLOCK; } @@ -9636,6 +9643,11 @@ void CX86RecompilerOps::CompileExit(uint32_t JumpPC, uint32_t TargetPC, CRegInfo m_Assembler.CallThis((uint32_t)g_Reg, AddressOf(&CRegisters::DoAddressError), "CRegisters::DoAddressError", 12); ExitCodeBlock(); break; + case ExitReason_IllegalInstruction: + m_Assembler.PushImm32(InDelaySlot ? "true" : "false", InDelaySlot); + m_Assembler.CallThis((uint32_t)g_Reg, AddressOf(&CRegisters::DoIllegalInstructionException), "CRegisters::DoIllegalInstructionException", 8); + ExitCodeBlock(); + break; default: WriteTrace(TraceRecompiler, TraceError, "How did you want to exit on reason (%d) ???", reason); g_Notify->BreakPoint(__FILE__, __LINE__); diff --git a/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.h b/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.h index 54c294c8b..39ded28b8 100644 --- a/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.h +++ b/Source/Project64-core/N64System/Recompiler/x86/x86RecompilerOps.h @@ -57,6 +57,7 @@ public: void DADDIU(); void LDL(); void LDR(); + void RESERVED31(); void LB(); void LH(); void LWL();