Rsp: Change RSPOpC to be a class member
This commit is contained in:
parent
762d1b1566
commit
9f98f4d4cd
|
@ -41,7 +41,8 @@ p_Recompfunc RSP_Recomp_Lc2[32];
|
||||||
p_Recompfunc RSP_Recomp_Sc2[32];
|
p_Recompfunc RSP_Recomp_Sc2[32];
|
||||||
|
|
||||||
CRSPRecompiler::CRSPRecompiler(CRSPSystem & System) :
|
CRSPRecompiler::CRSPRecompiler(CRSPSystem & System) :
|
||||||
m_System(System)
|
m_System(System),
|
||||||
|
m_OpCode(System.m_OpCode)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -871,7 +872,7 @@ void CRSPRecompiler::CompilerRSPBlock(void)
|
||||||
CPU_Message("X86 Address: %08X", RecompPos);
|
CPU_Message("X86 Address: %08X", RecompPos);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
RSP_LW_IMEM(CompilePC, &RSPOpC.Value);
|
RSP_LW_IMEM(CompilePC, &m_OpCode.Value);
|
||||||
|
|
||||||
if (LogRDP && NextInstruction != RSPPIPELINE_DELAY_SLOT_DONE)
|
if (LogRDP && NextInstruction != RSPPIPELINE_DELAY_SLOT_DONE)
|
||||||
{
|
{
|
||||||
|
@ -882,14 +883,14 @@ void CRSPRecompiler::CompilerRSPBlock(void)
|
||||||
AddConstToX86Reg(x86_ESP, 4);
|
AddConstToX86Reg(x86_ESP, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RSPOpC.Value == 0xFFFFFFFF)
|
if (m_OpCode.Value == 0xFFFFFFFF)
|
||||||
{
|
{
|
||||||
// I think this pops up an unknown OP dialog
|
// I think this pops up an unknown OP dialog
|
||||||
// NextInstruction = RSPPIPELINE_FINISH_BLOCK;
|
// NextInstruction = RSPPIPELINE_FINISH_BLOCK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
(RecompilerOps.*RSP_Recomp_Opcode[RSPOpC.op])();
|
(RecompilerOps.*RSP_Recomp_Opcode[m_OpCode.op])();
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (NextInstruction)
|
switch (NextInstruction)
|
||||||
|
|
|
@ -40,6 +40,7 @@ private:
|
||||||
void ReOrderSubBlock(RSP_BLOCK * Block);
|
void ReOrderSubBlock(RSP_BLOCK * Block);
|
||||||
|
|
||||||
CRSPSystem & m_System;
|
CRSPSystem & m_System;
|
||||||
|
RSPOpcode & m_OpCode;
|
||||||
RSP_BLOCK m_CurrentBlock;
|
RSP_BLOCK m_CurrentBlock;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -204,6 +204,7 @@ private:
|
||||||
CRSPSystem & m_System;
|
CRSPSystem & m_System;
|
||||||
CRSPRegisters & m_Reg;
|
CRSPRegisters & m_Reg;
|
||||||
CRSPRecompiler & m_Recompiler;
|
CRSPRecompiler & m_Recompiler;
|
||||||
|
RSPOpcode & m_OpCode;
|
||||||
UWORD32 * m_GPR;
|
UWORD32 * m_GPR;
|
||||||
UDWORD * m_ACCUM;
|
UDWORD * m_ACCUM;
|
||||||
UWORD32 * m_Flags;
|
UWORD32 * m_Flags;
|
||||||
|
|
|
@ -23,7 +23,7 @@ void CRSPRecompilerOps::RSP_Sections_VMUDH(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RSPOpC = RspOp;
|
m_OpCode = RspOp;
|
||||||
|
|
||||||
// Load source registers
|
// Load source registers
|
||||||
sprintf(Reg, "m_Vect[%i].HW[0]", RspOp.rd);
|
sprintf(Reg, "m_Vect[%i].HW[0]", RspOp.rd);
|
||||||
|
@ -91,7 +91,7 @@ void CRSPRecompilerOps::RSP_Sections_VMADH(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RSPOpC = RspOp;
|
m_OpCode = RspOp;
|
||||||
|
|
||||||
// Load source registers
|
// Load source registers
|
||||||
sprintf(Reg, "m_Vect[%i].HW[0]", RspOp.rd);
|
sprintf(Reg, "m_Vect[%i].HW[0]", RspOp.rd);
|
||||||
|
@ -164,7 +164,7 @@ void CRSPRecompilerOps::RSP_Sections_VMUDL(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RSPOpC = RspOp;
|
m_OpCode = RspOp;
|
||||||
|
|
||||||
// Load source registers
|
// Load source registers
|
||||||
sprintf(Reg, "m_Vect[%i].HW[0]", RspOp.rd);
|
sprintf(Reg, "m_Vect[%i].HW[0]", RspOp.rd);
|
||||||
|
@ -210,7 +210,7 @@ void CRSPRecompilerOps::RSP_Sections_VMUDN(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RSPOpC = RspOp;
|
m_OpCode = RspOp;
|
||||||
|
|
||||||
// VMUDN
|
// VMUDN
|
||||||
if (AccumStyle != Middle16BitAccum)
|
if (AccumStyle != Middle16BitAccum)
|
||||||
|
@ -259,14 +259,14 @@ void CRSPRecompilerOps::RSP_Sections_VMUDN(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
sprintf(Reg, "m_Vect[%i].HW[4]", RspOp.rd);
|
sprintf(Reg, "m_Vect[%i].HW[4]", RspOp.rd);
|
||||||
MmxMoveQwordVariableToReg(x86_MM5, &m_Vect[RspOp.rd].s16(4), Reg);
|
MmxMoveQwordVariableToReg(x86_MM5, &m_Vect[RspOp.rd].s16(4), Reg);
|
||||||
|
|
||||||
if ((RSPOpC.rs & 0xF) < 2)
|
if ((m_OpCode.rs & 0xF) < 2)
|
||||||
{
|
{
|
||||||
sprintf(Reg, "m_Vect[%i].UHW[0]", RSPOpC.rt);
|
sprintf(Reg, "m_Vect[%i].UHW[0]", m_OpCode.rt);
|
||||||
MmxMoveQwordVariableToReg(x86_MM0, &m_Vect[RSPOpC.vt].u16(0), Reg);
|
MmxMoveQwordVariableToReg(x86_MM0, &m_Vect[m_OpCode.vt].u16(0), Reg);
|
||||||
sprintf(Reg, "m_Vect[%i].UHW[4]", RSPOpC.rt);
|
sprintf(Reg, "m_Vect[%i].UHW[4]", m_OpCode.rt);
|
||||||
MmxMoveQwordVariableToReg(x86_MM1, &m_Vect[RSPOpC.vt].u16(4), Reg);
|
MmxMoveQwordVariableToReg(x86_MM1, &m_Vect[m_OpCode.vt].u16(4), Reg);
|
||||||
}
|
}
|
||||||
else if ((RSPOpC.rs & 0xF) >= 8)
|
else if ((m_OpCode.rs & 0xF) >= 8)
|
||||||
{
|
{
|
||||||
RSP_Element2Mmx(x86_MM0);
|
RSP_Element2Mmx(x86_MM0);
|
||||||
MmxMoveRegToReg(x86_MM1, x86_MM0);
|
MmxMoveRegToReg(x86_MM1, x86_MM0);
|
||||||
|
@ -307,7 +307,7 @@ void CRSPRecompilerOps::RSP_Sections_VMADN(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RSPOpC = RspOp;
|
m_OpCode = RspOp;
|
||||||
|
|
||||||
// VMADN
|
// VMADN
|
||||||
if (AccumStyle != Middle16BitAccum)
|
if (AccumStyle != Middle16BitAccum)
|
||||||
|
@ -355,14 +355,14 @@ void CRSPRecompilerOps::RSP_Sections_VMADN(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
sprintf(Reg, "m_Vect[%i].HW[4]", RspOp.rd);
|
sprintf(Reg, "m_Vect[%i].HW[4]", RspOp.rd);
|
||||||
MmxMoveQwordVariableToReg(x86_MM5 + 2, &m_Vect[RspOp.rd].s16(4), Reg);
|
MmxMoveQwordVariableToReg(x86_MM5 + 2, &m_Vect[RspOp.rd].s16(4), Reg);
|
||||||
|
|
||||||
if ((RSPOpC.rs & 0xF) < 2)
|
if ((m_OpCode.rs & 0xF) < 2)
|
||||||
{
|
{
|
||||||
sprintf(Reg, "m_Vect[%i].UHW[0]", RSPOpC.rt);
|
sprintf(Reg, "m_Vect[%i].UHW[0]", m_OpCode.rt);
|
||||||
MmxMoveQwordVariableToReg(x86_MM0 + 2, &m_Vect[RSPOpC.vt].u16(0), Reg);
|
MmxMoveQwordVariableToReg(x86_MM0 + 2, &m_Vect[m_OpCode.vt].u16(0), Reg);
|
||||||
sprintf(Reg, "m_Vect[%i].UHW[4]", RSPOpC.rt);
|
sprintf(Reg, "m_Vect[%i].UHW[4]", m_OpCode.rt);
|
||||||
MmxMoveQwordVariableToReg(x86_MM1 + 2, &m_Vect[RSPOpC.vt].u16(4), Reg);
|
MmxMoveQwordVariableToReg(x86_MM1 + 2, &m_Vect[m_OpCode.vt].u16(4), Reg);
|
||||||
}
|
}
|
||||||
else if ((RSPOpC.rs & 0xF) >= 8)
|
else if ((m_OpCode.rs & 0xF) >= 8)
|
||||||
{
|
{
|
||||||
RSP_Element2Mmx(x86_MM0 + 2);
|
RSP_Element2Mmx(x86_MM0 + 2);
|
||||||
MmxMoveRegToReg(x86_MM1 + 2, x86_MM0 + 2);
|
MmxMoveRegToReg(x86_MM1 + 2, x86_MM0 + 2);
|
||||||
|
@ -411,7 +411,7 @@ void CRSPRecompilerOps::RSP_Sections_VMULF(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RSPOpC = RspOp;
|
m_OpCode = RspOp;
|
||||||
|
|
||||||
// Load source registers
|
// Load source registers
|
||||||
sprintf(Reg, "m_Vect[%i].HW[0]", RspOp.rd);
|
sprintf(Reg, "m_Vect[%i].HW[0]", RspOp.rd);
|
||||||
|
@ -482,7 +482,7 @@ void CRSPRecompilerOps::RSP_Sections_VMACF(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RSPOpC = RspOp;
|
m_OpCode = RspOp;
|
||||||
|
|
||||||
// Load source registers
|
// Load source registers
|
||||||
sprintf(Reg, "m_Vect[%i].HW[0]", RspOp.rd);
|
sprintf(Reg, "m_Vect[%i].HW[0]", RspOp.rd);
|
||||||
|
@ -871,15 +871,15 @@ void CRSPRecompilerOps::Compile_Section_002(void)
|
||||||
// VSAWs
|
// VSAWs
|
||||||
vsaw = op[10];
|
vsaw = op[10];
|
||||||
MmxXorRegToReg(x86_MM4, x86_MM4);
|
MmxXorRegToReg(x86_MM4, x86_MM4);
|
||||||
sprintf(Reg, "m_Vect[%i].HW[0]", RSPOpC.sa);
|
sprintf(Reg, "m_Vect[%i].HW[0]", m_OpCode.sa);
|
||||||
MmxMoveQwordRegToVariable(x86_MM4, &m_Vect[vsaw.sa].s16(0), Reg);
|
MmxMoveQwordRegToVariable(x86_MM4, &m_Vect[vsaw.sa].s16(0), Reg);
|
||||||
sprintf(Reg, "m_Vect[%i].HW[4]", RSPOpC.sa);
|
sprintf(Reg, "m_Vect[%i].HW[4]", m_OpCode.sa);
|
||||||
MmxMoveQwordRegToVariable(x86_MM4, &m_Vect[vsaw.sa].s16(4), Reg);
|
MmxMoveQwordRegToVariable(x86_MM4, &m_Vect[vsaw.sa].s16(4), Reg);
|
||||||
|
|
||||||
vsaw = op[11];
|
vsaw = op[11];
|
||||||
sprintf(Reg, "m_Vect[%i].HW[0]", RSPOpC.sa);
|
sprintf(Reg, "m_Vect[%i].HW[0]", m_OpCode.sa);
|
||||||
MmxMoveQwordRegToVariable(x86_MM0, &m_Vect[vsaw.sa].s16(0), Reg);
|
MmxMoveQwordRegToVariable(x86_MM0, &m_Vect[vsaw.sa].s16(0), Reg);
|
||||||
sprintf(Reg, "m_Vect[%i].HW[4]", RSPOpC.sa);
|
sprintf(Reg, "m_Vect[%i].HW[4]", m_OpCode.sa);
|
||||||
MmxMoveQwordRegToVariable(x86_MM1, &m_Vect[vsaw.sa].s16(4), Reg);
|
MmxMoveQwordRegToVariable(x86_MM1, &m_Vect[vsaw.sa].s16(4), Reg);
|
||||||
|
|
||||||
MmxEmptyMultimediaState();
|
MmxEmptyMultimediaState();
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
class RSPRegisterHandler;
|
class RSPRegisterHandler;
|
||||||
|
|
||||||
UDWORD EleSpec[16], Indx[16];
|
UDWORD EleSpec[16], Indx[16];
|
||||||
RSPOpcode RSPOpC;
|
|
||||||
uint32_t *PrgCount, NextInstruction, RSP_Running;
|
uint32_t *PrgCount, NextInstruction, RSP_Running;
|
||||||
|
|
||||||
void BuildRecompilerCPU(void);
|
void BuildRecompilerCPU(void);
|
||||||
|
|
|
@ -14,7 +14,6 @@ enum RSPCpuType
|
||||||
extern UDWORD EleSpec[16], Indx[16];
|
extern UDWORD EleSpec[16], Indx[16];
|
||||||
|
|
||||||
extern uint32_t *PrgCount, RSP_Running;
|
extern uint32_t *PrgCount, RSP_Running;
|
||||||
extern RSPOpcode RSPOpC;
|
|
||||||
|
|
||||||
void SetCPU(RSPCpuType core);
|
void SetCPU(RSPCpuType core);
|
||||||
void Build_RSP(void);
|
void Build_RSP(void);
|
||||||
|
|
|
@ -8,19 +8,4 @@
|
||||||
#include <Settings/Settings.h>
|
#include <Settings/Settings.h>
|
||||||
|
|
||||||
RSPPIPELINE_STAGE RSP_NextInstruction;
|
RSPPIPELINE_STAGE RSP_NextInstruction;
|
||||||
uint32_t RSP_JumpTo;
|
uint32_t RSP_JumpTo;
|
||||||
|
|
||||||
unsigned int RSP_branch_if(int condition)
|
|
||||||
{
|
|
||||||
unsigned int new_PC;
|
|
||||||
|
|
||||||
if (condition)
|
|
||||||
{
|
|
||||||
new_PC = *PrgCount + 4 + ((short)RSPOpC.offset << 2);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
new_PC = *PrgCount + 4 + 4;
|
|
||||||
}
|
|
||||||
return (new_PC & 0xFFC);
|
|
||||||
}
|
|
|
@ -17,8 +17,3 @@ enum RSPPIPELINE_STAGE
|
||||||
|
|
||||||
extern RSPPIPELINE_STAGE RSP_NextInstruction;
|
extern RSPPIPELINE_STAGE RSP_NextInstruction;
|
||||||
extern uint32_t RSP_JumpTo;
|
extern uint32_t RSP_JumpTo;
|
||||||
|
|
||||||
// Standard MIPS PC-relative branch
|
|
||||||
// Returns the new PC, based on whether the condition passes
|
|
||||||
|
|
||||||
unsigned int RSP_branch_if(int condition);
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,4 +1,5 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include <Project64-rsp-core/cpu/RSPOpcode.h>
|
||||||
#include <Project64-rsp-core/cpu/RspTypes.h>
|
#include <Project64-rsp-core/cpu/RspTypes.h>
|
||||||
|
|
||||||
class CRSPSystem;
|
class CRSPSystem;
|
||||||
|
@ -167,6 +168,7 @@ private:
|
||||||
|
|
||||||
// Other functions
|
// Other functions
|
||||||
void UnknownOpcode(void);
|
void UnknownOpcode(void);
|
||||||
|
uint32_t BranchIf(bool Condition);
|
||||||
|
|
||||||
typedef void (RSPOp::*Func)();
|
typedef void (RSPOp::*Func)();
|
||||||
|
|
||||||
|
@ -180,6 +182,7 @@ private:
|
||||||
Func Jump_Sc2[32];
|
Func Jump_Sc2[32];
|
||||||
|
|
||||||
CRSPSystem & m_System;
|
CRSPSystem & m_System;
|
||||||
|
RSPOpcode & m_OpCode;
|
||||||
CRSPRegisters & m_Reg;
|
CRSPRegisters & m_Reg;
|
||||||
UWORD32 * m_GPR;
|
UWORD32 * m_GPR;
|
||||||
UDWORD * m_ACCUM;
|
UDWORD * m_ACCUM;
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
CRSPSystem RSPSystem;
|
CRSPSystem RSPSystem;
|
||||||
|
|
||||||
CRSPSystem::CRSPSystem() :
|
CRSPSystem::CRSPSystem() :
|
||||||
m_OpCodes(*this)
|
m_Op(*this)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,8 +34,8 @@ uint32_t CRSPSystem::RunInterpreterCPU(uint32_t Cycles)
|
||||||
{
|
{
|
||||||
g_RSPDebugger->BeforeExecuteOp();
|
g_RSPDebugger->BeforeExecuteOp();
|
||||||
}
|
}
|
||||||
RSPOpC.Value = *(uint32_t *)(RSPInfo.IMEM + (*PrgCount & 0xFFC));
|
m_OpCode.Value = *(uint32_t *)(RSPInfo.IMEM + (*PrgCount & 0xFFC));
|
||||||
(m_OpCodes.*(m_OpCodes.Jump_Opcode[RSPOpC.op]))();
|
(m_Op.*(m_Op.Jump_Opcode[m_OpCode.op]))();
|
||||||
GprR0 = 0x00000000; // MIPS $zero hard-wired to 0
|
GprR0 = 0x00000000; // MIPS $zero hard-wired to 0
|
||||||
|
|
||||||
switch (RSP_NextInstruction)
|
switch (RSP_NextInstruction)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <Project64-rsp-core/cpu/RSPInterpreterOps.h>
|
#include <Project64-rsp-core/cpu/RSPInterpreterOps.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
||||||
#include <Project64-rsp-core/cpu/RspTypes.h>
|
#include <Project64-rsp-core/cpu/RspTypes.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
@ -7,6 +8,8 @@ class CRSPSystem
|
||||||
{
|
{
|
||||||
friend class RSPOp;
|
friend class RSPOp;
|
||||||
friend class CRSPRecompilerOps;
|
friend class CRSPRecompilerOps;
|
||||||
|
friend class CRSPRecompiler;
|
||||||
|
friend class RSPDebuggerUI;
|
||||||
friend void UpdateRSPRegistersScreen(void);
|
friend void UpdateRSPRegistersScreen(void);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -18,7 +21,8 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CRSPRegisters m_Reg;
|
CRSPRegisters m_Reg;
|
||||||
RSPOp m_OpCodes;
|
RSPOp m_Op;
|
||||||
|
RSPOpcode m_OpCode;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern CRSPSystem RSPSystem;
|
extern CRSPSystem RSPSystem;
|
|
@ -6,12 +6,19 @@
|
||||||
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPInstruction.h>
|
#include <Project64-rsp-core/cpu/RSPInstruction.h>
|
||||||
#include <Project64-rsp-core/cpu/RspLog.h>
|
#include <Project64-rsp-core/cpu/RspLog.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspSystem.h>
|
||||||
#include <Project64-rsp/RSP Command.h>
|
#include <Project64-rsp/RSP Command.h>
|
||||||
#include <Project64-rsp/breakpoint.h>
|
#include <Project64-rsp/breakpoint.h>
|
||||||
|
|
||||||
void UpdateRSPRegistersScreen(void);
|
void UpdateRSPRegistersScreen(void);
|
||||||
void RDP_LogLoc(DWORD /*PC*/);
|
void RDP_LogLoc(DWORD /*PC*/);
|
||||||
|
|
||||||
|
RSPDebuggerUI::RSPDebuggerUI(CRSPSystem & System) :
|
||||||
|
m_System(System),
|
||||||
|
m_OpCode(System.m_OpCode)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void RSPDebuggerUI::ResetTimerList(void)
|
void RSPDebuggerUI::ResetTimerList(void)
|
||||||
{
|
{
|
||||||
::ResetTimerList();
|
::ResetTimerList();
|
||||||
|
@ -98,12 +105,12 @@ void RSPDebuggerUI::UnknownOpcode(void)
|
||||||
if (InRSPCommandsWindow)
|
if (InRSPCommandsWindow)
|
||||||
{
|
{
|
||||||
SetRSPCommandViewto(*RSPInfo.SP_PC_REG);
|
SetRSPCommandViewto(*RSPInfo.SP_PC_REG);
|
||||||
DisplayError("Unhandled Opcode\n%s\n\nStopping emulation", RSPInstruction(*RSPInfo.SP_PC_REG, RSPOpC.Value).NameAndParam().c_str());
|
DisplayError("Unhandled Opcode\n%s\n\nStopping emulation", RSPInstruction(*RSPInfo.SP_PC_REG, m_OpCode.Value).NameAndParam().c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf(Message, "Unhandled Opcode\n%s\n\nStopping emulation.\n\nWould you like to open the debugger?",
|
sprintf(Message, "Unhandled Opcode\n%s\n\nStopping emulation.\n\nWould you like to open the debugger?",
|
||||||
RSPInstruction(*RSPInfo.SP_PC_REG, RSPOpC.Value).NameAndParam().c_str());
|
RSPInstruction(*RSPInfo.SP_PC_REG, m_OpCode.Value).NameAndParam().c_str());
|
||||||
response = MessageBoxA(NULL, Message, "Error", MB_YESNO | MB_ICONERROR);
|
response = MessageBoxA(NULL, Message, "Error", MB_YESNO | MB_ICONERROR);
|
||||||
if (response == IDYES)
|
if (response == IDYES)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,10 +1,15 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <Project64-rsp-core\RSPDebugger.h>
|
#include <Project64-rsp-core/RSPDebugger.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RSPOpcode.h>
|
||||||
|
|
||||||
|
class CRSPSystem;
|
||||||
|
|
||||||
class RSPDebuggerUI :
|
class RSPDebuggerUI :
|
||||||
public RSPDebugger
|
public RSPDebugger
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
RSPDebuggerUI(CRSPSystem & System);
|
||||||
|
|
||||||
void ResetTimerList(void);
|
void ResetTimerList(void);
|
||||||
void StartingCPU(void);
|
void StartingCPU(void);
|
||||||
void RspCyclesStart(void);
|
void RspCyclesStart(void);
|
||||||
|
@ -12,4 +17,8 @@ public:
|
||||||
void BeforeExecuteOp(void);
|
void BeforeExecuteOp(void);
|
||||||
void UnknownOpcode(void);
|
void UnknownOpcode(void);
|
||||||
void RDP_LogMF0(uint32_t PC, uint32_t Reg);
|
void RDP_LogMF0(uint32_t PC, uint32_t Reg);
|
||||||
|
|
||||||
|
private:
|
||||||
|
CRSPSystem & m_System;
|
||||||
|
RSPOpcode & m_OpCode;
|
||||||
};
|
};
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
||||||
#include <Project64-rsp-core/cpu/RspLog.h>
|
#include <Project64-rsp-core/cpu/RspLog.h>
|
||||||
#include <Project64-rsp-core/cpu/RspMemory.h>
|
#include <Project64-rsp-core/cpu/RspMemory.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspSystem.h>
|
||||||
#include <Project64-rsp-core/cpu/RspTypes.h>
|
#include <Project64-rsp-core/cpu/RspTypes.h>
|
||||||
|
|
||||||
void ProcessMenuItem(int32_t ID);
|
void ProcessMenuItem(int32_t ID);
|
||||||
|
@ -257,7 +258,7 @@ Output: None
|
||||||
*/
|
*/
|
||||||
EXPORT void InitiateRSP(RSP_INFO Rsp_Info, uint32_t * CycleCount)
|
EXPORT void InitiateRSP(RSP_INFO Rsp_Info, uint32_t * CycleCount)
|
||||||
{
|
{
|
||||||
g_RSPDebuggerUI.reset(new RSPDebuggerUI);
|
g_RSPDebuggerUI.reset(new RSPDebuggerUI(RSPSystem));
|
||||||
g_RSPDebugger = g_RSPDebuggerUI.get();
|
g_RSPDebugger = g_RSPDebuggerUI.get();
|
||||||
InitilizeRSP(Rsp_Info);
|
InitilizeRSP(Rsp_Info);
|
||||||
*CycleCount = 0;
|
*CycleCount = 0;
|
||||||
|
|
Loading…
Reference in New Issue