Mesen-SX/Core/GsuDebugger.cpp

131 lines
3.6 KiB
C++
Raw Normal View History

2019-07-30 22:34:52 -04:00
#include "stdafx.h"
#include "GsuDebugger.h"
#include "DisassemblyInfo.h"
#include "Disassembler.h"
#include "BaseCartridge.h"
#include "Gsu.h"
#include "TraceLogger.h"
#include "CallstackManager.h"
#include "BreakpointManager.h"
#include "ExpressionEvaluator.h"
2019-07-30 22:34:52 -04:00
#include "MemoryManager.h"
#include "Debugger.h"
#include "Console.h"
#include "EmuSettings.h"
2019-07-30 22:34:52 -04:00
#include "MemoryAccessCounter.h"
2020-02-25 23:56:55 -05:00
#include "CodeDataLogger.h"
2019-07-30 22:34:52 -04:00
GsuDebugger::GsuDebugger(Debugger* debugger)
{
_debugger = debugger;
_codeDataLogger = debugger->GetCodeDataLogger(CpuType::Cpu).get();
2019-07-30 22:34:52 -04:00
_traceLogger = debugger->GetTraceLogger().get();
_disassembler = debugger->GetDisassembler().get();
_memoryAccessCounter = debugger->GetMemoryAccessCounter().get();
_gsu = debugger->GetConsole()->GetCartridge()->GetGsu();
_memoryManager = debugger->GetConsole()->GetMemoryManager().get();
_settings = debugger->GetConsole()->GetSettings().get();
2019-07-30 22:34:52 -04:00
_breakpointManager.reset(new BreakpointManager(debugger, CpuType::Gsu));
2019-07-30 22:34:52 -04:00
_step.reset(new StepRequest());
}
void GsuDebugger::Reset()
{
_prevOpCode = 0xFF;
}
void GsuDebugger::ProcessRead(uint32_t addr, uint8_t value, MemoryOperationType type)
{
2020-12-19 23:30:09 +03:00
if (type == MemoryOperationType::DummyRead)
{
2019-07-30 22:34:52 -04:00
//Ignore all dummy reads for now
return;
}
AddressInfo addressInfo = _gsu->GetMemoryMappings()->GetAbsoluteAddress(addr);
2020-12-19 23:30:09 +03:00
MemoryOperationInfo operation{addr, value, type};
2019-07-30 22:34:52 -04:00
2020-12-19 23:30:09 +03:00
if (type == MemoryOperationType::ExecOpCode)
{
if (addressInfo.Type == SnesMemoryType::PrgRom)
{
2020-02-25 23:56:55 -05:00
_codeDataLogger->SetFlags(addressInfo.Address, CdlFlags::Code | CdlFlags::Gsu);
}
2020-12-19 23:30:09 +03:00
if (_traceLogger->IsCpuLogged(CpuType::Gsu) || _settings->CheckDebuggerFlag(DebuggerFlags::GsuDebuggerEnabled))
{
GsuState gsuState = _gsu->GetState();
_disassembler->BuildCache(addressInfo, gsuState.SFR.GetFlagsHigh() & 0x13, CpuType::Gsu);
2020-12-19 23:30:09 +03:00
if (_traceLogger->IsCpuLogged(CpuType::Gsu))
{
DebugState debugState;
_debugger->GetState(debugState, true);
debugState.Gsu.R[15] = addr;
DisassemblyInfo disInfo = _disassembler->GetDisassemblyInfo(addressInfo, addr, 0, CpuType::Gsu);
_traceLogger->Log(CpuType::Gsu, debugState, disInfo);
}
}
2019-07-30 22:34:52 -04:00
_prevOpCode = value;
_prevProgramCounter = addr;
2020-12-19 23:30:09 +03:00
if (_step->StepCount > 0)
{
2019-07-30 22:34:52 -04:00
_step->StepCount--;
}
_memoryAccessCounter->ProcessMemoryExec(addressInfo, _memoryManager->GetMasterClock());
2020-12-19 23:30:09 +03:00
}
else
{
if (addressInfo.Type == SnesMemoryType::PrgRom)
{
2020-02-25 23:56:55 -05:00
_codeDataLogger->SetFlags(addressInfo.Address, CdlFlags::Data | CdlFlags::Gsu);
}
_memoryAccessCounter->ProcessMemoryRead(addressInfo, _memoryManager->GetMasterClock());
2019-07-30 22:34:52 -04:00
}
_debugger->ProcessBreakConditions(_step->StepCount == 0, GetBreakpointManager(), operation, addressInfo);
2019-07-30 22:34:52 -04:00
}
void GsuDebugger::ProcessWrite(uint32_t addr, uint8_t value, MemoryOperationType type)
{
AddressInfo addressInfo = _gsu->GetMemoryMappings()->GetAbsoluteAddress(addr);
2020-12-19 23:30:09 +03:00
MemoryOperationInfo operation{addr, value, type};
_debugger->ProcessBreakConditions(false, GetBreakpointManager(), operation, addressInfo);
2019-07-30 22:34:52 -04:00
_disassembler->InvalidateCache(addressInfo, CpuType::Gsu);
_memoryAccessCounter->ProcessMemoryWrite(addressInfo, _memoryManager->GetMasterClock());
2019-07-30 22:34:52 -04:00
}
void GsuDebugger::Run()
{
_step.reset(new StepRequest());
}
void GsuDebugger::Step(int32_t stepCount, StepType type)
{
StepRequest step;
2020-12-19 23:30:09 +03:00
switch (type)
{
case StepType::StepOut:
case StepType::StepOver:
case StepType::Step: step.StepCount = stepCount;
break;
case StepType::SpecificScanline:
case StepType::PpuStep:
break;
2019-07-30 22:34:52 -04:00
}
_step.reset(new StepRequest(step));
}
BreakpointManager* GsuDebugger::GetBreakpointManager()
{
return _breakpointManager.get();
2020-12-19 23:30:09 +03:00
}