Debugger: Fixed not being able to stop execution after STP instruction

This commit is contained in:
Sour 2019-10-22 19:30:21 -04:00
parent d2463c6c2f
commit aa3975aa1e
7 changed files with 47 additions and 24 deletions

View file

@ -73,6 +73,7 @@
<ClInclude Include="GsuRomHandler.h" />
<ClInclude Include="GsuTypes.h" />
<ClInclude Include="HandShakeMessage.h" />
<ClInclude Include="IDebugger.h" />
<ClInclude Include="InputDataMessage.h" />
<ClInclude Include="InputHud.h" />
<ClInclude Include="InternalRegisterTypes.h" />

View file

@ -476,6 +476,9 @@
<ClInclude Include="RomFinder.h">
<Filter>Misc</Filter>
</ClInclude>
<ClInclude Include="IDebugger.h">
<Filter>Debugger\Debuggers</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp" />

View file

@ -1,6 +1,7 @@
#pragma once
#include "stdafx.h"
#include "DebugTypes.h"
#include "IDebugger.h"
class Disassembler;
class Debugger;
@ -17,7 +18,7 @@ class MemoryMappings;
class BreakpointManager;
class Sa1;
class CpuDebugger
class CpuDebugger : public IDebugger
{
Debugger* _debugger;
Disassembler* _disassembler;

View file

@ -339,35 +339,41 @@ void Debugger::Run()
void Debugger::Step(CpuType cpuType, int32_t stepCount, StepType type)
{
StepRequest step;
_cpuDebugger->Run();
_spcDebugger->Run();
if(_sa1Debugger) {
_sa1Debugger->Run();
}
if(_gsuDebugger) {
_gsuDebugger->Run();
}
IDebugger *debugger = nullptr;
switch(type) {
case StepType::PpuStep: step.PpuStepCount = stepCount; break;
case StepType::SpecificScanline: step.BreakScanline = stepCount; break;
default:
case StepType::PpuStep: step.PpuStepCount = stepCount; _step.reset(new StepRequest(step)); break;
case StepType::SpecificScanline: step.BreakScanline = stepCount; _step.reset(new StepRequest(step)); break;
default:
switch(cpuType) {
case CpuType::Cpu: _cpuDebugger->Step(stepCount, type); break;
case CpuType::Spc: _spcDebugger->Step(stepCount, type); break;
case CpuType::Sa1: _sa1Debugger->Step(stepCount, type); break;
case CpuType::Gsu: _gsuDebugger->Step(stepCount, type); break;
case CpuType::NecDsp:
case CpuType::Cx4:
case CpuType::Cpu: debugger = _cpuDebugger.get(); break;
case CpuType::Spc: debugger = _spcDebugger.get(); break;
case CpuType::Sa1: debugger = _sa1Debugger.get(); break;
case CpuType::Gsu: debugger = _gsuDebugger.get(); break;
case CpuType::NecDsp:
case CpuType::Cx4:
throw std::runtime_error("Step(): Unsupported CPU type.");
}
debugger->Step(stepCount, type);
break;
}
_step.reset(new StepRequest(step));
if(!debugger) {
_step.reset(new StepRequest(step));
}
if(debugger != _cpuDebugger.get()) {
_cpuDebugger->Run();
}
if(debugger != _spcDebugger.get()) {
_spcDebugger->Run();
}
if(_sa1Debugger && debugger != _sa1Debugger.get()) {
_sa1Debugger->Run();
}
if(_gsuDebugger && debugger != _gsuDebugger.get()) {
_gsuDebugger->Run();
}
_waitForBreakResume = false;
}

View file

@ -1,6 +1,7 @@
#pragma once
#include "stdafx.h"
#include "DebugTypes.h"
#include "IDebugger.h"
class Disassembler;
class Debugger;
@ -11,7 +12,7 @@ class MemoryManager;
class BreakpointManager;
class EmuSettings;
class GsuDebugger
class GsuDebugger : public IDebugger
{
Debugger* _debugger;
Disassembler* _disassembler;

10
Core/IDebugger.h Normal file
View file

@ -0,0 +1,10 @@
#pragma once
#include "stdafx.h"
enum class StepType;
class IDebugger
{
public:
virtual void Step(int32_t stepCount, StepType type) = 0;
};

View file

@ -1,6 +1,7 @@
#pragma once
#include "stdafx.h"
#include "DebugTypes.h"
#include "IDebugger.h"
class Disassembler;
class Debugger;
@ -12,7 +13,7 @@ class MemoryManager;
class BreakpointManager;
class EmuSettings;
class SpcDebugger
class SpcDebugger : public IDebugger
{
Debugger* _debugger;
Disassembler* _disassembler;