#pragma once #include "stdafx.h" #include "CpuTypes.h" #include "PpuTypes.h" #include "DebugTypes.h" #include "DebugUtilities.h" class Console; class Cpu; class Ppu; class Spc; class BaseCartridge; class MemoryManager; class EmuSettings; class TraceLogger; class ExpressionEvaluator; class MemoryDumper; class MemoryAccessCounter; class Disassembler; class BreakpointManager; class PpuTools; class CodeDataLogger; class EventManager; class CallstackManager; class LabelManager; class ScriptManager; class SpcDebugger; class CpuDebugger; class GsuDebugger; enum class EventType; enum class EvalResultType : int32_t; class Debugger { private: shared_ptr _console; shared_ptr _cpu; shared_ptr _ppu; shared_ptr _spc; shared_ptr _memoryManager; shared_ptr _cart; shared_ptr _settings; unique_ptr _spcDebugger; unique_ptr _cpuDebugger; unique_ptr _sa1Debugger; unique_ptr _gsuDebugger; shared_ptr _scriptManager; shared_ptr _traceLogger; shared_ptr _memoryDumper; shared_ptr _memoryAccessCounter; shared_ptr _codeDataLogger; shared_ptr _disassembler; shared_ptr _breakpointManager; shared_ptr _ppuTools; shared_ptr _eventManager; shared_ptr _labelManager; unique_ptr _watchExpEval[(int)DebugUtilities::GetLastCpuType() + 1]; atomic _executionStopped; atomic _breakRequestCount; atomic _suspendRequestCount; unique_ptr _step; bool _waitForBreakResume = false; void Reset(); void SleepUntilResume(BreakSource source, MemoryOperationInfo *operation = nullptr, int breakpointId = -1); public: Debugger(shared_ptr console); ~Debugger(); void Release(); template void ProcessMemoryRead(uint32_t addr, uint8_t value, MemoryOperationType opType); template void ProcessMemoryWrite(uint32_t addr, uint8_t value, MemoryOperationType opType); void ProcessWorkRamRead(uint32_t addr, uint8_t value); void ProcessWorkRamWrite(uint32_t addr, uint8_t value); void ProcessPpuRead(uint16_t addr, uint8_t value, SnesMemoryType memoryType); void ProcessPpuWrite(uint16_t addr, uint8_t value, SnesMemoryType memoryType); void ProcessPpuCycle(); void ProcessNecDspExec(uint32_t addr, uint32_t value); void ProcessCx4Exec(); template void ProcessInterrupt(uint32_t originalPc, uint32_t currentPc, bool forNmi); void ProcessEvent(EventType type); int32_t EvaluateExpression(string expression, CpuType cpuType, EvalResultType &resultType, bool useCache); void Run(); void Step(CpuType cpuType, int32_t stepCount, StepType type); bool IsExecutionStopped(); void BreakRequest(bool release); void SuspendDebugger(bool release); void ProcessBreakConditions(bool needBreak, CpuType cpuType, MemoryOperationInfo &operation, AddressInfo &addressInfo, BreakSource source = BreakSource::Unspecified); void GetState(DebugState &state, bool partialPpuState); AddressInfo GetAbsoluteAddress(AddressInfo relAddress); AddressInfo GetRelativeAddress(AddressInfo absAddress); void SetCdlData(uint8_t * cdlData, uint32_t length); void RefreshCodeCache(); shared_ptr GetTraceLogger(); shared_ptr GetMemoryDumper(); shared_ptr GetMemoryAccessCounter(); shared_ptr GetCodeDataLogger(); shared_ptr GetDisassembler(); shared_ptr GetBreakpointManager(); shared_ptr GetPpuTools(); shared_ptr GetEventManager(); shared_ptr GetLabelManager(); shared_ptr GetScriptManager(); shared_ptr GetCallstackManager(CpuType cpuType); shared_ptr GetConsole(); };