From aa3975aa1edfe5c025822a65f541eaa8493e10ba Mon Sep 17 00:00:00 2001 From: Sour Date: Tue, 22 Oct 2019 19:30:21 -0400 Subject: [PATCH] Debugger: Fixed not being able to stop execution after STP instruction --- Core/Core.vcxproj | 1 + Core/Core.vcxproj.filters | 3 +++ Core/CpuDebugger.h | 3 ++- Core/Debugger.cpp | 48 ++++++++++++++++++++++----------------- Core/GsuDebugger.h | 3 ++- Core/IDebugger.h | 10 ++++++++ Core/SpcDebugger.h | 3 ++- 7 files changed, 47 insertions(+), 24 deletions(-) create mode 100644 Core/IDebugger.h diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 649df62..d8b0570 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -73,6 +73,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index 93a0a63..0f3b24c 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -476,6 +476,9 @@ Misc + + Debugger\Debuggers + diff --git a/Core/CpuDebugger.h b/Core/CpuDebugger.h index f7fb455..14c6ac8 100644 --- a/Core/CpuDebugger.h +++ b/Core/CpuDebugger.h @@ -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; diff --git a/Core/Debugger.cpp b/Core/Debugger.cpp index d3a7cbc..1f15002 100644 --- a/Core/Debugger.cpp +++ b/Core/Debugger.cpp @@ -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; } diff --git a/Core/GsuDebugger.h b/Core/GsuDebugger.h index 9a3b905..5d31bf2 100644 --- a/Core/GsuDebugger.h +++ b/Core/GsuDebugger.h @@ -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; diff --git a/Core/IDebugger.h b/Core/IDebugger.h new file mode 100644 index 0000000..0fc3384 --- /dev/null +++ b/Core/IDebugger.h @@ -0,0 +1,10 @@ +#pragma once +#include "stdafx.h" + +enum class StepType; + +class IDebugger +{ +public: + virtual void Step(int32_t stepCount, StepType type) = 0; +}; \ No newline at end of file diff --git a/Core/SpcDebugger.h b/Core/SpcDebugger.h index 175bd44..f6cd360 100644 --- a/Core/SpcDebugger.h +++ b/Core/SpcDebugger.h @@ -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;