Core: Handle reserve instruction 31
This commit is contained in:
parent
a79a8a9276
commit
05d46c9487
|
@ -141,7 +141,7 @@ R4300iOp::Func * R4300iOp::BuildInterpreter()
|
||||||
Jump_Opcode[28] = UnknownOpcode;
|
Jump_Opcode[28] = UnknownOpcode;
|
||||||
Jump_Opcode[29] = UnknownOpcode;
|
Jump_Opcode[29] = UnknownOpcode;
|
||||||
Jump_Opcode[30] = UnknownOpcode;
|
Jump_Opcode[30] = UnknownOpcode;
|
||||||
Jump_Opcode[31] = UnknownOpcode;
|
Jump_Opcode[31] = ReservedInstruction;
|
||||||
Jump_Opcode[32] = LB;
|
Jump_Opcode[32] = LB;
|
||||||
Jump_Opcode[33] = LH;
|
Jump_Opcode[33] = LH;
|
||||||
Jump_Opcode[34] = LWL;
|
Jump_Opcode[34] = LWL;
|
||||||
|
@ -2697,6 +2697,12 @@ void R4300iOp::COP1_L_CVT_D()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Other functions
|
// Other functions
|
||||||
|
void R4300iOp::ReservedInstruction()
|
||||||
|
{
|
||||||
|
g_Reg->DoIllegalInstructionException(g_System->m_PipelineStage == PIPELINE_STAGE_JUMP);
|
||||||
|
g_System->m_PipelineStage = PIPELINE_STAGE_JUMP;
|
||||||
|
g_System->m_JumpToLocation = (*_PROGRAM_COUNTER);
|
||||||
|
}
|
||||||
|
|
||||||
void R4300iOp::UnknownOpcode()
|
void R4300iOp::UnknownOpcode()
|
||||||
{
|
{
|
||||||
|
|
|
@ -207,6 +207,7 @@ public:
|
||||||
static void COP1_L_CVT_D();
|
static void COP1_L_CVT_D();
|
||||||
|
|
||||||
// Other functions
|
// Other functions
|
||||||
|
static void ReservedInstruction();
|
||||||
static void UnknownOpcode();
|
static void UnknownOpcode();
|
||||||
|
|
||||||
static Func* BuildInterpreter();
|
static Func* BuildInterpreter();
|
||||||
|
|
|
@ -50,7 +50,7 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
||||||
Jump_Opcode[28] = R4300iOp::UnknownOpcode;
|
Jump_Opcode[28] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Opcode[29] = R4300iOp::UnknownOpcode;
|
Jump_Opcode[29] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Opcode[30] = R4300iOp::UnknownOpcode;
|
Jump_Opcode[30] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Opcode[31] = R4300iOp::UnknownOpcode;
|
Jump_Opcode[31] = R4300iOp::ReservedInstruction;
|
||||||
Jump_Opcode[32] = LB;
|
Jump_Opcode[32] = LB;
|
||||||
Jump_Opcode[33] = LH;
|
Jump_Opcode[33] = LH;
|
||||||
Jump_Opcode[34] = LWL;
|
Jump_Opcode[34] = LWL;
|
||||||
|
|
|
@ -527,6 +527,10 @@ void R4300iInstruction::DecodeName(void)
|
||||||
strcpy(m_Name, "LDR");
|
strcpy(m_Name, "LDR");
|
||||||
sprintf(m_Param, "%s, 0x%04X (%s)", CRegName::GPR[m_Instruction.rt], m_Instruction.offset, CRegName::GPR[m_Instruction.base]);
|
sprintf(m_Param, "%s, 0x%04X (%s)", CRegName::GPR[m_Instruction.rt], m_Instruction.offset, CRegName::GPR[m_Instruction.base]);
|
||||||
break;
|
break;
|
||||||
|
case R4300i_RESERVED31:
|
||||||
|
strcpy(m_Name, "Reserved(31)");
|
||||||
|
sprintf(m_Param, "");
|
||||||
|
break;
|
||||||
case R4300i_LB:
|
case R4300i_LB:
|
||||||
strcpy(m_Name, "LB");
|
strcpy(m_Name, "LB");
|
||||||
sprintf(m_Param, "%s, 0x%04X (%s)", CRegName::GPR[m_Instruction.rt], m_Instruction.offset, CRegName::GPR[m_Instruction.base]);
|
sprintf(m_Param, "%s, 0x%04X (%s)", CRegName::GPR[m_Instruction.rt], m_Instruction.offset, CRegName::GPR[m_Instruction.base]);
|
||||||
|
|
|
@ -87,6 +87,7 @@ enum R4300iOpCodes
|
||||||
R4300i_DADDIU = 25,
|
R4300i_DADDIU = 25,
|
||||||
R4300i_LDL = 26,
|
R4300i_LDL = 26,
|
||||||
R4300i_LDR = 27,
|
R4300i_LDR = 27,
|
||||||
|
R4300i_RESERVED31 = 31,
|
||||||
R4300i_LB = 32,
|
R4300i_LB = 32,
|
||||||
R4300i_LH = 33,
|
R4300i_LH = 33,
|
||||||
R4300i_LWL = 34,
|
R4300i_LWL = 34,
|
||||||
|
|
|
@ -546,6 +546,22 @@ bool CRegisters::DoIntrException(bool DelaySlot)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CRegisters::DoIllegalInstructionException(bool DelaySlot)
|
||||||
|
{
|
||||||
|
CAUSE_REGISTER = EXC_II;
|
||||||
|
if (DelaySlot)
|
||||||
|
{
|
||||||
|
CAUSE_REGISTER |= CAUSE_BD;
|
||||||
|
EPC_REGISTER = m_PROGRAM_COUNTER - 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EPC_REGISTER = m_PROGRAM_COUNTER;
|
||||||
|
}
|
||||||
|
m_PROGRAM_COUNTER = 0x80000180;
|
||||||
|
STATUS_REGISTER |= STATUS_EXL;
|
||||||
|
}
|
||||||
|
|
||||||
void CRegisters::DoOverflowException(bool DelaySlot)
|
void CRegisters::DoOverflowException(bool DelaySlot)
|
||||||
{
|
{
|
||||||
CAUSE_REGISTER = EXC_OV;
|
CAUSE_REGISTER = EXC_OV;
|
||||||
|
|
|
@ -269,6 +269,7 @@ public:
|
||||||
void DoTrapException( bool DelaySlot );
|
void DoTrapException( bool DelaySlot );
|
||||||
void DoCopUnusableException( bool DelaySlot, int32_t Coprocessor );
|
void DoCopUnusableException( bool DelaySlot, int32_t Coprocessor );
|
||||||
bool DoIntrException( bool DelaySlot );
|
bool DoIntrException( bool DelaySlot );
|
||||||
|
void DoIllegalInstructionException(bool DelaySlot);
|
||||||
void DoOverflowException(bool DelaySlot);
|
void DoOverflowException(bool DelaySlot);
|
||||||
void DoTLBReadMiss(bool DelaySlot, uint32_t BadVaddr);
|
void DoTLBReadMiss(bool DelaySlot, uint32_t BadVaddr);
|
||||||
void DoTLBWriteMiss(bool DelaySlot, uint32_t BadVaddr);
|
void DoTLBWriteMiss(bool DelaySlot, uint32_t BadVaddr);
|
||||||
|
|
Loading…
Reference in New Issue