Skip to content

Commit

Permalink
add remaining trap instructions, properly implement traps for the int…
Browse files Browse the repository at this point in the history
…erpreter core
  • Loading branch information
krimtonz committed Dec 16, 2019
1 parent b78a8d1 commit b9be612
Show file tree
Hide file tree
Showing 5 changed files with 164 additions and 23 deletions.
137 changes: 125 additions & 12 deletions Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp
Expand Up @@ -250,13 +250,13 @@ R4300iOp::Func * R4300iOp::BuildInterpreter()
Jump_Special[45] = SPECIAL_DADDU;
Jump_Special[46] = SPECIAL_DSUB;
Jump_Special[47] = SPECIAL_DSUBU;
Jump_Special[48] = UnknownOpcode;
Jump_Special[49] = UnknownOpcode;
Jump_Special[50] = UnknownOpcode;
Jump_Special[51] = UnknownOpcode;
Jump_Special[48] = SPECIAL_TGE;
Jump_Special[49] = SPECIAL_TGEU;
Jump_Special[50] = SPECIAL_TLT;
Jump_Special[51] = SPECIAL_TLTU;
Jump_Special[52] = SPECIAL_TEQ;
Jump_Special[53] = UnknownOpcode;
Jump_Special[54] = UnknownOpcode;
Jump_Special[54] = SPECIAL_TNE;
Jump_Special[55] = UnknownOpcode;
Jump_Special[56] = SPECIAL_DSLL;
Jump_Special[57] = UnknownOpcode;
Expand All @@ -275,13 +275,13 @@ R4300iOp::Func * R4300iOp::BuildInterpreter()
Jump_Regimm[5] = UnknownOpcode;
Jump_Regimm[6] = UnknownOpcode;
Jump_Regimm[7] = UnknownOpcode;
Jump_Regimm[8] = UnknownOpcode;
Jump_Regimm[9] = UnknownOpcode;
Jump_Regimm[10] = UnknownOpcode;
Jump_Regimm[11] = UnknownOpcode;
Jump_Regimm[12] = UnknownOpcode;
Jump_Regimm[8] = REGIMM_TGEI;
Jump_Regimm[9] = REGIMM_TGEIU;
Jump_Regimm[10] = REGIMM_TLTI;
Jump_Regimm[11] = REGIMM_TLTIU;
Jump_Regimm[12] = REGIMM_TEQI;
Jump_Regimm[13] = UnknownOpcode;
Jump_Regimm[14] = UnknownOpcode;
Jump_Regimm[14] = REGIMM_TNEI;
Jump_Regimm[15] = UnknownOpcode;
Jump_Regimm[16] = REGIMM_BLTZAL;
Jump_Regimm[17] = REGIMM_BGEZAL;
Expand Down Expand Up @@ -2050,7 +2050,59 @@ void R4300iOp::SPECIAL_TEQ()
{
if (_GPR[m_Opcode.rs].DW == _GPR[m_Opcode.rt].DW && HaveDebugger())
{
g_Notify->DisplayError("Should trap this ???");
g_Reg->DoTrapException(m_NextInstruction == JUMP);
m_NextInstruction = JUMP;
m_JumpToLocation = (*_PROGRAM_COUNTER);
}
}

void R4300iOp::SPECIAL_TGE()
{
if (_GPR[m_Opcode.rs].DW >= _GPR[m_Opcode.rt].DW && HaveDebugger())
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
m_NextInstruction = JUMP;
m_JumpToLocation = (*_PROGRAM_COUNTER);
}
}

void R4300iOp::SPECIAL_TGEU()
{
if (_GPR[m_Opcode.rs].DW >= _GPR[m_Opcode.rt].DW && HaveDebugger())
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
m_NextInstruction = JUMP;
m_JumpToLocation = (*_PROGRAM_COUNTER);
}
}

void R4300iOp::SPECIAL_TLT()
{
if (_GPR[m_Opcode.rs].DW < _GPR[m_Opcode.rt].DW && HaveDebugger())
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
m_NextInstruction = JUMP;
m_JumpToLocation = (*_PROGRAM_COUNTER);
}
}

void R4300iOp::SPECIAL_TLTU()
{
if (_GPR[m_Opcode.rs].DW < _GPR[m_Opcode.rt].DW && HaveDebugger())
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
m_NextInstruction = JUMP;
m_JumpToLocation = (*_PROGRAM_COUNTER);
}
}

void R4300iOp::SPECIAL_TNE()
{
if (_GPR[m_Opcode.rs].DW != _GPR[m_Opcode.rt].DW && HaveDebugger())
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
m_NextInstruction = JUMP;
m_JumpToLocation = (*_PROGRAM_COUNTER);
}
}

Expand Down Expand Up @@ -2220,6 +2272,67 @@ void R4300iOp::REGIMM_BGEZAL()
}
_GPR[31].DW = (int32_t)((*_PROGRAM_COUNTER) + 8);
}

void R4300iOp::REGIMM_TEQI()
{
if (_GPR[m_Opcode.rs].DW == m_Opcode.immediate && HaveDebugger())
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
m_NextInstruction = JUMP;
m_JumpToLocation = (*_PROGRAM_COUNTER);
}
}

void R4300iOp::REGIMM_TGEI()
{
if (_GPR[m_Opcode.rs].DW >= m_Opcode.immediate && HaveDebugger())
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
m_NextInstruction = JUMP;
m_JumpToLocation = (*_PROGRAM_COUNTER);
}
}

void R4300iOp::REGIMM_TGEIU()
{
if (_GPR[m_Opcode.rs].DW >= m_Opcode.immediate && HaveDebugger())
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
m_NextInstruction = JUMP;
m_JumpToLocation = (*_PROGRAM_COUNTER);
}
}

