[Project64] Separate out logging from UI
This commit is contained in:
parent
89fab66ab3
commit
9e744ef180
|
@ -0,0 +1,28 @@
|
|||
/****************************************************************************
|
||||
* *
|
||||
* Project64 - A Nintendo 64 emulator. *
|
||||
* http://www.pj64-emu.com/ *
|
||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||
* *
|
||||
* License: *
|
||||
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
|
||||
* *
|
||||
****************************************************************************/
|
||||
#pragma once
|
||||
#include <Project64\Settings\Logging Settings.h>
|
||||
#include <Common\File Class.h>
|
||||
|
||||
class CLogging :
|
||||
public CLogSettings
|
||||
{
|
||||
public:
|
||||
static void StartLog(void);
|
||||
static void StopLog(void);
|
||||
|
||||
static void Log_LW(uint32_t PC, uint32_t VAddr);
|
||||
static void Log_SW(uint32_t PC, uint32_t VAddr, uint32_t Value);
|
||||
static void LogMessage(const char * Message, ...);
|
||||
|
||||
private:
|
||||
static CFile * m_hLogFile;
|
||||
};
|
|
@ -9,7 +9,7 @@
|
|||
* *
|
||||
****************************************************************************/
|
||||
#include "stdafx.h"
|
||||
#include <Project64\User Interface\LoggingUI.h>
|
||||
#include <Project64\Logging.h>
|
||||
|
||||
bool DelaySlotEffectsCompare(uint32_t PC, uint32_t Reg1, uint32_t Reg2);
|
||||
|
||||
|
@ -950,7 +950,7 @@ void R4300iOp32::LW()
|
|||
ADDRESS_ERROR_EXCEPTION(Address, true);
|
||||
}
|
||||
|
||||
if (g_LogOptions.GenerateLog)
|
||||
if (GenerateLog())
|
||||
{
|
||||
Log_LW((*_PROGRAM_COUNTER), Address);
|
||||
}
|
||||
|
@ -1323,7 +1323,7 @@ void R4300iOp32::REGIMM_BGEZAL()
|
|||
/************************** COP0 functions **************************/
|
||||
void R4300iOp32::COP0_MF()
|
||||
{
|
||||
if (g_LogOptions.LogCP0reads)
|
||||
if (LogCP0reads())
|
||||
{
|
||||
LogMessage("%08X: R4300i Read from %s (0x%08X)", (*_PROGRAM_COUNTER), CRegName::Cop0[m_Opcode.rd], _CP0[m_Opcode.rd]);
|
||||
}
|
||||
|
@ -1337,7 +1337,7 @@ void R4300iOp32::COP0_MF()
|
|||
|
||||
void R4300iOp32::COP0_MT()
|
||||
{
|
||||
if (g_LogOptions.LogCP0changes)
|
||||
if (LogCP0changes())
|
||||
{
|
||||
LogMessage("%08X: Writing 0x%X to %s register (Originally: 0x%08X)", (*_PROGRAM_COUNTER), _GPR[m_Opcode.rt].UW[0], CRegName::Cop0[m_Opcode.rd], _CP0[m_Opcode.rd]);
|
||||
if (m_Opcode.rd == 11) //Compare
|
||||
|
|
|
@ -1114,7 +1114,7 @@ void R4300iOp::LW()
|
|||
ADDRESS_ERROR_EXCEPTION(Address, true);
|
||||
}
|
||||
|
||||
if (g_LogOptions.GenerateLog)
|
||||
if (GenerateLog())
|
||||
{
|
||||
Log_LW((*_PROGRAM_COUNTER), Address);
|
||||
}
|
||||
|
@ -1293,7 +1293,7 @@ void R4300iOp::SW()
|
|||
{
|
||||
ADDRESS_ERROR_EXCEPTION(Address, false);
|
||||
}
|
||||
if (g_LogOptions.GenerateLog)
|
||||
if (GenerateLog())
|
||||
{
|
||||
Log_SW((*_PROGRAM_COUNTER), Address, _GPR[m_Opcode.rt].UW[0]);
|
||||
}
|
||||
|
@ -1443,7 +1443,7 @@ void R4300iOp::SWR()
|
|||
|
||||
void R4300iOp::CACHE()
|
||||
{
|
||||
if (!g_LogOptions.LogCache)
|
||||
if (!LogCache())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -2089,7 +2089,7 @@ void R4300iOp::REGIMM_BGEZAL()
|
|||
/************************** COP0 functions **************************/
|
||||
void R4300iOp::COP0_MF()
|
||||
{
|
||||
if (g_LogOptions.LogCP0reads)
|
||||
if (LogCP0reads())
|
||||
{
|
||||
LogMessage("%08X: R4300i Read from %s (0x%08X)", (*_PROGRAM_COUNTER), CRegName::Cop0[m_Opcode.rd], _CP0[m_Opcode.rd]);
|
||||
}
|
||||
|
@ -2103,7 +2103,7 @@ void R4300iOp::COP0_MF()
|
|||
|
||||
void R4300iOp::COP0_MT()
|
||||
{
|
||||
if (g_LogOptions.LogCP0changes)
|
||||
if (LogCP0changes())
|
||||
{
|
||||
LogMessage("%08X: Writing 0x%X to %s register (Originally: 0x%08X)", (*_PROGRAM_COUNTER), _GPR[m_Opcode.rt].UW[0], CRegName::Cop0[m_Opcode.rd], _CP0[m_Opcode.rd]);
|
||||
if (m_Opcode.rd == 11) //Compare
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#pragma once
|
||||
|
||||
class R4300iOp :
|
||||
public CLogging,
|
||||
protected CDebugSettings,
|
||||
protected CSystemRegisters
|
||||
{
|
||||
|
|
|
@ -307,7 +307,7 @@ void CPifRam::SI_DMA_READ()
|
|||
}
|
||||
}
|
||||
|
||||
if (g_LogOptions.LogPRDMAMemStores)
|
||||
if (LogPRDMAMemStores())
|
||||
{
|
||||
int32_t count;
|
||||
char HexData[100], AsciiData[100], Addon[20];
|
||||
|
@ -393,7 +393,7 @@ void CPifRam::SI_DMA_WRITE()
|
|||
}
|
||||
}
|
||||
|
||||
if (g_LogOptions.LogPRDMAMemLoads)
|
||||
if (LogPRDMAMemLoads())
|
||||
{
|
||||
int32_t count;
|
||||
char HexData[100], AsciiData[100], Addon[20];
|
||||
|
@ -504,7 +504,7 @@ void CPifRam::ProcessControllerCommand(int Control, BYTE * Command)
|
|||
}
|
||||
break;
|
||||
case 0x02: //read from controller pack
|
||||
if (g_LogOptions.LogControllerPak)
|
||||
if (LogControllerPak())
|
||||
{
|
||||
LogControllerPakData("Read: Before Gettting Results");
|
||||
}
|
||||
|
@ -540,13 +540,13 @@ void CPifRam::ProcessControllerCommand(int Control, BYTE * Command)
|
|||
{
|
||||
Command[1] |= 0x80;
|
||||
}
|
||||
if (g_LogOptions.LogControllerPak)
|
||||
if (LogControllerPak())
|
||||
{
|
||||
LogControllerPakData("Read: After Gettting Results");
|
||||
}
|
||||
break;
|
||||
case 0x03: //write controller pak
|
||||
if (g_LogOptions.LogControllerPak)
|
||||
if (LogControllerPak())
|
||||
{
|
||||
LogControllerPakData("Write: Before Processing");
|
||||
}
|
||||
|
@ -580,7 +580,7 @@ void CPifRam::ProcessControllerCommand(int Control, BYTE * Command)
|
|||
{
|
||||
Command[1] |= 0x80;
|
||||
}
|
||||
if (g_LogOptions.LogControllerPak)
|
||||
if (LogControllerPak())
|
||||
{
|
||||
LogControllerPakData("Write: After Processing");
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
****************************************************************************/
|
||||
#pragma once
|
||||
|
||||
#include <Project64\Logging.h>
|
||||
class CPifRamSettings
|
||||
{
|
||||
protected:
|
||||
|
@ -31,6 +32,7 @@ private:
|
|||
};
|
||||
|
||||
class CPifRam :
|
||||
public CLogging,
|
||||
private CPifRamSettings,
|
||||
private CEeprom
|
||||
{
|
||||
|
|
|
@ -452,7 +452,7 @@ bool CRegisters::DoIntrException(bool DelaySlot)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (g_LogOptions.GenerateLog && g_LogOptions.LogExceptions && !g_LogOptions.NoInterrupts)
|
||||
if (GenerateLog() && LogExceptions() && !LogNoInterrupts())
|
||||
{
|
||||
LogMessage("%08X: Interrupt Generated", m_PROGRAM_COUNTER);
|
||||
}
|
||||
|
|
|
@ -11,6 +11,8 @@
|
|||
#pragma once
|
||||
|
||||
#include <Project64\Settings\Game Settings.h>
|
||||
#include <Project64\Logging.h>
|
||||
|
||||
//CPO registers by name
|
||||
class CP0registers
|
||||
{
|
||||
|
@ -516,6 +518,7 @@ class CN64System;
|
|||
class CSystemEvents;
|
||||
|
||||
class CRegisters :
|
||||
public CLogging,
|
||||
private CDebugSettings,
|
||||
private CGameSettings,
|
||||
protected CSystemRegisters,
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
* *
|
||||
****************************************************************************/
|
||||
#include "stdafx.h"
|
||||
#include <Project64\User Interface\LoggingUI.h>
|
||||
|
||||
#pragma warning(disable:4355) // Disable 'this' : used in base member initializer list
|
||||
|
||||
|
@ -276,8 +275,6 @@ void CN64System::StartEmulation2(bool NewThread)
|
|||
WriteTrace(TraceDebug, __FUNCTION__ ": Starting");
|
||||
if (bHaveDebugger())
|
||||
{
|
||||
g_LogOptions.GenerateLog = g_Settings->LoadBool(Debugger_GenerateDebugLog);
|
||||
LoadLogOptions(&g_LogOptions, FALSE);
|
||||
StartLog();
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <Common/SyncEvent.h>
|
||||
#include <Project64\Logging.h>
|
||||
|
||||
typedef std::list<SystemEvent> EVENT_LIST;
|
||||
|
||||
|
@ -23,6 +24,7 @@ class CRecompiler;
|
|||
//#define TEST_SP_TRACKING //track the SP to make sure all ops pick it up fine
|
||||
|
||||
class CN64System :
|
||||
public CLogging,
|
||||
public CMipsMemory_CallBack,
|
||||
public CTLB_CB,
|
||||
private CSystemEvents,
|
||||
|
|
|
@ -188,6 +188,10 @@
|
|||
RelativePath="Settings\Gui Settings.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Settings\Logging Settings.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="Settings\N64System Settings.cpp"
|
||||
>
|
||||
|
@ -300,6 +304,10 @@
|
|||
RelativePath="User Interface\Gui Class.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\User Interface\LoggingUI.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="User Interface\Main Menu Class.cpp"
|
||||
>
|
||||
|
@ -840,6 +848,10 @@
|
|||
RelativePath="Settings\Gui Settings.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Settings\Logging Settings.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="Settings\N64System Settings.h"
|
||||
>
|
||||
|
@ -960,6 +972,10 @@
|
|||
RelativePath="User Interface\Log Class.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\User Interface\LoggingUI.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="User Interface\Main Menu Class.h"
|
||||
>
|
||||
|
|
|
@ -44,10 +44,12 @@
|
|||
</Manifest>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="logging.cpp" />
|
||||
<ClCompile Include="main.cpp" />
|
||||
<ClCompile Include="Multilanguage\LanguageSelector.cpp" />
|
||||
<ClCompile Include="N64 System\Mips\Rumblepak.cpp" />
|
||||
<ClCompile Include="Plugins\Plugin Base.cpp" />
|
||||
<ClCompile Include="Settings\Logging Settings.cpp" />
|
||||
<ClCompile Include="stdafx.cpp">
|
||||
<PrecompiledHeader>Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
|
@ -176,12 +178,14 @@
|
|||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Logging.h" />
|
||||
<ClInclude Include="Multilanguage.h" />
|
||||
<ClInclude Include="Multilanguage\LanguageSelector.h" />
|
||||
<ClInclude Include="N64 System.h" />
|
||||
<ClInclude Include="N64 System\Mips\Rumblepak.h" />
|
||||
<ClInclude Include="Plugin.h" />
|
||||
<ClInclude Include="Plugins\Plugin Base.h" />
|
||||
<ClInclude Include="Settings\Logging Settings.h" />
|
||||
<ClInclude Include="Settings\Settings.h" />
|
||||
<ClInclude Include="stdafx.h" />
|
||||
<ClInclude Include="User Interface.h" />
|
||||
|
|
|
@ -420,6 +420,12 @@
|
|||
<ClCompile Include="User Interface\LoggingUI.cpp">
|
||||
<Filter>Source Files\User Interface Source</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="logging.cpp">
|
||||
<Filter>Source Files\N64 System Source</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Settings\Logging Settings.cpp">
|
||||
<Filter>Source Files\N64 System Source</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="User Interface\Icons\left.ico">
|
||||
|
@ -833,5 +839,11 @@
|
|||
<ClInclude Include="User Interface\LoggingUI.h">
|
||||
<Filter>Header Files\User Interface Headers</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Logging.h">
|
||||
<Filter>Header Files\N64 System Headers</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Settings\Logging Settings.h">
|
||||
<Filter>Header Files\Settings Headers</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -0,0 +1,135 @@
|
|||
/****************************************************************************
|
||||
* *
|
||||
* Project64 - A Nintendo 64 emulator. *
|
||||
* http://www.pj64-emu.com/ *
|
||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||
* *
|
||||
* License: *
|
||||
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
|
||||
* *
|
||||
****************************************************************************/
|
||||
#include "stdafx.h"
|
||||
#include "Logging Settings.h"
|
||||
|
||||
int CLogSettings::m_RefCount = 0;
|
||||
bool CLogSettings::m_GenerateLog = 0;
|
||||
bool CLogSettings::m_LogRDRamRegisters = 0;
|
||||
bool CLogSettings::m_LogSPRegisters = 0;
|
||||
bool CLogSettings::m_LogDPCRegisters = 0;
|
||||
bool CLogSettings::m_LogDPSRegisters = 0;
|
||||
bool CLogSettings::m_LogMIPSInterface = 0;
|
||||
bool CLogSettings::m_LogVideoInterface = 0;
|
||||
bool CLogSettings::m_LogAudioInterface = 0;
|
||||
bool CLogSettings::m_LogPerInterface = 0;
|
||||
bool CLogSettings::m_LogRDRAMInterface = 0;
|
||||
bool CLogSettings::m_LogSerialInterface = 0;
|
||||
bool CLogSettings::m_LogPRDMAOperations = 0;
|
||||
bool CLogSettings::m_LogPRDirectMemLoads = 0;
|
||||
bool CLogSettings::m_LogPRDMAMemLoads = 0;
|
||||
bool CLogSettings::m_LogPRDirectMemStores = 0;
|
||||
bool CLogSettings::m_LogPRDMAMemStores = 0;
|
||||
bool CLogSettings::m_LogControllerPak = 0;
|
||||
bool CLogSettings::m_LogCP0changes = 0;
|
||||
bool CLogSettings::m_LogCP0reads = 0;
|
||||
bool CLogSettings::m_LogTLB = 0;
|
||||
bool CLogSettings::m_LogExceptions = 0;
|
||||
bool CLogSettings::m_NoInterrupts = 0;
|
||||
bool CLogSettings::m_LogCache = 0;
|
||||
bool CLogSettings::m_LogRomHeader = 0;
|
||||
bool CLogSettings::m_LogUnknown = 0;
|
||||
|
||||
CLogSettings::CLogSettings()
|
||||
{
|
||||
m_RefCount += 1;
|
||||
if (m_RefCount == 1)
|
||||
{
|
||||
g_Settings->RegisterChangeCB(Logging_GenerateLog, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogRDRamRegisters, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogSPRegisters, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogDPCRegisters, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogDPSRegisters, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogMIPSInterface, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogVideoInterface, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogAudioInterface, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogPerInterface, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogRDRAMInterface, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogSerialInterface, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogPRDMAOperations, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogPRDirectMemLoads, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogPRDMAMemLoads, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogPRDirectMemStores, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogPRDMAMemStores, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogControllerPak, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogCP0changes, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogCP0reads, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogTLB, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogExceptions, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_NoInterrupts, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogCache, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogRomHeader, NULL, RefreshSettings);
|
||||
g_Settings->RegisterChangeCB(Logging_LogUnknown, NULL, RefreshSettings);
|
||||
RefreshSettings(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
CLogSettings::~CLogSettings()
|
||||
{
|
||||
m_RefCount -= 1;
|
||||
if (m_RefCount == 0)
|
||||
{
|
||||
g_Settings->UnregisterChangeCB(Logging_GenerateLog, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogRDRamRegisters, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogSPRegisters, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogDPCRegisters, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogDPSRegisters, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogMIPSInterface, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogVideoInterface, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogAudioInterface, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogPerInterface, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogRDRAMInterface, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogSerialInterface, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogPRDMAOperations, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogPRDirectMemLoads, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogPRDMAMemLoads, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogPRDirectMemStores, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogPRDMAMemStores, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogControllerPak, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogCP0changes, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogCP0reads, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogTLB, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogExceptions, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_NoInterrupts, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogCache, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogRomHeader, NULL, RefreshSettings);
|
||||
g_Settings->UnregisterChangeCB(Logging_LogUnknown, NULL, RefreshSettings);
|
||||
}
|
||||
}
|
||||
|
||||
void CLogSettings::RefreshSettings(void *)
|
||||
{
|
||||
m_GenerateLog = g_Settings->LoadBool(Logging_GenerateLog);
|
||||
m_LogRDRamRegisters = g_Settings->LoadBool(Logging_LogRDRamRegisters);
|
||||
m_LogSPRegisters = g_Settings->LoadBool(Logging_LogSPRegisters);
|
||||
m_LogDPCRegisters = g_Settings->LoadBool(Logging_LogDPCRegisters);
|
||||
m_LogDPSRegisters = g_Settings->LoadBool(Logging_LogDPSRegisters);
|
||||
m_LogMIPSInterface = g_Settings->LoadBool(Logging_LogMIPSInterface);
|
||||
m_LogVideoInterface = g_Settings->LoadBool(Logging_LogVideoInterface);
|
||||
m_LogAudioInterface = g_Settings->LoadBool(Logging_LogAudioInterface);
|
||||
m_LogPerInterface = g_Settings->LoadBool(Logging_LogPerInterface);
|
||||
m_LogRDRAMInterface = g_Settings->LoadBool(Logging_LogRDRAMInterface);
|
||||
m_LogSerialInterface = g_Settings->LoadBool(Logging_LogSerialInterface);
|
||||
m_LogPRDMAOperations = g_Settings->LoadBool(Logging_LogPRDMAOperations);
|
||||
m_LogPRDirectMemLoads = g_Settings->LoadBool(Logging_LogPRDirectMemLoads);
|
||||
m_LogPRDMAMemLoads = g_Settings->LoadBool(Logging_LogPRDMAMemLoads);
|
||||
m_LogPRDirectMemStores = g_Settings->LoadBool(Logging_LogPRDirectMemStores);
|
||||
m_LogPRDMAMemStores = g_Settings->LoadBool(Logging_LogPRDMAMemStores);
|
||||
m_LogControllerPak = g_Settings->LoadBool(Logging_LogControllerPak);
|
||||
m_LogCP0changes = g_Settings->LoadBool(Logging_LogCP0changes);
|
||||
m_LogCP0reads = g_Settings->LoadBool(Logging_LogCP0reads);
|
||||
m_LogTLB = g_Settings->LoadBool(Logging_LogTLB);
|
||||
m_LogExceptions = g_Settings->LoadBool(Logging_LogExceptions);
|
||||
m_NoInterrupts = g_Settings->LoadBool(Logging_NoInterrupts);
|
||||
m_LogCache = g_Settings->LoadBool(Logging_LogCache);
|
||||
m_LogRomHeader = g_Settings->LoadBool(Logging_LogRomHeader);
|
||||
m_LogUnknown = g_Settings->LoadBool(Logging_LogUnknown);
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
/****************************************************************************
|
||||
* *
|
||||
* Project 64 - A Nintendo 64 emulator. *
|
||||
* http://www.pj64-emu.com/ *
|
||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||
* *
|
||||
* License: *
|
||||
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
|
||||
* *
|
||||
****************************************************************************/
|
||||
#pragma once
|
||||
|
||||
class CLogSettings
|
||||
{
|
||||
public:
|
||||
CLogSettings();
|
||||
virtual ~CLogSettings();
|
||||
|
||||
inline static bool GenerateLog ( void ) { return m_GenerateLog; }
|
||||
|
||||
/* Registers Log */
|
||||
inline static bool LogRDRamRegisters ( void ) { return m_LogRDRamRegisters; }
|
||||
inline static bool LogSPRegisters ( void ) { return m_LogSPRegisters; }
|
||||
inline static bool LogDPCRegisters ( void ) { return m_LogDPCRegisters; }
|
||||
inline static bool LogDPSRegisters ( void ) { return m_LogDPSRegisters; }
|
||||
inline static bool LogMIPSInterface ( void ) { return m_LogMIPSInterface; }
|
||||
inline static bool LogVideoInterface ( void ) { return m_LogVideoInterface; }
|
||||
inline static bool LogAudioInterface ( void ) { return m_LogAudioInterface; }
|
||||
inline static bool LogPerInterface ( void ) { return m_LogPerInterface; }
|
||||
inline static bool LogRDRAMInterface ( void ) { return m_LogRDRAMInterface; }
|
||||
inline static bool LogSerialInterface ( void ) { return m_LogSerialInterface; }
|
||||
|
||||
/* Pif Ram Log */
|
||||
inline static bool LogPRDMAOperations ( void ) { return m_LogPRDMAOperations; }
|
||||
inline static bool LogPRDirectMemLoads ( void ) { return m_LogPRDirectMemLoads; }
|
||||
inline static bool LogPRDMAMemLoads ( void ) { return m_LogPRDMAMemLoads; }
|
||||
inline static bool LogPRDirectMemStores ( void ) { return m_LogPRDirectMemStores; }
|
||||
inline static bool LogPRDMAMemStores ( void ) { return m_LogPRDMAMemStores; }
|
||||
inline static bool LogControllerPak ( void ) { return m_LogControllerPak; }
|
||||
|
||||
/* Special Log */
|
||||
inline static bool LogCP0changes ( void ) { return m_LogCP0changes; }
|
||||
inline static bool LogCP0reads ( void ) { return m_LogCP0reads; }
|
||||
inline static bool LogTLB ( void ) { return m_LogTLB; }
|
||||
inline static bool LogExceptions ( void ) { return m_LogExceptions; }
|
||||
inline static bool LogNoInterrupts ( void ) { return m_NoInterrupts; }
|
||||
inline static bool LogCache ( void ) { return m_LogCache; }
|
||||
inline static bool LogRomHeader ( void ) { return m_LogRomHeader; }
|
||||
inline static bool LogUnknown ( void ) { return m_LogUnknown; }
|
||||
|
||||
private:
|
||||
static void RefreshSettings ( void * );
|
||||
|
||||
static bool m_GenerateLog;
|
||||
|
||||
/* Registers Log */
|
||||
static bool m_LogRDRamRegisters;
|
||||
static bool m_LogSPRegisters;
|
||||
static bool m_LogDPCRegisters;
|
||||
static bool m_LogDPSRegisters;
|
||||
static bool m_LogMIPSInterface;
|
||||
static bool m_LogVideoInterface;
|
||||
static bool m_LogAudioInterface;
|
||||
static bool m_LogPerInterface;
|
||||
static bool m_LogRDRAMInterface;
|
||||
static bool m_LogSerialInterface;
|
||||
|
||||
/* Pif Ram Log */
|
||||
static bool m_LogPRDMAOperations;
|
||||
static bool m_LogPRDirectMemLoads;
|
||||
static bool m_LogPRDMAMemLoads;
|
||||
static bool m_LogPRDirectMemStores;
|
||||
static bool m_LogPRDMAMemStores;
|
||||
static bool m_LogControllerPak;
|
||||
|
||||
/* Special Log */
|
||||
static bool m_LogCP0changes;
|
||||
static bool m_LogCP0reads;
|
||||
static bool m_LogTLB;
|
||||
static bool m_LogExceptions;
|
||||
static bool m_NoInterrupts;
|
||||
static bool m_LogCache;
|
||||
static bool m_LogRomHeader;
|
||||
static bool m_LogUnknown;
|
||||
|
||||
static int32_t m_RefCount;
|
||||
};
|
|
@ -305,7 +305,6 @@ void CSettings::AddHowToHandleSetting()
|
|||
AddHandler(Debugger_ShowDListAListCount, new CSettingTypeApplication("Debugger", "Show Dlist Alist Count", false));
|
||||
AddHandler(Debugger_ShowRecompMemSize, new CSettingTypeApplication("Debugger", "Show Recompiler Memory size", false));
|
||||
AddHandler(Debugger_ShowDivByZero, new CSettingTypeApplication("Debugger", "Show Div by zero", false));
|
||||
AddHandler(Debugger_GenerateDebugLog, new CSettingTypeApplication("Debugger", "Generate Debug Code", false));
|
||||
AddHandler(Debugger_ProfileCode, new CSettingTypeApplication("Debugger", "Profile Code", (uint32_t)false));
|
||||
AddHandler(Debugger_AppLogLevel, new CSettingTypeApplication("Logging", "Log Level", (uint32_t)TraceError));
|
||||
AddHandler(Debugger_AppLogFlush, new CSettingTypeApplication("Logging", "Log Auto Flush", (uint32_t)false));
|
||||
|
@ -325,6 +324,33 @@ void CSettings::AddHowToHandleSetting()
|
|||
AddHandler(Plugin_UseHleGfx, new CSettingTypeApplication("RSP", "HLE GFX", true));
|
||||
AddHandler(Plugin_UseHleAudio, new CSettingTypeApplication("RSP", "HLE Audio", false));
|
||||
|
||||
//Logging
|
||||
AddHandler(Logging_GenerateLog, new CSettingTypeApplication("Logging", "Generate Log Files", false));
|
||||
AddHandler(Logging_LogRDRamRegisters, new CSettingTypeApplication("Logging", "Log RDRam Registers", false));
|
||||
AddHandler(Logging_LogSPRegisters, new CSettingTypeApplication("Logging", "Log SP Registers", false));
|
||||
AddHandler(Logging_LogDPCRegisters, new CSettingTypeApplication("Logging", "Log DPC Registers", false));
|
||||
AddHandler(Logging_LogDPSRegisters, new CSettingTypeApplication("Logging", "Log DPS Registers", false));
|
||||
AddHandler(Logging_LogMIPSInterface, new CSettingTypeApplication("Logging", "Log MIPS Interface", false));
|
||||
AddHandler(Logging_LogVideoInterface, new CSettingTypeApplication("Logging", "Log Video Interface", false));
|
||||
AddHandler(Logging_LogAudioInterface, new CSettingTypeApplication("Logging", "Log Audio Interface", false));
|
||||
AddHandler(Logging_LogPerInterface, new CSettingTypeApplication("Logging", "Log Per Interface", false));
|
||||
AddHandler(Logging_LogRDRAMInterface, new CSettingTypeApplication("Logging", "Log RDRAM Interface", false));
|
||||
AddHandler(Logging_LogSerialInterface, new CSettingTypeApplication("Logging", "Log Serial Interface", false));
|
||||
AddHandler(Logging_LogPRDMAOperations, new CSettingTypeApplication("Logging", "Log PR DMA Operations", false));
|
||||
AddHandler(Logging_LogPRDirectMemLoads, new CSettingTypeApplication("Logging", "Log PR Direct Mem Loads", false));
|
||||
AddHandler(Logging_LogPRDMAMemLoads, new CSettingTypeApplication("Logging", "Log PR DMA Mem Loads", false));
|
||||
AddHandler(Logging_LogPRDirectMemStores, new CSettingTypeApplication("Logging", "Log PR Direct Mem Stores", false));
|
||||
AddHandler(Logging_LogPRDMAMemStores, new CSettingTypeApplication("Logging", "Log PRDMA Mem Stores", false));
|
||||
AddHandler(Logging_LogControllerPak, new CSettingTypeApplication("Logging", "Log Controller Pak", false));
|
||||
AddHandler(Logging_LogCP0changes, new CSettingTypeApplication("Logging", "Log CP0 changes", false));
|
||||
AddHandler(Logging_LogCP0reads, new CSettingTypeApplication("Logging", "Log CP0 reads", false));
|
||||
AddHandler(Logging_LogTLB, new CSettingTypeApplication("Logging", "Log TLB", false));
|
||||
AddHandler(Logging_LogExceptions, new CSettingTypeApplication("Logging", "Log Exceptions", false));
|
||||
AddHandler(Logging_NoInterrupts, new CSettingTypeApplication("Logging", "No Interrupts", false));
|
||||
AddHandler(Logging_LogCache, new CSettingTypeApplication("Logging", "Log Cache", false));
|
||||
AddHandler(Logging_LogRomHeader, new CSettingTypeApplication("Logging", "Generate Log Files", false));
|
||||
AddHandler(Logging_LogUnknown, new CSettingTypeApplication("Logging", "Log Rom Header", false));
|
||||
|
||||
// cheats
|
||||
AddHandler(Cheat_Entry, new CSettingTypeCheats(""));
|
||||
AddHandler(Cheat_Active, new CSettingTypeGameIndex("Cheat", "", (uint32_t)false));
|
||||
|
|
|
@ -229,7 +229,6 @@ enum SettingID
|
|||
Debugger_DisableGameFixes,
|
||||
Debugger_AppLogLevel,
|
||||
Debugger_AppLogFlush,
|
||||
Debugger_GenerateDebugLog,
|
||||
Debugger_ShowDListAListCount,
|
||||
Debugger_ShowRecompMemSize,
|
||||
|
||||
|
@ -245,6 +244,32 @@ enum SettingID
|
|||
Plugin_UseHleGfx,
|
||||
Plugin_UseHleAudio,
|
||||
|
||||
Logging_GenerateLog,
|
||||
Logging_LogRDRamRegisters,
|
||||
Logging_LogSPRegisters,
|
||||
Logging_LogDPCRegisters,
|
||||
Logging_LogDPSRegisters,
|
||||
Logging_LogMIPSInterface,
|
||||
Logging_LogVideoInterface,
|
||||
Logging_LogAudioInterface,
|
||||
Logging_LogPerInterface,
|
||||
Logging_LogRDRAMInterface,
|
||||
Logging_LogSerialInterface,
|
||||
Logging_LogPRDMAOperations,
|
||||
Logging_LogPRDirectMemLoads,
|
||||
Logging_LogPRDMAMemLoads,
|
||||
Logging_LogPRDirectMemStores,
|
||||
Logging_LogPRDMAMemStores,
|
||||
Logging_LogControllerPak,
|
||||
Logging_LogCP0changes,
|
||||
Logging_LogCP0reads,
|
||||
Logging_LogTLB,
|
||||
Logging_LogExceptions,
|
||||
Logging_NoInterrupts,
|
||||
Logging_LogCache,
|
||||
Logging_LogRomHeader,
|
||||
Logging_LogUnknown,
|
||||
|
||||
//Cheats
|
||||
Cheat_Entry,
|
||||
Cheat_Active,
|
||||
|
|
|
@ -9,24 +9,19 @@
|
|||
* *
|
||||
****************************************************************************/
|
||||
#include "stdafx.h"
|
||||
#include "LoggingUI.h"
|
||||
|
||||
#include <Project64\Logging.h>
|
||||
#include <Project64\Settings\Logging Settings.h>
|
||||
#include <prsht.h>
|
||||
|
||||
void LoadLogSetting(HKEY hKey, char * String, bool * Value);
|
||||
void SaveLogOptions(void);
|
||||
|
||||
LRESULT CALLBACK LogGeneralProc(HWND, UINT, WPARAM, LPARAM);
|
||||
LRESULT CALLBACK LogPifProc(HWND, UINT, WPARAM, LPARAM);
|
||||
LRESULT CALLBACK LogRegProc(HWND, UINT, WPARAM, LPARAM);
|
||||
|
||||
static HANDLE g_hLogFile = NULL;
|
||||
LOG_OPTIONS g_LogOptions, TempOptions;
|
||||
|
||||
void EnterLogOptions(HWND hwndOwner)
|
||||
{
|
||||
PROPSHEETPAGE psp[3];
|
||||
PROPSHEETHEADER psh;
|
||||
CLogSettings logSettings;
|
||||
|
||||
psp[0].dwSize = sizeof(PROPSHEETPAGE);
|
||||
psp[0].dwFlags = PSP_USETITLE;
|
||||
|
@ -34,7 +29,7 @@ void EnterLogOptions(HWND hwndOwner)
|
|||
psp[0].pszTemplate = MAKEINTRESOURCE(IDD_Logging_Registers);
|
||||
psp[0].pfnDlgProc = (DLGPROC)LogRegProc;
|
||||
psp[0].pszTitle = "Registers";
|
||||
psp[0].lParam = 0;
|
||||
psp[0].lParam = (LPARAM)&logSettings;
|
||||
psp[0].pfnCallback = NULL;
|
||||
|
||||
psp[1].dwSize = sizeof(PROPSHEETPAGE);
|
||||
|
@ -43,7 +38,7 @@ void EnterLogOptions(HWND hwndOwner)
|
|||
psp[1].pszTemplate = MAKEINTRESOURCE(IDD_Logging_PifRam);
|
||||
psp[1].pfnDlgProc = (DLGPROC)LogPifProc;
|
||||
psp[1].pszTitle = "Pif Ram";
|
||||
psp[1].lParam = 0;
|
||||
psp[1].lParam = (LPARAM)&logSettings;
|
||||
psp[1].pfnCallback = NULL;
|
||||
|
||||
psp[2].dwSize = sizeof(PROPSHEETPAGE);
|
||||
|
@ -52,7 +47,7 @@ void EnterLogOptions(HWND hwndOwner)
|
|||
psp[2].pszTemplate = MAKEINTRESOURCE(IDD_Logging_General);
|
||||
psp[2].pfnDlgProc = (DLGPROC)LogGeneralProc;
|
||||
psp[2].pszTitle = "General";
|
||||
psp[2].lParam = 0;
|
||||
psp[2].lParam = (LPARAM)&logSettings;
|
||||
psp[2].pfnCallback = NULL;
|
||||
|
||||
psh.dwSize = sizeof(PROPSHEETHEADER);
|
||||
|
@ -65,129 +60,36 @@ void EnterLogOptions(HWND hwndOwner)
|
|||
psh.ppsp = (LPCPROPSHEETPAGE)&psp;
|
||||
psh.pfnCallback = NULL;
|
||||
|
||||
LoadLogOptions(&TempOptions, TRUE);
|
||||
#if defined(WINDOWS_UI)
|
||||
PropertySheet(&psh);
|
||||
#else
|
||||
g_Notify -> BreakPoint(__FILEW__, __LINE__);
|
||||
#endif
|
||||
SaveLogOptions();
|
||||
LoadLogOptions(&g_LogOptions, FALSE);
|
||||
return;
|
||||
}
|
||||
|
||||
void LoadLogOptions(LOG_OPTIONS * LogOptions, bool AlwaysFill)
|
||||
{
|
||||
int32_t lResult;
|
||||
HKEY hKeyResults = 0;
|
||||
char String[200];
|
||||
|
||||
sprintf(String, "Software\\N64 Emulation\\%s\\Logging", g_Settings->LoadStringVal(Setting_ApplicationName).c_str());
|
||||
lResult = RegOpenKeyEx(HKEY_CURRENT_USER, String, 0, KEY_ALL_ACCESS,
|
||||
&hKeyResults);
|
||||
|
||||
if (lResult == ERROR_SUCCESS)
|
||||
{
|
||||
//LoadLogSetting(hKeyResults,"Generate Log File",&LogOptions->GenerateLog);
|
||||
if (LogOptions->GenerateLog || AlwaysFill)
|
||||
{
|
||||
LoadLogSetting(hKeyResults, "Log RDRAM", &LogOptions->LogRDRamRegisters);
|
||||
LoadLogSetting(hKeyResults, "Log SP", &LogOptions->LogSPRegisters);
|
||||
LoadLogSetting(hKeyResults, "Log DP Command", &LogOptions->LogDPCRegisters);
|
||||
LoadLogSetting(hKeyResults, "Log DP Span", &LogOptions->LogDPSRegisters);
|
||||
LoadLogSetting(hKeyResults, "Log MIPS Interface (MI)", &LogOptions->LogMIPSInterface);
|
||||
LoadLogSetting(hKeyResults, "Log Video Interface (VI)", &LogOptions->LogVideoInterface);
|
||||
LoadLogSetting(hKeyResults, "Log Audio Interface (AI)", &LogOptions->LogAudioInterface);
|
||||
LoadLogSetting(hKeyResults, "Log Peripheral Interface (PI)", &LogOptions->LogPerInterface);
|
||||
LoadLogSetting(hKeyResults, "Log RDRAM Interface (RI)", &LogOptions->LogRDRAMInterface);
|
||||
LoadLogSetting(hKeyResults, "Log Serial Interface (SI)", &LogOptions->LogSerialInterface);
|
||||
LoadLogSetting(hKeyResults, "Log PifRam DMA Operations", &LogOptions->LogPRDMAOperations);
|
||||
LoadLogSetting(hKeyResults, "Log PifRam Direct Memory Loads", &LogOptions->LogPRDirectMemLoads);
|
||||
LoadLogSetting(hKeyResults, "Log PifRam DMA Memory Loads", &LogOptions->LogPRDMAMemLoads);
|
||||
LoadLogSetting(hKeyResults, "Log PifRam Direct Memory Stores", &LogOptions->LogPRDirectMemStores);
|
||||
LoadLogSetting(hKeyResults, "Log PifRam DMA Memory Stores", &LogOptions->LogPRDMAMemStores);
|
||||
LoadLogSetting(hKeyResults, "Log Controller Pak", &LogOptions->LogControllerPak);
|
||||
LoadLogSetting(hKeyResults, "Log CP0 changes", &LogOptions->LogCP0changes);
|
||||
LoadLogSetting(hKeyResults, "Log CP0 reads", &LogOptions->LogCP0reads);
|
||||
LoadLogSetting(hKeyResults, "Log Exceptions", &LogOptions->LogExceptions);
|
||||
LoadLogSetting(hKeyResults, "No Interrupts", &LogOptions->NoInterrupts);
|
||||
LoadLogSetting(hKeyResults, "Log TLB", &LogOptions->LogTLB);
|
||||
LoadLogSetting(hKeyResults, "Log Cache Operations", &LogOptions->LogCache);
|
||||
LoadLogSetting(hKeyResults, "Log Rom Header", &LogOptions->LogRomHeader);
|
||||
LoadLogSetting(hKeyResults, "Log Unknown access", &LogOptions->LogUnknown);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
LogOptions->GenerateLog = FALSE;
|
||||
LogOptions->LogRDRamRegisters = FALSE;
|
||||
LogOptions->LogSPRegisters = FALSE;
|
||||
LogOptions->LogDPCRegisters = FALSE;
|
||||
LogOptions->LogDPSRegisters = FALSE;
|
||||
LogOptions->LogMIPSInterface = FALSE;
|
||||
LogOptions->LogVideoInterface = FALSE;
|
||||
LogOptions->LogAudioInterface = FALSE;
|
||||
LogOptions->LogPerInterface = FALSE;
|
||||
LogOptions->LogRDRAMInterface = FALSE;
|
||||
LogOptions->LogSerialInterface = FALSE;
|
||||
|
||||
LogOptions->LogPRDMAOperations = FALSE;
|
||||
LogOptions->LogPRDirectMemLoads = FALSE;
|
||||
LogOptions->LogPRDMAMemLoads = FALSE;
|
||||
LogOptions->LogPRDirectMemStores = FALSE;
|
||||
LogOptions->LogPRDMAMemStores = FALSE;
|
||||
LogOptions->LogControllerPak = FALSE;
|
||||
|
||||
LogOptions->LogCP0changes = FALSE;
|
||||
LogOptions->LogCP0reads = FALSE;
|
||||
LogOptions->LogCache = FALSE;
|
||||
LogOptions->LogExceptions = FALSE;
|
||||
LogOptions->NoInterrupts = FALSE;
|
||||
LogOptions->LogTLB = FALSE;
|
||||
LogOptions->LogRomHeader = FALSE;
|
||||
LogOptions->LogUnknown = FALSE;
|
||||
}
|
||||
|
||||
void LoadLogSetting(HKEY hKey, char * String, bool * Value)
|
||||
{
|
||||
DWORD Type, dwResult, Bytes = 4;
|
||||
int32_t lResult;
|
||||
|
||||
lResult = RegQueryValueEx(hKey, String, 0, &Type, (LPBYTE)(&dwResult), &Bytes);
|
||||
if (Type == REG_DWORD && lResult == ERROR_SUCCESS)
|
||||
{
|
||||
*Value = dwResult != 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
*Value = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
LRESULT CALLBACK LogGeneralProc(HWND hDlg, UINT uMsg, WPARAM /*wParam*/, LPARAM lParam)
|
||||
{
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
if (TempOptions.LogCP0changes) { CheckDlgButton(hDlg, IDC_CP0_WRITE, BST_CHECKED); }
|
||||
if (TempOptions.LogCP0reads) { CheckDlgButton(hDlg, IDC_CP0_READ, BST_CHECKED); }
|
||||
if (TempOptions.LogCache) { CheckDlgButton(hDlg, IDC_CACHE, BST_CHECKED); }
|
||||
if (TempOptions.LogExceptions) { CheckDlgButton(hDlg, IDC_EXCEPTIONS, BST_CHECKED); }
|
||||
if (TempOptions.NoInterrupts) { CheckDlgButton(hDlg, IDC_INTERRUPTS, BST_CHECKED); }
|
||||
if (TempOptions.LogTLB) { CheckDlgButton(hDlg, IDC_TLB, BST_CHECKED); }
|
||||
if (TempOptions.LogRomHeader) { CheckDlgButton(hDlg, IDC_ROM_HEADER, BST_CHECKED); }
|
||||
if (TempOptions.LogUnknown) { CheckDlgButton(hDlg, IDC_UNKOWN, BST_CHECKED); }
|
||||
{
|
||||
if (CLogSettings::LogCP0changes()) { CheckDlgButton(hDlg, IDC_CP0_WRITE, BST_CHECKED); }
|
||||
if (CLogSettings::LogCP0reads()) { CheckDlgButton(hDlg, IDC_CP0_READ, BST_CHECKED); }
|
||||
if (CLogSettings::LogCache()) { CheckDlgButton(hDlg, IDC_CACHE, BST_CHECKED); }
|
||||
if (CLogSettings::LogExceptions()) { CheckDlgButton(hDlg, IDC_EXCEPTIONS, BST_CHECKED); }
|
||||
if (CLogSettings::LogNoInterrupts()) { CheckDlgButton(hDlg, IDC_INTERRUPTS, BST_CHECKED); }
|
||||
if (CLogSettings::LogTLB()) { CheckDlgButton(hDlg, IDC_TLB, BST_CHECKED); }
|
||||
if (CLogSettings::LogRomHeader()) { CheckDlgButton(hDlg, IDC_ROM_HEADER, BST_CHECKED); }
|
||||
if (CLogSettings::LogUnknown()) { CheckDlgButton(hDlg, IDC_UNKOWN, BST_CHECKED); }
|
||||
}
|
||||
break;
|
||||
case WM_NOTIFY:
|
||||
if (((NMHDR FAR *) lParam)->code != PSN_APPLY) { break; }
|
||||
TempOptions.LogCP0changes = IsDlgButtonChecked(hDlg, IDC_CP0_WRITE) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogCP0reads = IsDlgButtonChecked(hDlg, IDC_CP0_READ) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogCache = IsDlgButtonChecked(hDlg, IDC_CACHE) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogExceptions = IsDlgButtonChecked(hDlg, IDC_EXCEPTIONS) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.NoInterrupts = IsDlgButtonChecked(hDlg, IDC_INTERRUPTS) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogTLB = IsDlgButtonChecked(hDlg, IDC_TLB) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogRomHeader = IsDlgButtonChecked(hDlg, IDC_ROM_HEADER) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogUnknown = IsDlgButtonChecked(hDlg, IDC_UNKOWN) == BST_CHECKED ? TRUE : FALSE;
|
||||
g_Settings->SaveBool(Logging_LogCP0changes, IsDlgButtonChecked(hDlg, IDC_CP0_WRITE) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogCP0reads, IsDlgButtonChecked(hDlg, IDC_CP0_READ) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogCache, IsDlgButtonChecked(hDlg, IDC_CACHE) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogExceptions, IsDlgButtonChecked(hDlg, IDC_EXCEPTIONS) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_NoInterrupts, IsDlgButtonChecked(hDlg, IDC_INTERRUPTS) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogTLB, IsDlgButtonChecked(hDlg, IDC_TLB) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogRomHeader, IsDlgButtonChecked(hDlg, IDC_ROM_HEADER) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogUnknown, IsDlgButtonChecked(hDlg, IDC_UNKOWN) == BST_CHECKED ? true : false);
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
|
@ -195,587 +97,31 @@ LRESULT CALLBACK LogGeneralProc(HWND hDlg, UINT uMsg, WPARAM /*wParam*/, LPARAM
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
void Log_LW(uint32_t PC, uint32_t VAddr)
|
||||
{
|
||||
if (!g_LogOptions.GenerateLog)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (VAddr < 0xA0000000 || VAddr >= 0xC0000000)
|
||||
{
|
||||
uint32_t PAddr;
|
||||
if (!g_TransVaddr->TranslateVaddr(VAddr, PAddr))
|
||||
{
|
||||
if (g_LogOptions.LogUnknown)
|
||||
{
|
||||
LogMessage("%08X: read from unknown ??? (%08X)", PC, VAddr);
|
||||
}
|
||||
return;
|
||||
}
|
||||
VAddr = PAddr + 0xA0000000;
|
||||
}
|
||||
|
||||
uint32_t Value;
|
||||
if (VAddr >= 0xA0000000 && VAddr < (0xA0000000 + g_MMU->RdramSize()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xA3F00000 && VAddr <= 0xA3F00024)
|
||||
{
|
||||
if (!g_LogOptions.LogRDRamRegisters)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA3F00000: LogMessage("%08X: read from RDRAM_CONFIG_REG/RDRAM_DEVICE_TYPE_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F00004: LogMessage("%08X: read from RDRAM_DEVICE_ID_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F00008: LogMessage("%08X: read from RDRAM_DELAY_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F0000C: LogMessage("%08X: read from RDRAM_MODE_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F00010: LogMessage("%08X: read from RDRAM_REF_INTERVAL_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F00014: LogMessage("%08X: read from RDRAM_REF_ROW_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F00018: LogMessage("%08X: read from RDRAM_RAS_INTERVAL_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F0001C: LogMessage("%08X: read from RDRAM_MIN_INTERVAL_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F00020: LogMessage("%08X: read from RDRAM_ADDR_SELECT_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F00024: LogMessage("%08X: read from RDRAM_DEVICE_MANUF_REG (%08X)", PC, Value); return;
|
||||
}
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA4000000 && VAddr <= 0xA4001FFC)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xA4040000 && VAddr <= 0xA404001C)
|
||||
{
|
||||
if (!g_LogOptions.LogSPRegisters)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4040000: LogMessage("%08X: read from SP_MEM_ADDR_REG (%08X)", PC, Value); break;
|
||||
case 0xA4040004: LogMessage("%08X: read from SP_DRAM_ADDR_REG (%08X)", PC, Value); break;
|
||||
case 0xA4040008: LogMessage("%08X: read from SP_RD_LEN_REG (%08X)", PC, Value); break;
|
||||
case 0xA404000C: LogMessage("%08X: read from SP_WR_LEN_REG (%08X)", PC, Value); break;
|
||||
case 0xA4040010: LogMessage("%08X: read from SP_STATUS_REG (%08X)", PC, Value); break;
|
||||
case 0xA4040014: LogMessage("%08X: read from SP_DMA_FULL_REG (%08X)", PC, Value); break;
|
||||
case 0xA4040018: LogMessage("%08X: read from SP_DMA_BUSY_REG (%08X)", PC, Value); break;
|
||||
case 0xA404001C: LogMessage("%08X: read from SP_SEMAPHORE_REG (%08X)", PC, Value); break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (VAddr == 0xA4080000)
|
||||
{
|
||||
if (!g_LogOptions.LogSPRegisters)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
LogMessage("%08X: read from SP_PC (%08X)", PC, Value);
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xA4100000 && VAddr <= 0xA410001C)
|
||||
{
|
||||
if (!g_LogOptions.LogDPCRegisters)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4100000: LogMessage("%08X: read from DPC_START_REG (%08X)", PC, Value); return;
|
||||
case 0xA4100004: LogMessage("%08X: read from DPC_END_REG (%08X)", PC, Value); return;
|
||||
case 0xA4100008: LogMessage("%08X: read from DPC_CURRENT_REG (%08X)", PC, Value); return;
|
||||
case 0xA410000C: LogMessage("%08X: read from DPC_STATUS_REG (%08X)", PC, Value); return;
|
||||
case 0xA4100010: LogMessage("%08X: read from DPC_CLOCK_REG (%08X)", PC, Value); return;
|
||||
case 0xA4100014: LogMessage("%08X: read from DPC_BUFBUSY_REG (%08X)", PC, Value); return;
|
||||
case 0xA4100018: LogMessage("%08X: read from DPC_PIPEBUSY_REG (%08X)", PC, Value); return;
|
||||
case 0xA410001C: LogMessage("%08X: read from DPC_TMEM_REG (%08X)", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4300000 && VAddr <= 0xA430000C)
|
||||
{
|
||||
if (!g_LogOptions.LogMIPSInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4300000: LogMessage("%08X: read from MI_INIT_MODE_REG/MI_MODE_REG (%08X)", PC, Value); return;
|
||||
case 0xA4300004: LogMessage("%08X: read from MI_VERSION_REG/MI_NOOP_REG (%08X)", PC, Value); return;
|
||||
case 0xA4300008: LogMessage("%08X: read from MI_INTR_REG (%08X)", PC, Value); return;
|
||||
case 0xA430000C: LogMessage("%08X: read from MI_INTR_MASK_REG (%08X)", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4400000 && VAddr <= 0xA4400034)
|
||||
{
|
||||
if (!g_LogOptions.LogVideoInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4400000: LogMessage("%08X: read from VI_STATUS_REG/VI_CONTROL_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400004: LogMessage("%08X: read from VI_ORIGIN_REG/VI_DRAM_ADDR_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400008: LogMessage("%08X: read from VI_WIDTH_REG/VI_H_WIDTH_REG (%08X)", PC, Value); return;
|
||||
case 0xA440000C: LogMessage("%08X: read from VI_INTR_REG/VI_V_INTR_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400010: LogMessage("%08X: read from VI_CURRENT_REG/VI_V_CURRENT_LINE_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400014: LogMessage("%08X: read from VI_BURST_REG/VI_TIMING_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400018: LogMessage("%08X: read from VI_V_SYNC_REG (%08X)", PC, Value); return;
|
||||
case 0xA440001C: LogMessage("%08X: read from VI_H_SYNC_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400020: LogMessage("%08X: read from VI_LEAP_REG/VI_H_SYNC_LEAP_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400024: LogMessage("%08X: read from VI_H_START_REG/VI_H_VIDEO_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400028: LogMessage("%08X: read from VI_V_START_REG/VI_V_VIDEO_REG (%08X)", PC, Value); return;
|
||||
case 0xA440002C: LogMessage("%08X: read from VI_V_BURST_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400030: LogMessage("%08X: read from VI_X_SCALE_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400034: LogMessage("%08X: read from VI_Y_SCALE_REG (%08X)", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4500000 && VAddr <= 0xA4500014)
|
||||
{
|
||||
if (!g_LogOptions.LogAudioInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4500000: LogMessage("%08X: read from AI_DRAM_ADDR_REG (%08X)", PC, Value); return;
|
||||
case 0xA4500004: LogMessage("%08X: read from AI_LEN_REG (%08X)", PC, Value); return;
|
||||
case 0xA4500008: LogMessage("%08X: read from AI_CONTROL_REG (%08X)", PC, Value); return;
|
||||
case 0xA450000C: LogMessage("%08X: read from AI_STATUS_REG (%08X)", PC, Value); return;
|
||||
case 0xA4500010: LogMessage("%08X: read from AI_DACRATE_REG (%08X)", PC, Value); return;
|
||||
case 0xA4500014: LogMessage("%08X: read from AI_BITRATE_REG (%08X)", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4600000 && VAddr <= 0xA4600030)
|
||||
{
|
||||
if (!g_LogOptions.LogPerInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4600000: LogMessage("%08X: read from PI_DRAM_ADDR_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600004: LogMessage("%08X: read from PI_CART_ADDR_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600008: LogMessage("%08X: read from PI_RD_LEN_REG (%08X)", PC, Value); return;
|
||||
case 0xA460000C: LogMessage("%08X: read from PI_WR_LEN_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600010: LogMessage("%08X: read from PI_STATUS_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600014: LogMessage("%08X: read from PI_BSD_DOM1_LAT_REG/PI_DOMAIN1_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600018: LogMessage("%08X: read from PI_BSD_DOM1_PWD_REG (%08X)", PC, Value); return;
|
||||
case 0xA460001C: LogMessage("%08X: read from PI_BSD_DOM1_PGS_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600020: LogMessage("%08X: read from PI_BSD_DOM1_RLS_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600024: LogMessage("%08X: read from PI_BSD_DOM2_LAT_REG/PI_DOMAIN2_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600028: LogMessage("%08X: read from PI_BSD_DOM2_PWD_REG (%08X)", PC, Value); return;
|
||||
case 0xA460002C: LogMessage("%08X: read from PI_BSD_DOM2_PGS_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600030: LogMessage("%08X: read from PI_BSD_DOM2_RLS_REG (%08X)", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4700000 && VAddr <= 0xA470001C)
|
||||
{
|
||||
if (!g_LogOptions.LogRDRAMInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4700000: LogMessage("%08X: read from RI_MODE_REG (%08X)", PC, Value); return;
|
||||
case 0xA4700004: LogMessage("%08X: read from RI_CONFIG_REG (%08X)", PC, Value); return;
|
||||
case 0xA4700008: LogMessage("%08X: read from RI_CURRENT_LOAD_REG (%08X)", PC, Value); return;
|
||||
case 0xA470000C: LogMessage("%08X: read from RI_SELECT_REG (%08X)", PC, Value); return;
|
||||
case 0xA4700010: LogMessage("%08X: read from RI_REFRESH_REG/RI_COUNT_REG (%08X)", PC, Value); return;
|
||||
case 0xA4700014: LogMessage("%08X: read from RI_LATENCY_REG (%08X)", PC, Value); return;
|
||||
case 0xA4700018: LogMessage("%08X: read from RI_RERROR_REG (%08X)", PC, Value); return;
|
||||
case 0xA470001C: LogMessage("%08X: read from RI_WERROR_REG (%08X)", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr == 0xA4800000)
|
||||
{
|
||||
if (!g_LogOptions.LogSerialInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
LogMessage("%08X: read from SI_DRAM_ADDR_REG (%08X)", PC, Value);
|
||||
return;
|
||||
}
|
||||
if (VAddr == 0xA4800004)
|
||||
{
|
||||
if (!g_LogOptions.LogSerialInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
LogMessage("%08X: read from SI_PIF_ADDR_RD64B_REG (%08X)", PC, Value);
|
||||
return;
|
||||
}
|
||||
if (VAddr == 0xA4800010)
|
||||
{
|
||||
if (!g_LogOptions.LogSerialInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
LogMessage("%08X: read from SI_PIF_ADDR_WR64B_REG (%08X)", PC, Value);
|
||||
return;
|
||||
}
|
||||
if (VAddr == 0xA4800018)
|
||||
{
|
||||
if (!g_LogOptions.LogSerialInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
LogMessage("%08X: read from SI_STATUS_REG (%08X)", PC, Value);
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xBFC00000 && VAddr <= 0xBFC007C0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xBFC007C0 && VAddr <= 0xBFC007FC)
|
||||
{
|
||||
if (!g_LogOptions.LogPRDirectMemLoads)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
LogMessage("%08X: read word from Pif Ram at 0x%X (%08X)", PC, VAddr - 0xBFC007C0, Value);
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xB0000040 && ((VAddr - 0xB0000000) < g_Rom->GetRomSize()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xB0000000 && VAddr < 0xB0000040)
|
||||
{
|
||||
if (!g_LogOptions.LogRomHeader)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xB0000004: LogMessage("%08X: read from Rom Clock Rate (%08X)", PC, Value); break;
|
||||
case 0xB0000008: LogMessage("%08X: read from Rom Boot address offset (%08X)", PC, Value); break;
|
||||
case 0xB000000C: LogMessage("%08X: read from Rom Release offset (%08X)", PC, Value); break;
|
||||
case 0xB0000010: LogMessage("%08X: read from Rom CRC1 (%08X)", PC, Value); break;
|
||||
case 0xB0000014: LogMessage("%08X: read from Rom CRC2 (%08X)", PC, Value); break;
|
||||
default: LogMessage("%08X: read from Rom header 0x%X (%08X)", PC, VAddr & 0xFF, Value); break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (!g_LogOptions.LogUnknown)
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: read from unknown ??? (%08X)", PC, VAddr);
|
||||
}
|
||||
|
||||
void Log_SW(uint32_t PC, uint32_t VAddr, uint32_t Value)
|
||||
{
|
||||
if (!g_LogOptions.GenerateLog)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (VAddr < 0xA0000000 || VAddr >= 0xC0000000)
|
||||
{
|
||||
uint32_t PAddr;
|
||||
if (!g_TransVaddr->TranslateVaddr(VAddr, PAddr))
|
||||
{
|
||||
if (g_LogOptions.LogUnknown)
|
||||
{
|
||||
LogMessage("%08X: Writing 0x%08X to %08X", PC, Value, VAddr);
|
||||
}
|
||||
return;
|
||||
}
|
||||
VAddr = PAddr + 0xA0000000;
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA0000000 && VAddr < (0xA0000000 + g_MMU->RdramSize()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xA3F00000 && VAddr <= 0xA3F00024)
|
||||
{
|
||||
if (!g_LogOptions.LogRDRamRegisters)
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA3F00000: LogMessage("%08X: Writing 0x%08X to RDRAM_CONFIG_REG/RDRAM_DEVICE_TYPE_REG", PC, Value); return;
|
||||
case 0xA3F00004: LogMessage("%08X: Writing 0x%08X to RDRAM_DEVICE_ID_REG", PC, Value); return;
|
||||
case 0xA3F00008: LogMessage("%08X: Writing 0x%08X to RDRAM_DELAY_REG", PC, Value); return;
|
||||
case 0xA3F0000C: LogMessage("%08X: Writing 0x%08X to RDRAM_MODE_REG", PC, Value); return;
|
||||
case 0xA3F00010: LogMessage("%08X: Writing 0x%08X to RDRAM_REF_INTERVAL_REG", PC, Value); return;
|
||||
case 0xA3F00014: LogMessage("%08X: Writing 0x%08X to RDRAM_REF_ROW_REG", PC, Value); return;
|
||||
case 0xA3F00018: LogMessage("%08X: Writing 0x%08X to RDRAM_RAS_INTERVAL_REG", PC, Value); return;
|
||||
case 0xA3F0001C: LogMessage("%08X: Writing 0x%08X to RDRAM_MIN_INTERVAL_REG", PC, Value); return;
|
||||
case 0xA3F00020: LogMessage("%08X: Writing 0x%08X to RDRAM_ADDR_SELECT_REG", PC, Value); return;
|
||||
case 0xA3F00024: LogMessage("%08X: Writing 0x%08X to RDRAM_DEVICE_MANUF_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4000000 && VAddr <= 0xA4001FFC)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA4040000 && VAddr <= 0xA404001C)
|
||||
{
|
||||
if (!g_LogOptions.LogSPRegisters)
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4040000: LogMessage("%08X: Writing 0x%08X to SP_MEM_ADDR_REG", PC, Value); return;
|
||||
case 0xA4040004: LogMessage("%08X: Writing 0x%08X to SP_DRAM_ADDR_REG", PC, Value); return;
|
||||
case 0xA4040008: LogMessage("%08X: Writing 0x%08X to SP_RD_LEN_REG", PC, Value); return;
|
||||
case 0xA404000C: LogMessage("%08X: Writing 0x%08X to SP_WR_LEN_REG", PC, Value); return;
|
||||
case 0xA4040010: LogMessage("%08X: Writing 0x%08X to SP_STATUS_REG", PC, Value); return;
|
||||
case 0xA4040014: LogMessage("%08X: Writing 0x%08X to SP_DMA_FULL_REG", PC, Value); return;
|
||||
case 0xA4040018: LogMessage("%08X: Writing 0x%08X to SP_DMA_BUSY_REG", PC, Value); return;
|
||||
case 0xA404001C: LogMessage("%08X: Writing 0x%08X to SP_SEMAPHORE_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr == 0xA4080000)
|
||||
{
|
||||
if (!g_LogOptions.LogSPRegisters)
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: Writing 0x%08X to SP_PC", PC, Value); return;
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA4100000 && VAddr <= 0xA410001C)
|
||||
{
|
||||
if (!g_LogOptions.LogDPCRegisters)
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4100000: LogMessage("%08X: Writing 0x%08X to DPC_START_REG", PC, Value); return;
|
||||
case 0xA4100004: LogMessage("%08X: Writing 0x%08X to DPC_END_REG", PC, Value); return;
|
||||
case 0xA4100008: LogMessage("%08X: Writing 0x%08X to DPC_CURRENT_REG", PC, Value); return;
|
||||
case 0xA410000C: LogMessage("%08X: Writing 0x%08X to DPC_STATUS_REG", PC, Value); return;
|
||||
case 0xA4100010: LogMessage("%08X: Writing 0x%08X to DPC_CLOCK_REG", PC, Value); return;
|
||||
case 0xA4100014: LogMessage("%08X: Writing 0x%08X to DPC_BUFBUSY_REG", PC, Value); return;
|
||||
case 0xA4100018: LogMessage("%08X: Writing 0x%08X to DPC_PIPEBUSY_REG", PC, Value); return;
|
||||
case 0xA410001C: LogMessage("%08X: Writing 0x%08X to DPC_TMEM_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA4200000 && VAddr <= 0xA420000C)
|
||||
{
|
||||
if (!g_LogOptions.LogDPSRegisters)
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4200000: LogMessage("%08X: Writing 0x%08X to DPS_TBIST_REG", PC, Value); return;
|
||||
case 0xA4200004: LogMessage("%08X: Writing 0x%08X to DPS_TEST_MODE_REG", PC, Value); return;
|
||||
case 0xA4200008: LogMessage("%08X: Writing 0x%08X to DPS_BUFTEST_ADDR_REG", PC, Value); return;
|
||||
case 0xA420000C: LogMessage("%08X: Writing 0x%08X to DPS_BUFTEST_DATA_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA4300000 && VAddr <= 0xA430000C)
|
||||
{
|
||||
if (!g_LogOptions.LogMIPSInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4300000: LogMessage("%08X: Writing 0x%08X to MI_INIT_MODE_REG/MI_MODE_REG", PC, Value); return;
|
||||
case 0xA4300004: LogMessage("%08X: Writing 0x%08X to MI_VERSION_REG/MI_NOOP_REG", PC, Value); return;
|
||||
case 0xA4300008: LogMessage("%08X: Writing 0x%08X to MI_INTR_REG", PC, Value); return;
|
||||
case 0xA430000C: LogMessage("%08X: Writing 0x%08X to MI_INTR_MASK_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4400000 && VAddr <= 0xA4400034)
|
||||
{
|
||||
if (!g_LogOptions.LogVideoInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4400000: LogMessage("%08X: Writing 0x%08X to VI_STATUS_REG/VI_CONTROL_REG", PC, Value); return;
|
||||
case 0xA4400004: LogMessage("%08X: Writing 0x%08X to VI_ORIGIN_REG/VI_DRAM_ADDR_REG", PC, Value); return;
|
||||
case 0xA4400008: LogMessage("%08X: Writing 0x%08X to VI_WIDTH_REG/VI_H_WIDTH_REG", PC, Value); return;
|
||||
case 0xA440000C: LogMessage("%08X: Writing 0x%08X to VI_INTR_REG/VI_V_INTR_REG", PC, Value); return;
|
||||
case 0xA4400010: LogMessage("%08X: Writing 0x%08X to VI_CURRENT_REG/VI_V_CURRENT_LINE_REG", PC, Value); return;
|
||||
case 0xA4400014: LogMessage("%08X: Writing 0x%08X to VI_BURST_REG/VI_TIMING_REG", PC, Value); return;
|
||||
case 0xA4400018: LogMessage("%08X: Writing 0x%08X to VI_V_SYNC_REG", PC, Value); return;
|
||||
case 0xA440001C: LogMessage("%08X: Writing 0x%08X to VI_H_SYNC_REG", PC, Value); return;
|
||||
case 0xA4400020: LogMessage("%08X: Writing 0x%08X to VI_LEAP_REG/VI_H_SYNC_LEAP_REG", PC, Value); return;
|
||||
case 0xA4400024: LogMessage("%08X: Writing 0x%08X to VI_H_START_REG/VI_H_VIDEO_REG", PC, Value); return;
|
||||
case 0xA4400028: LogMessage("%08X: Writing 0x%08X to VI_V_START_REG/VI_V_VIDEO_REG", PC, Value); return;
|
||||
case 0xA440002C: LogMessage("%08X: Writing 0x%08X to VI_V_BURST_REG", PC, Value); return;
|
||||
case 0xA4400030: LogMessage("%08X: Writing 0x%08X to VI_X_SCALE_REG", PC, Value); return;
|
||||
case 0xA4400034: LogMessage("%08X: Writing 0x%08X to VI_Y_SCALE_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA4500000 && VAddr <= 0xA4500014)
|
||||
{
|
||||
if (!g_LogOptions.LogAudioInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4500000: LogMessage("%08X: Writing 0x%08X to AI_DRAM_ADDR_REG", PC, Value); return;
|
||||
case 0xA4500004: LogMessage("%08X: Writing 0x%08X to AI_LEN_REG", PC, Value); return;
|
||||
case 0xA4500008: LogMessage("%08X: Writing 0x%08X to AI_CONTROL_REG", PC, Value); return;
|
||||
case 0xA450000C: LogMessage("%08X: Writing 0x%08X to AI_STATUS_REG", PC, Value); return;
|
||||
case 0xA4500010: LogMessage("%08X: Writing 0x%08X to AI_DACRATE_REG", PC, Value); return;
|
||||
case 0xA4500014: LogMessage("%08X: Writing 0x%08X to AI_BITRATE_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA4600000 && VAddr <= 0xA4600030)
|
||||
{
|
||||
if (!g_LogOptions.LogPerInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4600000: LogMessage("%08X: Writing 0x%08X to PI_DRAM_ADDR_REG", PC, Value); return;
|
||||
case 0xA4600004: LogMessage("%08X: Writing 0x%08X to PI_CART_ADDR_REG", PC, Value); return;
|
||||
case 0xA4600008: LogMessage("%08X: Writing 0x%08X to PI_RD_LEN_REG", PC, Value); return;
|
||||
case 0xA460000C: LogMessage("%08X: Writing 0x%08X to PI_WR_LEN_REG", PC, Value); return;
|
||||
case 0xA4600010: LogMessage("%08X: Writing 0x%08X to PI_STATUS_REG", PC, Value); return;
|
||||
case 0xA4600014: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_LAT_REG/PI_DOMAIN1_REG", PC, Value); return;
|
||||
case 0xA4600018: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_PWD_REG", PC, Value); return;
|
||||
case 0xA460001C: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_PGS_REG", PC, Value); return;
|
||||
case 0xA4600020: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_RLS_REG", PC, Value); return;
|
||||
case 0xA4600024: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_LAT_REG/PI_DOMAIN2_REG", PC, Value); return;
|
||||
case 0xA4600028: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_PWD_REG", PC, Value); return;
|
||||
case 0xA460002C: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_PGS_REG", PC, Value); return;
|
||||
case 0xA4600030: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_RLS_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4700000 && VAddr <= 0xA470001C)
|
||||
{
|
||||
if (!g_LogOptions.LogRDRAMInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4700000: LogMessage("%08X: Writing 0x%08X to RI_MODE_REG", PC, Value); return;
|
||||
case 0xA4700004: LogMessage("%08X: Writing 0x%08X to RI_CONFIG_REG", PC, Value); return;
|
||||
case 0xA4700008: LogMessage("%08X: Writing 0x%08X to RI_CURRENT_LOAD_REG", PC, Value); return;
|
||||
case 0xA470000C: LogMessage("%08X: Writing 0x%08X to RI_SELECT_REG", PC, Value); return;
|
||||
case 0xA4700010: LogMessage("%08X: Writing 0x%08X to RI_REFRESH_REG/RI_COUNT_REG", PC, Value); return;
|
||||
case 0xA4700014: LogMessage("%08X: Writing 0x%08X to RI_LATENCY_REG", PC, Value); return;
|
||||
case 0xA4700018: LogMessage("%08X: Writing 0x%08X to RI_RERROR_REG", PC, Value); return;
|
||||
case 0xA470001C: LogMessage("%08X: Writing 0x%08X to RI_WERROR_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr == 0xA4800000)
|
||||
{
|
||||
if (!g_LogOptions.LogSerialInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: Writing 0x%08X to SI_DRAM_ADDR_REG", PC, Value); return;
|
||||
}
|
||||
if (VAddr == 0xA4800004)
|
||||
{
|
||||
if (g_LogOptions.LogPRDMAOperations)
|
||||
{
|
||||
LogMessage("%08X: A DMA transfer from the PIF ram has occured", PC);
|
||||
}
|
||||
if (!g_LogOptions.LogSerialInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: Writing 0x%08X to SI_PIF_ADDR_RD64B_REG", PC, Value); return;
|
||||
}
|
||||
if (VAddr == 0xA4800010)
|
||||
{
|
||||
if (g_LogOptions.LogPRDMAOperations)
|
||||
{
|
||||
LogMessage("%08X: A DMA transfer to the PIF ram has occured", PC);
|
||||
}
|
||||
if (!g_LogOptions.LogSerialInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: Writing 0x%08X to SI_PIF_ADDR_WR64B_REG", PC, Value); return;
|
||||
}
|
||||
if (VAddr == 0xA4800018)
|
||||
{
|
||||
if (!g_LogOptions.LogSerialInterface)
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: Writing 0x%08X to SI_STATUS_REG", PC, Value); return;
|
||||
}
|
||||
|
||||
if (VAddr >= 0xBFC007C0 && VAddr <= 0xBFC007FC)
|
||||
{
|
||||
if (!g_LogOptions.LogPRDirectMemStores)
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: Writing 0x%08X to Pif Ram at 0x%X", PC, Value, VAddr - 0xBFC007C0);
|
||||
return;
|
||||
}
|
||||
if (!g_LogOptions.LogUnknown)
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: Writing 0x%08X to %08X ????", PC, Value, VAddr);
|
||||
}
|
||||
|
||||
LRESULT CALLBACK LogPifProc(HWND hDlg, UINT uMsg, WPARAM /*wParam*/, LPARAM lParam)
|
||||
{
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
if (TempOptions.LogPRDMAOperations) { CheckDlgButton(hDlg, IDC_SI_DMA, BST_CHECKED); }
|
||||
if (TempOptions.LogPRDirectMemLoads) { CheckDlgButton(hDlg, IDC_DIRECT_WRITE, BST_CHECKED); }
|
||||
if (TempOptions.LogPRDMAMemLoads) { CheckDlgButton(hDlg, IDC_DMA_WRITE, BST_CHECKED); }
|
||||
if (TempOptions.LogPRDirectMemStores) { CheckDlgButton(hDlg, IDC_DIRECT_READ, BST_CHECKED); }
|
||||
if (TempOptions.LogPRDMAMemStores) { CheckDlgButton(hDlg, IDC_DMA_READ, BST_CHECKED); }
|
||||
if (TempOptions.LogControllerPak) { CheckDlgButton(hDlg, IDC_CONT_PAK, BST_CHECKED); }
|
||||
{
|
||||
if (CLogSettings::LogPRDMAOperations()) { CheckDlgButton(hDlg, IDC_SI_DMA, BST_CHECKED); }
|
||||
if (CLogSettings::LogPRDirectMemLoads()) { CheckDlgButton(hDlg, IDC_DIRECT_WRITE, BST_CHECKED); }
|
||||
if (CLogSettings::LogPRDMAMemLoads()) { CheckDlgButton(hDlg, IDC_DMA_WRITE, BST_CHECKED); }
|
||||
if (CLogSettings::LogPRDirectMemStores()) { CheckDlgButton(hDlg, IDC_DIRECT_READ, BST_CHECKED); }
|
||||
if (CLogSettings::LogPRDMAMemStores()) { CheckDlgButton(hDlg, IDC_DMA_READ, BST_CHECKED); }
|
||||
if (CLogSettings::LogControllerPak()) { CheckDlgButton(hDlg, IDC_CONT_PAK, BST_CHECKED); }
|
||||
}
|
||||
break;
|
||||
case WM_NOTIFY:
|
||||
if (((NMHDR FAR *) lParam)->code != PSN_APPLY)
|
||||
{
|
||||
break;
|
||||
}
|
||||
TempOptions.LogPRDMAOperations = IsDlgButtonChecked(hDlg, IDC_SI_DMA) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogPRDirectMemLoads = IsDlgButtonChecked(hDlg, IDC_DIRECT_WRITE) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogPRDMAMemLoads = IsDlgButtonChecked(hDlg, IDC_DMA_WRITE) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogPRDirectMemStores = IsDlgButtonChecked(hDlg, IDC_DIRECT_READ) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogPRDMAMemStores = IsDlgButtonChecked(hDlg, IDC_DMA_READ) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogControllerPak = IsDlgButtonChecked(hDlg, IDC_CONT_PAK) == BST_CHECKED ? TRUE : FALSE;
|
||||
g_Settings->SaveBool(Logging_LogPRDMAOperations, IsDlgButtonChecked(hDlg, IDC_SI_DMA) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogPRDirectMemLoads, IsDlgButtonChecked(hDlg, IDC_DIRECT_WRITE) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogPRDMAMemLoads, IsDlgButtonChecked(hDlg, IDC_DMA_WRITE) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogPRDirectMemStores, IsDlgButtonChecked(hDlg, IDC_DIRECT_READ) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogPRDMAMemStores, IsDlgButtonChecked(hDlg, IDC_DMA_READ) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogControllerPak, IsDlgButtonChecked(hDlg, IDC_CONT_PAK) == BST_CHECKED ? true : false);
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
|
@ -788,133 +134,37 @@ LRESULT CALLBACK LogRegProc(HWND hDlg, UINT uMsg, WPARAM /*wParam*/, LPARAM lPar
|
|||
switch (uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
if (TempOptions.LogRDRamRegisters) { CheckDlgButton(hDlg, IDC_RDRAM, BST_CHECKED); }
|
||||
if (TempOptions.LogSPRegisters) { CheckDlgButton(hDlg, IDC_SP_REG, BST_CHECKED); }
|
||||
if (TempOptions.LogDPCRegisters) { CheckDlgButton(hDlg, IDC_DPC_REG, BST_CHECKED); }
|
||||
if (TempOptions.LogDPSRegisters) { CheckDlgButton(hDlg, IDC_DPS_REG, BST_CHECKED); }
|
||||
if (TempOptions.LogMIPSInterface) { CheckDlgButton(hDlg, IDC_MI_REG, BST_CHECKED); }
|
||||
if (TempOptions.LogVideoInterface) { CheckDlgButton(hDlg, IDC_VI_REG, BST_CHECKED); }
|
||||
if (TempOptions.LogAudioInterface) { CheckDlgButton(hDlg, IDC_AI_REG, BST_CHECKED); }
|
||||
if (TempOptions.LogPerInterface) { CheckDlgButton(hDlg, IDC_PI_REG, BST_CHECKED); }
|
||||
if (TempOptions.LogRDRAMInterface) { CheckDlgButton(hDlg, IDC_RI_REG, BST_CHECKED); }
|
||||
if (TempOptions.LogSerialInterface) { CheckDlgButton(hDlg, IDC_SI_REG, BST_CHECKED); }
|
||||
{
|
||||
if (CLogSettings::LogRDRamRegisters()) { CheckDlgButton(hDlg, IDC_RDRAM, BST_CHECKED); }
|
||||
if (CLogSettings::LogSPRegisters()) { CheckDlgButton(hDlg, IDC_SP_REG, BST_CHECKED); }
|
||||
if (CLogSettings::LogDPCRegisters()) { CheckDlgButton(hDlg, IDC_DPC_REG, BST_CHECKED); }
|
||||
if (CLogSettings::LogDPSRegisters()) { CheckDlgButton(hDlg, IDC_DPS_REG, BST_CHECKED); }
|
||||
if (CLogSettings::LogMIPSInterface()) { CheckDlgButton(hDlg, IDC_MI_REG, BST_CHECKED); }
|
||||
if (CLogSettings::LogVideoInterface()) { CheckDlgButton(hDlg, IDC_VI_REG, BST_CHECKED); }
|
||||
if (CLogSettings::LogAudioInterface()) { CheckDlgButton(hDlg, IDC_AI_REG, BST_CHECKED); }
|
||||
if (CLogSettings::LogPerInterface()) { CheckDlgButton(hDlg, IDC_PI_REG, BST_CHECKED); }
|
||||
if (CLogSettings::LogRDRAMInterface()) { CheckDlgButton(hDlg, IDC_RI_REG, BST_CHECKED); }
|
||||
if (CLogSettings::LogSerialInterface()) { CheckDlgButton(hDlg, IDC_SI_REG, BST_CHECKED); }
|
||||
}
|
||||
break;
|
||||
case WM_NOTIFY:
|
||||
if (((NMHDR FAR *) lParam)->code != PSN_APPLY)
|
||||
{
|
||||
break;
|
||||
}
|
||||
TempOptions.LogRDRamRegisters = IsDlgButtonChecked(hDlg, IDC_RDRAM) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogSPRegisters = IsDlgButtonChecked(hDlg, IDC_SP_REG) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogDPCRegisters = IsDlgButtonChecked(hDlg, IDC_DPC_REG) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogDPSRegisters = IsDlgButtonChecked(hDlg, IDC_DPS_REG) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogMIPSInterface = IsDlgButtonChecked(hDlg, IDC_MI_REG) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogVideoInterface = IsDlgButtonChecked(hDlg, IDC_VI_REG) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogAudioInterface = IsDlgButtonChecked(hDlg, IDC_AI_REG) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogPerInterface = IsDlgButtonChecked(hDlg, IDC_PI_REG) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogRDRAMInterface = IsDlgButtonChecked(hDlg, IDC_RI_REG) == BST_CHECKED ? TRUE : FALSE;
|
||||
TempOptions.LogSerialInterface = IsDlgButtonChecked(hDlg, IDC_SI_REG) == BST_CHECKED ? TRUE : FALSE;
|
||||
g_Settings->SaveBool(Logging_LogRDRamRegisters, IsDlgButtonChecked(hDlg, IDC_RDRAM) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogSPRegisters, IsDlgButtonChecked(hDlg, IDC_SP_REG) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogDPCRegisters, IsDlgButtonChecked(hDlg, IDC_DPC_REG) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogDPSRegisters, IsDlgButtonChecked(hDlg, IDC_DPS_REG) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogMIPSInterface, IsDlgButtonChecked(hDlg, IDC_MI_REG) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogVideoInterface, IsDlgButtonChecked(hDlg, IDC_VI_REG) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogAudioInterface, IsDlgButtonChecked(hDlg, IDC_AI_REG) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogPerInterface, IsDlgButtonChecked(hDlg, IDC_PI_REG) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogRDRAMInterface, IsDlgButtonChecked(hDlg, IDC_RI_REG) == BST_CHECKED ? true : false);
|
||||
g_Settings->SaveBool(Logging_LogSerialInterface, IsDlgButtonChecked(hDlg, IDC_SI_REG) == BST_CHECKED ? true : false);
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void SaveLogSetting(HKEY hKey, char * String, BOOL Value)
|
||||
{
|
||||
DWORD StoreValue = Value;
|
||||
RegSetValueEx(hKey, String, 0, REG_DWORD, (CONST BYTE *)&StoreValue, sizeof(DWORD));
|
||||
}
|
||||
|
||||
void SaveLogOptions(void)
|
||||
{
|
||||
long lResult;
|
||||
HKEY hKeyResults = 0;
|
||||
DWORD Disposition = 0;
|
||||
char String[200];
|
||||
|
||||
sprintf(String, "Software\\N64 Emulation\\%s\\Logging", g_Settings->LoadStringVal(Setting_ApplicationName).c_str());
|
||||
lResult = RegCreateKeyEx(HKEY_CURRENT_USER, String, 0, "", REG_OPTION_NON_VOLATILE,
|
||||
KEY_ALL_ACCESS, NULL, &hKeyResults, &Disposition);
|
||||
|
||||
SaveLogSetting(hKeyResults, "Log RDRAM", TempOptions.LogRDRamRegisters);
|
||||
SaveLogSetting(hKeyResults, "Log SP", TempOptions.LogSPRegisters);
|
||||
SaveLogSetting(hKeyResults, "Log DP Command", TempOptions.LogDPCRegisters);
|
||||
SaveLogSetting(hKeyResults, "Log DP Span", TempOptions.LogDPSRegisters);
|
||||
SaveLogSetting(hKeyResults, "Log MIPS Interface (MI)", TempOptions.LogMIPSInterface);
|
||||
SaveLogSetting(hKeyResults, "Log Video Interface (VI)", TempOptions.LogVideoInterface);
|
||||
SaveLogSetting(hKeyResults, "Log Audio Interface (AI)", TempOptions.LogAudioInterface);
|
||||
SaveLogSetting(hKeyResults, "Log Peripheral Interface (PI)", TempOptions.LogPerInterface);
|
||||
SaveLogSetting(hKeyResults, "Log RDRAM Interface (RI)", TempOptions.LogRDRAMInterface);
|
||||
SaveLogSetting(hKeyResults, "Log Serial Interface (SI)", TempOptions.LogSerialInterface);
|
||||
SaveLogSetting(hKeyResults, "Log PifRam DMA Operations", TempOptions.LogPRDMAOperations);
|
||||
SaveLogSetting(hKeyResults, "Log PifRam Direct Memory Loads", TempOptions.LogPRDirectMemLoads);
|
||||
SaveLogSetting(hKeyResults, "Log PifRam DMA Memory Loads", TempOptions.LogPRDMAMemLoads);
|
||||
SaveLogSetting(hKeyResults, "Log PifRam Direct Memory Stores", TempOptions.LogPRDirectMemStores);
|
||||
SaveLogSetting(hKeyResults, "Log PifRam DMA Memory Stores", TempOptions.LogPRDMAMemStores);
|
||||
SaveLogSetting(hKeyResults, "Log Controller Pak", TempOptions.LogControllerPak);
|
||||
SaveLogSetting(hKeyResults, "Log CP0 changes", TempOptions.LogCP0changes);
|
||||
SaveLogSetting(hKeyResults, "Log CP0 reads", TempOptions.LogCP0reads);
|
||||
SaveLogSetting(hKeyResults, "Log Exceptions", TempOptions.LogExceptions);
|
||||
SaveLogSetting(hKeyResults, "No Interrupts", TempOptions.NoInterrupts);
|
||||
SaveLogSetting(hKeyResults, "Log TLB", TempOptions.LogTLB);
|
||||
SaveLogSetting(hKeyResults, "Log Cache Operations", TempOptions.LogCache);
|
||||
SaveLogSetting(hKeyResults, "Log Rom Header", TempOptions.LogRomHeader);
|
||||
SaveLogSetting(hKeyResults, "Log Unknown access", TempOptions.LogUnknown);
|
||||
|
||||
RegCloseKey(hKeyResults);
|
||||
}
|
||||
|
||||
void LogMessage(const char * Message, ...)
|
||||
{
|
||||
DWORD dwWritten;
|
||||
char Msg[400];
|
||||
va_list ap;
|
||||
|
||||
if (!g_Settings->LoadBool(Debugger_Enabled))
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (g_hLogFile == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
va_start(ap, Message);
|
||||
vsprintf(Msg, Message, ap);
|
||||
va_end(ap);
|
||||
|
||||
strcat(Msg, "\r\n");
|
||||
|
||||
WriteFile(g_hLogFile, Msg, strlen(Msg), &dwWritten, NULL);
|
||||
}
|
||||
|
||||
void StartLog(void)
|
||||
{
|
||||
if (!g_LogOptions.GenerateLog)
|
||||
{
|
||||
StopLog();
|
||||
return;
|
||||
}
|
||||
if (g_hLogFile)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
CPath LogFile(CPath::MODULE_DIRECTORY);
|
||||
LogFile.AppendDirectory("Logs");
|
||||
LogFile.SetNameExtension("cpudebug.log");
|
||||
|
||||
g_hLogFile = CreateFile(LogFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
||||
SetFilePointer(g_hLogFile, 0, NULL, FILE_BEGIN);
|
||||
}
|
||||
|
||||
void StopLog(void)
|
||||
{
|
||||
if (g_hLogFile)
|
||||
{
|
||||
CloseHandle(g_hLogFile);
|
||||
}
|
||||
g_hLogFile = NULL;
|
||||
}
|
|
@ -10,47 +10,4 @@
|
|||
****************************************************************************/
|
||||
#pragma once
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bool GenerateLog;
|
||||
|
||||
/* Registers Log */
|
||||
bool LogRDRamRegisters;
|
||||
bool LogSPRegisters;
|
||||
bool LogDPCRegisters;
|
||||
bool LogDPSRegisters;
|
||||
bool LogMIPSInterface;
|
||||
bool LogVideoInterface;
|
||||
bool LogAudioInterface;
|
||||
bool LogPerInterface;
|
||||
bool LogRDRAMInterface;
|
||||
bool LogSerialInterface;
|
||||
|
||||
/* Pif Ram Log */
|
||||
bool LogPRDMAOperations;
|
||||
bool LogPRDirectMemLoads;
|
||||
bool LogPRDMAMemLoads;
|
||||
bool LogPRDirectMemStores;
|
||||
bool LogPRDMAMemStores;
|
||||
bool LogControllerPak;
|
||||
|
||||
/* Special Log */
|
||||
bool LogCP0changes;
|
||||
bool LogCP0reads;
|
||||
bool LogTLB;
|
||||
bool LogExceptions;
|
||||
bool NoInterrupts;
|
||||
bool LogCache;
|
||||
bool LogRomHeader;
|
||||
bool LogUnknown;
|
||||
} LOG_OPTIONS;
|
||||
|
||||
extern LOG_OPTIONS g_LogOptions;
|
||||
|
||||
void EnterLogOptions ( HWND hwndOwner );
|
||||
void StartLog ( void );
|
||||
void StopLog ( void );
|
||||
void LoadLogOptions ( LOG_OPTIONS * LogOptions, bool AlwaysFill );
|
||||
void Log_LW ( uint32_t PC, uint32_t VAddr );
|
||||
void Log_SW ( uint32_t PC, uint32_t VAddr, uint32_t Value );
|
||||
void LogMessage ( const char * Message, ... );
|
||||
|
|
|
@ -17,6 +17,7 @@ m_Gui(hMainWindow)
|
|||
m_ChangeSettingList.push_back(UserInterface_InFullScreen);
|
||||
m_ChangeSettingList.push_back(UserInterface_AlwaysOnTop);
|
||||
m_ChangeSettingList.push_back(UserInterface_ShowCPUPer);
|
||||
m_ChangeSettingList.push_back(Logging_GenerateLog);
|
||||
m_ChangeSettingList.push_back(Debugger_ProfileCode);
|
||||
m_ChangeSettingList.push_back(Debugger_ShowTLBMisses);
|
||||
m_ChangeSettingList.push_back(Debugger_ShowUnhandledMemory);
|
||||
|
@ -28,7 +29,6 @@ m_Gui(hMainWindow)
|
|||
m_ChangeSettingList.push_back(Debugger_DisableGameFixes);
|
||||
m_ChangeSettingList.push_back(Debugger_AppLogLevel);
|
||||
m_ChangeSettingList.push_back(Debugger_AppLogFlush);
|
||||
m_ChangeSettingList.push_back(Debugger_GenerateDebugLog);
|
||||
m_ChangeSettingList.push_back(Game_CurrentSaveState);
|
||||
m_ChangeSettingList.push_back(Setting_CurrentLanguage);
|
||||
|
||||
|
@ -506,7 +506,7 @@ bool CMainMenu::ProcessMessage(HWND hWnd, DWORD /*FromAccelerator*/, DWORD MenuI
|
|||
break;
|
||||
case ID_DEBUGGER_LOGOPTIONS: m_Gui->EnterLogOptions(); break;
|
||||
case ID_DEBUGGER_GENERATELOG:
|
||||
g_Settings->SaveBool(Debugger_GenerateDebugLog, !g_Settings->LoadBool(Debugger_GenerateDebugLog));
|
||||
g_Settings->SaveBool(Logging_GenerateLog, !g_Settings->LoadBool(Logging_GenerateLog));
|
||||
break;
|
||||
case ID_DEBUGGER_DUMPMEMORY: m_Gui->Debug_ShowMemoryDump(); break;
|
||||
case ID_DEBUGGER_SEARCHMEMORY: m_Gui->Debug_ShowMemorySearch(); break;
|
||||
|
@ -1087,7 +1087,7 @@ void CMainMenu::FillOutMenu(HMENU hMenu)
|
|||
DebugLoggingMenu.push_back(Item);
|
||||
|
||||
Item.Reset(ID_DEBUGGER_GENERATELOG, EMPTY_STRING, EMPTY_STDSTR, NULL, L"Generate Log");
|
||||
if (g_Settings->LoadBool(Debugger_GenerateDebugLog)) { Item.SetItemTicked(true); }
|
||||
if (g_Settings->LoadBool(Logging_GenerateLog)) { Item.SetItemTicked(true); }
|
||||
DebugLoggingMenu.push_back(Item);
|
||||
|
||||
/* Debugger Main Menu
|
||||
|
|
|
@ -0,0 +1,628 @@
|
|||
/****************************************************************************
|
||||
* *
|
||||
* Project64 - A Nintendo 64 emulator. *
|
||||
* http://www.pj64-emu.com/ *
|
||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||
* *
|
||||
* License: *
|
||||
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
|
||||
* *
|
||||
****************************************************************************/
|
||||
#include "stdafx.h"
|
||||
#include "logging.h"
|
||||
#include <Common/path.h>
|
||||
#include <Project64\N64 System\System Globals.h>
|
||||
#include <Project64\N64 System\Mips\TranslateVaddr.h>
|
||||
#include <Project64\N64 System\Mips\Memory Class.h>
|
||||
#include <Project64\N64 System\N64 Rom Class.h>
|
||||
|
||||
CFile * CLogging::m_hLogFile = NULL;
|
||||
|
||||
void CLogging::Log_LW(uint32_t PC, uint32_t VAddr)
|
||||
{
|
||||
if (!GenerateLog())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (VAddr < 0xA0000000 || VAddr >= 0xC0000000)
|
||||
{
|
||||
uint32_t PAddr;
|
||||
if (!g_TransVaddr->TranslateVaddr(VAddr, PAddr))
|
||||
{
|
||||
if (LogUnknown())
|
||||
{
|
||||
LogMessage("%08X: read from unknown ??? (%08X)", PC, VAddr);
|
||||
}
|
||||
return;
|
||||
}
|
||||
VAddr = PAddr + 0xA0000000;
|
||||
}
|
||||
|
||||
uint32_t Value;
|
||||
if (VAddr >= 0xA0000000 && VAddr < (0xA0000000 + g_MMU->RdramSize()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xA3F00000 && VAddr <= 0xA3F00024)
|
||||
{
|
||||
if (!LogRDRamRegisters())
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA3F00000: LogMessage("%08X: read from RDRAM_CONFIG_REG/RDRAM_DEVICE_TYPE_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F00004: LogMessage("%08X: read from RDRAM_DEVICE_ID_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F00008: LogMessage("%08X: read from RDRAM_DELAY_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F0000C: LogMessage("%08X: read from RDRAM_MODE_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F00010: LogMessage("%08X: read from RDRAM_REF_INTERVAL_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F00014: LogMessage("%08X: read from RDRAM_REF_ROW_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F00018: LogMessage("%08X: read from RDRAM_RAS_INTERVAL_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F0001C: LogMessage("%08X: read from RDRAM_MIN_INTERVAL_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F00020: LogMessage("%08X: read from RDRAM_ADDR_SELECT_REG (%08X)", PC, Value); return;
|
||||
case 0xA3F00024: LogMessage("%08X: read from RDRAM_DEVICE_MANUF_REG (%08X)", PC, Value); return;
|
||||
}
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA4000000 && VAddr <= 0xA4001FFC)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xA4040000 && VAddr <= 0xA404001C)
|
||||
{
|
||||
if (!LogSPRegisters())
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4040000: LogMessage("%08X: read from SP_MEM_ADDR_REG (%08X)", PC, Value); break;
|
||||
case 0xA4040004: LogMessage("%08X: read from SP_DRAM_ADDR_REG (%08X)", PC, Value); break;
|
||||
case 0xA4040008: LogMessage("%08X: read from SP_RD_LEN_REG (%08X)", PC, Value); break;
|
||||
case 0xA404000C: LogMessage("%08X: read from SP_WR_LEN_REG (%08X)", PC, Value); break;
|
||||
case 0xA4040010: LogMessage("%08X: read from SP_STATUS_REG (%08X)", PC, Value); break;
|
||||
case 0xA4040014: LogMessage("%08X: read from SP_DMA_FULL_REG (%08X)", PC, Value); break;
|
||||
case 0xA4040018: LogMessage("%08X: read from SP_DMA_BUSY_REG (%08X)", PC, Value); break;
|
||||
case 0xA404001C: LogMessage("%08X: read from SP_SEMAPHORE_REG (%08X)", PC, Value); break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (VAddr == 0xA4080000)
|
||||
{
|
||||
if (!LogSPRegisters())
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
LogMessage("%08X: read from SP_PC (%08X)", PC, Value);
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xA4100000 && VAddr <= 0xA410001C)
|
||||
{
|
||||
if (!LogDPCRegisters())
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4100000: LogMessage("%08X: read from DPC_START_REG (%08X)", PC, Value); return;
|
||||
case 0xA4100004: LogMessage("%08X: read from DPC_END_REG (%08X)", PC, Value); return;
|
||||
case 0xA4100008: LogMessage("%08X: read from DPC_CURRENT_REG (%08X)", PC, Value); return;
|
||||
case 0xA410000C: LogMessage("%08X: read from DPC_STATUS_REG (%08X)", PC, Value); return;
|
||||
case 0xA4100010: LogMessage("%08X: read from DPC_CLOCK_REG (%08X)", PC, Value); return;
|
||||
case 0xA4100014: LogMessage("%08X: read from DPC_BUFBUSY_REG (%08X)", PC, Value); return;
|
||||
case 0xA4100018: LogMessage("%08X: read from DPC_PIPEBUSY_REG (%08X)", PC, Value); return;
|
||||
case 0xA410001C: LogMessage("%08X: read from DPC_TMEM_REG (%08X)", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4300000 && VAddr <= 0xA430000C)
|
||||
{
|
||||
if (!LogMIPSInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4300000: LogMessage("%08X: read from MI_INIT_MODE_REG/MI_MODE_REG (%08X)", PC, Value); return;
|
||||
case 0xA4300004: LogMessage("%08X: read from MI_VERSION_REG/MI_NOOP_REG (%08X)", PC, Value); return;
|
||||
case 0xA4300008: LogMessage("%08X: read from MI_INTR_REG (%08X)", PC, Value); return;
|
||||
case 0xA430000C: LogMessage("%08X: read from MI_INTR_MASK_REG (%08X)", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4400000 && VAddr <= 0xA4400034)
|
||||
{
|
||||
if (!LogVideoInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4400000: LogMessage("%08X: read from VI_STATUS_REG/VI_CONTROL_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400004: LogMessage("%08X: read from VI_ORIGIN_REG/VI_DRAM_ADDR_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400008: LogMessage("%08X: read from VI_WIDTH_REG/VI_H_WIDTH_REG (%08X)", PC, Value); return;
|
||||
case 0xA440000C: LogMessage("%08X: read from VI_INTR_REG/VI_V_INTR_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400010: LogMessage("%08X: read from VI_CURRENT_REG/VI_V_CURRENT_LINE_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400014: LogMessage("%08X: read from VI_BURST_REG/VI_TIMING_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400018: LogMessage("%08X: read from VI_V_SYNC_REG (%08X)", PC, Value); return;
|
||||
case 0xA440001C: LogMessage("%08X: read from VI_H_SYNC_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400020: LogMessage("%08X: read from VI_LEAP_REG/VI_H_SYNC_LEAP_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400024: LogMessage("%08X: read from VI_H_START_REG/VI_H_VIDEO_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400028: LogMessage("%08X: read from VI_V_START_REG/VI_V_VIDEO_REG (%08X)", PC, Value); return;
|
||||
case 0xA440002C: LogMessage("%08X: read from VI_V_BURST_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400030: LogMessage("%08X: read from VI_X_SCALE_REG (%08X)", PC, Value); return;
|
||||
case 0xA4400034: LogMessage("%08X: read from VI_Y_SCALE_REG (%08X)", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4500000 && VAddr <= 0xA4500014)
|
||||
{
|
||||
if (!LogAudioInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4500000: LogMessage("%08X: read from AI_DRAM_ADDR_REG (%08X)", PC, Value); return;
|
||||
case 0xA4500004: LogMessage("%08X: read from AI_LEN_REG (%08X)", PC, Value); return;
|
||||
case 0xA4500008: LogMessage("%08X: read from AI_CONTROL_REG (%08X)", PC, Value); return;
|
||||
case 0xA450000C: LogMessage("%08X: read from AI_STATUS_REG (%08X)", PC, Value); return;
|
||||
case 0xA4500010: LogMessage("%08X: read from AI_DACRATE_REG (%08X)", PC, Value); return;
|
||||
case 0xA4500014: LogMessage("%08X: read from AI_BITRATE_REG (%08X)", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4600000 && VAddr <= 0xA4600030)
|
||||
{
|
||||
if (!LogPerInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4600000: LogMessage("%08X: read from PI_DRAM_ADDR_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600004: LogMessage("%08X: read from PI_CART_ADDR_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600008: LogMessage("%08X: read from PI_RD_LEN_REG (%08X)", PC, Value); return;
|
||||
case 0xA460000C: LogMessage("%08X: read from PI_WR_LEN_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600010: LogMessage("%08X: read from PI_STATUS_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600014: LogMessage("%08X: read from PI_BSD_DOM1_LAT_REG/PI_DOMAIN1_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600018: LogMessage("%08X: read from PI_BSD_DOM1_PWD_REG (%08X)", PC, Value); return;
|
||||
case 0xA460001C: LogMessage("%08X: read from PI_BSD_DOM1_PGS_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600020: LogMessage("%08X: read from PI_BSD_DOM1_RLS_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600024: LogMessage("%08X: read from PI_BSD_DOM2_LAT_REG/PI_DOMAIN2_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600028: LogMessage("%08X: read from PI_BSD_DOM2_PWD_REG (%08X)", PC, Value); return;
|
||||
case 0xA460002C: LogMessage("%08X: read from PI_BSD_DOM2_PGS_REG (%08X)", PC, Value); return;
|
||||
case 0xA4600030: LogMessage("%08X: read from PI_BSD_DOM2_RLS_REG (%08X)", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4700000 && VAddr <= 0xA470001C)
|
||||
{
|
||||
if (!LogRDRAMInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4700000: LogMessage("%08X: read from RI_MODE_REG (%08X)", PC, Value); return;
|
||||
case 0xA4700004: LogMessage("%08X: read from RI_CONFIG_REG (%08X)", PC, Value); return;
|
||||
case 0xA4700008: LogMessage("%08X: read from RI_CURRENT_LOAD_REG (%08X)", PC, Value); return;
|
||||
case 0xA470000C: LogMessage("%08X: read from RI_SELECT_REG (%08X)", PC, Value); return;
|
||||
case 0xA4700010: LogMessage("%08X: read from RI_REFRESH_REG/RI_COUNT_REG (%08X)", PC, Value); return;
|
||||
case 0xA4700014: LogMessage("%08X: read from RI_LATENCY_REG (%08X)", PC, Value); return;
|
||||
case 0xA4700018: LogMessage("%08X: read from RI_RERROR_REG (%08X)", PC, Value); return;
|
||||
case 0xA470001C: LogMessage("%08X: read from RI_WERROR_REG (%08X)", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr == 0xA4800000)
|
||||
{
|
||||
if (!LogSerialInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
LogMessage("%08X: read from SI_DRAM_ADDR_REG (%08X)", PC, Value);
|
||||
return;
|
||||
}
|
||||
if (VAddr == 0xA4800004)
|
||||
{
|
||||
if (!LogSerialInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
LogMessage("%08X: read from SI_PIF_ADDR_RD64B_REG (%08X)", PC, Value);
|
||||
return;
|
||||
}
|
||||
if (VAddr == 0xA4800010)
|
||||
{
|
||||
if (!LogSerialInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
LogMessage("%08X: read from SI_PIF_ADDR_WR64B_REG (%08X)", PC, Value);
|
||||
return;
|
||||
}
|
||||
if (VAddr == 0xA4800018)
|
||||
{
|
||||
if (!LogSerialInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
LogMessage("%08X: read from SI_STATUS_REG (%08X)", PC, Value);
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xBFC00000 && VAddr <= 0xBFC007C0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xBFC007C0 && VAddr <= 0xBFC007FC)
|
||||
{
|
||||
if (!LogPRDirectMemLoads())
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
LogMessage("%08X: read word from Pif Ram at 0x%X (%08X)", PC, VAddr - 0xBFC007C0, Value);
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xB0000040 && ((VAddr - 0xB0000000) < g_Rom->GetRomSize()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xB0000000 && VAddr < 0xB0000040)
|
||||
{
|
||||
if (!LogRomHeader())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
g_MMU->LW_VAddr(VAddr, Value);
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xB0000004: LogMessage("%08X: read from Rom Clock Rate (%08X)", PC, Value); break;
|
||||
case 0xB0000008: LogMessage("%08X: read from Rom Boot address offset (%08X)", PC, Value); break;
|
||||
case 0xB000000C: LogMessage("%08X: read from Rom Release offset (%08X)", PC, Value); break;
|
||||
case 0xB0000010: LogMessage("%08X: read from Rom CRC1 (%08X)", PC, Value); break;
|
||||
case 0xB0000014: LogMessage("%08X: read from Rom CRC2 (%08X)", PC, Value); break;
|
||||
default: LogMessage("%08X: read from Rom header 0x%X (%08X)", PC, VAddr & 0xFF, Value); break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (!LogUnknown())
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: read from unknown ??? (%08X)", PC, VAddr);
|
||||
}
|
||||
|
||||
void CLogging::Log_SW(uint32_t PC, uint32_t VAddr, uint32_t Value)
|
||||
{
|
||||
if (!GenerateLog())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (VAddr < 0xA0000000 || VAddr >= 0xC0000000)
|
||||
{
|
||||
uint32_t PAddr;
|
||||
if (!g_TransVaddr->TranslateVaddr(VAddr, PAddr))
|
||||
{
|
||||
if (LogUnknown())
|
||||
{
|
||||
LogMessage("%08X: Writing 0x%08X to %08X", PC, Value, VAddr);
|
||||
}
|
||||
return;
|
||||
}
|
||||
VAddr = PAddr + 0xA0000000;
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA0000000 && VAddr < (0xA0000000 + g_MMU->RdramSize()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xA3F00000 && VAddr <= 0xA3F00024)
|
||||
{
|
||||
if (!LogRDRamRegisters())
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA3F00000: LogMessage("%08X: Writing 0x%08X to RDRAM_CONFIG_REG/RDRAM_DEVICE_TYPE_REG", PC, Value); return;
|
||||
case 0xA3F00004: LogMessage("%08X: Writing 0x%08X to RDRAM_DEVICE_ID_REG", PC, Value); return;
|
||||
case 0xA3F00008: LogMessage("%08X: Writing 0x%08X to RDRAM_DELAY_REG", PC, Value); return;
|
||||
case 0xA3F0000C: LogMessage("%08X: Writing 0x%08X to RDRAM_MODE_REG", PC, Value); return;
|
||||
case 0xA3F00010: LogMessage("%08X: Writing 0x%08X to RDRAM_REF_INTERVAL_REG", PC, Value); return;
|
||||
case 0xA3F00014: LogMessage("%08X: Writing 0x%08X to RDRAM_REF_ROW_REG", PC, Value); return;
|
||||
case 0xA3F00018: LogMessage("%08X: Writing 0x%08X to RDRAM_RAS_INTERVAL_REG", PC, Value); return;
|
||||
case 0xA3F0001C: LogMessage("%08X: Writing 0x%08X to RDRAM_MIN_INTERVAL_REG", PC, Value); return;
|
||||
case 0xA3F00020: LogMessage("%08X: Writing 0x%08X to RDRAM_ADDR_SELECT_REG", PC, Value); return;
|
||||
case 0xA3F00024: LogMessage("%08X: Writing 0x%08X to RDRAM_DEVICE_MANUF_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4000000 && VAddr <= 0xA4001FFC)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA4040000 && VAddr <= 0xA404001C)
|
||||
{
|
||||
if (!LogSPRegisters())
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4040000: LogMessage("%08X: Writing 0x%08X to SP_MEM_ADDR_REG", PC, Value); return;
|
||||
case 0xA4040004: LogMessage("%08X: Writing 0x%08X to SP_DRAM_ADDR_REG", PC, Value); return;
|
||||
case 0xA4040008: LogMessage("%08X: Writing 0x%08X to SP_RD_LEN_REG", PC, Value); return;
|
||||
case 0xA404000C: LogMessage("%08X: Writing 0x%08X to SP_WR_LEN_REG", PC, Value); return;
|
||||
case 0xA4040010: LogMessage("%08X: Writing 0x%08X to SP_STATUS_REG", PC, Value); return;
|
||||
case 0xA4040014: LogMessage("%08X: Writing 0x%08X to SP_DMA_FULL_REG", PC, Value); return;
|
||||
case 0xA4040018: LogMessage("%08X: Writing 0x%08X to SP_DMA_BUSY_REG", PC, Value); return;
|
||||
case 0xA404001C: LogMessage("%08X: Writing 0x%08X to SP_SEMAPHORE_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr == 0xA4080000)
|
||||
{
|
||||
if (!LogSPRegisters())
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: Writing 0x%08X to SP_PC", PC, Value); return;
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA4100000 && VAddr <= 0xA410001C)
|
||||
{
|
||||
if (!LogDPCRegisters())
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4100000: LogMessage("%08X: Writing 0x%08X to DPC_START_REG", PC, Value); return;
|
||||
case 0xA4100004: LogMessage("%08X: Writing 0x%08X to DPC_END_REG", PC, Value); return;
|
||||
case 0xA4100008: LogMessage("%08X: Writing 0x%08X to DPC_CURRENT_REG", PC, Value); return;
|
||||
case 0xA410000C: LogMessage("%08X: Writing 0x%08X to DPC_STATUS_REG", PC, Value); return;
|
||||
case 0xA4100010: LogMessage("%08X: Writing 0x%08X to DPC_CLOCK_REG", PC, Value); return;
|
||||
case 0xA4100014: LogMessage("%08X: Writing 0x%08X to DPC_BUFBUSY_REG", PC, Value); return;
|
||||
case 0xA4100018: LogMessage("%08X: Writing 0x%08X to DPC_PIPEBUSY_REG", PC, Value); return;
|
||||
case 0xA410001C: LogMessage("%08X: Writing 0x%08X to DPC_TMEM_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA4200000 && VAddr <= 0xA420000C)
|
||||
{
|
||||
if (!LogDPSRegisters())
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4200000: LogMessage("%08X: Writing 0x%08X to DPS_TBIST_REG", PC, Value); return;
|
||||
case 0xA4200004: LogMessage("%08X: Writing 0x%08X to DPS_TEST_MODE_REG", PC, Value); return;
|
||||
case 0xA4200008: LogMessage("%08X: Writing 0x%08X to DPS_BUFTEST_ADDR_REG", PC, Value); return;
|
||||
case 0xA420000C: LogMessage("%08X: Writing 0x%08X to DPS_BUFTEST_DATA_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA4300000 && VAddr <= 0xA430000C)
|
||||
{
|
||||
if (!LogMIPSInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4300000: LogMessage("%08X: Writing 0x%08X to MI_INIT_MODE_REG/MI_MODE_REG", PC, Value); return;
|
||||
case 0xA4300004: LogMessage("%08X: Writing 0x%08X to MI_VERSION_REG/MI_NOOP_REG", PC, Value); return;
|
||||
case 0xA4300008: LogMessage("%08X: Writing 0x%08X to MI_INTR_REG", PC, Value); return;
|
||||
case 0xA430000C: LogMessage("%08X: Writing 0x%08X to MI_INTR_MASK_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4400000 && VAddr <= 0xA4400034)
|
||||
{
|
||||
if (!LogVideoInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4400000: LogMessage("%08X: Writing 0x%08X to VI_STATUS_REG/VI_CONTROL_REG", PC, Value); return;
|
||||
case 0xA4400004: LogMessage("%08X: Writing 0x%08X to VI_ORIGIN_REG/VI_DRAM_ADDR_REG", PC, Value); return;
|
||||
case 0xA4400008: LogMessage("%08X: Writing 0x%08X to VI_WIDTH_REG/VI_H_WIDTH_REG", PC, Value); return;
|
||||
case 0xA440000C: LogMessage("%08X: Writing 0x%08X to VI_INTR_REG/VI_V_INTR_REG", PC, Value); return;
|
||||
case 0xA4400010: LogMessage("%08X: Writing 0x%08X to VI_CURRENT_REG/VI_V_CURRENT_LINE_REG", PC, Value); return;
|
||||
case 0xA4400014: LogMessage("%08X: Writing 0x%08X to VI_BURST_REG/VI_TIMING_REG", PC, Value); return;
|
||||
case 0xA4400018: LogMessage("%08X: Writing 0x%08X to VI_V_SYNC_REG", PC, Value); return;
|
||||
case 0xA440001C: LogMessage("%08X: Writing 0x%08X to VI_H_SYNC_REG", PC, Value); return;
|
||||
case 0xA4400020: LogMessage("%08X: Writing 0x%08X to VI_LEAP_REG/VI_H_SYNC_LEAP_REG", PC, Value); return;
|
||||
case 0xA4400024: LogMessage("%08X: Writing 0x%08X to VI_H_START_REG/VI_H_VIDEO_REG", PC, Value); return;
|
||||
case 0xA4400028: LogMessage("%08X: Writing 0x%08X to VI_V_START_REG/VI_V_VIDEO_REG", PC, Value); return;
|
||||
case 0xA440002C: LogMessage("%08X: Writing 0x%08X to VI_V_BURST_REG", PC, Value); return;
|
||||
case 0xA4400030: LogMessage("%08X: Writing 0x%08X to VI_X_SCALE_REG", PC, Value); return;
|
||||
case 0xA4400034: LogMessage("%08X: Writing 0x%08X to VI_Y_SCALE_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA4500000 && VAddr <= 0xA4500014)
|
||||
{
|
||||
if (!LogAudioInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4500000: LogMessage("%08X: Writing 0x%08X to AI_DRAM_ADDR_REG", PC, Value); return;
|
||||
case 0xA4500004: LogMessage("%08X: Writing 0x%08X to AI_LEN_REG", PC, Value); return;
|
||||
case 0xA4500008: LogMessage("%08X: Writing 0x%08X to AI_CONTROL_REG", PC, Value); return;
|
||||
case 0xA450000C: LogMessage("%08X: Writing 0x%08X to AI_STATUS_REG", PC, Value); return;
|
||||
case 0xA4500010: LogMessage("%08X: Writing 0x%08X to AI_DACRATE_REG", PC, Value); return;
|
||||
case 0xA4500014: LogMessage("%08X: Writing 0x%08X to AI_BITRATE_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
|
||||
if (VAddr >= 0xA4600000 && VAddr <= 0xA4600030)
|
||||
{
|
||||
if (!LogPerInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4600000: LogMessage("%08X: Writing 0x%08X to PI_DRAM_ADDR_REG", PC, Value); return;
|
||||
case 0xA4600004: LogMessage("%08X: Writing 0x%08X to PI_CART_ADDR_REG", PC, Value); return;
|
||||
case 0xA4600008: LogMessage("%08X: Writing 0x%08X to PI_RD_LEN_REG", PC, Value); return;
|
||||
case 0xA460000C: LogMessage("%08X: Writing 0x%08X to PI_WR_LEN_REG", PC, Value); return;
|
||||
case 0xA4600010: LogMessage("%08X: Writing 0x%08X to PI_STATUS_REG", PC, Value); return;
|
||||
case 0xA4600014: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_LAT_REG/PI_DOMAIN1_REG", PC, Value); return;
|
||||
case 0xA4600018: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_PWD_REG", PC, Value); return;
|
||||
case 0xA460001C: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_PGS_REG", PC, Value); return;
|
||||
case 0xA4600020: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_RLS_REG", PC, Value); return;
|
||||
case 0xA4600024: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_LAT_REG/PI_DOMAIN2_REG", PC, Value); return;
|
||||
case 0xA4600028: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_PWD_REG", PC, Value); return;
|
||||
case 0xA460002C: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_PGS_REG", PC, Value); return;
|
||||
case 0xA4600030: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_RLS_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr >= 0xA4700000 && VAddr <= 0xA470001C)
|
||||
{
|
||||
if (!LogRDRAMInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
switch (VAddr)
|
||||
{
|
||||
case 0xA4700000: LogMessage("%08X: Writing 0x%08X to RI_MODE_REG", PC, Value); return;
|
||||
case 0xA4700004: LogMessage("%08X: Writing 0x%08X to RI_CONFIG_REG", PC, Value); return;
|
||||
case 0xA4700008: LogMessage("%08X: Writing 0x%08X to RI_CURRENT_LOAD_REG", PC, Value); return;
|
||||
case 0xA470000C: LogMessage("%08X: Writing 0x%08X to RI_SELECT_REG", PC, Value); return;
|
||||
case 0xA4700010: LogMessage("%08X: Writing 0x%08X to RI_REFRESH_REG/RI_COUNT_REG", PC, Value); return;
|
||||
case 0xA4700014: LogMessage("%08X: Writing 0x%08X to RI_LATENCY_REG", PC, Value); return;
|
||||
case 0xA4700018: LogMessage("%08X: Writing 0x%08X to RI_RERROR_REG", PC, Value); return;
|
||||
case 0xA470001C: LogMessage("%08X: Writing 0x%08X to RI_WERROR_REG", PC, Value); return;
|
||||
}
|
||||
}
|
||||
if (VAddr == 0xA4800000)
|
||||
{
|
||||
if (!LogSerialInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: Writing 0x%08X to SI_DRAM_ADDR_REG", PC, Value); return;
|
||||
}
|
||||
if (VAddr == 0xA4800004)
|
||||
{
|
||||
if (LogPRDMAOperations())
|
||||
{
|
||||
LogMessage("%08X: A DMA transfer from the PIF ram has occured", PC);
|
||||
}
|
||||
if (!LogSerialInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: Writing 0x%08X to SI_PIF_ADDR_RD64B_REG", PC, Value); return;
|
||||
}
|
||||
if (VAddr == 0xA4800010)
|
||||
{
|
||||
if (LogPRDMAOperations())
|
||||
{
|
||||
LogMessage("%08X: A DMA transfer to the PIF ram has occured", PC);
|
||||
}
|
||||
if (!LogSerialInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: Writing 0x%08X to SI_PIF_ADDR_WR64B_REG", PC, Value); return;
|
||||
}
|
||||
if (VAddr == 0xA4800018)
|
||||
{
|
||||
if (!LogSerialInterface())
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: Writing 0x%08X to SI_STATUS_REG", PC, Value); return;
|
||||
}
|
||||
|
||||
if (VAddr >= 0xBFC007C0 && VAddr <= 0xBFC007FC)
|
||||
{
|
||||
if (!LogPRDirectMemStores())
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: Writing 0x%08X to Pif Ram at 0x%X", PC, Value, VAddr - 0xBFC007C0);
|
||||
return;
|
||||
}
|
||||
if (!LogUnknown())
|
||||
{
|
||||
return;
|
||||
}
|
||||
LogMessage("%08X: Writing 0x%08X to %08X ????", PC, Value, VAddr);
|
||||
}
|
||||
|
||||
void CLogging::LogMessage(const char * Message, ...)
|
||||
{
|
||||
char Msg[400];
|
||||
va_list ap;
|
||||
|
||||
if (!g_Settings->LoadBool(Debugger_Enabled))
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (m_hLogFile == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
va_start(ap, Message);
|
||||
vsprintf(Msg, Message, ap);
|
||||
va_end(ap);
|
||||
|
||||
strcat(Msg, "\r\n");
|
||||
|
||||
m_hLogFile->Write(Msg,strlen(Msg));
|
||||
}
|
||||
|
||||
void CLogging::StartLog(void)
|
||||
{
|
||||
if (!GenerateLog())
|
||||
{
|
||||
StopLog();
|
||||
return;
|
||||
}
|
||||
if (m_hLogFile != NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
CPath LogFile(CPath::MODULE_DIRECTORY);
|
||||
LogFile.AppendDirectory("Logs");
|
||||
LogFile.SetNameExtension("cpudebug.log");
|
||||
|
||||
m_hLogFile = new CFile(LogFile, CFileBase::modeCreate | CFileBase::modeWrite);
|
||||
}
|
||||
|
||||
void CLogging::StopLog(void)
|
||||
{
|
||||
if (m_hLogFile)
|
||||
{
|
||||
delete m_hLogFile;
|
||||
m_hLogFile = NULL;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue