CachedInterpreter: Implement breakpoints.

There were missed on the initial implementation of the cached interpreter.
This commit is contained in:
degasus 2018-06-11 22:07:56 +02:00
parent 8a3679bebc
commit 03c88c83ac

View File

@ -109,6 +109,7 @@ void CachedInterpreter::ExecuteOneBlock()
void CachedInterpreter::Run()
{
const CPU::State* state_ptr = CPU::GetStatePtr();
while (CPU::GetState() == CPU::State::Running)
{
// Start new timing slice
@ -118,7 +119,7 @@ void CachedInterpreter::Run()
do
{
ExecuteOneBlock();
} while (PowerPC::ppcState.downcount > 0);
} while (PowerPC::ppcState.downcount > 0 && *state_ptr == CPU::State::Running);
}
}
@ -169,6 +170,17 @@ static bool CheckDSI(u32 data)
return false;
}
static bool CheckBreakpoint(u32 data)
{
PowerPC::CheckBreakPoints();
if (CPU::GetState() != CPU::State::Running)
{
PowerPC::ppcState.downcount -= data;
return true;
}
return false;
}
bool CachedInterpreter::HandleFunctionHooking(u32 address)
{
return HLE::ReplaceFunctionIfPossible(address, [&](u32 function, HLE::HookType type) {
@ -225,10 +237,18 @@ void CachedInterpreter::Jit(u32 address)
if (!op.skip)
{
const bool breakpoint = SConfig::GetInstance().bEnableDebugging &&
PowerPC::breakpoints.IsAddressBreakPoint(op.address);
const bool check_fpu = (op.opinfo->flags & FL_USE_FPU) && !js.firstFPInstructionFound;
const bool endblock = (op.opinfo->flags & FL_ENDBLOCK) != 0;
const bool memcheck = (op.opinfo->flags & FL_LOADSTORE) && jo.memcheck;
if (breakpoint)
{
m_code.emplace_back(WritePC, op.address);
m_code.emplace_back(CheckBreakpoint, js.downcountAmount);
}
if (check_fpu)
{
m_code.emplace_back(WritePC, op.address);