void R4300iOp::REGIMM_TLTI()
{
if (_GPR[m_Opcode.rs].DW < m_Opcode.immediate && HaveDebugger())
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
m_NextInstruction = JUMP;
m_JumpToLocation = (*_PROGRAM_COUNTER);
}
}

void R4300iOp::REGIMM_TLTIU()
{
if (_GPR[m_Opcode.rs].DW < m_Opcode.immediate && HaveDebugger())
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
m_NextInstruction = JUMP;
m_JumpToLocation = (*_PROGRAM_COUNTER);
}
}

void R4300iOp::REGIMM_TNEI()
{
if (_GPR[m_Opcode.rs].DW != m_Opcode.immediate && HaveDebugger())
{
g_Reg->DoTrapException(m_NextInstruction == JUMP);
m_NextInstruction = JUMP;
m_JumpToLocation = (*_PROGRAM_COUNTER);
}
}

/************************** COP0 functions **************************/
void R4300iOp::COP0_MF()
{
Expand Down
11 changes: 11 additions & 0 deletions Source/Project64-core/N64System/Interpreter/InterpreterOps.h
Expand Up @@ -110,7 +110,12 @@ class R4300iOp :
static void SPECIAL_DADDU();
static void SPECIAL_DSUB();
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_TNE();
static void SPECIAL_DSLL();
static void SPECIAL_DSRL();
static void SPECIAL_DSRA();
Expand All @@ -125,6 +130,12 @@ class R4300iOp :
static void REGIMM_BGEZL();
static void REGIMM_BLTZAL();
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 **************************/
static void COP0_MF();
Expand Down
22 changes: 11 additions & 11 deletions Source/Project64-core/N64System/Interpreter/InterpreterOps32.cpp
Expand Up @@ -155,13 +155,13 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_Special[45] = R4300iOp::SPECIAL_DADDU;
Jump_Special[46] = R4300iOp::SPECIAL_DSUB;
Jump_Special[47] = R4300iOp::SPECIAL_DSUBU;
Jump_Special[48] = R4300iOp::UnknownOpcode;
Jump_Special[49] = R4300iOp::UnknownOpcode;
Jump_Special[50] = R4300iOp::UnknownOpcode;
Jump_Special[51] = R4300iOp::UnknownOpcode;
Jump_Special[48] = R4300iOp::SPECIAL_TGE;
Jump_Special[49] = R4300iOp::SPECIAL_TGEU;
Jump_Special[50] = R4300iOp::SPECIAL_TLT;
Jump_Special[51] = R4300iOp::SPECIAL_TLTU;
Jump_Special[52] = R4300iOp::SPECIAL_TEQ;
Jump_Special[53] = R4300iOp::UnknownOpcode;
Jump_Special[54] = R4300iOp::UnknownOpcode;
Jump_Special[54] = R4300iOp::SPECIAL_TNE;
Jump_Special[55] = R4300iOp::UnknownOpcode;
Jump_Special[56] = R4300iOp::SPECIAL_DSLL;
Jump_Special[57] = R4300iOp::UnknownOpcode;
Expand All @@ -180,13 +180,13 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_Regimm[5] = R4300iOp::UnknownOpcode;
Jump_Regimm[6] = R4300iOp::UnknownOpcode;
Jump_Regimm[7] = R4300iOp::UnknownOpcode;
Jump_Regimm[8] = R4300iOp::UnknownOpcode;
Jump_Regimm[9] = R4300iOp::UnknownOpcode;
Jump_Regimm[10] = R4300iOp::UnknownOpcode;
Jump_Regimm[11] = R4300iOp::UnknownOpcode;
Jump_Regimm[12] = R4300iOp::UnknownOpcode;
Jump_Regimm[8] = R4300iOp::REGIMM_TGEI;
Jump_Regimm[9] = R4300iOp::REGIMM_TGEIU;
Jump_Regimm[10] = R4300iOp::REGIMM_TLTI;
Jump_Regimm[11] = R4300iOp::REGIMM_TLTIU;
Jump_Regimm[12] = R4300iOp::REGIMM_TEQI;
Jump_Regimm[13] = R4300iOp::UnknownOpcode;
Jump_Regimm[14] = R4300iOp::UnknownOpcode;
Jump_Regimm[14] = R4300iOp::REGIMM_TNEI;
Jump_Regimm[15] = R4300iOp::UnknownOpcode;
Jump_Regimm[16] = REGIMM_BLTZAL;
Jump_Regimm[17] = REGIMM_BGEZAL;
Expand Down
16 changes: 16 additions & 0 deletions Source/Project64-core/N64System/Mips/RegisterClass.cpp
Expand Up @@ -438,6 +438,22 @@ void CRegisters::DoBreakException(bool DelaySlot)
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)
{
if (HaveDebugger())
Expand Down
1 change: 1 addition & 0 deletions Source/Project64-core/N64System/Mips/RegisterClass.h
Expand Up @@ -631,6 +631,7 @@ class CRegisters :
void CheckInterrupts ();
void DoAddressError ( bool DelaySlot, uint32_t BadVaddr, bool FromRead );
void DoBreakException ( bool DelaySlot );
void DoTrapException ( bool DelaySlot );
void DoCopUnusableException ( bool DelaySlot, int32_t Coprocessor );
bool DoIntrException ( bool DelaySlot );
void DoTLBReadMiss ( bool DelaySlot, uint32_t BadVaddr );
Expand Down

0 comments on commit b9be612

Please sign in to comment.