Mesen2/Core/WS/Debugger/WsTraceLogger.cpp
2024-09-19 21:19:43 +09:00

104 lines
No EOL
3.7 KiB
C++

#include "pch.h"
#include "WS/Debugger/WsTraceLogger.h"
#include "WS/WsPpu.h"
#include "WS/WsTypes.h"
#include "Debugger/DisassemblyInfo.h"
#include "Debugger/Debugger.h"
#include "Debugger/DebugTypes.h"
#include "Utilities/HexUtilities.h"
#include "Utilities/FastString.h"
WsTraceLogger::WsTraceLogger(Debugger* debugger, IDebugger* cpuDebugger, WsPpu* ppu) : BaseTraceLogger(debugger, cpuDebugger, CpuType::Ws)
{
_ppu = ppu;
}
RowDataType WsTraceLogger::GetFormatTagType(string& tag)
{
if(tag == "AX") {
return RowDataType::AX;
} else if(tag == "BX") {
return RowDataType::BX;
} else if(tag == "CX") {
return RowDataType::CX;
} else if(tag == "DX") {
return RowDataType::DX;
} else if(tag == "CS") {
return RowDataType::CS;
} else if(tag == "IP") {
return RowDataType::IP;
} else if(tag == "SS") {
return RowDataType::SS;
} else if(tag == "SP") {
return RowDataType::SP;
} else if(tag == "BP") {
return RowDataType::BP;
} else if(tag == "DS") {
return RowDataType::DS;
} else if(tag == "ES") {
return RowDataType::ES;
} else if(tag == "SI") {
return RowDataType::SI;
} else if(tag == "DI") {
return RowDataType::DI;
} else if(tag == "F") {
return RowDataType::F;
} else if(tag == "PC") {
return RowDataType::PC;
} else {
return RowDataType::Text;
}
}
void WsTraceLogger::GetTraceRow(string &output, WsCpuState &cpuState, TraceLogPpuState &ppuState, DisassemblyInfo &disassemblyInfo)
{
for(RowPart& rowPart : _rowParts) {
switch(rowPart.DataType) {
case RowDataType::AX: WriteIntValue(output, cpuState.AX, rowPart); break;
case RowDataType::BX: WriteIntValue(output, cpuState.BX, rowPart); break;
case RowDataType::CX: WriteIntValue(output, cpuState.CX, rowPart); break;
case RowDataType::DX: WriteIntValue(output, cpuState.DX, rowPart); break;
case RowDataType::CS: WriteIntValue(output, cpuState.CS, rowPart); break;
case RowDataType::IP: WriteIntValue(output, cpuState.IP, rowPart); break;
case RowDataType::SS: WriteIntValue(output, cpuState.SS, rowPart); break;
case RowDataType::SP: WriteIntValue(output, cpuState.SP, rowPart); break;
case RowDataType::BP: WriteIntValue(output, cpuState.BP, rowPart); break;
case RowDataType::DS: WriteIntValue(output, cpuState.DS, rowPart); break;
case RowDataType::ES: WriteIntValue(output, cpuState.ES, rowPart); break;
case RowDataType::SI: WriteIntValue(output, cpuState.SI, rowPart); break;
case RowDataType::DI: WriteIntValue(output, cpuState.DI, rowPart); break;
case RowDataType::F:
if(rowPart.DisplayInHex) {
WriteIntValue(output, cpuState.Flags.Get(), rowPart);
} else {
FastString flags;
bool showInactive = (rowPart.MinWidth > 0);
flags.Write(cpuState.Flags.Carry ? "C" : (showInactive ? "c" : ""));
flags.Write(cpuState.Flags.Parity ? "P" : (showInactive ? "p" : ""));
flags.Write(cpuState.Flags.AuxCarry ? "A" : (showInactive ? "a" : ""));
flags.Write(cpuState.Flags.Zero ? "Z" : (showInactive ? "z" : ""));
flags.Write(cpuState.Flags.Sign ? "S" : (showInactive ? "s" : ""));
flags.Write(cpuState.Flags.Trap ? "T" : (showInactive ? "t" : ""));
flags.Write(cpuState.Flags.Irq ? "I" : (showInactive ? "i" : ""));
flags.Write(cpuState.Flags.Direction ? "D" : (showInactive ? "d" : ""));
flags.Write(cpuState.Flags.Overflow ? "O" : (showInactive ? "o" : ""));
flags.Write(cpuState.Flags.Mode ? "M" : (showInactive ? "m" : ""));
WriteStringValue(output, flags.ToString(), rowPart);
}
break;
default: ProcessSharedTag(rowPart, output, cpuState, ppuState, disassemblyInfo); break;
}
}
}
void WsTraceLogger::LogPpuState()
{
_ppuState[_currentPos] = {
_ppu->GetCycle(),
_ppu->GetCycle(),
_ppu->GetScanline(),
_ppu->GetFrameCount()
};
}