2019-02-12 22:13:09 -05:00
|
|
|
#pragma once
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "CpuTypes.h"
|
2019-02-13 13:32:21 -05:00
|
|
|
#include "PpuTypes.h"
|
2019-03-24 16:42:52 -04:00
|
|
|
#include "DebugTypes.h"
|
2019-08-03 23:43:51 -04:00
|
|
|
#include "DebugUtilities.h"
|
2020-06-23 18:34:03 -04:00
|
|
|
#include "../Utilities/SimpleLock.h"
|
2019-02-12 22:13:09 -05:00
|
|
|
|
2019-02-15 21:33:13 -05:00
|
|
|
class Console;
|
2019-02-12 22:13:09 -05:00
|
|
|
class Cpu;
|
2019-02-13 13:32:21 -05:00
|
|
|
class Ppu;
|
2019-04-06 17:38:14 -04:00
|
|
|
class Spc;
|
2019-02-15 21:33:13 -05:00
|
|
|
class BaseCartridge;
|
2019-02-12 22:13:09 -05:00
|
|
|
class MemoryManager;
|
2019-10-10 23:54:38 -04:00
|
|
|
class InternalRegisters;
|
|
|
|
class DmaController;
|
2019-04-30 21:05:53 -04:00
|
|
|
class EmuSettings;
|
2019-02-12 22:13:09 -05:00
|
|
|
|
|
|
|
class TraceLogger;
|
2019-02-27 20:33:56 -05:00
|
|
|
class ExpressionEvaluator;
|
2019-02-15 21:33:13 -05:00
|
|
|
class MemoryDumper;
|
2019-03-28 17:47:43 -04:00
|
|
|
class MemoryAccessCounter;
|
2019-02-27 19:49:26 -05:00
|
|
|
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;
|
2019-04-28 22:19:52 -04:00
|
|
|
class LabelManager;
|
2019-05-12 21:18:05 -04:00
|
|
|
class ScriptManager;
|
2019-07-25 22:22:09 -04:00
|
|
|
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;
|
2020-05-18 16:10:53 -04:00
|
|
|
class GbDebugger;
|
2019-10-11 16:07:30 -04:00
|
|
|
class Breakpoint;
|
2020-05-21 20:57:00 -04:00
|
|
|
class IEventManager;
|
2020-06-06 22:27:54 -04:00
|
|
|
class IAssembler;
|
2020-06-18 00:58:22 -04:00
|
|
|
class Gameboy;
|
2019-03-07 20:12:32 -05:00
|
|
|
|
|
|
|
enum class EventType;
|
|
|
|
enum class EvalResultType : int32_t;
|
|
|
|
|
2019-02-12 22:13:09 -05:00
|
|
|
class Debugger
|
|
|
|
{
|
|
|
|
private:
|
2019-02-16 08:10:08 -05:00
|
|
|
shared_ptr<Console> _console;
|
2019-02-12 22:13:09 -05:00
|
|
|
shared_ptr<Cpu> _cpu;
|
2019-02-13 13:32:21 -05:00
|
|
|
shared_ptr<Ppu> _ppu;
|
2019-04-06 17:38:14 -04:00
|
|
|
shared_ptr<Spc> _spc;
|
2019-02-12 22:13:09 -05:00
|
|
|
shared_ptr<MemoryManager> _memoryManager;
|
2019-07-14 21:45:12 -04:00
|
|
|
shared_ptr<BaseCartridge> _cart;
|
2019-10-10 23:54:38 -04:00
|
|
|
shared_ptr<InternalRegisters> _internalRegs;
|
|
|
|
shared_ptr<DmaController> _dmaController;
|
2020-06-18 00:58:22 -04:00
|
|
|
|
|
|
|
Gameboy* _gameboy = nullptr;
|
|
|
|
|
2019-04-30 21:05:53 -04:00
|
|
|
shared_ptr<EmuSettings> _settings;
|
2019-07-25 22:22:09 -04:00
|
|
|
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;
|
2020-05-18 16:10:53 -04:00
|
|
|
unique_ptr<GbDebugger> _gbDebugger;
|
2019-02-12 22:13:09 -05:00
|
|
|
|
2019-05-12 21:18:05 -04:00
|
|
|
shared_ptr<ScriptManager> _scriptManager;
|
2019-02-12 22:13:09 -05:00
|
|
|
shared_ptr<TraceLogger> _traceLogger;
|
2019-02-15 21:33:13 -05:00
|
|
|
shared_ptr<MemoryDumper> _memoryDumper;
|
2019-03-28 17:47:43 -04:00
|
|
|
shared_ptr<MemoryAccessCounter> _memoryAccessCounter;
|
2019-02-27 19:49:26 -05:00
|
|
|
shared_ptr<CodeDataLogger> _codeDataLogger;
|
|
|
|
shared_ptr<Disassembler> _disassembler;
|
2019-03-03 16:34:23 -05:00
|
|
|
shared_ptr<PpuTools> _ppuTools;
|
2019-04-28 22:19:52 -04:00
|
|
|
shared_ptr<LabelManager> _labelManager;
|
2019-02-12 22:13:09 -05:00
|
|
|
|
2019-08-03 23:43:51 -04:00
|
|
|
unique_ptr<ExpressionEvaluator> _watchExpEval[(int)DebugUtilities::GetLastCpuType() + 1];
|
2021-03-10 11:13:28 -05:00
|
|
|
|
2020-06-23 18:34:03 -04:00
|
|
|
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;
|
2019-04-12 18:33:52 -04:00
|
|
|
atomic<uint32_t> _suspendRequestCount;
|
2019-03-07 20:12:32 -05:00
|
|
|
|
2019-07-25 22:22:09 -04:00
|
|
|
bool _waitForBreakResume = false;
|
2021-03-10 11:13:28 -05:00
|
|
|
|
2019-05-04 09:25:10 -04:00
|
|
|
void Reset();
|
2019-02-12 22:13:09 -05:00
|
|
|
|
|
|
|
public:
|
2019-02-15 21:33:13 -05:00
|
|
|
Debugger(shared_ptr<Console> console);
|
2019-02-12 22:13:09 -05:00
|
|
|
~Debugger();
|
2019-03-16 12:20:18 -04:00
|
|
|
void Release();
|
2019-02-12 22:13:09 -05:00
|
|
|
|
2021-03-10 11:13:28 -05:00
|
|
|
template<CpuType type>
|
2019-07-25 22:22:09 -04:00
|
|
|
void ProcessMemoryRead(uint32_t addr, uint8_t value, MemoryOperationType opType);
|
2021-03-10 11:13:28 -05:00
|
|
|
|
|
|
|
template<CpuType type>
|
2019-07-25 22:22:09 -04:00
|
|
|
void ProcessMemoryWrite(uint32_t addr, uint8_t value, MemoryOperationType opType);
|
2019-02-12 22:13:09 -05:00
|
|
|
|
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);
|
2020-06-18 00:58:22 -04:00
|
|
|
|
2021-03-10 11:13:28 -05:00
|
|
|
template<CpuType cpuType>
|
2020-06-18 00:58:22 -04:00
|
|
|
void ProcessPpuCycle();
|
2019-03-01 20:27:49 -05:00
|
|
|
|
2021-03-10 11:13:28 -05:00
|
|
|
template<CpuType type>
|
2019-03-24 16:42:52 -04:00
|
|
|
void ProcessInterrupt(uint32_t originalPc, uint32_t currentPc, bool forNmi);
|
2019-07-25 22:22:09 -04:00
|
|
|
|
2019-03-07 20:12:32 -05:00
|
|
|
void ProcessEvent(EventType type);
|
2019-03-01 20:27:49 -05:00
|
|
|
|
2021-03-10 11:13:28 -05:00
|
|
|
int32_t EvaluateExpression(string expression, CpuType cpuType, EvalResultType &resultType, bool useCache);
|
2019-02-27 20:33:56 -05:00
|
|
|
|
2019-02-12 22:13:09 -05:00
|
|
|
void Run();
|
2019-07-25 22:22:09 -04:00
|
|
|
void Step(CpuType cpuType, int32_t stepCount, StepType type);
|
2019-02-12 22:13:09 -05:00
|
|
|
bool IsExecutionStopped();
|
|
|
|
|
2020-05-14 19:34:14 -04:00
|
|
|
bool HasBreakRequest();
|
2019-03-07 20:12:32 -05:00
|
|
|
void BreakRequest(bool release);
|
2019-04-12 18:33:52 -04:00
|
|
|
void SuspendDebugger(bool release);
|
2019-03-07 20:12:32 -05:00
|
|
|
|
2020-06-07 16:34:23 -04:00
|
|
|
void BreakImmediately(BreakSource source);
|
|
|
|
|
2021-03-10 11:13:28 -05:00
|
|
|
void ProcessBreakConditions(bool needBreak, BreakpointManager *bpManager, MemoryOperationInfo &operation, AddressInfo &addressInfo, BreakSource source = BreakSource::Unspecified);
|
2020-06-18 00:58:22 -04:00
|
|
|
void SleepUntilResume(BreakSource source, MemoryOperationInfo* operation = nullptr, int breakpointId = -1);
|
2019-07-25 22:22:09 -04:00
|
|
|
|
2020-10-11 13:57:01 +03:00
|
|
|
void GetState(DebugState& state, bool partialPpuState);
|
2020-11-01 16:52:30 +03:00
|
|
|
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);
|
2019-02-13 13:32:21 -05:00
|
|
|
|
2019-04-27 12:10:31 -04:00
|
|
|
AddressInfo GetAbsoluteAddress(AddressInfo relAddress);
|
2020-02-23 15:58:14 -05:00
|
|
|
AddressInfo GetRelativeAddress(AddressInfo absAddress, CpuType cpuType);
|
2019-04-27 12:10:31 -04:00
|
|
|
|
2020-02-25 23:56:55 -05:00
|
|
|
void GetCdlData(uint32_t offset, uint32_t length, SnesMemoryType memoryType, uint8_t* cdlData);
|
2021-03-10 11:13:28 -05:00
|
|
|
void SetCdlData(CpuType cpuType, uint8_t * cdlData, uint32_t length);
|
2020-06-18 00:58:22 -04:00
|
|
|
void MarkBytesAs(CpuType cpuType, uint32_t start, uint32_t end, uint8_t flags);
|
2021-03-10 11:13:28 -05:00
|
|
|
|
2019-04-29 20:40:52 -04:00
|
|
|
void RefreshCodeCache();
|
2020-06-18 00:58:22 -04:00
|
|
|
void RebuildPrgCache(CpuType cpuType);
|
2019-04-29 20:40:52 -04:00
|
|
|
|
2019-10-11 16:07:30 -04:00
|
|
|
void SetBreakpoints(Breakpoint breakpoints[], uint32_t length);
|
2020-11-01 16:52:30 +03:00
|
|
|
void GetBreakpoints(CpuType cpuType, Breakpoint* breakpoints, int& execs, int& reads, int& writes);
|
2021-03-10 11:13:28 -05:00
|
|
|
|
2020-06-23 18:34:03 -04:00
|
|
|
void Log(string message);
|
|
|
|
string GetLog();
|
|
|
|
|
2020-02-12 19:36:47 -05:00
|
|
|
void SaveRomToDisk(string filename, bool saveAsIps, CdlStripOption stripOption);
|
2019-10-11 16:07:30 -04:00
|
|
|
|
2019-02-12 22:13:09 -05:00
|
|
|
shared_ptr<TraceLogger> GetTraceLogger();
|
2019-02-15 21:33:13 -05:00
|
|
|
shared_ptr<MemoryDumper> GetMemoryDumper();
|
2019-03-28 17:47:43 -04:00
|
|
|
shared_ptr<MemoryAccessCounter> GetMemoryAccessCounter();
|
2020-06-18 00:58:22 -04:00
|
|
|
shared_ptr<CodeDataLogger> GetCodeDataLogger(CpuType cpuType);
|
2019-02-27 19:49:26 -05:00
|
|
|
shared_ptr<Disassembler> GetDisassembler();
|
2019-03-03 16:34:23 -05:00
|
|
|
shared_ptr<PpuTools> GetPpuTools();
|
2020-06-18 00:58:22 -04:00
|
|
|
shared_ptr<IEventManager> GetEventManager(CpuType cpuType);
|
2019-04-28 22:19:52 -04:00
|
|
|
shared_ptr<LabelManager> GetLabelManager();
|
2019-05-12 21:18:05 -04:00
|
|
|
shared_ptr<ScriptManager> GetScriptManager();
|
2019-04-07 12:25:14 -04:00
|
|
|
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);
|
2019-07-25 22:22:09 -04:00
|
|
|
};
|