Cocoa Port: Give user feedback for when the emulation gets halted internally.

- Also be more consistent when recovering from an internal emulation halt.
- Also apply enabling the external BIOS, external firmware and firmware boot settings at load/reset time instead of at frame time.
This commit is contained in:
rogerman 2017-09-19 12:59:44 -07:00
parent 1c59441697
commit 830dd0d78c
14 changed files with 760 additions and 73 deletions

View File

@ -1490,7 +1490,7 @@ void FASTCALL MMU_writeToSPIData(u16 val)
{ {
printf("SYSTEM POWERED OFF VIA ARM7 SPI POWER DEVICE\n"); printf("SYSTEM POWERED OFF VIA ARM7 SPI POWER DEVICE\n");
printf("Did your main() return?\n"); printf("Did your main() return?\n");
emu_halt(); emu_halt(EMUHALT_REASON_SYSTEM_POWERED_OFF, NDSErrorTag_None);
} }
} }

View File

@ -84,6 +84,7 @@ std::string InputDisplayString;
static BOOL LidClosed = FALSE; static BOOL LidClosed = FALSE;
static u8 countLid = 0; static u8 countLid = 0;
static NDSError _lastNDSError;
GameInfo gameInfo; GameInfo gameInfo;
NDSSystem nds; NDSSystem nds;
@ -2663,6 +2664,10 @@ void NDS_Reset()
//this needs to happen last, pretty much, since it establishes the correct scheduling state based on all of the above initialization //this needs to happen last, pretty much, since it establishes the correct scheduling state based on all of the above initialization
initSchedule(); initSchedule();
_lastNDSError.code = NDSError_NoError;
_lastNDSError.tag = NDSErrorTag_None;
NDS_CurrentCPUInfoToNDSError(_lastNDSError);
} }
static std::string MakeInputDisplayString(u16 pad, const std::string* Buttons, int count) { static std::string MakeInputDisplayString(u16 pad, const std::string* Buttons, int count) {
@ -3019,12 +3024,59 @@ void NDS_swapScreen()
} }
} }
NDSError NDS_GetLastError()
void emu_halt()
{ {
//printf("halting emu: ARM9 PC=%08X/%08X, ARM7 PC=%08X/%08X\n", NDS_ARM9.R[15], NDS_ARM9.instruct_adr, NDS_ARM7.R[15], NDS_ARM7.instruct_adr); return _lastNDSError;
execute = false; }
static void NDS_CurrentCPUInfoToNDSError(NDSError &ndsError)
{
ndsError.programCounterARM9 = NDS_ARM9.R[15];
ndsError.instructionARM9 = NDS_ARM9.instruction;
ndsError.instructionAddrARM9 = NDS_ARM9.instruct_adr;
ndsError.programCounterARM7 = NDS_ARM7.R[15];
ndsError.instructionARM7 = NDS_ARM7.instruction;
ndsError.instructionAddrARM7 = NDS_ARM7.instruct_adr;
}
void emu_halt(EmuHaltReasonCode reasonCode, NDSErrorTag errorTag)
{
switch (reasonCode)
{
case EMUHALT_REASON_USER_REQUESTED_HALT:
_lastNDSError.code = NDSError_NoError;
_lastNDSError.tag = NDSErrorTag_None;
break;
case EMUHALT_REASON_SYSTEM_POWERED_OFF:
_lastNDSError.code = NDSError_SystemPoweredOff;
_lastNDSError.tag = NDSErrorTag_None;
break;
case EMUHALT_REASON_JIT_UNMAPPED_ADDRESS_EXCEPTION:
_lastNDSError.code = NDSError_JITUnmappedAddressException;
_lastNDSError.tag = errorTag;
break;
case EMUHALT_REASON_ARM_RESERVED_0X14_EXCEPTION:
case EMUHALT_REASON_ARM_UNDEFINED_INSTRUCTION_EXCEPTION:
_lastNDSError.code = NDSError_ARMUndefinedInstructionException;
_lastNDSError.tag = errorTag;
break;
case EMUHALT_REASON_UNKNOWN:
default:
_lastNDSError.code = NDSError_UnknownError;
_lastNDSError.tag = errorTag;
break;
}
NDS_CurrentCPUInfoToNDSError(_lastNDSError);
GPU->ForceFrameStop(); GPU->ForceFrameStop();
execute = false;
//printf("halting emu: ARM9 PC=%08X/%08X, ARM7 PC=%08X/%08X\n", NDS_ARM9.R[15], NDS_ARM9.instruct_adr, NDS_ARM7.R[15], NDS_ARM7.instruct_adr);
#ifdef LOG_ARM9 #ifdef LOG_ARM9
if (fp_dis9) if (fp_dis9)

View File

@ -82,6 +82,52 @@ enum
ROM_DSGBA ROM_DSGBA
}; };
enum EmuHaltReasonCode
{
EMUHALT_REASON_USER_REQUESTED_HALT = 0,
EMUHALT_REASON_SYSTEM_POWERED_OFF = 1000,
EMUHALT_REASON_JIT_UNMAPPED_ADDRESS_EXCEPTION = 2000,
EMUHALT_REASON_ARM_RESERVED_0X14_EXCEPTION,
EMUHALT_REASON_ARM_UNDEFINED_INSTRUCTION_EXCEPTION,
EMUHALT_REASON_UNKNOWN = 10000
};
enum NDSErrorCode
{
NDSError_NoError = 0,
NDSError_SystemPoweredOff = 1000,
NDSError_JITUnmappedAddressException = 2000,
NDSError_ARMUndefinedInstructionException,
NDSError_UnknownError = 10000
};
enum NDSErrorTag
{
NDSErrorTag_None = 0,
NDSErrorTag_ARM9 = 1,
NDSErrorTag_ARM7 = 2,
NDSErrorTag_BothCPUs = 3,
};
struct NDSError
{
NDSErrorCode code;
NDSErrorTag tag;
u32 programCounterARM9;
u32 instructionARM9;
u32 instructionAddrARM9;
u32 programCounterARM7;
u32 instructionARM7;
u32 instructionAddrARM7;
};
typedef struct NDSError NDSError;
//#define LOG_ARM9 //#define LOG_ARM9
//#define LOG_ARM7 //#define LOG_ARM7
@ -143,7 +189,9 @@ struct NDS_header
#include "PACKED_END.h" #include "PACKED_END.h"
extern void debug(); extern void debug();
void emu_halt(); NDSError NDS_GetLastError();
static void NDS_CurrentCPUInfoToNDSError(NDSError &ndsError);
void emu_halt(EmuHaltReasonCode reasonCode, NDSErrorTag errorTag);
extern u64 nds_timer; extern u64 nds_timer;
void NDS_Reschedule(); void NDS_Reschedule();

View File

@ -498,7 +498,7 @@ void armcpu_exception(armcpu_t *cpu, u32 number)
case EXCEPTION_SWI: cpumode = SVC; break; case EXCEPTION_SWI: cpumode = SVC; break;
case EXCEPTION_PREFETCH_ABORT: cpumode = ABT; break; case EXCEPTION_PREFETCH_ABORT: cpumode = ABT; break;
case EXCEPTION_DATA_ABORT: cpumode = ABT; break; case EXCEPTION_DATA_ABORT: cpumode = ABT; break;
case EXCEPTION_RESERVED_0x14: emu_halt(); break; case EXCEPTION_RESERVED_0x14: emu_halt(EMUHALT_REASON_ARM_RESERVED_0X14_EXCEPTION, (cpu->proc_ID == ARMCPU_ARM9) ? NDSErrorTag_ARM9 : NDSErrorTag_ARM7); break;
case EXCEPTION_IRQ: cpumode = IRQ; break; case EXCEPTION_IRQ: cpumode = IRQ; break;
case EXCEPTION_FAST_IRQ: cpumode = FIQ; break; case EXCEPTION_FAST_IRQ: cpumode = FIQ; break;
} }
@ -576,7 +576,7 @@ u32 TRAPUNDEF(armcpu_t* cpu)
} }
else else
{ {
emu_halt(); emu_halt(EMUHALT_REASON_ARM_UNDEFINED_INSTRUCTION_EXCEPTION, (cpu->proc_ID == ARMCPU_ARM9) ? NDSErrorTag_ARM9 : NDSErrorTag_ARM7);
return 4; return 4;
} }
} }

View File

