Mesen2/Core/SMS/Debugger/SmsTraceLogger.cpp
2023-12-14 22:23:27 +09:00

108 lines
No EOL
4 KiB
C++

#include "pch.h"
#include "SMS/Debugger/SmsTraceLogger.h"
#include "SMS/SmsVdp.h"
#include "SMS/SmsTypes.h"
#include "Debugger/DisassemblyInfo.h"
#include "Debugger/Debugger.h"
#include "Debugger/DebugTypes.h"
#include "Utilities/HexUtilities.h"
SmsTraceLogger::SmsTraceLogger(Debugger* debugger, IDebugger* cpuDebugger, SmsVdp* vdp) : BaseTraceLogger(debugger, cpuDebugger, CpuType::Sms)
{
_vdp = vdp;
}
RowDataType SmsTraceLogger::GetFormatTagType(string& tag)
{
if(tag == "A") {
return RowDataType::A;
} else if(tag == "B") {
return RowDataType::B;
} else if(tag == "C") {
return RowDataType::C;
} else if(tag == "D") {
return RowDataType::D;
} else if(tag == "E") {
return RowDataType::E;
} else if(tag == "F") {
return RowDataType::F;
} else if(tag == "H") {
return RowDataType::H;
} else if(tag == "L") {
return RowDataType::L;
} else if(tag == "A'") {
return RowDataType::AltA;
} else if(tag == "B'") {
return RowDataType::AltB;
} else if(tag == "C'") {
return RowDataType::AltC;
} else if(tag == "D'") {
return RowDataType::AltD;
} else if(tag == "E'") {
return RowDataType::AltE;
} else if(tag == "F'") {
return RowDataType::AltF;
} else if(tag == "H'") {
return RowDataType::AltH;
} else if(tag == "L'") {
return RowDataType::AltL;
} else if(tag == "I") {
return RowDataType::I;
} else if(tag == "R") {
return RowDataType::R;
} else if(tag == "IX") {
return RowDataType::IX;
} else if(tag == "IY") {
return RowDataType::IY;
} else if(tag == "PS") {
return RowDataType::PS;
} else if(tag == "SP") {
return RowDataType::SP;
} else {
return RowDataType::Text;
}
}
void SmsTraceLogger::GetTraceRow(string &output, SmsCpuState &cpuState, TraceLogPpuState &vdpState, DisassemblyInfo &disassemblyInfo)
{
constexpr char activeStatusLetters[8] = { 'S', 'Z', '5', 'H', '3', 'P', 'N', 'C' };
constexpr char inactiveStatusLetters[8] = { 's', 'z', '-', 'h', '-', 'p', 'n', 'c' };
for(RowPart& rowPart : _rowParts) {
switch(rowPart.DataType) {
case RowDataType::A: WriteIntValue(output, cpuState.A, rowPart); break;
case RowDataType::B: WriteIntValue(output, cpuState.B, rowPart); break;
case RowDataType::C: WriteIntValue(output, cpuState.C, rowPart); break;
case RowDataType::D: WriteIntValue(output, cpuState.D, rowPart); break;
case RowDataType::E: WriteIntValue(output, cpuState.E, rowPart); break;
case RowDataType::F: WriteIntValue(output, cpuState.Flags, rowPart); break;
case RowDataType::H: WriteIntValue(output, cpuState.H, rowPart); break;
case RowDataType::L: WriteIntValue(output, cpuState.L, rowPart); break;
case RowDataType::I: WriteIntValue(output, cpuState.I, rowPart); break;
case RowDataType::R: WriteIntValue(output, cpuState.R, rowPart); break;
case RowDataType::AltA: WriteIntValue(output, cpuState.AltA, rowPart); break;
case RowDataType::AltB: WriteIntValue(output, cpuState.AltB, rowPart); break;
case RowDataType::AltC: WriteIntValue(output, cpuState.AltC, rowPart); break;
case RowDataType::AltD: WriteIntValue(output, cpuState.AltD, rowPart); break;
case RowDataType::AltE: WriteIntValue(output, cpuState.AltE, rowPart); break;
case RowDataType::AltF: WriteIntValue(output, cpuState.AltFlags, rowPart); break;
case RowDataType::AltH: WriteIntValue(output, cpuState.AltH, rowPart); break;
case RowDataType::AltL: WriteIntValue(output, cpuState.AltL, rowPart); break;
case RowDataType::IX: WriteIntValue(output, (uint16_t)(cpuState.IXL | (cpuState.IXH << 8)), rowPart); break;
case RowDataType::IY: WriteIntValue(output, (uint16_t)(cpuState.IYL | (cpuState.IYH << 8)), rowPart); break;
case RowDataType::SP: WriteIntValue(output, cpuState.SP, rowPart); break;
case RowDataType::PS: GetStatusFlag(activeStatusLetters, inactiveStatusLetters, output, cpuState.Flags, rowPart, 8); break;
default: ProcessSharedTag(rowPart, output, cpuState, vdpState, disassemblyInfo); break;
}
}
}
void SmsTraceLogger::LogPpuState()
{
_ppuState[_currentPos] = {
_vdp->GetCycle(),
_vdp->GetCycle(),
_vdp->GetScanline(),
_vdp->GetFrameCount()
};
}