#pragma once #include "stdafx.h" #include "Utilities/SimpleLock.h" #include "DebugUtilities.h" #include "DebugTypes.h" class IConsole; class Emulator; class Cpu; class Ppu; class Spc; class BaseCartridge; class MemoryManager; class InternalRegisters; class DmaController; 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 Breakpoint; class IEventManager; class IAssembler; class IDebugger; struct BaseState; enum class EventType; enum class MemoryOperationType; enum class EvalResultType : int32_t; struct CpuInfo { unique_ptr Debugger; unique_ptr Evaluator; }; class Debugger { private: Emulator* _emu = nullptr; IConsole* _console = nullptr; EmuSettings* _settings; CpuInfo _debuggers[(int)DebugUtilities::GetLastCpuType() + 1]; shared_ptr _scriptManager; shared_ptr _traceLogger; shared_ptr _memoryDumper; shared_ptr _memoryAccessCounter; shared_ptr _codeDataLogger; shared_ptr _disassembler; shared_ptr _ppuTools; shared_ptr _labelManager; SimpleLock _logLock; std::list _debuggerLog; atomic _executionStopped; atomic _breakRequestCount; atomic _suspendRequestCount; bool _waitForBreakResume = false; void Reset(); public: Debugger(Emulator* emu, IConsole* 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); template void ProcessPpuRead(uint16_t addr, uint8_t value, SnesMemoryType memoryType); template void ProcessPpuWrite(uint16_t addr, uint8_t value, SnesMemoryType memoryType); template void ProcessPpuCycle(); 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(); bool HasBreakRequest(); void BreakRequest(bool release); void SuspendDebugger(bool release); void BreakImmediately(BreakSource source); void ProcessBreakConditions(bool needBreak, BreakpointManager *bpManager, MemoryOperationInfo &operation, AddressInfo &addressInfo, BreakSource source = BreakSource::Unspecified); void SleepUntilResume(BreakSource source, MemoryOperationInfo* operation = nullptr, int breakpointId = -1); void GetState(BaseState &state, CpuType cpuType); BaseState& GetStateRef(CpuType cpuType); AddressInfo GetAbsoluteAddress(AddressInfo relAddress); AddressInfo GetRelativeAddress(AddressInfo absAddress, CpuType cpuType); void GetCdlData(uint32_t offset, uint32_t length, SnesMemoryType memoryType, uint8_t* cdlData); void SetCdlData(CpuType cpuType, uint8_t * cdlData, uint32_t length); void MarkBytesAs(CpuType cpuType, uint32_t start, uint32_t end, uint8_t flags); void RefreshCodeCache(); void RebuildPrgCache(CpuType cpuType); void SetBreakpoints(Breakpoint breakpoints[], uint32_t length); void Log(string message); string GetLog(); void SaveRomToDisk(string filename, bool saveAsIps, CdlStripOption stripOption); shared_ptr GetTraceLogger(); MemoryDumper* GetMemoryDumper(); shared_ptr GetMemoryAccessCounter(); shared_ptr GetCodeDataLogger(CpuType cpuType); shared_ptr GetDisassembler(); shared_ptr GetPpuTools(); shared_ptr GetEventManager(CpuType cpuType); shared_ptr GetLabelManager(); shared_ptr GetScriptManager(); shared_ptr GetCallstackManager(CpuType cpuType); IConsole* GetConsole(); Emulator* GetEmulator(); shared_ptr GetAssembler(CpuType cpuType); };