diff --git a/Source/Project64/Logging.h b/Source/Project64/Logging.h new file mode 100644 index 000000000..3a98a5a06 --- /dev/null +++ b/Source/Project64/Logging.h @@ -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 +#include + +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; +}; \ No newline at end of file diff --git a/Source/Project64/N64 System/Interpreter/Interpreter Ops 32.cpp b/Source/Project64/N64 System/Interpreter/Interpreter Ops 32.cpp index 217a28188..1b8e37aa3 100644 --- a/Source/Project64/N64 System/Interpreter/Interpreter Ops 32.cpp +++ b/Source/Project64/N64 System/Interpreter/Interpreter Ops 32.cpp @@ -9,7 +9,7 @@ * * ****************************************************************************/ #include "stdafx.h" -#include +#include 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 diff --git a/Source/Project64/N64 System/Interpreter/Interpreter Ops.cpp b/Source/Project64/N64 System/Interpreter/Interpreter Ops.cpp index 49c81c22a..c3c2e7240 100644 --- a/Source/Project64/N64 System/Interpreter/Interpreter Ops.cpp +++ b/Source/Project64/N64 System/Interpreter/Interpreter Ops.cpp @@ -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 diff --git a/Source/Project64/N64 System/Interpreter/Interpreter Ops.h b/Source/Project64/N64 System/Interpreter/Interpreter Ops.h index 6c9b6484c..6f607150b 100644 --- a/Source/Project64/N64 System/Interpreter/Interpreter Ops.h +++ b/Source/Project64/N64 System/Interpreter/Interpreter Ops.h @@ -11,6 +11,7 @@ #pragma once class R4300iOp : + public CLogging, protected CDebugSettings, protected CSystemRegisters { diff --git a/Source/Project64/N64 System/Mips/Pif Ram.cpp b/Source/Project64/N64 System/Mips/Pif Ram.cpp index 05707b241..99ca02bab 100644 --- a/Source/Project64/N64 System/Mips/Pif Ram.cpp +++ b/Source/Project64/N64 System/Mips/Pif Ram.cpp @@ -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"); } diff --git a/Source/Project64/N64 System/Mips/Pif Ram.h b/Source/Project64/N64 System/Mips/Pif Ram.h index 9cc1fdc42..a7bad744b 100644 --- a/Source/Project64/N64 System/Mips/Pif Ram.h +++ b/Source/Project64/N64 System/Mips/Pif Ram.h @@ -10,6 +10,7 @@ ****************************************************************************/ #pragma once +#include class CPifRamSettings { protected: @@ -31,6 +32,7 @@ private: }; class CPifRam : + public CLogging, private CPifRamSettings, private CEeprom { diff --git a/Source/Project64/N64 System/Mips/Register Class.cpp b/Source/Project64/N64 System/Mips/Register Class.cpp index c66ba1fb5..57c3ecc26 100644 --- a/Source/Project64/N64 System/Mips/Register Class.cpp +++ b/Source/Project64/N64 System/Mips/Register Class.cpp @@ -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); } diff --git a/Source/Project64/N64 System/Mips/Register Class.h b/Source/Project64/N64 System/Mips/Register Class.h index f782c6ceb..c5252f320 100644 --- a/Source/Project64/N64 System/Mips/Register Class.h +++ b/Source/Project64/N64 System/Mips/Register Class.h @@ -11,6 +11,8 @@ #pragma once #include +#include + //CPO registers by name class CP0registers { @@ -516,6 +518,7 @@ class CN64System; class CSystemEvents; class CRegisters : + public CLogging, private CDebugSettings, private CGameSettings, protected CSystemRegisters, diff --git a/Source/Project64/N64 System/N64 Class.cpp b/Source/Project64/N64 System/N64 Class.cpp index 87dfca5d7..5dce95baa 100644 --- a/Source/Project64/N64 System/N64 Class.cpp +++ b/Source/Project64/N64 System/N64 Class.cpp @@ -9,7 +9,6 @@ * * ****************************************************************************/ #include "stdafx.h" -#include #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(); } diff --git a/Source/Project64/N64 System/N64 Class.h b/Source/Project64/N64 System/N64 Class.h index beb835c77..b770e9e05 100644 --- a/Source/Project64/N64 System/N64 Class.h +++ b/Source/Project64/N64 System/N64 Class.h @@ -11,6 +11,7 @@ #pragma once #include +#include typedef std::list 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, diff --git a/Source/Project64/Project64.vcproj b/Source/Project64/Project64.vcproj index 7be04938f..dfd273f31 100644 --- a/Source/Project64/Project64.vcproj +++ b/Source/Project64/Project64.vcproj @@ -188,6 +188,10 @@ RelativePath="Settings\Gui Settings.cpp" > + + @@ -300,6 +304,10 @@ RelativePath="User Interface\Gui Class.cpp" > + + @@ -840,6 +848,10 @@ RelativePath="Settings\Gui Settings.h" > + + @@ -960,6 +972,10 @@ RelativePath="User Interface\Log Class.h" > + + diff --git a/Source/Project64/Project64.vcxproj b/Source/Project64/Project64.vcxproj index 256bc4408..66fd0c3ae 100644 --- a/Source/Project64/Project64.vcxproj +++ b/Source/Project64/Project64.vcxproj @@ -44,10 +44,12 @@ + + Create @@ -176,12 +178,14 @@ + + diff --git a/Source/Project64/Project64.vcxproj.filters b/Source/Project64/Project64.vcxproj.filters index f387c0509..dd0483794 100644 --- a/Source/Project64/Project64.vcxproj.filters +++ b/Source/Project64/Project64.vcxproj.filters @@ -420,6 +420,12 @@ Source Files\User Interface Source + + Source Files\N64 System Source + + + Source Files\N64 System Source + @@ -833,5 +839,11 @@ Header Files\User Interface Headers + + Header Files\N64 System Headers + + + Header Files\Settings Headers + \ No newline at end of file diff --git a/Source/Project64/Settings/Logging Settings.cpp b/Source/Project64/Settings/Logging Settings.cpp new file mode 100644 index 000000000..259a3ad96 --- /dev/null +++ b/Source/Project64/Settings/Logging Settings.cpp @@ -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); +} \ No newline at end of file diff --git a/Source/Project64/Settings/Logging Settings.h b/Source/Project64/Settings/Logging Settings.h new file mode 100644 index 000000000..279fc5d84 --- /dev/null +++ b/Source/Project64/Settings/Logging Settings.h @@ -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; +}; diff --git a/Source/Project64/Settings/Settings Class.cpp b/Source/Project64/Settings/Settings Class.cpp index b6a4a6400..0601df605 100644 --- a/Source/Project64/Settings/Settings Class.cpp +++ b/Source/Project64/Settings/Settings Class.cpp @@ -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)); diff --git a/Source/Project64/Settings/Settings.h b/Source/Project64/Settings/Settings.h index 24b241421..64f1196a6 100644 --- a/Source/Project64/Settings/Settings.h +++ b/Source/Project64/Settings/Settings.h @@ -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, diff --git a/Source/Project64/User Interface/LoggingUI.cpp b/Source/Project64/User Interface/LoggingUI.cpp index ff95a6c56..c60b62f33 100644 --- a/Source/Project64/User Interface/LoggingUI.cpp +++ b/Source/Project64/User Interface/LoggingUI.cpp @@ -9,24 +9,19 @@ * * ****************************************************************************/ #include "stdafx.h" -#include "LoggingUI.h" - +#include +#include #include -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); } - break; + { + 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); } - break; + { + 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); } - break; + { + 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; } \ No newline at end of file diff --git a/Source/Project64/User Interface/LoggingUI.h b/Source/Project64/User Interface/LoggingUI.h index 9d2f34138..de73fcab0 100644 --- a/Source/Project64/User Interface/LoggingUI.h +++ b/Source/Project64/User Interface/LoggingUI.h @@ -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, ... ); diff --git a/Source/Project64/User Interface/Main Menu Class.cpp b/Source/Project64/User Interface/Main Menu Class.cpp index cae92fe2c..7b760a9f5 100644 --- a/Source/Project64/User Interface/Main Menu Class.cpp +++ b/Source/Project64/User Interface/Main Menu Class.cpp @@ -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 diff --git a/Source/Project64/logging.cpp b/Source/Project64/logging.cpp new file mode 100644 index 000000000..f11b6c41e --- /dev/null +++ b/Source/Project64/logging.cpp @@ -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 +#include +#include +#include +#include + +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; + } +} \ No newline at end of file