commit
eaf7e9bfad
|
@ -250,13 +250,13 @@ R4300iOp::Func * R4300iOp::BuildInterpreter()
|
||||||
Jump_Special[45] = SPECIAL_DADDU;
|
Jump_Special[45] = SPECIAL_DADDU;
|
||||||
Jump_Special[46] = SPECIAL_DSUB;
|
Jump_Special[46] = SPECIAL_DSUB;
|
||||||
Jump_Special[47] = SPECIAL_DSUBU;
|
Jump_Special[47] = SPECIAL_DSUBU;
|
||||||
Jump_Special[48] = UnknownOpcode;
|
Jump_Special[48] = SPECIAL_TGE;
|
||||||
Jump_Special[49] = UnknownOpcode;
|
Jump_Special[49] = SPECIAL_TGEU;
|
||||||
Jump_Special[50] = UnknownOpcode;
|
Jump_Special[50] = SPECIAL_TLT;
|
||||||
Jump_Special[51] = UnknownOpcode;
|
Jump_Special[51] = SPECIAL_TLTU;
|
||||||
Jump_Special[52] = SPECIAL_TEQ;
|
Jump_Special[52] = SPECIAL_TEQ;
|
||||||
Jump_Special[53] = UnknownOpcode;
|
Jump_Special[53] = UnknownOpcode;
|
||||||
Jump_Special[54] = UnknownOpcode;
|
Jump_Special[54] = SPECIAL_TNE;
|
||||||
Jump_Special[55] = UnknownOpcode;
|
Jump_Special[55] = UnknownOpcode;
|
||||||
Jump_Special[56] = SPECIAL_DSLL;
|
Jump_Special[56] = SPECIAL_DSLL;
|
||||||
Jump_Special[57] = UnknownOpcode;
|
Jump_Special[57] = UnknownOpcode;
|
||||||
|
@ -275,13 +275,13 @@ R4300iOp::Func * R4300iOp::BuildInterpreter()
|
||||||
Jump_Regimm[5] = UnknownOpcode;
|
Jump_Regimm[5] = UnknownOpcode;
|
||||||
Jump_Regimm[6] = UnknownOpcode;
|
Jump_Regimm[6] = UnknownOpcode;
|
||||||
Jump_Regimm[7] = UnknownOpcode;
|
Jump_Regimm[7] = UnknownOpcode;
|
||||||
Jump_Regimm[8] = UnknownOpcode;
|
Jump_Regimm[8] = REGIMM_TGEI;
|
||||||
Jump_Regimm[9] = UnknownOpcode;
|
Jump_Regimm[9] = REGIMM_TGEIU;
|
||||||
Jump_Regimm[10] = UnknownOpcode;
|
Jump_Regimm[10] = REGIMM_TLTI;
|
||||||
Jump_Regimm[11] = UnknownOpcode;
|
Jump_Regimm[11] = REGIMM_TLTIU;
|
||||||
Jump_Regimm[12] = UnknownOpcode;
|
Jump_Regimm[12] = REGIMM_TEQI;
|
||||||
Jump_Regimm[13] = UnknownOpcode;
|
Jump_Regimm[13] = UnknownOpcode;
|
||||||
Jump_Regimm[14] = UnknownOpcode;
|
Jump_Regimm[14] = REGIMM_TNEI;
|
||||||
Jump_Regimm[15] = UnknownOpcode;
|
Jump_Regimm[15] = UnknownOpcode;
|
||||||
Jump_Regimm[16] = REGIMM_BLTZAL;
|
Jump_Regimm[16] = REGIMM_BLTZAL;
|
||||||
Jump_Regimm[17] = REGIMM_BGEZAL;
|
Jump_Regimm[17] = REGIMM_BGEZAL;
|
||||||
|
@ -2048,9 +2048,49 @@ void R4300iOp::SPECIAL_DSUBU()
|
||||||
|
|
||||||
void R4300iOp::SPECIAL_TEQ()
|
void R4300iOp::SPECIAL_TEQ()
|
||||||
{
|
{
|
||||||
if (_GPR[m_Opcode.rs].DW == _GPR[m_Opcode.rt].DW && HaveDebugger())
|
if (_GPR[m_Opcode.rs].DW == _GPR[m_Opcode.rt].DW)
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError("Should trap this ???");
|
g_Reg->DoTrapException(m_NextInstruction == JUMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void R4300iOp::SPECIAL_TGE()
|
||||||
|
{
|
||||||
|
if (_GPR[m_Opcode.rs].DW >= _GPR[m_Opcode.rt].DW)
|
||||||
|
{
|
||||||
|
g_Reg->DoTrapException(m_NextInstruction == JUMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void R4300iOp::SPECIAL_TGEU()
|
||||||
|
{
|
||||||
|
if (_GPR[m_Opcode.rs].DW >= _GPR[m_Opcode.rt].D)
|
||||||
|
{
|
||||||
|
g_Reg->DoTrapException(m_NextInstruction == JUMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void R4300iOp::SPECIAL_TLT()
|
||||||
|
{
|
||||||
|
if (_GPR[m_Opcode.rs].DW < _GPR[m_Opcode.rt].DW)
|
||||||
|
{
|
||||||
|
g_Reg->DoTrapException(m_NextInstruction == JUMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void R4300iOp::SPECIAL_TLTU()
|
||||||
|
{
|
||||||
|
if (_GPR[m_Opcode.rs].DW < _GPR[m_Opcode.rt].DW)
|
||||||
|
{
|
||||||
|
g_Reg->DoTrapException(m_NextInstruction == JUMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void R4300iOp::SPECIAL_TNE()
|
||||||
|
{
|
||||||
|
if (_GPR[m_Opcode.rs].DW != _GPR[m_Opcode.rt].DW)
|
||||||
|
{
|
||||||
|
g_Reg->DoTrapException(m_NextInstruction == JUMP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2220,6 +2260,55 @@ void R4300iOp::REGIMM_BGEZAL()
|
||||||
}
|
}
|
||||||
_GPR[31].DW = (int32_t)((*_PROGRAM_COUNTER) + 8);
|
_GPR[31].DW = (int32_t)((*_PROGRAM_COUNTER) + 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void R4300iOp::REGIMM_TEQI()
|
||||||
|
{
|
||||||
|
if (_GPR[m_Opcode.rs].DW == m_Opcode.immediate)
|
||||||
|
{
|
||||||
|
g_Reg->DoTrapException(m_NextInstruction == JUMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void R4300iOp::REGIMM_TGEI()
|
||||||
|
{
|
||||||
|
if (_GPR[m_Opcode.rs].DW >= m_Opcode.immediate)
|
||||||
|
{
|
||||||
|
g_Reg->DoTrapException(m_NextInstruction == JUMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void R4300iOp::REGIMM_TGEIU()
|
||||||
|
{
|
||||||
|
if (_GPR[m_Opcode.rs].DW >= m_Opcode.immediate)
|
||||||
|
{
|
||||||
|
g_Reg->DoTrapException(m_NextInstruction == JUMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void R4300iOp::REGIMM_TLTI()
|
||||||
|
{
|
||||||
|
if (_GPR[m_Opcode.rs].DW < m_Opcode.immediate)
|
||||||
|
{
|
||||||
|
g_Reg->DoTrapException(m_NextInstruction == JUMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void R4300iOp::REGIMM_TLTIU()
|
||||||
|
{
|
||||||
|
if (_GPR[m_Opcode.rs].DW < m_Opcode.immediate)
|
||||||
|
{
|
||||||
|
g_Reg->DoTrapException(m_NextInstruction == JUMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void R4300iOp::REGIMM_TNEI()
|
||||||
|
{
|
||||||
|
if (_GPR[m_Opcode.rs].DW != m_Opcode.immediate)
|
||||||
|
{
|
||||||
|
g_Reg->DoTrapException(m_NextInstruction == JUMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/************************** COP0 functions **************************/
|
/************************** COP0 functions **************************/
|
||||||
void R4300iOp::COP0_MF()
|
void R4300iOp::COP0_MF()
|
||||||
{
|
{
|
||||||
|
|
|
@ -110,7 +110,12 @@ public:
|
||||||
static void SPECIAL_DADDU();
|
static void SPECIAL_DADDU();
|
||||||
static void SPECIAL_DSUB();
|
static void SPECIAL_DSUB();
|
||||||
static void SPECIAL_DSUBU();
|
static void SPECIAL_DSUBU();
|
||||||
|
static void SPECIAL_TGE();
|
||||||
|
static void SPECIAL_TGEU();
|
||||||
|
static void SPECIAL_TLT();
|
||||||
|
static void SPECIAL_TLTU();
|
||||||
static void SPECIAL_TEQ();
|
static void SPECIAL_TEQ();
|
||||||
|
static void SPECIAL_TNE();
|
||||||
static void SPECIAL_DSLL();
|
static void SPECIAL_DSLL();
|
||||||
static void SPECIAL_DSRL();
|
static void SPECIAL_DSRL();
|
||||||
static void SPECIAL_DSRA();
|
static void SPECIAL_DSRA();
|
||||||
|
@ -125,6 +130,12 @@ public:
|
||||||
static void REGIMM_BGEZL();
|
static void REGIMM_BGEZL();
|
||||||
static void REGIMM_BLTZAL();
|
static void REGIMM_BLTZAL();
|
||||||
static void REGIMM_BGEZAL();
|
static void REGIMM_BGEZAL();
|
||||||
|
static void REGIMM_TEQI();
|
||||||
|
static void REGIMM_TGEI();
|
||||||
|
static void REGIMM_TGEIU();
|
||||||
|
static void REGIMM_TLTI();
|
||||||
|
static void REGIMM_TLTIU();
|
||||||
|
static void REGIMM_TNEI();
|
||||||
|
|
||||||
/************************** COP0 functions **************************/
|
/************************** COP0 functions **************************/
|
||||||
static void COP0_MF();
|
static void COP0_MF();
|
||||||
|
|
|
@ -155,13 +155,13 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
||||||
Jump_Special[45] = R4300iOp::SPECIAL_DADDU;
|
Jump_Special[45] = R4300iOp::SPECIAL_DADDU;
|
||||||
Jump_Special[46] = R4300iOp::SPECIAL_DSUB;
|
Jump_Special[46] = R4300iOp::SPECIAL_DSUB;
|
||||||
Jump_Special[47] = R4300iOp::SPECIAL_DSUBU;
|
Jump_Special[47] = R4300iOp::SPECIAL_DSUBU;
|
||||||
Jump_Special[48] = R4300iOp::UnknownOpcode;
|
Jump_Special[48] = R4300iOp::SPECIAL_TGE;
|
||||||
Jump_Special[49] = R4300iOp::UnknownOpcode;
|
Jump_Special[49] = R4300iOp::SPECIAL_TGEU;
|
||||||
Jump_Special[50] = R4300iOp::UnknownOpcode;
|
Jump_Special[50] = R4300iOp::SPECIAL_TLT;
|
||||||
Jump_Special[51] = R4300iOp::UnknownOpcode;
|
Jump_Special[51] = R4300iOp::SPECIAL_TLTU;
|
||||||
Jump_Special[52] = R4300iOp::SPECIAL_TEQ;
|
Jump_Special[52] = R4300iOp::SPECIAL_TEQ;
|
||||||
Jump_Special[53] = R4300iOp::UnknownOpcode;
|
Jump_Special[53] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Special[54] = R4300iOp::UnknownOpcode;
|
Jump_Special[54] = R4300iOp::SPECIAL_TNE;
|
||||||
Jump_Special[55] = R4300iOp::UnknownOpcode;
|
Jump_Special[55] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Special[56] = R4300iOp::SPECIAL_DSLL;
|
Jump_Special[56] = R4300iOp::SPECIAL_DSLL;
|
||||||
Jump_Special[57] = R4300iOp::UnknownOpcode;
|
Jump_Special[57] = R4300iOp::UnknownOpcode;
|
||||||
|
@ -180,13 +180,13 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
||||||
Jump_Regimm[5] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[5] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Regimm[6] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[6] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Regimm[7] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[7] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Regimm[8] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[8] = R4300iOp::REGIMM_TGEI;
|
||||||
Jump_Regimm[9] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[9] = R4300iOp::REGIMM_TGEIU;
|
||||||
Jump_Regimm[10] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[10] = R4300iOp::REGIMM_TLTI;
|
||||||
Jump_Regimm[11] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[11] = R4300iOp::REGIMM_TLTIU;
|
||||||
Jump_Regimm[12] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[12] = R4300iOp::REGIMM_TEQI;
|
||||||
Jump_Regimm[13] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[13] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Regimm[14] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[14] = R4300iOp::REGIMM_TNEI;
|
||||||
Jump_Regimm[15] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[15] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Regimm[16] = REGIMM_BLTZAL;
|
Jump_Regimm[16] = REGIMM_BLTZAL;
|
||||||
Jump_Regimm[17] = REGIMM_BGEZAL;
|
Jump_Regimm[17] = REGIMM_BGEZAL;
|
||||||
|
|
|
@ -438,6 +438,22 @@ void CRegisters::DoBreakException(bool DelaySlot)
|
||||||
m_PROGRAM_COUNTER = 0x80000180;
|
m_PROGRAM_COUNTER = 0x80000180;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CRegisters::DoTrapException(bool DelaySlot)
|
||||||
|
{
|
||||||
|
CAUSE_REGISTER = EXC_TRAP;
|
||||||
|
if (DelaySlot)
|
||||||
|
{
|
||||||
|
EPC_REGISTER = m_PROGRAM_COUNTER - 4;
|
||||||
|
CAUSE_REGISTER |= CAUSE_BD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EPC_REGISTER = m_PROGRAM_COUNTER;
|
||||||
|
}
|
||||||
|
m_PROGRAM_COUNTER = 0x80000180;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void CRegisters::DoCopUnusableException(bool DelaySlot, int Coprocessor)
|
void CRegisters::DoCopUnusableException(bool DelaySlot, int Coprocessor)
|
||||||
{
|
{
|
||||||
if (HaveDebugger())
|
if (HaveDebugger())
|
||||||
|
|
|
@ -631,6 +631,7 @@ public:
|
||||||
void CheckInterrupts ();
|
void CheckInterrupts ();
|
||||||
void DoAddressError ( bool DelaySlot, uint32_t BadVaddr, bool FromRead );
|
void DoAddressError ( bool DelaySlot, uint32_t BadVaddr, bool FromRead );
|
||||||
void DoBreakException ( bool DelaySlot );
|
void DoBreakException ( 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 DoTLBReadMiss ( bool DelaySlot, uint32_t BadVaddr );
|
void DoTLBReadMiss ( bool DelaySlot, uint32_t BadVaddr );
|
||||||
|
|
Loading…
Reference in New Issue