#pragma once #include "stdafx.h" #include "CpuTypes.h" #include "PpuTypes.h" class Console; class Cpu; class Ppu; class BaseCartridge; class MemoryManager; class TraceLogger; class ExpressionEvaluator; class MemoryDumper; class Disassembler; class BreakpointManager; class PpuTools; class CodeDataLogger; class EventManager; enum class EventType; enum class SnesMemoryType; enum class MemoryOperationType; enum class BreakpointCategory; enum class EvalResultType : int32_t; struct DebugState; struct MemoryOperationInfo; struct AddressInfo; class Debugger { private: shared_ptr _console; shared_ptr _cpu; shared_ptr _ppu; shared_ptr _memoryManager; shared_ptr _baseCartridge; shared_ptr _traceLogger; shared_ptr _memoryDumper; shared_ptr _codeDataLogger; shared_ptr _disassembler; shared_ptr _breakpointManager; shared_ptr _ppuTools; shared_ptr _eventManager; unique_ptr _watchExpEval; atomic _executionStopped; atomic _breakRequestCount; atomic _cpuStepCount; uint8_t _prevOpCode = 0; public: Debugger(shared_ptr console); ~Debugger(); 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 ProcessPpuRead(uint16_t addr, uint8_t value, SnesMemoryType memoryType); void ProcessPpuWrite(uint16_t addr, uint8_t value, SnesMemoryType memoryType); void ProcessPpuCycle(); void ProcessBreakConditions(MemoryOperationInfo &operation, AddressInfo &addressInfo); void ProcessEvent(EventType type); int32_t EvaluateExpression(string expression, EvalResultType &resultType, bool useCache); void Run(); void Step(int32_t stepCount); bool IsExecutionStopped(); void BreakRequest(bool release); void GetState(DebugState &state); shared_ptr GetTraceLogger(); shared_ptr GetMemoryDumper(); shared_ptr GetDisassembler(); shared_ptr GetBreakpointManager(); shared_ptr GetPpuTools(); shared_ptr GetEventManager(); shared_ptr GetConsole(); };