2020-02-23 21:50:55 -05:00
|
|
|
#include "stdafx.h"
|
|
|
|
#include "NecDsp.h"
|
|
|
|
#include "NecDspDebugger.h"
|
|
|
|
#include "DisassemblyInfo.h"
|
|
|
|
#include "Disassembler.h"
|
|
|
|
#include "TraceLogger.h"
|
|
|
|
#include "CallstackManager.h"
|
|
|
|
#include "BreakpointManager.h"
|
|
|
|
#include "BaseCartridge.h"
|
|
|
|
#include "MemoryManager.h"
|
|
|
|
#include "Debugger.h"
|
|
|
|
#include "Console.h"
|
|
|
|
#include "MemoryAccessCounter.h"
|
|
|
|
#include "ExpressionEvaluator.h"
|
|
|
|
#include "EmuSettings.h"
|
|
|
|
|
|
|
|
NecDspDebugger::NecDspDebugger(Debugger* debugger)
|
|
|
|
{
|
|
|
|
_debugger = debugger;
|
|
|
|
_traceLogger = debugger->GetTraceLogger().get();
|
|
|
|
_disassembler = debugger->GetDisassembler().get();
|
|
|
|
_dsp = debugger->GetConsole()->GetCartridge()->GetDsp();
|
|
|
|
_settings = debugger->GetConsole()->GetSettings().get();
|
|
|
|
|
|
|
|
_breakpointManager.reset(new BreakpointManager(debugger, CpuType::NecDsp));
|
|
|
|
_step.reset(new StepRequest());
|
|
|
|
}
|
|
|
|
|
|
|
|
void NecDspDebugger::Reset()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void NecDspDebugger::ProcessRead(uint16_t addr, uint8_t value, MemoryOperationType type)
|
|
|
|
{
|
2020-12-19 23:30:09 +03:00
|
|
|
AddressInfo addressInfo = {
|
|
|
|
(int32_t)addr,
|
|
|
|
type == MemoryOperationType::ExecOpCode ? SnesMemoryType::DspProgramRom : SnesMemoryType::DspDataRom
|
|
|
|
};
|
|
|
|
MemoryOperationInfo operation{(uint32_t)addr, value, type};
|
|
|
|
|
|
|
|
if (type == MemoryOperationType::ExecOpCode)
|
|
|
|
{
|
|
|
|
if (_traceLogger->IsCpuLogged(CpuType::NecDsp) || _settings->CheckDebuggerFlag(
|
|
|
|
DebuggerFlags::NecDspDebuggerEnabled))
|
|
|
|
{
|
2020-02-23 21:50:55 -05:00
|
|
|
_disassembler->BuildCache(addressInfo, 0, CpuType::NecDsp);
|
|
|
|
|
2020-12-19 23:30:09 +03:00
|
|
|
if (_traceLogger->IsCpuLogged(CpuType::NecDsp))
|
|
|
|
{
|
2020-02-23 21:50:55 -05:00
|
|
|
DebugState debugState;
|
|
|
|
_debugger->GetState(debugState, true);
|
|
|
|
|
2020-05-18 16:10:53 -04:00
|
|
|
DisassemblyInfo disInfo = _disassembler->GetDisassemblyInfo(addressInfo, addr, 0, CpuType::NecDsp);
|
2020-02-23 21:50:55 -05:00
|
|
|
_traceLogger->Log(CpuType::NecDsp, debugState, disInfo);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_prevProgramCounter = addr;
|
|
|
|
|
2020-12-19 23:30:09 +03:00
|
|
|
if (_step->StepCount > 0)
|
|
|
|
{
|
2020-02-23 21:50:55 -05:00
|
|
|
_step->StepCount--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_debugger->ProcessBreakConditions(_step->StepCount == 0, GetBreakpointManager(), operation, addressInfo);
|
|
|
|
}
|
|
|
|
|
|
|
|
void NecDspDebugger::ProcessWrite(uint16_t addr, uint8_t value, MemoryOperationType type)
|
|
|
|
{
|
2020-12-19 23:30:09 +03:00
|
|
|
AddressInfo addressInfo{addr, SnesMemoryType::DspDataRam}; //Writes never affect the DSP ROM
|
|
|
|
MemoryOperationInfo operation{addr, value, type};
|
2020-02-23 21:50:55 -05:00
|
|
|
_debugger->ProcessBreakConditions(false, GetBreakpointManager(), operation, addressInfo);
|
|
|
|
}
|
|
|
|
|
|
|
|
void NecDspDebugger::Run()
|
|
|
|
{
|
|
|
|
_step.reset(new StepRequest());
|
|
|
|
}
|
|
|
|
|
|
|
|
void NecDspDebugger::Step(int32_t stepCount, StepType type)
|
|
|
|
{
|
|
|
|
StepRequest step;
|
|
|
|
|
2020-12-19 23:30:09 +03:00
|
|
|
switch (type)
|
|
|
|
{
|
|
|
|
case StepType::Step: step.StepCount = stepCount;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case StepType::StepOut:
|
|
|
|
case StepType::StepOver:
|
|
|
|
step.StepCount = 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case StepType::SpecificScanline:
|
|
|
|
case StepType::PpuStep:
|
|
|
|
break;
|
2020-02-23 21:50:55 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
_step.reset(new StepRequest(step));
|
|
|
|
}
|
|
|
|
|
|
|
|
shared_ptr<CallstackManager> NecDspDebugger::GetCallstackManager()
|
|
|
|
{
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
BreakpointManager* NecDspDebugger::GetBreakpointManager()
|
|
|
|
{
|
|
|
|
return _breakpointManager.get();
|
2020-12-19 23:30:09 +03:00
|
|
|
}
|