Mesen2/Core/SNES/Debugger/TraceLogger/SpcTraceLogger.cpp
2022-09-08 21:29:52 -04:00

58 lines
No EOL
1.9 KiB
C++

#include "pch.h"
#include "SNES/Debugger/TraceLogger/SpcTraceLogger.h"
#include "SNES/SnesCpuTypes.h"
#include "SNES/SnesPpu.h"
#include "SNES/SnesMemoryManager.h"
#include "Debugger/DisassemblyInfo.h"
#include "Debugger/Debugger.h"
#include "Debugger/DebugTypes.h"
SpcTraceLogger::SpcTraceLogger(Debugger* debugger, IDebugger* cpuDebugger, SnesPpu* ppu, SnesMemoryManager* memoryManager) : BaseTraceLogger(debugger, cpuDebugger, CpuType::Spc)
{
_ppu = ppu;
_memoryManager = memoryManager;
}
RowDataType SpcTraceLogger::GetFormatTagType(string& tag)
{
if(tag == "A") {
return RowDataType::A;
} else if(tag == "X") {
return RowDataType::X;
} else if(tag == "Y") {
return RowDataType::Y;
} else if(tag == "P") {
return RowDataType::PS;
} else if(tag == "SP") {
return RowDataType::SP;
} else {
return RowDataType::Text;
}
}
void SpcTraceLogger::GetTraceRow(string &output, SpcState &cpuState, TraceLogPpuState &ppuState, DisassemblyInfo &disassemblyInfo)
{
constexpr char activeStatusLetters[8] = { 'N', 'V', 'P', 'B', 'H', 'I', 'Z', 'C' };
constexpr char inactiveStatusLetters[8] = { 'n', 'v', 'p', 'b', 'h', 'i', 'z', 'c' };
for(RowPart& rowPart : _rowParts) {
switch(rowPart.DataType) {
case RowDataType::A: WriteIntValue(output, cpuState.A, rowPart); break;
case RowDataType::X: WriteIntValue(output, cpuState.X, rowPart); break;
case RowDataType::Y: WriteIntValue(output, cpuState.Y, rowPart); break;
case RowDataType::SP: WriteIntValue(output, cpuState.SP, rowPart); break;
case RowDataType::PS: GetStatusFlag(activeStatusLetters, inactiveStatusLetters, output, cpuState.PS, rowPart); break;
default: ProcessSharedTag(rowPart, output, cpuState, ppuState, disassemblyInfo); break;
}
}
}
void SpcTraceLogger::LogPpuState()
{
_ppuState[_currentPos] = {
_ppu->GetCycle(),
_memoryManager->GetHClock(),
_ppu->GetScanline(),
_ppu->GetFrameCount()
};
}