Mesen-SX/Core/Debugger.h

173 lines
5.3 KiB
C
Raw Normal View History

#pragma once
#include "stdafx.h"
#include "CpuTypes.h"
#include "PpuTypes.h"
#include "DebugTypes.h"
2019-08-03 23:43:51 -04:00
#include "DebugUtilities.h"
#include "../Utilities/SimpleLock.h"
2019-02-15 21:33:13 -05:00
class Console;
class Cpu;
class Ppu;
2019-04-06 17:38:14 -04:00
class Spc;
2019-02-15 21:33:13 -05:00
class BaseCartridge;
class MemoryManager;
2019-10-10 23:54:38 -04:00
class InternalRegisters;
class DmaController;
class EmuSettings;
class TraceLogger;
2019-02-27 20:33:56 -05:00
class ExpressionEvaluator;
2019-02-15 21:33:13 -05:00
class MemoryDumper;
class MemoryAccessCounter;
class Disassembler;
2019-03-01 20:27:49 -05:00
class BreakpointManager;
2019-03-03 16:34:23 -05:00
class PpuTools;
2019-03-07 20:12:32 -05:00
class CodeDataLogger;
class EventManager;
2019-03-24 12:05:51 -04:00
class CallstackManager;
class LabelManager;
2019-05-12 21:18:05 -04:00
class ScriptManager;
class SpcDebugger;
class CpuDebugger;
2019-07-30 22:34:52 -04:00
class GsuDebugger;
2020-02-23 21:50:55 -05:00
class NecDspDebugger;
2020-02-24 22:00:52 -05:00
class Cx4Debugger;
class GbDebugger;
class Breakpoint;
class IEventManager;
2020-06-06 22:27:54 -04:00
class IAssembler;
class Gameboy;
2019-03-07 20:12:32 -05:00
enum class EventType;
enum class EvalResultType : int32_t;
class Debugger
{
private:
shared_ptr<Console> _console;
shared_ptr<Cpu> _cpu;
shared_ptr<Ppu> _ppu;
2019-04-06 17:38:14 -04:00
shared_ptr<Spc> _spc;
shared_ptr<MemoryManager> _memoryManager;
shared_ptr<BaseCartridge> _cart;
2019-10-10 23:54:38 -04:00
shared_ptr<InternalRegisters> _internalRegs;
shared_ptr<DmaController> _dmaController;
Gameboy* _gameboy = nullptr;
shared_ptr<EmuSettings> _settings;
unique_ptr<SpcDebugger> _spcDebugger;
unique_ptr<CpuDebugger> _cpuDebugger;
unique_ptr<CpuDebugger> _sa1Debugger;
2019-07-30 22:34:52 -04:00
unique_ptr<GsuDebugger> _gsuDebugger;
2020-02-23 21:50:55 -05:00
unique_ptr<NecDspDebugger> _necDspDebugger;
2020-02-24 22:00:52 -05:00
unique_ptr<Cx4Debugger> _cx4Debugger;
unique_ptr<GbDebugger> _gbDebugger;
2019-05-12 21:18:05 -04:00
shared_ptr<ScriptManager> _scriptManager;
shared_ptr<TraceLogger> _traceLogger;
2019-02-15 21:33:13 -05:00
shared_ptr<MemoryDumper> _memoryDumper;
shared_ptr<MemoryAccessCounter> _memoryAccessCounter;
shared_ptr<CodeDataLogger> _codeDataLogger;
shared_ptr<Disassembler> _disassembler;
2019-03-03 16:34:23 -05:00
shared_ptr<PpuTools> _ppuTools;
shared_ptr<LabelManager> _labelManager;
2019-08-03 23:43:51 -04:00
unique_ptr<ExpressionEvaluator> _watchExpEval[(int)DebugUtilities::GetLastCpuType() + 1];
SimpleLock _logLock;
std::list<string> _debuggerLog;
2019-02-27 20:33:56 -05:00
2019-03-07 20:12:32 -05:00
atomic<bool> _executionStopped;
atomic<uint32_t> _breakRequestCount;
atomic<uint32_t> _suspendRequestCount;
2019-03-07 20:12:32 -05:00
bool _waitForBreakResume = false;
void Reset();
public:
2019-02-15 21:33:13 -05:00
Debugger(shared_ptr<Console> console);
~Debugger();
void Release();
template<CpuType type>
void ProcessMemoryRead(uint32_t addr, uint8_t value, MemoryOperationType opType);
template<CpuType type>
void ProcessMemoryWrite(uint32_t addr, uint8_t value, MemoryOperationType opType);
2019-03-01 20:27:49 -05:00
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<CpuType cpuType>
void ProcessPpuCycle();
2019-03-01 20:27:49 -05:00
template<CpuType type>
void ProcessInterrupt(uint32_t originalPc, uint32_t currentPc, bool forNmi);
2019-03-07 20:12:32 -05:00
void ProcessEvent(EventType type);
2019-03-01 20:27:49 -05:00
int32_t EvaluateExpression(string expression, CpuType cpuType, EvalResultType &resultType, bool useCache);
2019-02-27 20:33:56 -05:00
void Run();
void Step(CpuType cpuType, int32_t stepCount, StepType type);
bool IsExecutionStopped();
bool HasBreakRequest();
2019-03-07 20:12:32 -05:00
void BreakRequest(bool release);
void SuspendDebugger(bool release);
2019-03-07 20:12:32 -05:00
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);
2020-10-11 13:57:01 +03:00
void GetState(DebugState& state, bool partialPpuState);
bool GetCpuProcFlag(ProcFlags::ProcFlags flag);
2020-10-11 13:57:01 +03:00
void SetCpuRegister(CpuRegister reg, uint16_t value);
2020-10-12 18:19:46 +03:00
void SetCpuProcFlag(ProcFlags::ProcFlags flag, bool set);
2020-10-11 13:57:01 +03:00
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);
2020-10-11 14:26:01 -04:00
void SetSpcRegister(SpcRegister reg, uint16_t value);
AddressInfo GetAbsoluteAddress(AddressInfo relAddress);
AddressInfo GetRelativeAddress(AddressInfo absAddress, CpuType cpuType);
2020-02-25 23:56:55 -05:00
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<TraceLogger> GetTraceLogger();
2019-02-15 21:33:13 -05:00
shared_ptr<MemoryDumper> GetMemoryDumper();
shared_ptr<MemoryAccessCounter> GetMemoryAccessCounter();
shared_ptr<CodeDataLogger> GetCodeDataLogger(CpuType cpuType);
shared_ptr<Disassembler> GetDisassembler();
2019-03-03 16:34:23 -05:00
shared_ptr<PpuTools> GetPpuTools();
shared_ptr<IEventManager> GetEventManager(CpuType cpuType);
shared_ptr<LabelManager> GetLabelManager();
2019-05-12 21:18:05 -04:00
shared_ptr<ScriptManager> GetScriptManager();
shared_ptr<CallstackManager> GetCallstackManager(CpuType cpuType);
2019-03-07 20:12:32 -05:00
shared_ptr<Console> GetConsole();
2020-06-06 22:27:54 -04:00
shared_ptr<IAssembler> GetAssembler(CpuType cpuType);
};