mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-21 05:09:34 -06:00
Elf loader etc: Added command line elf loader so I can build and run homebrew with F5, use it with -e file.elf. Made some comments towards finding why lwbt fails to complete the HCI negotiation. I found that it worked in revision 800 so I will try to figure out what broke it along the way. Made some other small changes.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1432 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -110,6 +110,11 @@ void DynamicLibrary::Unload()
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
/* TEMPORARY SOLUTION: To prevent that Dolphin hangs when a game is stopped
|
||||||
|
or when we try to close Dolphin. It's possible that it only occur when we render
|
||||||
|
to the main window. And sometimes FreeLibrary works without any problem, so
|
||||||
|
don't remove this just because it doesn't hang once. I could not find the
|
||||||
|
actual cause of it. */
|
||||||
if( ! (library_file.find("OGL.") != std::string::npos) && !PowerPC::CPU_POWERDOWN)
|
if( ! (library_file.find("OGL.") != std::string::npos) && !PowerPC::CPU_POWERDOWN)
|
||||||
FreeLibrary(library);
|
FreeLibrary(library);
|
||||||
#else
|
#else
|
||||||
|
@ -28,10 +28,10 @@
|
|||||||
#pragma comment( lib, "imagehlp.lib" )
|
#pragma comment( lib, "imagehlp.lib" )
|
||||||
|
|
||||||
#define EXTENDEDTRACEINITIALIZE( IniSymbolPath ) InitSymInfo( IniSymbolPath )
|
#define EXTENDEDTRACEINITIALIZE( IniSymbolPath ) InitSymInfo( IniSymbolPath )
|
||||||
#define EXTENDEDTRACEUNINITIALIZE() UninitSymInfo()
|
#define EXTENDEDTRACEUNINITIALIZE() UninitSymInfo()
|
||||||
#define STACKTRACE(file) StackTrace( GetCurrentThread(), _T(""), file)
|
#define STACKTRACE(file) StackTrace( GetCurrentThread(), _T(""), file)
|
||||||
#define STACKTRACE2(file, eip, esp, ebp) StackTrace(GetCurrentThread(), _T(""), file, eip, esp, ebp)
|
#define STACKTRACE2(file, eip, esp, ebp) StackTrace(GetCurrentThread(), _T(""), file, eip, esp, ebp)
|
||||||
class File;
|
//class File;
|
||||||
|
|
||||||
BOOL InitSymInfo( PCSTR );
|
BOOL InitSymInfo( PCSTR );
|
||||||
BOOL UninitSymInfo();
|
BOOL UninitSymInfo();
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
#include "StringUtil.h"
|
#include "StringUtil.h"
|
||||||
|
#include "FileUtil.h"
|
||||||
|
|
||||||
#include "../HLE/HLE.h"
|
#include "../HLE/HLE.h"
|
||||||
|
|
||||||
@ -221,6 +222,14 @@ bool CBoot::BootUp(const SCoreStartupParameter& _StartupPara)
|
|||||||
// ===================================================================================
|
// ===================================================================================
|
||||||
case SCoreStartupParameter::BOOT_ELF:
|
case SCoreStartupParameter::BOOT_ELF:
|
||||||
{
|
{
|
||||||
|
if(!File::Exists(_StartupPara.m_strFilename.c_str()))
|
||||||
|
{
|
||||||
|
PanicAlert("The file you specified (%s) does not exists",
|
||||||
|
_StartupPara.m_strFilename.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we have gotten a Wii file or not
|
||||||
bool elfWii = IsElfWii(_StartupPara.m_strFilename.c_str());
|
bool elfWii = IsElfWii(_StartupPara.m_strFilename.c_str());
|
||||||
if (elfWii != Core::GetStartupParameter().bWii)
|
if (elfWii != Core::GetStartupParameter().bWii)
|
||||||
{
|
{
|
||||||
|
@ -24,6 +24,8 @@
|
|||||||
|
|
||||||
bool CBoot::IsElfWii(const char *filename)
|
bool CBoot::IsElfWii(const char *filename)
|
||||||
{
|
{
|
||||||
|
/* We already check if filename existed before we called this function, so
|
||||||
|
there is no need for another check, just read the file right away */
|
||||||
FILE *f = fopen(filename, "rb");
|
FILE *f = fopen(filename, "rb");
|
||||||
fseek(f, 0, SEEK_END);
|
fseek(f, 0, SEEK_END);
|
||||||
u64 filesize = ftell(f);
|
u64 filesize = ftell(f);
|
||||||
@ -31,12 +33,12 @@ bool CBoot::IsElfWii(const char *filename)
|
|||||||
u8 *mem = new u8[(size_t)filesize];
|
u8 *mem = new u8[(size_t)filesize];
|
||||||
fread(mem, 1, filesize, f);
|
fread(mem, 1, filesize, f);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
|
||||||
ElfReader reader(mem);
|
ElfReader reader(mem);
|
||||||
|
|
||||||
// TODO: Find a more reliable way to distinguish.
|
// TODO: Find a more reliable way to distinguish.
|
||||||
bool isWii = reader.GetEntryPoint() >= 0x80004000;
|
bool isWii = reader.GetEntryPoint() >= 0x80004000;
|
||||||
delete [] mem;
|
delete [] mem;
|
||||||
|
|
||||||
return isWii;
|
return isWii;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,6 +56,14 @@ bool SCoreStartupParameter::AutoSetup(EBootBios _BootBios)
|
|||||||
{
|
{
|
||||||
case BOOT_DEFAULT:
|
case BOOT_DEFAULT:
|
||||||
{
|
{
|
||||||
|
/* Check if the file exist, we may have gotten it from a --elf command line
|
||||||
|
that gave an incorrect file name */
|
||||||
|
if (!File::Exists(m_strFilename.c_str()))
|
||||||
|
{
|
||||||
|
PanicAlert("The file you specified (%s) does not exists", m_strFilename.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
std::string Extension;
|
std::string Extension;
|
||||||
SplitPath(m_strFilename, NULL, NULL, &Extension);
|
SplitPath(m_strFilename, NULL, NULL, &Extension);
|
||||||
if (!strcasecmp(Extension.c_str(), ".gcm") ||
|
if (!strcasecmp(Extension.c_str(), ".gcm") ||
|
||||||
|
@ -35,7 +35,7 @@ struct SCoreStartupParameter
|
|||||||
void* hMainWindow;
|
void* hMainWindow;
|
||||||
|
|
||||||
// flags
|
// flags
|
||||||
bool bEnableDebugging;
|
bool bEnableDebugging; bool bAutomaticStart;
|
||||||
bool bUseJIT;
|
bool bUseJIT;
|
||||||
|
|
||||||
bool bJITUnlimitedCache, bJITOff; // JIT
|
bool bJITUnlimitedCache, bJITOff; // JIT
|
||||||
|
@ -288,7 +288,7 @@ void ExecuteCommand(u32 _Address)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG(WII_IPC_HLE, "IOP: Open (Device=%s, DeviceID=%08x, Mode=%i)",
|
LOG(WII_IPC_HLE, "IOP: Open (Device=%s, DeviceID=%08x, Mode=%i)",
|
||||||
pDevice->GetDeviceName().c_str(), CurrentDeviceID, Mode);
|
pDevice->GetDeviceName().c_str(), CurrentDeviceID, Mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -434,7 +434,11 @@ void ExecuteCommand(u32 _Address)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is called continuously and WII_IPCInterface::IsReady() is controlled from WII_IPC.cpp.
|
|
||||||
|
// ===================================================
|
||||||
|
/* This is called continuously from SystemTimers.cpp and WII_IPCInterface::IsReady()
|
||||||
|
is controlled from WII_IPC.cpp. */
|
||||||
|
// ----------------
|
||||||
void Update()
|
void Update()
|
||||||
{
|
{
|
||||||
if (WII_IPCInterface::IsReady())
|
if (WII_IPCInterface::IsReady())
|
||||||
|
@ -136,22 +136,23 @@ protected:
|
|||||||
of 4 byte commands. */
|
of 4 byte commands. */
|
||||||
// ----------------
|
// ----------------
|
||||||
void DumpCommands(u32 _CommandAddress, size_t _NumberOfCommands = 8,
|
void DumpCommands(u32 _CommandAddress, size_t _NumberOfCommands = 8,
|
||||||
int LogType = LogTypes::WII_IPC_HLE)
|
int LogType = LogTypes::WII_IPC_HLE, int Verbosity = 0)
|
||||||
{
|
{
|
||||||
// Because I have to use __Logv here I add this #if
|
// Because I have to use __Logv here I add this #if
|
||||||
#if defined(_DEBUG) || defined(DEBUGFAST)
|
#if defined(_DEBUG) || defined(DEBUGFAST)
|
||||||
__Logv(LogType, 0, "CommandDump of %s", GetDeviceName().c_str());
|
__Logv(LogType, Verbosity, "CommandDump of %s", GetDeviceName().c_str());
|
||||||
for (u32 i = 0; i < _NumberOfCommands; i++)
|
for (u32 i = 0; i < _NumberOfCommands; i++)
|
||||||
{
|
{
|
||||||
__Logv(LogType, 0, " Command%02i: 0x%08x", i, Memory::Read_U32(_CommandAddress + i*4));
|
__Logv(LogType, Verbosity, " Command%02i: 0x%08x", i,
|
||||||
}
|
Memory::Read_U32(_CommandAddress + i*4));
|
||||||
#endif
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DumpAsync( u32 BufferVector, u32 _CommandAddress, u32 NumberInBuffer, u32 NumberOutBuffer )
|
void DumpAsync( u32 BufferVector, u32 _CommandAddress, u32 NumberInBuffer, u32 NumberOutBuffer )
|
||||||
{
|
{
|
||||||
LOG(WII_IPC_HLE, "======= DumpAsync ======");
|
LOGV(WII_IPC_HLE, 1, "======= DumpAsync ======");
|
||||||
// write return value
|
// write return value
|
||||||
u32 BufferOffset = BufferVector;
|
u32 BufferOffset = BufferVector;
|
||||||
Memory::Write_U32(1, _CommandAddress + 0x4);
|
Memory::Write_U32(1, _CommandAddress + 0x4);
|
||||||
@ -161,7 +162,7 @@ protected:
|
|||||||
u32 InBuffer = Memory::Read_U32(BufferOffset); BufferOffset += 4;
|
u32 InBuffer = Memory::Read_U32(BufferOffset); BufferOffset += 4;
|
||||||
u32 InBufferSize = Memory::Read_U32(BufferOffset); BufferOffset += 4;
|
u32 InBufferSize = Memory::Read_U32(BufferOffset); BufferOffset += 4;
|
||||||
|
|
||||||
LOG(WII_IPC_HLE, "%s - IOCtlV InBuffer[%i]:", GetDeviceName().c_str(), i);
|
LOGV(WII_IPC_HLE, 1, "%s - IOCtlV InBuffer[%i]:", GetDeviceName().c_str(), i);
|
||||||
|
|
||||||
std::string Temp;
|
std::string Temp;
|
||||||
for (u32 j=0; j<InBufferSize; j++)
|
for (u32 j=0; j<InBufferSize; j++)
|
||||||
@ -171,24 +172,25 @@ protected:
|
|||||||
Temp.append(Buffer);
|
Temp.append(Buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG(WII_IPC_HLE, " Buffer: %s", Temp.c_str());
|
LOGV(WII_IPC_HLE, 1, " Buffer: %s", Temp.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (u32 i=0; i<NumberOutBuffer; i++)
|
for (u32 i = 0; i < NumberOutBuffer; i++)
|
||||||
{
|
{
|
||||||
#ifdef LOGGING
|
#ifdef LOGGING
|
||||||
u32 OutBuffer = Memory::Read_U32(BufferOffset); BufferOffset += 4;
|
u32 OutBuffer = Memory::Read_U32(BufferOffset); BufferOffset += 4;
|
||||||
u32 OutBufferSize = Memory::Read_U32(BufferOffset); BufferOffset += 4;
|
u32 OutBufferSize = Memory::Read_U32(BufferOffset); BufferOffset += 4;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Memory::Write_U32(1, _CommandAddress + 0x4);
|
Memory::Write_U32(1, _CommandAddress + 0x4);
|
||||||
|
|
||||||
LOG(WII_IPC_HLE, "%s - IOCtlV OutBuffer[%i]:", GetDeviceName().c_str(), i);
|
LOGV(WII_IPC_HLE, 1, "%s - IOCtlV OutBuffer[%i]:", GetDeviceName().c_str(), i);
|
||||||
LOG(WII_IPC_HLE, " OutBuffer: 0x%08x (0x%x):", OutBuffer, OutBufferSize);
|
LOGV(WII_IPC_HLE, 1, " OutBuffer: 0x%08x (0x%x):", OutBuffer, OutBufferSize);
|
||||||
#ifdef LOGGING
|
|
||||||
DumpCommands(OutBuffer, OutBufferSize);
|
#ifdef LOGGING
|
||||||
#endif
|
DumpCommands(OutBuffer, OutBufferSize, LogTypes::WII_IPC_HLE, 1);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,8 +62,9 @@ bool CWII_IPC_HLE_Device_di::IOCtl(u32 _CommandAddress)
|
|||||||
u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14);
|
u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14);
|
||||||
u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18);
|
u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18);
|
||||||
u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C);
|
u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C);
|
||||||
|
u32 Command = Memory::Read_U32(BufferIn) >> 24;
|
||||||
|
|
||||||
LOG(WII_IPC_DVD, "%s - CommandAddress(0x%08x) BufferIn(0x%08x, 0x%x) BufferOut(0x%08x, 0x%x)", GetDeviceName().c_str(), _CommandAddress, BufferIn, BufferInSize, BufferOut, BufferOutSize);
|
LOG(WII_IPC_DVD, "%s - Command(0x%08x) BufferIn(0x%08x, 0x%x) BufferOut(0x%08x, 0x%x)", GetDeviceName().c_str(), Command, BufferIn, BufferInSize, BufferOut, BufferOutSize);
|
||||||
|
|
||||||
u32 ReturnValue = ExecuteCommand(BufferIn, BufferInSize, BufferOut, BufferOutSize);
|
u32 ReturnValue = ExecuteCommand(BufferIn, BufferInSize, BufferOut, BufferOutSize);
|
||||||
Memory::Write_U32(ReturnValue, _CommandAddress + 0x4);
|
Memory::Write_U32(ReturnValue, _CommandAddress + 0x4);
|
||||||
|
@ -165,20 +165,19 @@ public:
|
|||||||
|
|
||||||
case IOCTL_ES_GETVIEWCNT: // 0x12 (Input: 8 bytes, Output: 4 bytes)
|
case IOCTL_ES_GETVIEWCNT: // 0x12 (Input: 8 bytes, Output: 4 bytes)
|
||||||
{
|
{
|
||||||
if(Buffer.NumberPayloadBuffer)
|
|
||||||
u32 OutBuffer = Memory::Read_U32(Buffer.PayloadBuffer[0].m_Address);
|
|
||||||
if(Buffer.NumberInBuffer)
|
if(Buffer.NumberInBuffer)
|
||||||
u32 InBuffer = Memory::Read_U32(Buffer.InBuffer[0].m_Address);
|
u32 InBuffer = Memory::Read_U32(Buffer.InBuffer[0].m_Address);
|
||||||
|
|
||||||
// Should we write something here?
|
// Should we write something here?
|
||||||
//Memory::Write_U32(0, Buffer.PayloadBuffer[0].m_Address);
|
//Memory::Write_U32(0, Buffer.PayloadBuffer[0].m_Address);
|
||||||
|
|
||||||
|
//DumpCommands(Buffer.InBuffer[0].m_Address, Buffer.InBuffer[0].m_Size / 4,
|
||||||
|
// LogTypes::WII_IPC_NET);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IOCTL_ES_GETTMDVIEWCNT: // 0x14
|
case IOCTL_ES_GETTMDVIEWCNT: // 0x14
|
||||||
{
|
{
|
||||||
if(Buffer.NumberPayloadBuffer)
|
|
||||||
u32 OutBuffer = Memory::Read_U32(Buffer.PayloadBuffer[0].m_Address);
|
|
||||||
if(Buffer.NumberInBuffer)
|
if(Buffer.NumberInBuffer)
|
||||||
u32 InBuffer = Memory::Read_U32(Buffer.InBuffer[0].m_Address);
|
u32 InBuffer = Memory::Read_U32(Buffer.InBuffer[0].m_Address);
|
||||||
|
|
||||||
@ -188,6 +187,9 @@ public:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case IOCTL_ES_GETCONSUMPTION: // (Input: 8 bytes, Output: 0 bytes, 4 bytes)
|
case IOCTL_ES_GETCONSUMPTION: // (Input: 8 bytes, Output: 0 bytes, 4 bytes)
|
||||||
|
//DumpCommands(Buffer.InBuffer[0].m_Address, Buffer.InBuffer[0].m_Size / 4,
|
||||||
|
// LogTypes::WII_IPC_NET);
|
||||||
|
break;
|
||||||
case IOCTL_ES_DIGETTICKETVIEW: // (Input: none, Output: 216 bytes)
|
case IOCTL_ES_DIGETTICKETVIEW: // (Input: none, Output: 216 bytes)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -77,6 +77,7 @@ public:
|
|||||||
case IOCTL_STM_VIDIMMING: // (Input: 20 bytes, Output: 20 bytes)
|
case IOCTL_STM_VIDIMMING: // (Input: 20 bytes, Output: 20 bytes)
|
||||||
LOG(WII_IPC_SD, "%s - IOCtl: \n", GetDeviceName().c_str());
|
LOG(WII_IPC_SD, "%s - IOCtl: \n", GetDeviceName().c_str());
|
||||||
LOG(WII_IPC_SD, " IOCTL_STM_VIDIMMING");
|
LOG(WII_IPC_SD, " IOCTL_STM_VIDIMMING");
|
||||||
|
//DumpCommands(BufferIn, BufferInSize / 4, LogTypes::WII_IPC_SD);
|
||||||
//Memory::Write_U32(1, BufferOut);
|
//Memory::Write_U32(1, BufferOut);
|
||||||
//ReturnValue = 1;
|
//ReturnValue = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -59,17 +59,29 @@ CWII_IPC_HLE_Device_usb_oh1_57e_305::CWII_IPC_HLE_Device_usb_oh1_57e_305(u32 _De
|
|||||||
CWII_IPC_HLE_Device_usb_oh1_57e_305::~CWII_IPC_HLE_Device_usb_oh1_57e_305()
|
CWII_IPC_HLE_Device_usb_oh1_57e_305::~CWII_IPC_HLE_Device_usb_oh1_57e_305()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// ===================================================
|
||||||
|
/* Open */
|
||||||
|
// ----------------
|
||||||
bool CWII_IPC_HLE_Device_usb_oh1_57e_305::Open(u32 _CommandAddress, u32 _Mode)
|
bool CWII_IPC_HLE_Device_usb_oh1_57e_305::Open(u32 _CommandAddress, u32 _Mode)
|
||||||
{
|
{
|
||||||
Memory::Write_U32(GetDeviceID(), _CommandAddress+4);
|
Memory::Write_U32(GetDeviceID(), _CommandAddress+4);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ===================================================
|
||||||
|
/* IOCtl */
|
||||||
|
// ----------------
|
||||||
bool CWII_IPC_HLE_Device_usb_oh1_57e_305::IOCtl(u32 _CommandAddress)
|
bool CWII_IPC_HLE_Device_usb_oh1_57e_305::IOCtl(u32 _CommandAddress)
|
||||||
{
|
{
|
||||||
return IOCtlV(_CommandAddress); //hack
|
return IOCtlV(_CommandAddress); //hack
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ===================================================
|
||||||
|
/* IOCtlV */
|
||||||
|
// ----------------
|
||||||
bool CWII_IPC_HLE_Device_usb_oh1_57e_305::IOCtlV(u32 _CommandAddress)
|
bool CWII_IPC_HLE_Device_usb_oh1_57e_305::IOCtlV(u32 _CommandAddress)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -89,7 +101,6 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::IOCtlV(u32 _CommandAddress)
|
|||||||
Memory::Write_U8(1, 0x80151FC8); // DEBUGPrint */
|
Memory::Write_U8(1, 0x80151FC8); // DEBUGPrint */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// even it it wasn't very useful yet...
|
// even it it wasn't very useful yet...
|
||||||
// Memory::Write_U8(1, 0x80151488); // WPAD_LOG
|
// Memory::Write_U8(1, 0x80151488); // WPAD_LOG
|
||||||
// Memory::Write_U8(1, 0x801514A8); // USB_LOG
|
// Memory::Write_U8(1, 0x801514A8); // USB_LOG
|
||||||
@ -97,6 +108,7 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::IOCtlV(u32 _CommandAddress)
|
|||||||
// Memory::Write_U8(1, 0x80148E09); // HID LOG
|
// Memory::Write_U8(1, 0x80148E09); // HID LOG
|
||||||
|
|
||||||
SIOCtlVBuffer CommandBuffer(_CommandAddress);
|
SIOCtlVBuffer CommandBuffer(_CommandAddress);
|
||||||
|
|
||||||
switch(CommandBuffer.Parameter)
|
switch(CommandBuffer.Parameter)
|
||||||
{
|
{
|
||||||
case USB_IOCTL_HCI_COMMAND_MESSAGE:
|
case USB_IOCTL_HCI_COMMAND_MESSAGE:
|
||||||
@ -222,6 +234,13 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::IOCtlV(u32 _CommandAddress)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
// ================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ===================================================
|
||||||
|
/* Here we handle the USB_IOCTL_BLKMSG Ioctlv */
|
||||||
|
// ----------------
|
||||||
|
|
||||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::SendToDevice(u16 _ConnectionHandle, u8* _pData, u32 _Size)
|
void CWII_IPC_HLE_Device_usb_oh1_57e_305::SendToDevice(u16 _ConnectionHandle, u8* _pData, u32 _Size)
|
||||||
{
|
{
|
||||||
@ -234,11 +253,14 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::SendToDevice(u16 _ConnectionHandle, u8
|
|||||||
|
|
||||||
pWiiMote->SendACLFrame(_pData, _Size);
|
pWiiMote->SendACLFrame(_pData, _Size);
|
||||||
}
|
}
|
||||||
|
// ================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ===================================================
|
// ===================================================
|
||||||
/* Here we queue the ACL frames. They will consist of header + data. The header is
|
/* Here we queue the ACL frames we receive from the Wiimote plugin. They will consist of
|
||||||
for example 07 00 41 00 which means size 0x0007 and channel 0x0041. */
|
header + data. The header is for example 07 00 41 00 which means size 0x0007 and
|
||||||
|
channel 0x0041. */
|
||||||
// ----------------
|
// ----------------
|
||||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::SendACLFrame(u16 _ConnectionHandle, u8* _pData, u32 _Size)
|
void CWII_IPC_HLE_Device_usb_oh1_57e_305::SendACLFrame(u16 _ConnectionHandle, u8* _pData, u32 _Size)
|
||||||
{
|
{
|
||||||
@ -266,6 +288,10 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::SendACLFrame(u16 _ConnectionHandle, u8
|
|||||||
g_HCICount++;
|
g_HCICount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ===================================================
|
||||||
|
/* This is called from WII_IPC_HLE_Interface::Update() */
|
||||||
|
// ----------------
|
||||||
u32 CWII_IPC_HLE_Device_usb_oh1_57e_305::Update()
|
u32 CWII_IPC_HLE_Device_usb_oh1_57e_305::Update()
|
||||||
{
|
{
|
||||||
if (!m_EventQueue.empty() && m_pHCIBuffer)
|
if (!m_EventQueue.empty() && m_pHCIBuffer)
|
||||||
@ -356,16 +382,25 @@ u32 CWII_IPC_HLE_Device_usb_oh1_57e_305::Update()
|
|||||||
PluginWiimote::Wiimote_Update();
|
PluginWiimote::Wiimote_Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
// FiRES: TODO find a good solution to do this
|
// --------------------------------------------------------------------
|
||||||
|
/* We wait for ScanEnable to be sent from the game through HCI_CMD_WRITE_SCAN_ENABLE
|
||||||
|
before we initiate the connection. To avoid doing this for GC games we also
|
||||||
|
want m_LocalName from CommandWriteLocalName() to be "Wii".
|
||||||
|
|
||||||
|
FiRES: TODO find a good solution to do this */
|
||||||
|
// -------------------------
|
||||||
static bool test = true;
|
static bool test = true;
|
||||||
|
|
||||||
|
// Why do we need this? 0 worked with the emulated wiimote in all games I tried
|
||||||
static int counter = 1000;
|
static int counter = 1000;
|
||||||
|
|
||||||
if (test && !stricmp(m_LocalName, "Wii") && (m_ScanEnable & 0x2))
|
if (test && !stricmp(m_LocalName, "Wii") && (m_ScanEnable & 0x2))
|
||||||
{
|
{
|
||||||
counter--;
|
counter--;
|
||||||
if (counter < 0)
|
if (counter < 0)
|
||||||
{
|
{
|
||||||
test = false;
|
test = false;
|
||||||
for (size_t i=0; i<m_WiiMotes.size(); i++)
|
for (size_t i=0; i < m_WiiMotes.size(); i++)
|
||||||
{
|
{
|
||||||
if (m_WiiMotes[i].EventPagingChanged(2))
|
if (m_WiiMotes[i].EventPagingChanged(2))
|
||||||
{
|
{
|
||||||
@ -379,11 +414,12 @@ u32 CWII_IPC_HLE_Device_usb_oh1_57e_305::Update()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
// Events
|
||||||
//
|
// -----------------
|
||||||
// --- events
|
// This is messages send from the Wiimote to the game, for example RequestConnection()
|
||||||
//
|
// or ConnectionComplete().
|
||||||
//
|
//
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -411,6 +447,7 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventCommandStatus(u16 _Opcode)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventCommandComplete(u16 _OpCode, void* _pData, u32 _DataSize)
|
void CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventCommandComplete(u16 _OpCode, void* _pData, u32 _DataSize)
|
||||||
{
|
{
|
||||||
_dbg_assert_(WII_IPC_WIIMOTE, (sizeof(SHCIEventCommand) - 2 + _DataSize) < 256);
|
_dbg_assert_(WII_IPC_WIIMOTE, (sizeof(SHCIEventCommand) - 2 + _DataSize) < 256);
|
||||||
@ -909,10 +946,10 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventDisconnect(u16 _connectionHan
|
|||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
// Command dispacther
|
||||||
//
|
// -----------------
|
||||||
// --- command dispacther
|
// This is called from the USB_IOCTL_HCI_COMMAND_MESSAGE Ioctlv
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -1235,6 +1272,9 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandReadStoredLinkKey(u8* _Input)
|
|||||||
SendEventCommandComplete(HCI_CMD_READ_STORED_LINK_KEY, &Reply, sizeof(hci_read_stored_link_key_rp));
|
SendEventCommandComplete(HCI_CMD_READ_STORED_LINK_KEY, &Reply, sizeof(hci_read_stored_link_key_rp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ===================================================
|
||||||
|
/* This is the last message we get from homebrew's lwbt. Why does it stop with this one? */
|
||||||
|
// ----------------
|
||||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteUnitClass(u8* _Input)
|
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteUnitClass(u8* _Input)
|
||||||
{
|
{
|
||||||
// command parameters
|
// command parameters
|
||||||
@ -1313,6 +1353,11 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandHostBufferSize(u8* _Input)
|
|||||||
SendEventCommandComplete(HCI_CMD_HOST_BUFFER_SIZE, &Reply, sizeof(hci_host_buffer_size_rp));
|
SendEventCommandComplete(HCI_CMD_HOST_BUFFER_SIZE, &Reply, sizeof(hci_host_buffer_size_rp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ===================================================
|
||||||
|
/* Here we normally receive the timeout interval. But not from homebrew games that use
|
||||||
|
lwbt. Why not? */
|
||||||
|
// ----------------
|
||||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWritePageTimeOut(u8* _Input)
|
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWritePageTimeOut(u8* _Input)
|
||||||
{
|
{
|
||||||
#ifdef LOGGING
|
#ifdef LOGGING
|
||||||
@ -1331,13 +1376,15 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWritePageTimeOut(u8* _Input)
|
|||||||
SendEventCommandComplete(HCI_CMD_WRITE_PAGE_TIMEOUT, &Reply, sizeof(hci_host_buffer_size_rp));
|
SendEventCommandComplete(HCI_CMD_WRITE_PAGE_TIMEOUT, &Reply, sizeof(hci_host_buffer_size_rp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteScanEnable(u8* _Input)
|
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteScanEnable(u8* _Input)
|
||||||
{
|
{
|
||||||
// command parameters
|
// Command parameters
|
||||||
hci_write_scan_enable_cp* pWriteScanEnable = (hci_write_scan_enable_cp*)_Input;
|
hci_write_scan_enable_cp* pWriteScanEnable = (hci_write_scan_enable_cp*)_Input;
|
||||||
m_ScanEnable = pWriteScanEnable->scan_enable;
|
m_ScanEnable = pWriteScanEnable->scan_enable;
|
||||||
|
|
||||||
// reply
|
// Reply
|
||||||
hci_write_scan_enable_rp Reply;
|
hci_write_scan_enable_rp Reply;
|
||||||
Reply.status = 0x00;
|
Reply.status = 0x00;
|
||||||
|
|
||||||
@ -1351,13 +1398,15 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteScanEnable(u8* _Input)
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
LOG(WII_IPC_WIIMOTE, "Command: HCI_CMD_WRITE_SCAN_ENABLE:");
|
LOGV(WII_IPC_WIIMOTE, 0, "Command: HCI_CMD_WRITE_SCAN_ENABLE:");
|
||||||
LOG(WII_IPC_WIIMOTE, "write:");
|
LOGV(WII_IPC_WIIMOTE, 0, "write:");
|
||||||
LOG(WII_IPC_WIIMOTE, " scan_enable: %s", Scanning[pWriteScanEnable->scan_enable]);
|
LOGV(WII_IPC_WIIMOTE, 0, " scan_enable: %s", Scanning[pWriteScanEnable->scan_enable]);
|
||||||
|
|
||||||
SendEventCommandComplete(HCI_CMD_WRITE_SCAN_ENABLE, &Reply, sizeof(hci_write_scan_enable_rp));
|
SendEventCommandComplete(HCI_CMD_WRITE_SCAN_ENABLE, &Reply, sizeof(hci_write_scan_enable_rp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteInquiryMode(u8* _Input)
|
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteInquiryMode(u8* _Input)
|
||||||
{
|
{
|
||||||
#ifdef LOGGING
|
#ifdef LOGGING
|
||||||
|
@ -947,6 +947,8 @@ void CWII_IPC_HLE_WiiMote::SendL2capData(u16 scid, const void* _pData, u32 _Size
|
|||||||
|
|
||||||
namespace Core
|
namespace Core
|
||||||
{
|
{
|
||||||
|
/* This is called continously from the Wiimote plugin as soon as it has received
|
||||||
|
a reporting mode */
|
||||||
void Callback_WiimoteInput(u16 _channelID, const void* _pData, u32 _Size)
|
void Callback_WiimoteInput(u16 _channelID, const void* _pData, u32 _Size)
|
||||||
{
|
{
|
||||||
LOGV(WII_IPC_WIIMOTE, 3, "=========================================================");
|
LOGV(WII_IPC_WIIMOTE, 3, "=========================================================");
|
||||||
|
@ -162,6 +162,7 @@ void RunLoop()
|
|||||||
|
|
||||||
void Start()
|
void Start()
|
||||||
{
|
{
|
||||||
|
// Select running mode for CPU.cpp
|
||||||
state = Core::g_CoreStartupParameter.bEnableDebugging ? CPU_RUNNINGDEBUG : CPU_RUNNING;
|
state = Core::g_CoreStartupParameter.bEnableDebugging ? CPU_RUNNINGDEBUG : CPU_RUNNING;
|
||||||
if (Core::bReadTrace || Core::bWriteTrace)
|
if (Core::bReadTrace || Core::bWriteTrace)
|
||||||
{
|
{
|
||||||
|
@ -32,6 +32,9 @@ void SetVolumeName(const std::string& _rFullPath)
|
|||||||
if (g_pVolume)
|
if (g_pVolume)
|
||||||
{
|
{
|
||||||
// This code looks scary. Can the try/catch stuff be removed?
|
// This code looks scary. Can the try/catch stuff be removed?
|
||||||
|
// This cause a "Unhandled exception ... Access violation
|
||||||
|
// reading location ..." after you have started and stopped two
|
||||||
|
// or three games
|
||||||
delete g_pVolume;
|
delete g_pVolume;
|
||||||
g_pVolume = NULL;
|
g_pVolume = NULL;
|
||||||
}
|
}
|
||||||
|
@ -92,6 +92,7 @@ BEGIN_EVENT_TABLE(CCodeWindow, wxFrame)
|
|||||||
EVT_MENU(IDM_VIDEOWINDOW, CCodeWindow::OnToggleVideoWindow)
|
EVT_MENU(IDM_VIDEOWINDOW, CCodeWindow::OnToggleVideoWindow)
|
||||||
|
|
||||||
EVT_MENU(IDM_INTERPRETER, CCodeWindow::OnInterpreter) // CPU Mode
|
EVT_MENU(IDM_INTERPRETER, CCodeWindow::OnInterpreter) // CPU Mode
|
||||||
|
EVT_MENU(IDM_AUTOMATICSTART, CCodeWindow::OnAutomaticStart) // CPU Mode
|
||||||
EVT_MENU(IDM_JITUNLIMITED, CCodeWindow::OnJITOff)
|
EVT_MENU(IDM_JITUNLIMITED, CCodeWindow::OnJITOff)
|
||||||
EVT_MENU(IDM_JITOFF, CCodeWindow::OnJITOff)
|
EVT_MENU(IDM_JITOFF, CCodeWindow::OnJITOff)
|
||||||
EVT_MENU(IDM_JITLSOFF, CCodeWindow::OnJITOff)
|
EVT_MENU(IDM_JITLSOFF, CCodeWindow::OnJITOff)
|
||||||
@ -152,6 +153,11 @@ CCodeWindow::CCodeWindow(const SCoreStartupParameter& _LocalCoreStartupParameter
|
|||||||
, m_MemoryWindow(NULL)
|
, m_MemoryWindow(NULL)
|
||||||
, m_JitWindow(NULL)
|
, m_JitWindow(NULL)
|
||||||
{
|
{
|
||||||
|
// Load ini settings
|
||||||
|
IniFile file;
|
||||||
|
file.Load(DEBUGGER_CONFIG_FILE);
|
||||||
|
this->Load_(file);
|
||||||
|
|
||||||
InitBitmaps();
|
InitBitmaps();
|
||||||
|
|
||||||
CreateGUIControls(_LocalCoreStartupParameter);
|
CreateGUIControls(_LocalCoreStartupParameter);
|
||||||
@ -165,10 +171,6 @@ CCodeWindow::CCodeWindow(const SCoreStartupParameter& _LocalCoreStartupParameter
|
|||||||
wxKeyEventHandler(CCodeWindow::OnKeyDown),
|
wxKeyEventHandler(CCodeWindow::OnKeyDown),
|
||||||
(wxObject*)0, this);
|
(wxObject*)0, this);
|
||||||
|
|
||||||
// Load ini...
|
|
||||||
IniFile file;
|
|
||||||
file.Load(DEBUGGER_CONFIG_FILE);
|
|
||||||
|
|
||||||
// Load settings for selectable windowses, but only if they have been created
|
// Load settings for selectable windowses, but only if they have been created
|
||||||
this->Load(file);
|
this->Load(file);
|
||||||
if (m_BreakpointWindow) m_BreakpointWindow->Load(file);
|
if (m_BreakpointWindow) m_BreakpointWindow->Load(file);
|
||||||
@ -195,44 +197,13 @@ CCodeWindow::~CCodeWindow()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CCodeWindow::Load( IniFile &file )
|
|
||||||
{
|
|
||||||
int x,y,w,h;
|
|
||||||
file.Get("Code", "x", &x, GetPosition().x);
|
|
||||||
file.Get("Code", "y", &y, GetPosition().y);
|
|
||||||
file.Get("Code", "w", &w, GetSize().GetWidth());
|
|
||||||
file.Get("Code", "h", &h, GetSize().GetHeight());
|
|
||||||
this->SetSize(x, y, w, h);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CCodeWindow::Save(IniFile &file) const
|
|
||||||
{
|
|
||||||
file.Set("Code", "x", GetPosition().x);
|
|
||||||
file.Set("Code", "y", GetPosition().y);
|
|
||||||
file.Set("Code", "w", GetSize().GetWidth());
|
|
||||||
file.Set("Code", "h", GetSize().GetHeight());
|
|
||||||
}
|
|
||||||
|
|
||||||
// =======================================================================================
|
// =======================================================================================
|
||||||
// I don't know when you're supposed to be able to use pRegister->Check(true) so I had
|
// Load before CreateGUIControls()
|
||||||
// to set these here. It kept crashing if I placed it after m_LogWindow->Show() below.
|
// --------------
|
||||||
bool bLogWindow = true;
|
void CCodeWindow::Load_( IniFile &ini )
|
||||||
bool bRegisterWindow = true;
|
|
||||||
bool bBreakpointWindow = true;
|
|
||||||
bool bMemoryWindow = true;
|
|
||||||
bool bJitWindow = true;
|
|
||||||
bool bSoundWindow = false;
|
|
||||||
bool bVideoWindow = false;
|
|
||||||
// -------------------
|
|
||||||
void CCodeWindow::CreateGUIControls(const SCoreStartupParameter& _LocalCoreStartupParameter)
|
|
||||||
{
|
{
|
||||||
// =======================================================================================
|
|
||||||
// Decide what windows to use
|
|
||||||
// --------------
|
|
||||||
IniFile ini;
|
|
||||||
ini.Load(DEBUGGER_CONFIG_FILE);
|
|
||||||
|
|
||||||
|
// Decide what windows to use
|
||||||
ini.Get("ShowOnStart", "LogWindow", &bLogWindow, true);
|
ini.Get("ShowOnStart", "LogWindow", &bLogWindow, true);
|
||||||
ini.Get("ShowOnStart", "RegisterWindow", &bRegisterWindow, true);
|
ini.Get("ShowOnStart", "RegisterWindow", &bRegisterWindow, true);
|
||||||
ini.Get("ShowOnStart", "BreakpointWindow", &bBreakpointWindow, true);
|
ini.Get("ShowOnStart", "BreakpointWindow", &bBreakpointWindow, true);
|
||||||
@ -242,6 +213,45 @@ void CCodeWindow::CreateGUIControls(const SCoreStartupParameter& _LocalCoreStart
|
|||||||
ini.Get("ShowOnStart", "VideoWindow", &bVideoWindow, false);
|
ini.Get("ShowOnStart", "VideoWindow", &bVideoWindow, false);
|
||||||
// ===============
|
// ===============
|
||||||
|
|
||||||
|
// Boot to pause or not
|
||||||
|
ini.Get("ShowOnStart", "AutomaticStart", &bAutomaticStart, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CCodeWindow::Load( IniFile &ini )
|
||||||
|
{
|
||||||
|
int x,y,w,h;
|
||||||
|
ini.Get("CodeWindow", "x", &x, GetPosition().x);
|
||||||
|
ini.Get("CodeWindow", "y", &y, GetPosition().y);
|
||||||
|
ini.Get("CodeWindow", "w", &w, GetSize().GetWidth());
|
||||||
|
ini.Get("CodeWindow", "h", &h, GetSize().GetHeight());
|
||||||
|
this->SetSize(x, y, w, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CCodeWindow::Save(IniFile &ini) const
|
||||||
|
{
|
||||||
|
ini.Set("CodeWindow", "x", GetPosition().x);
|
||||||
|
ini.Set("CodeWindow", "y", GetPosition().y);
|
||||||
|
ini.Set("CodeWindow", "w", GetSize().GetWidth());
|
||||||
|
ini.Set("CodeWindow", "h", GetSize().GetHeight());
|
||||||
|
|
||||||
|
// Boot to pause or not
|
||||||
|
ini.Set("ShowOnStart", "AutomaticStart", GetMenuBar()->IsChecked(IDM_AUTOMATICSTART));
|
||||||
|
|
||||||
|
// Save windows settings
|
||||||
|
ini.Set("ShowOnStart", "LogWindow", GetMenuBar()->IsChecked(IDM_LOGWINDOW));
|
||||||
|
ini.Set("ShowOnStart", "RegisterWindow", GetMenuBar()->IsChecked(IDM_REGISTERWINDOW));
|
||||||
|
ini.Set("ShowOnStart", "BreakpointWindow", GetMenuBar()->IsChecked(IDM_BREAKPOINTWINDOW));
|
||||||
|
ini.Set("ShowOnStart", "MemoryWindow", GetMenuBar()->IsChecked(IDM_MEMORYWINDOW));
|
||||||
|
ini.Set("ShowOnStart", "JitWindow", GetMenuBar()->IsChecked(IDM_JITWINDOW));
|
||||||
|
ini.Set("ShowOnStart", "SoundWindow", GetMenuBar()->IsChecked(IDM_SOUNDWINDOW));
|
||||||
|
ini.Set("ShowOnStart", "VideoWindow", GetMenuBar()->IsChecked(IDM_VIDEOWINDOW));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CCodeWindow::CreateGUIControls(const SCoreStartupParameter& _LocalCoreStartupParameter)
|
||||||
|
{
|
||||||
CreateMenu(_LocalCoreStartupParameter);
|
CreateMenu(_LocalCoreStartupParameter);
|
||||||
|
|
||||||
// =======================================================================================
|
// =======================================================================================
|
||||||
@ -338,6 +348,9 @@ void CCodeWindow::CreateMenu(const SCoreStartupParameter& _LocalCoreStartupParam
|
|||||||
wxMenuItem* interpreter = pCoreMenu->Append(IDM_INTERPRETER, _T("&Interpreter core"), wxEmptyString, wxITEM_CHECK);
|
wxMenuItem* interpreter = pCoreMenu->Append(IDM_INTERPRETER, _T("&Interpreter core"), wxEmptyString, wxITEM_CHECK);
|
||||||
interpreter->Check(!_LocalCoreStartupParameter.bUseJIT);
|
interpreter->Check(!_LocalCoreStartupParameter.bUseJIT);
|
||||||
pCoreMenu->AppendSeparator();
|
pCoreMenu->AppendSeparator();
|
||||||
|
wxMenuItem* automaticstart = pCoreMenu->Append(IDM_AUTOMATICSTART, _T("&Automatic start"), wxEmptyString, wxITEM_CHECK);
|
||||||
|
automaticstart->Check(bAutomaticStart);
|
||||||
|
pCoreMenu->AppendSeparator();
|
||||||
|
|
||||||
#ifdef JIT_OFF_OPTIONS
|
#ifdef JIT_OFF_OPTIONS
|
||||||
jitunlimited = pCoreMenu->Append(IDM_JITUNLIMITED, _T("&Unlimited JIT Cache"), wxEmptyString, wxITEM_CHECK);
|
jitunlimited = pCoreMenu->Append(IDM_JITUNLIMITED, _T("&Unlimited JIT Cache"), wxEmptyString, wxITEM_CHECK);
|
||||||
@ -437,6 +450,10 @@ bool CCodeWindow::UseInterpreter()
|
|||||||
return GetMenuBar()->IsChecked(IDM_INTERPRETER);
|
return GetMenuBar()->IsChecked(IDM_INTERPRETER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CCodeWindow::AutomaticStart()
|
||||||
|
{
|
||||||
|
return GetMenuBar()->IsChecked(IDM_AUTOMATICSTART);
|
||||||
|
}
|
||||||
|
|
||||||
bool CCodeWindow::UseDualCore()
|
bool CCodeWindow::UseDualCore()
|
||||||
{
|
{
|
||||||
@ -458,6 +475,12 @@ void CCodeWindow::OnInterpreter(wxCommandEvent& event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CCodeWindow::OnAutomaticStart(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
bAutomaticStart = !bAutomaticStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void CCodeWindow::OnJITOff(wxCommandEvent& event)
|
void CCodeWindow::OnJITOff(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
if (Core::GetState() == Core::CORE_UNINITIALIZED)
|
if (Core::GetState() == Core::CORE_UNINITIALIZED)
|
||||||
@ -631,6 +654,9 @@ void CCodeWindow::OnSymbolsMenu(wxCommandEvent& event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// =======================================================================================
|
||||||
|
// The Play, Stop, Step, Skip, Go to PC and Show PC buttons all go here
|
||||||
|
// --------------
|
||||||
void CCodeWindow::OnCodeStep(wxCommandEvent& event)
|
void CCodeWindow::OnCodeStep(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
switch (event.GetId())
|
switch (event.GetId())
|
||||||
@ -793,6 +819,10 @@ void CCodeWindow::Update()
|
|||||||
}
|
}
|
||||||
|
|
||||||
UpdateButtonStates();
|
UpdateButtonStates();
|
||||||
|
|
||||||
|
/* Automatically show the current PC position when a breakpoint is hit or
|
||||||
|
when we pause */
|
||||||
|
codeview->Center(PC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -872,18 +902,10 @@ void CCodeWindow::OnSymbolListContextMenu(wxContextMenuEvent& event)
|
|||||||
|
|
||||||
void CCodeWindow::OnToggleLogWindow(wxCommandEvent& event)
|
void CCodeWindow::OnToggleLogWindow(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (IsLoggingActivated())
|
if (IsLoggingActivated())
|
||||||
{
|
{
|
||||||
bool show = GetMenuBar()->IsChecked(event.GetId());
|
bool show = GetMenuBar()->IsChecked(event.GetId());
|
||||||
|
|
||||||
// this may be a little ugly to have these here - you're more than welcome to
|
|
||||||
// turn this into the same fancy class stuff like the load windows positions
|
|
||||||
IniFile ini;
|
|
||||||
ini.Load(DEBUGGER_CONFIG_FILE);
|
|
||||||
ini.Set("ShowOnStart", "LogWindow", show);
|
|
||||||
ini.Save(DEBUGGER_CONFIG_FILE);
|
|
||||||
|
|
||||||
if (show)
|
if (show)
|
||||||
{
|
{
|
||||||
if (!m_LogWindow)
|
if (!m_LogWindow)
|
||||||
@ -914,11 +936,6 @@ void CCodeWindow::OnToggleRegisterWindow(wxCommandEvent& event)
|
|||||||
{
|
{
|
||||||
bool show = GetMenuBar()->IsChecked(event.GetId());
|
bool show = GetMenuBar()->IsChecked(event.GetId());
|
||||||
|
|
||||||
IniFile ini;
|
|
||||||
ini.Load(DEBUGGER_CONFIG_FILE);
|
|
||||||
ini.Set("ShowOnStart", "RegisterWindow", show);
|
|
||||||
ini.Save(DEBUGGER_CONFIG_FILE);
|
|
||||||
|
|
||||||
if (show)
|
if (show)
|
||||||
{
|
{
|
||||||
if (!m_RegisterWindow)
|
if (!m_RegisterWindow)
|
||||||
@ -951,11 +968,6 @@ void CCodeWindow::OnToggleSoundWindow(wxCommandEvent& event)
|
|||||||
{
|
{
|
||||||
bool show = GetMenuBar()->IsChecked(event.GetId());
|
bool show = GetMenuBar()->IsChecked(event.GetId());
|
||||||
|
|
||||||
IniFile ini;
|
|
||||||
ini.Load(DEBUGGER_CONFIG_FILE);
|
|
||||||
ini.Set("ShowOnStart", "SoundWindow", show);
|
|
||||||
ini.Save(DEBUGGER_CONFIG_FILE);
|
|
||||||
|
|
||||||
if (show)
|
if (show)
|
||||||
{
|
{
|
||||||
// TODO: add some kind of if() check here to?
|
// TODO: add some kind of if() check here to?
|
||||||
@ -985,11 +997,6 @@ void CCodeWindow::OnToggleVideoWindow(wxCommandEvent& event)
|
|||||||
{
|
{
|
||||||
bool show = GetMenuBar()->IsChecked(event.GetId());
|
bool show = GetMenuBar()->IsChecked(event.GetId());
|
||||||
//GetMenuBar()->Check(event.GetId(), false); // Turn off
|
//GetMenuBar()->Check(event.GetId(), false); // Turn off
|
||||||
|
|
||||||
IniFile ini;
|
|
||||||
ini.Load(DEBUGGER_CONFIG_FILE);
|
|
||||||
ini.Set("ShowOnStart", "VideoWindow", show);
|
|
||||||
ini.Save(DEBUGGER_CONFIG_FILE);
|
|
||||||
|
|
||||||
if (show)
|
if (show)
|
||||||
{
|
{
|
||||||
@ -1024,11 +1031,6 @@ void CCodeWindow::OnToggleJitWindow(wxCommandEvent& event)
|
|||||||
{
|
{
|
||||||
bool show = GetMenuBar()->IsChecked(event.GetId());
|
bool show = GetMenuBar()->IsChecked(event.GetId());
|
||||||
|
|
||||||
IniFile ini;
|
|
||||||
ini.Load(DEBUGGER_CONFIG_FILE);
|
|
||||||
ini.Set("ShowOnStart", "JitWindow", show);
|
|
||||||
ini.Save(DEBUGGER_CONFIG_FILE);
|
|
||||||
|
|
||||||
if (show)
|
if (show)
|
||||||
{
|
{
|
||||||
if (!m_JitWindow)
|
if (!m_JitWindow)
|
||||||
@ -1058,11 +1060,6 @@ void CCodeWindow::OnToggleBreakPointWindow(wxCommandEvent& event)
|
|||||||
{
|
{
|
||||||
bool show = GetMenuBar()->IsChecked(event.GetId());
|
bool show = GetMenuBar()->IsChecked(event.GetId());
|
||||||
|
|
||||||
IniFile ini;
|
|
||||||
ini.Load(DEBUGGER_CONFIG_FILE);
|
|
||||||
ini.Set("ShowOnStart", "BreakpointWindow", show);
|
|
||||||
ini.Save(DEBUGGER_CONFIG_FILE);
|
|
||||||
|
|
||||||
if (show)
|
if (show)
|
||||||
{
|
{
|
||||||
if (!m_BreakpointWindow)
|
if (!m_BreakpointWindow)
|
||||||
@ -1090,11 +1087,6 @@ void CCodeWindow::OnToggleBreakPointWindow(wxCommandEvent& event)
|
|||||||
void CCodeWindow::OnToggleMemoryWindow(wxCommandEvent& event)
|
void CCodeWindow::OnToggleMemoryWindow(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
bool show = GetMenuBar()->IsChecked(event.GetId());
|
bool show = GetMenuBar()->IsChecked(event.GetId());
|
||||||
|
|
||||||
IniFile ini;
|
|
||||||
ini.Load(DEBUGGER_CONFIG_FILE);
|
|
||||||
ini.Set("ShowOnStart", "MemoryWindow", show);
|
|
||||||
ini.Save(DEBUGGER_CONFIG_FILE);
|
|
||||||
|
|
||||||
if (show)
|
if (show)
|
||||||
{
|
{
|
||||||
|
@ -50,6 +50,7 @@ class CCodeWindow
|
|||||||
|
|
||||||
~CCodeWindow();
|
~CCodeWindow();
|
||||||
|
|
||||||
|
void Load_(IniFile &file);
|
||||||
void Load(IniFile &file);
|
void Load(IniFile &file);
|
||||||
void Save(IniFile &file) const;
|
void Save(IniFile &file) const;
|
||||||
|
|
||||||
@ -58,6 +59,7 @@ class CCodeWindow
|
|||||||
|
|
||||||
|
|
||||||
bool UseInterpreter();
|
bool UseInterpreter();
|
||||||
|
bool AutomaticStart();
|
||||||
bool UseDualCore();
|
bool UseDualCore();
|
||||||
void JumpToAddress(u32 _Address);
|
void JumpToAddress(u32 _Address);
|
||||||
|
|
||||||
@ -79,6 +81,7 @@ class CCodeWindow
|
|||||||
IDM_CALLSLIST,
|
IDM_CALLSLIST,
|
||||||
IDM_SYMBOLLIST,
|
IDM_SYMBOLLIST,
|
||||||
IDM_INTERPRETER,
|
IDM_INTERPRETER,
|
||||||
|
IDM_AUTOMATICSTART,
|
||||||
|
|
||||||
IDM_JITUNLIMITED, IDM_JITOFF, // jit
|
IDM_JITUNLIMITED, IDM_JITOFF, // jit
|
||||||
IDM_JITLSOFF, IDM_JITLSLXZOFF, IDM_JITLSLWZOFF, IDM_JITLSLBZXOFF,
|
IDM_JITLSOFF, IDM_JITLSLXZOFF, IDM_JITLSLWZOFF, IDM_JITLSLBZXOFF,
|
||||||
@ -123,6 +126,16 @@ class CCodeWindow
|
|||||||
Bitmaps_max
|
Bitmaps_max
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Settings
|
||||||
|
bool bLogWindow;
|
||||||
|
bool bRegisterWindow;
|
||||||
|
bool bBreakpointWindow;
|
||||||
|
bool bMemoryWindow;
|
||||||
|
bool bJitWindow;
|
||||||
|
bool bSoundWindow;
|
||||||
|
bool bVideoWindow;
|
||||||
|
bool bAutomaticStart;
|
||||||
|
|
||||||
// sub dialogs
|
// sub dialogs
|
||||||
CLogWindow* m_LogWindow;
|
CLogWindow* m_LogWindow;
|
||||||
CRegisterWindow* m_RegisterWindow;
|
CRegisterWindow* m_RegisterWindow;
|
||||||
@ -176,6 +189,7 @@ class CCodeWindow
|
|||||||
void OnProfilerMenu(wxCommandEvent& event);
|
void OnProfilerMenu(wxCommandEvent& event);
|
||||||
|
|
||||||
void OnInterpreter(wxCommandEvent& event); // cpu mode menu
|
void OnInterpreter(wxCommandEvent& event); // cpu mode menu
|
||||||
|
void OnAutomaticStart(wxCommandEvent& event);
|
||||||
void OnJITOff(wxCommandEvent& event);
|
void OnJITOff(wxCommandEvent& event);
|
||||||
|
|
||||||
void CreateMenu(const SCoreStartupParameter& _LocalCoreStartupParameter);
|
void CreateMenu(const SCoreStartupParameter& _LocalCoreStartupParameter);
|
||||||
|
@ -57,6 +57,7 @@ bool BootCore(const std::string& _rFilename)
|
|||||||
{
|
{
|
||||||
// StartUp.bUseDualCore = code_frame->UseDualCore();
|
// StartUp.bUseDualCore = code_frame->UseDualCore();
|
||||||
StartUp.bUseJIT = !g_pCodeWindow->UseInterpreter();
|
StartUp.bUseJIT = !g_pCodeWindow->UseInterpreter();
|
||||||
|
StartUp.bAutomaticStart = g_pCodeWindow->AutomaticStart();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -162,7 +163,9 @@ bool BootCore(const std::string& _rFilename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAVE_WX) && HAVE_WX
|
#if defined(HAVE_WX) && HAVE_WX
|
||||||
Core::SetState(g_pCodeWindow ? Core::CORE_PAUSE : Core::CORE_RUN);
|
// Boot to pause or not
|
||||||
|
Core::SetState((g_pCodeWindow && !StartUp.bAutomaticStart)
|
||||||
|
? Core::CORE_PAUSE : Core::CORE_RUN);
|
||||||
#else
|
#else
|
||||||
Core::SetState(Core::CORE_RUN);
|
Core::SetState(Core::CORE_RUN);
|
||||||
#endif
|
#endif
|
||||||
|
@ -407,6 +407,9 @@ void CFrame::OnHelp(wxCommandEvent& event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// =======================================================
|
||||||
|
// Play button
|
||||||
|
// -------------
|
||||||
void CFrame::OnPlay(wxCommandEvent& WXUNUSED (event))
|
void CFrame::OnPlay(wxCommandEvent& WXUNUSED (event))
|
||||||
{
|
{
|
||||||
if (Core::GetState() != Core::CORE_UNINITIALIZED)
|
if (Core::GetState() != Core::CORE_UNINITIALIZED)
|
||||||
@ -419,19 +422,28 @@ void CFrame::OnPlay(wxCommandEvent& WXUNUSED (event))
|
|||||||
{
|
{
|
||||||
Core::SetState(Core::CORE_RUN);
|
Core::SetState(Core::CORE_RUN);
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateGUI();
|
UpdateGUI();
|
||||||
}
|
}
|
||||||
|
// Start the selected ISO
|
||||||
else if (m_GameListCtrl->GetSelectedISO() != 0)
|
else if (m_GameListCtrl->GetSelectedISO() != 0)
|
||||||
{
|
{
|
||||||
BootManager::BootCore(m_GameListCtrl->GetSelectedISO()->GetFileName());
|
BootManager::BootCore(m_GameListCtrl->GetSelectedISO()->GetFileName());
|
||||||
}
|
}
|
||||||
|
/* Start the default ISO, or if we don't have a default ISO, start the last
|
||||||
|
started ISO */
|
||||||
|
else if (!SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDefaultGCM.empty() &&
|
||||||
|
wxFileExists(wxString(SConfig::GetInstance().m_LocalCoreStartupParameter.
|
||||||
|
m_strDefaultGCM.c_str(), wxConvUTF8)))
|
||||||
|
{
|
||||||
|
BootManager::BootCore(SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDefaultGCM);
|
||||||
|
}
|
||||||
else if (!SConfig::GetInstance().m_LastFilename.empty() &&
|
else if (!SConfig::GetInstance().m_LastFilename.empty() &&
|
||||||
wxFileExists(wxString(SConfig::GetInstance().m_LastFilename.c_str(), wxConvUTF8)))
|
wxFileExists(wxString(SConfig::GetInstance().m_LastFilename.c_str(), wxConvUTF8)))
|
||||||
{
|
{
|
||||||
BootManager::BootCore(SConfig::GetInstance().m_LastFilename);
|
BootManager::BootCore(SConfig::GetInstance().m_LastFilename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// =============
|
||||||
|
|
||||||
|
|
||||||
void CFrame::OnStop(wxCommandEvent& WXUNUSED (event))
|
void CFrame::OnStop(wxCommandEvent& WXUNUSED (event))
|
||||||
|
@ -558,14 +558,19 @@ void CGameListCtrl::OnOpenContainingFolder(wxCommandEvent& WXUNUSED (event))
|
|||||||
File::Explore(path.c_str());
|
File::Explore(path.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// =======================================================
|
||||||
|
// Save this file as the default file
|
||||||
|
// -------------
|
||||||
void CGameListCtrl::OnSetDefaultGCM(wxCommandEvent& WXUNUSED (event))
|
void CGameListCtrl::OnSetDefaultGCM(wxCommandEvent& WXUNUSED (event))
|
||||||
{
|
{
|
||||||
const GameListItem *iso = GetSelectedISO();
|
const GameListItem *iso = GetSelectedISO();
|
||||||
if (!iso)
|
if (!iso) return;
|
||||||
return;
|
|
||||||
SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDefaultGCM = iso->GetFileName();
|
SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDefaultGCM = iso->GetFileName();
|
||||||
SConfig::GetInstance().SaveSettings();
|
SConfig::GetInstance().SaveSettings();
|
||||||
}
|
}
|
||||||
|
// =============
|
||||||
|
|
||||||
|
|
||||||
void CGameListCtrl::OnDeleteGCM(wxCommandEvent& WXUNUSED (event))
|
void CGameListCtrl::OnDeleteGCM(wxCommandEvent& WXUNUSED (event))
|
||||||
{
|
{
|
||||||
|
@ -22,16 +22,21 @@
|
|||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#include <crtdbg.h>
|
#include <crtdbg.h>
|
||||||
#endif
|
#endif
|
||||||
#include "CPUDetect.h"
|
|
||||||
#include "Globals.h"
|
#include "Globals.h" // Core
|
||||||
#include "Host.h"
|
#include "Host.h"
|
||||||
#include "Common.h"
|
|
||||||
|
#include "Common.h" // Common
|
||||||
|
#include "CPUDetect.h"
|
||||||
#include "IniFile.h"
|
#include "IniFile.h"
|
||||||
#include "Main.h"
|
#include "FileUtil.h"
|
||||||
|
|
||||||
|
#include "Main.h" // Local
|
||||||
#include "Frame.h"
|
#include "Frame.h"
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "CodeWindow.h"
|
#include "CodeWindow.h"
|
||||||
#include "ExtendedTrace.h"
|
#include "ExtendedTrace.h"
|
||||||
|
#include "BootManager.h"
|
||||||
|
|
||||||
IMPLEMENT_APP(DolphinApp)
|
IMPLEMENT_APP(DolphinApp)
|
||||||
|
|
||||||
@ -107,14 +112,25 @@ bool DolphinApp::OnInit()
|
|||||||
// ============
|
// ============
|
||||||
// Check for debugger
|
// Check for debugger
|
||||||
bool UseDebugger = false;
|
bool UseDebugger = false;
|
||||||
|
bool LoadElf = false; wxString ElfFile;
|
||||||
|
|
||||||
#if wxUSE_CMDLINE_PARSER
|
#if wxUSE_CMDLINE_PARSER
|
||||||
wxCmdLineEntryDesc cmdLineDesc[] =
|
wxCmdLineEntryDesc cmdLineDesc[] =
|
||||||
{
|
{
|
||||||
{wxCMD_LINE_SWITCH, _T("h"), _T("help"), _T("Show this help message"), wxCMD_LINE_VAL_NONE,
|
{
|
||||||
wxCMD_LINE_OPTION_HELP},
|
wxCMD_LINE_SWITCH, _T("h"), _T("help"), _T("Show this help message"),
|
||||||
{wxCMD_LINE_SWITCH, _T("d"), _T("debugger"), _T("Opens the debugger")},
|
wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP
|
||||||
{wxCMD_LINE_NONE}
|
},
|
||||||
|
{
|
||||||
|
wxCMD_LINE_SWITCH, _T("d"), _T("debugger"), _T("Opens the debugger")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
wxCMD_LINE_OPTION, _T("e"), _T("elf"), _T("Loads an elf file"),
|
||||||
|
wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL
|
||||||
|
},
|
||||||
|
{
|
||||||
|
wxCMD_LINE_NONE
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
@ -126,16 +142,21 @@ bool DolphinApp::OnInit()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//gets the passed media files from command line
|
// Gets the passed media files from command line
|
||||||
wxCmdLineParser parser(cmdLineDesc, argc, argv);
|
wxCmdLineParser parser(cmdLineDesc, argc, argv);
|
||||||
|
|
||||||
// get filenames from the command line
|
// Get filenames from the command line
|
||||||
if (parser.Parse() != 0)
|
if (parser.Parse() != 0)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
UseDebugger = parser.Found(_T("debugger"));
|
UseDebugger = parser.Found(_T("debugger"));
|
||||||
|
LoadElf = parser.Found(_T("elf"), &ElfFile);
|
||||||
|
|
||||||
|
if( LoadElf && ElfFile == wxEmptyString )
|
||||||
|
PanicAlert("You did not specify a file name");
|
||||||
|
|
||||||
// ============
|
// ============
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -180,8 +201,30 @@ bool DolphinApp::OnInit()
|
|||||||
{
|
{
|
||||||
g_pCodeWindow = new CCodeWindow(SConfig::GetInstance().m_LocalCoreStartupParameter, main_frame);
|
g_pCodeWindow = new CCodeWindow(SConfig::GetInstance().m_LocalCoreStartupParameter, main_frame);
|
||||||
g_pCodeWindow->Show(true);
|
g_pCodeWindow->Show(true);
|
||||||
|
|
||||||
|
/* If we have selected Automatic Start, start the default ISO, or if no default
|
||||||
|
ISO exists, start the last loaded ISO */
|
||||||
|
if (g_pCodeWindow->AutomaticStart())
|
||||||
|
{
|
||||||
|
if(!SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDefaultGCM.empty()
|
||||||
|
&& File::Exists(SConfig::GetInstance().m_LocalCoreStartupParameter.
|
||||||
|
m_strDefaultGCM.c_str()))
|
||||||
|
{
|
||||||
|
BootManager::BootCore(SConfig::GetInstance().m_LocalCoreStartupParameter.
|
||||||
|
m_strDefaultGCM);
|
||||||
|
}
|
||||||
|
else if(!SConfig::GetInstance().m_LastFilename.empty()
|
||||||
|
&& File::Exists(SConfig::GetInstance().m_LastFilename.c_str()))
|
||||||
|
{
|
||||||
|
BootManager::BootCore(SConfig::GetInstance().m_LastFilename);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (LoadElf && ElfFile != wxEmptyString)
|
||||||
|
BootManager::BootCore(std::string(ElfFile.ToAscii()));
|
||||||
|
|
||||||
SetTopWindow(main_frame);
|
SetTopWindow(main_frame);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
#include "../Logging/Console.h" // open and close console
|
#include "../Logging/Console.h" // open and close console
|
||||||
|
|
||||||
extern std::vector<std::string> sMailLog, sMailTime;
|
extern std::vector<std::string> sMailLog, sMailTime;
|
||||||
|
extern CDebugger* m_frame;
|
||||||
|
|
||||||
// =======================================================================================
|
// =======================================================================================
|
||||||
// Update mail window
|
// Update mail window
|
||||||
@ -60,7 +60,10 @@ void CDebugger::DoUpdateMail()
|
|||||||
void CDebugger::UpdateMail(wxNotebookEvent& event)
|
void CDebugger::UpdateMail(wxNotebookEvent& event)
|
||||||
{
|
{
|
||||||
DoUpdateMail();
|
DoUpdateMail();
|
||||||
if(StoreMails) ReadDir();
|
/* This may be called before m_frame is fully created through the
|
||||||
|
EVT_NOTEBOOK_PAGE_CHANGED, in that case it will crash because this
|
||||||
|
is accessing members of it */
|
||||||
|
if(StoreMails && m_frame) ReadDir();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Change mail from radio button change
|
// Change mail from radio button change
|
||||||
|
Reference in New Issue
Block a user