#pragma once #include "stdafx.h" #include "CpuTypes.h" #include "PpuTypes.h" #include "DebugTypes.h" #include "DebugUtilities.h" #include "../Utilities/SimpleLock.h" class Console; 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 SpcDebugger; class CpuDebugger; class GsuDebugger; class NecDspDebugger; class Cx4Debugger; class GbDebugger; class Breakpoint; class IEventManager; class IAssembler; class Gameboy; 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 _internalRegs; shared_ptr _dmaController; Gameboy* _gameboy = nullptr; shared_ptr _settings; unique_ptr _spcDebugger; unique_ptr _cpuDebugger; unique_ptr _sa1Debugger; unique_ptr _gsuDebugger; unique_ptr _necDspDebugger; unique_ptr _cx4Debugger; unique_ptr _gbDebugger; shared_ptr _scriptManager; shared_ptr _traceLogger; shared_ptr _memoryDumper; shared_ptr _memoryAccessCounter; shared_ptr _codeDataLogger; shared_ptr _disassembler; shared_ptr _ppuTools; shared_ptr _labelManager; unique_ptr _watchExpEval[(int)DebugUtilities::GetLastCpuType() + 1]; SimpleLock _logLock; std::list _debuggerLog; atomic _executionStopped; atomic _breakRequestCount; atomic _suspendRequestCount; bool _waitForBreakResume = false; void Reset(); 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); 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(DebugState& state, bool partialPpuState); bool GetCpuProcFlag(ProcFlags::ProcFlags flag); void SetCpuRegister(CpuRegister reg, uint16_t value); void SetCpuProcFlag(ProcFlags::ProcFlags flag, bool set); void SetCx4Register(Cx4Register reg, uint32_t value); void SetGameboyRegister(GbRegister reg, uint16_t value); void SetGsuRegister(GsuRegister reg, uint16_t value); void SetNecDspRegister(NecDspRegister reg, uint16_t value); void SetSa1Register(CpuRegister reg, uint16_t value); void SetSpcRegister(SpcRegister reg, uint16_t value); 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 GetBreakpoints(CpuType cpuType, Breakpoint* breakpoints, int& execs, int& reads, int& writes); void Log(string message); string GetLog(); void SaveRomToDisk(string filename, bool saveAsIps, CdlStripOption stripOption); shared_ptr GetTraceLogger(); shared_ptr 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); shared_ptr GetConsole(); shared_ptr GetAssembler(CpuType cpuType); };