@ -379,20 +379,20 @@ void ClientExecutionControl::SetEnableGameSpecificHacks(bool enable)
bool ClientExecutionControl::GetEnableExternalBIOS() bool ClientExecutionControl::GetEnableExternalBIOS()
{ {
pthread_mutex_lock(&this->_mutexSettingsPendingOnNDSExec); pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
const bool enable = this->_settingsPending.enableExternalBIOS; const bool enable = this->_settingsPending.enableExternalBIOS;
pthread_mutex_unlock(&this->_mutexSettingsPendingOnNDSExec); pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
return enable; return enable;
} }
void ClientExecutionControl::SetEnableExternalBIOS(bool enable) void ClientExecutionControl::SetEnableExternalBIOS(bool enable)
{ {
pthread_mutex_lock(&this->_mutexSettingsPendingOnNDSExec); pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
this->_settingsPending.enableExternalBIOS = enable; this->_settingsPending.enableExternalBIOS = enable;
this->_newSettingsPendingOnNDSExec = true; this->_newSettingsPendingOnReset = true;
pthread_mutex_unlock(&this->_mutexSettingsPendingOnNDSExec); pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
} }
bool ClientExecutionControl::GetEnableBIOSInterrupts() bool ClientExecutionControl::GetEnableBIOSInterrupts()
@ -433,38 +433,38 @@ void ClientExecutionControl::SetEnableBIOSPatchDelayLoop(bool enable)
bool ClientExecutionControl::GetEnableExternalFirmware() bool ClientExecutionControl::GetEnableExternalFirmware()
{ {
pthread_mutex_lock(&this->_mutexSettingsPendingOnNDSExec); pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
const bool enable = this->_settingsPending.enableExternalFirmware; const bool enable = this->_settingsPending.enableExternalFirmware;
pthread_mutex_unlock(&this->_mutexSettingsPendingOnNDSExec); pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
return enable; return enable;
} }
void ClientExecutionControl::SetEnableExternalFirmware(bool enable) void ClientExecutionControl::SetEnableExternalFirmware(bool enable)
{ {
pthread_mutex_lock(&this->_mutexSettingsPendingOnNDSExec); pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
this->_settingsPending.enableExternalFirmware = enable; this->_settingsPending.enableExternalFirmware = enable;
this->_newSettingsPendingOnNDSExec = true; this->_newSettingsPendingOnReset = true;
pthread_mutex_unlock(&this->_mutexSettingsPendingOnNDSExec); pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
} }
bool ClientExecutionControl::GetEnableFirmwareBoot() bool ClientExecutionControl::GetEnableFirmwareBoot()
{ {
pthread_mutex_lock(&this->_mutexSettingsPendingOnNDSExec); pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
const bool enable = this->_settingsPending.enableFirmwareBoot; const bool enable = this->_settingsPending.enableFirmwareBoot;
pthread_mutex_unlock(&this->_mutexSettingsPendingOnNDSExec); pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
return enable; return enable;
} }
void ClientExecutionControl::SetEnableFirmwareBoot(bool enable) void ClientExecutionControl::SetEnableFirmwareBoot(bool enable)
{ {
pthread_mutex_lock(&this->_mutexSettingsPendingOnNDSExec); pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
this->_settingsPending.enableFirmwareBoot = enable; this->_settingsPending.enableFirmwareBoot = enable;
this->_newSettingsPendingOnNDSExec = true; this->_newSettingsPendingOnReset = true;
pthread_mutex_unlock(&this->_mutexSettingsPendingOnNDSExec); pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
} }
bool ClientExecutionControl::GetEnableDebugConsole() bool ClientExecutionControl::GetEnableDebugConsole()
@ -710,6 +710,10 @@ void ClientExecutionControl::ApplySettingsOnReset()
this->_settingsApplied.filePathFirmware = this->_settingsPending.filePathFirmware; this->_settingsApplied.filePathFirmware = this->_settingsPending.filePathFirmware;
this->_settingsApplied.filePathSlot1R4 = this->_settingsPending.filePathSlot1R4; this->_settingsApplied.filePathSlot1R4 = this->_settingsPending.filePathSlot1R4;
this->_settingsApplied.enableExternalBIOS = this->_settingsPending.enableExternalBIOS;
this->_settingsApplied.enableExternalFirmware = this->_settingsPending.enableExternalFirmware;
this->_settingsApplied.enableFirmwareBoot = this->_settingsPending.enableFirmwareBoot;
this->_settingsApplied.cpuEmulationEngineName = this->_settingsPending.cpuEmulationEngineName; this->_settingsApplied.cpuEmulationEngineName = this->_settingsPending.cpuEmulationEngineName;
this->_settingsApplied.slot1DeviceName = this->_settingsPending.slot1DeviceName; this->_settingsApplied.slot1DeviceName = this->_settingsPending.slot1DeviceName;
this->_ndsFrameInfo.cpuEmulationEngineName = this->_settingsApplied.cpuEmulationEngineName; this->_ndsFrameInfo.cpuEmulationEngineName = this->_settingsApplied.cpuEmulationEngineName;
@ -726,6 +730,10 @@ void ClientExecutionControl::ApplySettingsOnReset()
CommonSettings.use_jit = (this->_settingsApplied.cpuEngineID == CPUEmulationEngineID_DynamicRecompiler); CommonSettings.use_jit = (this->_settingsApplied.cpuEngineID == CPUEmulationEngineID_DynamicRecompiler);
CommonSettings.jit_max_block_size = this->_settingsApplied.JITMaxBlockSize; CommonSettings.jit_max_block_size = this->_settingsApplied.JITMaxBlockSize;
CommonSettings.UseExtBIOS = this->_settingsApplied.enableExternalBIOS;
CommonSettings.UseExtFirmware = this->_settingsApplied.enableExternalFirmware;
CommonSettings.UseExtFirmwareSettings = this->_settingsApplied.enableExternalFirmware;
CommonSettings.BootFromFirmware = this->_settingsApplied.enableFirmwareBoot;
if (this->_settingsApplied.filePathARM9BIOS.length() == 0) if (this->_settingsApplied.filePathARM9BIOS.length() == 0)
{ {
@ -842,11 +850,8 @@ void ClientExecutionControl::ApplySettingsOnNDSExec()
this->_settingsApplied.enableAdvancedBusLevelTiming = this->_settingsPending.enableAdvancedBusLevelTiming; this->_settingsApplied.enableAdvancedBusLevelTiming = this->_settingsPending.enableAdvancedBusLevelTiming;
this->_settingsApplied.enableRigorous3DRenderingTiming = this->_settingsPending.enableRigorous3DRenderingTiming; this->_settingsApplied.enableRigorous3DRenderingTiming = this->_settingsPending.enableRigorous3DRenderingTiming;
this->_settingsApplied.enableGameSpecificHacks = this->_settingsPending.enableGameSpecificHacks; this->_settingsApplied.enableGameSpecificHacks = this->_settingsPending.enableGameSpecificHacks;
this->_settingsApplied.enableExternalBIOS = this->_settingsPending.enableExternalBIOS;
this->_settingsApplied.enableBIOSInterrupts = this->_settingsPending.enableBIOSInterrupts; this->_settingsApplied.enableBIOSInterrupts = this->_settingsPending.enableBIOSInterrupts;
this->_settingsApplied.enableBIOSPatchDelayLoop = this->_settingsPending.enableBIOSPatchDelayLoop; this->_settingsApplied.enableBIOSPatchDelayLoop = this->_settingsPending.enableBIOSPatchDelayLoop;
this->_settingsApplied.enableExternalFirmware = this->_settingsPending.enableExternalFirmware;
this->_settingsApplied.enableFirmwareBoot = this->_settingsPending.enableFirmwareBoot;
this->_settingsApplied.enableDebugConsole = this->_settingsPending.enableDebugConsole; this->_settingsApplied.enableDebugConsole = this->_settingsPending.enableDebugConsole;
this->_settingsApplied.enableEnsataEmulation = this->_settingsPending.enableEnsataEmulation; this->_settingsApplied.enableEnsataEmulation = this->_settingsPending.enableEnsataEmulation;
@ -862,12 +867,8 @@ void ClientExecutionControl::ApplySettingsOnNDSExec()
CommonSettings.advanced_timing = this->_settingsApplied.enableAdvancedBusLevelTiming; CommonSettings.advanced_timing = this->_settingsApplied.enableAdvancedBusLevelTiming;
CommonSettings.rigorous_timing = this->_settingsApplied.enableRigorous3DRenderingTiming; CommonSettings.rigorous_timing = this->_settingsApplied.enableRigorous3DRenderingTiming;
CommonSettings.UseExtBIOS = this->_settingsApplied.enableExternalBIOS;
CommonSettings.SWIFromBIOS = this->_settingsApplied.enableBIOSInterrupts; CommonSettings.SWIFromBIOS = this->_settingsApplied.enableBIOSInterrupts;
CommonSettings.PatchSWI3 = this->_settingsApplied.enableBIOSPatchDelayLoop; CommonSettings.PatchSWI3 = this->_settingsApplied.enableBIOSPatchDelayLoop;
CommonSettings.UseExtFirmware = this->_settingsApplied.enableExternalFirmware;
CommonSettings.UseExtFirmwareSettings = this->_settingsApplied.enableExternalFirmware;
CommonSettings.BootFromFirmware = this->_settingsApplied.enableFirmwareBoot;
CommonSettings.DebugConsole = this->_settingsApplied.enableDebugConsole; CommonSettings.DebugConsole = this->_settingsApplied.enableDebugConsole;
CommonSettings.EnsataEmulation = this->_settingsApplied.enableEnsataEmulation; CommonSettings.EnsataEmulation = this->_settingsApplied.enableEnsataEmulation;

View File

@ -1422,6 +1422,11 @@
ABAE30BD1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; }; ABAE30BD1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; };
ABAE30BE1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; }; ABAE30BE1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; };
ABAE30BF1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; }; ABAE30BF1869484F00C92F4F /* Image_Piano.png in Resources */ = {isa = PBXBuildFile; fileRef = ABAE30BA1869484F00C92F4F /* Image_Piano.png */; };
ABAFD2751F7110E4007705BD /* gdbstub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */; };
ABAFD2761F7110E4007705BD /* gdbstub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */; };
ABAFD2771F7110E5007705BD /* gdbstub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */; };
ABAFD2781F7110E5007705BD /* gdbstub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */; };
ABAFD2791F7110E6007705BD /* gdbstub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */; };
ABB6AD5D173A3F2B00EC2E8D /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */; }; ABB6AD5D173A3F2B00EC2E8D /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */; };
ABB9212117CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB9212017CEB4110049D4C5 /* slot1comp_protocol.cpp */; }; ABB9212117CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB9212017CEB4110049D4C5 /* slot1comp_protocol.cpp */; };
ABB9212217CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB9212017CEB4110049D4C5 /* slot1comp_protocol.cpp */; }; ABB9212217CEB4110049D4C5 /* slot1comp_protocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB9212017CEB4110049D4C5 /* slot1comp_protocol.cpp */; };
@ -4611,6 +4616,7 @@
ABD4F2741F54A51000D75A1F /* ClientExecutionControl.cpp in Sources */, ABD4F2741F54A51000D75A1F /* ClientExecutionControl.cpp in Sources */,
ABC04DA41F67A20500EA6ED7 /* ClientInputHandler.cpp in Sources */, ABC04DA41F67A20500EA6ED7 /* ClientInputHandler.cpp in Sources */,
ABC04DCB1F67A2AC00EA6ED7 /* macosx_10_5_compat.cpp in Sources */, ABC04DCB1F67A2AC00EA6ED7 /* macosx_10_5_compat.cpp in Sources */,
ABAFD2791F7110E6007705BD /* gdbstub.cpp in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -4798,6 +4804,7 @@
ABD4F2751F54A51000D75A1F /* ClientExecutionControl.cpp in Sources */, ABD4F2751F54A51000D75A1F /* ClientExecutionControl.cpp in Sources */,
ABC04DA51F67A20500EA6ED7 /* ClientInputHandler.cpp in Sources */, ABC04DA51F67A20500EA6ED7 /* ClientInputHandler.cpp in Sources */,
ABC04DCC1F67A2AC00EA6ED7 /* macosx_10_5_compat.cpp in Sources */, ABC04DCC1F67A2AC00EA6ED7 /* macosx_10_5_compat.cpp in Sources */,
ABAFD2781F7110E5007705BD /* gdbstub.cpp in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -5015,6 +5022,7 @@
ABD4F2731F54A51000D75A1F /* ClientExecutionControl.cpp in Sources */, ABD4F2731F54A51000D75A1F /* ClientExecutionControl.cpp in Sources */,
ABC04DA31F67A20500EA6ED7 /* ClientInputHandler.cpp in Sources */, ABC04DA31F67A20500EA6ED7 /* ClientInputHandler.cpp in Sources */,
ABC04DCA1F67A2AC00EA6ED7 /* macosx_10_5_compat.cpp in Sources */, ABC04DCA1F67A2AC00EA6ED7 /* macosx_10_5_compat.cpp in Sources */,
ABAFD2751F7110E4007705BD /* gdbstub.cpp in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -5232,6 +5240,7 @@
ABD4F2771F54A51000D75A1F /* ClientExecutionControl.cpp in Sources */, ABD4F2771F54A51000D75A1F /* ClientExecutionControl.cpp in Sources */,
ABC04DA71F67A20500EA6ED7 /* ClientInputHandler.cpp in Sources */, ABC04DA71F67A20500EA6ED7 /* ClientInputHandler.cpp in Sources */,
ABC04DCE1F67A2AC00EA6ED7 /* macosx_10_5_compat.cpp in Sources */, ABC04DCE1F67A2AC00EA6ED7 /* macosx_10_5_compat.cpp in Sources */,
ABAFD2761F7110E4007705BD /* gdbstub.cpp in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -5419,6 +5428,7 @@
ABD4F2761F54A51000D75A1F /* ClientExecutionControl.cpp in Sources */, ABD4F2761F54A51000D75A1F /* ClientExecutionControl.cpp in Sources */,
ABC04DA61F67A20500EA6ED7 /* ClientInputHandler.cpp in Sources */, ABC04DA61F67A20500EA6ED7 /* ClientInputHandler.cpp in Sources */,
ABC04DCD1F67A2AC00EA6ED7 /* macosx_10_5_compat.cpp in Sources */, ABC04DCD1F67A2AC00EA6ED7 /* macosx_10_5_compat.cpp in Sources */,
ABAFD2771F7110E5007705BD /* gdbstub.cpp in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -5625,6 +5635,7 @@
GCC_PREPROCESSOR_DEFINITIONS = ( GCC_PREPROCESSOR_DEFINITIONS = (
_DEBUG, _DEBUG,
"DEBUG=1", "DEBUG=1",
GDB_STUB,
); );
GCC_STRICT_ALIASING = YES; GCC_STRICT_ALIASING = YES;
GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_SYMBOLS_PRIVATE_EXTERN = NO;

View File

@ -22,6 +22,9 @@
#include <string> #include <string>
#import "cocoa_util.h" #import "cocoa_util.h"
#include "../../NDSSystem.h"
#undef BOOL
class ClientExecutionControl; class ClientExecutionControl;
@class CocoaDSCore; @class CocoaDSCore;
@ -68,6 +71,7 @@ typedef struct
NSString *slot1StatusText; NSString *slot1StatusText;
NSString *frameStatus; NSString *frameStatus;
NSString *executionSpeedStatus; NSString *executionSpeedStatus;
NSString *errorStatus;
OSSpinLock spinlockCdsController; OSSpinLock spinlockCdsController;
OSSpinLock spinlockMasterExecute; OSSpinLock spinlockMasterExecute;
@ -115,6 +119,7 @@ typedef struct
@property (assign) NSString *slot1StatusText; @property (assign) NSString *slot1StatusText;
@property (assign) NSString *frameStatus; @property (assign) NSString *frameStatus;
@property (assign) NSString *executionSpeedStatus; @property (assign) NSString *executionSpeedStatus;
@property (retain) NSString *errorStatus;
@property (copy) NSURL *arm9ImageURL; @property (copy) NSURL *arm9ImageURL;
@property (copy) NSURL *arm7ImageURL; @property (copy) NSURL *arm7ImageURL;
@ -146,6 +151,8 @@ typedef struct
- (BOOL) startReplayRecording:(NSURL *)fileURL sramURL:(NSURL *)sramURL; - (BOOL) startReplayRecording:(NSURL *)fileURL sramURL:(NSURL *)sramURL;
- (void) stopReplay; - (void) stopReplay;
- (void) postNDSError:(const NDSError &)ndsError;
@end @end
static void* RunCoreThread(void *arg); static void* RunCoreThread(void *arg);

View File

@ -118,6 +118,7 @@ volatile bool execute = true;
@synthesize slot1StatusText; @synthesize slot1StatusText;
@synthesize frameStatus; @synthesize frameStatus;
@synthesize executionSpeedStatus; @synthesize executionSpeedStatus;
@synthesize errorStatus;
@dynamic arm9ImageURL; @dynamic arm9ImageURL;
@dynamic arm7ImageURL; @dynamic arm7ImageURL;
@ -207,6 +208,7 @@ volatile bool execute = true;
frameStatus = @"---"; frameStatus = @"---";
executionSpeedStatus = @"1.00x"; executionSpeedStatus = @"1.00x";
errorStatus = @"";
return self; return self;
} }
@ -221,6 +223,7 @@ volatile bool execute = true;
[self setCdsFirmware:nil]; [self setCdsFirmware:nil];
[self setCdsGPU:nil]; [self setCdsGPU:nil];
[self setCdsOutputList:nil]; [self setCdsOutputList:nil];
[self setErrorStatus:nil];
pthread_cancel(coreThread); pthread_cancel(coreThread);
pthread_join(coreThread, NULL); pthread_join(coreThread, NULL);
@ -242,14 +245,23 @@ volatile bool execute = true;
- (void) setMasterExecute:(BOOL)theState - (void) setMasterExecute:(BOOL)theState
{ {
OSSpinLockLock(&spinlockMasterExecute); OSSpinLockLock(&spinlockMasterExecute);
execute = theState ? true : false;
if (theState)
{
execute = true;
}
else
{
emu_halt(EMUHALT_REASON_UNKNOWN, NDSErrorTag_BothCPUs);
}
OSSpinLockUnlock(&spinlockMasterExecute); OSSpinLockUnlock(&spinlockMasterExecute);
} }
- (BOOL) masterExecute - (BOOL) masterExecute
{ {
OSSpinLockLock(&spinlockMasterExecute); OSSpinLockLock(&spinlockMasterExecute);
const BOOL theState = execute ? YES : NO; const BOOL theState = (execute) ? YES : NO;
OSSpinLockUnlock(&spinlockMasterExecute); OSSpinLockUnlock(&spinlockMasterExecute);
return theState; return theState;
@ -855,8 +867,8 @@ volatile bool execute = true;
pthread_mutex_unlock(&threadParam.mutexThreadExecute); pthread_mutex_unlock(&threadParam.mutexThreadExecute);
[self updateSlot1DeviceStatus]; [self updateSlot1DeviceStatus];
[self restoreCoreState];
[self setMasterExecute:YES]; [self setMasterExecute:YES];
[self restoreCoreState];
[[self cdsController] reset]; [[self cdsController] reset];
[[self cdsController] updateMicLevel]; [[self cdsController] updateMicLevel];
} }
@ -988,6 +1000,111 @@ volatile bool execute = true;
FCEUI_StopMovie(); FCEUI_StopMovie();
} }
- (void) postNDSError:(const NDSError &)ndsError
{
NSString *newErrorString = nil;
switch (ndsError.code)
{
case NDSError_NoError:
// Do nothing if there is no error.
return;
case NDSError_SystemPoweredOff:
newErrorString = @"The system powered off using the ARM7 SPI device.";
break;
case NDSError_JITUnmappedAddressException:
{
if (ndsError.tag == NDSErrorTag_ARM9)
{
newErrorString = [NSString stringWithFormat:
@"JIT UNMAPPED ADDRESS EXCEPTION - ARM9:\n\
\tARM9 Program Counter: 0x%08X\n\
\tARM9 Instruction: 0x%08X\n\
\tARM9 Instruction Address: 0x%08X",
ndsError.programCounterARM9, ndsError.instructionARM9, ndsError.instructionAddrARM9];
}
else if (ndsError.tag == NDSErrorTag_ARM7)
{
newErrorString = [NSString stringWithFormat:
@"JIT UNMAPPED ADDRESS EXCEPTION - ARM7:\n\
\tARM7 Program Counter: 0x%08X\n\
\tARM7 Instruction: 0x%08X\n\
\tARM7 Instruction Address: 0x%08X",
ndsError.programCounterARM7, ndsError.instructionARM7, ndsError.instructionAddrARM7];
}
else
{
newErrorString = [NSString stringWithFormat:
@"JIT UNMAPPED ADDRESS EXCEPTION - UNKNOWN CPU:\n\
\tARM9 Program Counter: 0x%08X\n\
\tARM9 Instruction: 0x%08X\n\
\tARM9 Instruction Address: 0x%08X\n\
\tARM7 Program Counter: 0x%08X\n\
\tARM7 Instruction: 0x%08X\n\
\tARM7 Instruction Address: 0x%08X",
ndsError.programCounterARM9, ndsError.instructionARM9, ndsError.instructionAddrARM9,
ndsError.programCounterARM7, ndsError.instructionARM7, ndsError.instructionAddrARM7];
}
break;
}
case NDSError_ARMUndefinedInstructionException:
{
if (ndsError.tag == NDSErrorTag_ARM9)
{
newErrorString = [NSString stringWithFormat:
@"ARM9 UNDEFINED INSTRUCTION EXCEPTION:\n\
\tARM9 Program Counter: 0x%08X\n\
\tARM9 Instruction: 0x%08X\n\
\tARM9 Instruction Address: 0x%08X",
ndsError.programCounterARM9, ndsError.instructionARM9, ndsError.instructionAddrARM9];
}
else if (ndsError.tag == NDSErrorTag_ARM7)
{
newErrorString = [NSString stringWithFormat:
@"ARM7 UNDEFINED INSTRUCTION EXCEPTION:\n\
\tARM7 Program Counter: 0x%08X\n\
\tARM7 Instruction: 0x%08X\n\
\tARM7 Instruction Address: 0x%08X",
ndsError.programCounterARM7, ndsError.instructionARM7, ndsError.instructionAddrARM7];
}
else
{
newErrorString = [NSString stringWithFormat:
@"UNKNOWN ARM CPU UNDEFINED INSTRUCTION EXCEPTION:\n\
\tARM9 Program Counter: 0x%08X\n\
\tARM9 Instruction: 0x%08X\n\
\tARM9 Instruction Address: 0x%08X\n\
\tARM7 Program Counter: 0x%08X\n\
\tARM7 Instruction: 0x%08X\n\
\tARM7 Instruction Address: 0x%08X",
ndsError.programCounterARM9, ndsError.instructionARM9, ndsError.instructionAddrARM9,
ndsError.programCounterARM7, ndsError.instructionARM7, ndsError.instructionAddrARM7];
}
break;
}
case NDSError_UnknownError:
default:
newErrorString = [NSString stringWithFormat:
@"UNKNOWN ERROR:\n\
\tARM9 Program Counter: 0x%08X\n\
\tARM9 Instruction: 0x%08X\n\
\tARM9 Instruction Address: 0x%08X\n\
\tARM7 Program Counter: 0x%08X\n\
\tARM7 Instruction: 0x%08X\n\
\tARM7 Instruction Address: 0x%08X",
ndsError.programCounterARM9, ndsError.instructionARM9, ndsError.instructionAddrARM9,
ndsError.programCounterARM7, ndsError.instructionARM7, ndsError.instructionAddrARM7];
break;
}
[self setErrorStatus:newErrorString];
[[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"org.desmume.DeSmuME.handleNDSError" object:self userInfo:nil];
}
@end @end
static void* RunCoreThread(void *arg) static void* RunCoreThread(void *arg)
@ -1039,9 +1156,10 @@ static void* RunCoreThread(void *arg)
// Check if an internal execution error occurred that halted the emulation. // Check if an internal execution error occurred that halted the emulation.
if (!execute) if (!execute)
{ {
NDSError ndsError = NDS_GetLastError();
pthread_mutex_unlock(&param->mutexThreadExecute); pthread_mutex_unlock(&param->mutexThreadExecute);
// TODO: Message the core that emulation halted.
NSLog(@"The emulator halted during execution. Was it an internal error that caused this?"); [cdsCore postNDSError:ndsError];
continue; continue;
} }

View File

@ -12,6 +12,7 @@
</object> </object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool> <bool key="EncodedWithXMLCoder">YES</bool>
<integer value="10522"/>
</object> </object>
<object class="NSArray" key="IBDocument.PluginDependencies"> <object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool> <bool key="EncodedWithXMLCoder">YES</bool>
@ -1944,6 +1945,14 @@
<reference key="NSOnImage" ref="396634170"/> <reference key="NSOnImage" ref="396634170"/>
<reference key="NSMixedImage" ref="678976864"/> <reference key="NSMixedImage" ref="678976864"/>
</object> </object>
<object class="NSMenuItem" id="1030632434">
<reference key="NSMenu" ref="664980152"/>
<string key="NSTitle">Show GDB Stub Control...</string>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="396634170"/>
<reference key="NSMixedImage" ref="678976864"/>
</object>
<object class="NSMenuItem" id="306737379"> <object class="NSMenuItem" id="306737379">
<reference key="NSMenu" ref="664980152"/> <reference key="NSMenu" ref="664980152"/>
<bool key="NSIsDisabled">YES</bool> <bool key="NSIsDisabled">YES</bool>
@ -1954,9 +1963,9 @@
<reference key="NSOnImage" ref="396634170"/> <reference key="NSOnImage" ref="396634170"/>
<reference key="NSMixedImage" ref="678976864"/> <reference key="NSMixedImage" ref="678976864"/>
</object> </object>
<object class="NSMenuItem" id="1030632434"> <object class="NSMenuItem" id="469346871">
<reference key="NSMenu" ref="664980152"/> <reference key="NSMenu" ref="664980152"/>
<string key="NSTitle">Show GDB Stub Control...</string> <string key="NSTitle">Disable Metal (requires app restart)</string>
<string key="NSKeyEquiv"/> <string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int> <int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="396634170"/> <reference key="NSOnImage" ref="396634170"/>
@ -1972,9 +1981,9 @@
<reference key="NSOnImage" ref="396634170"/> <reference key="NSOnImage" ref="396634170"/>
<reference key="NSMixedImage" ref="678976864"/> <reference key="NSMixedImage" ref="678976864"/>
</object> </object>
<object class="NSMenuItem" id="469346871"> <object class="NSMenuItem" id="329110847">
<reference key="NSMenu" ref="664980152"/> <reference key="NSMenu" ref="664980152"/>
<string key="NSTitle">Disable Metal (requires app restart)</string> <string key="NSTitle">Simulate Emulation Crash</string>
<string key="NSKeyEquiv"/> <string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int> <int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="396634170"/> <reference key="NSOnImage" ref="396634170"/>
@ -13636,7 +13645,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string> <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
<string key="NSWindowContentMinSize">{700, 250}</string> <string key="NSWindowContentMinSize">{700, 250}</string>
<object class="NSView" key="NSWindowView" id="731532737"> <object class="NSView" key="NSWindowView" id="731532737">
<nil key="NSNextResponder"/> <reference key="NSNextResponder"/>
<int key="NSvFlags">256</int> <int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews"> <object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool> <bool key="EncodedWithXMLCoder">YES</bool>
@ -13645,6 +13654,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int> <int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 351}, {666, 34}}</string> <string key="NSFrame">{{17, 351}, {666, 34}}</string>
<reference key="NSSuperview" ref="731532737"/> <reference key="NSSuperview" ref="731532737"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool> <bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="497889808"> <object class="NSTextFieldCell" key="NSCell" id="497889808">
<int key="NSCellFlags">67108864</int> <int key="NSCellFlags">67108864</int>
@ -13663,6 +13673,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int> <int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 351}, {666, 34}}</string> <string key="NSFrame">{{17, 351}, {666, 34}}</string>
<reference key="NSSuperview" ref="731532737"/> <reference key="NSSuperview" ref="731532737"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool> <bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="986675852"> <object class="NSTextFieldCell" key="NSCell" id="986675852">
<int key="NSCellFlags">67108864</int> <int key="NSCellFlags">67108864</int>
@ -13681,6 +13692,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">289</int> <int key="NSvFlags">289</int>
<string key="NSFrame">{{362, 12}, {162, 32}}</string> <string key="NSFrame">{{362, 12}, {162, 32}}</string>
<reference key="NSSuperview" ref="731532737"/> <reference key="NSSuperview" ref="731532737"/>
<reference key="NSWindow"/>
<int key="NSTag">2</int> <int key="NSTag">2</int>
<bool key="NSEnabled">YES</bool> <bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="932208535"> <object class="NSButtonCell" key="NSCell" id="932208535">
@ -13703,6 +13715,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">289</int> <int key="NSvFlags">289</int>
<string key="NSFrame">{{200, 12}, {162, 32}}</string> <string key="NSFrame">{{200, 12}, {162, 32}}</string>
<reference key="NSSuperview" ref="731532737"/> <reference key="NSSuperview" ref="731532737"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool> <bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="921528960"> <object class="NSButtonCell" key="NSCell" id="921528960">
<int key="NSCellFlags">67108864</int> <int key="NSCellFlags">67108864</int>
@ -13724,6 +13737,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int> <int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 315}, {666, 28}}</string> <string key="NSFrame">{{17, 315}, {666, 28}}</string>
<reference key="NSSuperview" ref="731532737"/> <reference key="NSSuperview" ref="731532737"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool> <bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="389737972"> <object class="NSTextFieldCell" key="NSCell" id="389737972">
<int key="NSCellFlags">67108864</int> <int key="NSCellFlags">67108864</int>
@ -13742,6 +13756,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int> <int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 315}, {666, 28}}</string> <string key="NSFrame">{{17, 315}, {666, 28}}</string>
<reference key="NSSuperview" ref="731532737"/> <reference key="NSSuperview" ref="731532737"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool> <bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="824504973"> <object class="NSTextFieldCell" key="NSCell" id="824504973">
<int key="NSCellFlags">67108864</int> <int key="NSCellFlags">67108864</int>
@ -13760,6 +13775,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">292</int> <int key="NSvFlags">292</int>
<string key="NSFrame">{{18, 21}, {182, 18}}</string> <string key="NSFrame">{{18, 21}, {182, 18}}</string>
<reference key="NSSuperview" ref="731532737"/> <reference key="NSSuperview" ref="731532737"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool> <bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="548786511"> <object class="NSButtonCell" key="NSCell" id="548786511">
<int key="NSCellFlags">67108864</int> <int key="NSCellFlags">67108864</int>
@ -13783,6 +13799,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">289</int> <int key="NSvFlags">289</int>
<string key="NSFrame">{{524, 12}, {162, 32}}</string> <string key="NSFrame">{{524, 12}, {162, 32}}</string>
<reference key="NSSuperview" ref="731532737"/> <reference key="NSSuperview" ref="731532737"/>
<reference key="NSWindow"/>
<int key="NSTag">1</int> <int key="NSTag">1</int>
<bool key="NSEnabled">YES</bool> <bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="283691405"> <object class="NSButtonCell" key="NSCell" id="283691405">
@ -13815,6 +13832,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">256</int> <int key="NSvFlags">256</int>
<string key="NSFrameSize">{700, 229}</string> <string key="NSFrameSize">{700, 229}</string>
<reference key="NSSuperview" ref="850501943"/> <reference key="NSSuperview" ref="850501943"/>
<reference key="NSWindow"/>
<string key="NSReuseIdentifierKey">_NS:1718</string> <string key="NSReuseIdentifierKey">_NS:1718</string>
<bool key="NSEnabled">YES</bool> <bool key="NSEnabled">YES</bool>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool> <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
@ -13824,14 +13842,14 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">256</int> <int key="NSvFlags">256</int>
<string key="NSFrameSize">{700, 17}</string> <string key="NSFrameSize">{700, 17}</string>
<reference key="NSSuperview" ref="968198718"/> <reference key="NSSuperview" ref="968198718"/>
<reference key="NSWindow"/>
<string key="NSReuseIdentifierKey">_NS:1720</string> <string key="NSReuseIdentifierKey">_NS:1720</string>
<reference key="NSTableView" ref="796694466"/> <reference key="NSTableView" ref="796694466"/>
</object> </object>
<object class="_NSCornerView" key="NSCornerView" id="917215464"> <object class="_NSCornerView" key="NSCornerView">
<reference key="NSNextResponder" ref="266193397"/> <nil key="NSNextResponder"/>
<int key="NSvFlags">-2147483392</int> <int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{224, 0}, {16, 17}}</string> <string key="NSFrame">{{224, 0}, {16, 17}}</string>
<reference key="NSSuperview" ref="266193397"/>
<string key="NSReuseIdentifierKey">_NS:1724</string> <string key="NSReuseIdentifierKey">_NS:1724</string>
</object> </object>
<object class="NSMutableArray" key="NSTableColumns"> <object class="NSMutableArray" key="NSTableColumns">
@ -13944,6 +13962,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object> </object>
<string key="NSFrame">{{1, 17}, {700, 229}}</string> <string key="NSFrame">{{1, 17}, {700, 229}}</string>
<reference key="NSSuperview" ref="266193397"/> <reference key="NSSuperview" ref="266193397"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="796694466"/> <reference key="NSNextKeyView" ref="796694466"/>
<string key="NSReuseIdentifierKey">_NS:1716</string> <string key="NSReuseIdentifierKey">_NS:1716</string>
<reference key="NSDocView" ref="796694466"/> <reference key="NSDocView" ref="796694466"/>
@ -13955,6 +13974,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">-2147483392</int> <int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{224, 17}, {15, 102}}</string> <string key="NSFrame">{{224, 17}, {15, 102}}</string>
<reference key="NSSuperview" ref="266193397"/> <reference key="NSSuperview" ref="266193397"/>
<reference key="NSWindow"/>
<string key="NSReuseIdentifierKey">_NS:1741</string> <string key="NSReuseIdentifierKey">_NS:1741</string>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool> <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<reference key="NSTarget" ref="266193397"/> <reference key="NSTarget" ref="266193397"/>
@ -13966,6 +13986,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">-2147483392</int> <int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{1, 197}, {700, 15}}</string> <string key="NSFrame">{{1, 197}, {700, 15}}</string>
<reference key="NSSuperview" ref="266193397"/> <reference key="NSSuperview" ref="266193397"/>
<reference key="NSWindow"/>
<string key="NSReuseIdentifierKey">_NS:1743</string> <string key="NSReuseIdentifierKey">_NS:1743</string>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool> <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<int key="NSsFlags">1</int> <int key="NSsFlags">1</int>
@ -13982,14 +14003,15 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object> </object>
<string key="NSFrame">{{1, 0}, {700, 17}}</string> <string key="NSFrame">{{1, 0}, {700, 17}}</string>
<reference key="NSSuperview" ref="266193397"/> <reference key="NSSuperview" ref="266193397"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="650104671"/> <reference key="NSNextKeyView" ref="650104671"/>
<string key="NSReuseIdentifierKey">_NS:1721</string> <string key="NSReuseIdentifierKey">_NS:1721</string>
<reference key="NSDocView" ref="650104671"/> <reference key="NSDocView" ref="650104671"/>
</object> </object>
<reference ref="917215464"/>
</object> </object>
<string key="NSFrame">{{-1, 60}, {702, 247}}</string> <string key="NSFrame">{{-1, 60}, {702, 247}}</string>
<reference key="NSSuperview" ref="731532737"/> <reference key="NSSuperview" ref="731532737"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="850501943"/> <reference key="NSNextKeyView" ref="850501943"/>
<string key="NSReuseIdentifierKey">_NS:1714</string> <string key="NSReuseIdentifierKey">_NS:1714</string>
<int key="NSsFlags">133682</int> <int key="NSsFlags">133682</int>
@ -14004,6 +14026,8 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object> </object>
</object> </object>
<string key="NSFrameSize">{700, 405}</string> <string key="NSFrameSize">{700, 405}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
</object> </object>
<string key="NSScreenRect">{{0, 0}, {1920, 1177}}</string> <string key="NSScreenRect">{{0, 0}, {1920, 1177}}</string>
<string key="NSMinSize">{700, 272}</string> <string key="NSMinSize">{700, 272}</string>
@ -14237,6 +14261,125 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string> <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
<bool key="NSWindowIsRestorable">YES</bool> <bool key="NSWindowIsRestorable">YES</bool>
</object> </object>
<object class="NSWindowTemplate" id="292515803">
<int key="NSWindowStyleMask">1</int>
<int key="NSWindowBacking">2</int>
<string key="NSWindowRect">{{157, 347}, {400, 114}}</string>
<int key="NSWTFlags">1685586944</int>
<string key="NSWindowTitle">NDS Error</string>
<string key="NSWindowClass">NSWindow</string>
<nil key="NSViewClass"/>
<nil key="NSUserInterfaceItemIdentifier"/>
<object class="NSView" key="NSWindowView" id="13172379">
<reference key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSTextField" id="487161905">
<reference key="NSNextResponder" ref="13172379"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 77}, {366, 17}}</string>
<reference key="NSSuperview" ref="13172379"/>
<string key="NSReuseIdentifierKey">_NS:3939</string>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="194008675">
<int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">272891904</int>
<string key="NSContents">The emulation has halted due to an internal issue.</string>
<object class="NSFont" key="NSSupport">
<string key="NSName">LucidaGrande-Bold</string>
<double key="NSSize">13</double>
<int key="NSfFlags">16</int>
</object>
<string key="NSCellIdentifier">_NS:3939</string>
<reference key="NSControlView" ref="487161905"/>
<reference key="NSBackgroundColor" ref="266180242"/>
<reference key="NSTextColor" ref="1045249657"/>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<int key="NSTextFieldAlignmentRectInsetsVersion">1</int>
</object>
<object class="NSButton" id="570766076">
<reference key="NSNextResponder" ref="13172379"/>
<int key="NSvFlags">289</int>
<string key="NSFrame">{{290, 12}, {96, 32}}</string>
<reference key="NSSuperview" ref="13172379"/>
<string key="NSReuseIdentifierKey">_NS:610</string>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="774886600">
<int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">134217728</int>
<string key="NSContents">Stop</string>
<reference key="NSSupport" ref="462791774"/>
<string key="NSCellIdentifier">_NS:610</string>
<reference key="NSControlView" ref="570766076"/>
<int key="NSButtonFlags">-2038284288</int>
<int key="NSButtonFlags2">129</int>
<string key="NSAlternateContents"/>
<string type="base64-UTF8" key="NSKeyEquivalent">DQ</string>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="1020353354">
<reference key="NSNextResponder" ref="13172379"/>
<int key="NSvFlags">289</int>
<string key="NSFrame">{{194, 12}, {96, 32}}</string>
<reference key="NSSuperview" ref="13172379"/>
<string key="NSReuseIdentifierKey">_NS:610</string>
<int key="NSTag">2</int>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="278466473">
<int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">134217728</int>
<string key="NSContents">Reset</string>
<reference key="NSSupport" ref="462791774"/>
<string key="NSCellIdentifier">_NS:610</string>
<reference key="NSControlView" ref="1020353354"/>
<int key="NSButtonFlags">-2038284288</int>
<int key="NSButtonFlags2">129</int>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="987846881">
<reference key="NSNextResponder" ref="13172379"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{17, 53}, {366, 16}}</string>
<reference key="NSSuperview" ref="13172379"/>
<string key="NSReuseIdentifierKey">_NS:3939</string>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="510036545">
<int key="NSCellFlags">69206017</int>
<int key="NSCellFlags2">272760832</int>
<string key="NSContents"/>
<object class="NSFont" key="NSSupport" id="197589044">
<string key="NSName">Monaco</string>
<double key="NSSize">11</double>
<int key="NSfFlags">16</int>
</object>
<string key="NSPlaceholderString">error string</string>
<string key="NSCellIdentifier">_NS:3939</string>
<reference key="NSControlView" ref="987846881"/>
<reference key="NSBackgroundColor" ref="266180242"/>
<reference key="NSTextColor" ref="1045249657"/>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<int key="NSTextFieldAlignmentRectInsetsVersion">1</int>
</object>
</object>
<string key="NSFrameSize">{400, 114}</string>
<reference key="NSSuperview"/>
<string key="NSReuseIdentifierKey">_NS:122</string>
</object>
<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
<string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
<bool key="NSWindowIsRestorable">NO</bool>
</object>
<object class="NSWindowTemplate" id="217226210"> <object class="NSWindowTemplate" id="217226210">
<int key="NSWindowStyleMask">7</int> <int key="NSWindowStyleMask">7</int>
<int key="NSWindowBacking">2</int> <int key="NSWindowBacking">2</int>
@ -15131,11 +15274,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSCellFlags">69206081</int> <int key="NSCellFlags">69206081</int>
<int key="NSCellFlags2">137216</int> <int key="NSCellFlags2">137216</int>
<string key="NSContents">Text Cell</string> <string key="NSContents">Text Cell</string>
<object class="NSFont" key="NSSupport" id="197589044"> <reference key="NSSupport" ref="197589044"/>
<string key="NSName">Monaco</string>
<double key="NSSize">11</double>
<int key="NSfFlags">16</int>
</object>
<reference key="NSControlView" ref="1001428622"/> <reference key="NSControlView" ref="1001428622"/>
<reference key="NSBackgroundColor" ref="856317944"/> <reference key="NSBackgroundColor" ref="856317944"/>
<reference key="NSTextColor" ref="1045249657"/> <reference key="NSTextColor" ref="1045249657"/>
@ -30838,6 +30977,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>frameJumpBehavior</string> <string>frameJumpBehavior</string>
<string>frameJumpNumberFramesForward</string> <string>frameJumpNumberFramesForward</string>
<string>frameJumpToFrameIndex</string> <string>frameJumpToFrameIndex</string>
<string>errorStatus</string>
</object> </object>
<string key="NSObjectClassName">CocoaDSCore</string> <string key="NSObjectClassName">CocoaDSCore</string>
<object class="_NSManagedProxy" key="_NSManagedProxy"/> <object class="_NSManagedProxy" key="_NSManagedProxy"/>
@ -44538,6 +44678,82 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object> </object>
<int key="connectionID">10520</int> <int key="connectionID">10520</int>
</object> </object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">ndsErrorSheet</string>
<reference key="source" ref="231770064"/>
<reference key="destination" ref="292515803"/>
</object>
<int key="connectionID">10532</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">closeSheet:</string>
<reference key="source" ref="231770064"/>
<reference key="destination" ref="570766076"/>
</object>
<int key="connectionID">10533</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">closeSheet:</string>
<reference key="source" ref="231770064"/>
<reference key="destination" ref="1020353354"/>
</object>
<int key="connectionID">10534</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">value: selection.errorStatus</string>
<reference key="source" ref="987846881"/>
<reference key="destination" ref="582168938"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="987846881"/>
<reference key="NSDestination" ref="582168938"/>
<string key="NSLabel">value: selection.errorStatus</string>
<string key="NSBinding">value</string>
<string key="NSKeyPath">selection.errorStatus</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">10535</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">ndsErrorStatusTextField</string>
<reference key="source" ref="231770064"/>
<reference key="destination" ref="987846881"/>
</object>
<int key="connectionID">10536</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">simulateEmulationCrash:</string>
<reference key="source" ref="231770064"/>
<reference key="destination" ref="329110847"/>
</object>
<int key="connectionID">10537</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">hidden: isDeveloperPlusBuild</string>
<reference key="source" ref="329110847"/>
<reference key="destination" ref="976324537"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="329110847"/>
<reference key="NSDestination" ref="976324537"/>
<string key="NSLabel">hidden: isDeveloperPlusBuild</string>
<string key="NSBinding">hidden</string>
<string key="NSKeyPath">isDeveloperPlusBuild</string>
<object class="NSDictionary" key="NSOptions">
<string key="NS.key.0">NSValueTransformerName</string>
<string key="NS.object.0">NSNegateBoolean</string>
</object>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">10539</int>
</object>
</object> </object>
<object class="IBMutableOrderedSet" key="objectRecords"> <object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects"> <object class="NSArray" key="orderedObjects">
@ -46043,9 +46259,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<reference ref="217330860"/> <reference ref="217330860"/>
<reference ref="406886317"/> <reference ref="406886317"/>
<reference ref="306737379"/> <reference ref="306737379"/>
<reference ref="628276370"/>
<reference ref="1030632434"/> <reference ref="1030632434"/>
<reference ref="469346871"/> <reference ref="469346871"/>
<reference ref="628276370"/> <reference ref="329110847"/>
</object> </object>
<reference key="parent" ref="963830043"/> <reference key="parent" ref="963830043"/>
</object> </object>
@ -56727,6 +56944,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<reference ref="731532737"/> <reference ref="731532737"/>
</object> </object>
<reference key="parent" ref="0"/> <reference key="parent" ref="0"/>
<string key="objectName">Window (Game Data Migration Assistant)</string>
</object> </object>
<object class="IBObjectRecord"> <object class="IBObjectRecord">
<int key="objectID">9706</int> <int key="objectID">9706</int>
@ -60510,6 +60728,89 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<reference key="object" ref="213745199"/> <reference key="object" ref="213745199"/>
<reference key="parent" ref="728665305"/> <reference key="parent" ref="728665305"/>
</object> </object>
<object class="IBObjectRecord">
<int key="objectID">10521</int>
<reference key="object" ref="329110847"/>
<reference key="parent" ref="664980152"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10522</int>
<reference key="object" ref="292515803"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="13172379"/>
</object>
<reference key="parent" ref="0"/>
<string key="objectName">Window (NDS Error)</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">10523</int>
<reference key="object" ref="13172379"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="487161905"/>
<reference ref="987846881"/>
<reference ref="570766076"/>
<reference ref="1020353354"/>
</object>
<reference key="parent" ref="292515803"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10524</int>
<reference key="object" ref="487161905"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="194008675"/>
</object>
<reference key="parent" ref="13172379"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10525</int>
<reference key="object" ref="194008675"/>
<reference key="parent" ref="487161905"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10526</int>
<reference key="object" ref="570766076"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="774886600"/>
</object>
<reference key="parent" ref="13172379"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10527</int>
<reference key="object" ref="774886600"/>
<reference key="parent" ref="570766076"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10528</int>
<reference key="object" ref="1020353354"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="278466473"/>
</object>
<reference key="parent" ref="13172379"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10529</int>
<reference key="object" ref="278466473"/>
<reference key="parent" ref="1020353354"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10530</int>
<reference key="object" ref="987846881"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="510036545"/>
</object>
<reference key="parent" ref="13172379"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10531</int>
<reference key="object" ref="510036545"/>
<reference key="parent" ref="987846881"/>
</object>
</object> </object>
</object> </object>
<object class="NSMutableDictionary" key="flattenedProperties"> <object class="NSMutableDictionary" key="flattenedProperties">
@ -60886,6 +61187,23 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>10505.IBPluginDependency</string> <string>10505.IBPluginDependency</string>
<string>10508.IBPluginDependency</string> <string>10508.IBPluginDependency</string>
<string>10509.IBPluginDependency</string> <string>10509.IBPluginDependency</string>
<string>10521.IBPluginDependency</string>
<string>10522.IBEditorWindowLastContentRect</string>
<string>10522.IBPluginDependency</string>
<string>10522.IBWindowTemplateEditedContentRect</string>
<string>10522.NSWindowTemplate.visibleAtLaunch</string>
<string>10523.IBPluginDependency</string>
<string>10524.IBPluginDependency</string>
<string>10524.IBViewBoundsToFrameTransform</string>
<string>10525.IBPluginDependency</string>
<string>10526.IBPluginDependency</string>
<string>10526.IBViewBoundsToFrameTransform</string>
<string>10527.IBPluginDependency</string>
<string>10528.IBPluginDependency</string>
<string>10528.IBViewBoundsToFrameTransform</string>
<string>10529.IBPluginDependency</string>
<string>10530.IBPluginDependency</string>
<string>10531.IBPluginDependency</string>
<string>1113.IBPluginDependency</string> <string>1113.IBPluginDependency</string>
<string>1114.IBPluginDependency</string> <string>1114.IBPluginDependency</string>
<string>1115.IBPluginDependency</string> <string>1115.IBPluginDependency</string>
@ -61210,6 +61528,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>3211.IBPluginDependency</string> <string>3211.IBPluginDependency</string>
<string>3213.IBPluginDependency</string> <string>3213.IBPluginDependency</string>
<string>3214.IBPluginDependency</string> <string>3214.IBPluginDependency</string>
<string>3456.IBEditorWindowLastContentRect</string>
<string>3456.IBPluginDependency</string> <string>3456.IBPluginDependency</string>
<string>3456.IBWindowTemplateEditedContentRect</string> <string>3456.IBWindowTemplateEditedContentRect</string>
<string>3456.NSWindowTemplate.visibleAtLaunch</string> <string>3456.NSWindowTemplate.visibleAtLaunch</string>
@ -63066,6 +63385,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>968.IBPluginDependency</string> <string>968.IBPluginDependency</string>
<string>969.IBPluginDependency</string> <string>969.IBPluginDependency</string>
<string>970.IBPluginDependency</string> <string>970.IBPluginDependency</string>
<string>9705.IBEditorWindowLastContentRect</string>
<string>9705.IBPluginDependency</string> <string>9705.IBPluginDependency</string>
<string>9705.IBWindowTemplateEditedContentRect</string> <string>9705.IBWindowTemplateEditedContentRect</string>
<string>9705.NSWindowTemplate.visibleAtLaunch</string> <string>9705.NSWindowTemplate.visibleAtLaunch</string>
@ -63879,6 +64199,29 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{617, 513}, {400, 114}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{617, 513}, {400, 114}}</string>
<boolean value="NO"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABBiAAAw3gAAA</bytes>
</object>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABDXQAAwpwAAA</bytes>
</object>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABDGAAAww4AAA</bytes>
</object>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -64369,7 +64712,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{380, 836}, {512, 20}}</string> <string>{{463, 836}, {512, 20}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -64398,8 +64741,9 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{741, 693}, {335, 163}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{1241, 208}, {335, 163}}</string> <string>{{741, 693}, {335, 163}}</string>
<boolean value="NO"/> <boolean value="NO"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -65509,7 +65853,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{598, 723}, {292, 113}}</string> <string>{{787, 703}, {292, 133}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<reference ref="0"/> <reference ref="0"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -67105,8 +67449,9 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{0, 429}, {700, 405}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{189, 422}, {700, 405}}</string> <string>{{0, 429}, {700, 405}}</string>
<boolean value="NO"/> <boolean value="NO"/>
<boolean value="YES"/> <boolean value="YES"/>
<string>{700, 250}</string> <string>{700, 250}</string>
@ -67290,7 +67635,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object> </object>
</object> </object>
<nil key="sourceID"/> <nil key="sourceID"/>
<int key="maxID">10520</int> <int key="maxID">10539</int>
</object> </object>
<object class="IBClassDescriber" key="IBDocument.Classes"> <object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions"> <object class="NSMutableArray" key="referencedPartialClassDescriptions">
@ -68186,6 +68531,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>saveEmuSaveStateAs:</string> <string>saveEmuSaveStateAs:</string>
<string>saveEmuSaveStateSlot:</string> <string>saveEmuSaveStateSlot:</string>
<string>setVerticalSyncForNonLayerBackedViews:</string> <string>setVerticalSyncForNonLayerBackedViews:</string>
<string>simulateEmulationCrash:</string>
<string>slot1Eject:</string> <string>slot1Eject:</string>
<string>stopReplay:</string> <string>stopReplay:</string>
<string>toggleAllDisplays:</string> <string>toggleAllDisplays:</string>
@ -68254,6 +68600,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>id</string> <string>id</string>
<string>id</string> <string>id</string>
<string>id</string> <string>id</string>
<string>id</string>
</object> </object>
</object> </object>
<object class="NSMutableDictionary" key="actionInfosByName"> <object class="NSMutableDictionary" key="actionInfosByName">
@ -68297,6 +68644,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>saveEmuSaveStateAs:</string> <string>saveEmuSaveStateAs:</string>
<string>saveEmuSaveStateSlot:</string> <string>saveEmuSaveStateSlot:</string>
<string>setVerticalSyncForNonLayerBackedViews:</string> <string>setVerticalSyncForNonLayerBackedViews:</string>
<string>simulateEmulationCrash:</string>
<string>slot1Eject:</string> <string>slot1Eject:</string>
<string>stopReplay:</string> <string>stopReplay:</string>
<string>toggleAllDisplays:</string> <string>toggleAllDisplays:</string>
@ -68462,6 +68810,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string key="name">setVerticalSyncForNonLayerBackedViews:</string> <string key="name">setVerticalSyncForNonLayerBackedViews:</string>
<string key="candidateClassName">id</string> <string key="candidateClassName">id</string>
</object> </object>
<object class="IBActionInfo">
<string key="name">simulateEmulationCrash:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo"> <object class="IBActionInfo">
<string key="name">slot1Eject:</string> <string key="name">slot1Eject:</string>
<string key="candidateClassName">id</string> <string key="candidateClassName">id</string>
@ -68537,6 +68889,8 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>exportRomSavePanelAccessoryView</string> <string>exportRomSavePanelAccessoryView</string>
<string>firmwarePanelController</string> <string>firmwarePanelController</string>
<string>inputManager</string> <string>inputManager</string>
<string>ndsErrorSheet</string>
<string>ndsErrorStatusTextField</string>
<string>romInfoPanelController</string> <string>romInfoPanelController</string>
<string>saveFileMigrationSheet</string> <string>saveFileMigrationSheet</string>
<string>saveStatePrecloseSheet</string> <string>saveStatePrecloseSheet</string>
@ -68558,6 +68912,8 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>NSView</string> <string>NSView</string>
<string>NSObjectController</string> <string>NSObjectController</string>
<string>InputManager</string> <string>InputManager</string>
<string>NSWindow</string>
<string>NSTextField</string>
<string>NSObjectController</string> <string>NSObjectController</string>
<string>NSWindow</string> <string>NSWindow</string>
<string>NSWindow</string> <string>NSWindow</string>
@ -68582,6 +68938,8 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>exportRomSavePanelAccessoryView</string> <string>exportRomSavePanelAccessoryView</string>
<string>firmwarePanelController</string> <string>firmwarePanelController</string>
<string>inputManager</string> <string>inputManager</string>
<string>ndsErrorSheet</string>
<string>ndsErrorStatusTextField</string>
<string>romInfoPanelController</string> <string>romInfoPanelController</string>
<string>saveFileMigrationSheet</string> <string>saveFileMigrationSheet</string>
<string>saveStatePrecloseSheet</string> <string>saveStatePrecloseSheet</string>
@ -68642,6 +69000,14 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string key="name">inputManager</string> <string key="name">inputManager</string>
<string key="candidateClassName">InputManager</string> <string key="candidateClassName">InputManager</string>
</object> </object>
<object class="IBToOneOutletInfo">
<string key="name">ndsErrorSheet</string>
<string key="candidateClassName">NSWindow</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">ndsErrorStatusTextField</string>
<string key="candidateClassName">NSTextField</string>
</object>
<object class="IBToOneOutletInfo"> <object class="IBToOneOutletInfo">
<string key="name">romInfoPanelController</string> <string key="name">romInfoPanelController</string>
<string key="candidateClassName">NSObjectController</string> <string key="candidateClassName">NSObjectController</string>

View File

@ -61,6 +61,8 @@ class AudioSampleBlockGenerator;
NSWindow *slot1ManagerWindow; NSWindow *slot1ManagerWindow;
NSWindow *saveFileMigrationSheet; NSWindow *saveFileMigrationSheet;
NSWindow *saveStatePrecloseSheet; NSWindow *saveStatePrecloseSheet;
NSWindow *ndsErrorSheet;
NSTextField *ndsErrorStatusTextField;
NSView *exportRomSavePanelAccessoryView; NSView *exportRomSavePanelAccessoryView;
BOOL isSaveStateEdited; BOOL isSaveStateEdited;
@ -74,6 +76,7 @@ class AudioSampleBlockGenerator;
BOOL isShowingSaveStateDialog; BOOL isShowingSaveStateDialog;
BOOL isShowingFileMigrationDialog; BOOL isShowingFileMigrationDialog;
BOOL isUserInterfaceBlockingExecution; BOOL isUserInterfaceBlockingExecution;
BOOL _isNDSErrorSheetAlreadyShown;
NSURL *currentSaveStateURL; NSURL *currentSaveStateURL;
NSInteger selectedExportRomSaveID; NSInteger selectedExportRomSaveID;
NSInteger selectedRomSaveTypeID; NSInteger selectedRomSaveTypeID;
@ -130,6 +133,8 @@ class AudioSampleBlockGenerator;
@property (readonly) IBOutlet NSWindow *slot1ManagerWindow; @property (readonly) IBOutlet NSWindow *slot1ManagerWindow;
@property (readonly) IBOutlet NSWindow *saveFileMigrationSheet; @property (readonly) IBOutlet NSWindow *saveFileMigrationSheet;
@property (readonly) IBOutlet NSWindow *saveStatePrecloseSheet; @property (readonly) IBOutlet NSWindow *saveStatePrecloseSheet;
@property (readonly) IBOutlet NSWindow *ndsErrorSheet;
@property (readonly) IBOutlet NSTextField *ndsErrorStatusTextField;
@property (readonly) IBOutlet NSView *exportRomSavePanelAccessoryView; @property (readonly) IBOutlet NSView *exportRomSavePanelAccessoryView;
@property (readonly) NSImage *iconExecute; @property (readonly) NSImage *iconExecute;
@ -213,6 +218,7 @@ class AudioSampleBlockGenerator;
// Misc IBActions // Misc IBActions
- (IBAction) chooseSlot1R4Directory:(id)sender; - (IBAction) chooseSlot1R4Directory:(id)sender;
- (IBAction) slot1Eject:(id)sender; - (IBAction) slot1Eject:(id)sender;
- (IBAction) simulateEmulationCrash:(id)sender;
- (IBAction) writeDefaults3DRenderingSettings:(id)sender; - (IBAction) writeDefaults3DRenderingSettings:(id)sender;
- (IBAction) writeDefaultsEmulationSettings:(id)sender; - (IBAction) writeDefaultsEmulationSettings:(id)sender;

View File

@ -59,6 +59,8 @@
@synthesize slot1ManagerWindow; @synthesize slot1ManagerWindow;
@synthesize saveFileMigrationSheet; @synthesize saveFileMigrationSheet;
@synthesize saveStatePrecloseSheet; @synthesize saveStatePrecloseSheet;
@synthesize ndsErrorSheet;
@synthesize ndsErrorStatusTextField;
@synthesize exportRomSavePanelAccessoryView; @synthesize exportRomSavePanelAccessoryView;
@synthesize iconExecute; @synthesize iconExecute;
@ -116,6 +118,7 @@
isShowingSaveStateDialog = NO; isShowingSaveStateDialog = NO;
isShowingFileMigrationDialog = NO; isShowingFileMigrationDialog = NO;
isUserInterfaceBlockingExecution = NO; isUserInterfaceBlockingExecution = NO;
_isNDSErrorSheetAlreadyShown = NO;
currentSaveStateURL = nil; currentSaveStateURL = nil;
selectedRomSaveTypeID = ROMSAVETYPE_AUTOMATIC; selectedRomSaveTypeID = ROMSAVETYPE_AUTOMATIC;
@ -155,6 +158,11 @@
name:@"org.desmume.DeSmuME.loadRomDidFinish" name:@"org.desmume.DeSmuME.loadRomDidFinish"
object:nil]; object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleNDSError:)
name:@"org.desmume.DeSmuME.handleNDSError"
object:nil];
return self; return self;
} }
@ -900,6 +908,12 @@
[cdsCore slot1Eject]; [cdsCore slot1Eject];
} }
- (IBAction) simulateEmulationCrash:(id)sender
{
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[cdsCore setMasterExecute:NO];
}
- (IBAction) writeDefaults3DRenderingSettings:(id)sender - (IBAction) writeDefaults3DRenderingSettings:(id)sender
{ {
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
@ -1814,6 +1828,9 @@
[[windowController window] displayIfNeeded]; [[windowController window] displayIfNeeded];
} }
[cdsCore execControl]->ApplySettingsOnReset();
[cdsCore setMasterExecute:YES];
// After the ROM loading is complete, send an execute message to the Cocoa DS per // After the ROM loading is complete, send an execute message to the Cocoa DS per
// user preferences. // user preferences.
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"General_ExecuteROMOnLoad"]) if ([[NSUserDefaults standardUserDefaults] boolForKey:@"General_ExecuteROMOnLoad"])
@ -1901,6 +1918,50 @@
return result; return result;
} }
- (void) handleNDSError:(NSNotification *)aNotification
{
[self setIsUserInterfaceBlockingExecution:YES];
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
NSString *ndsErrorString = [cdsCore errorStatus];
const char *ndsErrorCString = [ndsErrorString cStringUsingEncoding:NSUTF8StringEncoding];
size_t lineCount = 1;
for (size_t i = 0; i < [ndsErrorString length]; i++)
{
if (ndsErrorCString[i] == '\n')
{
lineCount++;
}
}
NSRect newSheetFrameRect = [ndsErrorSheet frame];
newSheetFrameRect.size.height = 98.0f + (16.0f * lineCount);
// For some reason, when the sheet is shown for the very first time,
// the sheet doesn't drop down as low as it should. However, upon
// subsequent showings, the sheet drops down to the intended distance.
// To compensate for this difference, the first sheet showing will
// have a little added height to it.
if (!_isNDSErrorSheetAlreadyShown)
{
_isNDSErrorSheetAlreadyShown = YES;
newSheetFrameRect.size.height += 22.0f;
}
[ndsErrorSheet setFrame:newSheetFrameRect display:NO];
NSRect newTextFieldRect = [ndsErrorStatusTextField frame];
newTextFieldRect.size.height = 16.0f * lineCount;
[ndsErrorStatusTextField setFrame:newTextFieldRect];
[NSApp beginSheet:ndsErrorSheet
modalForWindow:(NSWindow *)[[windowList objectAtIndex:0] window]
modalDelegate:self
didEndSelector:@selector(didEndErrorSheet:returnCode:contextInfo:)
contextInfo:nil];
}
- (void) addOutputToCore:(CocoaDSOutput *)theOutput - (void) addOutputToCore:(CocoaDSOutput *)theOutput
{ {
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
@ -2097,6 +2158,23 @@
[cdsCore setSlot1R4URL:selectedDirURL]; [cdsCore setSlot1R4URL:selectedDirURL];
} }
- (void) didEndErrorSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
[sheet orderOut:self];
[self setIsUserInterfaceBlockingExecution:NO];
switch (returnCode)
{
case COCOA_DIALOG_OPTION: // Reset
[self reset:self];
break;
case NSCancelButton: // Stop
default:
break;
}
}
- (void) updateAllWindowTitles - (void) updateAllWindowTitles
{ {
if ([windowList count] < 1) if ([windowList count] < 1)

View File

@ -2599,7 +2599,7 @@ public:
static void DoQuit() static void DoQuit()
{ {
emu_halt(); emu_halt(EMUHALT_REASON_USER_REQUESTED_HALT, NDSErrorTag_None);
gtk_main_quit(); gtk_main_quit();
} }

View File

@ -2326,7 +2326,7 @@ static void StepRunLoop_Throttle(bool allowSleep = true, int forceFrameSkip = -1
if (frameAdvance && allowSleep) if (frameAdvance && allowSleep)
{ {
frameAdvance = false; frameAdvance = false;
emu_halt(); emu_halt(EMUHALT_REASON_USER_REQUESTED_HALT, NDSErrorTag_None);
SPU_Pause(1); SPU_Pause(1);
} }
if(execute && emu_paused && !frameAdvance) if(execute && emu_paused && !frameAdvance)
@ -2386,7 +2386,7 @@ bool NDS_Pause(bool showMsg)
{ {
if(paused) return false; if(paused) return false;
emu_halt(); emu_halt(EMUHALT_REASON_USER_REQUESTED_HALT, NDSErrorTag_None);
paused = TRUE; paused = TRUE;
SPU_Pause(1); SPU_Pause(1);
while (!paused) {} while (!paused) {}
@ -2620,7 +2620,7 @@ void MenuDeinit()
static void ExitRunLoop() static void ExitRunLoop()
{ {
finished = TRUE; finished = TRUE;
emu_halt(); emu_halt(EMUHALT_REASON_USER_REQUESTED_HALT, NDSErrorTag_None);
} }
class WinWifiHandler : public WifiHandler class WinWifiHandler : public WifiHandler