project64/Source/Project64-rsp-core/cpu/RspLog.cpp

201 lines
5.3 KiB
C++

#include "RspLog.h"
#include "RSPRegisters.h"
#include <Common/File.h>
#include <Common/Log.h>
#include <Common/StdString.h>
#include <Common/path.h>
#include <Project64-rsp-core/RSPInfo.h>
#include <Project64-rsp-core/Settings/RspSettings.h>
#include <Settings/Settings.h>
CLog * RDPLog = nullptr;
CLog * CPULog = nullptr;
void StartCPULog(void)
{
if (CPULog != nullptr)
{
return;
}
char LogDir[260];
CPath LogFilePath(GetSystemSettingSz(Set_DirectoryLog, LogDir, sizeof(LogDir)), "RSP_x86Log.txt");
CPULog = new CLog;
if (CPULog != nullptr)
{
if (CPULog->Open(LogFilePath))
{
CPULog->SetMaxFileSize(300 * CLog::MB);
}
else
{
StopCPULog();
}
}
}
void StopCPULog(void)
{
if (CPULog != NULL)
{
delete CPULog;
CPULog = NULL;
}
}
void CPU_Message(const char * Message, ...)
{
if (CPULog == NULL)
{
return;
}
stdstr Msg;
va_list args;
va_start(args, Message);
Msg.ArgFormat(Message, args);
va_end(args);
Msg += "\r\n";
CPULog->Log(Msg.c_str());
}
void StartRDPLog(void)
{
if (RDPLog == nullptr && Set_DirectoryLog != 0)
{
char LogDir[260];
CPath LogFilePath(GetSystemSettingSz(Set_DirectoryLog, LogDir, sizeof(LogDir)), "RDP_Log.txt");
RDPLog = new CLog;
RDPLog->Open(LogFilePath);
RDPLog->SetMaxFileSize(400 * 1024 * 1024);
// RDPLog->SetFlush(true);
}
}
void StopRDPLog(void)
{
if (RDPLog != NULL)
{
delete RDPLog;
RDPLog = NULL;
}
}
void RDP_Message(const char * Message, ...)
{
if (RDPLog == NULL)
{
return;
}
stdstr Msg;
va_list args;
va_start(args, Message);
Msg.ArgFormat(Message, args);
va_end(args);
Msg += "\r\n";
RDPLog->Log(Msg.c_str());
}
void RDP_LogMT0(uint32_t PC, int Reg, uint32_t Value)
{
if (RDPLog == NULL)
{
return;
}
switch (Reg)
{
case 0: RDP_Message("%03X: Stored 0x%08X into SP_MEM_ADDR_REG", PC, Value); break;
case 1: RDP_Message("%03X: Stored 0x%08X into SP_DRAM_ADDR_REG", PC, Value); break;
case 2: RDP_Message("%03X: Stored 0x%08X into SP_RD_LEN_REG", PC, Value); break;
case 3: RDP_Message("%03X: Stored 0x%08X into SP_WR_LEN_REG", PC, Value); break;
case 4: RDP_Message("%03X: Stored 0x%08X into SP_STATUS_REG", PC, Value); break;
case 5: RDP_Message("%03X: Stored 0x%08X into Reg 5 ???", PC, Value); break;
case 6: RDP_Message("%03X: Stored 0x%08X into Reg 6 ???", PC, Value); break;
case 7: RDP_Message("%03X: Stored 0x%08X into SP_SEMAPHORE_REG", PC, Value); break;
case 8: RDP_Message("%03X: Stored 0x%08X into DPC_START_REG", PC, Value); break;
case 9: RDP_Message("%03X: Stored 0x%08X into DPC_END_REG", PC, Value); break;
case 10: RDP_Message("%03X: Stored 0x%08X into DPC_CURRENT_REG", PC, Value); break;
case 11: RDP_Message("%03X: Stored 0x%08X into DPC_STATUS_REG", PC, Value); break;
case 12: RDP_Message("%03X: Stored 0x%08X into DPC_CLOCK_REG", PC, Value); break;
}
}
void RDP_LogMF0(uint32_t PC, int Reg)
{
switch (Reg)
{
case 8: RDP_Message("%03X: Read 0x%08X from DPC_START_REG", PC, *RSPInfo.DPC_START_REG); break;
case 9: RDP_Message("%03X: Read 0x%08X from DPC_END_REG", PC, *RSPInfo.DPC_END_REG); break;
case 10: RDP_Message("%03X: Read 0x%08X from DPC_CURRENT_REG", PC, *RSPInfo.DPC_CURRENT_REG); break;
case 11: RDP_Message("%03X: Read 0x%08X from DPC_STATUS_REG", PC, *RSPInfo.DPC_STATUS_REG); break;
case 12: RDP_Message("%03X: Read 0x%08X from DPC_CLOCK_REG", PC, *RSPInfo.DPC_CLOCK_REG); break;
}
}
void RDP_LogDlist(void)
{
if (RDPLog == NULL)
{
return;
}
uint32_t Length = *RSPInfo.DPC_END_REG - *RSPInfo.DPC_CURRENT_REG;
RDP_Message(" Dlist length = %d bytes", Length);
uint32_t Pos = *RSPInfo.DPC_CURRENT_REG;
while (Pos < *RSPInfo.DPC_END_REG)
{
char Hex[100], Ascii[30];
uint32_t count;
memset(&Hex, 0, sizeof(Hex));
memset(&Ascii, 0, sizeof(Ascii));
uint8_t * Mem = RSPInfo.DMEM;
if ((*RSPInfo.DPC_STATUS_REG & DPC_STATUS_XBUS_DMEM_DMA) == 0)
{
Mem = RSPInfo.RDRAM;
}
for (count = 0; count < 0x10; count++, Pos++)
{
char tmp[3];
if ((count % 4) != 0 || count == 0)
{
sprintf(tmp, "%02X", Mem[Pos]);
strcat(Hex, " ");
strcat(Hex, tmp);
}
else
{
sprintf(tmp, "%02X", Mem[Pos]);
strcat(Hex, " - ");
strcat(Hex, tmp);
}
if (Mem[Pos] < 30 || Mem[Pos] > 127)
{
strcat(Ascii, ".");
}
else
{
sprintf(tmp, "%c", Mem[Pos]);
strcat(Ascii, tmp);
}
}
RDP_Message(" %s %s", Hex, Ascii);
}
}
void RDP_LogLoc(uint32_t /*PC*/)
{
// RDP_Message("%03X %08X %08X %08X %08X %08X %08X %08X %08X %08X %08X %08X %08X",PC, RSP_GPR[26].UW, *(uint32_t *)&RSPInfo.IMEM[0xDBC],
// RSP_Flags[0].UW, RSP_Vect[0].UW[0],RSP_Vect[0].UW[1],RSP_Vect[0].UW[2],RSP_Vect[0].UW[3],
// RSP_Vect[28].UW[0],RSP_Vect[28].UW[1],RSP_Vect[28].UW[2],RSP_Vect[28].UW[3],RSP_Vect[31].UW[0]);
}