#pragma once #include "stdafx.h" #include "CpuTypes.h" #include "PpuTypes.h" #include "DebugTypes.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; 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 _baseCartridge; shared_ptr _settings; 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; shared_ptr _callstackManager; shared_ptr _spcCallstackManager; unique_ptr _watchExpEval[(int)CpuType::Spc + 1]; atomic _executionStopped; atomic _breakRequestCount; atomic _suspendRequestCount; atomic _cpuStepCount; atomic _spcStepCount; atomic _ppuStepCount; atomic _cpuBreakAddress; atomic _spcBreakAddress; atomic _breakScanline; uint8_t _prevOpCode = 0xFF; uint32_t _prevProgramCounter = 0; uint8_t _spcPrevOpCode = 0xFF; uint32_t _spcPrevProgramCounter = 0; void Reset(); void SleepUntilResume(BreakSource source, MemoryOperationInfo *operation = nullptr, int breakpointId = -1); void ProcessStepConditions(uint8_t opCode, uint32_t currentPc); void ProcessBreakConditions(MemoryOperationInfo &operation, AddressInfo &addressInfo, BreakSource source = BreakSource::Unspecified); public: Debugger(shared_ptr console); ~Debugger(); void Release(); void ProcessCpuRead(uint32_t addr, uint8_t value, MemoryOperationType type); void ProcessCpuWrite(uint32_t addr, uint8_t value, MemoryOperationType type); void ProcessWorkRamRead(uint32_t addr, uint8_t value); void ProcessWorkRamWrite(uint32_t addr, uint8_t value); void ProcessSpcRead(uint16_t addr, uint8_t value, MemoryOperationType type); void ProcessSpcWrite(uint16_t addr, uint8_t value, MemoryOperationType type); void ProcessPpuRead(uint16_t addr, uint8_t value, SnesMemoryType memoryType); void ProcessPpuWrite(uint16_t addr, uint8_t value, SnesMemoryType memoryType); void ProcessPpuCycle(); 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(int32_t stepCount, StepType type = StepType::CpuStep); bool IsExecutionStopped(); void BreakRequest(bool release); void SuspendDebugger(bool release); void GetState(DebugState &state); 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(); };