diff --git a/desmume/src/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj b/desmume/src/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj new file mode 100644 index 000000000..de0be4d00 --- /dev/null +++ b/desmume/src/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj @@ -0,0 +1,2006 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + AB00E87B14205EAE00DE561F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; + AB00E87E14205EBC00DE561F /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; + AB02475C13886BF300E9F9AB /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; + AB0F290214BE6E68009ABC6F /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; + AB0F290314BE6E68009ABC6F /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; + AB0F290414BE6E68009ABC6F /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; + AB0F290514BE6E68009ABC6F /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; + AB0F290614BE6E68009ABC6F /* Icon_Execute_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */; }; + AB0F290714BE6E68009ABC6F /* Icon_Pause_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */; }; + AB0F290814BE6E68009ABC6F /* Icon_Speed1x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */; }; + AB0F290914BE6E68009ABC6F /* Icon_Speed2x_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */; }; + AB0F291D14BE6F4A009ABC6F /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; + AB0F293814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; + AB0F293914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; + AB0F293A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; + AB0F293B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; + AB0F293C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; + AB0F293D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; + AB0F293E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; + AB0F293F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; + AB0F294014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; + AB0F294114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; + AB0F294214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; + AB0F294314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; + AB0F294414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; + AB0F294514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; + AB0F294614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; + AB0F294714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; + AB0F294814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */; }; + AB0F294914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */; }; + AB0F294A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */; }; + AB0F294B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */; }; + AB0F294C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */; }; + AB0F294D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */; }; + AB0F294E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */; }; + AB0F294F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */; }; + AB0F295014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */; }; + AB0F295114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */; }; + AB0F295214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */; }; + AB0F295314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */; }; + AB0F295414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */; }; + AB0F295514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */; }; + AB0F295614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */; }; + AB0F295714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */; }; + AB0F296D14BE705D009ABC6F /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; + AB0F296E14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; + AB0F296F14BE705D009ABC6F /* Icon_ActionReplay_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */; }; + AB0F297014BE705D009ABC6F /* Icon_CodeBreaker_128x128.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */; }; + AB0F297A14BE70BC009ABC6F /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; + AB0F297B14BE70BC009ABC6F /* VideoFilterPreview_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */; }; + AB0F298C14BE71E0009ABC6F /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; + AB0F298D14BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; + AB0F298E14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; + AB0F298F14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; + AB0F299014BE71E0009ABC6F /* Icon_ArrowDown_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */; }; + AB0F299114BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */; }; + AB0F299214BE71E0009ABC6F /* Icon_ArrowRight_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */; }; + AB0F299314BE71E0009ABC6F /* Icon_ArrowUp_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */; }; + AB0F29A614BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; + AB0F29A714BE7213009ABC6F /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; + AB0F29A814BE7213009ABC6F /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; + AB0F29A914BE7213009ABC6F /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; + AB0F29AA14BE7213009ABC6F /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; + AB0F29AB14BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; + AB0F29AC14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; + AB0F29AD14BE7213009ABC6F /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; + AB0F29AE14BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; + AB0F29AF14BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; + AB0F29B014BE7213009ABC6F /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; + AB0F29B114BE7213009ABC6F /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; }; + AB0F29B214BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; + AB0F29B314BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; + AB0F29B414BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; + AB0F29B514BE7213009ABC6F /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; + AB0F29B614BE7213009ABC6F /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; + AB0F29B714BE7213009ABC6F /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; + AB0F29B814BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */; }; + AB0F29B914BE7213009ABC6F /* Icon_DSButtonA_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */; }; + AB0F29BA14BE7213009ABC6F /* Icon_DSButtonB_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */; }; + AB0F29BB14BE7213009ABC6F /* Icon_DSButtonL_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */; }; + AB0F29BC14BE7213009ABC6F /* Icon_DSButtonR_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */; }; + AB0F29BD14BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */; }; + AB0F29BE14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */; }; + AB0F29BF14BE7213009ABC6F /* Icon_DSButtonX_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */; }; + AB0F29C014BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; }; + AB0F29C114BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; }; + AB0F29C214BE7213009ABC6F /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; }; + AB0F29C314BE7213009ABC6F /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; }; + AB0F29C414BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; }; + AB0F29C514BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; }; + AB0F29C614BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; }; + AB0F29C714BE7213009ABC6F /* Icon_RotateCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */; }; + AB0F29C814BE7213009ABC6F /* Icon_ShowHUD_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */; }; + AB0F29C914BE7213009ABC6F /* Icon_Speaker_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */; }; + AB15CA7214A29EE500B8A6A4 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */; }; + AB181D0013B66889006CA82D /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; + AB1F468413A0ADE400B80DE6 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; + AB1F469813A0AE2F00B80DE6 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; + AB350B6A1478A5B3007165AC /* cocoa_hid.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB350B691478A5B3007165AC /* cocoa_hid.mm */; }; + AB350BA51478AC96007165AC /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; + AB350D3B147A1D93007165AC /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; + AB3ACB7214C2361100D7D192 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; + AB3ACB7314C2361100D7D192 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; + AB3ACB7414C2361100D7D192 /* displayView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6B14C2361100D7D192 /* displayView.mm */; }; + AB3ACB7514C2361100D7D192 /* emuWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6D14C2361100D7D192 /* emuWindowDelegate.mm */; }; + AB3ACB7614C2361100D7D192 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; + AB3ACB7714C2361100D7D192 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; + AB3ACB7814C2361100D7D192 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; }; + AB3ACB7914C2361100D7D192 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; }; + AB3ACB7A14C2361100D7D192 /* displayView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6B14C2361100D7D192 /* displayView.mm */; }; + AB3ACB7B14C2361100D7D192 /* emuWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6D14C2361100D7D192 /* emuWindowDelegate.mm */; }; + AB3ACB7C14C2361100D7D192 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; }; + AB3ACB7D14C2361100D7D192 /* preferencesWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */; }; + AB3ACC3E14C24D5400D7D192 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; + AB3ACC3F14C24D5400D7D192 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; + AB3ACC4014C24D5400D7D192 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; + AB3ACC4114C24D5400D7D192 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; + AB3ACC4214C24D5400D7D192 /* README.TRANSLATION in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3C14C24D5400D7D192 /* README.TRANSLATION */; }; + AB3ACC4314C24D5400D7D192 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; + AB3ACC4414C24D5400D7D192 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3814C24D5400D7D192 /* AUTHORS */; }; + AB3ACC4514C24D5400D7D192 /* ChangeLog in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3914C24D5400D7D192 /* ChangeLog */; }; + AB3ACC4614C24D5400D7D192 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; + AB3ACC4714C24D5400D7D192 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; + AB3ACC4814C24D5400D7D192 /* README.TRANSLATION in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3C14C24D5400D7D192 /* README.TRANSLATION */; }; + AB3ACC4914C24D5400D7D192 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; + AB3E34C9134AF4500056477A /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; + AB4676F314AB12D60002FF94 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; + AB58F32D1364F44B0074C376 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; + AB64987C13ECC73800EE7DD2 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; + AB6FBEF6139B6258007BB045 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; + AB711ED21481C35F009011C8 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; }; + AB711ED31481C35F009011C8 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; + AB711ED81481C35F009011C8 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; + AB711EDE1481C35F009011C8 /* FileTypeInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */; }; + AB711EEF1481C35F009011C8 /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; + AB711EF01481C35F009011C8 /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; + AB711EF11481C35F009011C8 /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; + AB711EF21481C35F009011C8 /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; + AB711EF31481C35F009011C8 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87914205EAE00DE561F /* InfoPlist.strings */; }; + AB711EF41481C35F009011C8 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB00E87C14205EBC00DE561F /* MainMenu.xib */; }; + AB711EF51481C35F009011C8 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; + AB711EFB1481C35F009011C8 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; + AB711EFC1481C35F009011C8 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; + AB711EFD1481C35F009011C8 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; + AB711EFE1481C35F009011C8 /* HID_usage_strings.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB350D3A147A1D93007165AC /* HID_usage_strings.plist */; }; + AB711F001481C35F009011C8 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA11345AC8400AF11D1 /* addons.cpp */; }; + AB711F011481C35F009011C8 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; + AB711F021481C35F009011C8 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; + AB711F031481C35F009011C8 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; + AB711F041481C35F009011C8 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; + AB711F051481C35F009011C8 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; + AB711F061481C35F009011C8 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; + AB711F071481C35F009011C8 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; + AB711F081481C35F009011C8 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; + AB711F091481C35F009011C8 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; + AB711F0A1481C35F009011C8 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; + AB711F0B1481C35F009011C8 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; + AB711F0C1481C35F009011C8 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; + AB711F0D1481C35F009011C8 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; + AB711F0E1481C35F009011C8 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; + AB711F0F1481C35F009011C8 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; + AB711F101481C35F009011C8 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; + AB711F111481C35F009011C8 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; + AB711F121481C35F009011C8 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; + AB711F131481C35F009011C8 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; + AB711F141481C35F009011C8 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; + AB711F151481C35F009011C8 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; + AB711F161481C35F009011C8 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; + AB711F171481C35F009011C8 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; + AB711F181481C35F009011C8 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; + AB711F191481C35F009011C8 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; + AB711F1A1481C35F009011C8 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; + AB711F1B1481C35F009011C8 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; + AB711F1C1481C35F009011C8 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; + AB711F1D1481C35F009011C8 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; + AB711F1E1481C35F009011C8 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; + AB711F1F1481C35F009011C8 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; + AB711F201481C35F009011C8 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; + AB711F211481C35F009011C8 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; + AB711F221481C35F009011C8 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; + AB711F231481C35F009011C8 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; + AB711F241481C35F009011C8 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */; }; + AB711F251481C35F009011C8 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; + AB711F261481C35F009011C8 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; + AB711F271481C35F009011C8 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; + AB711F281481C35F009011C8 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; + AB711F291481C35F009011C8 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; + AB711F2A1481C35F009011C8 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; + AB711F2B1481C35F009011C8 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; + AB711F2C1481C35F009011C8 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; + AB711F2D1481C35F009011C8 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; + AB711F2E1481C35F009011C8 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; + AB711F2F1481C35F009011C8 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; + AB711F301481C35F009011C8 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; + AB711F311481C35F009011C8 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; + AB711F321481C35F009011C8 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; + AB711F331481C35F009011C8 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; + AB711F341481C35F009011C8 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; + AB711F351481C35F009011C8 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; + AB711F361481C35F009011C8 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; + AB711F371481C35F009011C8 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; + AB711F381481C35F009011C8 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; + AB711F391481C35F009011C8 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; + AB711F3A1481C35F009011C8 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; + AB711F3B1481C35F009011C8 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; + AB711F3C1481C35F009011C8 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; + AB711F3D1481C35F009011C8 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; + AB711F3E1481C35F009011C8 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; + AB711F3F1481C35F009011C8 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; + AB711F401481C35F009011C8 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; + AB711F411481C35F009011C8 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; + AB711F421481C35F009011C8 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; + AB711F431481C35F009011C8 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; + AB711F461481C35F009011C8 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; + AB711F471481C35F009011C8 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; + AB711F481481C35F009011C8 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; + AB711F491481C35F009011C8 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; + AB711F4A1481C35F009011C8 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; + AB711F4C1481C35F009011C8 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; + AB711F4E1481C35F009011C8 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; }; + AB711F501481C35F009011C8 /* slot1_retail_nand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */; }; + AB711F511481C35F009011C8 /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */; }; + AB711F521481C35F009011C8 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; }; + AB711F531481C35F009011C8 /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */; }; + AB711F541481C35F009011C8 /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */; }; + AB711F551481C35F009011C8 /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */; }; + AB711F561481C35F009011C8 /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */; }; + AB711F571481C35F009011C8 /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */; }; + AB711F581481C35F009011C8 /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */; }; + AB711F591481C35F009011C8 /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */; }; + AB711F5A1481C35F009011C8 /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */; }; + AB711F5B1481C35F009011C8 /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */; }; + AB711F5C1481C35F009011C8 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; }; + AB711F5D1481C35F009011C8 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; + AB711F5E1481C35F009011C8 /* cocoa_mic.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* cocoa_mic.mm */; }; + AB711F5F1481C35F009011C8 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; }; + AB711F601481C35F009011C8 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; + AB711F611481C35F009011C8 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; + AB711F621481C35F009011C8 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; + AB711F631481C35F009011C8 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; + AB711F641481C35F009011C8 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; + AB711F651481C35F009011C8 /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB90210314234C8B00348EEC /* 2xsai.cpp */; }; + AB711F661481C35F009011C8 /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB90210414234C8B00348EEC /* bilinear.cpp */; }; + AB711F671481C35F009011C8 /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB90210514234C8B00348EEC /* epx.cpp */; }; + AB711F681481C35F009011C8 /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB90210714234C8B00348EEC /* hq2x.cpp */; }; + AB711F691481C35F009011C8 /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB90210914234C8B00348EEC /* hq4x.cpp */; }; + AB711F6A1481C35F009011C8 /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB90210D14234C8B00348EEC /* lq2x.cpp */; }; + AB711F6B1481C35F009011C8 /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB90210F14234C8B00348EEC /* scanline.cpp */; }; + AB711F6C1481C35F009011C8 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; + AB711F6D1481C35F009011C8 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; + AB711F6E1481C35F009011C8 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; + AB711F701481C35F009011C8 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; + AB711F711481C35F009011C8 /* cpu_detect_x86_gcc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */; }; + AB711F721481C35F009011C8 /* cocoa_hid.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB350B691478A5B3007165AC /* cocoa_hid.mm */; }; + AB711F741481C35F009011C8 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + AB711F751481C35F009011C8 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; + AB711F761481C35F009011C8 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; + AB711F771481C35F009011C8 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; + AB711F781481C35F009011C8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; + AB711F7B1481C35F009011C8 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; }; + AB75226E14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; + AB75226F14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */ = {isa = PBXBuildFile; fileRef = AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */; }; + AB80E04D142BC4A800A52038 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; }; + AB901BDE1420706100348EEC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; }; + AB90211014234C8B00348EEC /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB90210314234C8B00348EEC /* 2xsai.cpp */; }; + AB90211114234C8B00348EEC /* bilinear.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB90210414234C8B00348EEC /* bilinear.cpp */; }; + AB90211214234C8B00348EEC /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB90210514234C8B00348EEC /* epx.cpp */; }; + AB90211314234C8B00348EEC /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB90210714234C8B00348EEC /* hq2x.cpp */; }; + AB90211414234C8B00348EEC /* hq4x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB90210914234C8B00348EEC /* hq4x.cpp */; }; + AB90211614234C8B00348EEC /* lq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB90210D14234C8B00348EEC /* lq2x.cpp */; }; + AB90211714234C8B00348EEC /* scanline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB90210F14234C8B00348EEC /* scanline.cpp */; }; + AB91D46B13BD013800462471 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; }; + ABA6574B14511EC90077E5E9 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; }; + ABAD3E7113AF1D6D00502E1E /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */; }; + ABAD3E7413AF1D6D00502E1E /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */; }; + ABAD3E7513AF1D6D00502E1E /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */; }; + ABAD3E7613AF1D6D00502E1E /* mmx_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */; }; + ABAD3E7713AF1D6D00502E1E /* RateTransposer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */; }; + ABAD3E7813AF1D6D00502E1E /* SoundTouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */; }; + ABAD3E7913AF1D6D00502E1E /* sse_optimized.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */; }; + ABAD3E7A13AF1D6D00502E1E /* TDStretch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */; }; + ABAD3E7B13AF1D6D00502E1E /* WavFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */; }; + ABB97876144E89CC00793FA3 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */; }; + ABB97877144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */; }; + ABB97878144E89CC00793FA3 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */; }; + ABBC0F8D1394B1AA0028B6BD /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; }; + ABBF04A514B515F300E505A0 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; + ABBF04A614B515F300E505A0 /* AppIcon_ROMCheats.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */; }; + ABC3AF2F14B7F06900D5B13D /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; + ABC3AF3014B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; + ABC3AF3114B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; + ABC3AF3214B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; + ABC3AF3314B7F06900D5B13D /* Icon_VolumeFull_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */; }; + ABC3AF3414B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; }; + ABC3AF3514B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; }; + ABC3AF3614B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; }; + ABC3AFCF14B8D16700D5B13D /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; }; + ABC570D1134431CE00E7B0B1 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; }; + ABC570D5134431DA00E7B0B1 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; }; + ABC5720D1344346600E7B0B1 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; }; + ABC572101344347000E7B0B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; }; + ABC719E2138CB25E002827A9 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; }; + ABD1041C1346652500AF11D1 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; }; + ABD1041D1346652500AF11D1 /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; }; + ABD1041E1346652500AF11D1 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; }; + ABD1041F1346652500AF11D1 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; }; + ABD104281346653B00AF11D1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; }; + ABD1FED01345AC8400AF11D1 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA11345AC8400AF11D1 /* addons.cpp */; }; + ABD1FED21345AC8400AF11D1 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; }; + ABD1FED31345AC8400AF11D1 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; }; + ABD1FED41345AC8400AF11D1 /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA51345AC8400AF11D1 /* bios.cpp */; }; + ABD1FED51345AC8400AF11D1 /* cheatSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */; }; + ABD1FED71345AC8400AF11D1 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA81345AC8400AF11D1 /* common.cpp */; }; + ABD1FED81345AC8400AF11D1 /* cp15.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA91345AC8400AF11D1 /* cp15.cpp */; }; + ABD1FEDA1345AC8400AF11D1 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAB1345AC8400AF11D1 /* debug.cpp */; }; + ABD1FEDC1345AC8400AF11D1 /* Disassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */; }; + ABD1FEDD1345AC8400AF11D1 /* driver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAE1345AC8400AF11D1 /* driver.cpp */; }; + ABD1FEDE1345AC8400AF11D1 /* emufile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */; }; + ABD1FEDF1345AC8400AF11D1 /* FIFO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */; }; + ABD1FEE01345AC8400AF11D1 /* firmware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB11345AC8400AF11D1 /* firmware.cpp */; }; + ABD1FEE31345AC8400AF11D1 /* gfx3d.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */; }; + ABD1FEE41345AC8400AF11D1 /* GPU_osd_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */; }; + ABD1FEE61345AC8400AF11D1 /* GPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB71345AC8400AF11D1 /* GPU.cpp */; }; + ABD1FEE81345AC8400AF11D1 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB91345AC8400AF11D1 /* matrix.cpp */; }; + ABD1FEE91345AC8400AF11D1 /* mc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBA1345AC8400AF11D1 /* mc.cpp */; }; + ABD1FEED1345AC8400AF11D1 /* MMU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */; }; + ABD1FEEE1345AC8400AF11D1 /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEBF1345AC8400AF11D1 /* movie.cpp */; }; + ABD1FEEF1345AC8400AF11D1 /* NDSSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */; }; + ABD1FEF11345AC8400AF11D1 /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC21345AC8400AF11D1 /* path.cpp */; }; + ABD1FEF21345AC8400AF11D1 /* rasterize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */; }; + ABD1FEF31345AC8400AF11D1 /* readwrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */; }; + ABD1FEF41345AC8400AF11D1 /* render3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC51345AC8400AF11D1 /* render3D.cpp */; }; + ABD1FEF51345AC8400AF11D1 /* ROMReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */; }; + ABD1FEF61345AC8400AF11D1 /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC71345AC8400AF11D1 /* rtc.cpp */; }; + ABD1FEF71345AC8400AF11D1 /* saves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC81345AC8400AF11D1 /* saves.cpp */; }; + ABD1FEF81345AC8400AF11D1 /* slot1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC91345AC8400AF11D1 /* slot1.cpp */; }; + ABD1FEFA1345AC8400AF11D1 /* SPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECB1345AC8400AF11D1 /* SPU.cpp */; }; + ABD1FEFB1345AC8400AF11D1 /* texcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECC1345AC8400AF11D1 /* texcache.cpp */; }; + ABD1FEFC1345AC8400AF11D1 /* thumb_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */; }; + ABD1FEFD1345AC8400AF11D1 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECE1345AC8400AF11D1 /* version.cpp */; }; + ABD1FEFE1345AC8400AF11D1 /* wifi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FECF1345AC8400AF11D1 /* wifi.cpp */; }; + ABD1FF0B1345AC9C00AF11D1 /* slot1_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */; }; + ABD1FF0C1345AC9C00AF11D1 /* slot1_r4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */; }; + ABD1FF0D1345AC9C00AF11D1 /* slot1_retail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */; }; + ABD1FF0E1345AC9C00AF11D1 /* slot2_expMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */; }; + ABD1FF0F1345AC9C00AF11D1 /* slot2_gbagame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */; }; + ABD1FF101345AC9C00AF11D1 /* slot2_guitarGrip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */; }; + ABD1FF111345AC9C00AF11D1 /* slot2_mpcf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */; }; + ABD1FF121345AC9C00AF11D1 /* slot2_none.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */; }; + ABD1FF131345AC9C00AF11D1 /* slot2_paddle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */; }; + ABD1FF141345AC9C00AF11D1 /* slot2_piano.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */; }; + ABD1FF151345AC9C00AF11D1 /* slot2_rumblepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */; }; + ABD1FF531345ACBF00AF11D1 /* ConvertUTF.c in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */; }; + ABD1FF551345ACBF00AF11D1 /* crc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF221345ACBF00AF11D1 /* crc.cpp */; }; + ABD1FF561345ACBF00AF11D1 /* decrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */; }; + ABD1FF571345ACBF00AF11D1 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF261345ACBF00AF11D1 /* header.cpp */; }; + ABD1FF581345ACBF00AF11D1 /* dlditool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */; }; + ABD1FF591345ACBF00AF11D1 /* emufat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF291345ACBF00AF11D1 /* emufat.cpp */; }; + ABD1FF5A1345ACBF00AF11D1 /* guid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */; }; + ABD1FF5B1345ACBF00AF11D1 /* cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF301345ACBF00AF11D1 /* cache.cpp */; }; + ABD1FF5C1345ACBF00AF11D1 /* directory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF331345ACBF00AF11D1 /* directory.cpp */; }; + ABD1FF5D1345ACBF00AF11D1 /* disc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF351345ACBF00AF11D1 /* disc.cpp */; }; + ABD1FF5E1345ACBF00AF11D1 /* fatdir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */; }; + ABD1FF5F1345ACBF00AF11D1 /* fatfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */; }; + ABD1FF601345ACBF00AF11D1 /* file_allocation_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */; }; + ABD1FF611345ACBF00AF11D1 /* filetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */; }; + ABD1FF621345ACBF00AF11D1 /* libfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF411345ACBF00AF11D1 /* libfat.cpp */; }; + ABD1FF631345ACBF00AF11D1 /* libfat_public_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */; }; + ABD1FF641345ACBF00AF11D1 /* lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF451345ACBF00AF11D1 /* lock.cpp */; }; + ABD1FF651345ACBF00AF11D1 /* partition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF481345ACBF00AF11D1 /* partition.cpp */; }; + ABD1FF661345ACBF00AF11D1 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */; }; + ABD1FF671345ACBF00AF11D1 /* task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4C1345ACBF00AF11D1 /* task.cpp */; }; + ABD1FF681345ACBF00AF11D1 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; }; + ABD1FF691345ACBF00AF11D1 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; }; + ABD1FF9F1345ACFA00AF11D1 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; }; + ABD9A46513DB99B300777194 /* cocoa_mic.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* cocoa_mic.mm */; }; + ABE5DE95143F781900835AD8 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; }; + ABE5DFE5143FB1DA00835AD8 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; }; + ABE6702B1415DE6C00E8E4C9 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; }; + ABE6702C1415DE6C00E8E4C9 /* tinyxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */; }; + ABE6702D1415DE6C00E8E4C9 /* tinyxmlerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */; }; + ABE6702E1415DE6C00E8E4C9 /* tinyxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */; }; + ABE7F53E13EE1C7900FD3A71 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; }; + ABEFCF61141AB82A000CC0CD /* AppIcon_ROMSave.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */; }; + ABEFCF62141AB82A000CC0CD /* AppIcon_DeSmuME.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */; }; + ABEFCF63141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */; }; + ABEFCF64141AB82A000CC0CD /* AppIcon_SaveState.icns in Resources */ = {isa = PBXBuildFile; fileRef = ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8D1107320486CEB800E47090 /* DeSmuME (Debug).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (Debug).app"; sourceTree = BUILT_PRODUCTS_DIR; }; + AB00E87A14205EAE00DE561F /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = translations/English.lproj/InfoPlist.strings; sourceTree = ""; }; + AB00E87D14205EBC00DE561F /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = translations/English.lproj/MainMenu.xib; sourceTree = ""; }; + AB00E89114205ECC00DE561F /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = English; path = translations/English.lproj/Localizable.strings; sourceTree = ""; }; + AB02475B13886BF300E9F9AB /* KeyNames.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = KeyNames.plist; sourceTree = ""; }; + AB02791814415E4C0075E58C /* Info (Debug).plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info (Debug).plist"; sourceTree = ""; }; + AB0A0D1914AACA9600E83E91 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; + AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Execute_420x420.png; path = images/Icon_Execute_420x420.png; sourceTree = ""; }; + AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Pause_420x420.png; path = images/Icon_Pause_420x420.png; sourceTree = ""; }; + AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speed1x_420x420.png; path = images/Icon_Speed1x_420x420.png; sourceTree = ""; }; + AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speed2x_420x420.png; path = images/Icon_Speed2x_420x420.png; sourceTree = ""; }; + AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Blue_16x16.png; path = images/ColorSwatch_Blue_16x16.png; sourceTree = ""; }; + AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Brown_16x16.png; path = images/ColorSwatch_Brown_16x16.png; sourceTree = ""; }; + AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkBlue_16x16.png; path = images/ColorSwatch_DarkBlue_16x16.png; sourceTree = ""; }; + AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkGreen_16x16.png; path = images/ColorSwatch_DarkGreen_16x16.png; sourceTree = ""; }; + AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_DarkPurple_16x16.png; path = images/ColorSwatch_DarkPurple_16x16.png; sourceTree = ""; }; + AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Gray_16x16.png; path = images/ColorSwatch_Gray_16x16.png; sourceTree = ""; }; + AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Green_16x16.png; path = images/ColorSwatch_Green_16x16.png; sourceTree = ""; }; + AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_LimeGreen_16x16.png; path = images/ColorSwatch_LimeGreen_16x16.png; sourceTree = ""; }; + AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Magenta_16x16.png; path = images/ColorSwatch_Magenta_16x16.png; sourceTree = ""; }; + AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Orange_16x16.png; path = images/ColorSwatch_Orange_16x16.png; sourceTree = ""; }; + AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Pink_16x16.png; path = images/ColorSwatch_Pink_16x16.png; sourceTree = ""; }; + AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Red_16x16.png; path = images/ColorSwatch_Red_16x16.png; sourceTree = ""; }; + AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_SeaGreen_16x16.png; path = images/ColorSwatch_SeaGreen_16x16.png; sourceTree = ""; }; + AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Turquoise_16x16.png; path = images/ColorSwatch_Turquoise_16x16.png; sourceTree = ""; }; + AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Violet_16x16.png; path = images/ColorSwatch_Violet_16x16.png; sourceTree = ""; }; + AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ColorSwatch_Yellow_16x16.png; path = images/ColorSwatch_Yellow_16x16.png; sourceTree = ""; }; + AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ActionReplay_128x128.png; path = images/Icon_ActionReplay_128x128.png; sourceTree = ""; }; + AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_CodeBreaker_128x128.png; path = images/Icon_CodeBreaker_128x128.png; sourceTree = ""; }; + AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = VideoFilterPreview_64x64.png; path = images/VideoFilterPreview_64x64.png; sourceTree = ""; }; + AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowDown_420x420.png; path = images/Icon_ArrowDown_420x420.png; sourceTree = ""; }; + AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowLeft_420x420.png; path = images/Icon_ArrowLeft_420x420.png; sourceTree = ""; }; + AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowRight_420x420.png; path = images/Icon_ArrowRight_420x420.png; sourceTree = ""; }; + AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ArrowUp_420x420.png; path = images/Icon_ArrowUp_420x420.png; sourceTree = ""; }; + AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DoubleSpeed_420x420.png; path = images/Icon_DoubleSpeed_420x420.png; sourceTree = ""; }; + AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonA_420x420.png; path = images/Icon_DSButtonA_420x420.png; sourceTree = ""; }; + AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonB_420x420.png; path = images/Icon_DSButtonB_420x420.png; sourceTree = ""; }; + AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonL_420x420.png; path = images/Icon_DSButtonL_420x420.png; sourceTree = ""; }; + AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonR_420x420.png; path = images/Icon_DSButtonR_420x420.png; sourceTree = ""; }; + AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonSelect_420x420.png; path = images/Icon_DSButtonSelect_420x420.png; sourceTree = ""; }; + AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonStart_420x420.png; path = images/Icon_DSButtonStart_420x420.png; sourceTree = ""; }; + AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonX_420x420.png; path = images/Icon_DSButtonX_420x420.png; sourceTree = ""; }; + AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonY_420x420.png; path = images/Icon_DSButtonY_420x420.png; sourceTree = ""; }; + AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Emulation_420x420.png; path = images/Icon_Emulation_420x420.png; sourceTree = ""; }; + AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Input_420x420.png; path = images/Icon_Input_420x420.png; sourceTree = ""; }; + AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Microphone_420x420.png; path = images/Icon_Microphone_420x420.png; sourceTree = ""; }; + AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_OpenROM_420x420.png; path = images/Icon_OpenROM_420x420.png; sourceTree = ""; }; + AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Reset_420x420.png; path = images/Icon_Reset_420x420.png; sourceTree = ""; }; + AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_RotateCCW_420x420.png; path = images/Icon_RotateCCW_420x420.png; sourceTree = ""; }; + AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_RotateCW_420x420.png; path = images/Icon_RotateCW_420x420.png; sourceTree = ""; }; + AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ShowHUD_420x420.png; path = images/Icon_ShowHUD_420x420.png; sourceTree = ""; }; + AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speaker_420x420.png; path = images/Icon_Speaker_420x420.png; sourceTree = ""; }; + AB350B681478A5B3007165AC /* cocoa_hid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_hid.h; sourceTree = ""; }; + AB350B691478A5B3007165AC /* cocoa_hid.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_hid.mm; sourceTree = ""; }; + AB350BA41478AC96007165AC /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; + AB350D38147A1D8D007165AC /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = English; path = translations/English.lproj/HID_usage_strings.plist; sourceTree = ""; }; + AB3ACB6614C2361100D7D192 /* appDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = appDelegate.h; sourceTree = ""; }; + AB3ACB6714C2361100D7D192 /* appDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = appDelegate.mm; sourceTree = ""; }; + AB3ACB6814C2361100D7D192 /* cheatWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cheatWindowDelegate.h; sourceTree = ""; }; + AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cheatWindowDelegate.mm; sourceTree = ""; }; + AB3ACB6A14C2361100D7D192 /* displayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = displayView.h; sourceTree = ""; }; + AB3ACB6B14C2361100D7D192 /* displayView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = displayView.mm; sourceTree = ""; }; + AB3ACB6C14C2361100D7D192 /* emuWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emuWindowDelegate.h; sourceTree = ""; }; + AB3ACB6D14C2361100D7D192 /* emuWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = emuWindowDelegate.mm; sourceTree = ""; }; + AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inputPrefsView.h; sourceTree = ""; }; + AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = inputPrefsView.mm; sourceTree = ""; }; + AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = preferencesWindowDelegate.h; sourceTree = ""; }; + AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = preferencesWindowDelegate.mm; sourceTree = ""; }; + AB3ACC3814C24D5400D7D192 /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = AUTHORS; path = ../../AUTHORS; sourceTree = SOURCE_ROOT; }; + AB3ACC3914C24D5400D7D192 /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = ChangeLog; path = ../../ChangeLog; sourceTree = SOURCE_ROOT; }; + AB3ACC3A14C24D5400D7D192 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = COPYING; path = ../../COPYING; sourceTree = SOURCE_ROOT; }; + AB3ACC3B14C24D5400D7D192 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README; path = ../../README; sourceTree = SOURCE_ROOT; }; + AB3ACC3C14C24D5400D7D192 /* README.TRANSLATION */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.TRANSLATION; path = ../../README.TRANSLATION; sourceTree = SOURCE_ROOT; }; + AB3ACC3D14C24D5400D7D192 /* README.MAC */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.MAC; path = ../../README.MAC; sourceTree = SOURCE_ROOT; }; + AB3E34C7134AF4500056477A /* cocoa_output.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_output.h; sourceTree = ""; }; + AB3E34C8134AF4500056477A /* cocoa_output.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_output.mm; sourceTree = ""; }; + AB58F32B1364F44B0074C376 /* cocoa_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_file.h; sourceTree = ""; }; + AB58F32C1364F44B0074C376 /* cocoa_file.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_file.mm; sourceTree = ""; }; + AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = FileTypeInfo.plist; sourceTree = ""; }; + AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_nand.cpp; sourceTree = ""; }; + AB711F7F1481C35F009011C8 /* DeSmuME (Debug).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (Debug).app"; sourceTree = BUILT_PRODUCTS_DIR; }; + AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_FirmwareConfig.icns; sourceTree = ""; }; + AB80E04C142BC4A800A52038 /* cocoa_util.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_util.mm; sourceTree = ""; }; + AB80E050142BC4FA00A52038 /* cocoa_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_util.h; sourceTree = ""; }; + AB817A34143EE2DB00A7DFE9 /* videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = videofilter.h; sourceTree = ""; }; + AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = videofilter.cpp; sourceTree = ""; }; + AB901BDF1420706B00348EEC /* Japanese */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Japanese; path = translations/Japanese.lproj/Localizable.strings; sourceTree = ""; }; + AB901BE01420706F00348EEC /* French */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = French; path = translations/French.lproj/Localizable.strings; sourceTree = ""; }; + AB901BE11420707400348EEC /* Italian */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Italian; path = translations/Italian.lproj/Localizable.strings; sourceTree = ""; }; + AB901BE21420707800348EEC /* Chinese */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Chinese; path = translations/Chinese.lproj/Localizable.strings; sourceTree = ""; }; + AB901BE31420707D00348EEC /* Norwegian */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Norwegian; path = translations/Norwegian.lproj/Localizable.strings; sourceTree = ""; }; + AB901BE41420708200348EEC /* Romanian */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = Romanian; path = translations/Romanian.lproj/Localizable.strings; sourceTree = ""; }; + AB90210314234C8B00348EEC /* 2xsai.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 2xsai.cpp; sourceTree = ""; }; + AB90210414234C8B00348EEC /* bilinear.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bilinear.cpp; sourceTree = ""; }; + AB90210514234C8B00348EEC /* epx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = epx.cpp; sourceTree = ""; }; + AB90210614234C8B00348EEC /* filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filter.h; sourceTree = ""; }; + AB90210714234C8B00348EEC /* hq2x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq2x.cpp; sourceTree = ""; }; + AB90210814234C8B00348EEC /* hq2x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hq2x.h; sourceTree = ""; }; + AB90210914234C8B00348EEC /* hq4x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq4x.cpp; sourceTree = ""; }; + AB90210B14234C8B00348EEC /* hq4x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hq4x.h; sourceTree = ""; }; + AB90210C14234C8B00348EEC /* interp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interp.h; sourceTree = ""; }; + AB90210D14234C8B00348EEC /* lq2x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lq2x.cpp; sourceTree = ""; }; + AB90210E14234C8B00348EEC /* lq2x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lq2x.h; sourceTree = ""; }; + AB90210F14234C8B00348EEC /* scanline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scanline.cpp; sourceTree = ""; }; + AB9971CE134EDA0800531BA7 /* cocoa_globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_globals.h; sourceTree = ""; }; + ABA6574914511EC90077E5E9 /* cocoa_cheat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_cheat.h; sourceTree = ""; }; + ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_cheat.mm; sourceTree = ""; }; + ABAD3E5913AF1D6D00502E1E /* AAFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAFilter.h; sourceTree = ""; }; + ABAD3E5A13AF1D6D00502E1E /* BPMDetect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BPMDetect.h; sourceTree = ""; }; + ABAD3E5B13AF1D6D00502E1E /* cpu_detect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_detect.h; sourceTree = ""; }; + ABAD3E5C13AF1D6D00502E1E /* FIFOSampleBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIFOSampleBuffer.h; sourceTree = ""; }; + ABAD3E5D13AF1D6D00502E1E /* FIFOSamplePipe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIFOSamplePipe.h; sourceTree = ""; }; + ABAD3E5E13AF1D6D00502E1E /* FIRFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIRFilter.h; sourceTree = ""; }; + ABAD3E5F13AF1D6D00502E1E /* RateTransposer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RateTransposer.h; sourceTree = ""; }; + ABAD3E6013AF1D6D00502E1E /* SoundTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoundTouch.h; sourceTree = ""; }; + ABAD3E6113AF1D6D00502E1E /* STTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STTypes.h; sourceTree = ""; }; + ABAD3E6213AF1D6D00502E1E /* TDStretch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDStretch.h; sourceTree = ""; }; + ABAD3E6313AF1D6D00502E1E /* WavFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WavFile.h; sourceTree = ""; }; + ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AAFilter.cpp; sourceTree = ""; }; + ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu_detect_x86_gcc.cpp; sourceTree = ""; }; + ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FIFOSampleBuffer.cpp; sourceTree = ""; }; + ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FIRFilter.cpp; sourceTree = ""; }; + ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mmx_optimized.cpp; sourceTree = ""; }; + ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RateTransposer.cpp; sourceTree = ""; }; + ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SoundTouch.cpp; sourceTree = ""; }; + ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sse_optimized.cpp; sourceTree = ""; }; + ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TDStretch.cpp; sourceTree = ""; }; + ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WavFile.cpp; sourceTree = ""; }; + ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ActionReplay_32x32.png; path = Images/Icon_ActionReplay_32x32.png; sourceTree = ""; }; + ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_CodeBreaker_32x32.png; path = Images/Icon_CodeBreaker_32x32.png; sourceTree = ""; }; + ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DeSmuME_32x32.png; path = Images/Icon_DeSmuME_32x32.png; sourceTree = ""; }; + ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = DefaultUserPrefs.plist; sourceTree = ""; }; + ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMCheats.icns; sourceTree = ""; }; + ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeFull_16x16.png; path = images/Icon_VolumeFull_16x16.png; sourceTree = ""; }; + ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeMute_16x16.png; path = images/Icon_VolumeMute_16x16.png; sourceTree = ""; }; + ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeOneThird_16x16.png; path = images/Icon_VolumeOneThird_16x16.png; sourceTree = ""; }; + ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeTwoThird_16x16.png; path = images/Icon_VolumeTwoThird_16x16.png; sourceTree = ""; }; + ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; + ABC570D4134431DA00E7B0B1 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; + ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = DefaultKeyMappings.plist; sourceTree = ""; }; + ABD103FE1346652500AF11D1 /* cocoa_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_core.h; sourceTree = ""; }; + ABD103FF1346652500AF11D1 /* cocoa_input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_input.h; sourceTree = ""; }; + ABD104001346652500AF11D1 /* cocoa_rom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_rom.h; sourceTree = ""; }; + ABD104011346652500AF11D1 /* sndOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sndOSX.h; sourceTree = ""; }; + ABD104111346652500AF11D1 /* cocoa_input.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_input.mm; sourceTree = ""; }; + ABD104121346652500AF11D1 /* cocoa_core.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_core.mm; sourceTree = ""; }; + ABD104131346652500AF11D1 /* cocoa_rom.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_rom.mm; sourceTree = ""; }; + ABD104141346652500AF11D1 /* sndOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sndOSX.cpp; sourceTree = ""; }; + ABD104271346653B00AF11D1 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + ABD10452134666DD00AF11D1 /* DeSmuME_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeSmuME_Prefix.pch; sourceTree = ""; }; + ABD1FE6B1345AC8400AF11D1 /* addons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = addons.h; path = ../addons.h; sourceTree = SOURCE_ROOT; }; + ABD1FE6C1345AC8400AF11D1 /* agg2d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = agg2d.h; path = ../agg2d.h; sourceTree = SOURCE_ROOT; }; + ABD1FE6D1345AC8400AF11D1 /* aggdraw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aggdraw.h; path = ../aggdraw.h; sourceTree = SOURCE_ROOT; }; + ABD1FE6E1345AC8400AF11D1 /* arm_instructions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = arm_instructions.h; path = ../arm_instructions.h; sourceTree = SOURCE_ROOT; }; + ABD1FE6F1345AC8400AF11D1 /* armcpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = armcpu.h; path = ../armcpu.h; sourceTree = SOURCE_ROOT; }; + ABD1FE701345AC8400AF11D1 /* bios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bios.h; path = ../bios.h; sourceTree = SOURCE_ROOT; }; + ABD1FE711345AC8400AF11D1 /* bits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bits.h; path = ../bits.h; sourceTree = SOURCE_ROOT; }; + ABD1FE721345AC8400AF11D1 /* cheatSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cheatSystem.h; path = ../cheatSystem.h; sourceTree = SOURCE_ROOT; }; + ABD1FE731345AC8400AF11D1 /* commandline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = commandline.h; path = ../commandline.h; sourceTree = SOURCE_ROOT; }; + ABD1FE741345AC8400AF11D1 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../common.h; sourceTree = SOURCE_ROOT; }; + ABD1FE751345AC8400AF11D1 /* cp15.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cp15.h; path = ../cp15.h; sourceTree = SOURCE_ROOT; }; + ABD1FE761345AC8400AF11D1 /* ctrlssdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ctrlssdl.h; path = ../ctrlssdl.h; sourceTree = SOURCE_ROOT; }; + ABD1FE771345AC8400AF11D1 /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = debug.h; path = ../debug.h; sourceTree = SOURCE_ROOT; }; + ABD1FE781345AC8400AF11D1 /* desmume_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = desmume_config.h; path = ../desmume_config.h; sourceTree = SOURCE_ROOT; }; + ABD1FE791345AC8400AF11D1 /* Disassembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Disassembler.h; path = ../Disassembler.h; sourceTree = SOURCE_ROOT; }; + ABD1FE7A1345AC8400AF11D1 /* driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = driver.h; path = ../driver.h; sourceTree = SOURCE_ROOT; }; + ABD1FE7B1345AC8400AF11D1 /* emufile_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emufile_types.h; path = ../emufile_types.h; sourceTree = SOURCE_ROOT; }; + ABD1FE7C1345AC8400AF11D1 /* emufile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emufile.h; path = ../emufile.h; sourceTree = SOURCE_ROOT; }; + ABD1FE7D1345AC8400AF11D1 /* FIFO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FIFO.h; path = ../FIFO.h; sourceTree = SOURCE_ROOT; }; + ABD1FE7E1345AC8400AF11D1 /* firmware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = firmware.h; path = ../firmware.h; sourceTree = SOURCE_ROOT; }; + ABD1FE7F1345AC8400AF11D1 /* fs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fs.h; path = ../fs.h; sourceTree = SOURCE_ROOT; }; + ABD1FE801345AC8400AF11D1 /* gdbstub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gdbstub.h; path = ../gdbstub.h; sourceTree = SOURCE_ROOT; }; + ABD1FE811345AC8400AF11D1 /* gfx3d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gfx3d.h; path = ../gfx3d.h; sourceTree = SOURCE_ROOT; }; + ABD1FE821345AC8400AF11D1 /* GPU_osd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPU_osd.h; path = ../GPU_osd.h; sourceTree = SOURCE_ROOT; }; + ABD1FE831345AC8400AF11D1 /* GPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPU.h; path = ../GPU.h; sourceTree = SOURCE_ROOT; }; + ABD1FE841345AC8400AF11D1 /* lua-engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lua-engine.h"; path = "../lua-engine.h"; sourceTree = SOURCE_ROOT; }; + ABD1FE851345AC8400AF11D1 /* matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = matrix.h; path = ../matrix.h; sourceTree = SOURCE_ROOT; }; + ABD1FE861345AC8400AF11D1 /* mc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mc.h; path = ../mc.h; sourceTree = SOURCE_ROOT; }; + ABD1FE871345AC8400AF11D1 /* mem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mem.h; path = ../mem.h; sourceTree = SOURCE_ROOT; }; + ABD1FE881345AC8400AF11D1 /* mic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mic.h; path = ../mic.h; sourceTree = SOURCE_ROOT; }; + ABD1FE891345AC8400AF11D1 /* MMU_timing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MMU_timing.h; path = ../MMU_timing.h; sourceTree = SOURCE_ROOT; }; + ABD1FE8A1345AC8400AF11D1 /* MMU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MMU.h; path = ../MMU.h; sourceTree = SOURCE_ROOT; }; + ABD1FE8B1345AC8400AF11D1 /* movie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = movie.h; path = ../movie.h; sourceTree = SOURCE_ROOT; }; + ABD1FE8C1345AC8400AF11D1 /* NDSSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NDSSystem.h; path = ../NDSSystem.h; sourceTree = SOURCE_ROOT; }; + ABD1FE8D1345AC8400AF11D1 /* OGLRender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OGLRender.h; path = ../OGLRender.h; sourceTree = SOURCE_ROOT; }; + ABD1FE8E1345AC8400AF11D1 /* PACKED_END.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PACKED_END.h; path = ../PACKED_END.h; sourceTree = SOURCE_ROOT; }; + ABD1FE8F1345AC8400AF11D1 /* PACKED.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PACKED.h; path = ../PACKED.h; sourceTree = SOURCE_ROOT; }; + ABD1FE901345AC8400AF11D1 /* path.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = path.h; path = ../path.h; sourceTree = SOURCE_ROOT; }; + ABD1FE911345AC8400AF11D1 /* rasterize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rasterize.h; path = ../rasterize.h; sourceTree = SOURCE_ROOT; }; + ABD1FE921345AC8400AF11D1 /* readwrite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = readwrite.h; path = ../readwrite.h; sourceTree = SOURCE_ROOT; }; + ABD1FE931345AC8400AF11D1 /* registers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = registers.h; path = ../registers.h; sourceTree = SOURCE_ROOT; }; + ABD1FE941345AC8400AF11D1 /* render3D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = render3D.h; path = ../render3D.h; sourceTree = SOURCE_ROOT; }; + ABD1FE951345AC8400AF11D1 /* ROMReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ROMReader.h; path = ../ROMReader.h; sourceTree = SOURCE_ROOT; }; + ABD1FE961345AC8400AF11D1 /* rtc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rtc.h; path = ../rtc.h; sourceTree = SOURCE_ROOT; }; + ABD1FE971345AC8400AF11D1 /* saves.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = saves.h; path = ../saves.h; sourceTree = SOURCE_ROOT; }; + ABD1FE981345AC8400AF11D1 /* shaders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = shaders.h; path = ../shaders.h; sourceTree = SOURCE_ROOT; }; + ABD1FE991345AC8400AF11D1 /* slot1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = slot1.h; path = ../slot1.h; sourceTree = SOURCE_ROOT; }; + ABD1FE9A1345AC8400AF11D1 /* sndsdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sndsdl.h; path = ../sndsdl.h; sourceTree = SOURCE_ROOT; }; + ABD1FE9B1345AC8400AF11D1 /* SPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPU.h; path = ../SPU.h; sourceTree = SOURCE_ROOT; }; + ABD1FE9C1345AC8400AF11D1 /* texcache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = texcache.h; path = ../texcache.h; sourceTree = SOURCE_ROOT; }; + ABD1FE9D1345AC8400AF11D1 /* thumb_instructions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = thumb_instructions.h; path = ../thumb_instructions.h; sourceTree = SOURCE_ROOT; }; + ABD1FE9E1345AC8400AF11D1 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../types.h; sourceTree = SOURCE_ROOT; }; + ABD1FE9F1345AC8400AF11D1 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = version.h; path = ../version.h; sourceTree = SOURCE_ROOT; }; + ABD1FEA01345AC8400AF11D1 /* wifi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wifi.h; path = ../wifi.h; sourceTree = SOURCE_ROOT; }; + ABD1FEA11345AC8400AF11D1 /* addons.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = addons.cpp; path = ../addons.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEA21345AC8400AF11D1 /* aggdraw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = aggdraw.cpp; path = ../aggdraw.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arm_instructions.cpp; path = ../arm_instructions.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = armcpu.cpp; path = ../armcpu.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEA51345AC8400AF11D1 /* bios.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bios.cpp; path = ../bios.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cheatSystem.cpp; path = ../cheatSystem.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEA71345AC8400AF11D1 /* commandline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = commandline.cpp; path = ../commandline.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEA81345AC8400AF11D1 /* common.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = common.cpp; path = ../common.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEA91345AC8400AF11D1 /* cp15.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cp15.cpp; path = ../cp15.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEAA1345AC8400AF11D1 /* ctrlssdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ctrlssdl.cpp; path = ../ctrlssdl.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEAB1345AC8400AF11D1 /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = debug.cpp; path = ../debug.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEAC1345AC8400AF11D1 /* desmume_config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = desmume_config.cpp; path = ../desmume_config.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Disassembler.cpp; path = ../Disassembler.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEAE1345AC8400AF11D1 /* driver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = driver.cpp; path = ../driver.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = emufile.cpp; path = ../emufile.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FIFO.cpp; path = ../FIFO.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEB11345AC8400AF11D1 /* firmware.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = firmware.cpp; path = ../firmware.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "fs-linux.cpp"; path = "../fs-linux.cpp"; sourceTree = SOURCE_ROOT; }; + ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gfx3d.cpp; path = ../gfx3d.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU_osd_stub.cpp; path = ../GPU_osd_stub.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEB61345AC8400AF11D1 /* GPU_osd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU_osd.cpp; path = ../GPU_osd.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEB71345AC8400AF11D1 /* GPU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GPU.cpp; path = ../GPU.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEB81345AC8400AF11D1 /* lua-engine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "lua-engine.cpp"; path = "../lua-engine.cpp"; sourceTree = SOURCE_ROOT; }; + ABD1FEB91345AC8400AF11D1 /* matrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = matrix.cpp; path = ../matrix.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEBA1345AC8400AF11D1 /* mc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mc.cpp; path = ../mc.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEBB1345AC8400AF11D1 /* mic_alsa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic_alsa.cpp; path = ../mic_alsa.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEBC1345AC8400AF11D1 /* mic_openal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic_openal.cpp; path = ../mic_openal.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEBD1345AC8400AF11D1 /* mic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mic.cpp; path = ../mic.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MMU.cpp; path = ../MMU.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEBF1345AC8400AF11D1 /* movie.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = movie.cpp; path = ../movie.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NDSSystem.cpp; path = ../NDSSystem.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OGLRender.cpp; path = ../OGLRender.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEC21345AC8400AF11D1 /* path.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = path.cpp; path = ../path.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rasterize.cpp; path = ../rasterize.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = readwrite.cpp; path = ../readwrite.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEC51345AC8400AF11D1 /* render3D.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = render3D.cpp; path = ../render3D.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ROMReader.cpp; path = ../ROMReader.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEC71345AC8400AF11D1 /* rtc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rtc.cpp; path = ../rtc.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEC81345AC8400AF11D1 /* saves.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = saves.cpp; path = ../saves.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FEC91345AC8400AF11D1 /* slot1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = slot1.cpp; path = ../slot1.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FECA1345AC8400AF11D1 /* sndsdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sndsdl.cpp; path = ../sndsdl.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FECB1345AC8400AF11D1 /* SPU.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SPU.cpp; path = ../SPU.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FECC1345AC8400AF11D1 /* texcache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = texcache.cpp; path = ../texcache.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = thumb_instructions.cpp; path = ../thumb_instructions.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FECE1345AC8400AF11D1 /* version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = version.cpp; path = ../version.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FECF1345AC8400AF11D1 /* wifi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = wifi.cpp; path = ../wifi.cpp; sourceTree = SOURCE_ROOT; }; + ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_none.cpp; sourceTree = ""; }; + ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_r4.cpp; sourceTree = ""; }; + ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail.cpp; sourceTree = ""; }; + ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_expMemory.cpp; sourceTree = ""; }; + ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_gbagame.cpp; sourceTree = ""; }; + ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_guitarGrip.cpp; sourceTree = ""; }; + ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_mpcf.cpp; sourceTree = ""; }; + ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_none.cpp; sourceTree = ""; }; + ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_paddle.cpp; sourceTree = ""; }; + ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_piano.cpp; sourceTree = ""; }; + ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_rumblepak.cpp; sourceTree = ""; }; + ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gdbstub.cpp; sourceTree = ""; }; + ABD1FF181345ACA900AF11D1 /* gdbstub_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gdbstub_internal.h; sourceTree = ""; }; + ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ConvertUTF.c; sourceTree = ""; }; + ABD1FF1E1345ACBF00AF11D1 /* ConvertUTF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConvertUTF.h; sourceTree = ""; }; + ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = datetime.cpp; sourceTree = ""; }; + ABD1FF201345ACBF00AF11D1 /* datetime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = datetime.h; sourceTree = ""; }; + ABD1FF221345ACBF00AF11D1 /* crc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = crc.cpp; sourceTree = ""; }; + ABD1FF231345ACBF00AF11D1 /* crc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crc.h; sourceTree = ""; }; + ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = decrypt.cpp; sourceTree = ""; }; + ABD1FF251345ACBF00AF11D1 /* decrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decrypt.h; sourceTree = ""; }; + ABD1FF261345ACBF00AF11D1 /* header.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = header.cpp; sourceTree = ""; }; + ABD1FF271345ACBF00AF11D1 /* header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = header.h; sourceTree = ""; }; + ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dlditool.cpp; sourceTree = ""; }; + ABD1FF291345ACBF00AF11D1 /* emufat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emufat.cpp; sourceTree = ""; }; + ABD1FF2A1345ACBF00AF11D1 /* emufat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emufat.h; sourceTree = ""; }; + ABD1FF2B1345ACBF00AF11D1 /* emufat_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emufat_types.h; sourceTree = ""; }; + ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = guid.cpp; sourceTree = ""; }; + ABD1FF2D1345ACBF00AF11D1 /* guid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = guid.h; sourceTree = ""; }; + ABD1FF2F1345ACBF00AF11D1 /* bit_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_ops.h; sourceTree = ""; }; + ABD1FF301345ACBF00AF11D1 /* cache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cache.cpp; sourceTree = ""; }; + ABD1FF311345ACBF00AF11D1 /* cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cache.h; sourceTree = ""; }; + ABD1FF321345ACBF00AF11D1 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; + ABD1FF331345ACBF00AF11D1 /* directory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = directory.cpp; sourceTree = ""; }; + ABD1FF341345ACBF00AF11D1 /* directory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = directory.h; sourceTree = ""; }; + ABD1FF351345ACBF00AF11D1 /* disc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disc.cpp; sourceTree = ""; }; + ABD1FF361345ACBF00AF11D1 /* disc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disc.h; sourceTree = ""; }; + ABD1FF371345ACBF00AF11D1 /* disc_io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disc_io.h; sourceTree = ""; }; + ABD1FF381345ACBF00AF11D1 /* fat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fat.h; sourceTree = ""; }; + ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fatdir.cpp; sourceTree = ""; }; + ABD1FF3A1345ACBF00AF11D1 /* fatdir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fatdir.h; sourceTree = ""; }; + ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fatfile.cpp; sourceTree = ""; }; + ABD1FF3C1345ACBF00AF11D1 /* fatfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fatfile.h; sourceTree = ""; }; + ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_allocation_table.cpp; sourceTree = ""; }; + ABD1FF3E1345ACBF00AF11D1 /* file_allocation_table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_allocation_table.h; sourceTree = ""; }; + ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filetime.cpp; sourceTree = ""; }; + ABD1FF401345ACBF00AF11D1 /* filetime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filetime.h; sourceTree = ""; }; + ABD1FF411345ACBF00AF11D1 /* libfat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libfat.cpp; sourceTree = ""; }; + ABD1FF421345ACBF00AF11D1 /* libfat_pc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libfat_pc.h; sourceTree = ""; }; + ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = libfat_public_api.cpp; sourceTree = ""; }; + ABD1FF441345ACBF00AF11D1 /* libfat_public_api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libfat_public_api.h; sourceTree = ""; }; + ABD1FF451345ACBF00AF11D1 /* lock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lock.cpp; sourceTree = ""; }; + ABD1FF461345ACBF00AF11D1 /* lock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lock.h; sourceTree = ""; }; + ABD1FF471345ACBF00AF11D1 /* mem_allocate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem_allocate.h; sourceTree = ""; }; + ABD1FF481345ACBF00AF11D1 /* partition.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = partition.cpp; sourceTree = ""; }; + ABD1FF491345ACBF00AF11D1 /* partition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = partition.h; sourceTree = ""; }; + ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = md5.cpp; sourceTree = ""; }; + ABD1FF4B1345ACBF00AF11D1 /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = ""; }; + ABD1FF4C1345ACBF00AF11D1 /* task.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = task.cpp; sourceTree = ""; }; + ABD1FF4D1345ACBF00AF11D1 /* task.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = task.h; sourceTree = ""; }; + ABD1FF4E1345ACBF00AF11D1 /* valuearray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = valuearray.h; sourceTree = ""; }; + ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vfat.cpp; sourceTree = ""; }; + ABD1FF501345ACBF00AF11D1 /* vfat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vfat.h; sourceTree = ""; }; + ABD1FF511345ACBF00AF11D1 /* xstring.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xstring.cpp; sourceTree = ""; }; + ABD1FF521345ACBF00AF11D1 /* xstring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xstring.h; sourceTree = ""; }; + ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = metaspu.cpp; sourceTree = ""; }; + ABD1FF781345ACFA00AF11D1 /* metaspu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = metaspu.h; sourceTree = ""; }; + ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SndOut.cpp; sourceTree = ""; }; + ABD1FF7B1345ACFA00AF11D1 /* SndOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SndOut.h; sourceTree = ""; }; + ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Timestretcher.cpp; sourceTree = ""; }; + ABD9A46313DB99B300777194 /* cocoa_mic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_mic.h; sourceTree = ""; }; + ABD9A46413DB99B300777194 /* cocoa_mic.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_mic.mm; sourceTree = ""; }; + ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_videofilter.h; sourceTree = ""; }; + ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_videofilter.mm; sourceTree = ""; }; + ABE670251415DE6C00E8E4C9 /* tinystr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinystr.cpp; sourceTree = ""; }; + ABE670261415DE6C00E8E4C9 /* tinystr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tinystr.h; sourceTree = ""; }; + ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxml.cpp; sourceTree = ""; }; + ABE670281415DE6C00E8E4C9 /* tinyxml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tinyxml.h; sourceTree = ""; }; + ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxmlerror.cpp; sourceTree = ""; }; + ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxmlparser.cpp; sourceTree = ""; }; + ABE7F53C13EE1C7900FD3A71 /* cocoa_firmware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_firmware.h; sourceTree = ""; }; + ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_firmware.mm; sourceTree = ""; }; + ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_ROMSave.icns; sourceTree = ""; }; + ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_DeSmuME.icns; sourceTree = ""; }; + ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_NintendoDS_ROM.icns; sourceTree = ""; }; + ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon_SaveState.icns; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8D11072E0486CEB800E47090 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ABC5720D1344346600E7B0B1 /* AppKit.framework in Frameworks */, + ABC570D1134431CE00E7B0B1 /* AudioUnit.framework in Frameworks */, + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, + ABC572101344347000E7B0B1 /* Foundation.framework in Frameworks */, + AB350BA51478AC96007165AC /* IOKit.framework in Frameworks */, + ABC570D5134431DA00E7B0B1 /* OpenGL.framework in Frameworks */, + AB4676F314AB12D60002FF94 /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AB711F731481C35F009011C8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AB711F771481C35F009011C8 /* AppKit.framework in Frameworks */, + AB711F751481C35F009011C8 /* AudioUnit.framework in Frameworks */, + AB711F741481C35F009011C8 /* Cocoa.framework in Frameworks */, + AB711F781481C35F009011C8 /* Foundation.framework in Frameworks */, + AB711F7B1481C35F009011C8 /* IOKit.framework in Frameworks */, + AB711F761481C35F009011C8 /* OpenGL.framework in Frameworks */, + ABC3AFCF14B8D16700D5B13D /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 080E96DDFE201D6D7F000001 /* Cocoa Port */ = { + isa = PBXGroup; + children = ( + AB3ACB6514C2361100D7D192 /* userinterface */, + ABD104141346652500AF11D1 /* sndOSX.cpp */, + AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */, + ABA6574914511EC90077E5E9 /* cocoa_cheat.h */, + ABD103FE1346652500AF11D1 /* cocoa_core.h */, + AB58F32B1364F44B0074C376 /* cocoa_file.h */, + ABE7F53C13EE1C7900FD3A71 /* cocoa_firmware.h */, + AB9971CE134EDA0800531BA7 /* cocoa_globals.h */, + AB350B681478A5B3007165AC /* cocoa_hid.h */, + ABD103FF1346652500AF11D1 /* cocoa_input.h */, + ABD9A46313DB99B300777194 /* cocoa_mic.h */, + AB3E34C7134AF4500056477A /* cocoa_output.h */, + ABD104001346652500AF11D1 /* cocoa_rom.h */, + AB80E050142BC4FA00A52038 /* cocoa_util.h */, + ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */, + ABD104011346652500AF11D1 /* sndOSX.h */, + AB817A34143EE2DB00A7DFE9 /* videofilter.h */, + AB350B691478A5B3007165AC /* cocoa_hid.mm */, + ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */, + ABD104121346652500AF11D1 /* cocoa_core.mm */, + AB58F32C1364F44B0074C376 /* cocoa_file.mm */, + ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */, + ABD104111346652500AF11D1 /* cocoa_input.mm */, + ABD9A46413DB99B300777194 /* cocoa_mic.mm */, + AB3E34C8134AF4500056477A /* cocoa_output.mm */, + ABD104131346652500AF11D1 /* cocoa_rom.mm */, + AB80E04C142BC4A800A52038 /* cocoa_util.mm */, + ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */, + ); + name = "Cocoa Port"; + sourceTree = ""; + }; + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 29B97324FDCFA39411CA2CEA /* AppKit.framework */, + ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */, + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + 29B97325FDCFA39411CA2CEA /* Foundation.framework */, + AB350BA41478AC96007165AC /* IOKit.framework */, + ABC570D4134431DA00E7B0B1 /* OpenGL.framework */, + AB0A0D1914AACA9600E83E91 /* libz.dylib */, + ); + name = "Linked Frameworks"; + sourceTree = ""; + }; + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8D1107320486CEB800E47090 /* DeSmuME (Debug).app */, + AB711F7F1481C35F009011C8 /* DeSmuME (Debug).app */, + ); + name = Products; + sourceTree = ""; + }; + 29B97314FDCFA39411CA2CEA /* DeSmuME */ = { + isa = PBXGroup; + children = ( + 080E96DDFE201D6D7F000001 /* Cocoa Port */, + ABC572B7134592D900E7B0B1 /* Core */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, + 29B97315FDCFA39411CA2CEA /* Other Sources */, + 19C28FACFE9D520D11CA2CBB /* Products */, + 29B97317FDCFA39411CA2CEA /* Resources */, + ); + name = DeSmuME; + sourceTree = ""; + }; + 29B97315FDCFA39411CA2CEA /* Other Sources */ = { + isa = PBXGroup; + children = ( + ABD104271346653B00AF11D1 /* main.m */, + ABD10452134666DD00AF11D1 /* DeSmuME_Prefix.pch */, + ); + name = "Other Sources"; + sourceTree = ""; + }; + 29B97317FDCFA39411CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + ABC2ECD613B1C87000FAAA2A /* Images */, + AB00E87C14205EBC00DE561F /* MainMenu.xib */, + AB350D3A147A1D93007165AC /* HID_usage_strings.plist */, + 8D1107310486CEB800E47090 /* Info.plist */, + AB02791814415E4C0075E58C /* Info (Debug).plist */, + AB00E87914205EAE00DE561F /* InfoPlist.strings */, + AB02475B13886BF300E9F9AB /* KeyNames.plist */, + AB901BDD1420706100348EEC /* Localizable.strings */, + ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */, + ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */, + AB64987B13ECC73800EE7DD2 /* FileTypeInfo.plist */, + AB3ACC3814C24D5400D7D192 /* AUTHORS */, + AB3ACC3914C24D5400D7D192 /* ChangeLog */, + AB3ACC3A14C24D5400D7D192 /* COPYING */, + AB3ACC3B14C24D5400D7D192 /* README */, + AB3ACC3C14C24D5400D7D192 /* README.TRANSLATION */, + AB3ACC3D14C24D5400D7D192 /* README.MAC */, + ); + name = Resources; + sourceTree = ""; + }; + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + AB3ACB6514C2361100D7D192 /* userinterface */ = { + isa = PBXGroup; + children = ( + AB3ACB6614C2361100D7D192 /* appDelegate.h */, + AB3ACB6814C2361100D7D192 /* cheatWindowDelegate.h */, + AB3ACB6A14C2361100D7D192 /* displayView.h */, + AB3ACB6C14C2361100D7D192 /* emuWindowDelegate.h */, + AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */, + AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */, + AB3ACB6714C2361100D7D192 /* appDelegate.mm */, + AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */, + AB3ACB6B14C2361100D7D192 /* displayView.mm */, + AB3ACB6D14C2361100D7D192 /* emuWindowDelegate.mm */, + AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */, + AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */, + ); + path = userinterface; + sourceTree = ""; + }; + AB85D77414ABE42100286B70 /* App Icons */ = { + isa = PBXGroup; + children = ( + ABEFCF5E141AB82A000CC0CD /* AppIcon_DeSmuME.icns */, + ABEFCF5F141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns */, + ABBF04A414B515F300E505A0 /* AppIcon_ROMCheats.icns */, + ABEFCF5D141AB82A000CC0CD /* AppIcon_ROMSave.icns */, + AB75226D14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns */, + ABEFCF60141AB82A000CC0CD /* AppIcon_SaveState.icns */, + ); + name = "App Icons"; + sourceTree = ""; + }; + AB90210214234C8B00348EEC /* filter */ = { + isa = PBXGroup; + children = ( + AB90210314234C8B00348EEC /* 2xsai.cpp */, + AB90210414234C8B00348EEC /* bilinear.cpp */, + AB90210514234C8B00348EEC /* epx.cpp */, + AB90210714234C8B00348EEC /* hq2x.cpp */, + AB90210914234C8B00348EEC /* hq4x.cpp */, + AB90210D14234C8B00348EEC /* lq2x.cpp */, + AB90210F14234C8B00348EEC /* scanline.cpp */, + AB90210614234C8B00348EEC /* filter.h */, + AB90210814234C8B00348EEC /* hq2x.h */, + AB90210B14234C8B00348EEC /* hq4x.h */, + AB90210C14234C8B00348EEC /* interp.h */, + AB90210E14234C8B00348EEC /* lq2x.h */, + ); + name = filter; + path = ../windows/filter; + sourceTree = SOURCE_ROOT; + }; + ABC2ECD613B1C87000FAAA2A /* Images */ = { + isa = PBXGroup; + children = ( + AB85D77414ABE42100286B70 /* App Icons */, + AB0F292814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png */, + AB0F292914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png */, + AB0F292A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png */, + AB0F292B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png */, + AB0F292C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png */, + AB0F292D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png */, + AB0F292E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png */, + AB0F292F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png */, + AB0F293014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png */, + AB0F293114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png */, + AB0F293214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png */, + AB0F293314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png */, + AB0F293414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png */, + AB0F293514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png */, + AB0F293614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png */, + AB0F293714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png */, + AB0F296B14BE705D009ABC6F /* Icon_ActionReplay_128x128.png */, + ABB97873144E89CC00793FA3 /* Icon_ActionReplay_32x32.png */, + AB0F298814BE71E0009ABC6F /* Icon_ArrowDown_420x420.png */, + AB0F298914BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png */, + AB0F298A14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png */, + AB0F298B14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png */, + AB0F296C14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png */, + ABB97874144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png */, + ABB97875144E89CC00793FA3 /* Icon_DeSmuME_32x32.png */, + AB0F299414BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png */, + AB0F299514BE7213009ABC6F /* Icon_DSButtonA_420x420.png */, + AB0F299614BE7213009ABC6F /* Icon_DSButtonB_420x420.png */, + AB0F299714BE7213009ABC6F /* Icon_DSButtonL_420x420.png */, + AB0F299814BE7213009ABC6F /* Icon_DSButtonR_420x420.png */, + AB0F299914BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png */, + AB0F299A14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png */, + AB0F299B14BE7213009ABC6F /* Icon_DSButtonX_420x420.png */, + AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */, + AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */, + AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */, + AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */, + AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */, + AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */, + AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */, + AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */, + AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */, + AB0F29A314BE7213009ABC6F /* Icon_RotateCW_420x420.png */, + AB0F29A414BE7213009ABC6F /* Icon_ShowHUD_420x420.png */, + AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */, + AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */, + AB0F290114BE6E68009ABC6F /* Icon_Speed2x_420x420.png */, + ABC3AF2B14B7F06900D5B13D /* Icon_VolumeFull_16x16.png */, + ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */, + ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */, + ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */, + AB0F297914BE70BC009ABC6F /* VideoFilterPreview_64x64.png */, + ); + name = Images; + sourceTree = ""; + }; + ABC572B7134592D900E7B0B1 /* Core */ = { + isa = PBXGroup; + children = ( + ABD1FEFF1345AC9B00AF11D1 /* addons */, + ABD1FF161345ACA900AF11D1 /* gdbstub */, + AB90210214234C8B00348EEC /* filter */, + ABD1FF761345ACFA00AF11D1 /* metaspu */, + ABD1FF1C1345ACBF00AF11D1 /* utils */, + ABD1FEA11345AC8400AF11D1 /* addons.cpp */, + ABD1FEA21345AC8400AF11D1 /* aggdraw.cpp */, + ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */, + ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */, + ABD1FEA51345AC8400AF11D1 /* bios.cpp */, + ABD1FEA61345AC8400AF11D1 /* cheatSystem.cpp */, + ABD1FEA71345AC8400AF11D1 /* commandline.cpp */, + ABD1FEA81345AC8400AF11D1 /* common.cpp */, + ABD1FEA91345AC8400AF11D1 /* cp15.cpp */, + ABD1FEAA1345AC8400AF11D1 /* ctrlssdl.cpp */, + ABD1FEAB1345AC8400AF11D1 /* debug.cpp */, + ABD1FEAC1345AC8400AF11D1 /* desmume_config.cpp */, + ABD1FEAD1345AC8400AF11D1 /* Disassembler.cpp */, + ABD1FEAE1345AC8400AF11D1 /* driver.cpp */, + ABD1FEAF1345AC8400AF11D1 /* emufile.cpp */, + ABD1FEB01345AC8400AF11D1 /* FIFO.cpp */, + ABD1FEB11345AC8400AF11D1 /* firmware.cpp */, + ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */, + ABD1FEB41345AC8400AF11D1 /* gfx3d.cpp */, + ABD1FEB71345AC8400AF11D1 /* GPU.cpp */, + ABD1FEB61345AC8400AF11D1 /* GPU_osd.cpp */, + ABD1FEB51345AC8400AF11D1 /* GPU_osd_stub.cpp */, + ABD1FEB81345AC8400AF11D1 /* lua-engine.cpp */, + ABD1FEB91345AC8400AF11D1 /* matrix.cpp */, + ABD1FEBA1345AC8400AF11D1 /* mc.cpp */, + ABD1FEBD1345AC8400AF11D1 /* mic.cpp */, + ABD1FEBB1345AC8400AF11D1 /* mic_alsa.cpp */, + ABD1FEBC1345AC8400AF11D1 /* mic_openal.cpp */, + ABD1FEBE1345AC8400AF11D1 /* MMU.cpp */, + ABD1FEBF1345AC8400AF11D1 /* movie.cpp */, + ABD1FEC01345AC8400AF11D1 /* NDSSystem.cpp */, + ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */, + ABD1FEC21345AC8400AF11D1 /* path.cpp */, + ABD1FEC31345AC8400AF11D1 /* rasterize.cpp */, + ABD1FEC41345AC8400AF11D1 /* readwrite.cpp */, + ABD1FEC51345AC8400AF11D1 /* render3D.cpp */, + ABD1FEC61345AC8400AF11D1 /* ROMReader.cpp */, + ABD1FEC71345AC8400AF11D1 /* rtc.cpp */, + ABD1FEC81345AC8400AF11D1 /* saves.cpp */, + ABD1FEC91345AC8400AF11D1 /* slot1.cpp */, + ABD1FECA1345AC8400AF11D1 /* sndsdl.cpp */, + ABD1FECB1345AC8400AF11D1 /* SPU.cpp */, + ABD1FECC1345AC8400AF11D1 /* texcache.cpp */, + ABD1FECD1345AC8400AF11D1 /* thumb_instructions.cpp */, + ABD1FECE1345AC8400AF11D1 /* version.cpp */, + ABD1FECF1345AC8400AF11D1 /* wifi.cpp */, + ABD1FE6B1345AC8400AF11D1 /* addons.h */, + ABD1FE6C1345AC8400AF11D1 /* agg2d.h */, + ABD1FE6D1345AC8400AF11D1 /* aggdraw.h */, + ABD1FE6E1345AC8400AF11D1 /* arm_instructions.h */, + ABD1FE6F1345AC8400AF11D1 /* armcpu.h */, + ABD1FE701345AC8400AF11D1 /* bios.h */, + ABD1FE711345AC8400AF11D1 /* bits.h */, + ABD1FE721345AC8400AF11D1 /* cheatSystem.h */, + ABD1FE731345AC8400AF11D1 /* commandline.h */, + ABD1FE741345AC8400AF11D1 /* common.h */, + ABD1FE751345AC8400AF11D1 /* cp15.h */, + ABD1FE761345AC8400AF11D1 /* ctrlssdl.h */, + ABD1FE771345AC8400AF11D1 /* debug.h */, + ABD1FE781345AC8400AF11D1 /* desmume_config.h */, + ABD1FE791345AC8400AF11D1 /* Disassembler.h */, + ABD1FE7A1345AC8400AF11D1 /* driver.h */, + ABD1FE7C1345AC8400AF11D1 /* emufile.h */, + ABD1FE7B1345AC8400AF11D1 /* emufile_types.h */, + ABD1FE7D1345AC8400AF11D1 /* FIFO.h */, + ABD1FE7E1345AC8400AF11D1 /* firmware.h */, + ABD1FE7F1345AC8400AF11D1 /* fs.h */, + ABD1FE801345AC8400AF11D1 /* gdbstub.h */, + ABD1FE811345AC8400AF11D1 /* gfx3d.h */, + ABD1FE831345AC8400AF11D1 /* GPU.h */, + ABD1FE821345AC8400AF11D1 /* GPU_osd.h */, + ABD1FE841345AC8400AF11D1 /* lua-engine.h */, + ABD1FE851345AC8400AF11D1 /* matrix.h */, + ABD1FE861345AC8400AF11D1 /* mc.h */, + ABD1FE871345AC8400AF11D1 /* mem.h */, + ABD1FE881345AC8400AF11D1 /* mic.h */, + ABD1FE8A1345AC8400AF11D1 /* MMU.h */, + ABD1FE891345AC8400AF11D1 /* MMU_timing.h */, + ABD1FE8B1345AC8400AF11D1 /* movie.h */, + ABD1FE8C1345AC8400AF11D1 /* NDSSystem.h */, + ABD1FE8D1345AC8400AF11D1 /* OGLRender.h */, + ABD1FE8F1345AC8400AF11D1 /* PACKED.h */, + ABD1FE8E1345AC8400AF11D1 /* PACKED_END.h */, + ABD1FE901345AC8400AF11D1 /* path.h */, + ABD1FE911345AC8400AF11D1 /* rasterize.h */, + ABD1FE921345AC8400AF11D1 /* readwrite.h */, + ABD1FE931345AC8400AF11D1 /* registers.h */, + ABD1FE941345AC8400AF11D1 /* render3D.h */, + ABD1FE951345AC8400AF11D1 /* ROMReader.h */, + ABD1FE961345AC8400AF11D1 /* rtc.h */, + ABD1FE971345AC8400AF11D1 /* saves.h */, + ABD1FE981345AC8400AF11D1 /* shaders.h */, + ABD1FE991345AC8400AF11D1 /* slot1.h */, + ABD1FE9A1345AC8400AF11D1 /* sndsdl.h */, + ABD1FE9B1345AC8400AF11D1 /* SPU.h */, + ABD1FE9C1345AC8400AF11D1 /* texcache.h */, + ABD1FE9D1345AC8400AF11D1 /* thumb_instructions.h */, + ABD1FE9E1345AC8400AF11D1 /* types.h */, + ABD1FE9F1345AC8400AF11D1 /* version.h */, + ABD1FEA01345AC8400AF11D1 /* wifi.h */, + ); + name = Core; + sourceTree = ""; + }; + ABD1FEFF1345AC9B00AF11D1 /* addons */ = { + isa = PBXGroup; + children = ( + ABD1FF001345AC9B00AF11D1 /* slot1_none.cpp */, + ABD1FF011345AC9B00AF11D1 /* slot1_r4.cpp */, + AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */, + ABD1FF021345AC9B00AF11D1 /* slot1_retail.cpp */, + ABD1FF031345AC9B00AF11D1 /* slot2_expMemory.cpp */, + ABD1FF041345AC9B00AF11D1 /* slot2_gbagame.cpp */, + ABD1FF051345AC9B00AF11D1 /* slot2_guitarGrip.cpp */, + ABD1FF061345AC9B00AF11D1 /* slot2_mpcf.cpp */, + ABD1FF071345AC9C00AF11D1 /* slot2_none.cpp */, + ABD1FF081345AC9C00AF11D1 /* slot2_paddle.cpp */, + ABD1FF091345AC9C00AF11D1 /* slot2_piano.cpp */, + ABD1FF0A1345AC9C00AF11D1 /* slot2_rumblepak.cpp */, + ); + name = addons; + path = ../addons; + sourceTree = SOURCE_ROOT; + }; + ABD1FF161345ACA900AF11D1 /* gdbstub */ = { + isa = PBXGroup; + children = ( + ABD1FF171345ACA900AF11D1 /* gdbstub.cpp */, + ABD1FF181345ACA900AF11D1 /* gdbstub_internal.h */, + ); + name = gdbstub; + path = ../gdbstub; + sourceTree = SOURCE_ROOT; + }; + ABD1FF1C1345ACBF00AF11D1 /* utils */ = { + isa = PBXGroup; + children = ( + ABD1FF211345ACBF00AF11D1 /* decrypt */, + ABD1FF2E1345ACBF00AF11D1 /* libfat */, + ABE670241415DE6C00E8E4C9 /* tinyxml */, + ABD1FF1D1345ACBF00AF11D1 /* ConvertUTF.c */, + ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */, + ABD1FF281345ACBF00AF11D1 /* dlditool.cpp */, + ABD1FF291345ACBF00AF11D1 /* emufat.cpp */, + ABD1FF2C1345ACBF00AF11D1 /* guid.cpp */, + ABD1FF4A1345ACBF00AF11D1 /* md5.cpp */, + ABD1FF4C1345ACBF00AF11D1 /* task.cpp */, + ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */, + ABD1FF511345ACBF00AF11D1 /* xstring.cpp */, + ABD1FF1E1345ACBF00AF11D1 /* ConvertUTF.h */, + ABD1FF201345ACBF00AF11D1 /* datetime.h */, + ABD1FF2A1345ACBF00AF11D1 /* emufat.h */, + ABD1FF2B1345ACBF00AF11D1 /* emufat_types.h */, + ABD1FF2D1345ACBF00AF11D1 /* guid.h */, + ABD1FF4B1345ACBF00AF11D1 /* md5.h */, + ABD1FF4D1345ACBF00AF11D1 /* task.h */, + ABD1FF4E1345ACBF00AF11D1 /* valuearray.h */, + ABD1FF501345ACBF00AF11D1 /* vfat.h */, + ABD1FF521345ACBF00AF11D1 /* xstring.h */, + ); + name = utils; + path = ../utils; + sourceTree = SOURCE_ROOT; + }; + ABD1FF211345ACBF00AF11D1 /* decrypt */ = { + isa = PBXGroup; + children = ( + ABD1FF221345ACBF00AF11D1 /* crc.cpp */, + ABD1FF241345ACBF00AF11D1 /* decrypt.cpp */, + ABD1FF261345ACBF00AF11D1 /* header.cpp */, + ABD1FF231345ACBF00AF11D1 /* crc.h */, + ABD1FF251345ACBF00AF11D1 /* decrypt.h */, + ABD1FF271345ACBF00AF11D1 /* header.h */, + ); + path = decrypt; + sourceTree = ""; + }; + ABD1FF2E1345ACBF00AF11D1 /* libfat */ = { + isa = PBXGroup; + children = ( + ABD1FF301345ACBF00AF11D1 /* cache.cpp */, + ABD1FF331345ACBF00AF11D1 /* directory.cpp */, + ABD1FF351345ACBF00AF11D1 /* disc.cpp */, + ABD1FF391345ACBF00AF11D1 /* fatdir.cpp */, + ABD1FF3B1345ACBF00AF11D1 /* fatfile.cpp */, + ABD1FF3D1345ACBF00AF11D1 /* file_allocation_table.cpp */, + ABD1FF3F1345ACBF00AF11D1 /* filetime.cpp */, + ABD1FF411345ACBF00AF11D1 /* libfat.cpp */, + ABD1FF431345ACBF00AF11D1 /* libfat_public_api.cpp */, + ABD1FF451345ACBF00AF11D1 /* lock.cpp */, + ABD1FF481345ACBF00AF11D1 /* partition.cpp */, + ABD1FF2F1345ACBF00AF11D1 /* bit_ops.h */, + ABD1FF311345ACBF00AF11D1 /* cache.h */, + ABD1FF321345ACBF00AF11D1 /* common.h */, + ABD1FF341345ACBF00AF11D1 /* directory.h */, + ABD1FF361345ACBF00AF11D1 /* disc.h */, + ABD1FF371345ACBF00AF11D1 /* disc_io.h */, + ABD1FF381345ACBF00AF11D1 /* fat.h */, + ABD1FF3A1345ACBF00AF11D1 /* fatdir.h */, + ABD1FF3C1345ACBF00AF11D1 /* fatfile.h */, + ABD1FF3E1345ACBF00AF11D1 /* file_allocation_table.h */, + ABD1FF401345ACBF00AF11D1 /* filetime.h */, + ABD1FF421345ACBF00AF11D1 /* libfat_pc.h */, + ABD1FF441345ACBF00AF11D1 /* libfat_public_api.h */, + ABD1FF461345ACBF00AF11D1 /* lock.h */, + ABD1FF471345ACBF00AF11D1 /* mem_allocate.h */, + ABD1FF491345ACBF00AF11D1 /* partition.h */, + ); + path = libfat; + sourceTree = ""; + }; + ABD1FF761345ACFA00AF11D1 /* metaspu */ = { + isa = PBXGroup; + children = ( + ABD1FF7C1345ACFA00AF11D1 /* SoundTouch */, + ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */, + ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */, + ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */, + ABD1FF781345ACFA00AF11D1 /* metaspu.h */, + ABD1FF7B1345ACFA00AF11D1 /* SndOut.h */, + ); + name = metaspu; + path = ../metaspu; + sourceTree = SOURCE_ROOT; + }; + ABD1FF7C1345ACFA00AF11D1 /* SoundTouch */ = { + isa = PBXGroup; + children = ( + ABAD3E5913AF1D6D00502E1E /* AAFilter.h */, + ABAD3E5A13AF1D6D00502E1E /* BPMDetect.h */, + ABAD3E5B13AF1D6D00502E1E /* cpu_detect.h */, + ABAD3E5C13AF1D6D00502E1E /* FIFOSampleBuffer.h */, + ABAD3E5D13AF1D6D00502E1E /* FIFOSamplePipe.h */, + ABAD3E5E13AF1D6D00502E1E /* FIRFilter.h */, + ABAD3E5F13AF1D6D00502E1E /* RateTransposer.h */, + ABAD3E6013AF1D6D00502E1E /* SoundTouch.h */, + ABAD3E6113AF1D6D00502E1E /* STTypes.h */, + ABAD3E6213AF1D6D00502E1E /* TDStretch.h */, + ABAD3E6313AF1D6D00502E1E /* WavFile.h */, + ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */, + ABAD3E6613AF1D6D00502E1E /* cpu_detect_x86_gcc.cpp */, + ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */, + ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */, + ABAD3E6A13AF1D6D00502E1E /* mmx_optimized.cpp */, + ABAD3E6B13AF1D6D00502E1E /* RateTransposer.cpp */, + ABAD3E6C13AF1D6D00502E1E /* SoundTouch.cpp */, + ABAD3E6D13AF1D6D00502E1E /* sse_optimized.cpp */, + ABAD3E6E13AF1D6D00502E1E /* TDStretch.cpp */, + ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */, + ); + path = SoundTouch; + sourceTree = ""; + }; + ABE670241415DE6C00E8E4C9 /* tinyxml */ = { + isa = PBXGroup; + children = ( + ABE670251415DE6C00E8E4C9 /* tinystr.cpp */, + ABE670261415DE6C00E8E4C9 /* tinystr.h */, + ABE670271415DE6C00E8E4C9 /* tinyxml.cpp */, + ABE670281415DE6C00E8E4C9 /* tinyxml.h */, + ABE670291415DE6C00E8E4C9 /* tinyxmlerror.cpp */, + ABE6702A1415DE6C00E8E4C9 /* tinyxmlparser.cpp */, + ); + path = tinyxml; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8D1107260486CEB800E47090 /* DeSmuME (v10.5 Leopard) */ = { + isa = PBXNativeTarget; + buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "DeSmuME (v10.5 Leopard)" */; + buildPhases = ( + AB75221714C79884009B97B3 /* ShellScript */, + 8D1107290486CEB800E47090 /* Resources */, + 8D11072C0486CEB800E47090 /* Sources */, + 8D11072E0486CEB800E47090 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "DeSmuME (v10.5 Leopard)"; + productInstallPath = "$(HOME)/Applications"; + productName = DeSmuME; + productReference = 8D1107320486CEB800E47090 /* DeSmuME (Debug).app */; + productType = "com.apple.product-type.application"; + }; + AB711EBD1481C35F009011C8 /* DeSmuME (v10.6 Snow Leopard) */ = { + isa = PBXNativeTarget; + buildConfigurationList = AB711F7C1481C35F009011C8 /* Build configuration list for PBXNativeTarget "DeSmuME (v10.6 Snow Leopard)" */; + buildPhases = ( + AB75222C14C799C1009B97B3 /* ShellScript */, + AB711EBE1481C35F009011C8 /* Resources */, + AB711EFF1481C35F009011C8 /* Sources */, + AB711F731481C35F009011C8 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "DeSmuME (v10.6 Snow Leopard)"; + productInstallPath = "$(HOME)/Applications"; + productName = DeSmuME; + productReference = AB711F7F1481C35F009011C8 /* DeSmuME (Debug).app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + attributes = { + ORGANIZATIONNAME = "DeSmuME Team"; + }; + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DeSmuME (XCode 3)" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + Italian, + Chinese, + Norwegian, + Romanian, + ); + mainGroup = 29B97314FDCFA39411CA2CEA /* DeSmuME */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8D1107260486CEB800E47090 /* DeSmuME (v10.5 Leopard) */, + AB711EBD1481C35F009011C8 /* DeSmuME (v10.6 Snow Leopard) */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D1107290486CEB800E47090 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AB02475C13886BF300E9F9AB /* KeyNames.plist in Resources */, + ABC719E2138CB25E002827A9 /* DefaultKeyMappings.plist in Resources */, + ABBC0F8D1394B1AA0028B6BD /* DefaultUserPrefs.plist in Resources */, + AB64987C13ECC73800EE7DD2 /* FileTypeInfo.plist in Resources */, + ABEFCF61141AB82A000CC0CD /* AppIcon_ROMSave.icns in Resources */, + ABEFCF62141AB82A000CC0CD /* AppIcon_DeSmuME.icns in Resources */, + ABEFCF63141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns in Resources */, + ABEFCF64141AB82A000CC0CD /* AppIcon_SaveState.icns in Resources */, + AB00E87B14205EAE00DE561F /* InfoPlist.strings in Resources */, + AB00E87E14205EBC00DE561F /* MainMenu.xib in Resources */, + AB901BDE1420706100348EEC /* Localizable.strings in Resources */, + ABB97876144E89CC00793FA3 /* Icon_ActionReplay_32x32.png in Resources */, + ABB97877144E89CC00793FA3 /* Icon_CodeBreaker_32x32.png in Resources */, + ABB97878144E89CC00793FA3 /* Icon_DeSmuME_32x32.png in Resources */, + AB350D3B147A1D93007165AC /* HID_usage_strings.plist in Resources */, + ABBF04A514B515F300E505A0 /* AppIcon_ROMCheats.icns in Resources */, + ABC3AF2F14B7F06900D5B13D /* Icon_VolumeFull_16x16.png in Resources */, + ABC3AF3014B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */, + ABC3AF3114B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */, + ABC3AF3214B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png in Resources */, + AB0F290214BE6E68009ABC6F /* Icon_Execute_420x420.png in Resources */, + AB0F290314BE6E68009ABC6F /* Icon_Pause_420x420.png in Resources */, + AB0F290414BE6E68009ABC6F /* Icon_Speed1x_420x420.png in Resources */, + AB0F290514BE6E68009ABC6F /* Icon_Speed2x_420x420.png in Resources */, + AB0F293814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png in Resources */, + AB0F293914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png in Resources */, + AB0F293A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png in Resources */, + AB0F293B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png in Resources */, + AB0F293C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png in Resources */, + AB0F293D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png in Resources */, + AB0F293E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png in Resources */, + AB0F293F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png in Resources */, + AB0F294014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png in Resources */, + AB0F294114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png in Resources */, + AB0F294214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png in Resources */, + AB0F294314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png in Resources */, + AB0F294414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png in Resources */, + AB0F294514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png in Resources */, + AB0F294614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png in Resources */, + AB0F294714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png in Resources */, + AB0F296D14BE705D009ABC6F /* Icon_ActionReplay_128x128.png in Resources */, + AB0F296E14BE705D009ABC6F /* Icon_CodeBreaker_128x128.png in Resources */, + AB0F297A14BE70BC009ABC6F /* VideoFilterPreview_64x64.png in Resources */, + AB0F298C14BE71E0009ABC6F /* Icon_ArrowDown_420x420.png in Resources */, + AB0F298D14BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png in Resources */, + AB0F298E14BE71E0009ABC6F /* Icon_ArrowRight_420x420.png in Resources */, + AB0F298F14BE71E0009ABC6F /* Icon_ArrowUp_420x420.png in Resources */, + AB0F29A614BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png in Resources */, + AB0F29A714BE7213009ABC6F /* Icon_DSButtonA_420x420.png in Resources */, + AB0F29A814BE7213009ABC6F /* Icon_DSButtonB_420x420.png in Resources */, + AB0F29A914BE7213009ABC6F /* Icon_DSButtonL_420x420.png in Resources */, + AB0F29AA14BE7213009ABC6F /* Icon_DSButtonR_420x420.png in Resources */, + AB0F29AB14BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png in Resources */, + AB0F29AC14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png in Resources */, + AB0F29AD14BE7213009ABC6F /* Icon_DSButtonX_420x420.png in Resources */, + AB0F29AE14BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */, + AB0F29AF14BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */, + AB0F29B014BE7213009ABC6F /* Icon_Input_420x420.png in Resources */, + AB0F29B114BE7213009ABC6F /* Icon_Microphone_420x420.png in Resources */, + AB0F29B214BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */, + AB0F29B314BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */, + AB0F29B414BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */, + AB0F29B514BE7213009ABC6F /* Icon_RotateCW_420x420.png in Resources */, + AB0F29B614BE7213009ABC6F /* Icon_ShowHUD_420x420.png in Resources */, + AB0F29B714BE7213009ABC6F /* Icon_Speaker_420x420.png in Resources */, + AB3ACC3E14C24D5400D7D192 /* AUTHORS in Resources */, + AB3ACC3F14C24D5400D7D192 /* ChangeLog in Resources */, + AB3ACC4014C24D5400D7D192 /* COPYING in Resources */, + AB3ACC4114C24D5400D7D192 /* README in Resources */, + AB3ACC4214C24D5400D7D192 /* README.TRANSLATION in Resources */, + AB3ACC4314C24D5400D7D192 /* README.MAC in Resources */, + AB75226E14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AB711EBE1481C35F009011C8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AB711ED21481C35F009011C8 /* KeyNames.plist in Resources */, + AB711ED31481C35F009011C8 /* DefaultKeyMappings.plist in Resources */, + AB711ED81481C35F009011C8 /* DefaultUserPrefs.plist in Resources */, + AB711EDE1481C35F009011C8 /* FileTypeInfo.plist in Resources */, + AB711EEF1481C35F009011C8 /* AppIcon_ROMSave.icns in Resources */, + AB711EF01481C35F009011C8 /* AppIcon_DeSmuME.icns in Resources */, + AB711EF11481C35F009011C8 /* AppIcon_NintendoDS_ROM.icns in Resources */, + AB711EF21481C35F009011C8 /* AppIcon_SaveState.icns in Resources */, + AB711EF31481C35F009011C8 /* InfoPlist.strings in Resources */, + AB711EF41481C35F009011C8 /* MainMenu.xib in Resources */, + AB711EF51481C35F009011C8 /* Localizable.strings in Resources */, + AB711EFB1481C35F009011C8 /* Icon_ActionReplay_32x32.png in Resources */, + AB711EFC1481C35F009011C8 /* Icon_CodeBreaker_32x32.png in Resources */, + AB711EFD1481C35F009011C8 /* Icon_DeSmuME_32x32.png in Resources */, + AB711EFE1481C35F009011C8 /* HID_usage_strings.plist in Resources */, + ABBF04A614B515F300E505A0 /* AppIcon_ROMCheats.icns in Resources */, + ABC3AF3314B7F06900D5B13D /* Icon_VolumeFull_16x16.png in Resources */, + ABC3AF3414B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */, + ABC3AF3514B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */, + ABC3AF3614B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png in Resources */, + AB0F290614BE6E68009ABC6F /* Icon_Execute_420x420.png in Resources */, + AB0F290714BE6E68009ABC6F /* Icon_Pause_420x420.png in Resources */, + AB0F290814BE6E68009ABC6F /* Icon_Speed1x_420x420.png in Resources */, + AB0F290914BE6E68009ABC6F /* Icon_Speed2x_420x420.png in Resources */, + AB0F294814BE6FA7009ABC6F /* ColorSwatch_Blue_16x16.png in Resources */, + AB0F294914BE6FA7009ABC6F /* ColorSwatch_Brown_16x16.png in Resources */, + AB0F294A14BE6FA7009ABC6F /* ColorSwatch_DarkBlue_16x16.png in Resources */, + AB0F294B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png in Resources */, + AB0F294C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png in Resources */, + AB0F294D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png in Resources */, + AB0F294E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png in Resources */, + AB0F294F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png in Resources */, + AB0F295014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png in Resources */, + AB0F295114BE6FA7009ABC6F /* ColorSwatch_Orange_16x16.png in Resources */, + AB0F295214BE6FA7009ABC6F /* ColorSwatch_Pink_16x16.png in Resources */, + AB0F295314BE6FA7009ABC6F /* ColorSwatch_Red_16x16.png in Resources */, + AB0F295414BE6FA7009ABC6F /* ColorSwatch_SeaGreen_16x16.png in Resources */, + AB0F295514BE6FA7009ABC6F /* ColorSwatch_Turquoise_16x16.png in Resources */, + AB0F295614BE6FA7009ABC6F /* ColorSwatch_Violet_16x16.png in Resources */, + AB0F295714BE6FA7009ABC6F /* ColorSwatch_Yellow_16x16.png in Resources */, + AB0F296F14BE705D009ABC6F /* Icon_ActionReplay_128x128.png in Resources */, + AB0F297014BE705D009ABC6F /* Icon_CodeBreaker_128x128.png in Resources */, + AB0F297B14BE70BC009ABC6F /* VideoFilterPreview_64x64.png in Resources */, + AB0F299014BE71E0009ABC6F /* Icon_ArrowDown_420x420.png in Resources */, + AB0F299114BE71E0009ABC6F /* Icon_ArrowLeft_420x420.png in Resources */, + AB0F299214BE71E0009ABC6F /* Icon_ArrowRight_420x420.png in Resources */, + AB0F299314BE71E0009ABC6F /* Icon_ArrowUp_420x420.png in Resources */, + AB0F29B814BE7213009ABC6F /* Icon_DoubleSpeed_420x420.png in Resources */, + AB0F29B914BE7213009ABC6F /* Icon_DSButtonA_420x420.png in Resources */, + AB0F29BA14BE7213009ABC6F /* Icon_DSButtonB_420x420.png in Resources */, + AB0F29BB14BE7213009ABC6F /* Icon_DSButtonL_420x420.png in Resources */, + AB0F29BC14BE7213009ABC6F /* Icon_DSButtonR_420x420.png in Resources */, + AB0F29BD14BE7213009ABC6F /* Icon_DSButtonSelect_420x420.png in Resources */, + AB0F29BE14BE7213009ABC6F /* Icon_DSButtonStart_420x420.png in Resources */, + AB0F29BF14BE7213009ABC6F /* Icon_DSButtonX_420x420.png in Resources */, + AB0F29C014BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */, + AB0F29C114BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */, + AB0F29C214BE7213009ABC6F /* Icon_Input_420x420.png in Resources */, + AB0F29C314BE7213009ABC6F /* Icon_Microphone_420x420.png in Resources */, + AB0F29C414BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */, + AB0F29C514BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */, + AB0F29C614BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */, + AB0F29C714BE7213009ABC6F /* Icon_RotateCW_420x420.png in Resources */, + AB0F29C814BE7213009ABC6F /* Icon_ShowHUD_420x420.png in Resources */, + AB0F29C914BE7213009ABC6F /* Icon_Speaker_420x420.png in Resources */, + AB3ACC4414C24D5400D7D192 /* AUTHORS in Resources */, + AB3ACC4514C24D5400D7D192 /* ChangeLog in Resources */, + AB3ACC4614C24D5400D7D192 /* COPYING in Resources */, + AB3ACC4714C24D5400D7D192 /* README in Resources */, + AB3ACC4814C24D5400D7D192 /* README.TRANSLATION in Resources */, + AB3ACC4914C24D5400D7D192 /* README.MAC in Resources */, + AB75226F14C7BB51009B97B3 /* AppIcon_FirmwareConfig.icns in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + AB75221714C79884009B97B3 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(SRCROOT)/translations/English.lproj/MainMenu.xib", + ); + outputPaths = ( + "$(SRCROOT)/translations/English.lproj/MainMenu.strings", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; + }; + AB75222C14C799C1009B97B3 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(SRCROOT)/translations/English.lproj/MainMenu.xib", + ); + outputPaths = ( + "$(SRCROOT)/translations/English.lproj/MainMenu.strings", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd \"./translations\"\nibtool --generate-strings-file \"./English.lproj/MainMenu.strings\" \"./English.lproj/MainMenu.xib\""; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8D11072C0486CEB800E47090 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ABD1FF531345ACBF00AF11D1 /* ConvertUTF.c in Sources */, + AB90211014234C8B00348EEC /* 2xsai.cpp in Sources */, + ABAD3E7113AF1D6D00502E1E /* AAFilter.cpp in Sources */, + ABD1FED01345AC8400AF11D1 /* addons.cpp in Sources */, + ABD1FED21345AC8400AF11D1 /* arm_instructions.cpp in Sources */, + ABD1FED31345AC8400AF11D1 /* armcpu.cpp in Sources */, + AB90211114234C8B00348EEC /* bilinear.cpp in Sources */, + ABD1FED41345AC8400AF11D1 /* bios.cpp in Sources */, + ABD1FF5B1345ACBF00AF11D1 /* cache.cpp in Sources */, + ABD1FED51345AC8400AF11D1 /* cheatSystem.cpp in Sources */, + ABD1FED71345AC8400AF11D1 /* common.cpp in Sources */, + ABD1FED81345AC8400AF11D1 /* cp15.cpp in Sources */, + AB15CA7214A29EE500B8A6A4 /* cpu_detect_x86_gcc.cpp in Sources */, + ABD1FF551345ACBF00AF11D1 /* crc.cpp in Sources */, + AB181D0013B66889006CA82D /* datetime.cpp in Sources */, + ABD1FEDA1345AC8400AF11D1 /* debug.cpp in Sources */, + ABD1FF561345ACBF00AF11D1 /* decrypt.cpp in Sources */, + ABD1FF5C1345ACBF00AF11D1 /* directory.cpp in Sources */, + ABD1FEDC1345AC8400AF11D1 /* Disassembler.cpp in Sources */, + ABD1FF5D1345ACBF00AF11D1 /* disc.cpp in Sources */, + ABD1FF581345ACBF00AF11D1 /* dlditool.cpp in Sources */, + ABD1FEDD1345AC8400AF11D1 /* driver.cpp in Sources */, + ABD1FF591345ACBF00AF11D1 /* emufat.cpp in Sources */, + ABD1FEDE1345AC8400AF11D1 /* emufile.cpp in Sources */, + AB90211214234C8B00348EEC /* epx.cpp in Sources */, + ABD1FF5E1345ACBF00AF11D1 /* fatdir.cpp in Sources */, + ABD1FF5F1345ACBF00AF11D1 /* fatfile.cpp in Sources */, + ABD1FEDF1345AC8400AF11D1 /* FIFO.cpp in Sources */, + ABAD3E7413AF1D6D00502E1E /* FIFOSampleBuffer.cpp in Sources */, + ABD1FF601345ACBF00AF11D1 /* file_allocation_table.cpp in Sources */, + ABD1FF611345ACBF00AF11D1 /* filetime.cpp in Sources */, + ABAD3E7513AF1D6D00502E1E /* FIRFilter.cpp in Sources */, + ABD1FEE01345AC8400AF11D1 /* firmware.cpp in Sources */, + AB91D46B13BD013800462471 /* fs-linux.cpp in Sources */, + ABD1FEE31345AC8400AF11D1 /* gfx3d.cpp in Sources */, + ABD1FEE61345AC8400AF11D1 /* GPU.cpp in Sources */, + ABD1FEE41345AC8400AF11D1 /* GPU_osd_stub.cpp in Sources */, + ABD1FF5A1345ACBF00AF11D1 /* guid.cpp in Sources */, + ABD1FF571345ACBF00AF11D1 /* header.cpp in Sources */, + AB90211314234C8B00348EEC /* hq2x.cpp in Sources */, + AB90211414234C8B00348EEC /* hq4x.cpp in Sources */, + ABD1FF621345ACBF00AF11D1 /* libfat.cpp in Sources */, + ABD1FF631345ACBF00AF11D1 /* libfat_public_api.cpp in Sources */, + ABD1FF641345ACBF00AF11D1 /* lock.cpp in Sources */, + AB90211614234C8B00348EEC /* lq2x.cpp in Sources */, + ABD1FEE81345AC8400AF11D1 /* matrix.cpp in Sources */, + ABD1FEE91345AC8400AF11D1 /* mc.cpp in Sources */, + ABD1FF661345ACBF00AF11D1 /* md5.cpp in Sources */, + ABD1FF9F1345ACFA00AF11D1 /* metaspu.cpp in Sources */, + ABD1FEED1345AC8400AF11D1 /* MMU.cpp in Sources */, + ABAD3E7613AF1D6D00502E1E /* mmx_optimized.cpp in Sources */, + ABD1FEEE1345AC8400AF11D1 /* movie.cpp in Sources */, + ABD1FEEF1345AC8400AF11D1 /* NDSSystem.cpp in Sources */, + ABD1FF651345ACBF00AF11D1 /* partition.cpp in Sources */, + ABD1FEF11345AC8400AF11D1 /* path.cpp in Sources */, + ABD1FEF21345AC8400AF11D1 /* rasterize.cpp in Sources */, + ABAD3E7713AF1D6D00502E1E /* RateTransposer.cpp in Sources */, + ABD1FEF31345AC8400AF11D1 /* readwrite.cpp in Sources */, + ABD1FEF41345AC8400AF11D1 /* render3D.cpp in Sources */, + ABD1FEF51345AC8400AF11D1 /* ROMReader.cpp in Sources */, + ABD1FEF61345AC8400AF11D1 /* rtc.cpp in Sources */, + ABD1FEF71345AC8400AF11D1 /* saves.cpp in Sources */, + AB90211714234C8B00348EEC /* scanline.cpp in Sources */, + ABD1FEF81345AC8400AF11D1 /* slot1.cpp in Sources */, + ABD1FF0B1345AC9C00AF11D1 /* slot1_none.cpp in Sources */, + ABD1FF0C1345AC9C00AF11D1 /* slot1_r4.cpp in Sources */, + ABD1FF0D1345AC9C00AF11D1 /* slot1_retail.cpp in Sources */, + AB6FBEF6139B6258007BB045 /* slot1_retail_nand.cpp in Sources */, + ABD1FF0E1345AC9C00AF11D1 /* slot2_expMemory.cpp in Sources */, + ABD1FF0F1345AC9C00AF11D1 /* slot2_gbagame.cpp in Sources */, + ABD1FF101345AC9C00AF11D1 /* slot2_guitarGrip.cpp in Sources */, + ABD1FF111345AC9C00AF11D1 /* slot2_mpcf.cpp in Sources */, + ABD1FF121345AC9C00AF11D1 /* slot2_none.cpp in Sources */, + ABD1FF131345AC9C00AF11D1 /* slot2_paddle.cpp in Sources */, + ABD1FF141345AC9C00AF11D1 /* slot2_piano.cpp in Sources */, + ABD1FF151345AC9C00AF11D1 /* slot2_rumblepak.cpp in Sources */, + ABD1041F1346652500AF11D1 /* sndOSX.cpp in Sources */, + AB1F468413A0ADE400B80DE6 /* SndOut.cpp in Sources */, + ABAD3E7813AF1D6D00502E1E /* SoundTouch.cpp in Sources */, + ABD1FEFA1345AC8400AF11D1 /* SPU.cpp in Sources */, + ABAD3E7913AF1D6D00502E1E /* sse_optimized.cpp in Sources */, + ABD1FF671345ACBF00AF11D1 /* task.cpp in Sources */, + ABAD3E7A13AF1D6D00502E1E /* TDStretch.cpp in Sources */, + ABD1FEFB1345AC8400AF11D1 /* texcache.cpp in Sources */, + ABD1FEFC1345AC8400AF11D1 /* thumb_instructions.cpp in Sources */, + AB1F469813A0AE2F00B80DE6 /* Timestretcher.cpp in Sources */, + ABE6702B1415DE6C00E8E4C9 /* tinystr.cpp in Sources */, + ABE6702C1415DE6C00E8E4C9 /* tinyxml.cpp in Sources */, + ABE6702D1415DE6C00E8E4C9 /* tinyxmlerror.cpp in Sources */, + ABE6702E1415DE6C00E8E4C9 /* tinyxmlparser.cpp in Sources */, + ABD1FEFD1345AC8400AF11D1 /* version.cpp in Sources */, + ABD1FF681345ACBF00AF11D1 /* vfat.cpp in Sources */, + ABE5DE95143F781900835AD8 /* videofilter.cpp in Sources */, + ABAD3E7B13AF1D6D00502E1E /* WavFile.cpp in Sources */, + ABD1FEFE1345AC8400AF11D1 /* wifi.cpp in Sources */, + ABD1FF691345ACBF00AF11D1 /* xstring.cpp in Sources */, + ABD104281346653B00AF11D1 /* main.m in Sources */, + ABA6574B14511EC90077E5E9 /* cocoa_cheat.mm in Sources */, + ABD1041D1346652500AF11D1 /* cocoa_core.mm in Sources */, + AB58F32D1364F44B0074C376 /* cocoa_file.mm in Sources */, + ABE7F53E13EE1C7900FD3A71 /* cocoa_firmware.mm in Sources */, + AB350B6A1478A5B3007165AC /* cocoa_hid.mm in Sources */, + ABD1041C1346652500AF11D1 /* cocoa_input.mm in Sources */, + ABD9A46513DB99B300777194 /* cocoa_mic.mm in Sources */, + AB3E34C9134AF4500056477A /* cocoa_output.mm in Sources */, + ABD1041E1346652500AF11D1 /* cocoa_rom.mm in Sources */, + AB80E04D142BC4A800A52038 /* cocoa_util.mm in Sources */, + ABE5DFE5143FB1DA00835AD8 /* cocoa_videofilter.mm in Sources */, + AB0F291D14BE6F4A009ABC6F /* OGLRender.cpp in Sources */, + AB3ACB7214C2361100D7D192 /* appDelegate.mm in Sources */, + AB3ACB7314C2361100D7D192 /* cheatWindowDelegate.mm in Sources */, + AB3ACB7414C2361100D7D192 /* displayView.mm in Sources */, + AB3ACB7514C2361100D7D192 /* emuWindowDelegate.mm in Sources */, + AB3ACB7614C2361100D7D192 /* inputPrefsView.mm in Sources */, + AB3ACB7714C2361100D7D192 /* preferencesWindowDelegate.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AB711EFF1481C35F009011C8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AB711F2D1481C35F009011C8 /* ConvertUTF.c in Sources */, + AB711F651481C35F009011C8 /* 2xsai.cpp in Sources */, + AB711F531481C35F009011C8 /* AAFilter.cpp in Sources */, + AB711F001481C35F009011C8 /* addons.cpp in Sources */, + AB711F011481C35F009011C8 /* arm_instructions.cpp in Sources */, + AB711F021481C35F009011C8 /* armcpu.cpp in Sources */, + AB711F661481C35F009011C8 /* bilinear.cpp in Sources */, + AB711F031481C35F009011C8 /* bios.cpp in Sources */, + AB711F341481C35F009011C8 /* cache.cpp in Sources */, + AB711F041481C35F009011C8 /* cheatSystem.cpp in Sources */, + AB711F051481C35F009011C8 /* common.cpp in Sources */, + AB711F061481C35F009011C8 /* cp15.cpp in Sources */, + AB711F711481C35F009011C8 /* cpu_detect_x86_gcc.cpp in Sources */, + AB711F2E1481C35F009011C8 /* crc.cpp in Sources */, + AB711F5C1481C35F009011C8 /* datetime.cpp in Sources */, + AB711F071481C35F009011C8 /* debug.cpp in Sources */, + AB711F2F1481C35F009011C8 /* decrypt.cpp in Sources */, + AB711F351481C35F009011C8 /* directory.cpp in Sources */, + AB711F081481C35F009011C8 /* Disassembler.cpp in Sources */, + AB711F361481C35F009011C8 /* disc.cpp in Sources */, + AB711F311481C35F009011C8 /* dlditool.cpp in Sources */, + AB711F091481C35F009011C8 /* driver.cpp in Sources */, + AB711F321481C35F009011C8 /* emufat.cpp in Sources */, + AB711F0A1481C35F009011C8 /* emufile.cpp in Sources */, + AB711F671481C35F009011C8 /* epx.cpp in Sources */, + AB711F371481C35F009011C8 /* fatdir.cpp in Sources */, + AB711F381481C35F009011C8 /* fatfile.cpp in Sources */, + AB711F0B1481C35F009011C8 /* FIFO.cpp in Sources */, + AB711F541481C35F009011C8 /* FIFOSampleBuffer.cpp in Sources */, + AB711F391481C35F009011C8 /* file_allocation_table.cpp in Sources */, + AB711F3A1481C35F009011C8 /* filetime.cpp in Sources */, + AB711F551481C35F009011C8 /* FIRFilter.cpp in Sources */, + AB711F0C1481C35F009011C8 /* firmware.cpp in Sources */, + AB711F5D1481C35F009011C8 /* fs-linux.cpp in Sources */, + AB711F0D1481C35F009011C8 /* gfx3d.cpp in Sources */, + AB711F0F1481C35F009011C8 /* GPU.cpp in Sources */, + AB711F0E1481C35F009011C8 /* GPU_osd_stub.cpp in Sources */, + AB711F331481C35F009011C8 /* guid.cpp in Sources */, + AB711F301481C35F009011C8 /* header.cpp in Sources */, + AB711F681481C35F009011C8 /* hq2x.cpp in Sources */, + AB711F691481C35F009011C8 /* hq4x.cpp in Sources */, + AB711F3B1481C35F009011C8 /* libfat.cpp in Sources */, + AB711F3C1481C35F009011C8 /* libfat_public_api.cpp in Sources */, + AB711F3D1481C35F009011C8 /* lock.cpp in Sources */, + AB711F6A1481C35F009011C8 /* lq2x.cpp in Sources */, + AB711F101481C35F009011C8 /* matrix.cpp in Sources */, + AB711F111481C35F009011C8 /* mc.cpp in Sources */, + AB711F3F1481C35F009011C8 /* md5.cpp in Sources */, + AB711F431481C35F009011C8 /* metaspu.cpp in Sources */, + AB711F121481C35F009011C8 /* MMU.cpp in Sources */, + AB711F561481C35F009011C8 /* mmx_optimized.cpp in Sources */, + AB711F131481C35F009011C8 /* movie.cpp in Sources */, + AB711F141481C35F009011C8 /* NDSSystem.cpp in Sources */, + AB711F5F1481C35F009011C8 /* OGLRender.cpp in Sources */, + AB711F3E1481C35F009011C8 /* partition.cpp in Sources */, + AB711F151481C35F009011C8 /* path.cpp in Sources */, + AB711F161481C35F009011C8 /* rasterize.cpp in Sources */, + AB711F571481C35F009011C8 /* RateTransposer.cpp in Sources */, + AB711F171481C35F009011C8 /* readwrite.cpp in Sources */, + AB711F181481C35F009011C8 /* render3D.cpp in Sources */, + AB711F191481C35F009011C8 /* ROMReader.cpp in Sources */, + AB711F1A1481C35F009011C8 /* rtc.cpp in Sources */, + AB711F1B1481C35F009011C8 /* saves.cpp in Sources */, + AB711F6B1481C35F009011C8 /* scanline.cpp in Sources */, + AB711F1C1481C35F009011C8 /* slot1.cpp in Sources */, + AB711F221481C35F009011C8 /* slot1_none.cpp in Sources */, + AB711F231481C35F009011C8 /* slot1_r4.cpp in Sources */, + AB711F241481C35F009011C8 /* slot1_retail.cpp in Sources */, + AB711F501481C35F009011C8 /* slot1_retail_nand.cpp in Sources */, + AB711F251481C35F009011C8 /* slot2_expMemory.cpp in Sources */, + AB711F261481C35F009011C8 /* slot2_gbagame.cpp in Sources */, + AB711F271481C35F009011C8 /* slot2_guitarGrip.cpp in Sources */, + AB711F281481C35F009011C8 /* slot2_mpcf.cpp in Sources */, + AB711F291481C35F009011C8 /* slot2_none.cpp in Sources */, + AB711F2A1481C35F009011C8 /* slot2_paddle.cpp in Sources */, + AB711F2B1481C35F009011C8 /* slot2_piano.cpp in Sources */, + AB711F2C1481C35F009011C8 /* slot2_rumblepak.cpp in Sources */, + AB711F491481C35F009011C8 /* sndOSX.cpp in Sources */, + AB711F511481C35F009011C8 /* SndOut.cpp in Sources */, + AB711F581481C35F009011C8 /* SoundTouch.cpp in Sources */, + AB711F1D1481C35F009011C8 /* SPU.cpp in Sources */, + AB711F591481C35F009011C8 /* sse_optimized.cpp in Sources */, + AB711F401481C35F009011C8 /* task.cpp in Sources */, + AB711F5A1481C35F009011C8 /* TDStretch.cpp in Sources */, + AB711F1E1481C35F009011C8 /* texcache.cpp in Sources */, + AB711F1F1481C35F009011C8 /* thumb_instructions.cpp in Sources */, + AB711F521481C35F009011C8 /* Timestretcher.cpp in Sources */, + AB711F611481C35F009011C8 /* tinystr.cpp in Sources */, + AB711F621481C35F009011C8 /* tinyxml.cpp in Sources */, + AB711F631481C35F009011C8 /* tinyxmlerror.cpp in Sources */, + AB711F641481C35F009011C8 /* tinyxmlparser.cpp in Sources */, + AB711F201481C35F009011C8 /* version.cpp in Sources */, + AB711F411481C35F009011C8 /* vfat.cpp in Sources */, + AB711F6D1481C35F009011C8 /* videofilter.cpp in Sources */, + AB711F5B1481C35F009011C8 /* WavFile.cpp in Sources */, + AB711F211481C35F009011C8 /* wifi.cpp in Sources */, + AB711F421481C35F009011C8 /* xstring.cpp in Sources */, + AB711F4A1481C35F009011C8 /* main.m in Sources */, + AB711F701481C35F009011C8 /* cocoa_cheat.mm in Sources */, + AB711F471481C35F009011C8 /* cocoa_core.mm in Sources */, + AB711F4E1481C35F009011C8 /* cocoa_file.mm in Sources */, + AB711F601481C35F009011C8 /* cocoa_firmware.mm in Sources */, + AB711F721481C35F009011C8 /* cocoa_hid.mm in Sources */, + AB711F461481C35F009011C8 /* cocoa_input.mm in Sources */, + AB711F5E1481C35F009011C8 /* cocoa_mic.mm in Sources */, + AB711F4C1481C35F009011C8 /* cocoa_output.mm in Sources */, + AB711F481481C35F009011C8 /* cocoa_rom.mm in Sources */, + AB711F6C1481C35F009011C8 /* cocoa_util.mm in Sources */, + AB711F6E1481C35F009011C8 /* cocoa_videofilter.mm in Sources */, + AB3ACB7814C2361100D7D192 /* appDelegate.mm in Sources */, + AB3ACB7914C2361100D7D192 /* cheatWindowDelegate.mm in Sources */, + AB3ACB7A14C2361100D7D192 /* displayView.mm in Sources */, + AB3ACB7B14C2361100D7D192 /* emuWindowDelegate.mm in Sources */, + AB3ACB7C14C2361100D7D192 /* inputPrefsView.mm in Sources */, + AB3ACB7D14C2361100D7D192 /* preferencesWindowDelegate.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + AB00E87914205EAE00DE561F /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + AB00E87A14205EAE00DE561F /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + AB00E87C14205EBC00DE561F /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + AB00E87D14205EBC00DE561F /* English */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; + AB350D3A147A1D93007165AC /* HID_usage_strings.plist */ = { + isa = PBXVariantGroup; + children = ( + AB350D38147A1D8D007165AC /* English */, + ); + name = HID_usage_strings.plist; + sourceTree = ""; + }; + AB901BDD1420706100348EEC /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + AB00E89114205ECC00DE561F /* English */, + AB901BE01420706F00348EEC /* French */, + AB901BE11420707400348EEC /* Italian */, + AB901BDF1420706B00348EEC /* Japanese */, + AB901BE21420707800348EEC /* Chinese */, + AB901BE31420707D00348EEC /* Norwegian */, + AB901BE41420708200348EEC /* Romanian */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + AB711F7D1481C35F009011C8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + i386, + x86_64, + ); + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + SDKROOT = macosx10.6; + VALID_ARCHS = "i386 x86_64"; + }; + name = Debug; + }; + AB711F7E1481C35F009011C8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + i386, + x86_64, + ); + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + SDKROOT = macosx10.6; + SKIP_INSTALL = NO; + STRIP_INSTALLED_PRODUCT = YES; + VALID_ARCHS = "i386 x86_64"; + }; + name = Release; + }; + C01FCF4B08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Debug; + }; + C01FCF4C08A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + SKIP_INSTALL = NO; + STRIP_INSTALLED_PRODUCT = YES; + }; + name = Release; + }; + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + i386, + x86_64, + ppc, + ppc64, + ); + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_ALTIVEC_EXTENSIONS = YES; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_FAST_OBJC_DISPATCH = NO; + GCC_MODEL_TUNING = ""; + "GCC_MODEL_TUNING[sdk=macosx10.4][arch=ppc]" = G4; + "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc64]" = G5; + "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc]" = G4; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = DeSmuME_Prefix.pch; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_THREADSAFE_STATICS = NO; + GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; + GCC_WARN_64_TO_32_BIT_CONVERSION = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_PROTOTYPE_CONVERSION = NO; + GCC_WARN_SHADOW = NO; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IBC_FLATTEN_NIBS = NO; + INFOPLIST_FILE = "Info (Debug).plist"; + ONLY_ACTIVE_ARCH = YES; + PREBINDING = NO; + PRODUCT_NAME = "DeSmuME (Debug)"; + SDKROOT = macosx10.5; + SKIP_INSTALL = YES; + STRIP_INSTALLED_PRODUCT = NO; + }; + name = Debug; + }; + C01FCF5008A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + i386, + x86_64, + ppc, + ppc64, + ); + ENABLE_OPENMP_SUPPORT = NO; + GCC_ALTIVEC_EXTENSIONS = YES; + GCC_AUTO_VECTORIZATION = YES; + GCC_DYNAMIC_NO_PIC = YES; + GCC_ENABLE_SSE3_EXTENSIONS = YES; + GCC_ENABLE_SSE41_EXTENSIONS = YES; + GCC_ENABLE_SSE42_EXTENSIONS = YES; + GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_INLINES_ARE_PRIVATE_EXTERN = YES; + GCC_MODEL_TUNING = ""; + "GCC_MODEL_TUNING[sdk=macosx10.4][arch=ppc]" = G4; + "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc64]" = G5; + "GCC_MODEL_TUNING[sdk=macosx10.5][arch=ppc]" = G4; + GCC_OPTIMIZATION_LEVEL = 3; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = DeSmuME_Prefix.pch; + GCC_STRICT_ALIASING = YES; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GCC_THREADSAFE_STATICS = NO; + GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; + GCC_UNROLL_LOOPS = YES; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + "GCC_VERSION[sdk=macosx10.5][arch=ppc64]" = 4.2; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_PROTOTYPE_CONVERSION = NO; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + LLVM_LTO = NO; + PREBINDING = NO; + PRODUCT_NAME = DeSmuME; + SDKROOT = macosx10.5; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + AB711F7C1481C35F009011C8 /* Build configuration list for PBXNativeTarget "DeSmuME (v10.6 Snow Leopard)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AB711F7D1481C35F009011C8 /* Debug */, + AB711F7E1481C35F009011C8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "DeSmuME (v10.5 Leopard)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4B08A954540054247B /* Debug */, + C01FCF4C08A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DeSmuME (XCode 3)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4F08A954540054247B /* Debug */, + C01FCF5008A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff --git a/desmume/src/cocoa/DefaultKeyMappings.plist b/desmume/src/cocoa/DefaultKeyMappings.plist new file mode 100644 index 000000000..ccf88347e --- /dev/null +++ b/desmume/src/cocoa/DefaultKeyMappings.plist @@ -0,0 +1,333 @@ + + + + + Up + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 126 + elementName + Up Arrow + + + Down + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 125 + elementName + Down Arrow + + + Left + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 123 + elementName + Left Arrow + + + Right + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 124 + elementName + Right Arrow + + + A + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 7 + elementName + X + + + B + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 6 + elementName + Z + + + X + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 1 + elementName + S + + + Y + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 0 + elementName + A + + + L + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 12 + elementName + Q + + + R + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 13 + elementName + W + + + Start + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 36 + elementName + Return + + + Select + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 48 + elementName + Tab + + + Touch + + + deviceCode + NSEventMouse + deviceName + Mouse + elementCode + 0 + elementName + Primary Button + useDeviceValues + + pointX + 0 + pointY + 0 + + + Microphone + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 50 + elementName + ` + + + Debug + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 42 + elementName + \ + + + Lid + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 51 + elementName + Delete (Backspace) + + + Speed Half + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 27 + elementName + - + floatValue + 0.5 + selector + toggleHoldSpeedHalf: + paramType + floatValue + + + Speed Double + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 24 + elementName + = + floatValue + 2 + selector + toggleHoldSpeedDouble: + paramType + floatValue + + + HUD + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 4 + elementName + H + selector + toggleHoldHUD + + + Execute + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 117 + elementName + Forward Delete + selector + execute + + + Pause + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 119 + elementName + End + selector + pause + + + Reset + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 121 + elementName + Page Down + selector + reset + + + Mute + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 71 + elementName + Numpad Clear + selector + mute + + + + diff --git a/desmume/src/cocoa/DefaultUserPrefs.plist b/desmume/src/cocoa/DefaultUserPrefs.plist new file mode 100644 index 000000000..153a83404 Binary files /dev/null and b/desmume/src/cocoa/DefaultUserPrefs.plist differ diff --git a/desmume/src/cocoa/Info (Debug).plist b/desmume/src/cocoa/Info (Debug).plist new file mode 100644 index 000000000..180fb9f25 --- /dev/null +++ b/desmume/src/cocoa/Info (Debug).plist @@ -0,0 +1,474 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + nds + + CFBundleTypeIconFile + AppIcon_NintendoDS_ROM.icns + CFBundleTypeName + Nintendo DS ROM + CFBundleTypeRole + Viewer + LSItemContentTypes + + com.nintendo.rom.ds + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + ds.gba + + CFBundleTypeIconFile + AppIcon_NintendoGBA_ROM.icns + CFBundleTypeName + Gameboy Advance ROM + CFBundleTypeRole + Viewer + LSItemContentTypes + + com.nintendo.rom.gba + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + dst + + CFBundleTypeIconFile + AppIcon_SaveState.icns + CFBundleTypeName + DeSmuME Save State + CFBundleTypeRole + Editor + LSItemContentTypes + + com.desmume.savestate + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + dsv + + CFBundleTypeIconFile + AppIcon_ROMSave.icns + CFBundleTypeName + DeSmuME ROM Save + CFBundleTypeRole + Editor + LSItemContentTypes + + com.desmume.romsave + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + dfc + + CFBundleTypeIconFile + AppIcon_FirmwareConfig.icns + CFBundleTypeName + DeSmuME Firmware Configuration + CFBundleTypeRole + Editor + LSItemContentTypes + + com.desmume.firmwareconfig + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + dct + + CFBundleTypeIconFile + AppIcon_ROMCheats.icns + CFBundleTypeName + DeSmuME ROM Cheats + CFBundleTypeRole + Editor + LSItemContentTypes + + com.desmume.romcheats + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + sav + + CFBundleTypeIconFile + AppIcon_NoGBA_ROMSave.icns + CFBundleTypeName + No$GBA ROM Save + CFBundleTypeRole + Viewer + LSItemContentTypes + + de.emubase.nocash.romsave.gba + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + duc + + CFBundleTypeIconFile + AppIcon_ActionReplaySave.icns + CFBundleTypeName + Action Replay Save + CFBundleTypeRole + Viewer + LSItemContentTypes + + com.codejunkies.actionreplay.save.nintendo.ds + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + bin + + CFBundleTypeIconFile + AppIcon_HWImage_NDS.icns + CFBundleTypeName + Nintendo DS Hardware Image + CFBundleTypeRole + Viewer + LSItemContentTypes + + com.nintendo.hwimage.ds + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + xml + + CFBundleTypeIconFile + AppIcon_ADVANsCEneDatabase.icns + CFBundleTypeName + ADVANsCEne Database + CFBundleTypeRole + Viewer + LSItemContentTypes + + com.advanscene.database.nintendo.ds + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + dat + + CFBundleTypeIconFile + AppIcon_R4CheatDatabase.icns + CFBundleTypeName + R4 Cheats Database + CFBundleTypeRole + Viewer + LSItemContentTypes + + net.gbatemp.cheats.database.nintendo.ds + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleExecutable + DeSmuME (Debug) + CFBundleIconFile + AppIcon_DeSmuME + CFBundleIdentifier + com.DeSmuME.DeSmuME + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + v0.9.8 (Debug) + CFBundleSignature + DSmM + CFBundleVersion + 0.9.8 + LSApplicationCategoryType + public.app-category.utilities + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright ©2012 DeSmuME Team. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + UTExportedTypeDeclarations + + + UTTypeConformsTo + + public.data + + UTTypeDescription + DeSmuME Save State + UTTypeIconFile + AppIcon_SaveState.icns + UTTypeIdentifier + com.desmume.savestate + UTTypeTagSpecification + + public.filename-extension + + dst + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + DeSmuME ROM Save + UTTypeIconFile + AppIcon_ROMSave.icns + UTTypeIdentifier + com.desmume.romsave + UTTypeTagSpecification + + public.filename-extension + + dsv + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + DeSmuME Firmware Configuration + UTTypeIconFile + AppIcon_FirmwareConfig.icns + UTTypeIdentifier + com.desmume.firmwareconfig + UTTypeTagSpecification + + public.filename-extension + + dfc + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + DeSmuME ROM Cheats + UTTypeIconFile + AppIcon_ROMCheats.icns + UTTypeIdentifier + com.desmume.romcheats + UTTypeTagSpecification + + public.filename-extension + + dct + + + + + UTImportedTypeDeclarations + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Nintendo DS ROM + UTTypeIconFile + AppIcon_NintendoDS_ROM.icns + UTTypeIdentifier + com.nintendo.rom.ds + UTTypeTagSpecification + + public.filename-extension + + nds + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Gameboy Advance ROM + UTTypeIconFile + AppIcon_NintendoGBA_ROM.icns + UTTypeIdentifier + com.nintendo.rom.gba + UTTypeTagSpecification + + public.filename-extension + + ds.gba + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + No$GBA ROM Save + UTTypeIconFile + AppIcon_NoGBA_ROMSave.icns + UTTypeIdentifier + de.emubase.nocash.romsave.gba + UTTypeTagSpecification + + public.filename-extension + + sav + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Action Replay Save + UTTypeIconFile + AppIcon_ActionReplaySave.icns + UTTypeIdentifier + com.codejunkies.actionreplay.save.nintendo.ds + UTTypeTagSpecification + + public.filename-extension + + duc + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Nintendo DS Hardware Image + UTTypeIconFile + AppIcon_HWImage_NDS.icns + UTTypeIdentifier + com.nintendo.hwimage.ds + UTTypeTagSpecification + + public.filename-extension + + bin + + + + + UTTypeConformsTo + + public.xml + + UTTypeDescription + ADVANsCEne Database + UTTypeIconFile + AppIcon_ADVANsCEneDatabase.icns + UTTypeIdentifier + com.advanscene.database.nintendo.ds + UTTypeTagSpecification + + public.filename-extension + + xml + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + R4 Cheats Database + UTTypeIconFile + AppIcon_R4CheatDatabase.icns + UTTypeIdentifier + net.gbatemp.cheats.database.nintendo.ds + UTTypeTagSpecification + + public.filename-extension + + dat + + + + + + diff --git a/desmume/src/cocoa/Info.plist b/desmume/src/cocoa/Info.plist new file mode 100644 index 000000000..75b43bd51 --- /dev/null +++ b/desmume/src/cocoa/Info.plist @@ -0,0 +1,474 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + nds + + CFBundleTypeIconFile + AppIcon_NintendoDS_ROM.icns + CFBundleTypeName + Nintendo DS ROM + CFBundleTypeRole + Viewer + LSItemContentTypes + + com.nintendo.rom.ds + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + ds.gba + + CFBundleTypeIconFile + AppIcon_NintendoGBA_ROM.icns + CFBundleTypeName + Gameboy Advance ROM + CFBundleTypeRole + Viewer + LSItemContentTypes + + com.nintendo.rom.gba + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + dst + + CFBundleTypeIconFile + AppIcon_SaveState.icns + CFBundleTypeName + DeSmuME Save State + CFBundleTypeRole + Editor + LSItemContentTypes + + com.desmume.savestate + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + dsv + + CFBundleTypeIconFile + AppIcon_ROMSave.icns + CFBundleTypeName + DeSmuME ROM Save + CFBundleTypeRole + Editor + LSItemContentTypes + + com.desmume.romsave + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + dfc + + CFBundleTypeIconFile + AppIcon_FirmwareConfig.icns + CFBundleTypeName + DeSmuME Firmware Configuration + CFBundleTypeRole + Editor + LSItemContentTypes + + com.desmume.firmwareconfig + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + dct + + CFBundleTypeIconFile + AppIcon_ROMCheats.icns + CFBundleTypeName + DeSmuME ROM Cheats + CFBundleTypeRole + Editor + LSItemContentTypes + + com.desmume.romcheats + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + sav + + CFBundleTypeIconFile + AppIcon_NoGBA_ROMSave.icns + CFBundleTypeName + No$GBA ROM Save + CFBundleTypeRole + Viewer + LSItemContentTypes + + de.emubase.nocash.romsave.gba + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + duc + + CFBundleTypeIconFile + AppIcon_ActionReplaySave.icns + CFBundleTypeName + Action Replay Save + CFBundleTypeRole + Viewer + LSItemContentTypes + + com.codejunkies.actionreplay.save.nintendo.ds + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + bin + + CFBundleTypeIconFile + AppIcon_HWImage_NDS.icns + CFBundleTypeName + Nintendo DS Hardware Image + CFBundleTypeRole + Viewer + LSItemContentTypes + + com.nintendo.hwimage.ds + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + xml + + CFBundleTypeIconFile + AppIcon_ADVANsCEneDatabase.icns + CFBundleTypeName + ADVANsCEne Database + CFBundleTypeRole + Viewer + LSItemContentTypes + + com.advanscene.database.nintendo.ds + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleTypeExtensions + + dat + + CFBundleTypeIconFile + AppIcon_R4CheatDatabase.icns + CFBundleTypeName + R4 Cheats Database + CFBundleTypeRole + Viewer + LSItemContentTypes + + net.gbatemp.cheats.database.nintendo.ds + + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary + + + CFBundleExecutable + DeSmuME + CFBundleIconFile + AppIcon_DeSmuME + CFBundleIdentifier + com.DeSmuME.DeSmuME + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + v0.9.8 + CFBundleSignature + DSmM + CFBundleVersion + 0.9.8 + LSApplicationCategoryType + public.app-category.utilities + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright ©2012 DeSmuME Team. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + UTExportedTypeDeclarations + + + UTTypeConformsTo + + public.data + + UTTypeDescription + DeSmuME Save State + UTTypeIconFile + AppIcon_SaveState.icns + UTTypeIdentifier + com.desmume.savestate + UTTypeTagSpecification + + public.filename-extension + + dst + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + DeSmuME ROM Save + UTTypeIconFile + AppIcon_ROMSave.icns + UTTypeIdentifier + com.desmume.romsave + UTTypeTagSpecification + + public.filename-extension + + dsv + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + DeSmuME Firmware Configuration + UTTypeIconFile + AppIcon_FirmwareConfig.icns + UTTypeIdentifier + com.desmume.firmwareconfig + UTTypeTagSpecification + + public.filename-extension + + dfc + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + DeSmuME ROM Cheats + UTTypeIconFile + AppIcon_ROMCheats.icns + UTTypeIdentifier + com.desmume.romcheats + UTTypeTagSpecification + + public.filename-extension + + dct + + + + + UTImportedTypeDeclarations + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Nintendo DS ROM + UTTypeIconFile + AppIcon_NintendoDS_ROM.icns + UTTypeIdentifier + com.nintendo.rom.ds + UTTypeTagSpecification + + public.filename-extension + + nds + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Gameboy Advance ROM + UTTypeIconFile + AppIcon_NintendoGBA_ROM.icns + UTTypeIdentifier + com.nintendo.rom.gba + UTTypeTagSpecification + + public.filename-extension + + ds.gba + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + No$GBA ROM Save + UTTypeIconFile + AppIcon_NoGBA_ROMSave.icns + UTTypeIdentifier + de.emubase.nocash.romsave.gba + UTTypeTagSpecification + + public.filename-extension + + sav + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Action Replay Save + UTTypeIconFile + AppIcon_ActionReplaySave.icns + UTTypeIdentifier + com.codejunkies.actionreplay.save.nintendo.ds + UTTypeTagSpecification + + public.filename-extension + + duc + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Nintendo DS Hardware Image + UTTypeIconFile + AppIcon_HWImage_NDS.icns + UTTypeIdentifier + com.nintendo.hwimage.ds + UTTypeTagSpecification + + public.filename-extension + + bin + + + + + UTTypeConformsTo + + public.xml + + UTTypeDescription + ADVANsCEne Database + UTTypeIconFile + AppIcon_ADVANsCEneDatabase.icns + UTTypeIdentifier + com.advanscene.database.nintendo.ds + UTTypeTagSpecification + + public.filename-extension + + xml + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + R4 Cheats Database + UTTypeIconFile + AppIcon_R4CheatDatabase.icns + UTTypeIdentifier + net.gbatemp.cheats.database.nintendo.ds + UTTypeTagSpecification + + public.filename-extension + + dat + + + + + + diff --git a/desmume/src/cocoa/KeyNames.plist b/desmume/src/cocoa/KeyNames.plist new file mode 100644 index 000000000..bde239430 --- /dev/null +++ b/desmume/src/cocoa/KeyNames.plist @@ -0,0 +1,202 @@ + + + + + 12 + Q + 13 + W + 14 + E + 15 + R + 17 + T + 16 + Y + 32 + U + 34 + I + 31 + O + 35 + P + 0 + A + 1 + S + 2 + D + 3 + F + 5 + G + 4 + H + 38 + J + 40 + K + 37 + L + 6 + Z + 7 + X + 8 + C + 9 + V + 11 + B + 45 + N + 46 + M + 18 + 1 + 19 + 2 + 20 + 3 + 21 + 4 + 23 + 5 + 22 + 6 + 26 + 7 + 28 + 8 + 25 + 9 + 29 + 0 + 122 + F1 + 120 + F2 + 99 + F3 + 118 + F4 + 96 + F5 + 97 + F6 + 98 + F7 + 100 + F8 + 101 + F9 + 109 + F10 + 103 + F11 + 111 + F12 + 105 + F13 + 107 + F14 + 113 + F15 + 106 + F16 + 64 + F17 + 79 + F18 + 80 + F19 + 50 + ` + 27 + - + 24 + = + 51 + Delete (Backspace) + 48 + Tab + 33 + [ + 30 + ] + 42 + \ + 41 + ; (Semicolon) + 39 + ' (Quote) + 36 + Return + 43 + , (Comma) + 47 + . (Period) + 44 + / + 49 + Space + 115 + Home + 119 + End + 116 + Page Up + 121 + Page Down + 117 + Forward Delete + 126 + Up Arrow + 125 + Down Arrow + 123 + Left Arrow + 124 + Right Arrow + 82 + NumPad 0 + 83 + NumPad 1 + 84 + NumPad 2 + 85 + NumPad 3 + 86 + NumPad 4 + 87 + NumPad 5 + 88 + NumPad 6 + 89 + NumPad 7 + 91 + NumPad 8 + 92 + NumPad 9 + 71 + NumPad Clear + 81 + NumPad = + 75 + NumPad / + 67 + NumPad * + 78 + NumPad - + 69 + NumPad + + 65 + NumPad . + 76 + NumPad Enter + 53 + Escape + + diff --git a/desmume/src/cocoa/cocoa_cheat.h b/desmume/src/cocoa/cocoa_cheat.h new file mode 100644 index 000000000..b0672e0c8 --- /dev/null +++ b/desmume/src/cocoa/cocoa_cheat.h @@ -0,0 +1,164 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import +#include "../cheatSystem.h" + +@class CocoaDSCore; + + +/******************************************************************************************** + CocoaDSCheatItem - OBJECTIVE-C CLASS + + This is an Objective-C wrapper class for DeSmuME's cheat item struct. + + The cheat item data is not freed upon release of this object. This is by design. + + Thread Safety: + Assume that all methods are not thread-safe. This was done for performance + reasons. The caller of this class' methods is expected to handle thread safety. + ********************************************************************************************/ +@interface CocoaDSCheatItem : NSObject +{ + CHEATS_LIST *data; + CHEATS_LIST *internalData; + BOOL willAdd; + pthread_mutex_t mutexData; + + CocoaDSCheatItem *workingCopy; + CocoaDSCheatItem *parent; +} + +@property (assign) CHEATS_LIST *data; +@property (assign) BOOL willAdd; +@property (assign, nonatomic) BOOL enabled; +@property (assign, nonatomic) NSInteger cheatType; +@property (assign, nonatomic) NSImage *cheatTypeIcon; +@property (assign, nonatomic) BOOL isSupportedCheatType; +@property (assign, nonatomic) NSInteger freezeType; +@property (assign, nonatomic) NSString *description; +@property (assign, nonatomic) NSUInteger codeCount; +@property (assign, nonatomic) NSString *code; +@property (assign, nonatomic) UInt8 bytes; +@property (assign, nonatomic) UInt32 memAddress; +@property (assign, nonatomic) NSString *memAddressString; +@property (assign, nonatomic) NSString *memAddressSixDigitString; +@property (assign, nonatomic) SInt64 value; +@property (readonly) CocoaDSCheatItem *workingCopy; +@property (assign) CocoaDSCheatItem *parent; + +- (id) initWithCheatData:(CHEATS_LIST *)cheatData; +- (BOOL) retainData; +- (char *) descriptionCString; +- (void) update; +- (CocoaDSCheatItem *) createWorkingCopy; +- (void) destroyWorkingCopy; +- (void) mergeFromWorkingCopy; +- (void) mergeToParent; +- (void) setDataWithDictionary:(NSDictionary *)dataDict; +- (NSDictionary *) dataDictionary; + +@end + +/******************************************************************************************** + CocoaDSCheatManager - OBJECTIVE-C CLASS + + This is an Objective-C wrapper class for DeSmuME's cheat list class. + + Thread Safety: + All methods are thread-safe. + ********************************************************************************************/ +@interface CocoaDSCheatManager : NSObject +{ + CHEATS *listData; + NSMutableArray *list; + + CocoaDSCore *cdsCore; + NSUInteger untitledCount; + NSString *dbTitle; + NSString *dbDate; +} + +@property (readonly) CHEATS *listData; +@property (readonly) NSMutableArray *list; +@property (assign) CocoaDSCore *cdsCore; +@property (assign) NSUInteger untitledCount; +@property (assign) NSString *dbTitle; +@property (assign) NSString *dbDate; + +- (id) initWithCore:(CocoaDSCore *)core; +- (id) initWithURL:(CocoaDSCore *)core fileURL:(NSURL *)fileURL; +- (id) initWithExistingList:(CocoaDSCore *)core listData:(CHEATS *)cheatList; +- (id) initWithURL:(CocoaDSCore *)core fileURL:(NSURL *)fileURL listData:(CHEATS *)cheatList; + +- (BOOL) add:(CocoaDSCheatItem *)cheatItem; +- (void) remove:(CocoaDSCheatItem *)cheatItem; +- (BOOL) update:(CocoaDSCheatItem *)cheatItem; +- (BOOL) save; +- (NSMutableArray *) cheatListFromDatabase:(NSURL *)fileURL errorCode:(NSInteger *)error; +- (void) applyInternalCheat:(CocoaDSCheatItem *)cheatItem; + ++ (void) setMasterCheatList:(CocoaDSCheatManager *)cheatListManager; ++ (void) applyInternalCheatWithItem:(CocoaDSCheatItem *)cheatItem; ++ (void) applyInternalCheatWithAddress:(UInt32)address value:(UInt32)value bytes:(NSUInteger)bytes; ++ (NSMutableArray *) cheatListWithListObject:(CHEATS *)cheatList; ++ (NSMutableArray *) cheatListWithItemStructArray:(CHEATS_LIST *)cheatItemArray count:(NSUInteger)itemCount; ++ (NSMutableDictionary *) cheatItemWithType:(NSInteger)cheatTypeID description:(NSString *)description; + +@end + +@interface CocoaDSCheatSearch : NSObject +{ + CHEATSEARCH *listData; + NSMutableArray *addressList; + + CocoaDSCore *cdsCore; + NSUInteger searchCount; +} + +@property (readonly) CHEATSEARCH *listData; +@property (readonly) NSMutableArray *addressList; +@property (assign) CocoaDSCore *cdsCore; +@property (readonly) NSUInteger searchCount; + +- (id) initWithCore:(CocoaDSCore *)core; + +- (NSUInteger) runExactValueSearch:(NSInteger)value byteSize:(UInt8)byteSize signType:(NSInteger)signType; +- (void) runExactValueSearchOnThread:(id)object; +- (NSUInteger) runComparativeSearch:(NSInteger)typeID byteSize:(UInt8)byteSize signType:(NSInteger)signType; +- (void) runComparativeSearchOnThread:(id)object; +- (void) reset; + ++ (NSMutableArray *) addressListWithListObject:(CHEATSEARCH *)addressList maxItems:(NSUInteger)maxItemCount; + +@end + +@interface CocoaDSCheatSearchParams : NSObject +{ + NSInteger comparativeSearchType; + NSInteger value; + UInt8 byteSize; + NSInteger signType; +} + +@property (assign) NSInteger comparativeSearchType; +@property (assign) NSInteger value; +@property (assign) UInt8 byteSize; +@property (assign) NSInteger signType; + +@end diff --git a/desmume/src/cocoa/cocoa_cheat.mm b/desmume/src/cocoa/cocoa_cheat.mm new file mode 100644 index 000000000..3b8f1b2b2 --- /dev/null +++ b/desmume/src/cocoa/cocoa_cheat.mm @@ -0,0 +1,1246 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "cocoa_cheat.h" +#import "cocoa_core.h" +#import "cocoa_globals.h" +#import "cocoa_util.h" + +#include "../MMU.h" + +@implementation CocoaDSCheatItem + +static NSImage *iconInternalCheat = nil; +static NSImage *iconActionReplay = nil; +static NSImage *iconCodeBreaker = nil; + +@dynamic data; +@synthesize willAdd; +@dynamic enabled; +@dynamic cheatType; +@dynamic cheatTypeIcon; +@dynamic isSupportedCheatType; +@dynamic freezeType; +@dynamic description; +@dynamic codeCount; +@dynamic code; +@dynamic memAddress; +@dynamic memAddressString; +@dynamic memAddressSixDigitString; +@dynamic bytes; +@dynamic value; +@synthesize workingCopy; +@synthesize parent; + +- (id) init +{ + return [self initWithCheatData:nil]; +} + +- (id) initWithCheatData:(CHEATS_LIST *)cheatData +{ + self = [super init]; + if(self == nil) + { + return self; + } + + if (cheatData == NULL) + { + // Allocate our own cheat item struct since we weren't provided with one. + internalData = (CHEATS_LIST *)malloc(sizeof(CHEATS_LIST)); + if (internalData == NULL) + { + [self release]; + return nil; + } + + data = internalData; + + self.enabled = NO; + self.cheatType = CHEAT_TYPE_INTERNAL; + self.freezeType = 0; + self.description = @""; + self.code = @""; + self.memAddress = 0x00000000; + self.bytes = 1; + self.value = 0; + } + else + { + internalData = NULL; + data = cheatData; + } + + if (iconInternalCheat == nil || iconActionReplay == nil || iconCodeBreaker == nil) + { + iconInternalCheat = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"AppIcon_DeSmuME" ofType:@"icns"]]; + iconActionReplay = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ActionReplay_128x128" ofType:@"png"]]; + iconCodeBreaker = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_CodeBreaker_128x128" ofType:@"png"]]; + } + + pthread_mutex_init(&mutexData, NULL); + + willAdd = NO; + workingCopy = nil; + parent = nil; + + return self; +} + +- (void) dealloc +{ + [workingCopy release]; + workingCopy = nil; + + free(internalData); + internalData = NULL; + + pthread_mutex_destroy(&mutexData); + + [super dealloc]; +} + +- (CHEATS_LIST *) data +{ + pthread_mutex_lock(&mutexData); + CHEATS_LIST *returnData = data; + pthread_mutex_unlock(&mutexData); + + return returnData; +} + +- (void) setData:(CHEATS_LIST *)cheatData +{ + if (cheatData == NULL) + { + return; + } + + pthread_mutex_lock(&mutexData); + + data = cheatData; + + pthread_mutex_unlock(&mutexData); + + [self update]; + + if (workingCopy != nil) + { + pthread_mutex_lock(&mutexData); + + CHEATS_LIST *thisData = data; + CHEATS_LIST *workingData = workingCopy.data; + *workingData = *thisData; + + pthread_mutex_unlock(&mutexData); + + [workingCopy update]; + } +} + +- (BOOL) retainData +{ + BOOL result = YES; + + if (internalData == NULL) + { + internalData = (CHEATS_LIST *)malloc(sizeof(CHEATS_LIST)); + if (internalData == NULL) + { + result = NO; + return result; + } + } + + pthread_mutex_lock(&mutexData); + *internalData = *data; + data = internalData; + pthread_mutex_unlock(&mutexData); + + return result; +} + +- (BOOL) enabled +{ + return data->enabled; +} + +- (void) setEnabled:(BOOL)theState +{ + data->enabled = theState; + + if (workingCopy != nil) + { + workingCopy.enabled = theState; + } +} + +- (NSString *) description +{ + return [NSString stringWithCString:(const char *)&data->description[0] encoding:NSUTF8StringEncoding]; +} + +- (void) setDescription:(NSString *)desc +{ + if (desc == nil) + { + memset(&data->description[0], 0, sizeof(data->description)); + } + else + { + [desc getCString:&data->description[0] maxLength:sizeof(data->description) encoding:NSUTF8StringEncoding]; + } + + if (workingCopy != nil) + { + workingCopy.description = desc; + } +} + +- (char *) descriptionCString +{ + return &data->description[0]; +} + +- (NSInteger) cheatType +{ + return (NSInteger)data->type; +} + +- (void) setCheatType:(NSInteger)theType +{ + data->type = (u8)theType; + + switch (theType) + { + case CHEAT_TYPE_INTERNAL: + self.cheatTypeIcon = iconInternalCheat; + self.isSupportedCheatType = YES; + break; + + case CHEAT_TYPE_ACTION_REPLAY: + self.cheatTypeIcon = iconActionReplay; + self.isSupportedCheatType = YES; + break; + + case CHEAT_TYPE_CODE_BREAKER: + self.cheatTypeIcon = iconCodeBreaker; + self.isSupportedCheatType = NO; + break; + + default: + break; + } + + if (workingCopy != nil) + { + workingCopy.cheatType = theType; + } +} + +- (void) setCheatTypeIcon:(NSImage *)theIcon +{ + // Do nothing. This method exists for KVO compliance only. +} + +- (NSImage *) cheatTypeIcon +{ + NSImage *theIcon = nil; + + switch (self.cheatType) + { + case CHEAT_TYPE_INTERNAL: + theIcon = iconInternalCheat; + break; + + case CHEAT_TYPE_ACTION_REPLAY: + theIcon = iconActionReplay; + break; + + case CHEAT_TYPE_CODE_BREAKER: + theIcon = iconCodeBreaker; + break; + + default: + break; + } + + return theIcon; +} + +- (BOOL) isSupportedCheatType +{ + BOOL isSupported = YES; + + switch (self.cheatType) + { + case CHEAT_TYPE_INTERNAL: + case CHEAT_TYPE_ACTION_REPLAY: + isSupported = YES; + break; + + case CHEAT_TYPE_CODE_BREAKER: + isSupported = NO; + break; + + default: + break; + } + + return isSupported; +} + +- (void) setIsSupportedCheatType:(BOOL)isSupported +{ + // Do nothing. This method exists for KVO compliance only. +} + +- (NSInteger) freezeType +{ + return (NSInteger)data->freezeType; +} + +- (void) setFreezeType:(NSInteger)theType +{ + data->freezeType = (u8)theType; + + if (workingCopy != nil) + { + workingCopy.freezeType = theType; + } +} + +- (UInt8) bytes +{ + return (UInt8)(data->size + 1); +} + +- (void) setBytes:(UInt8)byteSize +{ + data->size = (u8)(byteSize - 1); + + if (workingCopy != nil) + { + workingCopy.bytes = byteSize; + } +} + +- (NSUInteger) codeCount +{ + return (NSUInteger)data->num; +} + +- (void) setCodeCount:(NSUInteger)count +{ + // Do nothing. This method exists for KVO compliance only. +} + +- (NSString *) code +{ + NSString *codeLine = @""; + NSString *cheatCodes = @""; + + NSUInteger numberCodes = self.codeCount; + if (numberCodes > MAX_XX_CODE) + { + return nil; + } + + for (NSUInteger i = 0; i < numberCodes; i++) + { + codeLine = [NSString stringWithFormat:@"%08X %08X\n", data->code[i][0], data->code[i][1]]; + cheatCodes = [cheatCodes stringByAppendingString:codeLine]; + } + + return cheatCodes; +} + +- (void) setCode:(NSString *)theCode +{ + if (theCode == nil) + { + return; + } + + size_t codeCStringSize = MAX_XX_CODE * 10 * 2 * sizeof(char); + char *codeCString = (char *)calloc(codeCStringSize, 1); + [theCode getCString:codeCString maxLength:codeCStringSize encoding:NSUTF8StringEncoding]; + + CHEATS::XXCodeFromString(data, codeCString); + + free(codeCString); + codeCString = NULL; + + self.codeCount = self.codeCount; + self.bytes = self.bytes; + + if (workingCopy != nil) + { + workingCopy.code = theCode; + } +} + +- (UInt32) memAddress +{ + if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type + { + return 0; + } + + return (data->code[0][0] | 0x02000000); +} + +- (void) setMemAddress:(UInt32)theAddress +{ + if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type + { + return; + } + + theAddress &= 0x00FFFFFF; + theAddress |= 0x02000000; + data->code[0][0] = theAddress; + + if (workingCopy != nil) + { + workingCopy.memAddress = theAddress; + } +} + +- (NSString *) memAddressString +{ + return [NSString stringWithFormat:@"0x%08X", self.memAddress]; +} + +- (void) setMemAddressString:(NSString *)addressString +{ + if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type + { + return; + } + + u32 address = 0x00000000; + [[NSScanner scannerWithString:addressString] scanHexInt:&address]; + self.memAddress = address; + + if (workingCopy != nil) + { + workingCopy.memAddressString = addressString; + } +} + +- (NSString *) memAddressSixDigitString +{ + return [NSString stringWithFormat:@"%06X", (self.memAddress & 0x00FFFFFF)]; +} + +- (void) setMemAddressSixDigitString:(NSString *)addressString +{ + self.memAddressString = addressString; +} + +- (SInt64) value +{ + if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type + { + return 0; + } + + return (data->code[0][1]); +} + +- (void) setValue:(SInt64)theValue +{ + if (self.cheatType != CHEAT_TYPE_INTERNAL) // Needs to be the Internal Cheat type + { + return; + } + + data->code[0][1] = (u32)theValue; + + if (workingCopy != nil) + { + workingCopy.value = theValue; + } +} + +- (void) update +{ + self.enabled = self.enabled; + self.description = self.description; + self.cheatType = self.cheatType; + self.freezeType = self.freezeType; + self.code = self.code; + self.bytes = self.bytes; + self.memAddress = self.memAddress; + self.value = self.value; +} + +- (CocoaDSCheatItem *) createWorkingCopy +{ + CocoaDSCheatItem *newWorkingCopy = nil; + + if (workingCopy != nil) + { + [workingCopy release]; + } + + newWorkingCopy = [[CocoaDSCheatItem alloc] initWithCheatData:self.data]; + [newWorkingCopy retainData]; + newWorkingCopy.parent = self; + workingCopy = newWorkingCopy; + + return newWorkingCopy; +} + +- (void) destroyWorkingCopy +{ + [workingCopy release]; + workingCopy = nil; +} + +- (void) mergeFromWorkingCopy +{ + if (workingCopy == nil) + { + return; + } + + CHEATS_LIST *thisData = self.data; + CHEATS_LIST *workingData = workingCopy.data; + + pthread_mutex_lock(&mutexData); + *thisData = *workingData; + pthread_mutex_unlock(&mutexData); + + [self update]; +} + +- (void) mergeToParent +{ + if (parent == nil) + { + return; + } + + CHEATS_LIST *thisData = self.data; + CHEATS_LIST *parentData = parent.data; + + pthread_mutex_lock(&mutexData); + *parentData = *thisData; + pthread_mutex_unlock(&mutexData); + + [parent update]; +} + +- (void) setDataWithDictionary:(NSDictionary *)dataDict +{ + if (dataDict == nil) + { + return; + } + + NSNumber *enabledNumber = (NSNumber *)[dataDict valueForKey:@"enabled"]; + if (enabledNumber != nil) + { + self.enabled = [enabledNumber boolValue]; + } + + NSString *descriptionString = (NSString *)[dataDict valueForKey:@"description"]; + if (descriptionString != nil) + { + self.description = descriptionString; + } + + NSNumber *freezeTypeNumber = (NSNumber *)[dataDict valueForKey:@"freezeType"]; + if (freezeTypeNumber != nil) + { + self.freezeType = [freezeTypeNumber integerValue]; + } + + NSNumber *cheatTypeNumber = (NSNumber *)[dataDict valueForKey:@"cheatType"]; + if (cheatTypeNumber != nil) + { + self.cheatType = [cheatTypeNumber integerValue]; + } + + if (self.cheatType == CHEAT_TYPE_INTERNAL) + { + NSNumber *bytesNumber = (NSNumber *)[dataDict valueForKey:@"bytes"]; + if (bytesNumber != nil) + { + self.bytes = [bytesNumber unsignedIntegerValue]; + } + + NSNumber *memAddressNumber = (NSNumber *)[dataDict valueForKey:@"memAddress"]; + if (memAddressNumber != nil) + { + self.memAddress = [memAddressNumber unsignedIntegerValue]; + } + + NSNumber *valueNumber = (NSNumber *)[dataDict valueForKey:@"value"]; + if (valueNumber != nil) + { + self.value = [valueNumber integerValue]; + } + } + else + { + NSString *codeString = (NSString *)[dataDict valueForKey:@"code"]; + if (codeString != nil) + { + self.code = codeString; + } + } +} + +- (NSDictionary *) dataDictionary +{ + return [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:self.enabled], @"enabled", + [NSNumber numberWithInteger:self.cheatType], @"cheatType", + self.description, @"description", + [NSNumber numberWithInteger:self.freezeType], @"freezeType", + [NSNumber numberWithUnsignedInteger:self.codeCount], @"codeCount", + [NSNumber numberWithUnsignedInteger:self.bytes], @"bytes", + self.memAddress, @"memAddress", + self.memAddressString, @"memAddressString", + [NSNumber numberWithInteger:self.value], @"value", + self.code, @"code", + [NSNumber numberWithBool:self.isSupportedCheatType], @"isSupportedCheatType", + nil]; +} + +@end + + +@implementation CocoaDSCheatManager + +@synthesize listData; +@synthesize list; +@synthesize cdsCore; +@synthesize untitledCount; +@synthesize dbTitle; +@synthesize dbDate; + +- (id)init +{ + return [self initWithURL:nil fileURL:nil listData:nil]; +} + +- (id) initWithCore:(CocoaDSCore *)core +{ + return [self initWithURL:core fileURL:nil listData:nil]; +} + +- (id) initWithURL:(CocoaDSCore *)core fileURL:(NSURL *)fileURL +{ + return [self initWithURL:core fileURL:fileURL listData:nil]; +} + +- (id) initWithExistingList:(CocoaDSCore *)core listData:(CHEATS *)cheatList +{ + return [self initWithURL:core fileURL:nil listData:cheatList]; +} + +- (id) initWithURL:(CocoaDSCore *)core fileURL:(NSURL *)fileURL listData:(CHEATS *)cheatList +{ + self = [super init]; + if(self == nil) + { + return self; + } + + if (cheatList == nil) + { + CHEATS *newListData = new CHEATS(); + if (newListData == nil) + { + [self release]; + return nil; + } + + listData = newListData; + } + else + { + listData = cheatList; + } + + if (fileURL != nil) + { + listData->init((char *)[[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding]); + list = [[CocoaDSCheatManager cheatListWithListObject:listData] retain]; + } + else + { + list = [[NSMutableArray alloc] initWithCapacity:100]; + if (list == nil) + { + delete listData; + [self release]; + return nil; + } + } + + cdsCore = core; + untitledCount = 0; + dbTitle = nil; + dbDate = nil; + + return self; +} + +- (void)dealloc +{ + [self.list release]; + delete self.listData; + [super dealloc]; +} + +- (BOOL) add:(CocoaDSCheatItem *)cheatItem +{ + BOOL result = NO; + + if (cheatItem == nil) + { + return result; + } + + // Get the current pointer to the raw cheat list data. We will need it later + // to check if the list got reallocated. + CHEATS_LIST *cheatListData = self.listData->getListPtr(); + + pthread_mutex_lock(self.cdsCore.mutexCoreExecute); + + switch (cheatItem.cheatType) + { + case CHEAT_TYPE_INTERNAL: + result = self.listData->add(cheatItem.bytes - 1, cheatItem.memAddress, cheatItem.value, [cheatItem descriptionCString], cheatItem.enabled); + break; + + case CHEAT_TYPE_ACTION_REPLAY: + { + char *cheatCodes = (char *)[cheatItem.code cStringUsingEncoding:NSUTF8StringEncoding]; + if (cheatCodes != nil) + { + result = self.listData->add_AR(cheatCodes, [cheatItem descriptionCString], cheatItem.enabled); + } + break; + } + + case CHEAT_TYPE_CODE_BREAKER: + { + char *cheatCodes = (char *)[cheatItem.code cStringUsingEncoding:NSUTF8StringEncoding]; + if (cheatCodes != nil) + { + result = self.listData->add_CB(cheatCodes, [cheatItem descriptionCString], cheatItem.enabled); + } + break; + } + + default: + break; + } + + pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); + + if (![self.list containsObject:cheatItem]) + { + [self.list addObject:cheatItem]; + } + + // Adding a new item may cause the raw list data to get reallocated, which + // will break the data pointers. So check for reallocation, and if it occurs, + // reset the data pointers for each item. + if (cheatListData != self.listData->getListPtr()) + { + NSUInteger listCount = self.listData->getSize(); + for (NSUInteger i = 0; i < listCount; i++) + { + CocoaDSCheatItem *itemInList = (CocoaDSCheatItem *)[self.list objectAtIndex:i]; + itemInList.data = self.listData->getItemByIndex(i); + } + } + else + { + cheatItem.data = self.listData->getItemByIndex(self.listData->getSize() - 1); + } + + return result; +} + +- (void) remove:(CocoaDSCheatItem *)cheatItem +{ + if (cheatItem == nil) + { + return; + } + + NSUInteger selectionIndex = [self.list indexOfObject:cheatItem]; + if (selectionIndex == NSNotFound) + { + return; + } + + pthread_mutex_lock(self.cdsCore.mutexCoreExecute); + self.listData->remove(selectionIndex); + pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); + + // Removing an item from the raw cheat list data shifts all higher elements + // by one, so we need to do the same. + NSUInteger listCount = self.listData->getSize(); + for (NSUInteger i = selectionIndex; i < listCount; i++) + { + [(CocoaDSCheatItem *)[self.list objectAtIndex:(i + 1)] setData:self.listData->getItemByIndex(i)]; + } + + cheatItem.data = nil; + [self.list removeObject:cheatItem]; +} + +- (BOOL) update:(CocoaDSCheatItem *)cheatItem +{ + BOOL result = NO; + + if (cheatItem == nil) + { + return result; + } + + NSUInteger selectionIndex = [self.list indexOfObject:cheatItem]; + if (selectionIndex == NSNotFound) + { + return result; + } + + pthread_mutex_lock(self.cdsCore.mutexCoreExecute); + + switch (cheatItem.cheatType) + { + case CHEAT_TYPE_INTERNAL: + result = self.listData->update(cheatItem.bytes - 1, cheatItem.memAddress, cheatItem.value, [cheatItem descriptionCString], cheatItem.enabled, selectionIndex); + break; + + case CHEAT_TYPE_ACTION_REPLAY: + { + char *cheatCodes = (char *)[cheatItem.code cStringUsingEncoding:NSUTF8StringEncoding]; + if (cheatCodes != nil) + { + result = self.listData->update_AR(cheatCodes, [cheatItem descriptionCString], cheatItem.enabled, selectionIndex); + } + break; + } + + case CHEAT_TYPE_CODE_BREAKER: + { + char *cheatCodes = (char *)[cheatItem.code cStringUsingEncoding:NSUTF8StringEncoding]; + if (cheatCodes != nil) + { + result = self.listData->update_CB(cheatCodes, [cheatItem descriptionCString], cheatItem.enabled, selectionIndex); + } + break; + } + + default: + break; + } + + pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); + + [cheatItem update]; + + return result; +} + +- (BOOL) save +{ + pthread_mutex_lock(self.cdsCore.mutexCoreExecute); + BOOL result = self.listData->save(); + pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); + + return result; +} + +- (NSMutableArray *) cheatListFromDatabase:(NSURL *)fileURL errorCode:(NSInteger *)error +{ + NSMutableArray *newDBList = nil; + + if (fileURL == nil) + { + return newDBList; + } + + CHEATSEXPORT *exporter = new CHEATSEXPORT(); + + BOOL result = exporter->load((char *)[[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding]); + if (!result) + { + if (error != nil) + { + *error = exporter->getErrorCode(); + } + } + else + { + self.dbTitle = [NSString stringWithCString:(const char *)exporter->gametitle encoding:NSUTF8StringEncoding]; + self.dbDate = [NSString stringWithCString:(const char *)exporter->date encoding:NSUTF8StringEncoding]; + newDBList = [CocoaDSCheatManager cheatListWithItemStructArray:exporter->getCheats() count:exporter->getCheatsNum()]; + if (newDBList != nil) + { + for (CocoaDSCheatItem *cheatItem in newDBList) + { + cheatItem.willAdd = NO; + [cheatItem retainData]; + } + } + } + + delete exporter; + exporter = nil; + + return newDBList; +} + +- (void) applyInternalCheat:(CocoaDSCheatItem *)cheatItem +{ + if (cheatItem == nil) + { + return; + } + + pthread_mutex_lock(self.cdsCore.mutexCoreExecute); + [CocoaDSCheatManager applyInternalCheatWithItem:cheatItem]; + pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); +} + ++ (void) setMasterCheatList:(CocoaDSCheatManager *)cheatListManager +{ + cheats = cheatListManager.listData; +} + ++ (void) applyInternalCheatWithItem:(CocoaDSCheatItem *)cheatItem +{ + [CocoaDSCheatManager applyInternalCheatWithAddress:cheatItem.memAddress value:cheatItem.value bytes:cheatItem.bytes]; +} + ++ (void) applyInternalCheatWithAddress:(UInt32)address value:(UInt32)value bytes:(NSUInteger)bytes +{ + address &= 0x00FFFFFF; + address |= 0x02000000; + + switch (bytes) + { + case 1: + { + u8 oneByteValue = (u8)(value & 0x000000FF); + _MMU_write08(address, oneByteValue); + break; + } + + case 2: + { + u16 twoByteValue = (u16)(value & 0x0000FFFF); + _MMU_write16(address, twoByteValue); + break; + } + + case 3: + { + u32 threeByteWithExtraValue = _MMU_read32(address); + threeByteWithExtraValue &= 0xFF000000; + threeByteWithExtraValue |= (value & 0x00FFFFFF); + _MMU_write32(address, threeByteWithExtraValue); + break; + } + + case 4: + _MMU_write32(address, value); + break; + + default: + break; + } +} + ++ (NSMutableArray *) cheatListWithListObject:(CHEATS *)cheatList +{ + if (cheatList == nil) + { + return nil; + } + + NSMutableArray *newList = [NSMutableArray arrayWithCapacity:100]; + if (newList == nil) + { + return newList; + } + + u32 itemCount = cheatList->getSize(); + for (u32 i = 0; i < itemCount; i++) + { + [newList addObject:[[[CocoaDSCheatItem alloc] initWithCheatData:cheatList->getItemByIndex(i)] autorelease]]; + } + + return newList; +} + ++ (NSMutableArray *) cheatListWithItemStructArray:(CHEATS_LIST *)cheatItemArray count:(NSUInteger)itemCount +{ + if (cheatItemArray == nil) + { + return nil; + } + + NSMutableArray *newList = [NSMutableArray arrayWithCapacity:100]; + if (newList == nil) + { + return newList; + } + + for (NSUInteger i = 0; i < itemCount; i++) + { + [newList addObject:[[[CocoaDSCheatItem alloc] initWithCheatData:cheatItemArray + i] autorelease]]; + } + + return newList; +} + ++ (NSMutableDictionary *) cheatItemWithType:(NSInteger)cheatTypeID description:(NSString *)description +{ + BOOL isSupported = YES; + + if (cheatTypeID == CHEAT_TYPE_CODE_BREAKER) + { + isSupported = NO; + } + + return [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:NO], @"enabled", + [NSNumber numberWithInteger:cheatTypeID], @"cheatType", + description, @"description", + [NSNumber numberWithInteger:0], @"freezeType", + [NSNumber numberWithUnsignedInteger:0], @"codeCount", + [NSNumber numberWithUnsignedInteger:4], @"bytes", + [NSNumber numberWithInteger:0], @"memAddress", + @"0x00000000", @"memAddressString", + [NSNumber numberWithInteger:0], @"value", + @"", @"code", + [NSNumber numberWithBool:isSupported], @"isSupportedCheatType", + nil]; +} + +@end + +@implementation CocoaDSCheatSearch + +@synthesize listData; +@synthesize addressList; +@synthesize cdsCore; +@synthesize searchCount; + +- (id)init +{ + return [self initWithCore:nil]; +} + +- (id) initWithCore:(CocoaDSCore *)core +{ + self = [super init]; + if(self == nil) + { + return self; + } + + CHEATSEARCH *newListData = new CHEATSEARCH(); + if (newListData == nil) + { + [self release]; + return nil; + } + + listData = newListData; + addressList = nil; + cdsCore = core; + searchCount = 0; + + return self; +} + +- (void)dealloc +{ + [self reset]; + delete self.listData; + [super dealloc]; +} + +- (NSUInteger) runExactValueSearch:(NSInteger)value byteSize:(UInt8)byteSize signType:(NSInteger)signType +{ + NSUInteger itemCount = 0; + BOOL listExists = YES; + + if (searchCount == 0) + { + byteSize--; + + pthread_mutex_lock(self.cdsCore.mutexCoreExecute); + listExists = (NSUInteger)self.listData->start((u8)CHEATSEARCH_SEARCHSTYLE_EXACT_VALUE, (u8)byteSize, (u8)signType); + pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); + } + + if (listExists) + { + pthread_mutex_lock(self.cdsCore.mutexCoreExecute); + itemCount = (NSUInteger)self.listData->search((u32)value); + NSMutableArray *newAddressList = [[CocoaDSCheatSearch addressListWithListObject:self.listData maxItems:100] retain]; + pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); + + [addressList release]; + addressList = newAddressList; + searchCount++; + } + + [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"com.DeSmuME.DeSmuME.searchDidFinish" object:self userInfo:nil]; + + return itemCount; +} + +- (void) runExactValueSearchOnThread:(id)object +{ + CocoaDSCheatSearchParams *searchParams = (CocoaDSCheatSearchParams *)object; + [self runExactValueSearch:searchParams.value byteSize:searchParams.byteSize signType:searchParams.signType]; +} + +- (NSUInteger) runComparativeSearch:(NSInteger)typeID byteSize:(UInt8)byteSize signType:(NSInteger)signType +{ + NSUInteger itemCount = 0; + BOOL listExists = YES; + + if (searchCount == 0) + { + byteSize--; + + pthread_mutex_lock(self.cdsCore.mutexCoreExecute); + listExists = (NSUInteger)self.listData->start((u8)CHEATSEARCH_SEARCHSTYLE_COMPARATIVE, (u8)byteSize, (u8)signType); + pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); + + addressList = nil; + } + else + { + pthread_mutex_lock(self.cdsCore.mutexCoreExecute); + itemCount = (NSUInteger)self.listData->search((u8)typeID); + NSMutableArray *newAddressList = [[CocoaDSCheatSearch addressListWithListObject:self.listData maxItems:100] retain]; + pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); + + [addressList release]; + addressList = newAddressList; + } + + if (listExists) + { + searchCount++; + } + + [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"com.DeSmuME.DeSmuME.searchDidFinish" object:self userInfo:nil]; + + return itemCount; +} + +- (void) runComparativeSearchOnThread:(id)object +{ + CocoaDSCheatSearchParams *searchParams = (CocoaDSCheatSearchParams *)object; + [self runComparativeSearch:searchParams.comparativeSearchType byteSize:searchParams.byteSize signType:searchParams.signType]; +} + +- (void) reset +{ + pthread_mutex_lock(self.cdsCore.mutexCoreExecute); + self.listData->close(); + pthread_mutex_unlock(self.cdsCore.mutexCoreExecute); + + searchCount = 0; + [addressList release]; + addressList = nil; +} + ++ (NSMutableArray *) addressListWithListObject:(CHEATSEARCH *)addressList maxItems:(NSUInteger)maxItemCount +{ + if (addressList == nil) + { + return nil; + } + + if (maxItemCount == 0) + { + maxItemCount = 1024 * 1024 * 4; + } + + NSMutableArray *newList = [NSMutableArray arrayWithCapacity:maxItemCount]; + if (newList == nil) + { + return newList; + } + + NSMutableDictionary *newItem = nil; + NSUInteger listCount = 0; + u32 address; + u32 value; + + addressList->getListReset(); + while (addressList->getList(&address, &value) && listCount < maxItemCount) + { + newItem = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSString stringWithFormat:@"0x02%06X", address], @"addressString", + [NSNumber numberWithUnsignedInteger:value], @"value", + nil]; + + [newList addObject:newItem]; + listCount++; + } + + return newList; +} + +@end + +@implementation CocoaDSCheatSearchParams + +@synthesize comparativeSearchType; +@synthesize value; +@synthesize byteSize; +@synthesize signType; + +- (id)init +{ + self = [super init]; + if(self == nil) + { + return self; + } + + comparativeSearchType = CHEATSEARCH_COMPARETYPE_EQUALS_TO; + value = 1; + byteSize = 4; + signType = CHEATSEARCH_UNSIGNED; + + return self; +} + +@end diff --git a/desmume/src/cocoa/cocoa_core.h b/desmume/src/cocoa/cocoa_core.h new file mode 100644 index 000000000..acb36bee4 --- /dev/null +++ b/desmume/src/cocoa/cocoa_core.h @@ -0,0 +1,123 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import +#include +#include +#import "cocoa_util.h" + + +@class CocoaDSRom; +@class CocoaDSController; +@class CocoaDSFirmware; +@class CocoaDSOutput; + +typedef struct +{ + void *cdsCore; + int state; + bool isFrameSkipEnabled; + unsigned int frameCount; + unsigned int framesToSkip; + NSTimeInterval calcTimeBudget; + bool exitThread; + pthread_mutex_t *mutexCoreExecute; + pthread_mutex_t mutexThreadExecute; + pthread_cond_t condThreadExecute; +} CoreThreadParam; + +@interface CocoaDSCore : CocoaDSThread +{ + CocoaDSController *cdsController; + CocoaDSFirmware *cdsFirmware; + NSMutableArray *cdsOutputList; + + pthread_t coreThread; + CoreThreadParam threadParam; + + NSInteger prevCoreState; + BOOL isSpeedLimitEnabled; + CGFloat speedScalar; + + NSUInteger emulationFlags; + BOOL emuFlagAdvancedBusLevelTiming; + BOOL emuFlagUseExternalBios; + BOOL emuFlagEmulateBiosInterrupts; + BOOL emuFlagPatchDelayLoop; + BOOL emuFlagUseExternalFirmware; + BOOL emuFlagFirmwareBoot; + BOOL emuFlagDebugConsole; + BOOL emuFlagEmulateEnsata; + + pthread_mutex_t *mutexCoreExecute; + OSSpinLock spinlockMasterExecute; + OSSpinLock spinlockExecutionChange; + OSSpinLock spinlockCheatEnableFlag; + OSSpinLock spinlockEmulationFlags; +} + +@property (assign) CocoaDSController *cdsController; +@property (assign) CocoaDSFirmware *cdsFirmware; +@property (assign) NSMutableArray *cdsOutputList; + +@property (assign) BOOL masterExecute; +@property (assign) BOOL isFrameSkipEnabled; +@property (assign) NSInteger coreState; + +@property (assign) BOOL isSpeedLimitEnabled; +@property (assign) BOOL isCheatingEnabled; +@property (assign) CGFloat speedScalar; + +@property (assign) NSUInteger emulationFlags; +@property (assign) BOOL emuFlagAdvancedBusLevelTiming; +@property (assign) BOOL emuFlagUseExternalBios; +@property (assign) BOOL emuFlagEmulateBiosInterrupts; +@property (assign) BOOL emuFlagPatchDelayLoop; +@property (assign) BOOL emuFlagUseExternalFirmware; +@property (assign) BOOL emuFlagFirmwareBoot; +@property (assign) BOOL emuFlagDebugConsole; +@property (assign) BOOL emuFlagEmulateEnsata; + +@property (assign) NSURL *arm9ImageURL; +@property (assign) NSURL *arm7ImageURL; +@property (assign) NSURL *firmwareImageURL; + +@property (readonly) pthread_mutex_t *mutexCoreExecute; + ++ (BOOL) startupCore; ++ (void) shutdownCore; ++ (BOOL) isCoreStarted; + +- (BOOL) ejectCardFlag; +- (void) setEjectCardFlag; +- (void) toggleEjectCard; + +- (void) changeRomSaveType:(NSInteger)saveTypeID; +- (void) changeExecutionSpeed; + +- (void) restoreCoreState; +- (void) reset; + +- (void) addOutput:(CocoaDSOutput *)theOutput; +- (void) removeOutput:(CocoaDSOutput *)theOutput; +- (void) removeAllOutputs; + +@end + +void* RunCoreThread(void *arg); +void CoreFrameSkip(NSTimeInterval timeBudget, NSTimeInterval timeRemaining, unsigned int *outFramesToSkip); diff --git a/desmume/src/cocoa/cocoa_core.mm b/desmume/src/cocoa/cocoa_core.mm new file mode 100644 index 000000000..1899f4462 --- /dev/null +++ b/desmume/src/cocoa/cocoa_core.mm @@ -0,0 +1,709 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "cocoa_core.h" +#import "cocoa_input.h" +#import "cocoa_firmware.h" +#import "cocoa_globals.h" +#import "cocoa_output.h" +#import "cocoa_rom.h" +#import "cocoa_util.h" + +#include "../NDSSystem.h" +#undef BOOL + + +//accessed from other files +volatile bool execute = true; + +@implementation CocoaDSCore + +@synthesize cdsController; +@synthesize cdsFirmware; +@synthesize cdsOutputList; + +@dynamic masterExecute; +@dynamic isFrameSkipEnabled; +@dynamic coreState; +@dynamic isSpeedLimitEnabled; +@dynamic isCheatingEnabled; +@dynamic speedScalar; + +@dynamic emulationFlags; +@synthesize emuFlagAdvancedBusLevelTiming; +@synthesize emuFlagUseExternalBios; +@synthesize emuFlagEmulateBiosInterrupts; +@synthesize emuFlagPatchDelayLoop; +@synthesize emuFlagUseExternalFirmware; +@synthesize emuFlagFirmwareBoot; +@synthesize emuFlagDebugConsole; +@synthesize emuFlagEmulateEnsata; + +@dynamic arm9ImageURL; +@dynamic arm7ImageURL; +@dynamic firmwareImageURL; + +@synthesize mutexCoreExecute; + +static BOOL isCoreStarted = NO; + +- (id)init +{ + self = [super init]; + if(self == nil) + { + return self; + } + + cdsController = nil; + cdsFirmware = nil; + cdsOutputList = [[NSMutableArray alloc] initWithCapacity:32]; + + emulationFlags = EMULATION_ADVANCED_BUS_LEVEL_TIMING_MASK; + emuFlagAdvancedBusLevelTiming = YES; + emuFlagUseExternalBios = NO; + emuFlagEmulateBiosInterrupts = NO; + emuFlagPatchDelayLoop = NO; + emuFlagUseExternalFirmware = NO; + emuFlagFirmwareBoot = NO; + emuFlagDebugConsole = NO; + emuFlagEmulateEnsata = NO; + + mutexCoreExecute = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); + pthread_mutex_init(mutexCoreExecute, NULL); + spinlockMasterExecute = OS_SPINLOCK_INIT; + spinlockExecutionChange = OS_SPINLOCK_INIT; + spinlockCheatEnableFlag = OS_SPINLOCK_INIT; + spinlockEmulationFlags = OS_SPINLOCK_INIT; + + isSpeedLimitEnabled = YES; + speedScalar = SPEED_SCALAR_NORMAL; + prevCoreState = CORESTATE_PAUSE; + + threadParam.cdsCore = self; + threadParam.state = CORESTATE_PAUSE; + threadParam.isFrameSkipEnabled = true; + threadParam.frameCount = 0; + threadParam.framesToSkip = 0; + threadParam.calcTimeBudget = (NSTimeInterval)(DS_SECONDS_PER_FRAME / speedScalar); + threadParam.exitThread = false; + threadParam.mutexCoreExecute = mutexCoreExecute; + pthread_mutex_init(&threadParam.mutexThreadExecute, NULL); + pthread_cond_init(&threadParam.condThreadExecute, NULL); + pthread_create(&coreThread, NULL, &RunCoreThread, &threadParam); + + return self; +} + +- (void)dealloc +{ + [self setCoreState:CORESTATE_PAUSE]; + + // Exit the thread. + if (self.thread != nil) + { + self.threadExit = YES; + + // Wait until the thread has shut down. + while (self.thread != nil) + { + [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; + } + } + + pthread_mutex_lock(&threadParam.mutexThreadExecute); + threadParam.exitThread = true; + pthread_cond_signal(&threadParam.condThreadExecute); + pthread_mutex_unlock(&threadParam.mutexThreadExecute); + + pthread_join(coreThread, NULL); + coreThread = nil; + pthread_mutex_destroy(&threadParam.mutexThreadExecute); + pthread_cond_destroy(&threadParam.condThreadExecute); + + pthread_mutex_destroy(self.mutexCoreExecute); + free(self.mutexCoreExecute); + mutexCoreExecute = nil; + + [super dealloc]; +} + ++ (BOOL) startupCore +{ + NSInteger result = -1; + + if (isCoreStarted) + { + return isCoreStarted; + } + + result = NDS_Init(); + if (result == -1) + { + isCoreStarted = NO; + return isCoreStarted; + } + + isCoreStarted = YES; + + return isCoreStarted; +} + ++ (void) shutdownCore +{ + if (isCoreStarted) + { + NDS_DeInit(); + isCoreStarted = NO; + } +} + ++ (BOOL) isCoreStarted +{ + return isCoreStarted; +} + +- (void) setMasterExecute:(BOOL)theState +{ + OSSpinLockLock(&spinlockMasterExecute); + + if (theState) + { + execute = true; + } + else + { + execute = false; + } + + OSSpinLockUnlock(&spinlockMasterExecute); +} + +- (BOOL) masterExecute +{ + BOOL theState = NO; + + OSSpinLockLock(&spinlockMasterExecute); + + if (execute) + { + theState = YES; + } + + OSSpinLockUnlock(&spinlockMasterExecute); + + return theState; +} + +- (void) setIsFrameSkipEnabled:(BOOL)theState +{ + pthread_mutex_lock(&threadParam.mutexThreadExecute); + + if (theState) + { + threadParam.isFrameSkipEnabled = true; + } + else + { + threadParam.isFrameSkipEnabled = false; + } + + pthread_mutex_unlock(&threadParam.mutexThreadExecute); +} + +- (BOOL) isFrameSkipEnabled +{ + BOOL theState = NO; + + pthread_mutex_lock(&threadParam.mutexThreadExecute); + bool cState = threadParam.isFrameSkipEnabled; + pthread_mutex_unlock(&threadParam.mutexThreadExecute); + + if (cState) + { + theState = YES; + } + + return theState; +} + +- (void) setSpeedScalar:(CGFloat)scalar +{ + OSSpinLockLock(&spinlockExecutionChange); + speedScalar = scalar; + OSSpinLockUnlock(&spinlockExecutionChange); + [self changeExecutionSpeed]; +} + +- (CGFloat) speedScalar +{ + OSSpinLockLock(&spinlockExecutionChange); + CGFloat scalar = speedScalar; + OSSpinLockUnlock(&spinlockExecutionChange); + + return scalar; +} + +- (void) setIsSpeedLimitEnabled:(BOOL)theState +{ + OSSpinLockLock(&spinlockExecutionChange); + isSpeedLimitEnabled = theState; + OSSpinLockUnlock(&spinlockExecutionChange); + [self changeExecutionSpeed]; +} + +- (BOOL) isSpeedLimitEnabled +{ + OSSpinLockLock(&spinlockExecutionChange); + BOOL enabled = isSpeedLimitEnabled; + OSSpinLockUnlock(&spinlockExecutionChange); + + return enabled; +} + +- (void) setIsCheatingEnabled:(BOOL)theState +{ + OSSpinLockLock(&spinlockCheatEnableFlag); + + if (theState) + { + CommonSettings.cheatsDisable = false; + } + else + { + CommonSettings.cheatsDisable = true; + } + + OSSpinLockUnlock(&spinlockCheatEnableFlag); +} + +- (BOOL) isCheatingEnabled +{ + BOOL theState = YES; + + OSSpinLockLock(&spinlockCheatEnableFlag); + + if (CommonSettings.cheatsDisable) + { + theState = NO; + } + + OSSpinLockUnlock(&spinlockCheatEnableFlag); + + return theState; +} + +- (void) setEmulationFlags:(NSUInteger)theFlags +{ + OSSpinLockLock(&spinlockEmulationFlags); + emulationFlags = theFlags; + OSSpinLockUnlock(&spinlockEmulationFlags); + + pthread_mutex_lock(self.mutexCoreExecute); + + if (theFlags & EMULATION_ADVANCED_BUS_LEVEL_TIMING_MASK) + { + self.emuFlagAdvancedBusLevelTiming = YES; + CommonSettings.advanced_timing = true; + } + else + { + self.emuFlagAdvancedBusLevelTiming = NO; + CommonSettings.advanced_timing = false; + } + + if (theFlags & EMULATION_ENSATA_MASK) + { + self.emuFlagEmulateEnsata = YES; + CommonSettings.EnsataEmulation = true; + } + else + { + self.emuFlagEmulateEnsata = NO; + CommonSettings.EnsataEmulation = false; + } + + if (theFlags & EMULATION_USE_EXTERNAL_BIOS_MASK) + { + self.emuFlagUseExternalBios = YES; + CommonSettings.UseExtBIOS = true; + } + else + { + self.emuFlagUseExternalBios = NO; + CommonSettings.UseExtBIOS = false; + } + + if (theFlags & EMULATION_BIOS_SWI_MASK) + { + self.emuFlagEmulateBiosInterrupts = YES; + CommonSettings.SWIFromBIOS = true; + } + else + { + self.emuFlagEmulateBiosInterrupts = NO; + CommonSettings.SWIFromBIOS = false; + } + + if (theFlags & EMULATION_PATCH_DELAY_LOOP_MASK) + { + self.emuFlagPatchDelayLoop = YES; + CommonSettings.PatchSWI3 = true; + } + else + { + self.emuFlagPatchDelayLoop = NO; + CommonSettings.PatchSWI3 = false; + } + + if (theFlags & EMULATION_USE_EXTERNAL_FIRMWARE_MASK) + { + self.emuFlagUseExternalFirmware = YES; + CommonSettings.UseExtFirmware = true; + } + else + { + self.emuFlagUseExternalFirmware = NO; + CommonSettings.UseExtFirmware = false; + } + + if (theFlags & EMULATION_BOOT_FROM_FIRMWARE_MASK) + { + self.emuFlagFirmwareBoot = YES; + CommonSettings.BootFromFirmware = true; + } + else + { + self.emuFlagFirmwareBoot = NO; + CommonSettings.BootFromFirmware = false; + } + + if (theFlags & EMULATION_DEBUG_CONSOLE_MASK) + { + self.emuFlagDebugConsole = YES; + CommonSettings.DebugConsole = true; + } + else + { + self.emuFlagDebugConsole = NO; + CommonSettings.DebugConsole = false; + } + + pthread_mutex_unlock(self.mutexCoreExecute); +} + +- (NSUInteger) emulationFlags +{ + OSSpinLockLock(&spinlockEmulationFlags); + NSUInteger theFlags = emulationFlags; + OSSpinLockUnlock(&spinlockEmulationFlags); + + return theFlags; +} + +- (void) setCoreState:(NSInteger)coreState +{ + if (threadParam.state == CORESTATE_PAUSE) + { + prevCoreState = CORESTATE_PAUSE; + } + else + { + prevCoreState = CORESTATE_EXECUTE; + } + + pthread_mutex_lock(&threadParam.mutexThreadExecute); + threadParam.state = coreState; + pthread_cond_signal(&threadParam.condThreadExecute); + pthread_mutex_unlock(&threadParam.mutexThreadExecute); +} + +- (NSInteger) coreState +{ + pthread_mutex_lock(&threadParam.mutexThreadExecute); + NSInteger theState = threadParam.state; + pthread_mutex_unlock(&threadParam.mutexThreadExecute); + + return theState; +} + +- (void) setArm9ImageURL:(NSURL *)fileURL +{ + if (fileURL != nil) + { + strlcpy(CommonSettings.ARM9BIOS, [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding], sizeof(CommonSettings.ARM9BIOS)); + } + else + { + memset(CommonSettings.ARM9BIOS, 0, sizeof(CommonSettings.ARM9BIOS)); + } +} + +- (NSURL *) arm9ImageURL +{ + return [NSURL fileURLWithPath:[NSString stringWithCString:CommonSettings.ARM9BIOS encoding:NSUTF8StringEncoding]]; +} + +- (void) setArm7ImageURL:(NSURL *)fileURL +{ + if (fileURL != nil) + { + strlcpy(CommonSettings.ARM7BIOS, [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding], sizeof(CommonSettings.ARM7BIOS)); + } + else + { + memset(CommonSettings.ARM7BIOS, 0, sizeof(CommonSettings.ARM7BIOS)); + } +} + +- (NSURL *) arm7ImageURL +{ + return [NSURL fileURLWithPath:[NSString stringWithCString:CommonSettings.ARM7BIOS encoding:NSUTF8StringEncoding]]; +} + +- (void) setFirmwareImageURL:(NSURL *)fileURL +{ + if (fileURL != nil) + { + strlcpy(CommonSettings.Firmware, [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding], sizeof(CommonSettings.Firmware)); + } + else + { + memset(CommonSettings.Firmware, 0, sizeof(CommonSettings.Firmware)); + } +} + +- (NSURL *) firmwareImageURL +{ + return [NSURL fileURLWithPath:[NSString stringWithCString:CommonSettings.Firmware encoding:NSUTF8StringEncoding]]; +} + +- (void) setEjectCardFlag +{ + if (nds.cardEjected) + { + self.emulationFlags = self.emulationFlags | EMULATION_CARD_EJECT_MASK; + return; + } + + self.emulationFlags = self.emulationFlags & ~EMULATION_CARD_EJECT_MASK; +} + +- (BOOL) ejectCardFlag +{ + [self setEjectCardFlag]; + if (nds.cardEjected) + { + return YES; + } + + return NO; +} + +- (void) toggleEjectCard +{ + NDS_ToggleCardEject(); + [self setEjectCardFlag]; +} + +- (void) changeRomSaveType:(NSInteger)saveTypeID +{ + pthread_mutex_lock(self.mutexCoreExecute); + [CocoaDSRom changeRomSaveType:saveTypeID]; + pthread_mutex_unlock(self.mutexCoreExecute); +} + +- (void) changeExecutionSpeed +{ + if (self.isSpeedLimitEnabled) + { + CGFloat theSpeed = self.speedScalar; + if(theSpeed <= SPEED_SCALAR_MIN) + { + theSpeed = SPEED_SCALAR_MIN; + } + + pthread_mutex_unlock(&threadParam.mutexThreadExecute); + threadParam.calcTimeBudget = (NSTimeInterval)(DS_SECONDS_PER_FRAME / theSpeed); + pthread_mutex_unlock(&threadParam.mutexThreadExecute); + } + else + { + pthread_mutex_unlock(&threadParam.mutexThreadExecute); + threadParam.calcTimeBudget = 0.0; + pthread_mutex_unlock(&threadParam.mutexThreadExecute); + } +} + +- (void) restoreCoreState +{ + [self setCoreState:prevCoreState]; +} + +- (void) reset +{ + [self setCoreState:CORESTATE_PAUSE]; + + pthread_mutex_lock(&threadParam.mutexThreadExecute); + NDS_Reset(); + pthread_mutex_unlock(&threadParam.mutexThreadExecute); + + [self restoreCoreState]; + self.masterExecute = YES; +} + +- (void) addOutput:(CocoaDSOutput *)theOutput +{ + [self.cdsOutputList addObject:theOutput]; +} + +- (void) removeOutput:(CocoaDSOutput *)theOutput +{ + [self.cdsOutputList removeObject:theOutput]; +} + +- (void) removeAllOutputs +{ + [self.cdsOutputList removeAllObjects]; +} + +- (void) runThread:(id)object +{ + [CocoaDSCore startupCore]; + [super runThread:object]; + [CocoaDSCore shutdownCore]; +} + +@end + +void* RunCoreThread(void *arg) +{ + CoreThreadParam *param = (CoreThreadParam *)arg; + CocoaDSCore *cdsCore = (CocoaDSCore *)param->cdsCore; + NSMutableArray *cdsOutputList = [cdsCore cdsOutputList]; + NSDate *loopStartDate = nil; + + do + { + loopStartDate = [[NSDate alloc] init]; + pthread_mutex_lock(¶m->mutexThreadExecute); + + while (!(param->state == CORESTATE_EXECUTE && execute && !param->exitThread)) + { + [loopStartDate release]; + pthread_cond_wait(¶m->condThreadExecute, ¶m->mutexThreadExecute); + loopStartDate = [[NSDate alloc] init]; + } + + if (param->exitThread) + { + [loopStartDate release]; + break; + } + + // Get the user's input, execute a single emulation frame, and generate + // the frame output. + [cdsCore.cdsController update]; + + NDS_beginProcessingInput(); + // Shouldn't need to do any special processing steps in between. + // We'll just jump directly to ending the input processing. + NDS_endProcessingInput(); + + for(CocoaDSOutput *cdsOutput in cdsOutputList) + { + pthread_mutex_lock(cdsOutput.mutexOutputFrame); + } + + // Execute the frame and increment the frame counter. + pthread_mutex_lock(param->mutexCoreExecute); + NDS_exec(); + pthread_mutex_unlock(param->mutexCoreExecute); + + if (param->framesToSkip == 0 || !param->isFrameSkipEnabled) + { + param->frameCount++; + } + + for(CocoaDSOutput *cdsOutput in cdsOutputList) + { + if (param->isFrameSkipEnabled && param->framesToSkip > 0 && [cdsOutput isMemberOfClass:[CocoaDSDisplay class]]) + { + pthread_mutex_unlock(cdsOutput.mutexOutputFrame); + continue; + } + + [cdsOutput doCoreEmuFrame]; + pthread_mutex_unlock(cdsOutput.mutexOutputFrame); + } + + // Determine the number of frames to skip based on how much time "debt" + // we owe on timeBudget. + if (param->isFrameSkipEnabled) + { + CoreFrameSkip(param->calcTimeBudget, param->calcTimeBudget + [loopStartDate timeIntervalSinceNow], ¶m->framesToSkip); + } + + // If there is any time left in the loop, go ahead and pad it. + NSTimeInterval timePad = param->calcTimeBudget + [loopStartDate timeIntervalSinceNow]; + + pthread_mutex_unlock(¶m->mutexThreadExecute); + + if(timePad > 0.0) + { +#if (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4) // Code for Mac OS X 10.4 and earlier + [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:timePad]]; +#else // Code for Mac OS X 10.5 and later + [NSThread sleepForTimeInterval:timePad]; +#endif + } + + [loopStartDate release]; + + } while (!param->exitThread); + + return nil; +} + +void CoreFrameSkip(NSTimeInterval timeBudget, NSTimeInterval timeRemaining, unsigned int *outFramesToSkip) +{ + if (*outFramesToSkip > 0) + { + NDS_SkipNextFrame(); + (*outFramesToSkip)--; + } + else + { + if (timeRemaining <= 0.0) + { + if (timeBudget > 0.0) + { + *outFramesToSkip = (unsigned int)( ((-timeRemaining * FRAME_SKIP_AGGRESSIVENESS)/timeBudget) + FRAME_SKIP_BIAS ); + } + else + { + *outFramesToSkip = (unsigned int)( ((-timeRemaining * FRAME_SKIP_AGGRESSIVENESS * 100.0)/DS_SECONDS_PER_FRAME) + FRAME_SKIP_BIAS ); + } + + if (*outFramesToSkip > (unsigned int)MAX_FRAME_SKIP) + { + *outFramesToSkip = (unsigned int)MAX_FRAME_SKIP; + } + } + } +} diff --git a/desmume/src/cocoa/cocoa_firmware.h b/desmume/src/cocoa/cocoa_firmware.h new file mode 100644 index 000000000..ac526ca3c --- /dev/null +++ b/desmume/src/cocoa/cocoa_firmware.h @@ -0,0 +1,60 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import + + +/******************************************************************************************** + CocoaDSFirmware - OBJECTIVE-C CLASS + + This is an Objective-C wrapper class for DeSmuME's firmware struct. + + If this object is instantiated through any init method other than initWithFirmwareData:, + this object allocate memory for its own internal firmware struct. This memory is then + freed upon the release of this object. + + If this object is instantiated using initWithFirmwareData:, or if a firmware struct is + assigned through the data property, the firmware struct is not freed upon the release + of this object. This is by design. + + Thread Safety: + All methods are thread-safe. + ********************************************************************************************/ +@interface CocoaDSFirmware : NSObject +{ + struct NDS_fw_config_data *data; + struct NDS_fw_config_data *internalData; + NSInteger birth_year; + pthread_mutex_t mutex; +} + +@property (assign) struct NDS_fw_config_data *data; +@property (assign) NSInteger consoleType; +@property (assign) NSString *nickname; +@property (assign) NSString *message; +@property (assign) NSInteger favoriteColor; +@property (assign) NSDate *birthday; +@property (assign) NSInteger language; + +- (id) initWithDictionary:(NSDictionary *)dataDict; +- (id) initWithFirmwareData:(struct NDS_fw_config_data *)fwData; +- (void) update; +- (void) setDataWithDictionary:(NSDictionary *)fwDataDict; +- (NSDictionary *) dataDictionary; + +@end diff --git a/desmume/src/cocoa/cocoa_firmware.mm b/desmume/src/cocoa/cocoa_firmware.mm new file mode 100644 index 000000000..10d9be38a --- /dev/null +++ b/desmume/src/cocoa/cocoa_firmware.mm @@ -0,0 +1,307 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "cocoa_firmware.h" +#include "../NDSSystem.h" + + +@implementation CocoaDSFirmware + +@synthesize data; +@dynamic consoleType; +@dynamic nickname; +@dynamic message; +@dynamic favoriteColor; +@dynamic birthday; +@dynamic language; + +- (id)init +{ + return [self initWithDictionary:nil]; +} + +- (id) initWithDictionary:(NSDictionary *)fwDataDict +{ + self = [super init]; + if (self == nil) + { + return self; + } + + pthread_mutex_init(&mutex, NULL); + + // Allocate our own firmware struct since we weren't provided with one. + internalData = (struct NDS_fw_config_data *)malloc(sizeof(struct NDS_fw_config_data)); + if (internalData == nil) + { + pthread_mutex_destroy(&mutex); + [self release]; + return nil; + } + + NDS_FillDefaultFirmwareConfigData(internalData); + + data = internalData; + + [self setDataWithDictionary:fwDataDict]; + + return self; +} + +- (id) initWithFirmwareData:(struct NDS_fw_config_data *)fwData +{ + self = [super init]; + if (self == nil) + { + return self; + } + + pthread_mutex_init(&mutex, NULL); + + if (fwData == nil) + { + pthread_mutex_destroy(&mutex); + [self release]; + return nil; + } + + // Set birth_year to the current year. + NSDate *now = [[NSDate alloc] init]; + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + [dateFormatter setDateFormat:@"Y"]; + birth_year = [[dateFormatter stringFromDate:now] integerValue]; + [dateFormatter release]; + [now release]; + + internalData = NULL; + data = fwData; + + return self; +} + +- (void)dealloc +{ + free(internalData); + internalData = NULL; + + pthread_mutex_destroy(&mutex); + + [super dealloc]; +} + +- (void) setConsoleType:(NSInteger)theType +{ + pthread_mutex_lock(&mutex); + data->ds_type = (NDS_CONSOLE_TYPE)theType; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) consoleType +{ + pthread_mutex_lock(&mutex); + NSInteger theType = data->ds_type; + pthread_mutex_unlock(&mutex); + + return theType; +} + +- (void) setNickname:(NSString *)theNickname +{ + if (theNickname == nil) + { + return; + } + + pthread_mutex_lock(&mutex); + + NSRange characterRange = {0, [theNickname length]}; + + if (characterRange.length > MAX_FW_NICKNAME_LENGTH) + { + characterRange.length = MAX_FW_NICKNAME_LENGTH; + } + + [theNickname getBytes:&data->nickname[0] + maxLength:(sizeof(UInt16) * characterRange.length) + usedLength:NULL + encoding:NSUTF16LittleEndianStringEncoding + options:NSStringEncodingConversionAllowLossy + range:characterRange + remainingRange:NULL]; + + data->nickname_len = (u8)characterRange.length; + + pthread_mutex_unlock(&mutex); +} + +- (NSString *) nickname +{ + pthread_mutex_lock(&mutex); + NSString *theNickname = [[[NSString alloc] initWithBytes:&data->nickname[0] length:(sizeof(UInt16) * data->nickname_len) encoding:NSUTF16LittleEndianStringEncoding] autorelease]; + pthread_mutex_unlock(&mutex); + + return theNickname; +} + +- (void) setMessage:(NSString *)theMessage +{ + if (theMessage == nil) + { + return; + } + + pthread_mutex_lock(&mutex); + + NSRange characterRange = {0, [theMessage length]}; + + if (characterRange.length > MAX_FW_MESSAGE_LENGTH) + { + characterRange.length = MAX_FW_MESSAGE_LENGTH; + } + + [theMessage getBytes:&data->message[0] + maxLength:(sizeof(UInt16) * characterRange.length) + usedLength:NULL + encoding:NSUTF16LittleEndianStringEncoding + options:NSStringEncodingConversionAllowLossy + range:characterRange + remainingRange:NULL]; + + data->message_len = (u8)characterRange.length; + + pthread_mutex_unlock(&mutex); +} + +- (NSString *) message +{ + pthread_mutex_lock(&mutex); + NSString *theMessage = [[[NSString alloc] initWithBytes:&data->message[0] length:(sizeof(UInt16) * data->message_len) encoding:NSUTF16LittleEndianStringEncoding] autorelease]; + pthread_mutex_unlock(&mutex); + + return theMessage; +} + +- (void) setFavoriteColor:(NSInteger)colorID +{ + pthread_mutex_lock(&mutex); + data->fav_colour = (u8)colorID; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) favoriteColor +{ + pthread_mutex_lock(&mutex); + NSInteger theFavoriteColorID = data->fav_colour; + pthread_mutex_unlock(&mutex); + + return theFavoriteColorID; +} + +- (void) setBirthday:(NSDate *)theDate +{ + if (theDate == nil) + { + return; + } + + pthread_mutex_lock(&mutex); + + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + + [dateFormatter setDateFormat:@"M"]; + NSInteger theMonth = [[dateFormatter stringFromDate:theDate] integerValue]; + + [dateFormatter setDateFormat:@"d"]; + NSInteger theDay = [[dateFormatter stringFromDate:theDate] integerValue]; + + [dateFormatter setDateFormat:@"Y"]; + NSInteger theYear = [[dateFormatter stringFromDate:theDate] integerValue]; + + [dateFormatter release]; + + data->birth_month = (u8)theMonth; + data->birth_day = (u8)theDay; + birth_year = theYear; + + pthread_mutex_unlock(&mutex); +} + +- (NSDate *) birthday +{ + pthread_mutex_lock(&mutex); + NSDate *theBirthday = [NSDate dateWithString:[NSString stringWithFormat:@"%d-%d-%d 12:00:00 +0000", birth_year, data->birth_month, data->birth_day]]; + pthread_mutex_unlock(&mutex); + + return theBirthday; +} + +- (void) setLanguage:(NSInteger)languageID +{ + pthread_mutex_lock(&mutex); + data->language = (u8)languageID; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) language +{ + pthread_mutex_lock(&mutex); + NSInteger theLanguageID = data->language; + pthread_mutex_unlock(&mutex); + + return theLanguageID; +} + +- (void) update +{ + // Write the attributes to the DS via the data struct. + // We have make a copy of the struct and send that so that the firmware + // changes get saved in CommonSettings.InternalFirmwareConf. + pthread_mutex_lock(&mutex); + struct NDS_fw_config_data newFirmwareData = *data; + NDS_CreateDummyFirmware(&newFirmwareData); + pthread_mutex_unlock(&mutex); +} + +- (void) setDataWithDictionary:(NSDictionary *)dataDict +{ + if (dataDict == nil) + { + return; + } + + [self setConsoleType:[(NSNumber *)[dataDict valueForKey:@"ConsoleType"] integerValue]]; + [self setNickname:(NSString *)[dataDict valueForKey:@"Nickname"]]; + [self setMessage:(NSString *)[dataDict valueForKey:@"Message"]]; + [self setFavoriteColor:[(NSNumber *)[dataDict valueForKey:@"FavoriteColor"] integerValue]]; + [self setBirthday:(NSDate *)[dataDict valueForKey:@"Birthday"]]; + [self setLanguage:[(NSNumber *)[dataDict valueForKey:@"Language"] integerValue]]; +} + +- (NSDictionary *) dataDictionary +{ + return [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:[self consoleType]], @"ConsoleType", + [self nickname], @"Nickname", + [self message], @"Message", + [NSNumber numberWithInteger:[self favoriteColor]], @"FavoriteColor", + [self birthday], @"Birthday", + [NSNumber numberWithInteger:[self language]], @"Language", + nil]; +} + +@end diff --git a/desmume/src/cocoa/cocoa_hid.h b/desmume/src/cocoa/cocoa_hid.h new file mode 100644 index 000000000..3740c69a4 --- /dev/null +++ b/desmume/src/cocoa/cocoa_hid.h @@ -0,0 +1,69 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import +#include + + +@interface CocoaHIDDevice : NSObject +{ + IOHIDDeviceRef hidDeviceRef; + IOHIDQueueRef hidQueueRef; + NSRunLoop *runLoop; +} + +@property (readonly) IOHIDDeviceRef hidDeviceRef; +@property (assign) NSRunLoop *runLoop; + +- (id) initWithDevice:(IOHIDDeviceRef)theDevice; + +- (void) start; +- (void) stop; + +- (NSString *) manufacturerName; +- (NSString *) productName; +- (NSString *) serialNumber; + ++ (NSString *) manufacturerNameFromHIDDevice:(CocoaHIDDevice *)hidDevice; ++ (NSString *) productNameFromHIDDevice:(CocoaHIDDevice *)hidDevice; ++ (NSString *) serialNumberFromHIDDevice:(CocoaHIDDevice *)hidDevice; + ++ (NSMutableArray *) inputArrayFromHIDValue:(IOHIDValueRef)hidValueRef; ++ (NSDictionary *) inputAttributesOfHIDValue:(IOHIDValueRef)hidValueRef altElementCode:(NSString *)altElementCode altElementName:(NSString *)altElementName inputState:(NSNumber *)altOnState; ++ (NSMutableArray *) inputArrayFromHatSwitchValue:(IOHIDValueRef)hidValueRef useEightDirection:(BOOL)useEightDirection; ++ (BOOL) onStateFromHIDValue:(IOHIDValueRef)hidValueRef; + +@end + + +@interface CocoaHIDManager : NSObject +{ + IOHIDManagerRef hidManagerRef; + NSRunLoop *runLoop; + NSMutableSet *deviceList; +} + +@property (readonly) IOHIDManagerRef hidManagerRef; +@property (readonly) NSMutableSet *deviceList; +@property (assign) NSRunLoop *runLoop; + +@end + +void HandleDeviceMatchingCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef); +void HandleDeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef); +void HandleQueueValueAvailableCallback(void *inContext, IOReturn inResult, void *inSender); diff --git a/desmume/src/cocoa/cocoa_hid.mm b/desmume/src/cocoa/cocoa_hid.mm new file mode 100644 index 000000000..18e3ca728 --- /dev/null +++ b/desmume/src/cocoa/cocoa_hid.mm @@ -0,0 +1,840 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "cocoa_hid.h" +#import "cocoa_util.h" + +/* + Get the symbols for UpdateSystemActivity(). + + For some reason, in Mac OS v10.5 and earlier, UpdateSystemActivity() is not + defined for 64-bit, even though it does work on 64-bit systems. So we're going + to copy the symbols from OSServices/Power.h so that we can use them. This + solution is better than making an absolute path to the Power.h file, since + we can't assume that the header file will always be in the same location. + + Note that this isn't a problem on 32-bit, or if the target SDK is Mac OS v10.6 + or later. + */ + +#if !__LP64__ || MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + +#include + +#else + +#ifdef __cplusplus +extern "C" +{ +#endif + + extern OSErr UpdateSystemActivity(UInt8 activity); + + enum + { + OverallAct = 0, + UsrActivity = 1, + NetActivity = 2, + HDActivity = 3, + IdleActivity = 4 + }; + +#ifdef __cplusplus +} +#endif + +#endif // !__LP64__ || MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + +@implementation CocoaHIDDevice + +@synthesize hidDeviceRef; +@synthesize runLoop; + +static NSDictionary *hidUsageTable = nil; + +- (id)init +{ + return [self initWithDevice:nil]; +} + +- (id) initWithDevice:(IOHIDDeviceRef)theDevice +{ + self = [super init]; + if(self == nil) + { + return self; + } + + if (hidUsageTable == nil) + { + hidUsageTable = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"HID_usage_strings" ofType:@"plist"]]; + } + + hidDeviceRef = theDevice; + + hidQueueRef = IOHIDQueueCreate(kCFAllocatorDefault, hidDeviceRef, 10, kIOHIDOptionsTypeNone); + if (hidQueueRef == NULL) + { + [self release]; + return nil; + } + + CFArrayRef elementArray = IOHIDDeviceCopyMatchingElements(hidDeviceRef, NULL, kIOHIDOptionsTypeNone); + NSEnumerator *enumerator = [(NSArray *)elementArray objectEnumerator]; + IOHIDElementRef hidElement = NULL; + + while ((hidElement = (IOHIDElementRef)[enumerator nextObject])) + { + IOHIDQueueAddElement(hidQueueRef, hidElement); + } + + CFRelease(elementArray); + + [self setRunLoop:[NSRunLoop currentRunLoop]]; + + return self; +} + +- (void)dealloc +{ + [self stop]; + + self.runLoop = nil; + + if (hidQueueRef != NULL) + { + CFRelease(hidQueueRef); + hidQueueRef = NULL; + } + + [super dealloc]; +} + +- (void) setRunLoop:(NSRunLoop *)theRunLoop +{ + if (theRunLoop == nil && runLoop != nil) + { + IOHIDQueueRegisterValueAvailableCallback(hidQueueRef, NULL, NULL); + IOHIDQueueUnscheduleFromRunLoop(hidQueueRef, [runLoop getCFRunLoop], kCFRunLoopDefaultMode); + [runLoop release]; + } + + runLoop = theRunLoop; + if (runLoop != nil) + { + [runLoop retain]; + IOHIDQueueScheduleWithRunLoop(hidQueueRef, [theRunLoop getCFRunLoop], kCFRunLoopDefaultMode); + IOHIDQueueRegisterValueAvailableCallback(hidQueueRef, HandleQueueValueAvailableCallback, self); + } +} + +- (NSRunLoop *) runLoop +{ + return runLoop; +} + +- (void) start +{ + IOHIDQueueStart(hidQueueRef); +} + +- (void) stop +{ + IOHIDQueueStop(hidQueueRef); +} + +- (NSString *) manufacturerName +{ + return [CocoaHIDDevice manufacturerNameFromHIDDevice:self]; +} + +- (NSString *) productName +{ + return [CocoaHIDDevice productNameFromHIDDevice:self]; +} + +- (NSString *) serialNumber +{ + return [CocoaHIDDevice serialNumberFromHIDDevice:self]; +} + +/******************************************************************************************** + inputAttributesOfHIDValue:altElementCode:altElementName:inputState: + + Parses an IOHIDValueRef to return an input attributes NSDictionary. + + Takes: + hidValueRef - The IOHIDValueRef to parse. + altElementCode - An NSString that overrides the default element code. + altElementName - An NSString that overrides the default element name. + altOnState - An NSNumber that overrides the default on state. + + Returns: + An input attributes NSDictionary. + + Details: + None. + ********************************************************************************************/ ++ (NSDictionary *) inputAttributesOfHIDValue:(IOHIDValueRef)hidValueRef altElementCode:(NSString *)altElementCode altElementName:(NSString *)altElementName inputState:(NSNumber *)altOnState +{ + if (hidValueRef == NULL) + { + return nil; + } + + IOHIDElementRef hidElementRef = IOHIDValueGetElement(hidValueRef); + NSInteger elementUsagePage = IOHIDElementGetUsagePage(hidElementRef); + NSInteger elementUsage = IOHIDElementGetUsage(hidElementRef); + + NSString *elementCode = nil; + if (altElementCode == nil) + { + elementCode = [NSString stringWithFormat:@"0x%04X/0x%04X", elementUsagePage, elementUsage]; + } + else + { + elementCode = altElementCode; + } + + NSString *elementName = nil; + if (altElementName == nil) + { + + CFStringRef cfElementName = IOHIDElementGetName(hidElementRef); + if (cfElementName == nil) + { + if (elementUsagePage == kHIDPage_Button) + { + elementName = [NSString stringWithFormat:@"Button %i", elementUsage]; + } + else if (elementUsagePage == kHIDPage_VendorDefinedStart) + { + elementName = [NSString stringWithFormat:@"VendorDefined %i", elementUsage]; + } + else + { + NSDictionary *elementUsagePageDict = (NSDictionary *)[hidUsageTable valueForKey:[NSString stringWithFormat:@"0x%04X", elementUsagePage]]; + elementName = (NSString *)[elementUsagePageDict valueForKey:[NSString stringWithFormat:@"0x%04X", elementUsage]]; + } + } + else + { + elementName = [NSString stringWithString:(NSString *)cfElementName]; + } + } + else + { + elementName = altElementName; + } + + IOHIDDeviceRef hidDeviceRef = IOHIDElementGetDevice(hidElementRef); + + CFNumberRef cfVendorIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDVendorIDKey)); + CFNumberRef cfProductIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDProductIDKey)); + UInt32 vendorID = [(NSNumber *)cfVendorIDNumber integerValue]; + UInt32 productID = [(NSNumber *)cfProductIDNumber integerValue]; + + NSString *deviceCode = [NSString stringWithFormat:@"%d/%d/", vendorID, productID]; + CFStringRef cfDeviceCode = (CFStringRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDSerialNumberKey)); + if (cfDeviceCode == nil) + { + CFNumberRef cfLocationIDNumber = (CFNumberRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDLocationIDKey)); + UInt32 locationID = [(NSNumber *)cfLocationIDNumber integerValue]; + deviceCode = [deviceCode stringByAppendingFormat:@"0x%08X", locationID]; + } + else + { + deviceCode = [deviceCode stringByAppendingString:(NSString *)cfDeviceCode]; + } + + NSString *deviceName = nil; + CFStringRef cfDeviceName = (CFStringRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDProductKey)); + if (cfDeviceName == nil) + { + deviceName = deviceCode; + } + else + { + deviceName = [NSString stringWithString:(NSString *)cfDeviceName]; + } + + NSNumber *onState = nil; + if (altOnState == nil) + { + onState = [NSNumber numberWithBool:[CocoaHIDDevice onStateFromHIDValue:hidValueRef]]; + } + else + { + onState = altOnState; + } + + NSInteger logicalValue = IOHIDValueGetIntegerValue(hidValueRef); + + return [NSDictionary dictionaryWithObjectsAndKeys: + deviceCode, @"deviceCode", + deviceName, @"deviceName", + elementCode, @"elementCode", + elementName, @"elementName", + onState, @"on", + [NSNumber numberWithInteger:logicalValue], @"integerValue", + [NSNumber numberWithFloat:(float)logicalValue], @"floatValue", + nil]; +} + ++ (NSString *) manufacturerNameFromHIDDevice:(CocoaHIDDevice *)hidDevice +{ + return (NSString *)IOHIDDeviceGetProperty(hidDevice.hidDeviceRef, CFSTR(kIOHIDManufacturerKey)); +} + ++ (NSString *) productNameFromHIDDevice:(CocoaHIDDevice *)hidDevice +{ + return (NSString *)IOHIDDeviceGetProperty(hidDevice.hidDeviceRef, CFSTR(kIOHIDProductKey)); +} + ++ (NSString *) serialNumberFromHIDDevice:(CocoaHIDDevice *)hidDevice +{ + return (NSString *)IOHIDDeviceGetProperty(hidDevice.hidDeviceRef, CFSTR(kIOHIDSerialNumberKey)); +} + ++ (NSMutableArray *) inputArrayFromHIDValue:(IOHIDValueRef)hidValueRef +{ + NSMutableArray *inputAttributesList = nil; + + if (hidValueRef == NULL) + { + return inputAttributesList; + } + + IOHIDElementRef hidElementRef = IOHIDValueGetElement(hidValueRef); + NSInteger elementUsagePage = IOHIDElementGetUsagePage(hidElementRef); + NSInteger elementUsage = IOHIDElementGetUsage(hidElementRef); + NSInteger logicalValue = IOHIDValueGetIntegerValue(hidValueRef); + NSInteger logicalMin = IOHIDElementGetLogicalMin(hidElementRef); + NSInteger logicalMax = IOHIDElementGetLogicalMax(hidElementRef); + + inputAttributesList = [NSMutableArray arrayWithCapacity:2]; + + if (logicalMin == 0 && logicalMax == 1) + { + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:nil altElementName:nil inputState:nil]]; + } + else + { + NSInteger lowerThreshold = ((logicalMax - logicalMin) / 4) + logicalMin; + NSInteger upperThreshold = (((logicalMax - logicalMin) * 3) / 4) + logicalMin; + NSNumber *onState = [NSNumber numberWithBool:YES]; + NSNumber *offState = [NSNumber numberWithBool:NO]; + NSString *elementCodeLowerThreshold = [NSString stringWithFormat:@"0x%04X/0x%04X/LowerThreshold", elementUsagePage, elementUsage]; + NSString *elementCodeUpperThreshold = [NSString stringWithFormat:@"0x%04X/0x%04X/UpperThreshold", elementUsagePage, elementUsage]; + + if (logicalValue <= lowerThreshold) + { + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeLowerThreshold altElementName:nil inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeUpperThreshold altElementName:nil inputState:offState]]; + } + else if (logicalValue >= upperThreshold) + { + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeLowerThreshold altElementName:nil inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeUpperThreshold altElementName:nil inputState:onState]]; + } + else + { + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeLowerThreshold altElementName:nil inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeUpperThreshold altElementName:nil inputState:offState]]; + } + } + + return inputAttributesList; +} + ++ (NSMutableArray *) inputArrayFromHatSwitchValue:(IOHIDValueRef)hidValueRef useEightDirection:(BOOL)useEightDirection +{ + NSMutableArray *inputAttributesList = nil; + + if (hidValueRef == NULL) + { + return inputAttributesList; + } + + IOHIDElementRef hidElementRef = IOHIDValueGetElement(hidValueRef); + NSInteger elementUsagePage = IOHIDElementGetUsagePage(hidElementRef); + NSInteger elementUsage = IOHIDElementGetUsage(hidElementRef); + + if (elementUsage != kHIDUsage_GD_Hatswitch) + { + return inputAttributesList; + } + + inputAttributesList = [NSMutableArray arrayWithCapacity:8]; + NSInteger logicalMax = IOHIDElementGetLogicalMax(hidElementRef); + NSInteger logicalValue = IOHIDValueGetIntegerValue(hidValueRef); + + NSNumber *onState = [NSNumber numberWithBool:YES]; + NSNumber *offState = [NSNumber numberWithBool:NO]; + NSString *elementCodeFourWayUp = [NSString stringWithFormat:@"0x%04X/0x%04X/%d-FourDirection", elementUsagePage, elementUsage, 0]; + NSString *elementCodeFourWayRight = [NSString stringWithFormat:@"0x%04X/0x%04X/%d-FourDirection", elementUsagePage, elementUsage, 1]; + NSString *elementCodeFourWayDown = [NSString stringWithFormat:@"0x%04X/0x%04X/%d-FourDirection", elementUsagePage, elementUsage, 2]; + NSString *elementCodeFourWayLeft = [NSString stringWithFormat:@"0x%04X/0x%04X/%d-FourDirection", elementUsagePage, elementUsage, 3]; + NSString *elementCodeEightWayUp = [NSString stringWithFormat:@"0x%04X/0x%04X/%d-EightDirection", elementUsagePage, elementUsage, 0]; + NSString *elementCodeEightWayUpRight = [NSString stringWithFormat:@"0x%04X/0x%04X/%d-EightDirection", elementUsagePage, elementUsage, 1]; + NSString *elementCodeEightWayRight = [NSString stringWithFormat:@"0x%04X/0x%04X/%d-EightDirection", elementUsagePage, elementUsage, 2]; + NSString *elementCodeEightWayDownRight = [NSString stringWithFormat:@"0x%04X/0x%04X/%d-EightDirection", elementUsagePage, elementUsage, 3]; + NSString *elementCodeEightWayDown = [NSString stringWithFormat:@"0x%04X/0x%04X/%d-EightDirection", elementUsagePage, elementUsage, 4]; + NSString *elementCodeEightWayDownLeft = [NSString stringWithFormat:@"0x%04X/0x%04X/%d-EightDirection", elementUsagePage, elementUsage, 5]; + NSString *elementCodeEightWayLeft = [NSString stringWithFormat:@"0x%04X/0x%04X/%d-EightDirection", elementUsagePage, elementUsage, 6]; + NSString *elementCodeEightWayUpLeft = [NSString stringWithFormat:@"0x%04X/0x%04X/%d-EightDirection", elementUsagePage, elementUsage, 7]; + + if (logicalMax == 3) + { + switch (logicalValue) + { + case 0: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayUp altElementName:@"Hatswitch - Up" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + break; + + case 1: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayRight altElementName:@"Hatswitch - Right" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + break; + + case 2: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayDown altElementName:@"Hatswitch - Down" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + break; + + case 3: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayLeft altElementName:@"Hatswitch - Left" inputState:onState]]; + break; + + default: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeFourWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + break; + } + } + else if (logicalMax == 7) + { + if (useEightDirection) + { + switch (logicalValue) + { + case 0: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpRight altElementName:@"Hatswitch - Up/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownRight altElementName:@"Hatswitch - Down/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownLeft altElementName:@"Hatswitch - Down/Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpLeft altElementName:@"Hatswitch - Up/Left" inputState:offState]]; + break; + + case 1: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpRight altElementName:@"Hatswitch - Up/Right" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownRight altElementName:@"Hatswitch - Down/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownLeft altElementName:@"Hatswitch - Down/Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpLeft altElementName:@"Hatswitch - Up/Left" inputState:offState]]; + break; + + case 2: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpRight altElementName:@"Hatswitch - Up/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownRight altElementName:@"Hatswitch - Down/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownLeft altElementName:@"Hatswitch - Down/Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpLeft altElementName:@"Hatswitch - Up/Left" inputState:offState]]; + break; + + case 3: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpRight altElementName:@"Hatswitch - Up/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownRight altElementName:@"Hatswitch - Down/Right" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownLeft altElementName:@"Hatswitch - Down/Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpLeft altElementName:@"Hatswitch - Up/Left" inputState:offState]]; + break; + + case 4: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpRight altElementName:@"Hatswitch - Up/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownRight altElementName:@"Hatswitch - Down/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownLeft altElementName:@"Hatswitch - Down/Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpLeft altElementName:@"Hatswitch - Up/Left" inputState:offState]]; + break; + + case 5: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpRight altElementName:@"Hatswitch - Up/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownRight altElementName:@"Hatswitch - Down/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownLeft altElementName:@"Hatswitch - Down/Left" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpLeft altElementName:@"Hatswitch - Up/Left" inputState:offState]]; + break; + + case 6: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpRight altElementName:@"Hatswitch - Up/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownRight altElementName:@"Hatswitch - Down/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownLeft altElementName:@"Hatswitch - Down/Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpLeft altElementName:@"Hatswitch - Up/Left" inputState:offState]]; + break; + + case 7: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpRight altElementName:@"Hatswitch - Up/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownRight altElementName:@"Hatswitch - Down/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownLeft altElementName:@"Hatswitch - Down/Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpLeft altElementName:@"Hatswitch - Up/Left" inputState:onState]]; + break; + + default: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpRight altElementName:@"Hatswitch - Up/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownRight altElementName:@"Hatswitch - Down/Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDownLeft altElementName:@"Hatswitch - Down/Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUpLeft altElementName:@"Hatswitch - Up/Left" inputState:offState]]; + break; + } + } + else + { + switch (logicalValue) + { + case 0: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + break; + + case 1: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + break; + + case 2: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + break; + + case 3: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + break; + + case 4: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + break; + + case 5: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:onState]]; + break; + + case 6: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:onState]]; + break; + + case 7: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:onState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:onState]]; + break; + + default: + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayUp altElementName:@"Hatswitch - Up" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayRight altElementName:@"Hatswitch - Right" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayDown altElementName:@"Hatswitch - Down" inputState:offState]]; + [inputAttributesList addObject:[CocoaHIDDevice inputAttributesOfHIDValue:hidValueRef altElementCode:elementCodeEightWayLeft altElementName:@"Hatswitch - Left" inputState:offState]]; + break; + } + } + } + + return inputAttributesList; +} + ++ (BOOL) onStateFromHIDValue:(IOHIDValueRef)hidValueRef +{ + BOOL onState = NO; + + if (hidValueRef == nil) + { + return onState; + } + + IOHIDElementRef hidElementRef = IOHIDValueGetElement(hidValueRef); + NSInteger logicalValue = IOHIDValueGetIntegerValue(hidValueRef); + NSInteger logicalMin = IOHIDElementGetLogicalMin(hidElementRef); + NSInteger logicalMax = IOHIDElementGetLogicalMax(hidElementRef); + NSInteger lowerThreshold = ((logicalMax - logicalMin) / 4) + logicalMin; + NSInteger upperThreshold = (((logicalMax - logicalMin) * 3) / 4) + logicalMin; + + NSInteger elementType = IOHIDElementGetType(hidElementRef); + switch (elementType) + { + case kIOHIDElementTypeInput_Misc: + { + if (logicalMin == 0 && logicalMax == 1) + { + if (logicalValue == 1) + { + onState = YES; + } + } + else + { + if (logicalValue <= lowerThreshold || logicalValue >= upperThreshold) + { + onState = YES; + } + } + break; + } + + case kIOHIDElementTypeInput_Button: + { + if (logicalValue == 1) + { + onState = YES; + } + break; + } + + case kIOHIDElementTypeInput_Axis: + { + if (logicalMin == 0 && logicalMax == 1) + { + if (logicalValue == 1) + { + onState = YES; + } + } + else + { + if (logicalValue <= lowerThreshold || logicalValue >= upperThreshold) + { + onState = YES; + } + } + break; + } + + default: + break; + } + + return onState; +} + +@end + + +@implementation CocoaHIDManager + +@synthesize hidManagerRef; +@synthesize deviceList; +@synthesize runLoop; + +- (id)init +{ + self = [super init]; + if(self == nil) + { + return self; + } + + hidManagerRef = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); + if (hidManagerRef == NULL) + { + [self release]; + return nil; + } + + deviceList = [[NSMutableSet alloc] initWithCapacity:32]; + + CFMutableDictionaryRef cfJoystickMatcher = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(cfJoystickMatcher, CFSTR(kIOHIDDeviceUsagePageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDPage_GenericDesktop]); + CFDictionarySetValue(cfJoystickMatcher, CFSTR(kIOHIDDeviceUsageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDUsage_GD_Joystick]); + + CFMutableDictionaryRef cfGamepadMatcher = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(cfGamepadMatcher, CFSTR(kIOHIDDeviceUsagePageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDPage_GenericDesktop]); + CFDictionarySetValue(cfGamepadMatcher, CFSTR(kIOHIDDeviceUsageKey), (CFNumberRef)[NSNumber numberWithInteger:kHIDUsage_GD_GamePad]); + + NSArray *matcherArray = [NSArray arrayWithObjects:(NSMutableDictionary *)cfJoystickMatcher, (NSMutableDictionary *)cfGamepadMatcher, nil]; + + IOHIDManagerSetDeviceMatchingMultiple(hidManagerRef, (CFArrayRef)matcherArray); + + [self setRunLoop:[NSRunLoop currentRunLoop]]; + + IOReturn result = IOHIDManagerOpen(hidManagerRef, kIOHIDOptionsTypeNone); + if (result != kIOReturnSuccess) + { + [self release]; + return nil; + } + + return self; +} + +- (void)dealloc +{ + [self.deviceList release]; + + self.runLoop = nil; + + if (hidManagerRef != NULL) + { + IOHIDManagerClose(hidManagerRef, 0); + CFRelease(hidManagerRef); + hidManagerRef = NULL; + } + + [super dealloc]; +} + +- (void) setRunLoop:(NSRunLoop *)theRunLoop +{ + if (theRunLoop == nil && runLoop != nil) + { + IOHIDManagerRegisterDeviceMatchingCallback(hidManagerRef, NULL, NULL); + IOHIDManagerRegisterDeviceRemovalCallback(hidManagerRef, NULL, NULL); + IOHIDManagerUnscheduleFromRunLoop(hidManagerRef, [runLoop getCFRunLoop], kCFRunLoopDefaultMode); + [runLoop release]; + } + + runLoop = theRunLoop; + if (runLoop != nil) + { + [runLoop retain]; + IOHIDManagerScheduleWithRunLoop(hidManagerRef, [theRunLoop getCFRunLoop], kCFRunLoopDefaultMode); + IOHIDManagerRegisterDeviceMatchingCallback(hidManagerRef, HandleDeviceMatchingCallback, self); + IOHIDManagerRegisterDeviceRemovalCallback(hidManagerRef, HandleDeviceRemovalCallback, self); + } +} + +- (NSRunLoop *) runLoop +{ + return runLoop; +} + +@end + +void HandleDeviceMatchingCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef) +{ + CocoaHIDManager *hidManager = (CocoaHIDManager *)inContext; + CocoaHIDDevice *newDevice = [[[CocoaHIDDevice alloc] initWithDevice:inIOHIDDeviceRef] autorelease]; + [hidManager.deviceList addObject:newDevice]; + [newDevice start]; +} + +void HandleDeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef) +{ + CocoaHIDManager *hidManager = (CocoaHIDManager *)inContext; + + for (CocoaHIDDevice *hidDevice in hidManager.deviceList) + { + if (hidDevice.hidDeviceRef == inIOHIDDeviceRef) + { + [hidManager.deviceList removeObject:hidDevice]; + break; + } + } +} + +void HandleQueueValueAvailableCallback(void *inContext, IOReturn inResult, void *inSender) +{ + IOHIDQueueRef hidQueue = (IOHIDQueueRef)inSender; + NSMutableArray *inputAttributesList = nil; + + do + { + IOHIDValueRef hidValueRef = IOHIDQueueCopyNextValueWithTimeout(hidQueue, 0.0); + if (hidValueRef == NULL) + { + break; + } + + NSMutableArray *hatSwitchInput = [CocoaHIDDevice inputArrayFromHatSwitchValue:hidValueRef useEightDirection:NO]; + if (hatSwitchInput != nil) + { + inputAttributesList = hatSwitchInput; + } + else + { + inputAttributesList = [CocoaHIDDevice inputArrayFromHIDValue:hidValueRef]; + } + + // HID input devices don't register events, so we need to manually prevent + // sleep and screensaver whenever we detect an input. + UpdateSystemActivity(UsrActivity); + + [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"com.DeSmuME.DeSmuME.hidInputDetected" object:inputAttributesList userInfo:nil]; + + CFRelease(hidValueRef); + } while (1); +} diff --git a/desmume/src/cocoa/cocoa_input.h b/desmume/src/cocoa/cocoa_input.h new file mode 100644 index 000000000..fb346f006 --- /dev/null +++ b/desmume/src/cocoa/cocoa_input.h @@ -0,0 +1,89 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import +#include + +@class CocoaDSMic; + + +@interface CocoaDSInput : NSObject +{ + NSMutableDictionary *map; + NSString *deviceCode; + NSString *deviceName; +} + +@property (assign) NSMutableDictionary *map; +@property (assign) NSString *deviceCode; +@property (assign) NSString *deviceName; + +- (id) initWithDeviceCode:(NSString *)theCode name:(NSString *)theName; + +- (void) set:(NSString *)elementCode attributes:(NSDictionary *)mappingAttributes; +- (NSDictionary *) mappingByElementCode:(NSString *)elementCode; +- (void) removeByElementCode:(NSString *)elementCode; +- (void) removeMapping:(NSString *)mappingName; + ++ (NSDictionary *) dictionaryWithMappingAttributes:(NSString *)mappingName + useDeviceValues:(BOOL)useDeviceValues + xPoint:(CGFloat)xPoint + yPoint:(CGFloat)yPoint + integerValue:(NSInteger)integerValue + floatValue:(float)floatValue + data:(NSData *)data + selector:(NSString *)selectorString + paramType:(NSString *)paramTypeKey; + +@end + + +@interface CocoaDSController : NSObject +{ + NSMutableDictionary *states; + CocoaDSMic *cdsMic; + pthread_mutex_t *mutexControllerUpdate; + NSMutableDictionary *inputs; +} + +@property (assign) NSMutableDictionary *states; +@property (assign) CocoaDSMic *cdsMic; +@property (assign) NSMutableDictionary *inputs; +@property (readonly) pthread_mutex_t *mutexControllerUpdate; + +- (void) initDefaultMappings; +- (BOOL) initUserDefaultMappings; +- (void) initControllerMap; + +- (void) addMapping:(NSString *)controlName deviceInfo:(NSDictionary *)deviceInfo; + +- (BOOL) setStateWithInput:(NSDictionary *)inputAttributes; +- (BOOL) setStateWithMultipleInputs:(NSArray *)inputAttributesList; +- (NSDictionary *) mappingByEvent:(NSEvent *)event; +- (BOOL) updateController:(NSArray *)inputStates; + +- (NSDate *) inputTime:(NSString *)controlName; +- (bool) isInputPressed:(NSString *)controlName; +- (NSPoint) inputLocation:(NSString *)controlName; +- (unsigned char) inputSoundSample:(NSString *)controlName; + +- (void) setSoundInputMode:(NSInteger)inputMode; +- (void) update; +- (void) handleHIDInput:(NSNotification *)aNotification; + +@end diff --git a/desmume/src/cocoa/cocoa_input.mm b/desmume/src/cocoa/cocoa_input.mm new file mode 100644 index 000000000..d375a277f --- /dev/null +++ b/desmume/src/cocoa/cocoa_input.mm @@ -0,0 +1,648 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "cocoa_input.h" + +#import "cocoa_globals.h" +#import "cocoa_mic.h" + +#include "../NDSSystem.h" +#undef BOOL + + +@implementation CocoaDSInput + +@synthesize map; +@synthesize deviceCode; +@synthesize deviceName; + +- (id)init +{ + return [self initWithDeviceCode:nil name:nil]; +} + +- (id) initWithDeviceCode:(NSString *)theCode name:(NSString *)theName +{ + self = [super init]; + if (self == nil) + { + return self; + } + + map = [[NSMutableDictionary alloc] init]; + deviceCode = theCode; + deviceName = theName; + + if (theCode == nil) + { + deviceCode = [NSString stringWithFormat:@"0x%08X", rand()]; + } + + if (theName == nil) + { + deviceName = @"Unknown Device "; + deviceName = [deviceName stringByAppendingString:deviceCode]; + } + + return self; +} + +- (void)dealloc +{ + [self.map release]; + + [super dealloc]; +} + +- (void) set:(NSString *)elementCode attributes:(NSDictionary *)mappingAttributes +{ + NSString *keyString = [[self.deviceCode stringByAppendingString:@":"] stringByAppendingString:elementCode]; + [self.map setValue:mappingAttributes forKey:keyString]; +} + +- (NSDictionary *) mappingByElementCode:(NSString *)elementCode +{ + NSString *keyString = [[self.deviceCode stringByAppendingString:@":"] stringByAppendingString:elementCode]; + return [self.map valueForKey:keyString]; +} + +- (void) removeByElementCode:(NSString *)elementCode +{ + NSString *keyString = [[self.deviceCode stringByAppendingString:@":"] stringByAppendingString:elementCode]; + [self.map setValue:nil forKey:keyString]; +} + +- (void) removeMapping:(NSString *)mappingName +{ + NSArray *mapKeys = [self.map allKeys]; + for(NSString *key in mapKeys) + { + if ([(NSString *)[(NSDictionary *)[self.map valueForKey:key] valueForKey:@"name"] isEqual:mappingName]) + { + [self.map removeObjectForKey:key]; + } + } +} + ++ (NSDictionary *) dictionaryWithMappingAttributes:(NSString *)mappingName + useDeviceValues:(BOOL)useDeviceValues + xPoint:(CGFloat)xPoint + yPoint:(CGFloat)yPoint + integerValue:(NSInteger)integerValue + floatValue:(float)floatValue + data:(NSData *)data + selector:(NSString *)selectorString + paramType:(NSString *)paramTypeKey +{ + NSDictionary *attributes = nil; + + if (mappingName == nil) + { + return attributes; + } + + if (useDeviceValues) + { + attributes = [NSDictionary dictionaryWithObjectsAndKeys: + mappingName, @"name", + [NSNumber numberWithBool:useDeviceValues], @"useDeviceValues", + nil]; + } + else + { + NSData *tempData = data; + if (tempData == nil) + { + tempData = [NSData data]; + } + + attributes = [NSDictionary dictionaryWithObjectsAndKeys: + mappingName, @"name", + [NSNumber numberWithBool:useDeviceValues], @"useDeviceValues", + [NSNumber numberWithFloat:xPoint], @"xPoint", + [NSNumber numberWithFloat:yPoint], @"yPoint", + [NSNumber numberWithInteger:integerValue], @"integerValue", + [NSNumber numberWithFloat:floatValue], @"floatValue", + tempData, @"data", + selectorString, @"selector", + paramTypeKey, @"paramType", + nil]; + } + + return attributes; +} + +@end + +@implementation CocoaDSController + +@synthesize states; +@synthesize cdsMic; +@synthesize inputs; +@synthesize mutexControllerUpdate; + +- (id)init +{ + self = [super init]; + if (self == nil) + { + return self; + } + + mutexControllerUpdate = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); + pthread_mutex_init(mutexControllerUpdate, NULL); + + states = [[NSMutableDictionary alloc] init]; + cdsMic = [[CocoaDSMic alloc] init]; + inputs = [[NSMutableDictionary alloc] initWithCapacity:10]; + + [self initDefaultMappings]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleHIDInput:) + name:@"com.DeSmuME.DeSmuME.hidInputDetected" + object:nil]; + + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [self.states release]; + [self.cdsMic release]; + [self.inputs release]; + + pthread_mutex_destroy(self.mutexControllerUpdate); + free(self.mutexControllerUpdate); + mutexControllerUpdate = nil; + + [super dealloc]; +} + +- (void) initDefaultMappings +{ + [self initUserDefaultMappings]; + [self initControllerMap]; +} + +- (BOOL) initUserDefaultMappings +{ + BOOL didChange = NO; + + // Check to see if the DefaultKeyMappings.plist files exists. + NSDictionary *defaultMappings = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultKeyMappings" ofType:@"plist"]]; + if (defaultMappings == nil) + { + return didChange; + } + + // If the input mappings does not exist in the user's preferences file, then copy all the mappings from the + // DefaultKeyMappings.plist file to the preferences file. Then we're done. + NSDictionary *userMappings = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"]; + if (userMappings == nil) + { + [[NSUserDefaults standardUserDefaults] setObject:defaultMappings forKey:@"Input_ControllerMappings"]; + didChange = YES; + return didChange; + } + + // At this point, we need to check every key in the user's preference file and make sure that all the keys + // exist. The keys that must exist are all listed in the DefaultKeyMappings.plist file. + NSMutableDictionary *tempUserMappings = [NSMutableDictionary dictionaryWithDictionary:userMappings]; + + NSArray *inputKeys = [defaultMappings allKeys]; + for(NSString *inputString in inputKeys) + { + if ([tempUserMappings objectForKey:inputString] == nil) + { + [tempUserMappings setValue:[defaultMappings valueForKey:inputString] forKey:inputString]; + didChange = YES; + } + } + + // If we had to add a missing key, then we need to copy our temporary dictionary back to the + // user's preferences file. + if (didChange) + { + [[NSUserDefaults standardUserDefaults] setObject:tempUserMappings forKey:@"Input_ControllerMappings"]; + } + + // And we're done. + return didChange; +} + +- (void) initControllerMap +{ + NSDictionary *defaultMappings = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultKeyMappings" ofType:@"plist"]]; + if (defaultMappings == nil) + { + return; + } + + NSDictionary *userMappings = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"]; + if (userMappings == nil) + { + [self initUserDefaultMappings]; + } + + NSArray *controlNameList = [defaultMappings allKeys]; + for(NSString *controlName in controlNameList) + { + [self.states setValue:[NSMutableDictionary dictionaryWithCapacity:64] forKey:controlName]; + + NSArray *deviceInfoList = (NSArray *)[userMappings valueForKey:controlName]; + for(NSDictionary *deviceInfo in deviceInfoList) + { + [self addMapping:controlName deviceInfo:deviceInfo]; + } + } +} + +- (void) addMapping:(NSString *)controlName deviceInfo:(NSDictionary *)deviceInfo +{ + if (controlName == nil) + { + return; + } + + NSString *deviceCode = (NSString *)[deviceInfo valueForKey:@"deviceCode"]; + NSString *elementCode = (NSString *)[deviceInfo valueForKey:@"elementCode"]; + + if (deviceCode == nil || elementCode == nil) + { + return; + } + + NSDictionary *mappingAttributes = [CocoaDSInput dictionaryWithMappingAttributes:controlName + useDeviceValues:[(NSNumber *)[deviceInfo valueForKey:@"useDeviceValues"] boolValue] + xPoint:[(NSNumber *)[deviceInfo valueForKey:@"xPoint"] floatValue] + yPoint:[(NSNumber *)[deviceInfo valueForKey:@"yPoint"] floatValue] + integerValue:[(NSNumber *)[deviceInfo valueForKey:@"integerValue"] integerValue] + floatValue:[(NSNumber *)[deviceInfo valueForKey:@"floatValue"] floatValue] + data:(NSData *)[deviceInfo valueForKey:@"data"] + selector:(NSString *)[deviceInfo valueForKey:@"selector"] + paramType:(NSString *)[deviceInfo valueForKey:@"paramType"]]; + + if (mappingAttributes == nil) + { + return; + } + + CocoaDSInput *input = (CocoaDSInput *)[self.inputs valueForKey:deviceCode]; + if (input == nil) + { + NSString *deviceName = (NSString *)[deviceInfo valueForKey:@"deviceName"]; + if (deviceName == nil) + { + deviceName = deviceCode; + } + + input = [[CocoaDSInput alloc] initWithDeviceCode:deviceCode name:deviceName]; + [self.inputs setValue:input forKey:deviceCode]; + } + + [input set:elementCode attributes:mappingAttributes]; +} + +- (BOOL) setStateWithInput:(NSDictionary *)inputAttributes +{ + BOOL inputChanged = NO; + + if (inputAttributes == nil) + { + return inputChanged; + } + + NSMutableArray *attributesList = [NSMutableArray arrayWithObject:inputAttributes]; + + return [self setStateWithMultipleInputs:attributesList]; +} + +- (BOOL) setStateWithMultipleInputs:(NSArray *)inputAttributesList +{ + BOOL inputChanged = NO; + NSMutableArray *inputStates = [NSMutableArray arrayWithCapacity:8]; + + if (inputAttributesList == nil || [inputAttributesList count] <= 0) + { + return inputChanged; + } + + for (NSDictionary *attr in inputAttributesList) + { + NSString *deviceCode = (NSString *)[attr valueForKey:@"deviceCode"]; + if (deviceCode == nil) + { + continue; + } + + NSString *elementCode = (NSString *)[attr valueForKey:@"elementCode"]; + if (elementCode == nil) + { + continue; + } + + CocoaDSInput *input = (CocoaDSInput *)[self.inputs valueForKey:deviceCode]; + if (input == nil) + { + continue; + } + + NSDictionary *mappingAttributes = [input mappingByElementCode:elementCode]; + if (mappingAttributes == nil) + { + continue; + } + + NSString *controlName = (NSString *)[mappingAttributes valueForKey:@"name"]; + if (controlName == nil) + { + continue; + } + + NSMutableDictionary *inputState = [NSMutableDictionary dictionaryWithObjectsAndKeys: + controlName, @"name", + [attr valueForKey:@"on"], @"on", + nil]; + + NSNumber *xPointNumber = nil; + NSNumber *yPointNumber = nil; + NSNumber *integerNumber = nil; + NSNumber *floatNumber = nil; + NSData *inputData = nil; + NSString *selectorString = nil; + NSString *paramTypeKey = nil; + + NSNumber *useDeviceValuesNumber = (NSNumber *)[mappingAttributes valueForKey:@"useDeviceValues"]; + if (useDeviceValuesNumber == nil || ![useDeviceValuesNumber boolValue]) // Not reading from device values, use values from mapping attributes + { + xPointNumber = (NSNumber *)[mappingAttributes valueForKey:@"pointX"]; + yPointNumber = (NSNumber *)[mappingAttributes valueForKey:@"pointY"]; + integerNumber = (NSNumber *)[mappingAttributes valueForKey:@"integerValue"]; + floatNumber = (NSNumber *)[mappingAttributes valueForKey:@"floatValue"]; + inputData = (NSData *)[mappingAttributes valueForKey:@"data"]; + selectorString = (NSString *)[mappingAttributes valueForKey:@"selector"]; + paramTypeKey = (NSString *)[mappingAttributes valueForKey:@"paramType"]; + } + else // Reading from device values, use values from input attributes + { + xPointNumber = (NSNumber *)[attr valueForKey:@"pointX"]; + yPointNumber = (NSNumber *)[attr valueForKey:@"pointY"]; + integerNumber = (NSNumber *)[attr valueForKey:@"integerValue"]; + floatNumber = (NSNumber *)[attr valueForKey:@"floatValue"]; + inputData = (NSData *)[attr valueForKey:@"data"]; + } + + if (xPointNumber == nil) + { + xPointNumber = [NSNumber numberWithFloat:0.0f]; + } + + if (yPointNumber == nil) + { + yPointNumber = [NSNumber numberWithFloat:0.0f]; + } + + if (integerNumber == nil) + { + integerNumber = [NSNumber numberWithInteger:0]; + } + + if (floatNumber == nil) + { + floatNumber = [NSNumber numberWithFloat:0.0f]; + } + + [inputState setValue:xPointNumber forKey:@"pointX"]; + [inputState setValue:yPointNumber forKey:@"pointY"]; + [inputState setValue:integerNumber forKey:@"integerValue"]; + [inputState setValue:floatNumber forKey:@"floatValue"]; + [inputState setValue:inputData forKey:@"data"]; + + [inputStates addObject:inputState]; + } + + inputChanged = [self updateController:inputStates]; + + return inputChanged; +} + +- (NSDictionary *) mappingByEvent:(NSEvent *)event +{ + CocoaDSInput *input = nil; + NSString *elementCode = nil; + NSEventType eventType = [event type]; + + switch (eventType) + { + case NSKeyDown: + case NSKeyUp: + input = (CocoaDSInput *)[self.inputs valueForKey:@"NSEventKeyboard"]; + elementCode = [NSString stringWithFormat:@"%d", [event keyCode]]; + break; + + case NSLeftMouseDown: + case NSRightMouseDown: + case NSOtherMouseDown: + case NSLeftMouseUp: + case NSRightMouseUp: + case NSOtherMouseUp: + case NSLeftMouseDragged: + case NSRightMouseDragged: + case NSOtherMouseDragged: + input = (CocoaDSInput *)[self.inputs valueForKey:@"NSEventMouse"]; + elementCode = [NSString stringWithFormat:@"%i", [event buttonNumber]]; + break; + + default: + break; + } + + return [input mappingByElementCode:elementCode]; +} + +- (BOOL) updateController:(NSArray *)inputStates +{ + BOOL result = NO; + + if (inputStates == nil) + { + return result; + } + + pthread_mutex_lock(self.mutexControllerUpdate); + + for (NSDictionary *iState in inputStates) + { + NSString *controlName = (NSString *)[iState valueForKey:@"name"]; + if (controlName == nil) + { + continue; + } + + NSMutableDictionary *controlState = (NSMutableDictionary *)[self.states valueForKey:controlName]; + [controlState setDictionary:iState]; + [controlState setValue:[NSDate date] forKey:@"time"]; + + result = YES; + } + + pthread_mutex_unlock(self.mutexControllerUpdate); + + return result; +} + +- (NSDate *) inputTime:(NSString *)controlName +{ + NSDate *inputTime = nil; + + NSMutableDictionary *properties = [self.states objectForKey:controlName]; + inputTime = [properties objectForKey:@"time"]; + if (inputTime == nil) + { + return inputTime; + } + + return inputTime; +} + +- (bool) isInputPressed:(NSString *)controlName +{ + bool result = false; + + NSMutableDictionary *controlState = (NSMutableDictionary *)[self.states valueForKey:controlName]; + NSNumber *pressValue = (NSNumber *)[controlState valueForKey:@"on"]; + if (pressValue == nil) + { + return result; + } + + result = [pressValue boolValue]; + + return result; +} + +- (NSPoint) inputLocation:(NSString *)controlName +{ + NSPoint outPoint = {0.0f, 0.0f}; + NSMutableDictionary *properties = [self.states objectForKey:controlName]; + + NSNumber *xValue = [properties objectForKey:@"pointX"]; + if (xValue != nil) + { + outPoint.x = [xValue floatValue]; + } + + NSNumber *yValue = [properties objectForKey:@"pointY"]; + if (yValue != nil) + { + outPoint.y = [yValue floatValue]; + } + + return outPoint; +} + +- (unsigned char) inputSoundSample:(NSString *)controlName +{ + unsigned char sampleValue = 0; + + NSMutableDictionary *properties = [self.states objectForKey:controlName]; + NSNumber *sampleValueObj = [properties objectForKey:@"Sound Sample"]; + if (sampleValueObj == nil) + { + return sampleValue; + } + + sampleValue = [sampleValueObj unsignedCharValue]; + + return sampleValue; +} + +- (void) setSoundInputMode:(NSInteger)inputMode +{ + self.cdsMic.mode = inputMode; +} + +- (void) update +{ + pthread_mutex_lock(self.mutexControllerUpdate); + + // Setup the DS pad. + NDS_setPad([self isInputPressed:@"Right"], + [self isInputPressed:@"Left"], + [self isInputPressed:@"Down"], + [self isInputPressed:@"Up"], + [self isInputPressed:@"Select"], + [self isInputPressed:@"Start"], + [self isInputPressed:@"B"], + [self isInputPressed:@"A"], + [self isInputPressed:@"Y"], + [self isInputPressed:@"X"], + [self isInputPressed:@"L"], + [self isInputPressed:@"R"], + [self isInputPressed:@"Debug"], + [self isInputPressed:@"Lid"]); + + // Setup the DS touch pad. + if ([self isInputPressed:@"Touch"]) + { + NSPoint touchLocation = [self inputLocation:@"Touch"]; + NDS_setTouchPos((u16)touchLocation.x, (u16)touchLocation.y); + } + else + { + NDS_releaseTouch(); + } + + // Setup the DS mic. + bool isMicPressed = [self isInputPressed:@"Microphone"]; + NDS_setMic(isMicPressed); + + pthread_mutex_unlock(self.mutexControllerUpdate); + + if (isMicPressed) + { + if (self.cdsMic.mode == MICMODE_NONE) + { + [self.cdsMic fillWithNullSamples]; + } + else if (self.cdsMic.mode == MICMODE_INTERNAL_NOISE) + { + [self.cdsMic fillWithInternalNoise]; + } + else if (self.cdsMic.mode == MICMODE_WHITE_NOISE) + { + [self.cdsMic fillWithWhiteNoise]; + } + else if (self.cdsMic.mode == MICMODE_SOUND_FILE) + { + // TODO: Need to implement. Does nothing for now. + } + } +} + +- (void) handleHIDInput:(NSNotification *)aNotification +{ + NSArray *inputPropertiesList = (NSArray *)[aNotification object]; + + [self setStateWithMultipleInputs:inputPropertiesList]; +} + +@end diff --git a/desmume/src/cocoa/cocoa_mic.h b/desmume/src/cocoa/cocoa_mic.h new file mode 100644 index 000000000..5987a5b16 --- /dev/null +++ b/desmume/src/cocoa/cocoa_mic.h @@ -0,0 +1,63 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import + + +#define NUM_INTERNAL_NOISE_SAMPLES 32 + +static const UInt8 noiseSample[NUM_INTERNAL_NOISE_SAMPLES] = +{ + 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8E, 0xFF, + 0xF4, 0xE1, 0xBF, 0x9A, 0x71, 0x58, 0x5B, 0x5F, 0x62, 0xC2, 0x25, 0x05, 0x01, 0x01, 0x01, 0x01 +}; + +@interface CocoaDSMic : NSObject +{ + UInt8 *buffer; + UInt8 *readPosition; + UInt8 *writePosition; + NSUInteger fillCount; + BOOL needsActivate; + NSInteger mode; + + NSUInteger internalSamplePosition; +} + +@property (readonly) UInt8 *buffer; +@property (readonly) UInt8 *readPosition; +@property (readonly) UInt8 *writePosition; +@property (readonly) NSUInteger fillCount; +@property (assign) BOOL needsActivate; +@property (assign) NSInteger mode; + +- (void) clear; +- (NSUInteger) fillCountRemaining; +- (BOOL) isFull; +- (BOOL) isEmpty; +- (UInt8) read; +- (void) write:(UInt8)theSample; +- (UInt8) generateInternalNoiseSample; +- (UInt8) generateWhiteNoiseSample; +- (void) fillWithNullSamples; +- (void) fillWithInternalNoise; +- (void) fillWithWhiteNoise; ++ (CocoaDSMic *) masterMic; ++ (void) setMasterMic:(CocoaDSMic *)theMic; + +@end diff --git a/desmume/src/cocoa/cocoa_mic.mm b/desmume/src/cocoa/cocoa_mic.mm new file mode 100644 index 000000000..fc4e34d05 --- /dev/null +++ b/desmume/src/cocoa/cocoa_mic.mm @@ -0,0 +1,251 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "cocoa_mic.h" +#import "cocoa_globals.h" + +#include "../NDSSystem.h" +#undef BOOL + +static CocoaDSMic *masterMic = nil; + +@implementation CocoaDSMic + +@synthesize buffer; +@synthesize readPosition; +@synthesize writePosition; +@synthesize fillCount; +@synthesize needsActivate; +@synthesize mode; + +- (id)init +{ + self = [super init]; + if (self == nil) + { + return self; + } + + UInt8 *newBuffer = (UInt8 *)malloc(MIC_BUFFER_SIZE); + if (newBuffer == nil) + { + [self release]; + return nil; + } + + buffer = newBuffer; + [self clear]; + + internalSamplePosition = 0; + needsActivate = YES; + mode = MICMODE_NONE; + + [CocoaDSMic setMasterMic:self]; + + return self; +} + +- (void)dealloc +{ + if ([CocoaDSMic masterMic] == self) + { + [CocoaDSMic setMasterMic:nil]; + } + + free(buffer); + buffer = NULL; + + [super dealloc]; +} + +- (void) mode:(NSInteger)theMode +{ + switch (theMode) + { + case MICMODE_NONE: + self.needsActivate = YES; + break; + + case MICMODE_INTERNAL_NOISE: + self.needsActivate = YES; + break; + + case MICMODE_SOUND_FILE: + self.needsActivate = YES; + break; + + case MICMODE_WHITE_NOISE: + self.needsActivate = YES; + break; + + case MICMODE_PHYSICAL: + self.needsActivate = NO; + break; + + default: + break; + } +} + +- (void) clear +{ + memset(buffer, MIC_NULL_SAMPLE_VALUE, MIC_BUFFER_SIZE); + readPosition = buffer; + writePosition = buffer; + fillCount = 0; +} + +- (NSUInteger) fillCountRemaining +{ + return (MIC_MAX_BUFFER_SAMPLES - self.fillCount); +} + +- (BOOL) isFull +{ + return (self.fillCount >= MIC_MAX_BUFFER_SAMPLES); +} + +- (BOOL) isEmpty +{ + return (self.fillCount == 0); +} + +- (UInt8) read +{ + UInt8 theSample = MIC_NULL_SAMPLE_VALUE; + + bool isMicActive = NDS_getFinalUserInput().mic.micButtonPressed; + if ([self isEmpty] || (self.needsActivate && !isMicActive)) + { + return theSample; + } + + theSample = *readPosition; + readPosition++; + fillCount--; + + // Move the pointer back to start if we reach the end of the memory block. + if (readPosition >= (buffer + MIC_BUFFER_SIZE)) + { + readPosition = buffer; + } + + return theSample; +} + +- (void) write:(UInt8)theSample +{ + if ([self isFull]) + { + return; + } + + *writePosition = theSample; + writePosition++; + fillCount++; + + // Move the pointer back to start if we reach the end of the memory block. + if (writePosition >= (buffer + MIC_BUFFER_SIZE)) + { + writePosition = buffer; + } +} + +- (UInt8) generateInternalNoiseSample +{ + internalSamplePosition++; + if (internalSamplePosition >= NUM_INTERNAL_NOISE_SAMPLES) + { + internalSamplePosition = 0; + } + + return noiseSample[internalSamplePosition]; +} + +- (UInt8) generateWhiteNoiseSample +{ + return (UInt8)(rand() & 0xFF); +} + +- (void) fillWithNullSamples +{ + while (self.fillCount < MIC_MAX_BUFFER_SAMPLES) + { + [self write:MIC_NULL_SAMPLE_VALUE]; + } +} + +- (void) fillWithInternalNoise +{ + while (self.fillCount < MIC_MAX_BUFFER_SAMPLES) + { + [self write:[self generateInternalNoiseSample]]; + } +} + +- (void) fillWithWhiteNoise +{ + while (self.fillCount < MIC_MAX_BUFFER_SAMPLES) + { + [self write:[self generateWhiteNoiseSample]]; + } +} + ++ (CocoaDSMic *) masterMic +{ + return masterMic; +} + ++ (void) setMasterMic:(CocoaDSMic *)theMic +{ + masterMic = theMic; +} + +@end + +BOOL Mic_Init() +{ + // Do nothing. The CocoaDSMic object will take care of this. + return TRUE; +} + +void Mic_Reset() +{ + // Do nothing. +} + +void Mic_DeInit() +{ + // Do nothing. The CocoaDSMic object will take care of this. +} + +u8 Mic_ReadSample() +{ + return [masterMic read]; +} + +void mic_savestate(EMUFILE* os) +{ + write32le(-1, os); +} + +bool mic_loadstate(EMUFILE* is, int size) +{ + is->fseek(size, SEEK_CUR); + return true; +} diff --git a/desmume/src/cocoa/cocoa_output.h b/desmume/src/cocoa/cocoa_output.h new file mode 100644 index 000000000..09927af1b --- /dev/null +++ b/desmume/src/cocoa/cocoa_output.h @@ -0,0 +1,207 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import +#include +#include + +#import "cocoa_util.h" + + +@interface CocoaDSOutput : CocoaDSThread +{ + BOOL isStateChanged; + NSUInteger frameCount; + NSData *frameData; + NSMutableDictionary *property; + + pthread_mutex_t *mutexOutputFrame; +} + +@property (assign) BOOL isStateChanged; +@property (assign) NSUInteger frameCount; +@property (assign) NSData *frameData; +@property (assign) NSMutableDictionary *property; +@property (readonly) pthread_mutex_t *mutexOutputFrame; + +- (void) doCoreEmuFrame; +- (void) handleEmuFrameProcessed:(NSData *)theData; + +@end + +@interface CocoaDSSpeaker : CocoaDSOutput +{ + NSUInteger bufferSize; + + OSSpinLock spinlockAudioOutputEngine; + OSSpinLock spinlockVolume; + OSSpinLock spinlockSpuAdvancedLogic; + OSSpinLock spinlockSpuInterpolationMode; + OSSpinLock spinlockSpuSyncMode; + OSSpinLock spinlockSpuSyncMethod; +} + +@property (assign) NSUInteger bufferSize; + +- (id) init; +- (id) initWithVolume:(CGFloat)vol; +- (void) dealloc; + ++ (BOOL) startupSPU; ++ (void) shutdownSPU; ++ (BOOL) isSPUStarted; + +- (void) setVolume:(float)vol; +- (float) volume; +- (void) setAudioOutputEngine:(NSInteger)methodID; +- (NSInteger) audioOutputEngine; +- (void) setSpuAdvancedLogic:(BOOL)state; +- (BOOL) spuAdvancedLogic; +- (void) setSpuInterpolationMode:(NSInteger)modeID; +- (NSInteger) spuInterpolationMode; +- (void) setSpuSyncMode:(NSInteger)modeID; +- (NSInteger) spuSyncMode; +- (void) setSpuSyncMethod:(NSInteger)methodID; +- (NSInteger) spuSyncMethod; + +- (BOOL) mute; +- (void) setMute:(BOOL)mute; +- (NSInteger) filter; +- (void) setFilter:(NSInteger)filter; +- (void) handleSetVolume:(NSData *)volumeData; +- (void) handleSetAudioOutputEngine:(NSData *)methodIdData; +- (void) handleSetSpuAdvancedLogic:(NSData *)stateData; +- (void) handleSetSpuSyncMode:(NSData *)modeIdData; +- (void) handleSetSpuSyncMethod:(NSData *)methodIdData; +- (void) handleSetSpuInterpolationMode:(NSData *)modeIdData; + +@end + +@class CocoaVideoFilter; + +@protocol CocoaDSDisplayDelegate + +@required +- (void) doInitVideoOutput:(NSDictionary *)properties; +- (void) doProcessVideoFrame:(const void *)videoFrameData frameSize:(NSSize)frameSize; + +@property (assign) NSPort *sendPortDisplay; + +@optional +- (void) doResizeView:(NSRect)rect; +- (void) doRedraw; +- (void) doDisplayTypeChanged:(NSInteger)displayTypeID; +- (void) doBilinearOutputChanged:(BOOL)useBilinear; +- (void) doVideoFilterChanged:(NSInteger)videoFilterTypeID; + +@property (assign) BOOL isHudEnabled; +@property (assign) BOOL isHudEditingModeEnabled; + +@end + + +@interface CocoaDSDisplay : CocoaDSOutput +{ + UInt32 gpuStateFlags; + id delegate; + NSInteger displayType; + CocoaVideoFilter *vf; + + pthread_mutex_t *mutexRender3D; + OSSpinLock spinlockGpuState; + OSSpinLock spinlockDisplayType; + OSSpinLock spinlockVideoFilterType; + OSSpinLock spinlockVfSrcBuffer; + OSSpinLock spinlockRender3DRenderingEngine; + OSSpinLock spinlockRender3DHighPrecisionColorInterpolation; + OSSpinLock spinlockRender3DEdgeMarking; + OSSpinLock spinlockRender3DFog; + OSSpinLock spinlockRender3DTextures; + OSSpinLock spinlockRender3DDepthComparisonThreshold; + OSSpinLock spinlockRender3DThreads; + OSSpinLock spinlockRender3DLineHack; +} + +@property (assign) UInt32 gpuStateFlags; +@property (assign) id delegate; +@property (assign) NSInteger displayType; +@property (assign) CocoaVideoFilter *vf; +@property (readonly) pthread_mutex_t *mutexRender3D; + +- (void) setRender3DRenderingEngine:(NSInteger)methodID; +- (NSInteger) render3DRenderingEngine; +- (void) setRender3DHighPrecisionColorInterpolation:(BOOL)state; +- (BOOL) render3DHighPrecisionColorInterpolation; +- (void) setRender3DEdgeMarking:(BOOL)state; +- (BOOL) render3DEdgeMarking; +- (void) setRender3DFog:(BOOL)state; +- (BOOL) render3DFog; +- (void) setRender3DTextures:(BOOL)state; +- (BOOL) render3DTextures; +- (void) setRender3DDepthComparisonThreshold:(NSUInteger)threshold; +- (NSUInteger) render3DDepthComparisonThreshold; +- (void) setRender3DThreads:(NSUInteger)numberThreads; +- (NSUInteger) render3DThreads; +- (void) setRender3DLineHack:(BOOL)state; +- (BOOL) render3DLineHack; + +- (void) handleResizeView:(NSData *)rectData; +- (void) handleRedrawView; +- (void) handleChangeGpuStateFlags:(NSData *)flagsData; +- (void) handleChangeDisplayType:(NSData *)displayTypeIdData; +- (void) handleChangeBilinearOutput:(NSData *)bilinearStateData; +- (void) handleChangeVideoFilter:(NSData *)videoFilterTypeIdData; +- (void) handleSetRender3DRenderingEngine:(NSData *)methodIdData; +- (void) handleSetRender3DHighPrecisionColorInterpolation:(NSData *)stateData; +- (void) handleSetRender3DEdgeMarking:(NSData *)stateData; +- (void) handleSetRender3DFog:(NSData *)stateData; +- (void) handleSetRender3DTextures:(NSData *)stateData; +- (void) handleSetRender3DDepthComparisonThreshold:(NSData *)thresholdData; +- (void) handleSetRender3DThreads:(NSData *)numberThreadsData; +- (void) handleSetRender3DLineHack:(NSData *)stateData; +- (void) handleSetViewToBlack; +- (void) handleSetViewToWhite; +- (void) handleRequestScreenshot:(NSData *)fileURLStringData fileTypeData:(NSData *)fileTypeData; +- (void) handleCopyToPasteboard; + +- (NSImage *) image; +- (NSBitmapImageRep *) bitmapImageRep; + +- (BOOL) gpuStateByBit:(UInt32)stateBit; +- (BOOL) isGPUTypeDisplayed:(NSInteger)theGpuType; +- (void) hideGPUType:(NSInteger)theGpuType; +- (void) showGPUType:(NSInteger)theGpuType; + +@end + +#ifdef __cplusplus +extern "C" +{ +#endif + +bool opengl_init(); + +void HandleMessageEchoResponse(NSPortMessage *portMessage); +void SetGPULayerState(int displayType, unsigned int i, bool state); +bool GetGPULayerState(int displayType, unsigned int i); +void SetGPUDisplayState(int displayType, bool state); +bool GetGPUDisplayState(int displayType); + +#ifdef __cplusplus +} +#endif diff --git a/desmume/src/cocoa/cocoa_output.mm b/desmume/src/cocoa/cocoa_output.mm new file mode 100644 index 000000000..dbf6095c3 --- /dev/null +++ b/desmume/src/cocoa/cocoa_output.mm @@ -0,0 +1,1723 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "cocoa_output.h" +#import "cocoa_globals.h" +#import "cocoa_videofilter.h" +#import "cocoa_util.h" + +#include +#include "sndOSX.h" + +#include "../NDSSystem.h" +#include "../GPU.h" +#include "../OGLRender.h" +#include "../rasterize.h" +#include "../SPU.h" +#include "../metaspu/metaspu.h" + +#undef BOOL + +GPU3DInterface *core3DList[] = { + &gpu3DNull, + &gpu3DRasterize, + //&gpu3Dgl, + NULL +}; + +SoundInterface_struct *SNDCoreList[] = { + &SNDDummy, + &SNDOSX, + NULL +}; + +@implementation CocoaDSOutput + +@synthesize isStateChanged; +@synthesize frameCount; +@synthesize frameData; +@synthesize property; +@synthesize mutexOutputFrame; + +- (id)init +{ + self = [super init]; + if (self == nil) + { + return self; + } + + isStateChanged = NO; + frameCount = 0; + frameData = nil; + + property = [[NSMutableDictionary alloc] init]; + [property setValue:[NSDate date] forKey:@"outputTime"]; + + mutexOutputFrame = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); + pthread_mutex_init(mutexOutputFrame, NULL); + + return self; +} + +- (void)dealloc +{ + // Exit the thread. + if (self.thread != nil) + { + self.threadExit = YES; + + // Wait until the thread has shut down. + while (self.thread != nil) + { + [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; + } + } + + [frameData release]; + [property release]; + + pthread_mutex_destroy(mutexOutputFrame); + free(mutexOutputFrame); + mutexOutputFrame = nil; + + [super dealloc]; +} + +- (void) doCoreEmuFrame +{ + [CocoaDSUtil messageSendOneWay:self.receivePort msgID:MESSAGE_EMU_FRAME_PROCESSED]; +} + +- (void)handlePortMessage:(NSPortMessage *)portMessage +{ + NSInteger message = (NSInteger)[portMessage msgid]; + NSArray *messageComponents = [portMessage components]; + + switch (message) + { + case MESSAGE_EMU_FRAME_PROCESSED: + [self handleEmuFrameProcessed:[messageComponents objectAtIndex:0]]; + break; + + default: + [super handlePortMessage:portMessage]; + break; + } +} + +- (void) handleEmuFrameProcessed:(NSData *)theData +{ + self.frameCount++; + + if (self.frameData != theData) + { + [self.frameData release]; + self.frameData = theData; + [self.frameData retain]; + } +} + +@end + +@implementation CocoaDSSpeaker + +@synthesize bufferSize; + +static BOOL isSPUStarted = NO; + +- (id)init +{ + return [self initWithVolume:MAX_VOLUME]; +} + +- (id) initWithVolume:(CGFloat)vol +{ + self = [super init]; + if (self == nil) + { + return self; + } + + spinlockAudioOutputEngine = OS_SPINLOCK_INIT; + spinlockVolume = OS_SPINLOCK_INIT; + spinlockSpuAdvancedLogic = OS_SPINLOCK_INIT; + spinlockSpuInterpolationMode = OS_SPINLOCK_INIT; + spinlockSpuSyncMode = OS_SPINLOCK_INIT; + spinlockSpuSyncMethod = OS_SPINLOCK_INIT; + + bufferSize = 0; + + // Set up properties. + [property setValue:[NSNumber numberWithFloat:(float)vol] forKey:@"volume"]; + [property setValue:[NSNumber numberWithBool:NO] forKey:@"mute"]; + [property setValue:[NSNumber numberWithInteger:0] forKey:@"filter"]; + [property setValue:[NSNumber numberWithInteger:SNDCORE_OSX] forKey:@"audioOutputEngine"]; + [property setValue:[NSNumber numberWithBool:NO] forKey:@"spuAdvancedLogic"]; + [property setValue:[NSNumber numberWithInteger:SPUInterpolation_None] forKey:@"spuInterpolationMode"]; + [property setValue:[NSNumber numberWithInteger:SPU_SYNC_MODE_DUAL_SYNC_ASYNC] forKey:@"spuSyncMode"]; + [property setValue:[NSNumber numberWithInteger:SPU_SYNC_METHOD_N] forKey:@"spuSyncMethod"]; + + return self; +} + +- (void)dealloc +{ + [super dealloc]; +} + ++ (BOOL) startupSPU +{ + NSInteger result = -1; + + if (isSPUStarted) + { + return isSPUStarted; + } + + SNDOSXStartup(); + + result = SPU_ChangeSoundCore(SNDCORE_OSX, (int)SPU_BUFFER_BYTES); + if(result == -1) + { + SPU_ChangeSoundCore(SNDCORE_DUMMY, 0); + isSPUStarted = NO; + return isSPUStarted; + } + + SPU_SetVolume(0); + isSPUStarted = YES; + + return isSPUStarted; +} + ++ (void) shutdownSPU +{ + SPU_ChangeSoundCore(SNDCORE_DUMMY, 0); + SNDOSXShutdown(); + isSPUStarted = NO; +} + ++ (BOOL) isSPUStarted +{ + return isSPUStarted; +} + +- (void) setVolume:(float)vol +{ + if (vol < 0.0f) + { + vol = 0.0f; + } + else if (vol > MAX_VOLUME) + { + vol = MAX_VOLUME; + } + + OSSpinLockLock(&spinlockVolume); + [property setValue:[NSNumber numberWithFloat:vol] forKey:@"volume"]; + OSSpinLockUnlock(&spinlockVolume); + + if (isSPUStarted) + { + //pthread_mutex_lock(self.mutexOutputFrame); + SPU_SetVolume((int)vol); + //pthread_mutex_unlock(self.mutexOutputFrame); + } +} + +- (float) volume +{ + OSSpinLockLock(&spinlockVolume); + float vol = [(NSNumber *)[property valueForKey:@"volume"] floatValue]; + OSSpinLockUnlock(&spinlockVolume); + + return vol; +} + +- (void) setAudioOutputEngine:(NSInteger)methodID +{ + OSSpinLockLock(&spinlockAudioOutputEngine); + [property setValue:[NSNumber numberWithInteger:methodID] forKey:@"audioOutputEngine"]; + OSSpinLockUnlock(&spinlockAudioOutputEngine); + + pthread_mutex_lock(self.mutexOutputFrame); + + NSInteger result = -1; + switch (methodID) + { + case SNDCORE_OSX: + result = SPU_ChangeSoundCore(methodID, (int)SPU_BUFFER_BYTES); + break; + + default: + SPU_ChangeSoundCore(SNDCORE_DUMMY, 0); + break; + } + + if(result == -1) + { + SPU_ChangeSoundCore(SNDCORE_DUMMY, 0); + } + + pthread_mutex_unlock(self.mutexOutputFrame); + + // Force the volume back to it's original setting. + [self setVolume:[self volume]]; +} + +- (NSInteger) audioOutputEngine +{ + OSSpinLockLock(&spinlockAudioOutputEngine); + NSInteger methodID = [(NSNumber *)[property valueForKey:@"audioOutputEngine"] integerValue]; + OSSpinLockUnlock(&spinlockAudioOutputEngine); + + return methodID; +} + +- (void) setSpuAdvancedLogic:(BOOL)state +{ + OSSpinLockLock(&spinlockSpuAdvancedLogic); + [property setValue:[NSNumber numberWithBool:state] forKey:@"spuAdvancedLogic"]; + OSSpinLockUnlock(&spinlockSpuAdvancedLogic); + + pthread_mutex_lock(self.mutexOutputFrame); + CommonSettings.spu_advanced = state; + pthread_mutex_unlock(self.mutexOutputFrame); +} + +- (BOOL) spuAdvancedLogic +{ + OSSpinLockLock(&spinlockSpuAdvancedLogic); + BOOL state = [(NSNumber *)[property valueForKey:@"spuAdvancedLogic"] boolValue]; + OSSpinLockUnlock(&spinlockSpuAdvancedLogic); + + return state; +} + +- (void) setSpuInterpolationMode:(NSInteger)modeID +{ + OSSpinLockLock(&spinlockSpuInterpolationMode); + [property setValue:[NSNumber numberWithInteger:modeID] forKey:@"spuInterpolationMode"]; + OSSpinLockUnlock(&spinlockSpuInterpolationMode); + + pthread_mutex_lock(self.mutexOutputFrame); + CommonSettings.spuInterpolationMode = (SPUInterpolationMode)modeID; + pthread_mutex_unlock(self.mutexOutputFrame); +} + +- (NSInteger) spuInterpolationMode +{ + OSSpinLockLock(&spinlockSpuInterpolationMode); + NSInteger modeID = [(NSNumber *)[property valueForKey:@"spuInterpolationMode"] integerValue]; + OSSpinLockUnlock(&spinlockSpuInterpolationMode); + + return modeID; +} + +- (void) setSpuSyncMode:(NSInteger)modeID +{ + OSSpinLockLock(&spinlockSpuSyncMode); + [property setValue:[NSNumber numberWithInteger:modeID] forKey:@"spuSyncMode"]; + OSSpinLockUnlock(&spinlockSpuSyncMode); + + NSInteger methodID = [self spuSyncMethod]; + + pthread_mutex_lock(self.mutexOutputFrame); + SPU_SetSynchMode(modeID, methodID); + pthread_mutex_unlock(self.mutexOutputFrame); +} + +- (NSInteger) spuSyncMode +{ + OSSpinLockLock(&spinlockSpuSyncMode); + NSInteger modeID = [(NSNumber *)[property valueForKey:@"spuSyncMode"] integerValue]; + OSSpinLockUnlock(&spinlockSpuSyncMode); + + return modeID; +} + +- (void) setSpuSyncMethod:(NSInteger)methodID +{ + OSSpinLockLock(&spinlockSpuSyncMethod); + [property setValue:[NSNumber numberWithInteger:methodID] forKey:@"spuSyncMethod"]; + OSSpinLockUnlock(&spinlockSpuSyncMethod); + + NSInteger modeID = [self spuSyncMode]; + + pthread_mutex_lock(self.mutexOutputFrame); + SPU_SetSynchMode(modeID, methodID); + pthread_mutex_unlock(self.mutexOutputFrame); +} + +- (NSInteger) spuSyncMethod +{ + OSSpinLockLock(&spinlockSpuSyncMethod); + NSInteger methodID = [(NSNumber *)[property valueForKey:@"spuSyncMethod"] integerValue]; + OSSpinLockUnlock(&spinlockSpuSyncMethod); + + return methodID; +} + +- (BOOL) mute +{ + return [[property objectForKey:@"mute"] boolValue]; +} + +- (void) setMute:(BOOL)mute +{ + [property setValue:[NSNumber numberWithBool:mute] forKey:@"mute"]; + + if (isSPUStarted) + { + if (mute) + { + SPU_SetVolume(0); + } + else + { + SPU_SetVolume((int)[self volume]); + } + } +} + +- (NSInteger) filter +{ + return [[property objectForKey:@"filter"] integerValue]; +} + +- (void) setFilter:(NSInteger)filter +{ + [property setValue:[NSNumber numberWithInteger:filter] forKey:@"filter"]; +} + +- (void) runThread:(id)object +{ + [CocoaDSSpeaker startupSPU]; + SPU_SetVolume((int)[self volume]); + + [super runThread:object]; + + [CocoaDSSpeaker shutdownSPU]; +} + +- (void)handlePortMessage:(NSPortMessage*)portMessage +{ + NSInteger message = (NSInteger)[portMessage msgid]; + NSArray *messageComponents = [portMessage components]; + + switch (message) + { + case MESSAGE_EMU_FRAME_PROCESSED: + [self handleEmuFrameProcessed:nil]; + break; + + case MESSAGE_SET_AUDIO_PROCESS_METHOD: + [self handleSetAudioOutputEngine:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_SET_SPU_ADVANCED_LOGIC: + [self handleSetSpuAdvancedLogic:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_SET_SPU_SYNC_MODE: + [self handleSetSpuSyncMode:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_SET_SPU_SYNC_METHOD: + [self handleSetSpuSyncMethod:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_SET_SPU_INTERPOLATION_MODE: + [self handleSetSpuInterpolationMode:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_SET_VOLUME: + [self handleSetVolume:[messageComponents objectAtIndex:0]]; + break; + + default: + [super handlePortMessage:portMessage]; + break; + } +} + +- (void) handleEmuFrameProcessed:(NSData *)theData +{ + SPU_Emulate_user(); + + [super handleEmuFrameProcessed:theData]; +} + +- (void) handleSetVolume:(NSData *)volumeData +{ + const float *vol = (float *)[volumeData bytes]; + [self setVolume:*vol]; +} + +- (void) handleSetAudioOutputEngine:(NSData *)methodIdData +{ + const NSInteger *methodID = (NSInteger *)[methodIdData bytes]; + [self setAudioOutputEngine:*methodID]; +} + +- (void) handleSetSpuAdvancedLogic:(NSData *)stateData +{ + const BOOL *theState = (BOOL *)[stateData bytes]; + [self setSpuAdvancedLogic:*theState]; +} + +- (void) handleSetSpuSyncMode:(NSData *)modeIdData +{ + const NSInteger *modeID = (NSInteger *)[modeIdData bytes]; + [self setSpuSyncMode:*modeID]; +} + +- (void) handleSetSpuSyncMethod:(NSData *)methodIdData +{ + const NSInteger *methodID = (NSInteger *)[methodIdData bytes]; + [self setSpuSyncMethod:*methodID]; +} + +- (void) handleSetSpuInterpolationMode:(NSData *)modeIdData +{ + const NSInteger *modeID = (NSInteger *)[modeIdData bytes]; + [self setSpuInterpolationMode:*modeID]; +} + +@end + +@implementation CocoaDSDisplay + +@synthesize gpuStateFlags; +@synthesize delegate; +@synthesize displayType; +@synthesize vf; +@synthesize mutexRender3D; + +- (id)init +{ + self = [super init]; + if (self == nil) + { + return self; + } + + mutexRender3D = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); + pthread_mutex_init(mutexRender3D, NULL); + + spinlockGpuState = OS_SPINLOCK_INIT; + spinlockDisplayType = OS_SPINLOCK_INIT; + spinlockVideoFilterType = OS_SPINLOCK_INIT; + spinlockVfSrcBuffer = OS_SPINLOCK_INIT; + spinlockRender3DRenderingEngine = OS_SPINLOCK_INIT; + spinlockRender3DHighPrecisionColorInterpolation = OS_SPINLOCK_INIT; + spinlockRender3DEdgeMarking = OS_SPINLOCK_INIT; + spinlockRender3DFog = OS_SPINLOCK_INIT; + spinlockRender3DTextures = OS_SPINLOCK_INIT; + spinlockRender3DDepthComparisonThreshold = OS_SPINLOCK_INIT; + spinlockRender3DThreads = OS_SPINLOCK_INIT; + spinlockRender3DLineHack = OS_SPINLOCK_INIT; + + displayType = DS_DISPLAY_TYPE_COMBO; + vf = [[CocoaVideoFilter alloc] initWithSize:NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2)]; + + gpuStateFlags = GPUSTATE_MAIN_GPU_MASK | + GPUSTATE_MAIN_BG0_MASK | + GPUSTATE_MAIN_BG1_MASK | + GPUSTATE_MAIN_BG2_MASK | + GPUSTATE_MAIN_BG3_MASK | + GPUSTATE_MAIN_OBJ_MASK | + GPUSTATE_SUB_GPU_MASK | + GPUSTATE_SUB_BG0_MASK | + GPUSTATE_SUB_BG1_MASK | + GPUSTATE_SUB_BG2_MASK | + GPUSTATE_SUB_BG3_MASK | + GPUSTATE_SUB_OBJ_MASK; + + frameCount = 0; + frameData = nil; + delegate = nil; + + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateMainGPU"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateMainBG0"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateMainBG1"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateMainBG2"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateMainBG3"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateMainOBJ"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateSubGPU"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateSubBG0"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateSubBG1"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateSubBG2"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateSubBG3"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateSubOBJ"]; + [property setValue:[NSNumber numberWithInteger:displayType] forKey:@"displayMode"]; + [property setValue:NSSTRING_DISPLAYMODE_MAIN forKey:@"displayModeString"]; + [property setValue:[NSNumber numberWithInteger:(NSInteger)VideoFilterTypeID_None] forKey:@"videoFilterType"]; + [property setValue:[CocoaVideoFilter typeStringByID:VideoFilterTypeID_None] forKey:@"videoFilterTypeString"]; + [property setValue:[NSNumber numberWithInteger:CORE3DLIST_NULL] forKey:@"render3DRenderingEngine"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"render3DHighPrecisionColorInterpolation"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"render3DEdgeMarking"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"render3DFog"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"render3DTextures"]; + [property setValue:[NSNumber numberWithInteger:0] forKey:@"render3DDepthComparisonThreshold"]; + [property setValue:[NSNumber numberWithInteger:0] forKey:@"render3DThreads"]; + [property setValue:[NSNumber numberWithBool:YES] forKey:@"render3DLineHack"]; + + return self; +} + +- (void)dealloc +{ + [vf release]; + + pthread_mutex_destroy(self.mutexRender3D); + free(self.mutexRender3D); + mutexRender3D = nil; + + [super dealloc]; +} + +- (void) setDelegate:(id )theDelegate +{ + if (theDelegate == nil) + { + [delegate release]; + } + else + { + [theDelegate retain]; + [theDelegate setSendPortDisplay:self.receivePort]; + } + + delegate = theDelegate; +} + +- (id ) delegate +{ + return delegate; +} + +- (void) setGpuStateFlags:(UInt32)flags +{ + OSSpinLockLock(&spinlockGpuState); + + gpuStateFlags = flags; + + if (flags & GPUSTATE_MAIN_GPU_MASK) + { + SetGPUDisplayState(DS_GPU_TYPE_MAIN, true); + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateMainGPU"]; + } + else + { + SetGPUDisplayState(DS_GPU_TYPE_MAIN, false); + [property setValue:[NSNumber numberWithBool:NO] forKey:@"gpuStateMainGPU"]; + } + + if (flags & GPUSTATE_MAIN_BG0_MASK) + { + SetGPULayerState(DS_GPU_TYPE_MAIN, 0, true); + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateMainBG0"]; + } + else + { + SetGPULayerState(DS_GPU_TYPE_MAIN, 0, false); + [property setValue:[NSNumber numberWithBool:NO] forKey:@"gpuStateMainBG0"]; + } + + if (flags & GPUSTATE_MAIN_BG1_MASK) + { + SetGPULayerState(DS_GPU_TYPE_MAIN, 1, true); + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateMainBG1"]; + } + else + { + SetGPULayerState(DS_GPU_TYPE_MAIN, 1, false); + [property setValue:[NSNumber numberWithBool:NO] forKey:@"gpuStateMainBG1"]; + } + + if (flags & GPUSTATE_MAIN_BG2_MASK) + { + SetGPULayerState(DS_GPU_TYPE_MAIN, 2, true); + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateMainBG2"]; + } + else + { + SetGPULayerState(DS_GPU_TYPE_MAIN, 2, false); + [property setValue:[NSNumber numberWithBool:NO] forKey:@"gpuStateMainBG2"]; + } + + if (flags & GPUSTATE_MAIN_BG3_MASK) + { + SetGPULayerState(DS_GPU_TYPE_MAIN, 3, true); + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateMainBG3"]; + } + else + { + SetGPULayerState(DS_GPU_TYPE_MAIN, 3, false); + [property setValue:[NSNumber numberWithBool:NO] forKey:@"gpuStateMainBG3"]; + } + + if (flags & GPUSTATE_MAIN_OBJ_MASK) + { + SetGPULayerState(DS_GPU_TYPE_MAIN, 4, true); + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateMainOBJ"]; + } + else + { + SetGPULayerState(DS_GPU_TYPE_MAIN, 4, false); + [property setValue:[NSNumber numberWithBool:NO] forKey:@"gpuStateMainOBJ"]; + } + + if (flags & GPUSTATE_SUB_GPU_MASK) + { + SetGPUDisplayState(DS_GPU_TYPE_SUB, true); + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateSubGPU"]; + } + else + { + SetGPUDisplayState(DS_GPU_TYPE_SUB, false); + [property setValue:[NSNumber numberWithBool:NO] forKey:@"gpuStateSubGPU"]; + } + + if (flags & GPUSTATE_SUB_BG0_MASK) + { + SetGPULayerState(DS_GPU_TYPE_SUB, 0, true); + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateSubBG0"]; + } + else + { + SetGPULayerState(DS_GPU_TYPE_SUB, 0, false); + [property setValue:[NSNumber numberWithBool:NO] forKey:@"gpuStateSubBG0"]; + } + + if (flags & GPUSTATE_SUB_BG1_MASK) + { + SetGPULayerState(DS_GPU_TYPE_SUB, 1, true); + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateSubBG1"]; + } + else + { + SetGPULayerState(DS_GPU_TYPE_SUB, 1, false); + [property setValue:[NSNumber numberWithBool:NO] forKey:@"gpuStateSubBG1"]; + } + + if (flags & GPUSTATE_SUB_BG2_MASK) + { + SetGPULayerState(DS_GPU_TYPE_SUB, 2, true); + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateSubBG2"]; + } + else + { + SetGPULayerState(DS_GPU_TYPE_SUB, 2, false); + [property setValue:[NSNumber numberWithBool:NO] forKey:@"gpuStateSubBG2"]; + } + + if (flags & GPUSTATE_SUB_BG3_MASK) + { + SetGPULayerState(DS_GPU_TYPE_SUB, 3, true); + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateSubBG3"]; + } + else + { + SetGPULayerState(DS_GPU_TYPE_SUB, 3, false); + [property setValue:[NSNumber numberWithBool:NO] forKey:@"gpuStateSubBG3"]; + } + + if (flags & GPUSTATE_SUB_OBJ_MASK) + { + SetGPULayerState(DS_GPU_TYPE_SUB, 4, true); + [property setValue:[NSNumber numberWithBool:YES] forKey:@"gpuStateSubOBJ"]; + } + else + { + SetGPULayerState(DS_GPU_TYPE_SUB, 4, false); + [property setValue:[NSNumber numberWithBool:NO] forKey:@"gpuStateSubOBJ"]; + } + + OSSpinLockUnlock(&spinlockGpuState); +} + +- (UInt32) gpuStateFlags +{ + OSSpinLockLock(&spinlockGpuState); + UInt32 flags = gpuStateFlags; + OSSpinLockUnlock(&spinlockGpuState); + + return flags; +} + +- (void) setDisplayType:(NSInteger)dispType +{ + OSSpinLockLock(&spinlockDisplayType); + + displayType = dispType; + [property setValue:[NSNumber numberWithInteger:dispType] forKey:@"displayMode"]; + + NSSize newSrcSize = NSMakeSize((CGFloat)GPU_DISPLAY_WIDTH, (CGFloat)GPU_DISPLAY_HEIGHT); + + switch (dispType) + { + case DS_DISPLAY_TYPE_MAIN: + [property setValue:NSSTRING_DISPLAYMODE_MAIN forKey:@"displayModeString"]; + break; + + case DS_DISPLAY_TYPE_TOUCH: + [property setValue:NSSTRING_DISPLAYMODE_TOUCH forKey:@"displayModeString"]; + break; + + case DS_DISPLAY_TYPE_COMBO: + [property setValue:NSSTRING_DISPLAYMODE_COMBO forKey:@"displayModeString"]; + newSrcSize.height *= 2; + break; + + default: + OSSpinLockUnlock(&spinlockDisplayType); + return; + break; + } + + OSSpinLockUnlock(&spinlockDisplayType); + + OSSpinLockLock(&spinlockVfSrcBuffer); + [vf setSourceSize:newSrcSize]; + OSSpinLockUnlock(&spinlockVfSrcBuffer); +} + +- (NSInteger) displayType +{ + OSSpinLockLock(&spinlockDisplayType); + NSInteger dispType = displayType; + OSSpinLockUnlock(&spinlockDisplayType); + + return dispType; +} + +- (void) setVfType:(NSInteger)videoFilterTypeID +{ + [vf changeFilter:(VideoFilterTypeID)videoFilterTypeID]; + + OSSpinLockLock(&spinlockVideoFilterType); + [property setValue:[NSNumber numberWithInteger:videoFilterTypeID] forKey:@"videoFilterType"]; + [property setValue:NSLocalizedString([vf typeString], nil) forKey:@"videoFilterTypeString"]; + OSSpinLockUnlock(&spinlockVideoFilterType); +} + +- (NSInteger) vfType +{ + OSSpinLockLock(&spinlockVideoFilterType); + NSInteger theType = [(NSNumber *)[property valueForKey:@"videoFilterType"] integerValue]; + OSSpinLockUnlock(&spinlockVideoFilterType); + + return theType; +} + +- (void) setRender3DRenderingEngine:(NSInteger)methodID +{ + OSSpinLockLock(&spinlockRender3DRenderingEngine); + [property setValue:[NSNumber numberWithInteger:methodID] forKey:@"render3DRenderingEngine"]; + OSSpinLockUnlock(&spinlockRender3DRenderingEngine); + + pthread_mutex_lock(self.mutexOutputFrame); + NDS_3D_ChangeCore(methodID); + pthread_mutex_unlock(self.mutexOutputFrame); +} + +- (NSInteger) render3DRenderingEngine +{ + OSSpinLockLock(&spinlockRender3DRenderingEngine); + NSInteger methodID = [(NSNumber *)[property valueForKey:@"render3DRenderingEngine"] integerValue]; + OSSpinLockUnlock(&spinlockRender3DRenderingEngine); + + return methodID; +} + +- (void) setRender3DHighPrecisionColorInterpolation:(BOOL)state +{ + OSSpinLockLock(&spinlockRender3DHighPrecisionColorInterpolation); + [property setValue:[NSNumber numberWithBool:state] forKey:@"render3DHighPrecisionColorInterpolation"]; + OSSpinLockUnlock(&spinlockRender3DHighPrecisionColorInterpolation); + + bool cState = false; + if (state) + { + cState = true; + } + + pthread_mutex_lock(self.mutexOutputFrame); + CommonSettings.GFX3D_HighResolutionInterpolateColor = cState; + pthread_mutex_unlock(self.mutexOutputFrame); +} + +- (BOOL) render3DHighPrecisionColorInterpolation +{ + OSSpinLockLock(&spinlockRender3DHighPrecisionColorInterpolation); + BOOL state = [(NSNumber *)[property valueForKey:@"render3DHighPrecisionColorInterpolation"] boolValue]; + OSSpinLockUnlock(&spinlockRender3DHighPrecisionColorInterpolation); + + return state; +} + +- (void) setRender3DEdgeMarking:(BOOL)state +{ + OSSpinLockLock(&spinlockRender3DEdgeMarking); + [property setValue:[NSNumber numberWithBool:state] forKey:@"render3DEdgeMarking"]; + OSSpinLockUnlock(&spinlockRender3DEdgeMarking); + + bool cState = false; + if (state) + { + cState = true; + } + + pthread_mutex_lock(self.mutexOutputFrame); + CommonSettings.GFX3D_EdgeMark = cState; + pthread_mutex_unlock(self.mutexOutputFrame); +} + +- (BOOL) render3DEdgeMarking +{ + OSSpinLockLock(&spinlockRender3DEdgeMarking); + BOOL state = [(NSNumber *)[property valueForKey:@"render3DEdgeMarking"] boolValue]; + OSSpinLockUnlock(&spinlockRender3DEdgeMarking); + + return state; +} + +- (void) setRender3DFog:(BOOL)state +{ + OSSpinLockLock(&spinlockRender3DFog); + [property setValue:[NSNumber numberWithBool:state] forKey:@"render3DFog"]; + OSSpinLockUnlock(&spinlockRender3DFog); + + bool cState = false; + if (state) + { + cState = true; + } + + pthread_mutex_lock(self.mutexOutputFrame); + CommonSettings.GFX3D_Fog = cState; + pthread_mutex_unlock(self.mutexOutputFrame); +} + +- (BOOL) render3DFog +{ + OSSpinLockLock(&spinlockRender3DFog); + BOOL state = [(NSNumber *)[property valueForKey:@"render3DFog"] boolValue]; + OSSpinLockUnlock(&spinlockRender3DFog); + + return state; +} + +- (void) setRender3DTextures:(BOOL)state +{ + OSSpinLockLock(&spinlockRender3DTextures); + [property setValue:[NSNumber numberWithBool:state] forKey:@"render3DTextures"]; + OSSpinLockUnlock(&spinlockRender3DTextures); + + bool cState = false; + if (state) + { + cState = true; + } + + pthread_mutex_lock(self.mutexOutputFrame); + CommonSettings.GFX3D_Texture = cState; + pthread_mutex_unlock(self.mutexOutputFrame); +} + +- (BOOL) render3DTextures +{ + OSSpinLockLock(&spinlockRender3DTextures); + BOOL state = [(NSNumber *)[property valueForKey:@"render3DTextures"] boolValue]; + OSSpinLockUnlock(&spinlockRender3DTextures); + + return state; +} + +- (void) setRender3DDepthComparisonThreshold:(NSUInteger)threshold +{ + OSSpinLockLock(&spinlockRender3DDepthComparisonThreshold); + [property setValue:[NSNumber numberWithInteger:threshold] forKey:@"render3DDepthComparisonThreshold"]; + OSSpinLockUnlock(&spinlockRender3DDepthComparisonThreshold); + + pthread_mutex_lock(self.mutexOutputFrame); + CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack = threshold; + pthread_mutex_unlock(self.mutexOutputFrame); +} + +- (NSUInteger) render3DDepthComparisonThreshold +{ + OSSpinLockLock(&spinlockRender3DDepthComparisonThreshold); + NSUInteger threshold = [(NSNumber *)[property valueForKey:@"render3DDepthComparisonThreshold"] integerValue]; + OSSpinLockUnlock(&spinlockRender3DDepthComparisonThreshold); + + return threshold; +} + +- (void) setRender3DThreads:(NSUInteger)numberThreads +{ + OSSpinLockLock(&spinlockRender3DThreads); + [property setValue:[NSNumber numberWithInteger:numberThreads] forKey:@"render3DThreads"]; + OSSpinLockUnlock(&spinlockRender3DThreads); + + NSUInteger numberCores = [[NSProcessInfo processInfo] activeProcessorCount]; + if (numberThreads == 0) + { + if (numberCores >= 4) + { + numberCores = 4; + } + else if (numberCores >= 2) + { + numberCores = 2; + } + else + { + numberCores = 1; + } + } + else + { + numberCores = numberThreads; + } + + pthread_mutex_lock(self.mutexOutputFrame); + CommonSettings.num_cores = numberCores; + pthread_mutex_unlock(self.mutexOutputFrame); + + if ([self render3DRenderingEngine] == CORE3DLIST_SWRASTERIZE) + { + pthread_mutex_lock(self.mutexOutputFrame); + NDS_3D_ChangeCore(CORE3DLIST_SWRASTERIZE); + pthread_mutex_unlock(self.mutexOutputFrame); + } +} + +- (NSUInteger) render3DThreads +{ + OSSpinLockLock(&spinlockRender3DThreads); + NSUInteger numberThreads = [(NSNumber *)[property valueForKey:@"render3DThreads"] integerValue]; + OSSpinLockUnlock(&spinlockRender3DThreads); + + return numberThreads; +} + +- (void) setRender3DLineHack:(BOOL)state +{ + OSSpinLockLock(&spinlockRender3DLineHack); + [property setValue:[NSNumber numberWithBool:state] forKey:@"render3DLineHack"]; + OSSpinLockUnlock(&spinlockRender3DLineHack); + + bool cState = false; + if (state) + { + cState = true; + } + + pthread_mutex_lock(self.mutexOutputFrame); + CommonSettings.GFX3D_LineHack = cState; + pthread_mutex_unlock(self.mutexOutputFrame); +} + +- (BOOL) render3DLineHack +{ + OSSpinLockLock(&spinlockRender3DLineHack); + BOOL state = [(NSNumber *)[property valueForKey:@"render3DLineHack"] boolValue]; + OSSpinLockUnlock(&spinlockRender3DLineHack); + + return state; +} + +- (void) runThread:(id)object +{ + NSAutoreleasePool *tempPool = [[NSAutoreleasePool alloc] init]; + [delegate doInitVideoOutput:self.property]; + [tempPool release]; + + [super runThread:object]; +} + +- (void) doCoreEmuFrame +{ + NSData *gpuData = nil; + NSInteger dispType = self.displayType; + + // Here, we copy the raw GPU data from the emulation core. + // + // The core data contains the GPU pixels from both the main and touch screens. So + // depending on the display type, we copy only the pixels from the respective screen. + if (dispType == DS_DISPLAY_TYPE_MAIN) + { + gpuData = [[NSData alloc] initWithBytes:GPU_screen length:GPU_SCREEN_SIZE_BYTES]; + } + else if(dispType == DS_DISPLAY_TYPE_TOUCH) + { + gpuData = [[NSData alloc] initWithBytes:(GPU_screen + GPU_SCREEN_SIZE_BYTES) length:GPU_SCREEN_SIZE_BYTES]; + } + else if(dispType == DS_DISPLAY_TYPE_COMBO) + { + gpuData = [[NSData alloc] initWithBytes:GPU_screen length:GPU_SCREEN_SIZE_BYTES * 2]; + } + + [CocoaDSUtil messageSendOneWayWithData:self.receivePort msgID:MESSAGE_EMU_FRAME_PROCESSED data:gpuData]; + + // Now that we've finished sending the GPU data, release the local copy. + [gpuData release]; +} + +- (void)handlePortMessage:(NSPortMessage *)portMessage +{ + NSInteger message = (NSInteger)[portMessage msgid]; + NSArray *messageComponents = [portMessage components]; + + switch (message) + { + case MESSAGE_EMU_FRAME_PROCESSED: + [self handleEmuFrameProcessed:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_RESIZE_VIEW: + [self handleResizeView:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_REDRAW_VIEW: + [self handleRedrawView]; + break; + + case MESSAGE_SET_GPU_STATE_FLAGS: + [self handleChangeGpuStateFlags:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_CHANGE_DISPLAY_TYPE: + [self handleChangeDisplayType:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_CHANGE_BILINEAR_OUTPUT: + [self handleChangeBilinearOutput:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_CHANGE_VIDEO_FILTER: + [self handleChangeVideoFilter:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_SET_RENDER3D_METHOD: + [self handleSetRender3DRenderingEngine:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_SET_RENDER3D_HIGH_PRECISION_COLOR_INTERPOLATION: + [self handleSetRender3DHighPrecisionColorInterpolation:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_SET_RENDER3D_EDGE_MARKING: + [self handleSetRender3DEdgeMarking:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_SET_RENDER3D_FOG: + [self handleSetRender3DFog:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_SET_RENDER3D_TEXTURES: + [self handleSetRender3DTextures:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_SET_RENDER3D_DEPTH_COMPARISON_THRESHOLD: + [self handleSetRender3DDepthComparisonThreshold:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_SET_RENDER3D_THREADS: + [self handleSetRender3DThreads:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_SET_RENDER3D_LINE_HACK: + [self handleSetRender3DLineHack:[messageComponents objectAtIndex:0]]; + break; + + case MESSAGE_SET_VIEW_TO_BLACK: + [self handleSetViewToBlack]; + break; + + case MESSAGE_SET_VIEW_TO_WHITE: + [self handleSetViewToWhite]; + break; + + case MESSAGE_REQUEST_SCREENSHOT: + [self handleRequestScreenshot:[messageComponents objectAtIndex:0] fileTypeData:[messageComponents objectAtIndex:1]]; + break; + + case MESSAGE_COPY_TO_PASTEBOARD: + [self handleCopyToPasteboard]; + break; + + default: + [super handlePortMessage:portMessage]; + break; + } +} + +- (void) handleEmuFrameProcessed:(NSData *)theData +{ + // Tell the video output object to process the video frame with our copied GPU data. + if ([vf typeID] == VideoFilterTypeID_None) + { + [delegate doProcessVideoFrame:[theData bytes] frameSize:[vf destSize]]; + } + else + { + NSSize srcSize = [vf srcSize]; + + OSSpinLockLock(&spinlockVfSrcBuffer); + RGBA5551ToRGBA8888Buffer((const uint16_t *)[theData bytes], (uint32_t *)[vf srcBufferPtr], ((unsigned int)srcSize.width * (unsigned int)srcSize.height)); + OSSpinLockUnlock(&spinlockVfSrcBuffer); + + const UInt32 *vfDestBufferPtr = [vf runFilter]; + [delegate doProcessVideoFrame:vfDestBufferPtr frameSize:[vf destSize]]; + } + + [super handleEmuFrameProcessed:theData]; +} + +- (void) handleResizeView:(NSData *)rectData +{ + if (delegate == nil || ![delegate respondsToSelector:@selector(doResizeView:)]) + { + return; + } + + const NSRect *resizeRect = (NSRect *)[rectData bytes]; + [delegate doResizeView:*resizeRect]; +} + +- (void) handleRedrawView +{ + if (delegate == nil || ![delegate respondsToSelector:@selector(doRedraw)]) + { + return; + } + + [delegate doRedraw]; +} + +- (void) handleChangeGpuStateFlags:(NSData *)flagsData +{ + const NSInteger *flags = (NSInteger *)[flagsData bytes]; + self.gpuStateFlags = (UInt32)*flags; + [self handleEmuFrameProcessed:self.frameData]; +} + +- (void) handleChangeDisplayType:(NSData *)displayTypeIdData +{ + if (delegate == nil || ![delegate respondsToSelector:@selector(doDisplayTypeChanged:)]) + { + return; + } + + const NSInteger *theType = (NSInteger *)[displayTypeIdData bytes]; + self.displayType = *theType; + [delegate doDisplayTypeChanged:*theType]; +} + +- (void) handleChangeBilinearOutput:(NSData *)bilinearStateData +{ + if (delegate == nil || ![delegate respondsToSelector:@selector(doBilinearOutputChanged:)]) + { + return; + } + + const BOOL *theState = (BOOL *)[bilinearStateData bytes]; + [delegate doBilinearOutputChanged:*theState]; + [self handleEmuFrameProcessed:self.frameData]; +} + +- (void) handleChangeVideoFilter:(NSData *)videoFilterTypeIdData +{ + if (delegate == nil || ![delegate respondsToSelector:@selector(doVideoFilterChanged:)]) + { + return; + } + + const NSInteger *theType = (NSInteger *)[videoFilterTypeIdData bytes]; + [self setVfType:*theType]; + [delegate doVideoFilterChanged:*theType]; + [self handleEmuFrameProcessed:self.frameData]; +} + +- (void) handleSetRender3DRenderingEngine:(NSData *)methodIdData +{ + const NSInteger *methodID = (NSInteger *)[methodIdData bytes]; + [self setRender3DRenderingEngine:*methodID]; +} + +- (void) handleSetRender3DHighPrecisionColorInterpolation:(NSData *)stateData +{ + const BOOL *theState = (BOOL *)[stateData bytes]; + [self setRender3DHighPrecisionColorInterpolation:*theState]; +} + +- (void) handleSetRender3DEdgeMarking:(NSData *)stateData +{ + const BOOL *theState = (BOOL *)[stateData bytes]; + [self setRender3DEdgeMarking:*theState]; +} + +- (void) handleSetRender3DFog:(NSData *)stateData +{ + const BOOL *theState = (BOOL *)[stateData bytes]; + [self setRender3DFog:*theState]; +} + +- (void) handleSetRender3DTextures:(NSData *)stateData +{ + const BOOL *theState = (BOOL *)[stateData bytes]; + [self setRender3DTextures:*theState]; +} + +- (void) handleSetRender3DDepthComparisonThreshold:(NSData *)thresholdData +{ + const NSUInteger *threshold = (NSUInteger *)[thresholdData bytes]; + [self setRender3DDepthComparisonThreshold:*threshold]; +} + +- (void) handleSetRender3DThreads:(NSData *)numberThreadsData +{ + const NSUInteger *numberThreads = (NSUInteger *)[numberThreadsData bytes]; + [self setRender3DThreads:*numberThreads]; +} + +- (void) handleSetRender3DLineHack:(NSData *)stateData +{ + const BOOL *theState = (BOOL *)[stateData bytes]; + [self setRender3DLineHack:*theState]; +} + +- (void) handleSetViewToBlack +{ + NSSize destSize = [vf destSize]; + NSUInteger dataSize = (NSUInteger)destSize.width * (NSUInteger)destSize.height; + + void *texData = NULL; + if ([vf typeID] == VideoFilterTypeID_None) + { + texData = calloc(dataSize, sizeof(UInt16)); + dataSize *= sizeof(UInt16); + } + else + { + texData = calloc(dataSize, sizeof(UInt32)); + dataSize *= sizeof(UInt32); + } + + if (texData == NULL) + { + return; + } + + NSData *gpuData = [[NSData alloc] initWithBytes:texData length:dataSize]; + if (gpuData == nil) + { + return; + } + + [delegate doProcessVideoFrame:texData frameSize:destSize]; + + [self.frameData release]; + self.frameData = gpuData; + + free(texData); + texData = nil; +} + +- (void) handleSetViewToWhite +{ + NSSize destSize = [vf destSize]; + NSUInteger dataSize = (NSUInteger)destSize.width * (NSUInteger)destSize.height; + + if ([vf typeID] == VideoFilterTypeID_None) + { + dataSize *= sizeof(UInt16); + } + else + { + dataSize *= sizeof(UInt32); + } + + void *texData = malloc(dataSize); + if (texData == NULL) + { + return; + } + + memset(texData, 255, dataSize); + + NSData *gpuData = [[NSData alloc] initWithBytes:texData length:dataSize]; + if (gpuData == nil) + { + return; + } + + [delegate doProcessVideoFrame:texData frameSize:destSize]; + + [self.frameData release]; + self.frameData = gpuData; + + free(texData); + texData = nil; +} + +- (void) handleRequestScreenshot:(NSData *)fileURLStringData fileTypeData:(NSData *)fileTypeData +{ + NSString *fileURLString = [[NSString alloc] initWithData:fileURLStringData encoding:NSUTF8StringEncoding]; + NSURL *fileURL = [NSURL URLWithString:fileURLString]; + NSBitmapImageFileType *fileType = (NSBitmapImageFileType *)[fileTypeData bytes]; + NSImage *screenshotImage = [[self image] autorelease]; + + + NSMutableDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys: + fileURL, @"fileURL", + [NSNumber numberWithInteger:(NSInteger)*fileType], @"fileType", + screenshotImage, @"screenshotImage", + nil]; + + [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"com.DeSmuME.DeSmuME.requestScreenshotDidFinish" object:self userInfo:userInfo]; + + [fileURLString release]; +} + +- (void) handleCopyToPasteboard +{ + NSImage *screenshot = [[self image] autorelease]; + if (screenshot == nil) + { + return; + } + + NSPasteboard *pboard = [NSPasteboard generalPasteboard]; + [pboard declareTypes:[NSArray arrayWithObjects:NSTIFFPboardType, nil] owner:self]; + [pboard setData:[screenshot TIFFRepresentationUsingCompression:NSTIFFCompressionLZW factor:1.0f] forType:NSTIFFPboardType]; +} + +- (NSImage *) image +{ + NSImage *newImage = [[NSImage alloc] initWithSize:[vf srcSize]]; + if (newImage == nil) + { + return newImage; + } + + // Render the frame in an NSBitmapImageRep + NSBitmapImageRep *newImageRep = [self bitmapImageRep]; + if (newImageRep == nil) + { + [newImage release]; + newImage = nil; + return newImage; + } + + // Attach the rendered frame to the NSImageRep + [newImage addRepresentation:newImageRep]; + + return newImage; +} + +- (NSBitmapImageRep *) bitmapImageRep +{ + if (self.frameData == nil) + { + return nil; + } + + NSSize srcSize = [vf srcSize]; + NSUInteger w = (NSUInteger)srcSize.width; + NSUInteger h = (NSUInteger)srcSize.height; + NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL + pixelsWide:w + pixelsHigh:h + bitsPerSample:8 + samplesPerPixel:4 + hasAlpha:YES + isPlanar:NO + colorSpaceName:NSCalibratedRGBColorSpace + bytesPerRow:w * 4 + bitsPerPixel:32]; + + if(imageRep == nil) + { + return imageRep; + } + + uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData]; + RGBA5551ToRGBA8888Buffer((const uint16_t *)[self.frameData bytes], bitmapData, (w * h)); + +#ifdef __BIG_ENDIAN__ + uint32_t *bitmapDataEnd = bitmapData + (w * h); + while (bitmapData < bitmapDataEnd) + { + *bitmapData++ = CFSwapInt32LittleToHost(*bitmapData); + } +#endif + + return [imageRep autorelease]; +} + +- (BOOL) gpuStateByBit:(UInt32)stateBit +{ + BOOL result = NO; + UInt32 flags = self.gpuStateFlags; + + if (flags & (1 << stateBit)) + { + result = YES; + } + + return result; +} + +- (BOOL) isGPUTypeDisplayed:(NSInteger)theGpuType +{ + BOOL result = NO; + UInt32 flags = self.gpuStateFlags; + + switch (theGpuType) + { + case DS_GPU_TYPE_MAIN: + if (flags & GPUSTATE_MAIN_GPU_MASK) + { + result = YES; + } + break; + + case DS_GPU_TYPE_SUB: + if (flags & GPUSTATE_SUB_GPU_MASK) + { + result = YES; + } + break; + + case DS_GPU_TYPE_COMBO: + if (flags & (GPUSTATE_MAIN_GPU_MASK | GPUSTATE_SUB_GPU_MASK)) + { + result = YES; + } + break; + + default: + break; + } + + return result; +} + +- (void) hideGPUType:(NSInteger)theGpuType +{ + UInt32 flags = self.gpuStateFlags; + + switch (theGpuType) + { + case DS_GPU_TYPE_MAIN: + flags &= ~GPUSTATE_MAIN_GPU_MASK; + break; + + case DS_GPU_TYPE_SUB: + flags &= ~GPUSTATE_SUB_GPU_MASK; + break; + + case DS_GPU_TYPE_COMBO: + flags &= ~GPUSTATE_MAIN_GPU_MASK; + flags &= ~GPUSTATE_SUB_GPU_MASK; + break; + + default: + break; + } + + self.gpuStateFlags = flags; +} + +- (void) showGPUType:(NSInteger)theGpuType +{ + UInt32 flags = self.gpuStateFlags; + + switch (theGpuType) + { + case DS_GPU_TYPE_MAIN: + flags |= GPUSTATE_MAIN_GPU_MASK; + break; + + case DS_GPU_TYPE_SUB: + flags |= GPUSTATE_SUB_GPU_MASK; + break; + + case DS_GPU_TYPE_COMBO: + flags |= GPUSTATE_MAIN_GPU_MASK; + flags |= GPUSTATE_SUB_GPU_MASK; + break; + + default: + break; + } + + self.gpuStateFlags = flags; +} + +@end + +bool opengl_init(void) +{ + return true; +} + +void HandleMessageEchoResponse(NSPortMessage *portMessage) +{ + NSPortMessage *echo = [[NSPortMessage alloc] initWithSendPort:[portMessage receivePort] receivePort:[portMessage sendPort] components:nil]; + [echo setMsgid:MESSAGE_CHECK_RESPONSE_ECHO]; + NSDate *sendDate = [[NSDate alloc] init]; + [echo sendBeforeDate:sendDate]; + [echo release]; + [sendDate release]; +} + +void SetGPULayerState(int displayType, unsigned int i, bool state) +{ + GPU *theGpu = NULL; + + // Check bounds on the layer index. + if(i > 4) + { + return; + } + + switch (displayType) + { + case DS_GPU_TYPE_MAIN: + theGpu = SubScreen.gpu; + break; + + case DS_GPU_TYPE_SUB: + theGpu = MainScreen.gpu; + break; + + case DS_GPU_TYPE_COMBO: + SetGPULayerState(DS_GPU_TYPE_SUB, i, state); // Recursive call + theGpu = MainScreen.gpu; + break; + + default: + break; + } + + if (theGpu != NULL) + { + if (state) + { + GPU_addBack(theGpu, i); + } + else + { + GPU_remove(theGpu, i); + } + } +} + +bool GetGPULayerState(int displayType, unsigned int i) +{ + bool result = false; + + // Check bounds on the layer index. + if(i > 4) + { + return result; + } + + switch (displayType) + { + case DS_GPU_TYPE_MAIN: + if (SubScreen.gpu != nil) + { + result = CommonSettings.dispLayers[SubScreen.gpu->core][i]; + } + break; + + case DS_GPU_TYPE_SUB: + if (MainScreen.gpu != nil) + { + result = CommonSettings.dispLayers[MainScreen.gpu->core][i]; + } + break; + + case DS_GPU_TYPE_COMBO: + if (SubScreen.gpu != nil && MainScreen.gpu != nil) + { + result = (CommonSettings.dispLayers[SubScreen.gpu->core][i] && CommonSettings.dispLayers[MainScreen.gpu->core][i]); + } + break; + + default: + break; + } + + return result; +} + +void SetGPUDisplayState(int displayType, bool state) +{ + switch (displayType) + { + case DS_GPU_TYPE_MAIN: + CommonSettings.showGpu.sub = state; + break; + + case DS_GPU_TYPE_SUB: + CommonSettings.showGpu.main = state; + break; + + case DS_GPU_TYPE_COMBO: + CommonSettings.showGpu.sub = state; + CommonSettings.showGpu.main = state; + break; + + default: + break; + } +} + +bool GetGPUDisplayState(int displayType) +{ + bool result = false; + + switch (displayType) + { + case DS_GPU_TYPE_MAIN: + result = CommonSettings.showGpu.sub; + break; + + case DS_GPU_TYPE_SUB: + result = CommonSettings.showGpu.main; + break; + + case DS_GPU_TYPE_COMBO: + result = (CommonSettings.showGpu.sub && CommonSettings.showGpu.main); + break; + + default: + break; + } + + return result; +} diff --git a/desmume/src/cocoa/cocoa_rom.h b/desmume/src/cocoa/cocoa_rom.h new file mode 100644 index 000000000..fa46604b4 --- /dev/null +++ b/desmume/src/cocoa/cocoa_rom.h @@ -0,0 +1,70 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import +#include + + +@interface CocoaDSRom : NSObject +{ + NSMutableDictionary *header; + NSMutableDictionary *bindings; + NSURL *fileURL; + BOOL isDataLoaded; + NSInteger saveType; + + NSMutableDictionary *xmlCurrentRom; + NSMutableArray *xmlElementStack; + NSMutableArray *xmlCharacterStack; +} + +@property (assign) NSMutableDictionary *header; +@property (assign) NSMutableDictionary *bindings; +@property (assign) NSURL *fileURL; +@property (assign) BOOL isDataLoaded; +@property (assign) NSInteger saveType; + +- (id) initWithURL:(NSURL *)theURL; +- (id) initWithURL:(NSURL *)theURL saveType:(NSInteger)saveTypeID; +- (void) initHeader; +- (BOOL) loadData:(NSURL *)theURL; +- (void) loadDataOnThread:(id)object; +- (NSString *) getRomTitle; +- (NSString *) getRomCode; +- (NSString *) getRomBannerTitle:(const UInt16 *)title; +- (NSString *) getRomInternalName; +- (NSString *) getRomSerial; +- (NSImage *) icon; +- (void) handleAdvansceneDatabaseInfo; + ++ (void) changeRomSaveType:(NSInteger)saveTypeID; ++ (NSInteger) saveTypeByString:(NSString *)saveTypeString; ++ (NSMutableDictionary *) romNotLoadedBindings; + +@end + +#ifdef __cplusplus +extern "C" +{ +#endif + +void RomIconToRGBA8888(uint32_t *bitmapData); + +#ifdef __cplusplus +} +#endif diff --git a/desmume/src/cocoa/cocoa_rom.mm b/desmume/src/cocoa/cocoa_rom.mm new file mode 100644 index 000000000..85699bbf8 --- /dev/null +++ b/desmume/src/cocoa/cocoa_rom.mm @@ -0,0 +1,649 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "cocoa_rom.h" +#import "cocoa_file.h" +#import "cocoa_globals.h" +#import "cocoa_util.h" + +#include "../NDSSystem.h" +#include "../mc.h" +#undef BOOL + + +@implementation CocoaDSRom + +@synthesize header; +@synthesize bindings; +@synthesize fileURL; +@synthesize isDataLoaded; +@synthesize saveType; + +static NSMutableDictionary *saveTypeValues = nil; + +- (id)init +{ + return [self initWithURL:nil]; +} + +- (id) initWithURL:(NSURL *)theURL +{ + return [self initWithURL:theURL saveType:ROMSAVETYPE_AUTOMATIC]; +} + +- (id) initWithURL:(NSURL *)theURL saveType:(NSInteger)saveTypeID +{ + self = [super init]; + if (self == nil) + { + return self; + } + + if (saveTypeValues == nil) + { + saveTypeValues = [[NSMutableDictionary alloc] initWithObjectsAndKeys: + [NSNumber numberWithInteger:1], @"eeprom - 4 kbit", + [NSNumber numberWithInteger:2], @"eeprom - 64 kbit", + [NSNumber numberWithInteger:3], @"eeprom - 512 kbit", + [NSNumber numberWithInteger:5], @"flash - 2 mbit", + [NSNumber numberWithInteger:6], @"flash - 4 mbit", + [NSNumber numberWithInteger:7], @"flash - 8 mbit", + [NSNumber numberWithInteger:10], @"flash - 64 mbit", + [NSNumber numberWithInteger:0], @"none", + [NSNumber numberWithInteger:0], @"tbc", + nil]; + } + + header = [[NSMutableDictionary alloc] init]; + if (header == nil) + { + [self release]; + self = nil; + return self; + } + + bindings = [[CocoaDSRom romNotLoadedBindings] retain]; + if (bindings == nil) + { + [header release]; + [self release]; + self = nil; + return self; + } + + fileURL = nil; + isDataLoaded = NO; + saveType = saveTypeID; + + xmlCurrentRom = nil; + xmlElementStack = [[NSMutableArray alloc] initWithCapacity:32]; + xmlCharacterStack = [[NSMutableArray alloc] initWithCapacity:32]; + + if (theURL != nil) + { + [self loadData:theURL]; + } + + return self; +} + +- (void)dealloc +{ + if (self.isDataLoaded) + { + NDS_FreeROM(); + self.isDataLoaded = NO; + } + + [xmlElementStack release]; + [xmlCharacterStack release]; + + [self.header release]; + self.header = nil; + + [self.bindings release]; + self.bindings = nil; + + [self.fileURL release]; + self.fileURL = nil; + + [super dealloc]; +} + +- (void) initHeader +{ + const NDS_header *ndsRomHeader = NDS_getROMHeader(); + const RomBanner &ndsRomBanner = gameInfo.getRomBanner(); + + if(self.header == nil || self.bindings == nil) + { + return; + } + + if (&ndsRomBanner != NULL) + { + [self.header setValue:[self getRomBannerTitle:ndsRomBanner.titles[0]] forKey:@"bannerJapanese"]; + [self.header setValue:[self getRomBannerTitle:ndsRomBanner.titles[1]] forKey:@"bannerEnglish"]; + [self.header setValue:[self getRomBannerTitle:ndsRomBanner.titles[2]] forKey:@"bannerFrench"]; + [self.header setValue:[self getRomBannerTitle:ndsRomBanner.titles[3]] forKey:@"bannerGerman"]; + [self.header setValue:[self getRomBannerTitle:ndsRomBanner.titles[4]] forKey:@"bannerItalian"]; + [self.header setValue:[self getRomBannerTitle:ndsRomBanner.titles[5]] forKey:@"bannerSpanish"]; + + [self.bindings setValue:[self.header objectForKey:@"bannerJapanese"] forKey:@"bannerJapanese"]; + [self.bindings setValue:[self.header objectForKey:@"bannerEnglish"] forKey:@"bannerEnglish"]; + [self.bindings setValue:[self.header objectForKey:@"bannerFrench"] forKey:@"bannerFrench"]; + [self.bindings setValue:[self.header objectForKey:@"bannerGerman"] forKey:@"bannerGerman"]; + [self.bindings setValue:[self.header objectForKey:@"bannerItalian"] forKey:@"bannerItalian"]; + [self.bindings setValue:[self.header objectForKey:@"bannerSpanish"] forKey:@"bannerSpanish"]; + } + + if (ndsRomHeader != NULL) + { + [self.header setValue:[self getRomTitle] forKey:@"gameTitle"]; + [self.header setValue:[self getRomCode] forKey:@"gameCode"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->makerCode] forKey:@"makerCode"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->cardSize] forKey:@"romSize"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM9src] forKey:@"arm9BinaryOffset"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM9exe] forKey:@"arm9BinaryEntryAddress"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM9cpy] forKey:@"arm9BinaryStartAddress"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM9binSize] forKey:@"arm9BinarySize"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM7src] forKey:@"arm7BinaryOffset"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM7exe] forKey:@"arm7BinaryEntryAddress"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM7cpy] forKey:@"arm7BinaryStartAddress"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ARM7binSize] forKey:@"arm7BinarySize"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->FNameTblOff] forKey:@"fntOffset"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->FNameTblSize] forKey:@"fntTableSize"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->FATOff] forKey:@"fatOffset"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->FATSize] forKey:@"fatSize"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->IconOff] forKey:@"iconOffset"]; + [self.header setValue:[NSNumber numberWithInteger:ndsRomHeader->ROMSize] forKey:@"usedRomSize"]; + + [self.bindings setValue:[self.header objectForKey:@"gameTitle"] forKey:@"gameTitle"]; + [self.bindings setValue:[self.header objectForKey:@"gameCode"] forKey:@"gameCode"]; + [self.bindings setValue:[NSString stringWithFormat:@"%04Xh", [[self.header objectForKey:@"makerCode"] intValue]] forKey:@"makerCode"]; + [self.bindings setValue:[NSString stringWithFormat:@"%i", [[self.header objectForKey:@"romSize"] intValue]] forKey:@"romSize"]; + [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm9BinaryOffset"] intValue]] forKey:@"arm9BinaryOffset"]; + [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm9BinaryEntryAddress"] intValue]] forKey:@"arm9BinaryEntryAddress"]; + [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm9BinaryStartAddress"] intValue]] forKey:@"arm9BinaryStartAddress"]; + [self.bindings setValue:[NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [[self.header objectForKey:@"arm9BinarySize"] intValue]] forKey:@"arm9BinarySize"]; + [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm7BinaryOffset"] intValue]] forKey:@"arm7BinaryOffset"]; + [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm7BinaryEntryAddress"] intValue]] forKey:@"arm7BinaryEntryAddress"]; + [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"arm7BinaryStartAddress"] intValue]] forKey:@"arm7BinaryStartAddress"]; + [self.bindings setValue:[NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [[self.header objectForKey:@"arm7BinarySize"] intValue]] forKey:@"arm7BinarySize"]; + [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"fntOffset"] intValue]] forKey:@"fntOffset"]; + [self.bindings setValue:[NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [[self.header objectForKey:@"fntTableSize"] intValue]] forKey:@"fntTableSize"]; + [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"fatOffset"] intValue]] forKey:@"fatOffset"]; + [self.bindings setValue:[NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, [[self.header objectForKey:@"fatSize"] intValue]] forKey:@"fatSize"]; + [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"fatOffset"] intValue]] forKey:@"fatOffset"]; + [self.bindings setValue:[NSString stringWithFormat:@"0x%08X", [[self.header objectForKey:@"iconOffset"] intValue]] forKey:@"iconOffset"]; + [self.bindings setValue:[NSString stringWithFormat:@"%i", [[self.header objectForKey:@"usedRomSize"] intValue]] forKey:@"usedRomSize"]; + } + + // Get ROM image + NSImage *iconImage = [self icon]; + if (iconImage != nil) + { + [header setObject:iconImage forKey:@"iconImage"]; + [self.bindings setObject:(NSImage *)[self.header objectForKey:@"iconImage"] forKey:@"iconImage"]; + } + + [self.header setValue:[self getRomInternalName] forKey:@"romInternalName"]; + [self.header setValue:[self getRomSerial] forKey:@"romSerial"]; + + [self.bindings setValue:[self.header objectForKey:@"romInternalName"] forKey:@"romInternalName"]; + [self.bindings setValue:[self.header objectForKey:@"romSerial"] forKey:@"romSerial"]; +} + +- (BOOL) loadData:(NSURL *)theURL +{ + [CocoaDSRom changeRomSaveType:saveType]; + + BOOL result = [CocoaDSFile loadRom:theURL]; + if (!result) + { + NSMutableDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], @"DidLoad", nil]; + [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"com.DeSmuME.DeSmuME.loadRomDidFinish" object:self userInfo:userInfo]; + return result; + } + + self.fileURL = [theURL copyWithZone:nil]; + self.isDataLoaded = YES; + [self initHeader]; + + NSString *advscDBPath = [[NSUserDefaults standardUserDefaults] stringForKey:@"Advanscene_DatabasePath"]; + if (advscDBPath != nil) + { + NSError *xmlError = [[NSError alloc] init]; + NSXMLParser *advscDB = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL fileURLWithPath:advscDBPath]]; + [advscDB setDelegate:self]; + [advscDB parse]; + [advscDB release]; + [xmlError release]; + } + + NSMutableDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"DidLoad", self.fileURL, @"URL", nil]; + [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"com.DeSmuME.DeSmuME.loadRomDidFinish" object:self userInfo:userInfo]; + + return result; +} + +- (void) loadDataOnThread:(id)object +{ + NSURL *theURL = [(NSURL *)object copyWithZone:nil]; + NSAutoreleasePool *threadPool = [[NSAutoreleasePool alloc] init]; + + [self loadData:theURL]; + + [threadPool release]; + [theURL release]; +} + +- (NSString *) getRomTitle +{ + NDS_header *ndsRomHeader = NDS_getROMHeader(); + if (ndsRomHeader == nil) + { + return nil; + } + + return [[[NSString alloc] initWithBytes:ndsRomHeader->gameTile length:ROMINFO_GAME_TITLE_LENGTH encoding:NSUTF8StringEncoding] autorelease]; +} + +- (NSString *) getRomCode +{ + NDS_header *ndsRomHeader = NDS_getROMHeader(); + if (ndsRomHeader == nil) + { + return nil; + } + + return [[[NSString alloc] initWithBytes:ndsRomHeader->gameCode length:ROMINFO_GAME_CODE_LENGTH encoding:NSUTF8StringEncoding] autorelease]; +} + +- (NSString *) getRomBannerTitle:(const UInt16 *)title +{ + NSUInteger titleLength = ROMINFO_GAME_BANNER_LENGTH * sizeof(*title); + + return [[[NSString alloc] initWithBytes:title length:titleLength encoding:NSUTF16LittleEndianStringEncoding] autorelease]; +} + +- (NSString *) getRomInternalName +{ + return [NSString stringWithCString:gameInfo.ROMname encoding:NSUTF8StringEncoding]; +} + +- (NSString *) getRomSerial +{ + return [NSString stringWithCString:gameInfo.ROMserial encoding:NSUTF8StringEncoding]; +} + +- (NSImage *) icon +{ + NSImage *newImage = nil; + + NDS_header *ndsRomHeader = NDS_getROMHeader(); + if (ndsRomHeader == nil) + { + return newImage; + } + + NSUInteger iconOffset = ndsRomHeader->IconOff; + if(iconOffset == 0) + { + return newImage; + } + + newImage = [[NSImage alloc] initWithSize:NSMakeSize(32, 32)]; + if(newImage == nil) + { + return newImage; + } + + NSUInteger w = ROM_ICON_WIDTH; + NSUInteger h = ROM_ICON_HEIGHT; + NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL + pixelsWide:w + pixelsHigh:h + bitsPerSample:8 + samplesPerPixel:4 + hasAlpha:YES + isPlanar:NO + colorSpaceName:NSCalibratedRGBColorSpace + bytesPerRow:w * 4 + bitsPerPixel:32]; + + if(imageRep == nil) + { + [newImage release]; + newImage = nil; + return newImage; + } + + uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData]; + RomIconToRGBA8888(bitmapData); + +#ifdef __BIG_ENDIAN__ + uint32_t *bitmapDataEnd = bitmapData + (w * h); + while (bitmapData < bitmapDataEnd) + { + *bitmapData++ = CFSwapInt32LittleToHost(*bitmapData); + } +#endif + + [imageRep autorelease]; + [newImage addRepresentation:imageRep]; + + return [newImage autorelease]; +} + +- (void) handleAdvansceneDatabaseInfo +{ + if (xmlCurrentRom == nil) + { + return; + } + + // Set the ROM save type. + BOOL useAdvscForRomSave = [[NSUserDefaults standardUserDefaults] boolForKey:@"Advanscene_AutoDetectRomSaveType"]; + if (useAdvscForRomSave && (saveType == ROMSAVETYPE_AUTOMATIC)) + { + NSString *saveTypeString = (NSString *)[xmlCurrentRom valueForKey:@"saveType"]; + NSInteger saveTypeID = [CocoaDSRom saveTypeByString:saveTypeString]; + [CocoaDSRom changeRomSaveType:saveTypeID]; + + if (saveTypeID != ROMSAVETYPE_AUTOMATIC) + { + NSLog(@"Set the ROM save type using the ADVANsCEne database: %s.", [saveTypeString cStringUsingEncoding:NSUTF8StringEncoding]); + } + } +} + +- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict +{ + NSMutableString *xmlCharacters = [NSMutableString stringWithCapacity:1024]; + [xmlCharacters setString:@""]; + + [xmlCharacterStack addObject:xmlCharacters]; + [xmlElementStack addObject:elementName]; + + if ([elementName isEqualToString:@"game"]) + { + if (xmlCurrentRom == nil) + { + xmlCurrentRom = [[NSMutableDictionary alloc] initWithCapacity:32]; + } + } +} + +- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName +{ + NSString *xmlElement = (NSString *)[xmlElementStack lastObject]; + if (xmlElement == nil || ![xmlElement isEqualToString:elementName]) + { + return; + } + + NSMutableString *xmlCharacters = (NSMutableString *)[xmlCharacterStack lastObject]; + [xmlCharacters setString:[xmlCharacters stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; + + if ([elementName isEqualToString:@"game"]) + { + NSString *romHeaderSerial = (NSString *)[self.header valueForKey:@"romSerial"]; + NSString *xmlSerial = (NSString *)[xmlCurrentRom valueForKey:@"serial"]; + if ([xmlSerial isEqualToString:romHeaderSerial]) + { + [self handleAdvansceneDatabaseInfo]; + [parser abortParsing]; + } + + [xmlCurrentRom release]; + xmlCurrentRom = nil; + } + else + { + if (xmlCurrentRom != nil) + { + [xmlCurrentRom setValue:[NSString stringWithString:xmlCharacters] forKey:elementName]; + } + } + + [xmlCharacterStack removeLastObject]; + [xmlElementStack removeLastObject]; +} + +- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string +{ + NSMutableString *xmlCharacters = (NSMutableString *)[xmlCharacterStack lastObject]; + if (xmlCharacters != nil) + { + [xmlCharacters appendString:string]; + } +} + +- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError +{ + NSInteger errorCode = [parseError code]; + if (errorCode == NSXMLParserDelegateAbortedParseError) + { + return; + } +} + ++ (void) changeRomSaveType:(NSInteger)saveTypeID +{ + CommonSettings.manualBackupType = (int)saveTypeID; + if (saveTypeID != ROMSAVETYPE_AUTOMATIC) + { + backup_forceManualBackupType(); + } +} + ++ (NSInteger) saveTypeByString:(NSString *)saveTypeString +{ + NSInteger saveTypeID = 0; + + if (saveTypeValues == nil) + { + return saveTypeID; + } + + NSNumber *saveTypeNumber = (NSNumber *)[saveTypeValues valueForKey:[saveTypeString lowercaseString]]; + if (saveTypeNumber == nil) + { + return saveTypeID; + } + + saveTypeID = [saveTypeNumber integerValue]; + + return saveTypeID; +} + ++ (NSMutableDictionary *) romNotLoadedBindings +{ + NSImage *iconImage = [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"AppIcon_DeSmuME" ofType:@"icns"]] autorelease]; + + return [NSMutableDictionary dictionaryWithObjectsAndKeys: + NSSTRING_STATUS_NO_ROM_LOADED, @"romInternalName", + NSSTRING_STATUS_NO_ROM_LOADED, @"romSerial", + NSSTRING_STATUS_NO_ROM_LOADED, @"bannerJapanese", + NSSTRING_STATUS_NO_ROM_LOADED, @"bannerEnglish", + NSSTRING_STATUS_NO_ROM_LOADED, @"bannerFrench", + NSSTRING_STATUS_NO_ROM_LOADED, @"bannerGerman", + NSSTRING_STATUS_NO_ROM_LOADED, @"bannerItalian", + NSSTRING_STATUS_NO_ROM_LOADED, @"bannerSpanish", + NSSTRING_STATUS_NO_ROM_LOADED, @"gameTitle", + NSSTRING_STATUS_NO_ROM_LOADED, @"gameCode", + NSSTRING_STATUS_NO_ROM_LOADED, @"makerCode", + [NSString stringWithFormat:NSSTRING_STATUS_NO_ROM_LOADED, 0], @"romSize", + [NSString stringWithFormat:@"0x%08X", 0], @"arm9BinaryOffset", + [NSString stringWithFormat:@"0x%08X", 0], @"arm9BinaryEntryAddress", + [NSString stringWithFormat:@"0x%08X", 0], @"arm9BinaryStartAddress", + [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"arm9BinarySize", + [NSString stringWithFormat:@"0x%08X", 0], @"arm7BinaryOffset", + [NSString stringWithFormat:@"0x%08X", 0], @"arm7BinaryEntryAddress", + [NSString stringWithFormat:@"0x%08X", 0], @"arm7BinaryStartAddress", + [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"arm7BinarySize", + [NSString stringWithFormat:@"0x%08X", 0], @"fntOffset", + [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"fntTableSize", + [NSString stringWithFormat:@"0x%08X", 0], @"fatOffset", + [NSString stringWithFormat:NSSTRING_STATUS_SIZE_BYTES, 0], @"fatSize", + [NSString stringWithFormat:@"0x%08X", 0], @"iconOffset", + [NSString stringWithFormat:NSSTRING_STATUS_NO_ROM_LOADED, 0], @"usedRomSize", + iconImage, @"iconImage", + nil]; +} + +@end + +/******************************************************************************************** + RomIconToRGBA8888() + + Reads the icon image data from a ROM and converts it to an RGBA8888 formatted bitmap. + + Takes: + bitmapData - Write pointer for the icon's pixel data. + + Returns: + Nothing. + + Details: + - If bitmapData is NULL, then this function immediately returns and does nothing. + - If no ROM is loaded, then bitmapData will have a black square icon. + - The caller is responsible for ensuring that bitmapData points to a valid + memory location and that the memory block is large enough to hold the pixel + data. The written data will be 32x32 pixels in 32-bit color. Therefore, a size + of at least 4096 bytes must be allocated. + ********************************************************************************************/ +void RomIconToRGBA8888(uint32_t *bitmapData) +{ + const NDS_header *ndsRomHeader = NDS_getROMHeader(); // Contains the memory addresses we need to get our read pointer locations. + int iconOffset; // Memory location offset for the ROM icon data. + const uint16_t *iconClutPtr; // Read pointer for the icon's CLUT. + const uint32_t *iconPixPtr; // Read pointer for the icon's pixel data. + + uint32_t clut[16]; // 4-bit indexed CLUT, storing RGBA8888 values for each color. + + uint32_t pixRowColors; // Temp location for storing an 8 pixel row of 4-bit indexed color values from the icon's pixel data. + unsigned int pixRowIndex; // Temp location for tracking which pixel row of an 8x8 square that we are reading. + unsigned int x; // Temp location for tracking which of the 8x8 pixel squares that we are reading (x-dimension). + unsigned int y; // Temp location for tracking which of the 8x8 pixel squares that we are reading (y-dimension). + + uint32_t *bitmapPixPtr; // Write pointer for the RGBA8888 bitmap pixel data, relative to the passed in *bitmapData pointer. + + if (bitmapData == NULL) + { + return; + } + + if (ndsRomHeader == NULL) + { + memset(bitmapData, 0, 4096); // 4096 bytes = 32px * 32px * sizeof(uint32_t) + return; + } + + // Set all of our pointers relative to iconOffset. + iconOffset = ndsRomHeader->IconOff; + iconClutPtr = (uint16_t *)&MMU.CART_ROM[iconOffset + 0x220] + 1; + iconPixPtr = (uint32_t *)&MMU.CART_ROM[iconOffset + 0x20]; + + // Setup the 4-bit color CLUT. + // + // The actual color values are stored with the ROM icon data in RGBA5551 format. + // We convert these color values and store them in the CLUT as RGBA8888 values. + // + // The first entry always represents the alpha, so we can just ignore it. + clut[0] = 0x00000000; + RGBA5551ToRGBA8888Buffer(iconClutPtr, &clut[1], 15); + + // Load the image from the icon pixel data. + // + // ROM icons are stored in 4-bit indexed color and have dimensions of 32x32 pixels. + // Also, ROM icons are split into 16 separate 8x8 pixel squares arranged in a 4x4 + // array. Here, we sequentially read from the ROM data, and adjust our write + // location appropriately within the bitmap memory block. + for(y = 0; y < 4; y++) + { + for(x = 0; x < 4; x++) + { + for(pixRowIndex = 0; pixRowIndex < 8; pixRowIndex++, iconPixPtr++) + { + // Load the entire row of pixels as a single 32-bit chunk. + pixRowColors = *iconPixPtr; + + // Set the write location. The formula below calculates the proper write + // location depending on the position of the read pointer. We use a more + // optimized version of this formula in practice. + // + // bitmapPixPtr = bitmapData + ( ((y * 8) + pixRowIndex) * 32 ) + (x * 8); + bitmapPixPtr = bitmapData + ( ((y << 3) + pixRowIndex) << 5 ) + (x << 3); + + // Set the RGBA8888 bitmap pixels using our CLUT from earlier. + +#ifdef __BIG_ENDIAN__ + *bitmapPixPtr = clut[(pixRowColors & 0x0F000000) >> 24]; + + bitmapPixPtr++; + *bitmapPixPtr = clut[(pixRowColors & 0xF0000000) >> 28]; + + bitmapPixPtr++; + *bitmapPixPtr = clut[(pixRowColors & 0x000F0000) >> 16]; + + bitmapPixPtr++; + *bitmapPixPtr = clut[(pixRowColors & 0x00F00000) >> 20]; + + bitmapPixPtr++; + *bitmapPixPtr = clut[(pixRowColors & 0x00000F00) >> 8]; + + bitmapPixPtr++; + *bitmapPixPtr = clut[(pixRowColors & 0x0000F000) >> 12]; + + bitmapPixPtr++; + *bitmapPixPtr = clut[(pixRowColors & 0x0000000F)]; + + bitmapPixPtr++; + *bitmapPixPtr = clut[(pixRowColors & 0x000000F0) >> 4]; + +#else + + *bitmapPixPtr = clut[(pixRowColors & 0x0000000F)]; + + bitmapPixPtr++; + *bitmapPixPtr = clut[(pixRowColors & 0x000000F0) >> 4]; + + bitmapPixPtr++; + *bitmapPixPtr = clut[(pixRowColors & 0x00000F00) >> 8]; + + bitmapPixPtr++; + *bitmapPixPtr = clut[(pixRowColors & 0x0000F000) >> 12]; + + bitmapPixPtr++; + *bitmapPixPtr = clut[(pixRowColors & 0x000F0000) >> 16]; + + bitmapPixPtr++; + *bitmapPixPtr = clut[(pixRowColors & 0x00F00000) >> 20]; + + bitmapPixPtr++; + *bitmapPixPtr = clut[(pixRowColors & 0x0F000000) >> 24]; + + bitmapPixPtr++; + *bitmapPixPtr = clut[(pixRowColors & 0xF0000000) >> 28]; +#endif + } + } + } +} diff --git a/desmume/src/cocoa/cocoa_videofilter.h b/desmume/src/cocoa/cocoa_videofilter.h new file mode 100644 index 000000000..e1d624a70 --- /dev/null +++ b/desmume/src/cocoa/cocoa_videofilter.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import +#include "videofilter.h" + + +/******************************************************************************************** + CocoaVideoFilter - OBJECTIVE-C CLASS + + This is an Objective-C wrapper class for the video filter C++ object. + + Thread Safety: + All methods are thread-safe. + ********************************************************************************************/ +@interface CocoaVideoFilter : NSObject +{ + VideoFilter *vf; +} + +- (id) initWithSize:(NSSize)theSize; +- (id) initWithSize:(NSSize)theSize typeID:(VideoFilterTypeID)typeID; +- (BOOL) setSourceSize:(NSSize)theSize; +- (BOOL) changeFilter:(VideoFilterTypeID)typeID; +- (UInt32 *) runFilter; +- (NSImage *) image; +- (NSBitmapImageRep *) bitmapImageRep; +- (VideoFilterTypeID) typeID; +- (NSString *) typeString; +- (UInt32 *) srcBufferPtr; +- (UInt32 *) destBufferPtr; +- (NSSize) srcSize; +- (NSSize) destSize; ++ (NSString *) typeStringByID:(VideoFilterTypeID)typeID; + +@end diff --git a/desmume/src/cocoa/cocoa_videofilter.mm b/desmume/src/cocoa/cocoa_videofilter.mm new file mode 100644 index 000000000..27c6db268 --- /dev/null +++ b/desmume/src/cocoa/cocoa_videofilter.mm @@ -0,0 +1,179 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "cocoa_videofilter.h" +#import "cocoa_util.h" + + +@implementation CocoaVideoFilter + +- (id)init +{ + return [self initWithSize:NSMakeSize(1, 1) typeID:VideoFilterTypeID_None]; +} + +- (id) initWithSize:(NSSize)theSize +{ + return [self initWithSize:theSize typeID:VideoFilterTypeID_None]; +} + +- (id) initWithSize:(NSSize)theSize typeID:(VideoFilterTypeID)typeID +{ + self = [super init]; + if (self == nil) + { + return self; + } + + vf = new VideoFilter((unsigned int)theSize.width, (unsigned int)theSize.height, typeID); + + return self; +} + +- (void)dealloc +{ + delete vf; + [super dealloc]; +} + +- (BOOL) setSourceSize:(NSSize)theSize +{ + BOOL result = NO; + + bool cResult = vf->SetSourceSize((unsigned int)theSize.width, (unsigned int)theSize.height); + if (cResult) + { + result = YES; + } + + return result; +} + +- (BOOL) changeFilter:(VideoFilterTypeID)typeID +{ + BOOL result = NO; + + bool cResult = vf->ChangeFilter(typeID); + if (cResult) + { + result = YES; + } + + return result; +} + +- (UInt32 *) runFilter +{ + return (UInt32 *)vf->RunFilter(); +} + +- (NSImage *) image +{ + NSImage *newImage = [[NSImage alloc] initWithSize:[self destSize]]; + if (newImage == nil) + { + return newImage; + } + + NSBitmapImageRep *newImageRep = [self bitmapImageRep]; + if (newImageRep == nil) + { + [newImage release]; + newImage = nil; + return newImage; + } + + [newImage addRepresentation:newImageRep]; + + return newImage; +} + +- (NSBitmapImageRep *) bitmapImageRep +{ + NSUInteger w = (NSUInteger)vf->GetDestWidth(); + NSUInteger h = (NSUInteger)vf->GetDestHeight(); + + NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL + pixelsWide:w + pixelsHigh:h + bitsPerSample:8 + samplesPerPixel:4 + hasAlpha:YES + isPlanar:NO + colorSpaceName:NSCalibratedRGBColorSpace + bytesPerRow:w * 4 + bitsPerPixel:32]; + + if(imageRep == nil) + { + return imageRep; + } + + uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData]; + RGB888ToRGBA8888Buffer((const uint32_t *)[self runFilter], bitmapData, (w * h)); + +#ifdef __BIG_ENDIAN__ + uint32_t *bitmapDataEnd = bitmapData + (w * h); + while (bitmapData < bitmapDataEnd) + { + *bitmapData++ = CFSwapInt32LittleToHost(*bitmapData); + } +#endif + + return [imageRep autorelease]; +} + +- (VideoFilterTypeID) typeID +{ + return vf->GetTypeID(); +} + +- (NSString *) typeString +{ + return [NSString stringWithCString:vf->GetTypeString() encoding:NSUTF8StringEncoding]; +} + +- (UInt32 *) srcBufferPtr +{ + return (UInt32 *)vf->GetSrcBufferPtr(); +} + +- (UInt32 *) destBufferPtr +{ + return (UInt32 *)vf->GetDestBufferPtr(); +} + +- (NSSize) srcSize +{ + return NSMakeSize((CGFloat)vf->GetSrcWidth(), (CGFloat)vf->GetSrcHeight()); +} + +- (NSSize) destSize +{ + return NSMakeSize((CGFloat)vf->GetDestWidth(), (CGFloat)vf->GetDestHeight()); +} + ++ (NSString *) typeStringByID:(VideoFilterTypeID)typeID +{ + const char *vfTypeCString = VideoFilter::GetTypeStringByID(typeID); + NSString *vfTypeString = [NSString stringWithCString:vfTypeCString encoding:NSUTF8StringEncoding]; + + return vfTypeString; +} + +@end diff --git a/desmume/src/cocoa/images/ColorSwatch_Blue_16x16.png b/desmume/src/cocoa/images/ColorSwatch_Blue_16x16.png new file mode 100644 index 000000000..2c63ac3ff Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_Blue_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_Brown_16x16.png b/desmume/src/cocoa/images/ColorSwatch_Brown_16x16.png new file mode 100644 index 000000000..73e721f40 Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_Brown_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_DarkBlue_16x16.png b/desmume/src/cocoa/images/ColorSwatch_DarkBlue_16x16.png new file mode 100644 index 000000000..c02e5d181 Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_DarkBlue_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_DarkGreen_16x16.png b/desmume/src/cocoa/images/ColorSwatch_DarkGreen_16x16.png new file mode 100644 index 000000000..b6121f57f Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_DarkGreen_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_DarkPurple_16x16.png b/desmume/src/cocoa/images/ColorSwatch_DarkPurple_16x16.png new file mode 100644 index 000000000..71578eb9b Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_DarkPurple_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_Gray_16x16.png b/desmume/src/cocoa/images/ColorSwatch_Gray_16x16.png new file mode 100644 index 000000000..39f2b3317 Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_Gray_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_Green_16x16.png b/desmume/src/cocoa/images/ColorSwatch_Green_16x16.png new file mode 100644 index 000000000..d97ae5f32 Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_Green_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_LimeGreen_16x16.png b/desmume/src/cocoa/images/ColorSwatch_LimeGreen_16x16.png new file mode 100644 index 000000000..4e8e18069 Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_LimeGreen_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_Magenta_16x16.png b/desmume/src/cocoa/images/ColorSwatch_Magenta_16x16.png new file mode 100644 index 000000000..4635bd1f6 Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_Magenta_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_Orange_16x16.png b/desmume/src/cocoa/images/ColorSwatch_Orange_16x16.png new file mode 100644 index 000000000..35252607d Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_Orange_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_Pink_16x16.png b/desmume/src/cocoa/images/ColorSwatch_Pink_16x16.png new file mode 100644 index 000000000..e21a201c9 Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_Pink_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_Red_16x16.png b/desmume/src/cocoa/images/ColorSwatch_Red_16x16.png new file mode 100644 index 000000000..129a11395 Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_Red_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_SeaGreen_16x16.png b/desmume/src/cocoa/images/ColorSwatch_SeaGreen_16x16.png new file mode 100644 index 000000000..24faadafb Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_SeaGreen_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_Turquoise_16x16.png b/desmume/src/cocoa/images/ColorSwatch_Turquoise_16x16.png new file mode 100644 index 000000000..19db15969 Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_Turquoise_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_Violet_16x16.png b/desmume/src/cocoa/images/ColorSwatch_Violet_16x16.png new file mode 100644 index 000000000..e38ddb0a4 Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_Violet_16x16.png differ diff --git a/desmume/src/cocoa/images/ColorSwatch_Yellow_16x16.png b/desmume/src/cocoa/images/ColorSwatch_Yellow_16x16.png new file mode 100644 index 000000000..71b331363 Binary files /dev/null and b/desmume/src/cocoa/images/ColorSwatch_Yellow_16x16.png differ diff --git a/desmume/src/cocoa/images/Icon_ActionReplay_128x128.png b/desmume/src/cocoa/images/Icon_ActionReplay_128x128.png new file mode 100644 index 000000000..e3757987e Binary files /dev/null and b/desmume/src/cocoa/images/Icon_ActionReplay_128x128.png differ diff --git a/desmume/src/cocoa/images/Icon_ActionReplay_32x32.png b/desmume/src/cocoa/images/Icon_ActionReplay_32x32.png new file mode 100644 index 000000000..31a107996 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_ActionReplay_32x32.png differ diff --git a/desmume/src/cocoa/images/Icon_ArrowDown_420x420.png b/desmume/src/cocoa/images/Icon_ArrowDown_420x420.png new file mode 100644 index 000000000..a2ba85bf9 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_ArrowDown_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_ArrowLeft_420x420.png b/desmume/src/cocoa/images/Icon_ArrowLeft_420x420.png new file mode 100644 index 000000000..917f8962d Binary files /dev/null and b/desmume/src/cocoa/images/Icon_ArrowLeft_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_ArrowRight_420x420.png b/desmume/src/cocoa/images/Icon_ArrowRight_420x420.png new file mode 100644 index 000000000..f1ac24f29 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_ArrowRight_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_ArrowUp_420x420.png b/desmume/src/cocoa/images/Icon_ArrowUp_420x420.png new file mode 100644 index 000000000..89cc37abc Binary files /dev/null and b/desmume/src/cocoa/images/Icon_ArrowUp_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_CodeBreaker_128x128.png b/desmume/src/cocoa/images/Icon_CodeBreaker_128x128.png new file mode 100644 index 000000000..bc418a690 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_CodeBreaker_128x128.png differ diff --git a/desmume/src/cocoa/images/Icon_CodeBreaker_32x32.png b/desmume/src/cocoa/images/Icon_CodeBreaker_32x32.png new file mode 100644 index 000000000..7f2796ed1 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_CodeBreaker_32x32.png differ diff --git a/desmume/src/cocoa/images/Icon_DSButtonA_420x420.png b/desmume/src/cocoa/images/Icon_DSButtonA_420x420.png new file mode 100644 index 000000000..137d81565 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_DSButtonA_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_DSButtonB_420x420.png b/desmume/src/cocoa/images/Icon_DSButtonB_420x420.png new file mode 100644 index 000000000..c64ffda4c Binary files /dev/null and b/desmume/src/cocoa/images/Icon_DSButtonB_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_DSButtonL_420x420.png b/desmume/src/cocoa/images/Icon_DSButtonL_420x420.png new file mode 100644 index 000000000..da80643b3 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_DSButtonL_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_DSButtonR_420x420.png b/desmume/src/cocoa/images/Icon_DSButtonR_420x420.png new file mode 100644 index 000000000..1a99addae Binary files /dev/null and b/desmume/src/cocoa/images/Icon_DSButtonR_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_DSButtonSelect_420x420.png b/desmume/src/cocoa/images/Icon_DSButtonSelect_420x420.png new file mode 100644 index 000000000..5bc4c0203 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_DSButtonSelect_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_DSButtonStart_420x420.png b/desmume/src/cocoa/images/Icon_DSButtonStart_420x420.png new file mode 100644 index 000000000..43aac1b40 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_DSButtonStart_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_DSButtonX_420x420.png b/desmume/src/cocoa/images/Icon_DSButtonX_420x420.png new file mode 100644 index 000000000..fdd442603 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_DSButtonX_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_DSButtonY_420x420.png b/desmume/src/cocoa/images/Icon_DSButtonY_420x420.png new file mode 100644 index 000000000..afee39f22 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_DSButtonY_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_DeSmuME_32x32.png b/desmume/src/cocoa/images/Icon_DeSmuME_32x32.png new file mode 100644 index 000000000..9da443e64 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_DeSmuME_32x32.png differ diff --git a/desmume/src/cocoa/images/Icon_DoubleSpeed_420x420.png b/desmume/src/cocoa/images/Icon_DoubleSpeed_420x420.png new file mode 100644 index 000000000..86a66bc47 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_DoubleSpeed_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_Emulation_420x420.png b/desmume/src/cocoa/images/Icon_Emulation_420x420.png new file mode 100644 index 000000000..3f9268197 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_Emulation_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_Input_420x420.png b/desmume/src/cocoa/images/Icon_Input_420x420.png new file mode 100644 index 000000000..e094e4ca7 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_Input_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_Microphone_420x420.png b/desmume/src/cocoa/images/Icon_Microphone_420x420.png new file mode 100644 index 000000000..0563e4095 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_Microphone_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_OpenROM_420x420.png b/desmume/src/cocoa/images/Icon_OpenROM_420x420.png new file mode 100644 index 000000000..907d5cb20 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_OpenROM_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_Reset_420x420.png b/desmume/src/cocoa/images/Icon_Reset_420x420.png new file mode 100644 index 000000000..52dd3d601 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_Reset_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_RotateCCW_420x420.png b/desmume/src/cocoa/images/Icon_RotateCCW_420x420.png new file mode 100644 index 000000000..60b313e50 Binary files /dev/null and b/desmume/src/cocoa/images/Icon_RotateCCW_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_RotateCW_420x420.png b/desmume/src/cocoa/images/Icon_RotateCW_420x420.png new file mode 100644 index 000000000..4378fd15f Binary files /dev/null and b/desmume/src/cocoa/images/Icon_RotateCW_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_ShowHUD_420x420.png b/desmume/src/cocoa/images/Icon_ShowHUD_420x420.png new file mode 100644 index 000000000..a8dce5c1a Binary files /dev/null and b/desmume/src/cocoa/images/Icon_ShowHUD_420x420.png differ diff --git a/desmume/src/cocoa/images/Icon_Speaker_420x420.png b/desmume/src/cocoa/images/Icon_Speaker_420x420.png new file mode 100644 index 000000000..5cec2eb5c Binary files /dev/null and b/desmume/src/cocoa/images/Icon_Speaker_420x420.png differ diff --git a/desmume/src/cocoa/images/VideoFilterPreview_64x64.png b/desmume/src/cocoa/images/VideoFilterPreview_64x64.png new file mode 100644 index 000000000..2fd40c629 Binary files /dev/null and b/desmume/src/cocoa/images/VideoFilterPreview_64x64.png differ diff --git a/desmume/src/cocoa/translations/English.lproj/HID_usage_strings.plist b/desmume/src/cocoa/translations/English.lproj/HID_usage_strings.plist new file mode 100644 index 000000000..1953bcf97 --- /dev/null +++ b/desmume/src/cocoa/translations/English.lproj/HID_usage_strings.plist @@ -0,0 +1,1704 @@ + + + + + 0x0001 + + 0x0000 + Undefined Usage + 0x0001 + Pointer + 0x0002 + Mouse + 0x0004 + Joystick + 0x0005 + GamePad + 0x0006 + Keyboard + 0x0007 + Keypad + 0x0008 + MultiAxisController + 0x0030 + X + 0x0031 + Y + 0x0032 + Z + 0x0033 + Rx + 0x0034 + Ry + 0x0035 + Rz + 0x0036 + Slider + 0x0037 + Dial + 0x0038 + Wheel + 0x0039 + Hatswitch + 0x003A + Counted Buffer + 0x003B + Byte Count + 0x003C + Motion Wakeup + 0x003D + Start + 0x003E + Select + 0x0040 + Vx + 0x0041 + Vy + 0x0042 + Vz + 0x0043 + Vbrx + 0x0044 + Vbry + 0x0045 + Vbrz + 0x0046 + Vno + 0x0080 + System Control + 0x0081 + System Power Down + 0x0082 + System Sleep + 0x0083 + System Wake Up + 0x0084 + SystemContext Menu + 0x0085 + System Main Menu + 0x0086 + System App Menu + 0x0087 + System Menu help + 0x0088 + System Menu Exit + 0x0089 + System Menu + 0x008A + System Menu Right + 0x008B + System Menu Left + 0x008C + System Menu Up + 0x008D + System Menu Down + 0x0090 + DPad Up + 0x0091 + DPad Down + 0x0092 + DPad Right + 0x0093 + DPad Left + Name + Generic Desktop + + 0x0002 + + 0x0000 + Undefined Usage + 0x0001 + Flight Simulation Device + 0x0002 + Automobile Simulation Device + 0x0003 + Tank Simulation Device + 0x0004 + Spaceship Simulation Device + 0x0005 + Submarine Simulation Device + 0x0006 + Sailing Simulation Device + 0x0007 + Motorcycle Simulation Device + 0x0008 + Sports Simulation Device + 0x0009 + Airplane Simulation Device + 0x000A + Helicopter Simulation Device + 0x000B + Magic Carpet Simulation Device + 0x000C + Bicycle Simulation Device + 0x0020 + Flight Control Stick + 0x0021 + Flight Stick + 0x0022 + Cyclic Control + 0x0023 + Cyclic Trim + 0x0024 + Flight Yoke + 0x0025 + Track Control + 0x00B0 + Aileron + 0x00B1 + Aileron Trim + 0x00B2 + Anti Torque Control + 0x00B5 + Collective Control + 0x00B6 + Dive Brake + 0x00B7 + Electronic Countermeasures + 0x00B8 + Elevator + 0x00B9 + Elevator Trim + 0x00BA + Rudder + 0x00BB + Throttle + 0x00BC + Flight Communications + 0x00BD + Flare Release + 0x00BE + Landing Gear + 0x00BF + Toe Brake + 0x00C0 + Trigger + 0x00C1 + Weapons Arm + 0x00C2 + Weapons + 0x00C3 + Wing Flaps + 0x00C4 + Accelerator + 0x00C5 + Brake + 0x00C6 + Clutch + 0x00C7 + Shifter + 0x00C8 + Steering + 0x00C9 + Turret Direction + 0x00CA + Barrel Elevation + 0x00CB + Dive Plane + 0x00CC + Ballast + 0x00CD + Bicycle Crank + 0x00CE + Handle Bars + 0x00CF + Front Brake + 0x00D0 + Rear Brake + Name + Simulation + + 0x0003 + + 0x0000 + Undefined Usage + 0x0001 + Belt + 0x0002 + Body Suit + 0x0003 + Flexor + 0x0004 + Glove + 0x0005 + Head Tracker + 0x0006 + Head Mounted Display + 0x0007 + Hand Tracker + 0x0008 + Oculometer + 0x0009 + Vest + 0x000A + Animatronic Device + 0x0020 + Stereo Enable + 0x0021 + Display Enable + Name + Virtual Reality + + 0x0004 + + 0x0000 + Undefined Usage + 0x0001 + Baseball Bat + 0x0002 + Golf Club + 0x0003 + Rowing Machine + 0x0004 + Treadmill + 0x0030 + Oar + 0x0031 + Slope + 0x0032 + Rate + 0x0033 + Stick Speed + 0x0034 + Stick Face Angle + 0x0035 + Stick Heel Or Toe + 0x0036 + Stick Follow Through + 0x0037 + Stick Tempo + 0x0038 + Stick Type + 0x0039 + Stick Height + 0x0050 + Putter + 0x0051 + 1 Iron + 0x0052 + 2 Iron + 0x0053 + 3 Iron + 0x0054 + 4 Iron + 0x0055 + 5 Iron + 0x0056 + 6 Iron + 0x0057 + 7 Iron + 0x0058 + 8 Iron + 0x0059 + 9 Iron + 0x005A + 10 Iron + 0x005B + 11 Iron + 0x005C + Sand Wedge + 0x005D + Loft Wedge + 0x005E + Power Wedge + 0x005F + 1 Wood + 0x0060 + 3 Wood + 0x0061 + 5 Wood + 0x0062 + 7 Wood + 0x0063 + 9 Wood + Name + Sport + + 0x0005 + + 0x0000 + Undefined Usage + 0x0001 + 3D Game Controller + 0x0002 + Pinball Device + 0x0003 + Gun + 0x0020 + Point of View + 0x0021 + Turn Right Or Left + 0x0022 + Pitch Up Or Down + 0x0023 + Roll Right Or Left + 0x0024 + Move Right Or Left + 0x0025 + Move Forward Or Backward + 0x0026 + Move Up Or Down + 0x0027 + Lean Right Or Left + 0x0029 + Height Of POV + 0x002A + Flipper + 0x002B + Secondary Flipper + 0x002C + Bump + 0x002D + New Game + 0x002E + Shoot Ball + 0x002F + Player + 0x0030 + Gun Bolt + 0x0031 + Gun Clip + 0x0032 + Gun + 0x0033 + Gun Single Shot + 0x0034 + Gun Burst + 0x0035 + Gun Automatic + 0x0036 + Gun Safety + 0x0037 + Gamepad Fire Or Jump + 0x0039 + Gamepad Trigger + Name + Game + + 0x0007 + + 0x0000 + Undefined Usage + 0x0001 + Error Roll Over + 0x0002 + POST Fail + 0x0003 + Error Undefined + 0x0004 + A + 0x0005 + B + 0x0006 + C + 0x0007 + D + 0x0008 + E + 0x0009 + F + 0x000A + G + 0x000B + H + 0x000C + I + 0x000D + J + 0x000E + K + 0x000F + L + 0x0010 + M + 0x0011 + N + 0x0012 + O + 0x0013 + P + 0x0014 + Q + 0x0015 + R + 0x0016 + S + 0x0017 + T + 0x0018 + U + 0x0019 + V + 0x001A + W + 0x001B + X + 0x001C + Y + 0x001D + Z + 0x001E + 1 + 0x001F + 2 + 0x0020 + 3 + 0x0021 + 4 + 0x0022 + 5 + 0x0023 + 6 + 0x0024 + 7 + 0x0025 + 8 + 0x0026 + 9 + 0x0027 + 0 + 0x0028 + Return + 0x0029 + Escape + 0x002A + Delete + 0x002B + Tab + 0x002C + Spacebar + 0x002D + Dash + 0x002E + Equal + 0x002F + Left Square Bracket + 0x0030 + Right Square Bracket + 0x0031 + Slash + 0x0032 + Non-US # + 0x0033 + Semi-Colan + 0x0034 + Single Quote + 0x0035 + Grave Accent + 0x0036 + Comma + 0x0037 + Period + 0x0038 + Slash + 0x0039 + Caps Lock + 0x003A + F1 + 0x003B + F2 + 0x003C + F3 + 0x003D + F4 + 0x003E + F5 + 0x003F + F6 + 0x0040 + F7 + 0x0041 + F8 + 0x0042 + F9 + 0x0043 + F10 + 0x0044 + F11 + 0x0045 + F12 + 0x0046 + Print Screen + 0x0047 + Scroll Lock + 0x0048 + Pause + 0x0049 + Insert + 0x004A + Home + 0x004B + Page Up + 0x004C + Delete Forward + 0x004D + End + 0x004E + Page Down + 0x004F + Right Arrow + 0x0050 + Left Arrow + 0x0051 + Down Arrow + 0x0052 + Up Arrow + 0x0053 + Keypad NumLock + 0x0054 + Keypad Slash + 0x0055 + Keypad Asterisk + 0x0056 + Keypad Dash + 0x0057 + Keypad Plus + 0x0058 + Keypad Enter + 0x0059 + Keypad 1 + 0x005A + Keypad 2 + 0x005B + Keypad 3 + 0x005C + Keypad 4 + 0x005D + Keypad 5 + 0x005E + Keypad 6 + 0x005F + Keypad 7 + 0x0060 + Keypad 8 + 0x0061 + Keypad 9 + 0x0062 + Keypad 0 + 0x0063 + Keypad Period + 0x0064 + Non-US Backslash + 0x0065 + Application + 0x0066 + Power + 0x0067 + Keypad Equal + 0x0068 + F13 + 0x0069 + F14 + 0x006A + F15 + 0x006B + F16 + 0x006C + F17 + 0x006D + F18 + 0x006E + F19 + 0x006F + F20 + 0x0070 + F21 + 0x0071 + F22 + 0x0072 + F23 + 0x0073 + F24 + 0x0074 + Execute + 0x0075 + Help + 0x0076 + Menu + 0x0077 + Select + 0x0078 + Stop + 0x0079 + Again + 0x007A + Undo + 0x007B + Cut + 0x007C + Copy + 0x007D + Paste + 0x007E + Find + 0x007F + Mute + 0x0080 + Volume Up + 0x0081 + Volume Down + 0x0082 + Locking Caps Lock + 0x0083 + Locking Num Lock + 0x0084 + Locking Scroll Lock + 0x0085 + Keypad Comma + 0x0086 + Keypad Equal Sign for AS-400 + 0x0087 + International1 + 0x0088 + International2 + 0x0089 + International3 + 0x008A + International4 + 0x008B + International5 + 0x008C + International6 + 0x008D + International7 + 0x008E + International8 + 0x008F + International9 + 0x0090 + LANG1 + 0x0091 + LANG2 + 0x0092 + LANG3 + 0x0093 + LANG4 + 0x0094 + LANG5 + 0x0095 + LANG6 + 0x0096 + LANG7 + 0x0097 + LANG8 + 0x0098 + LANG9 + 0x0099 + Alternate Erase + 0x009A + SysReq or Attention + 0x009B + Cancel + 0x009C + Clear + 0x009D + Prior + 0x009E + Return + 0x009F + Separator + 0x00A0 + Out + 0x00A1 + Oper + 0x00A2 + Clear or Again + 0x00A3 + CrSel or Props + 0x00A4 + ExSel + 0x00E0 + Left Control + 0x00E1 + Left Shift + 0x00E2 + Left Alt + 0x00E3 + Left GUI + 0x00E4 + Right Control + 0x00E5 + Right Shift + 0x00E6 + Right Alt + 0x00E7 + Right GUI + Name + Keyboard or Keypad + + 0x0008 + + 0x0000 + Undefined Usage + 0x0001 + Num Lock + 0x0002 + Caps Lock + 0x0003 + Scroll Lock + 0x0004 + Compose + 0x0005 + Kana + 0x0006 + Power + 0x0007 + Shift + 0x0008 + DoNotDisturb + 0x0009 + Mute + 0x000A + Tone Enable + 0x000B + High Cut Filter + 0x000C + Low Cut Filter + 0x000D + Equalizer Enable + 0x000E + Sound Field On + 0x000F + Surround On + 0x0010 + Repeat + 0x0011 + Stereo + 0x0012 + Sampling Rate Detect + 0x0013 + Spinning + 0x0014 + CAV + 0x0015 + CLV + 0x0016 + Recording Format Detect + 0x0017 + Off Hook + 0x0018 + Ring + 0x0019 + Message Waiting + 0x001A + Data Mode + 0x001B + Battery Operation + 0x001C + Battery OK + 0x001D + Battery Low + 0x001E + Speaker + 0x001F + Headset + 0x0020 + Hold + 0x0021 + Microphone + 0x0022 + Coverage + 0x0023 + Night Mode + 0x0024 + Send Calls + 0x0025 + Call Pickup + 0x0026 + Conference + 0x0027 + Stand By + 0x0028 + Camera On + 0x0029 + Camera Off + 0x002A + On Line + 0x002B + Off Line + 0x002C + Busy + 0x002D + Ready + 0x002E + Paper Out + 0x002F + Paper Jam + 0x0030 + Remote + 0x0031 + Forward + 0x0032 + Reverse + 0x0033 + Stop + 0x0034 + Rewind + 0x0035 + Fast Forward + 0x0036 + Play + 0x0037 + Pause + 0x0038 + Record + 0x0039 + Error + 0x003A + Usage + 0x003B + Usage In Use Indicator + 0x003C + Usage Multi Mode indicator + 0x003D + Indicator On + 0x003E + Indicator Flash + 0x003F + Indicator Slow Blink + 0x0040 + Indicator Fast Blink + 0x0041 + Indicator Off + 0x0042 + Flash On Time + 0x0043 + Slow Blink On Time + 0x0044 + Slow Blink Off Time + 0x0045 + Fast Blink On Time + 0x0046 + Fast Blink Off Time + 0x0047 + Usage Indicator Color + 0x0048 + Indicator Red + 0x0049 + Indicator Green + 0x004A + Indicator Amber + 0x004B + Generic Indicator + 0x004C + System Suspend + 0x004D + External Power Connected + Name + LED + + 0x0009 + + Name + Button + + 0x000C + + 0x0000 + Undefined Usage + 0x0001 + Consumer Control + 0x0002 + Numeric KeyPad + 0x0003 + Programmable Buttons + 0x0020 + Plus 10 + 0x0021 + Plus 100 + 0x0022 + AM Or PM + 0x0030 + Power + 0x0031 + Reset + 0x0032 + Sleep + 0x0033 + Sleep After + 0x0034 + Sleep Mode + 0x0035 + Illumination + 0x0036 + Function Buttons + 0x0040 + Menu + 0x0041 + Menu Pick + 0x0042 + Menu Up + 0x0043 + Menu Down + 0x0044 + Menu Left + 0x0045 + Menu Right + 0x0046 + Menu Escape + 0x0047 + Menu Value Increase + 0x0048 + Menu Value Decrease + 0x0060 + Data On Screen + 0x0061 + Closed Caption + 0x0062 + Closed Caption Select + 0x0063 + VCR Or TV + 0x0064 + Broadcast Mode + 0x0065 + Snapshot + 0x0066 + Still + 0x0080 + Selection + 0x0081 + Assign + 0x0082 + Mode Step + 0x0083 + Recall Last + 0x0084 + Enter Channel + 0x0085 + Order Movie + 0x0086 + Channel + 0x0087 + Media Selection + 0x0088 + Media Select Computer + 0x0089 + Media Select TV + 0x008A + Media Select WWW + 0x008B + Media Select DVD + 0x008E + Media Select Video Phone + 0x008F + Media Select Games + 0x0090 + Media Select Messages + 0x0091 + Media Select CD + 0x0092 + Media Select VCR + 0x0093 + Media Select Tuner + 0x0094 + Quit + 0x0095 + Help + 0x0096 + Media Select Tape + 0x0097 + Media Select Cable + 0x0098 + Media Select Satellite + 0x0099 + Media Select Security + 0x009A + Media Select Home + 0x009B + Media Select Call + 0x009C + Channel Increment + 0x009D + Channel Decrement + 0x009E + Media + 0x00A0 + VCR Plus + 0x00A1 + Once + 0x00A2 + Daily + 0x00A3 + Weekly + 0x00A4 + Monthly + 0x00B0 + Play + 0x00B1 + Pause + 0x00B2 + Record + 0x00B3 + Fast Forward + 0x00B4 + Rewind + 0x00B5 + Scan Next Track + 0x00B6 + Scan Previous Track + 0x00B7 + Stop + 0x00B8 + Eject + 0x00B9 + Random Play + 0x00BA + Select Disc + 0x00BB + Enter Disc + 0x00BC + Repeat + 0x00BD + Tracking + 0x00BE + Track Normal + 0x00BF + Slow Tracking + 0x00C0 + Frame Forward + 0x00C1 + Frame Back + 0x00C2 + Mark + 0x00C3 + Clear Mark + 0x00C4 + Repeat From Mark + 0x00C5 + Return To Mark + 0x00C6 + Search Mark Forward + 0x00C7 + Search Mark Backwards + 0x00C8 + Counter Reset + 0x00C9 + Show Counter + 0x00CA + Tracking Increment + 0x00CB + Tracking Decrement + 0x00CC + Stop Or Eject + 0x00CD + Play Or Pause + 0x00CE + Play Or Skip + 0x00E0 + Volume + 0x00E1 + Balance + 0x00E2 + Mute + 0x00E3 + Bass + 0x00E4 + Treble + 0x00E5 + Bass Boost + 0x00E6 + Surround Mode + 0x00E7 + Loudness + 0x00E8 + MPX + 0x00E9 + Volume Increment + 0x00EA + Volume Decrement + 0x00F0 + Speed + 0x00F1 + Playback Speed + 0x00F2 + Standard Play + 0x00F3 + Long Play + 0x00F4 + Extended Play + 0x00F5 + Slow + 0x0100 + Fan Enable + 0x0101 + Fan Speed + 0x0102 + Light Enable + 0x0103 + Light Illumination Level + 0x0104 + Climate Control Enable + 0x0105 + Room Temperature + 0x0106 + Security Enable + 0x0107 + Fire Alarm + 0x0108 + Police Alarm + 0x0150 + Balance Right + 0x0151 + Balance Left + 0x0152 + Bass Increment + 0x0153 + Bass Decrement + 0x0154 + Treble Increment + 0x0155 + Treble Decrement + 0x0160 + Speaker System + 0x0161 + Channel Left + 0x0162 + Channel Right + 0x0164 + Channel Front + 0x0165 + Channel Center Front + 0x0166 + Channel Side + 0x0167 + Channel Surround + 0x0168 + Channel Low Frequency Enhancement + 0x0169 + Channel Top + 0x016A + Channel Unknown + 0x0170 + Sub Channel + 0x0171 + Sub Channel Increment + 0x0172 + Sub Channel Decrement + 0x0173 + Alternate Audio Increment + 0x0174 + Alternate Audio Decrement + 0x0180 + Application Launch Buttons + 0x0181 + AL Launch Button Configuration Tool + 0x0182 + AL Programmable Button Configuration + 0x0183 + AL Consumer Control Configuration + 0x0184 + AL Word Processor + 0x0185 + AL Text Editor + 0x0186 + AL Spreadsheet + 0x0187 + AL Graphics Editor + 0x0188 + AL Presentation App + 0x0189 + AL Database App + 0x018A + AL Email Reader + 0x018B + AL Newsreader + 0x018C + AL Voicemail + 0x018D + AL Contacts Or AddressBook + 0x018E + AL Calendar Or Schedule + 0x018F + AL Task Or Project Manager + 0x0190 + AL Log Or Journal Or Timecard + 0x0191 + AL Checkbook Or Finance + 0x0192 + AL Calculator + 0x0193 + AL A Or V Capture Or Playback + 0x0194 + AL Local Machine Browser + 0x0195 + AL LAN Or WAN Browser + 0x0196 + AL Internet Browser + 0x0197 + AL Remote Networking Or ISP Connect + 0x0198 + AL Network Conference + 0x0199 + AL Network Chat + 0x019A + AL Telephony Or Dialer + 0x019B + AL Logon + 0x019C + AL Logoff + 0x019D + AL Logon Or Logoff + 0x019E + AL Terminal Lock Or Screensaver + 0x019F + AL Control Panel + 0x01A0 + AL Command Line Processor Or Run + 0x01A1 + AL Process Or Task Manager + 0x01A2 + AL + 0x01A3 + AL Next Task Or Application + 0x01A4 + AL Previous Task Or Application + 0x01A5 + AL Preemptive Halt Task Or Application + 0x0200 + Generic GUI Application Controls + 0x0201 + AC New + 0x0202 + AC Open + 0x0203 + AC Close + 0x0204 + AC Exit + 0x0205 + AC Maximize + 0x0206 + AC Minimize + 0x0207 + AC Save + 0x0208 + AC Print + 0x0209 + AC Properties + 0x021A + AC Undo + 0x021B + AC Copy + 0x021C + AC Cut + 0x021D + AC Paste + 0x021E + AC + 0x021F + AC Find + 0x0220 + AC Find and Replace + 0x0221 + AC Search + 0x0222 + AC Go To + 0x0223 + AC Home + 0x0224 + AC Back + 0x0225 + AC Forward + 0x0226 + AC Stop + 0x0227 + AC Refresh + 0x0228 + AC Previous Link + 0x0229 + AC Next Link + 0x022A + AC Bookmarks + 0x022B + AC History + 0x022C + AC Subscriptions + 0x022D + AC Zoom In + 0x022E + AC Zoom Out + 0x022F + AC Zoom + 0x0230 + AC Full Screen View + 0x0231 + AC Normal View + 0x0232 + AC View Toggle + 0x0233 + AC Scroll Up + 0x0234 + AC Scroll Down + 0x0235 + AC Scroll + 0x0236 + AC Pan Left + 0x0237 + AC Pan Right + 0x0238 + AC Pan + 0x0239 + AC New Window + 0x023A + AC Tile Horizontally + 0x023B + AC Tile Vertically + 0x023C + AC Format + Name + Consumer + + 0x0084 + + 0x0000 + Undefined Usage + 0x0001 + Name Index + 0x0002 + Present Status + 0x0003 + Changed Status + 0x0004 + Uninterruptible Power Supply + 0x0005 + Power Supply + 0x0010 + Battery System power module + 0x0011 + Battery System ID + 0x0012 + Battery + 0x0013 + Battery ID + 0x0014 + Charger + 0x0015 + Charger ID + 0x0016 + Power Converter power module + 0x0017 + Power Converter ID + 0x0018 + Outlet System power module + 0x0019 + Outlet System ID + 0x001A + Input + 0x001B + Input ID + 0x001C + Output + 0x001D + Output ID + 0x001E + Flow + 0x001F + Flow ID + 0x0020 + Outlet + 0x0021 + Outlet ID + 0x0022 + Gang + 0x0023 + Gang ID + 0x0024 + Power Summary + 0x0025 + Power Summary ID + 0x0030 + Voltage + 0x0031 + Current + 0x0032 + Frequency + 0x0033 + Apparent Power + 0x0034 + RMS Power + 0x0035 + Percent Load + 0x0036 + Temperature + 0x0037 + Humidity + 0x0038 + Bad Condition Count + 0x0040 + Nominal Voltage + 0x0041 + Nominal Current + 0x0042 + Nominal Frequency + 0x0043 + Nominal Apparent Power + 0x0044 + Nominal RMS Power + 0x0045 + Nominal Percent Load + 0x0046 + Nominal Temperature + 0x0047 + Nominal Humidity + 0x0050 + Switch On Control + 0x0051 + Switch Off Control + 0x0052 + Toogle Sequence Control + 0x0053 + Min Transfer Voltage + 0x0054 + Max Transfer Voltage + 0x0055 + Delay Before Reboot + 0x0056 + Delay Before Startup + 0x0057 + Delay Before Shutdown + 0x0058 + Test Request/Result + 0x0059 + Reset Request/Result + 0x005A + Audible Alarm Control + 0x0060 + Present + 0x0061 + Good + 0x0062 + Internal Failure + 0x0063 + Voltage Out Of Range + 0x0064 + Frequency Out Of Range + 0x0065 + Overload + 0x0066 + Over Charged + 0x0067 + Over Temperature + 0x0068 + Shutdown Requested + 0x0069 + Shutdown Imminent + 0x006B + On/Off Switch Status + 0x006C + Switchable + 0x006D + Used + 0x006E + Boosted + 0x006F + Bucked + 0x0070 + Initialized + 0x0071 + Tested + 0x0072 + Awaiting Power + 0x0073 + Communication Lost + 0x00FD + Manufacturer String Index + 0x00FE + Product String Index + 0x00FF + Serial Number String Index + Name + Power Device Page + + 0x0085 + + 0x0000 + Undefined Usage + 0x0001 + Mode + 0x0002 + Status + 0x0003 + Alarm Warning + 0x0004 + Charger Mode + 0x0005 + Charger Status + 0x0006 + Charger Extended Status + 0x0007 + Selector State + 0x0008 + Selector Presets + 0x0009 + Selector Info + 0x0010 + Mfg Function 1 + 0x0011 + Mfg Function 2 + 0x0012 + Mfg Function 3 + 0x0013 + Mfg Function 4 + 0x0014 + Mfg Function 5 + 0x0015 + Connection To System Management Bus + 0x0016 + Output Connection Status + 0x0017 + Charger Connection + 0x0018 + Battery Insertion + 0x0019 + Use Next + 0x001A + OK To Use + 0x001B + Battery Supported + 0x001C + Selector Revision + 0x001D + Charging Indicator + 0x0028 + Manufacturer Access + 0x0029 + Remaining Capacity Limit + 0x002A + Remaining Time Limit + 0x002B + At Rate... + 0x002C + Capacity Mode + 0x002D + Broadcast To Charger + 0x002E + Primary Battery + 0x002F + Charge Controller + 0x0040 + Terminate Charge + 0x0041 + Terminate Discharge + 0x0042 + Below Remaining Capacity Limit + 0x0043 + Remaining Time Limit Expired + 0x0044 + Charging + 0x0045 + Discharging + 0x0046 + Fully Charged + 0x0047 + Fully Discharged + 0x0048 + Conditioning Flag + 0x0049 + At Rate OK + 0x004A + SMB Error Code + 0x004B + Need Replacement + 0x0060 + At Rate Time To Full + 0x0061 + At Rate Time To Empty + 0x0062 + Average Current + 0x0063 + Max Error + 0x0065 + Absolute State Of Charge + 0x0066 + Remaining Capacity + 0x0067 + Full Charge Capacity + 0x0068 + Run Time To Empty + 0x0069 + Average Time To Empty + 0x006A + Average Time To Full + 0x006B + Cycle Count + 0x0080 + Batt Pack Model Level + 0x0081 + Internal Charge Controller + 0x0082 + Primary Battery Support + 0x0083 + Design Capacity + 0x0084 + Specification Info + 0x0085 + Manufacturer Date + 0x0086 + Serial Number + 0x0087 + Manufacturer Name Index + 0x0088 + Device Name Index + 0x0089 + Device Chemistry Index + 0x008A + Manufacturer Data + 0x008B + Rechargable + 0x008C + Warning Capacity Limit + 0x008D + Capacity Granularity 1 + 0x008E + Capacity Granularity 2 + 0x008F + OEM Information Index + 0x00C0 + Inhibit Charge + 0x00C1 + Enable Polling + 0x00C2 + Reset To Zero + 0x00D0 + AC Present + 0x00D1 + Battery Present + 0x00D2 + Power Fail + 0x00D3 + Alarm Inhibited + 0x00D4 + Thermistor Under Range + 0x00D5 + Thermistor Hot + 0x00D6 + Thermistor Cold + 0x00D7 + Thermistor Over Range + 0x00D8 + Voltage Out Of Range + 0x00D9 + Current Out Of Range + 0x00DA + Current Not Regulated + 0x00DB + Voltage Not Regulated + 0x00DC + Master Mode + 0x00F0 + Charger Support Selector + 0x00F1 + Charger Specification + 0x00F2 + Charger Level 2 + 0x00F3 + Charger Level 3 + Name + Battery System Page + + 0xFF00 + + Name + Vendor + + + diff --git a/desmume/src/cocoa/translations/English.lproj/MainMenu.strings b/desmume/src/cocoa/translations/English.lproj/MainMenu.strings new file mode 100644 index 000000000..5afe56875 Binary files /dev/null and b/desmume/src/cocoa/translations/English.lproj/MainMenu.strings differ diff --git a/desmume/src/cocoa/translations/English.lproj/MainMenu.xib b/desmume/src/cocoa/translations/English.lproj/MainMenu.xib new file mode 100644 index 000000000..37fda5e7c --- /dev/null +++ b/desmume/src/cocoa/translations/English.lproj/MainMenu.xib @@ -0,0 +1,41521 @@ + + + + 1050 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 851 + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + MainMenu + + + + DeSmuME + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + DeSmuME + + + + About DeSmuME + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide DeSmuME + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit DeSmuME + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + File + + + + Load ROM… + o + 1048576 + 2147483647 + + + + + + Load Recent ROM + + 1048576 + 2147483647 + + + submenuAction: + + Load Recent ROM + + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + Unload ROM + w + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + ROM Info + i + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Open State File... + O + 1048576 + 2147483647 + + + + + + Close State File + W + 1048576 + 2147483647 + + + + + + Save State File + s + 1048576 + 2147483647 + + + + + + Save State File As… + S + 1179648 + 2147483647 + + + + + + Revert State File to Saved + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Load State Slot + + 2147483647 + + + submenuAction: + + Load State Slot + + + + + + Save State Slot + + 2147483647 + + + submenuAction: + + Save State Slot + + + + + + YES + YES + + + 2147483647 + + + + + + Import ROM Save File... + + 2147483647 + + + + + + Export ROM Save File... + + 2147483647 + + + + + + + + + Edit + + 2147483647 + + + submenuAction: + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Delete + + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + + + + Emulation + + 2147483647 + + + submenuAction: + + Emulation + + + + Speed Limit + + 2147483647 + + + submenuAction: + + Speed Limit + + + + Half + + 2147483647 + + + 50 + + + + Normal + + 2147483647 + + + 100 + + + + Double + + 2147483647 + + + 200 + + + + YES + YES + + + 2147483647 + + + -1 + + + + Custom... + + 2147483647 + + + -1 + + + + + + + Disable Speed Limit + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Disable Auto Frame Skip + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Show Cheat Manager... + + 2147483647 + + + + + + Disable Cheats + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Execute + + 2147483647 + + + + + + Reset + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + ROM Save Type + + 2147483647 + + + submenuAction: + + ROM Save Type + + + + Automatic + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + -1 + + + + EEPROM 4Kb + + 2147483647 + + + 1 + + + + EEPROM 64Kb + + 2147483647 + + + 2 + + + + EEPROM 512Kb + + 2147483647 + + + 3 + + + + FRAM 256Kb + + 2147483647 + + + 4 + + + + FLASH 2Mb + + 2147483647 + + + 5 + + + + FLASH 4Mb + + 2147483647 + + + 6 + + + + FLASH 8Mb + + 2147483647 + + + 7 + + + + FLASH 16Mb + + 2147483647 + + + 8 + + + + FLASH 32Mb + + 2147483647 + + + 9 + + + + FLASH 64Mb + + 2147483647 + + + 10 + + + + FLASH 128Mb + + 2147483647 + + + 11 + + + + FLASH 256Mb + + 2147483647 + + + 12 + + + + FLASH 512Mb + + 2147483647 + + + 13 + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + + + Display Mode + + 2147483647 + + + submenuAction: + + Display Mode + + + + Main + + 2147483647 + + + + + + Touch + + 2147483647 + + + 1 + + + + Combo + + 2147483647 + + + 2 + + + + + + + Display Size + + 2147483647 + + + submenuAction: + + Display Size + + + + 1x + + 2147483647 + + + 100 + + + + 2x + + 2147483647 + + + 200 + + + + 3x + + 2147483647 + + + 300 + + + + 4x + + 2147483647 + + + 400 + + + + 5x + + 2147483647 + + + 500 + + + + + + + Display Rotation + + 2147483647 + + + submenuAction: + + Display Rotation + + + + Rotate Left + + 2147483647 + + + -90 + + + + Rotate Right + + 2147483647 + + + 90 + + + + YES + YES + + + 2147483647 + + + + + + 0º + + 2147483647 + + + + + + 90º + + 2147483647 + + + 90 + + + + 180º + + 2147483647 + + + 180 + + + + 270º + + 2147483647 + + + 270 + + + + YES + YES + + + 2147483647 + + + + + + Custom... + + 2147483647 + + + -1 + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Sound Settings... + + 2147483647 + + + + + + Show Video Output Settings... + + 2147483647 + + + + + + Show 3D Rendering Settings... + + 2147483647 + + + + + + Show Emulation Settings... + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Keep Minimum Display Size at 1x + + 2147483647 + + + + + + Show Status Bar + / + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Tools + + 2147483647 + + + submenuAction: + + Tools + + + + Show Support Folder in Finder + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Save Screenshot As... + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + View Layers + + 2147483647 + + + submenuAction: + + View Layers + + + + Main GPU + + 2147483647 + + + + + + Main BG0 + + 2147483647 + + + 1 + + + + Main BG1 + + 2147483647 + + + 2 + + + + Main BG2 + + 2147483647 + + + 3 + + + + Main BG3 + + 2147483647 + + + 4 + + + + Main OBJ + + 2147483647 + + + 5 + + + + YES + YES + + + 2147483647 + + + + + + Sub GPU + + 2147483647 + + + 6 + + + + Sub BG0 + + 2147483647 + + + 7 + + + + Sub BG1 + + 2147483647 + + + 8 + + + + Sub BG2 + + 2147483647 + + + 9 + + + + Sub BG3 + + 2147483647 + + + 10 + + + + Sub OBJ + + 2147483647 + + + 11 + + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + Help + + + + DeSmuME Help + ? + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Go to Website... + + 2147483647 + + + + + + Go to Forums... + + 2147483647 + + + + + + Submit a Bug Report... + + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + Combo Display Layout + + 2147483647 + + + submenuAction: + + Combo Display Layout + + + + Vertical + + 2147483647 + + + + + + Horizontal + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Main Screen First + + 2147483647 + + + + + + Touch Screen First + + 2147483647 + + + + + + + + Combo Display Separation + + 2147483647 + + + submenuAction: + + Combo Display Separation + + + + 0.0% + + 2147483647 + + + + + + 2.6% + + 2147483647 + + + + + + 33.3% + + 2147483647 + + + + + + 46.9% + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Custom... + + 2147483647 + + + + + + + + Media + + 2147483647 + + + submenuAction: + + Media + + + + New Movie Recording + + 2147483647 + + + + + + Open Movie... + + 2147483647 + + + + + + Open Recent Movie + + 2147483647 + + + submenuAction: + + Open Recent Movie + + + + Clear Menu + + 2147483647 + + + + + + + + + Close Movie + + 2147483647 + + + + + + + + + 12 + + + + 274 + + + + 268 + {{30, 17}, {126, 17}} + + YES + + 68288064 + 272630784 + Display Separation: + + LucidaGrande + 13 + 1044 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 268 + {{158, 11}, {126, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + 0.0% + + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + + + + 2.6% + + 2147483647 + + + _popUpItemAction: + 260 + + + + + 33.3% + + 2147483647 + + + _popUpItemAction: + 3333 + + + + + 46.9% + + 2147483647 + + + _popUpItemAction: + 4688 + + + + + YES + YES + + + 2147483647 + + + _popUpItemAction: + + + + + Custom + + 2147483647 + + + _popUpItemAction: + + + + + + 1 + YES + YES + 2 + + + + + 268 + {{289, 14}, {96, 22}} + + YES + + -1804468671 + 272630784 + + + + + + + + + + + + + -∞ + + + +∞ + + #,##0% + #,##0% + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + YES + NO + YES + + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + + + + 12 + + + + 274 + + + + 268 + {{18, 14}, {100, 38}} + + YES + 2 + 1 + + + -2080244224 + 0 + Vertical + + + 1 + 1211912703 + 0 + + NSRadioButton + + + + 200 + 25 + + + 67239424 + 0 + Horizontal + + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + 3 + MCAwAA + + + + 400 + 75 + + + {100, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 0 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + + + + + + + {{1, 1}, {194, 62}} + + + + {{15, 44}, {196, 78}} + + {0, 0} + + 67239424 + 0 + LCD Orientation + + LucidaGrande + 11 + 3100 + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{18, 14}, {150, 38}} + + YES + 2 + 1 + + + -2080244224 + 0 + Main Screen First + + + 1 + 1211912703 + 0 + + + + 200 + 25 + + + 67239424 + 0 + Touch Screen First + + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + {150, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 0 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + + + + + + + {{1, 1}, {194, 62}} + + + + {{218, 44}, {196, 78}} + + {0, 0} + + 67239424 + 0 + LCD Order + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + {{1, 1}, {429, 132}} + + + + {431, 148} + {0, 0} + + 67239424 + 0 + Combo Display Layout + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + {614, 409} + + + 1 + + + 256 + + + + 268 + {{125, 340}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 315}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 290}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 265}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 240}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 215}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 190}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 165}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 140}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 115}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 90}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 65}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{17, 340}, {100, 19}} + + 1000 + YES + + 67239424 + 134217728 + Up + + LucidaGrande + 12 + 16 + + + -1229176577 + 100 + + NSImage + Icon_ArrowUp_420x420 + + + + 400 + 75 + + + + + 268 + {{17, 315}, {100, 19}} + + 1001 + YES + + 67239424 + 134217728 + Down + + + -1229176577 + 100 + + NSImage + Icon_ArrowDown_420x420 + + + + 400 + 75 + + + + + 268 + {{17, 290}, {100, 19}} + + 1002 + YES + + 67239424 + 134217728 + Left + + + -1229176577 + 100 + + NSImage + Icon_ArrowLeft_420x420 + + + + 400 + 75 + + + + + 268 + {{17, 265}, {100, 19}} + + 1003 + YES + + 67239424 + 134217728 + Right + + + -1229176577 + 100 + + NSImage + Icon_ArrowRight_420x420 + + + + 400 + 75 + + + + + 268 + {{17, 240}, {100, 19}} + + 1004 + YES + + 67239424 + 134217728 + A + + + -1229176577 + 100 + + NSImage + Icon_DSButtonA_420x420 + + + + 400 + 75 + + + + + 268 + {{17, 215}, {100, 19}} + + 1005 + YES + + 67239424 + 134217728 + B + + + -1229176577 + 100 + + NSImage + Icon_DSButtonB_420x420 + + + + 400 + 75 + + + + + 268 + {{17, 190}, {100, 19}} + + 1006 + YES + + 67239424 + 134217728 + X + + + -1229176577 + 100 + + NSImage + Icon_DSButtonX_420x420 + + + + 400 + 75 + + + + + 268 + {{17, 165}, {100, 19}} + + 1007 + YES + + 67239424 + 134217728 + Y + + + -1229176577 + 100 + + NSImage + Icon_DSButtonY_420x420 + + + + 400 + 75 + + + + + 268 + {{17, 140}, {100, 19}} + + 1008 + YES + + 67239424 + 134217728 + L + + + -1229176577 + 100 + + NSImage + Icon_DSButtonL_420x420 + + + + 400 + 75 + + + + + 268 + {{17, 115}, {100, 19}} + + 1009 + YES + + 67239424 + 134217728 + R + + + -1229176577 + 100 + + NSImage + Icon_DSButtonR_420x420 + + + + 400 + 75 + + + + + 268 + {{17, 90}, {100, 19}} + + 1010 + YES + + 67239424 + 134217728 + Start + + + -1229176577 + 100 + + NSImage + Icon_DSButtonStart_420x420 + + + + 400 + 75 + + + + + 268 + {{17, 65}, {100, 19}} + + 1011 + YES + + 67239424 + 134217728 + Select + + + -1229176577 + 100 + + NSImage + Icon_DSButtonSelect_420x420 + + + + 400 + 75 + + + + + 268 + {{17, 40}, {100, 19}} + + 3000 + YES + + 67239424 + 134217728 + Lid + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 268 + {{125, 40}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 15}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{17, 15}, {100, 19}} + + 3001 + YES + + 67239424 + 134217728 + Debug + + + -1229176577 + 100 + + + + 400 + 75 + + + + {{10, 33}, {594, 363}} + + + Controller + + + + + 2 + + + 256 + + + + 268 + + + + 2304 + + + + 256 + {558, 308} + + YES + + + 256 + {558, 17} + + + + + + -2147483392 + {{480, 0}, {16, 17}} + + + + + 47 + 10 + 3.4028234663852886e+38 + + 75628096 + 2048 + + + + 6 + System + headerColor + + + + 6 + System + headerTextColor + + + + + 67239424 + 134348800 + Set + + + 4000 + -1229176577 + 36 + + + 200 + 25 + + 3 + YES + + + + 136 + 40 + 1000 + + 75628096 + 2048 + Input Device + + + 3 + MC4zMzMzMzI5ODU2AA + + + + + 67239488 + 272765952 + Text + + + + + + 3 + YES + + + + 132 + 40 + 1000 + + 75628096 + 2048 + Input Element + + + + + + 67239488 + 137216 + Text Cell + + + YES + 1 + + 6 + System + controlBackgroundColor + + + + + 3 + YES + + + + 131 + 10 + 3.4028234663852886e+38 + + 75628096 + 2048 + Use Device Coordinates + + + + + + 67239424 + 0 + + + + 1215582719 + 2 + + NSImage + NSSwitch + + + NSSwitch + + + + 200 + 25 + + 3 + YES + YES + + + + 46 + 10 + 3.4028234663852886e+38 + + 75628096 + 2048 + X + + + + + + 337772096 + -2147350528 + Text Cell + + + + + + + + + + -∞ + + + +∞ + + + #0 + #0 + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + NO + + + + + + 3 + YES + YES + + + + 48 + 10 + 3.4028234663852886e+38 + + 75628096 + 2048 + Y + + + + + + 337772096 + -2147350528 + Text Cell + + + + + + + + + + -∞ + + + +∞ + + + #0 + #0 + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + NO + + + + + + 3 + YES + YES + + + + 3 + 2 + + + 6 + System + gridColor + + 3 + MC41AA + + + 18 + 851443712 + + + 3 + 0 + 15 + 0 + NO + 0 + + + {{1, 17}, {558, 308}} + + + + + 4 + + + + -2147483392 + {{480, 17}, {15, 257}} + + + _doScroller: + 0.99633699633699635 + + + + -2147483392 + {{1, 274}, {558, 15}} + + 1 + + _doScroller: + 0.99821109123434704 + + + + 2304 + + + + {{1, 0}, {558, 17}} + + + + + 4 + + + + {{17, 34}, {560, 326}} + + + 562 + + + + + + QSAAAEEgAABBoAAAQaAAAA + + + + 268 + {{44, 4}, {28, 23}} + + YES + + -2080244224 + 134217728 + + + + -2033434369 + 162 + + NSImage + NSRemoveTemplate + + + + 400 + 75 + + + + + 268 + {{17, 4}, {28, 23}} + + YES + + -2080244224 + 134217728 + + + + -2033434369 + 162 + + NSImage + NSAddTemplate + + + + 400 + 75 + + + + {{10, 33}, {594, 363}} + + Touch Pad + + + + + 3 + + + 256 + + + + 268 + {{153, 341}, {424, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{17, 341}, {128, 19}} + + 2000 + YES + + 67239424 + 134217728 + Activate Mic + + + -1229176577 + 100 + + NSImage + Icon_Microphone_420x420 + + + + 400 + 75 + + + + + 12 + + + + 274 + + + + 268 + {{18, 69}, {528, 18}} + + YES + + 537001472 + 0 + + 50 + 38 + 47 + 2 + + + + + 268 + {{16, 39}, {532, 25}} + + YES + + -1543373312 + 0 + + + 100 + 0.0 + 50 + 0.0 + 5 + 0 + NO + NO + + + + + 268 + {{247, 14}, {70, 17}} + + YES + + 605158976 + 272630784 + Input Gain + + + + + + + + + 268 + {{15, 109}, {54, 17}} + + YES + + 605158976 + 272630784 + Device: + + + + + + + + + 268 + {{71, 103}, {478, 26}} + + YES + + -1539178944 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + + + + + 1 + YES + YES + 2 + + + + {{1, 1}, {564, 137}} + + + + {{14, 55}, {566, 153}} + + {0, 0} + + 67239424 + 0 + Sound Input Device Settings + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{18, 14}, {290, 78}} + + YES + 4 + 1 + + + 604110336 + 0 + Sound Input Device (NOT IMPLEMENTED) + + + 4 + 1211912703 + 0 + + + + 200 + 25 + + + -2080244224 + 0 + Internal Noise Samples + + + 1 + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + 67239424 + 0 + White Noise + + + 3 + 1211912703 + 0 + + 400 + 75 + + + 604110336 + 0 + Sound File: + + + 2 + 1211912703 + 0 + + 400 + 75 + + + {290, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 0 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + 1 + + + + + + + + 268 + {{130, 12}, {324, 21}} + + YES + + 612499008 + 272635904 + + + NOT IMPLEMENTED + + YES + + + + + + + 268 + {{456, 5}, {96, 32}} + + YES + + 604110336 + 134217728 + Choose... + + + -2038284033 + 129 + + + 200 + 25 + + + + {{1, 1}, {564, 102}} + + + + {{14, 212}, {566, 118}} + + {0, 0} + + 67239424 + 0 + Sound Input Options + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + {{10, 33}, {594, 363}} + + Microphone + + + + + 4 + + + 256 + + + + 268 + {{153, 312}, {424, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{153, 286}, {424, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{153, 339}, {424, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{17, 339}, {128, 19}} + + 3002 + YES + + 67239424 + 134217728 + Speed 1/2x + + + -1229176577 + 100 + + NSImage + Icon_DoubleSpeed_420x420 + + + + 400 + 75 + + + + + 268 + {{17, 312}, {128, 19}} + + 3003 + YES + + 67239424 + 134217728 + Speed 2x + + + -1229176577 + 100 + + NSImage + Icon_Speed2x_420x420 + + + + 400 + 75 + + + + + 268 + {{17, 286}, {128, 19}} + + 3004 + YES + + 67239424 + 134217728 + HUD + + + -1229176577 + 100 + + NSImage + Icon_ShowHUD_420x420 + + + + 400 + 75 + + + + + 268 + {{153, 259}, {424, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{17, 259}, {128, 19}} + + 3005 + YES + + 67239424 + 134217728 + Execute + + + -1229176577 + 100 + + NSImage + Icon_Execute_420x420 + + + + 400 + 75 + + + + + 268 + {{153, 232}, {424, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{17, 232}, {128, 19}} + + 3006 + YES + + 67239424 + 134217728 + Pause + + + -1229176577 + 100 + + NSImage + Icon_Pause_420x420 + + + + 400 + 75 + + + + + 268 + {{153, 205}, {424, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{17, 205}, {128, 19}} + + 3007 + YES + + 67239424 + 134217728 + Reset + + + -1229176577 + 100 + + NSImage + Icon_Reset_420x420 + + + + 400 + 75 + + + + {{10, 33}, {594, 363}} + + Utility + + + + + + + 0 + YES + YES + + + + + + AppDelegate + + + 15 + 2 + {{19, 214}, {500, 500}} + 1148716032 + About DeSmuME + NSWindow + + {1.79769e+308, 1.79769e+308} + + + 256 + + + + 268 + + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + {{20, 352}, {128, 128}} + + YES + + 130560 + 33554432 + + NSImage + NSApplicationIcon + + 0 + 1 + 0 + NO + + YES + + + + 18 + {{13, 10}, {474, 340}} + + + + 1 + + + 256 + + + + 274 + + + + 2304 + + + + 2322 + {440, 14} + + + + + + + + + + + + + 6 + + + + 440 + 1 + + + 10341 + 0 + + + + + 6 + System + selectedTextBackgroundColor + + + + 6 + System + selectedTextColor + + + + + + + 1 + MCAwIDEAA + + + {8, -8} + 13 + + + + + + 6 + {463, 1e+07} + {223, 0} + + + + {440, 294} + + + + + + {4, -5} + 1 + + 2 + + + + 256 + {{440, 0}, {15, 294}} + + + _doScroller: + 0.96240601503759393 + + + + -2147483392 + {{-100, -100}, {87, 18}} + + 1 + + _doScroller: + 1 + 0.94565218687057495 + + + {{-3, -3}, {455, 294}} + + + 16 + + + + + + {{10, 33}, {454, 294}} + + + Read Me + + + + + 2 + + + 256 + + + + 274 + + + + 2304 + + + + 2322 + {440, 14} + + + + + + + + + + + + + 6 + + + + 440 + 1 + + + 10341 + 0 + + + + + + + + + + + + + + + 6 + {463, 1e+07} + {223, 0} + + + + {440, 294} + + + + + + 2 + + + + 256 + {{440, 0}, {15, 294}} + + + _doScroller: + 0.96240601503759393 + + + + -2147483392 + {{-100, -100}, {87, 18}} + + 1 + + _doScroller: + 1 + 0.94565218687057495 + + + {{-3, -3}, {455, 294}} + + + 16 + + + + + + {{10, 33}, {454, 294}} + + License + + + + + Item 2 + + + 256 + + + + 274 + + + + 2304 + + + + 2322 + {440, 14} + + + + + + + + + + + + + 6 + + + + 440 + 1 + + + 10341 + 0 + + + + + + + + + + + + + + + 6 + {463, 1e+07} + {223, 0} + + + + {440, 294} + + + + + + 2 + + + + 256 + {{440, 0}, {15, 294}} + + + _doScroller: + 0.96240601503759393 + + + + -2147483392 + {{-100, -100}, {87, 18}} + + 1 + + _doScroller: + 1 + 0.94565218687057495 + + + {{-3, -3}, {455, 294}} + + + 16 + + + + + + {{10, 33}, {454, 294}} + + Authors + + + + + Item 3 + + + 256 + + + + 274 + + + + 2304 + + + + 2322 + {440, 14} + + + + + + + + + + + + + 6 + + + + 440 + 1 + + + 10341 + 0 + + + + + + + + + + + + + + + 6 + {463, 1e+07} + {223, 0} + + + + {440, 294} + + + + + + 2 + + + + 256 + {{440, 0}, {15, 294}} + + + _doScroller: + 0.96240601503759393 + + + + -2147483392 + {{-100, -100}, {87, 18}} + + 1 + + _doScroller: + 1 + 0.94565218687057495 + + + {{-3, -3}, {455, 294}} + + + 16 + + + + + + {{10, 33}, {454, 294}} + + Change Log + + + + + + + 0 + YES + YES + + + + + + + 268 + {{153, 463}, {320, 17}} + + YES + + 70385217 + 4199424 + DeSmuME + + + + + + + + + 268 + {{153, 438}, {320, 17}} + + YES + + 70385217 + 4199424 + Nintendo DS Emulator + + + + + + + + + 268 + {{153, 413}, {320, 17}} + + YES + + 70385217 + 4199424 + + + Version ? + + + + + + + + 268 + {{153, 388}, {320, 17}} + + YES + + 70385217 + 4199424 + + + Date + + + + + + + + 268 + {{153, 363}, {320, 17}} + + YES + + 70385217 + 4199424 + http://www.desmume.org + + + + + + + + {500, 500} + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + 271 + 2 + {{830, 370}, {256, 408}} + 1148715008 + DeSmuME + NSWindow + + + D5552DCE-722B-4ECB-8E0A-8B7CF76EAC70 + + + YES + YES + YES + YES + 1 + 2 + + + + 0135754F-463F-4625-9D27-DEF701AEF50E + + Open ROM + Open ROM + + + + NSImage + Icon_OpenROM_420x420 + + + + {0, 0} + {0, 0} + YES + YES + -1 + YES + 0 + + + + 2E728430-6055-404B-944F-25594ACBEC39 + + Execute + Execute/Pause + + + + + + {0, 0} + {0, 0} + YES + YES + -1 + YES + 0 + + + + 321036F9-6034-47B1-9CC5-2461D98700F0 + + Reset + Reset + + + + + + {0, 0} + {0, 0} + YES + YES + -1 + YES + 0 + + + + 41A299FB-4A95-4FA3-9982-8523FF04ACDE + + Rotate Right + Rotate Right + + + + NSImage + Icon_RotateCW_420x420 + + + + {0, 0} + {0, 0} + YES + YES + 90 + YES + 0 + + + + C626F2C1-4353-4288-AD59-40FB7F4C1A58 + + Rotate Left + Rotate Left + + + + NSImage + Icon_RotateCCW_420x420 + + + + {0, 0} + {0, 0} + YES + YES + -90 + YES + 0 + + + + EDBFD998-E031-4AC5-A86A-7114D66FF847 + + Speed 2x + Speed 1x/2x + + + + + + {0, 0} + {0, 0} + YES + YES + 200 + YES + 0 + + + NSToolbarFlexibleSpaceItem + + Flexible Space + + + + + + {1, 5} + {20000, 32} + YES + YES + -1 + YES + 0 + + YES + YES + + + 1048576 + 2147483647 + + + + + + NSToolbarSpaceItem + + Space + + + + + + {32, 5} + {32, 32} + YES + YES + -1 + YES + 0 + + YES + YES + + + 1048576 + 2147483647 + + + + + + + + + + + + + + + + + + + + + + + + + + {1.79769e+308, 1.79769e+308} + {256, 408} + + + 256 + + + + 5165 + + {{0, 24}, {256, 384}} + + YES + + + AAAABQAAAAgAAAAPAAAACwAAAAEAAAAMAAAAGAAAAAA + + + + + + 5156 + + {{2, 3}, {16, 16}} + + 28938 + 100 + + + + 289 + {{180, 3}, {56, 15}} + + YES + + -2079981824 + 131072 + + + 100 + 0.0 + 100 + 0.0 + 0 + 1 + NO + NO + + + + + 289 + + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + {{160, 1}, {20, 20}} + + YES + + 130560 + 33554432 + + NSImage + Icon_VolumeFull_16x16 + + 0 + 2 + 0 + YES + + YES + + + + 294 + {{17, 5}, {137, 14}} + + YES + + 68288064 + 272634880 + + + LucidaGrande + 11 + 16 + + Status Text + + + + + + + {256, 408} + + {{0, 0}, {1920, 1178}} + {256, 476} + {1.79769e+308, 1.79769e+308} + + + EmuWindowDelegate + + + 7 + 2 + {{75, 804}, {400, 100}} + 1685588992 + DeSmuME Preferences + NSWindow + + + 7F8262D5-9D3C-423C-B7C5-79385DDE5A70 + + + YES + YES + NO + NO + 1 + 1 + + + + 8DD2F943-8717-4EC3-A3C5-30068405F029 + + Input + Input + + + + NSImage + Icon_Input_420x420 + + + + {0, 0} + {0, 0} + YES + YES + -1 + YES + 0 + + + + A9C4AA28-77F8-4AD3-96D8-A67306997B4C + + General + General + + + + NSImage + NSPreferencesGeneral + + + + {0, 0} + {0, 0} + YES + YES + -1 + YES + 0 + + + + AC584A31-E187-4BC3-9981-D18A2C8553F7 + + Emulation + Emulation + + + + NSImage + Icon_Emulation_420x420 + + + + {0, 0} + {0, 0} + YES + YES + -1 + YES + 0 + + + + C9B4F2D8-9F6E-4ED5-84C7-E13EB3484A3A + + Sound + Sound + + + + NSImage + Icon_Speaker_420x420 + + + + {0, 0} + {0, 0} + YES + YES + -1 + YES + 0 + + + + E30B98EC-D044-488C-A4E0-5BCE53366462 + + Display + Display + + + + + + {0, 0} + {0, 0} + YES + YES + -1 + YES + 0 + + + NSToolbarFlexibleSpaceItem + + Flexible Space + + + + + + {1, 5} + {20000, 32} + YES + YES + -1 + YES + 0 + + YES + YES + + + 1048576 + 2147483647 + + + + + + NSToolbarSpaceItem + + Space + + + + + + {32, 5} + {32, 32} + YES + YES + -1 + YES + 0 + + YES + YES + + + 1048576 + 2147483647 + + + + + + + + + + + + + + + + + + + + + + + + + {1.79769e+308, 1.79769e+308} + + + 256 + {400, 100} + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + + 268 + + + + 12 + + + + 274 + + + + 268 + {{175, 50}, {199, 21}} + + 2 + YES + + 613547584 + 272634880 + + + File Name + + + + + + + + 268 + {{376, 43}, {96, 32}} + + YES + + 67239424 + 134217728 + Choose... + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{15, 53}, {155, 17}} + + YES + + 68288064 + 272630784 + ADVANsCEne Database: + + + + + + + + + 268 + {{15, 14}, {454, 28}} + + YES + + 69336577 + 138543104 + WW91IGNhbiBkb3dubG9hZCB0aGUgbGF0ZXN0IEFEVkFOc0NFbmUgRGF0YWJhc2UgZnJvbToKaHR0cDov +L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA + + + + + + + + {{1, 1}, {484, 81}} + + + + {{17, 16}, {486, 97}} + + {0, 0} + + 67239424 + 0 + ADVANsCEne Database + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{148, 50}, {226, 21}} + + 2 + YES + + 613547584 + 272634880 + + + File Name + + + + + + + + 268 + {{376, 43}, {96, 32}} + + YES + + 67239424 + 134217728 + Choose... + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{15, 53}, {128, 17}} + + YES + + 68288064 + 272630784 + R4 Cheat Database: + + + + + + + + + 268 + {{15, 14}, {454, 28}} + + YES + + 69336577 + 138543104 + WW91IGNhbiBkb3dubG9hZCB0aGUgbGF0ZXN0IFI0IENoZWF0IERhdGFiYXNlIGZyb206Cmh0dHA6Ly9j +aGVhdHMuZ2JhdGVtcC5uZXQvA + + + + + + + + {{1, 1}, {484, 81}} + + + + {{17, 117}, {486, 97}} + + {0, 0} + + 67239424 + 0 + Cheat Configuration + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{92, 12}, {314, 18}} + + YES + + 67239424 + 0 + Do not show File Migration window on startup + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{141, 33}, {217, 32}} + + YES + + 67239424 + 134217728 + Show File Migration Window + + + -2038284033 + 129 + + + 200 + 25 + + + + {{1, 1}, {484, 75}} + + + + {{17, 218}, {486, 91}} + + {0, 0} + + 67239424 + 0 + User File Migration + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{16, 111}, {366, 18}} + + 2 + YES + + -2080244224 + 0 + Automatically Execute Emulation When Loading a ROM + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{16, 71}, {274, 18}} + + 2 + YES + + 67239424 + 0 + Automatically Load a ROM Upon Launch + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{34, 41}, {227, 26}} + + 2 + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + Load Last Loaded ROM + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + + + + Load Selected ROM + + 1048576 + 2147483647 + + + _popUpItemAction: + 1 + + + + + + 1 + YES + YES + 2 + + + + + 268 + {{114, 14}, {260, 21}} + + 2 + YES + + 613547584 + 272634880 + + + ROM Name + + + + + + + + 268 + {{376, 7}, {96, 32}} + + YES + + 67239424 + 134217728 + Choose... + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{15, 17}, {94, 17}} + + YES + + 68288064 + 272630784 + Selected ROM: + + + + + + + + {{1, 1}, {484, 137}} + + 2 + + + {{17, 313}, {486, 153}} + + 2 + {0, 0} + + 67239424 + 0 + ROM Behavior + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + {520, 486} + 2 + NSView + + + + 268 + + + + 12 + {{13, 10}, {614, 409}} + + + + 1 + + + 256 + + + + 268 + {{125, 340}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 315}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 290}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 265}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 240}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 215}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 190}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 165}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 140}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 115}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 90}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 65}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{17, 340}, {100, 19}} + + 1000 + YES + + 67239424 + 134217728 + Up + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 268 + {{17, 315}, {100, 19}} + + 1001 + YES + + 67239424 + 134217728 + Down + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 268 + {{17, 290}, {100, 19}} + + 1002 + YES + + 67239424 + 134217728 + Left + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 268 + {{17, 265}, {100, 19}} + + 1003 + YES + + 67239424 + 134217728 + Right + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 268 + {{17, 240}, {100, 19}} + + 1004 + YES + + 67239424 + 134217728 + A + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 268 + {{17, 215}, {100, 19}} + + 1005 + YES + + 67239424 + 134217728 + B + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 268 + {{17, 190}, {100, 19}} + + 1006 + YES + + 67239424 + 134217728 + X + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 268 + {{17, 165}, {100, 19}} + + 1007 + YES + + 67239424 + 134217728 + Y + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 268 + {{17, 140}, {100, 19}} + + 1008 + YES + + 67239424 + 134217728 + L + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 268 + {{17, 115}, {100, 19}} + + 1009 + YES + + 67239424 + 134217728 + R + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 268 + {{17, 90}, {100, 19}} + + 1010 + YES + + 67239424 + 134217728 + Start + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 268 + {{17, 65}, {100, 19}} + + 1011 + YES + + 67239424 + 134217728 + Select + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 268 + {{17, 40}, {100, 19}} + + 3000 + YES + + 67239424 + 134217728 + Lid + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 268 + {{125, 40}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{125, 15}, {452, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{17, 15}, {100, 19}} + + 3001 + YES + + 67239424 + 134217728 + Debug + + + -1229176577 + 100 + + + + 400 + 75 + + + + {{10, 33}, {594, 363}} + + Controller + + + + + 3 + + + 256 + + + + 268 + {{153, 341}, {424, 21}} + + YES + + 75628096 + 272635904 + + + Set Input + + YES + + + + + + + 268 + {{17, 341}, {128, 19}} + + 2000 + YES + + 67239424 + 134217728 + Activate Mic + + + -1229176577 + 100 + + + + 400 + 75 + + + + + 12 + + + + 274 + + + + 268 + {{18, 69}, {528, 18}} + + YES + + 537001472 + 0 + + 50 + 38 + 47 + 2 + + + + + 268 + {{16, 39}, {532, 25}} + + YES + + -1543373312 + 0 + + + 100 + 0.0 + 50 + 0.0 + 5 + 0 + NO + NO + + + + + 268 + {{247, 14}, {70, 17}} + + YES + + 605158976 + 272630784 + Input Gain + + + + + + + + + 268 + {{15, 109}, {54, 17}} + + YES + + 605158976 + 272630784 + Device: + + + + + + + + + 268 + {{71, 103}, {478, 26}} + + YES + + -1539178944 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + + + + + 1 + YES + YES + 2 + + + + {{1, 1}, {564, 137}} + + + + {{14, 55}, {566, 153}} + + {0, 0} + + 67239424 + 0 + Sound Input Device Settings + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{18, 14}, {290, 78}} + + YES + 4 + 1 + + + 604110336 + 0 + Sound Input Device (NOT IMPLEMENTED) + + + 4 + 1211912703 + 0 + + + + 200 + 25 + + + -2080244224 + 0 + Internal Noise Samples + + + 1 + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + 67239424 + 0 + White Noise + + + 3 + 1211912703 + 0 + + 400 + 75 + + + 604110336 + 0 + Sound File: + + + 2 + 1211912703 + 0 + + 400 + 75 + + + {290, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 0 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + 1 + + + + + + + + 268 + {{130, 12}, {324, 21}} + + YES + + 612499008 + 272635904 + + + NOT IMPLEMENTED + + YES + + + + + + + 268 + {{456, 5}, {96, 32}} + + YES + + 604110336 + 134217728 + Choose... + + + -2038284033 + 129 + + + 200 + 25 + + + + {{1, 1}, {564, 102}} + + + + {{14, 212}, {566, 118}} + + {0, 0} + + 67239424 + 0 + Sound Input Options + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + {{10, 33}, {594, 363}} + + + Microphone + + + + + + + 0 + YES + YES + + + + + + {640, 433} + InputPrefsView + + + + 268 + + + + 12 + {{13, 10}, {463, 381}} + + + + 1 + + + 256 + + + + 12 + + + + 274 + + + + 268 + {{72, 44}, {84, 17}} + + YES + + 68288064 + 272630784 + Display Size: + + + + + + + + + 268 + {{44, 16}, {112, 17}} + + YES + + 68288064 + 272630784 + Display Rotation: + + + + + + + + + 268 + {{158, 38}, {126, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + 1x + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + 100 + + + YES + + OtherViews + + + + + 2x + + 1048576 + 2147483647 + + + _popUpItemAction: + 200 + + + + + 3x + + 1048576 + 2147483647 + + + _popUpItemAction: + 300 + + + + + 4x + + 2147483647 + + + _popUpItemAction: + 400 + + + + + + 1 + YES + YES + 2 + + + + + 268 + {{289, 14}, {96, 22}} + + YES + + -1804468671 + 272630784 + + + + + + + + + + + -∞ + + + #0.##º + +∞ + + + #0.##º + #0.##º + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + + YES + + + + + + + 268 + {{63, 72}, {93, 17}} + + YES + + 68288064 + 272630784 + Display Mode: + + + + + + + + + 268 + {{158, 66}, {126, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + Combo + + 2147483647 + 1 + + + _popUpItemAction: + 2 + + + YES + + OtherViews + + + + Main + + 2147483647 + + + _popUpItemAction: + + + + + Touch + + 2147483647 + + + _popUpItemAction: + 1 + + + + + YES + + + 2 + 1 + YES + YES + 2 + + + + + 268 + {{158, 11}, {126, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + 0º + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + + + + 90º + + 1048576 + 2147483647 + + + _popUpItemAction: + 90 + + + + + 180º + + 1048576 + 2147483647 + + + _popUpItemAction: + 180 + + + + + 270º + + 2147483647 + + + _popUpItemAction: + 270 + + + + + YES + YES + + + 2147483647 + 1 + + + _popUpItemAction: + + + + + Custom + + 2147483647 + + + _popUpItemAction: + -1 + + + + + + 1 + YES + YES + 2 + + + + {{1, 1}, {429, 100}} + + + + {{6, 118}, {431, 116}} + + {0, 0} + + 67239424 + 0 + General Settings + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + {{10, 33}, {443, 335}} + + + Display Views + + + + + 2 + + + 256 + + + + 268 + {{118, 274}, {151, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + None + + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + + + + LQ2x + + 2147483647 + + + _popUpItemAction: + 1 + + + + + LQ2xS + + 2147483647 + + + _popUpItemAction: + 2 + + + + + HQ2x + + 2147483647 + + + _popUpItemAction: + 3 + + + + + HQ2xS + + 2147483647 + + + _popUpItemAction: + 4 + + + + + HQ4x + + 2147483647 + + + _popUpItemAction: + 5 + + + + + 2xSaI + + 2147483647 + + + _popUpItemAction: + 6 + + + + + Super 2xSaI + + 2147483647 + + + _popUpItemAction: + 7 + + + + + Super Eagle + + 2147483647 + + + _popUpItemAction: + 8 + + + + + Scanline + + 2147483647 + + + _popUpItemAction: + 9 + + + + + Bilinear + + 2147483647 + + + _popUpItemAction: + 10 + + + + + Nearest 2x + + 2147483647 + + + _popUpItemAction: + 11 + + + + + Nearest 1.5x + + 2147483647 + + + _popUpItemAction: + 12 + + + + + Nearest+ 1.5x + + 2147483647 + + + _popUpItemAction: + 13 + + + + + EPX + + 2147483647 + + + _popUpItemAction: + 14 + + + + + EPX+ + + 2147483647 + + + _popUpItemAction: + 15 + + + + + EPX 1.5x + + 2147483647 + + + _popUpItemAction: + 16 + + + + + EPX+ 1.5x + + 2147483647 + + + _popUpItemAction: + 17 + + + + YES + + + 1 + YES + YES + 2 + + + + + 268 + + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + {{118, 5}, {262, 262}} + + YES + + 604110336 + 33554432 + + 0 + 3 + 2 + NO + + YES + + + + 268 + {{10, 247}, {106, 17}} + + YES + + 68288064 + 71304192 + Preview: + + + + + + + + + 268 + {{10, 280}, {106, 17}} + + YES + + 68288064 + 71304192 + Video Filter: + + + + + + + + + 268 + {{119, 308}, {196, 18}} + + YES + + -2080244224 + 0 + Use Bilinear Filtered Output + + + 1211912703 + 2 + + + + + 200 + 25 + + + + {{10, 33}, {443, 335}} + + Video Output + + + + + 4 + + + 256 + + + + 12 + + + + 274 + + + + 268 + {{16, 99}, {239, 18}} + + YES + + -2080244224 + 0 + High-Precision Color Interpolation + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{16, 79}, {154, 18}} + + YES + + -2080244224 + 0 + Enable Edge Marking + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{16, 59}, {91, 18}} + + YES + + -2080244224 + 0 + Enable Fog + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{16, 39}, {124, 18}} + + YES + + -2080244224 + 0 + Enable Textures + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{215, 14}, {60, 22}} + + YES + + -1804468671 + 272630784 + + + + + + 0 + + + . + ¤ + . + E + + + , + ¤¤ + + + + + + - + # + -∞ + - + + + NaN + + * + ‰ + % + + + # + +∞ + + + + + + + # + # + + + + + + + + NaN + + + + 0 + 0 + YES + NO + 1 + AAAAAAAAAAAAAAAAAAAAAA + + + + 3 + YES + YES + YES + + . + , + NO + NO + NO + + + YES + + + + + + + 268 + {{15, 16}, {195, 17}} + + YES + + 68288064 + 272630784 + Depth Comparison Threshold: + + + + + + + + {{1, 1}, {293, 125}} + + + + {{74, 69}, {295, 141}} + + {0, 0} + + 67239424 + 0 + SoftRasterizer Options + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 268 + {{217, 285}, {152, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + SoftRasterizer + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + 1 + + + YES + + OtherViews + + + + None + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + + + 1 + 1 + YES + YES + 2 + + + + + 268 + {{74, 291}, {141, 17}} + + YES + + 68288064 + 272630784 + 3D Rendering Engine: + + + + + + + + + 268 + {{250, 22}, {165, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + Automatic + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + + + + Single-Threaded + + 1048576 + 2147483647 + + + _popUpItemAction: + 1 + + + + + 2 Threads + + 1048576 + 2147483647 + + + _popUpItemAction: + 2 + + + + + 4 Threads + + 2147483647 + + + _popUpItemAction: + 4 + + + + + + 1 + YES + YES + 2 + + + + + 268 + {{28, 28}, {220, 17}} + + YES + + 68288064 + 272630784 + SoftRasterizer Rendering Threads: + + + + + + + + + 12 + + + + 274 + + + + 268 + {{16, 12}, {129, 18}} + + YES + + -2080244224 + 0 + Enable Line Hack + + + 1211912703 + 2 + + + + + 200 + 25 + + + + {{1, 1}, {293, 38}} + + + + {{74, 214}, {295, 54}} + + {0, 0} + + 67239424 + 0 + General Settings + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + {{10, 33}, {443, 335}} + + 3D Rendering + + + + + + + 0 + YES + YES + + + + + + {489, 405} + NSView + + + + 268 + + + + 268 + {{163, 329}, {220, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + OS X Core Audio + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + 58325 + + + YES + + OtherViews + + + + None + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + + + 1 + 1 + YES + YES + 2 + + + + + 268 + {{17, 335}, {144, 17}} + + YES + + 68288064 + 272630784 + Audio Output Engine: + + + + + + + + + 12 + + + + 274 + + + + 268 + {{16, 12}, {148, 18}} + + YES + + -2080244224 + 0 + Advanced SPU Logic + + + 1211912703 + 2 + + + + + 200 + 25 + + + + {{1, 1}, {364, 38}} + + + + {{17, 209}, {366, 54}} + + {0, 0} + + 67239424 + 0 + SPU Configuration + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{18, 15}, {180, 46}} + + YES + 2 + 1 + + + 67239424 + 0 + Dual SPU Synch/Asynch + + + 1211912703 + 0 + + + + 200 + 25 + + + -2080244224 + 0 + Synchronous + + + 1 + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + {180, 18} + {4, 10} + 1151868928 + NSActionCell + + 67239424 + 0 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + 1 + + + + + + + + 268 + {{145, 10}, {204, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + "P" Method + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + 2 + + + YES + + OtherViews + + + + "N" Method + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + "Z" Method + + 1048576 + 2147483647 + + + _popUpItemAction: + 1 + + + + + + + 2 + 1 + YES + YES + 2 + + + + {{1, 1}, {364, 71}} + + + + {{17, 16}, {366, 87}} + + {0, 0} + + 67239424 + 0 + SPU Sound Synchronization Method + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{18, 14}, {328, 58}} + + YES + 3 + 1 + + + 67239424 + 0 + None + + + 1211912703 + 0 + + + + 200 + 25 + + + 67239424 + 0 + Linear + + + 1 + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + -2080244224 + 0 + Cosine + + + 2 + 1211912703 + 0 + + 400 + 75 + + + {328, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 0 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + 2 + + + + + + + {{1, 1}, {364, 82}} + + + + {{17, 107}, {366, 98}} + + {0, 0} + + 67239424 + 0 + SPU Interpolation Method + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{44, 13}, {236, 21}} + + YES + + 67501824 + 0 + + + 100 + 0.0 + 100 + 0.0 + 0 + 1 + NO + NO + + + + + 268 + {{283, 17}, {66, 17}} + + YES + + 68288064 + 272634880 + + + + + + + + + + + + -∞ + + + +∞ + + + #0.0% + #0.0% + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + Volume + + + + + + + + 289 + + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + {{18, 14}, {20, 20}} + + YES + + 130560 + 33554432 + + 0 + 2 + 0 + YES + + YES + + + {{1, 1}, {364, 44}} + + + + {{17, 267}, {366, 60}} + + {0, 0} + + 67239424 + 0 + General Settings + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + {400, 373} + NSView + + + + 268 + + + + 12 + + + + 274 + + + + 268 + {{16, 12}, {462, 18}} + + YES + + -2080244224 + 0 + Use ADVANsCEne Database when auto-detecting the ROM save type + + + 1211912703 + 2 + + + + + 200 + 25 + + + + {{1, 1}, {494, 38}} + + + + {{17, 15}, {496, 54}} + + {0, 0} + + 67239424 + 0 + ROM Battery Save Configuration + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{16, 32}, {145, 18}} + + YES + + 67239424 + 0 + Use Debug Console + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{16, 12}, {118, 18}} + + YES + + 67239424 + 0 + Emulate Ensata + + + 1211912703 + 2 + + + + + 200 + 25 + + + + {{1, 1}, {494, 58}} + + + + {{17, 73}, {496, 74}} + + {0, 0} + + 67239424 + 0 + Debugger Configuration + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{16, 61}, {205, 18}} + + YES + + 604110336 + 0 + Use External Firmware Image + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{140, 33}, {240, 22}} + + YES + + -2070806976 + 272634880 + + + Set Firmware Image... + + YES + + + + + + + 268 + {{15, 37}, {120, 17}} + + YES + + 68288064 + 272630784 + Firmware Image: + + + + + + + + + 268 + {{382, 27}, {100, 32}} + + YES + + 67239424 + 134217728 + Choose... + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{16, 12}, {149, 18}} + + YES + + 604110336 + 0 + Boot From Firmware + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{12, 81}, {229, 32}} + + YES + + 67239424 + 134217728 + Configure Internal Firmware... + + + -2038284033 + 129 + + + 200 + 25 + + + + {{1, 1}, {494, 119}} + + + + {{17, 151}, {496, 135}} + + {0, 0} + + 67239424 + 0 + Firmware Configuration + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{16, 117}, {182, 18}} + + YES + + 67239424 + 0 + Use External BIOS Images + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{140, 86}, {240, 22}} + + YES + + -2070806976 + 272634880 + + + Set BIOS Image... + + YES + + + + + + + 268 + {{15, 89}, {120, 17}} + + YES + + 68288064 + 272630784 + ARM9 BIOS Image: + + + + + + + + + 268 + {{382, 80}, {100, 32}} + + YES + + 67239424 + 134217728 + Choose... + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{140, 59}, {240, 22}} + + YES + + -2070806976 + 272634880 + + + Set BIOS Image... + + YES + + + + + + + 268 + {{15, 62}, {120, 17}} + + YES + + 68288064 + 272630784 + ARM7 BIOS Image: + + + + + + + + + 268 + {{382, 53}, {100, 32}} + + YES + + 67239424 + 134217728 + Choose... + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{16, 32}, {230, 18}} + + YES + + -1543373312 + 0 + Emulate BIOS Software Interrupts + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{16, 12}, {236, 18}} + + YES + + 604110336 + 0 + Patch DelayLoop SWI (speed hack) + + + 1211912703 + 2 + + + + + 200 + 25 + + + + {{1, 1}, {494, 143}} + + + + {{17, 290}, {496, 159}} + + {0, 0} + + 67239424 + 0 + BIOS Configuration + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{16, 12}, {197, 18}} + + YES + + -2080244224 + 0 + Advanced Bus-Level Timing + + + 1211912703 + 2 + + + + + 200 + 25 + + + + {{1, 1}, {494, 38}} + + + + {{17, 453}, {496, 54}} + + {0, 0} + + 67239424 + 0 + General Settings + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + {530, 527} + NSView + + + PreferencesWindowDelegate + + + 1 + 2 + {{235, 220}, {305, 339}} + 1685585920 + Internal Firmware Preferences + NSWindow + + {1.79769e+308, 1.79769e+308} + + + 256 + + + + 268 + {{119, 300}, {166, 22}} + + YES + + -1804468671 + 272630784 + + + Enter a nickname... + + YES + + + + + + + 268 + {{119, 246}, {166, 44}} + + YES + + -1805517311 + 272629760 + + + Enter a message... + + YES + + + + + + + 268 + {{17, 302}, {71, 17}} + + YES + + 68288064 + 272630784 + Nickname: + + + + + + + + + 268 + {{17, 270}, {63, 17}} + + YES + + 68288064 + 272630784 + Message: + + + + + + + + + 268 + {{17, 220}, {97, 17}} + + YES + + 68288064 + 272630784 + Favorite Color: + + + + + + + + + 268 + {{17, 178}, {60, 17}} + + YES + + 68288064 + 272630784 + Birthday: + + + + + + + + + 268 + {{17, 150}, {69, 17}} + + YES + + 68288064 + 272630784 + Language: + + + + + + + + + 268 + {{119, 176}, {169, 27}} + + YES + + 71433728 + 0 + + 330548400 + + + + 0.0 + 224 + + + + + + + 268 + {{116, 144}, {172, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + English + + 2147483647 + 1 + + + _popUpItemAction: + 1 + + + YES + + OtherViews + + + + Japanese + + 2147483647 + + + _popUpItemAction: + + + + + + French + + 2147483647 + + + _popUpItemAction: + 2 + + + + + German + + 2147483647 + + + _popUpItemAction: + 3 + + + + + Italian + + 2147483647 + + + _popUpItemAction: + 4 + + + + + Spanish + + 2147483647 + + + _popUpItemAction: + 5 + + + + + + 1 + 1 + YES + YES + 2 + + + + + 268 + {{116, 214}, {172, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + Gray + + 2147483647 + 1 + + NSImage + ColorSwatch_Gray_16x16 + + + + _popUpItemAction: + + + YES + + OtherViews + + + + + Brown + + 2147483647 + + NSImage + ColorSwatch_Brown_16x16 + + + + _popUpItemAction: + 1 + + + + + Red + + 2147483647 + + NSImage + ColorSwatch_Red_16x16 + + + + _popUpItemAction: + 2 + + + + + Pink + + 2147483647 + + NSImage + ColorSwatch_Pink_16x16 + + + + _popUpItemAction: + 3 + + + + + Orange + + 2147483647 + + NSImage + ColorSwatch_Orange_16x16 + + + + _popUpItemAction: + 4 + + + + + Yellow + + 2147483647 + + NSImage + ColorSwatch_Yellow_16x16 + + + + _popUpItemAction: + 5 + + + + + Lime Green + + 2147483647 + + NSImage + ColorSwatch_LimeGreen_16x16 + + + + _popUpItemAction: + 6 + + + + + Green + + 2147483647 + + NSImage + ColorSwatch_Green_16x16 + + + + _popUpItemAction: + 7 + + + + + Dark Green + + 2147483647 + + NSImage + ColorSwatch_DarkGreen_16x16 + + + + _popUpItemAction: + 8 + + + + + Sea Green + + 2147483647 + + NSImage + ColorSwatch_SeaGreen_16x16 + + + + _popUpItemAction: + 9 + + + + + Turquoise + + 2147483647 + + NSImage + ColorSwatch_Turquoise_16x16 + + + + _popUpItemAction: + 10 + + + + + Blue + + 2147483647 + + NSImage + ColorSwatch_Blue_16x16 + + + + _popUpItemAction: + 11 + + + + + Dark Blue + + 2147483647 + + NSImage + ColorSwatch_DarkBlue_16x16 + + + + _popUpItemAction: + 12 + + + + + Dark Purple + + 2147483647 + + NSImage + ColorSwatch_DarkPurple_16x16 + + + + _popUpItemAction: + 13 + + + + + Violet + + 2147483647 + + NSImage + ColorSwatch_Violet_16x16 + + + + _popUpItemAction: + 14 + + + + + Magenta + + 2147483647 + + NSImage + ColorSwatch_Magenta_16x16 + + + + _popUpItemAction: + 15 + + + + + + 1 + YES + YES + 2 + + + + + 268 + {{17, 55}, {271, 85}} + + YES + + 67239424 + 272629760 + Note: These settings will be overridden if you are using an external firmware image. If you want to use this configuration, ensure that the Use External Firmware Image setting is disabled. + + + + + + + + + 268 + {{104, 12}, {96, 32}} + + YES + + 67239424 + 134217728 + OK + + + -2038284033 + 129 + + DQ + 200 + 25 + + + + {305, 339} + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + 9 + 2 + {{702, 448}, {720, 364}} + 1685586944 + User File Migration + NSWindow + + {1.79769e+308, 1.79769e+308} + {600, 250} + + + 256 + + + + 268 + {{17, 310}, {686, 34}} + + YES + + 67239424 + 272629760 + You have files that were created from a previous version of DeSmuME. Would you like to migrate them to work with this version? + + LucidaGrande-Bold + 13 + 16 + + + + + + + + + 292 + {{382, 12}, {162, 32}} + + 2 + YES + + 67239424 + 134217728 + Migrate By Moving + + + -2038284033 + 129 + + + 200 + 25 + + + + + 292 + {{220, 12}, {162, 32}} + + YES + + 67239424 + 134217728 + Don't Migrate + + + -2038284033 + 129 + + Gw + 200 + 25 + + + + + 268 + {{17, 274}, {686, 28}} + + YES + + 67239424 + 272633856 + Files from previous versions may not be fully compatible with the current version, especially Save State files. File migration cannot guarantee that all your old files will continue to work. + + + + + + + + + 292 + {{18, 21}, {160, 18}} + + YES + + 67239424 + 0 + Do not ask on startup + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 292 + {{544, 12}, {162, 32}} + + 1 + YES + + 67239424 + 134217728 + Migrate By Copying + + + -2038284033 + 129 + + DQ + 200 + 25 + + + + + 274 + + + + 2304 + + + + 256 + {699, 195} + + YES + + + 256 + {699, 17} + + + + + + -2147483392 + {{544, 0}, {16, 17}} + + + + + 25 + 25 + 3.402823466385289e+38 + + 75628096 + 2048 + + + + + + + 67763712 + 134217728 + + + + 1215582719 + 2 + + + + + 200 + 25 + + YES + + + + 89 + 40 + 1000 + + 75628096 + 2048 + Version + + + 3 + MC4zMzMzMzI5ODU2AA + + + + + 337772096 + 2048 + Text Cell + + + + + + 3 + YES + + + + 141 + 40 + 1000 + + 75628096 + 2048 + Kind + + + + + + 337772096 + 2048 + Text Cell + + + + + + 3 + YES + + + + 259 + 10 + 3.4028234663852886e+38 + + 75628096 + 2048 + Name + + + + + + 337772096 + 2048 + Text Cell + + + + + + 3 + YES + + + + 170 + 10 + 3.4028234663852886e+38 + + 75628096 + 2048 + Date Modified + + + + + + 337772096 + 2048 + Text Cell + + + + + + 3 + YES + + + + 3 + 2 + + + 17 + 1388314624 + + + 1 + 4 + 15 + 0 + NO + 0 + + + {{1, 17}, {699, 195}} + + + + + 4 + + + + -2147483392 + {{544, 17}, {15, 180}} + + + _doScroller: + 0.92307692307692313 + + + + -2147483392 + {{1, 197}, {598, 15}} + + 1 + + _doScroller: + 0.98918083462132922 + + + + 2304 + + + + {{1, 0}, {699, 17}} + + + + + 4 + + + + {{-1, 53}, {701, 213}} + + + 562 + + + + + + QSAAAEEgAABBmAAAQZgAAA + + + {720, 364} + + {{0, 0}, {1920, 1178}} + {600, 272} + {1.79769e+308, 1.79769e+308} + + + 1 + 2 + {{157, 261}, {380, 200}} + 1685586944 + ROM Save File Migration + NSWindow + + {1.79769e+308, 1.79769e+308} + + + 256 + + + + 268 + {{17, 112}, {346, 68}} + + YES + + 67239424 + 272629760 + The ROM save file was not created for this ROM yet, but a save file was found in the same directory as this ROM. Would you like to migrate it to work with DeSmuME? + + + + + + + + + 268 + {{270, 12}, {96, 32}} + + 1 + YES + + 67239424 + 134217728 + Migrate + + + -2038284033 + 129 + + DQ + 200 + 25 + + + + + 268 + {{144, 12}, {126, 32}} + + YES + + 67239424 + 134217728 + Don't Migrate + + + -2038284033 + 129 + + Gw + 200 + 25 + + + + + 268 + {{17, 48}, {346, 56}} + + YES + + 67239424 + 272633856 + Migrating the ROM save file will move it to DeSmuME's Applicaton Support folder. If you do not migrate the save file now, a new file will be created instead. This will be like starting the ROM for the first time. + + + + + + + + {380, 200} + + {{0, 0}, {1440, 878}} + {1.79769e+308, 1.79769e+308} + + + 1 + 2 + {{157, 298}, {335, 163}} + 1685586944 + Save State + NSWindow + + {1.79769e+308, 1.79769e+308} + + + 256 + + + + 268 + {{17, 109}, {301, 34}} + + YES + + 67239424 + 272629760 + Would you like to save the emulation state before closing? + + + + + + + + + 268 + {{220, 12}, {96, 32}} + + 1 + YES + + 67239424 + 134217728 + Save + + + -2038284033 + 129 + + DQ + 200 + 25 + + + + + 268 + {{114, 12}, {106, 32}} + + 2 + YES + + 67239424 + 134217728 + Don't Save + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{17, 59}, {301, 42}} + + YES + + 67239424 + 272633856 + If you haven't already saved using the ROM's battery save, then not saving the emulation state now will cause any unsaved changes to be lost. + + + + + + + + + 268 + {{18, 12}, {96, 32}} + + YES + + 67239424 + 134217728 + Cancel + + + -2038284033 + 129 + + Gw + 200 + 25 + + + + {335, 163} + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + 7 + 2 + {{235, 88}, {640, 480}} + 1685586944 + Cheat Manager + NSWindow + + {1.79769e+308, 1.79769e+308} + + + 256 + + + + 268 + + + + 2304 + + + + 256 + {270, 321} + + YES + + + 256 + {270, 17} + + + + + + -2147483392 + {{256, 0}, {16, 17}} + + + + + 20 + 20 + 20 + + 75628096 + 2048 + + + + 3 + MC4zMzMzMzI5ODU2AA + + + + + 67239424 + 0 + + + + 1215582719 + 2 + + + + + 200 + 25 + + YES + + + + 36 + 10 + 3.4028234663852886e+38 + + 75628096 + 2048 + Type + + + + + + 67239424 + 33554432 + + 0 + 0 + 0 + NO + + + + cheatType + YES + compare: + + + + 205 + 10 + 3.4028234663852886e+38 + + 75628096 + 2048 + Description + + + + + + 337772032 + 4325632 + Text Cell + + + + + + 3 + YES + YES + + + + 3 + 2 + + + 42 + 1388314624 + + + 1 + 4 + 15 + 0 + NO + 0 + + + {{1, 17}, {270, 321}} + + + + + 4 + + + + -2147483392 + {{256, 17}, {15, 306}} + + + _doScroller: + 0.99689440993788825 + + + + -2147483392 + {{1, 323}, {270, 15}} + + 1 + + _doScroller: + 0.99630996309963105 + + + + 2304 + + + + {{1, 0}, {270, 17}} + + + + + 4 + + + + {{20, 49}, {272, 339}} + + + 562 + + + + + + QSAAAEEgAABCMAAAQjAAAA + + + + 268 + {{113, 12}, {185, 32}} + + YES + + 67239424 + 134217728 + View Cheat Database... + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{47, 19}, {28, 23}} + + YES + + -2080244224 + 134217728 + + + + -2033434369 + 162 + + + + 400 + 75 + + + + + 268 + {{20, 19}, {28, 23}} + + YES + + -2080244224 + 134217728 + + + + -2033434369 + 162 + + + + 400 + 75 + + + + + 12 + + + + 274 + + + + 268 + {{100, 372}, {209, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + Internal Cheat + + 1048576 + 2147483647 + 1 + + NSImage + Icon_DeSmuME_32x32 + + + + _popUpItemAction: + + + YES + + OtherViews + + + + + Action Replay + + 1048576 + 2147483647 + + NSImage + Icon_ActionReplay_32x32 + + + + _popUpItemAction: + 1 + + + + + + 1 + YES + YES + 2 + + + + + 301 + {{2, 33}, {320, 290}} + + NSView + + + + 268 + {{16, 402}, {129, 18}} + + YES + + 67239424 + 0 + Enable this cheat + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{15, 378}, {83, 17}} + + YES + + 68288064 + 272630784 + Type: + + LucidaGrande + 13 + 16 + + + + + + + + + 12 + {{14, 320}, {292, 5}} + + {0, 0} + + 67239424 + 0 + Box + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + 3 + 2 + 0 + NO + + + + 268 + {{103, 331}, {203, 39}} + + YES + + -1805517311 + 272629760 + + + + YES + + + + + + + 268 + {{15, 353}, {83, 17}} + + YES + + 68288064 + 272630784 + Description: + + + + + + + + + 268 + {{114, 6}, {96, 32}} + + YES + + 67239424 + 134217728 + Apply + + + -2038284033 + 129 + + + 200 + 25 + + + + {{1, 1}, {324, 428}} + + + + {{297, 16}, {326, 444}} + + {0, 0} + + 67239424 + 0 + Cheat Settings + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 268 + {{89, 446}, {70, 14}} + + YES + + 68288064 + 4326400 + ROM Name: + + LucidaGrande-Bold + 11 + 16 + + + + + + + + + 268 + {{89, 421}, {69, 14}} + + YES + + 68288064 + 4326400 + ROM Serial: + + + + + + + + + 268 + {{160, 421}, {135, 14}} + + YES + + 70385217 + 272761856 + + + ? + + + + + + + + 268 + {{161, 446}, {134, 14}} + + YES + + 70385217 + 272761856 + + + ? + + + + + + + + 268 + {{90, 394}, {190, 18}} + + YES + + -2080244224 + 0 + Enable Cheats + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + {{20, 396}, {64, 64}} + + YES + + 130560 + 33554432 + + 0 + 3 + 0 + NO + + YES + + + {640, 480} + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + CheatWindowDelegate + + + + 256 + + + + 292 + {{17, 4}, {294, 14}} + + YES + + 68288064 + 138548224 + This list only shows the first 100 search results. + + + + + + + + + 1292 + + {{214, 220}, {16, 16}} + + 28938 + 100 + + + + 268 + {{133, 369}, {136, 22}} + + YES + + -1539178944 + 133120 + + + 109199615 + 129 + + + 400 + 75 + + + Unsigned + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + + + + YES + Signed (NOT IMPLEMENTED) + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + + 1 + YES + YES + 2 + + + + + 268 + {{59, 374}, {60, 14}} + + YES + + 68288064 + 272761856 + Sign Type: + + + + + + + + + 268 + {{59, 398}, {72, 14}} + + YES + + 68288064 + 272761856 + Search Style: + + + + + + + + + 268 + {{133, 393}, {136, 22}} + + YES + + -2076049856 + 133120 + + + 109199615 + 129 + + + 400 + 75 + + + Exact Value + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + + + + Comparative + + 1048576 + 2147483647 + + + _popUpItemAction: + 1 + + + + + + 1 + YES + YES + 2 + + + + + 268 + {{0, 237}, {328, 134}} + + NSView + + + + 268 + {{233, 213}, {80, 28}} + + YES + + 67239424 + 134348800 + Reset + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{59, 222}, {150, 14}} + + YES + + 68288064 + 272761856 + + + Search not started. + + + + + + + + 268 + {{17, 222}, {45, 14}} + + YES + + 68288064 + 272761856 + Found: + + + + + + + + + 284 + + + + 2304 + + + + 256 + {286, 176} + + YES + + + 256 + {286, 17} + + + + + + -2147483392 + {{224, 0}, {16, 17}} + + + + + 102 + 40 + 1000 + + 75628096 + 2048 + Address + + + 3 + MC4zMzMzMzI5ODU2AA + + + + + 69336641 + 137216 + Text Cell + + Monaco + 11 + 16 + + + + + + 3 + YES + + + + 178 + 40 + 1000 + + 75628096 + 2048 + Value + + + + + + 69336641 + 137216 + Text Cell + + + + + + 3 + YES + + + + 3 + 2 + + + 14 + 1916796928 + + + 3 + 4 + 15 + 0 + NO + 0 + + + {{1, 17}, {286, 176}} + + + + + 4 + + + + -2147483392 + {{224, 17}, {15, 102}} + + + _doScroller: + 0.94863013698630139 + + + + -2147483392 + {{1, 294}, {338, 15}} + + 1 + + _doScroller: + 0.93888888888888888 + + + + 2304 + + + + {{1, 0}, {286, 17}} + + + + + 4 + + + + {{20, 20}, {288, 194}} + + + 562 + + + + + + QSAAAEEgAABBgAAAQYAAAA + + + {328, 434} + NSView + + + + {328, 397} + {0, 397} + {328, 397} + 2 + 0.0 + 0.0 + + + + + 15 + 2 + {{235, 143}, {500, 416}} + 1685585920 + Cheat Database + NSWindow + + {1.79769e+308, 1.79769e+308} + {500, 272} + + + 256 + + + + 274 + + + + 2304 + + + + 256 + {500, 287} + + YES + + + 256 + {500, 17} + + + + + + -2147483392 + {{224, 0}, {16, 17}} + + + + + 25 + 25 + 25 + + 75628096 + 2048 + + + + 3 + MC4zMzMzMzI5ODU2AA + + + + + 67239424 + 134217728 + + + + 1215582719 + 2 + + + + + 200 + 25 + + YES + + + + 464 + 40 + 1000 + + 75628096 + 2048 + Description + + + + + + 69336577 + 135168 + Text Cell + + + + + + 3 + YES + YES + + + + 3 + 2 + + + 39 + 1388314624 + + + 1 + 4 + 15 + 0 + NO + 0 + + + {{1, 17}, {500, 287}} + + + + + 4 + + + + -2147483392 + {{224, 17}, {15, 102}} + + + _doScroller: + 0.94773519163763065 + + + + -2147483392 + {{1, 249}, {568, 15}} + + 1 + + _doScroller: + 0.99206349206349209 + + + + 2304 + + + + {{1, 0}, {500, 17}} + + + + + 4 + + + + {{-1, 57}, {502, 305}} + + + 562 + + + + + + QSAAAEEgAABCJAAAQiQAAA + + + + 268 + {{17, 370}, {120, 14}} + + YES + + 68288064 + 272761856 + R4 Cheats Database: + + + + + + + + + 268 + {{17, 392}, {63, 14}} + + YES + + 68288064 + 272761856 + ROM Title: + + + + + + + + + 292 + {{14, 12}, {114, 32}} + + YES + + 67239424 + 134217728 + Select All + + + -2038284033 + 129 + + + 200 + 25 + + + + + 292 + {{128, 12}, {114, 32}} + + YES + + 67239424 + 134217728 + Select None + + + -2038284033 + 129 + + + 200 + 25 + + + + + 289 + {{390, 12}, {96, 32}} + + 1 + YES + + 67239424 + 134217728 + Add + + + -2038284033 + 129 + + DQ + 200 + 25 + + + + + 289 + {{294, 12}, {96, 32}} + + YES + + 67239424 + 134217728 + Cancel + + + -2038284033 + 129 + + Gw + 200 + 25 + + + + + 265 + {{378, 370}, {42, 14}} + + YES + + 68288064 + 272761856 + Found: + + + + + + + + + 268 + {{139, 370}, {237, 14}} + + YES + + 68288064 + 272761856 + + + Database file + + + + + + + + 268 + {{422, 370}, {61, 14}} + + YES + + 68288064 + 272761856 + + + Count + + + + + + + + 268 + {{82, 392}, {401, 14}} + + YES + + 68288064 + 272761856 + + + ROM title + + + + + + + {500, 416} + + {{0, 0}, {1920, 1178}} + {500, 294} + {1.79769e+308, 1.79769e+308} + + + + 268 + + + + 268 + {{233, 54}, {80, 28}} + + YES + + 67239424 + 134348800 + Search + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{20, 59}, {210, 19}} + + YES + + 343014976 + 268567552 + + Search value + + YES + 1 + + + + 130560 + 0 + search + + _searchFieldSearch: + + 138690815 + 0 + + 400 + 75 + + + 130560 + 0 + clear + + + cancel + + + + + _searchFieldCancel: + + 138690815 + 0 + + 400 + 75 + + 255 + + + + + 268 + {{17, 86}, {294, 14}} + + YES + + 67239424 + 272760832 + Enter a search value, and then click Search. + + + + + + + + + 268 + {{17, 100}, {294, 14}} + + YES + + 67239424 + 272760832 + Search for an exact value. + + + + + + + + {328, 134} + NSView + + + + 268 + + + + 268 + {{17, 86}, {294, 14}} + + YES + + 67239424 + 272760832 + Click Start Search to begin the comparative search. + + + + + + + + + 268 + {{17, 100}, {294, 14}} + + YES + + 67239424 + 272760832 + Start a comparative search. + + + + + + + + + 268 + {{116, 47}, {96, 28}} + + YES + + 67239424 + 134348800 + Start Search + + + -2038284033 + 129 + + + 200 + 25 + + + + {328, 134} + NSView + + + + 268 + + + + 268 + {{17, 72}, {294, 28}} + + YES + + 67239424 + 272760832 + Click the appropriate button based on how the target value is changing. + + + + + + + + + 268 + {{17, 100}, {294, 14}} + + YES + + 67239424 + 272760832 + How is the value changing? + + + + + + + + + 268 + {{163, 13}, {150, 28}} + + 1 + YES + + 67239424 + 134348800 + Value is now lower + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{163, 40}, {150, 28}} + + YES + + 67239424 + 134348800 + Value is now higher + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{15, 13}, {150, 28}} + + 3 + YES + + 67239424 + 134348800 + Value did change + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{15, 40}, {150, 28}} + + 2 + YES + + 67239424 + 134348800 + Value is unchanged + + + -2038284033 + 129 + + + 200 + 25 + + + + {328, 134} + NSView + + + + 301 + + + + 268 + {{197, 191}, {109, 32}} + + YES + + 67239424 + 134217728 + Write Once + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{17, 20}, {286, 42}} + + YES + + 67239424 + 272760832 + Note: Enabling this cheat freezes the value in memory. If you only want to change a value without actually freezing it in memory, click Write Once. + + + + + + + + + 268 + {{17, 262}, {128, 17}} + + YES + + 68288064 + 272630784 + Search for Address: + + + + + + + + + 265 + {{149, 257}, {27, 27}} + + YES + + -2080244224 + 134217728 + + + + -2033434369 + 160 + + NSImage + NSActionTemplate + + + + 400 + 75 + + + + + 268 + {{79, 230}, {38, 17}} + + YES + + 68288064 + 272630784 + 0x02 + + Monaco + 13 + 16 + + + + + + + + + 268 + {{67, 198}, {128, 22}} + + YES + + -1804468671 + -1874852864 + + + + + + + + + -∞ + + + +∞ + + + #0 + #0 + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + NO + + + YES + + + + + + + 268 + {{17, 201}, {45, 17}} + + YES + + 68288064 + 272630784 + Value: + + + + + + + + + 268 + {{122, 228}, {73, 22}} + + YES + + -1804468671 + 272630784 + + + + YES + + + + + + + 268 + {{17, 231}, {60, 17}} + + YES + + 68288064 + 272630784 + Address: + + + + + + + + + 12 + + + + 274 + + + + 268 + {{18, 14}, {190, 78}} + + YES + 4 + 1 + + + 67239424 + 0 + 1 Byte [0 - 255] + + + 1 + 1211912703 + 0 + + + + 200 + 25 + + + 67239424 + 0 + 2 Bytes [0 - 65536] + + + 2 + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + 67239424 + 0 + 3 Bytes [0 - 16777215] + + + 3 + 1211912703 + 0 + + 400 + 75 + + + -2080244224 + 0 + 4 Bytes [0 - 4294967295] + + + 4 + 1211912703 + 0 + + 400 + 75 + + + {190, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 0 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + 3 + + + + + + + {{1, 1}, {226, 102}} + + + + {{46, 72}, {228, 118}} + + {0, 0} + + 67239424 + 0 + Select Memory Size + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + {320, 290} + NSView + + + + 301 + + + + 256 + + + + 2304 + + + + 2322 + + Apple HTML pasteboard type + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + Apple URL pasteboard type + CorePasteboardFlavorType 0x6D6F6F76 + NSColor pasteboard type + NSFilenamesPboardType + NSStringPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT RTFD pasteboard type + NeXT Rich Text Format v1.0 pasteboard type + NeXT TIFF v4.0 pasteboard type + NeXT font pasteboard type + NeXT ruler pasteboard type + WebURLsWithTitlesPboardType + public.url + + {{0, 125}, {278, 53}} + + + + + + + + + + + + + 134 + + + + 278 + 1 + + + 11523 + 0 + + + + + + + + + + + + + + 4 + + 1 + + + 6 + {463, 1e+07} + {218, 53} + + + NSAllRomanInputSourcesLocaleIdentifier + + + + {{1, 1}, {278, 223}} + + + + + + 4 + + + + -2147483392 + {{231, 1}, {15, 172}} + + + _doScroller: + 0.68253968253968256 + + + + -2147483392 + {{-100, -100}, {87, 18}} + + 1 + + _doScroller: + 0.97142857142857142 + 0.94565218687057495 + + + {{20, 20}, {280, 225}} + + + 530 + + + + + + + 268 + {{17, 253}, {138, 17}} + + YES + + 68288064 + 272630784 + Action Replay Code: + + + + + + + + {320, 290} + NSView + + + + 301 + + + + 268 + + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + {{101, 133}, {128, 128}} + + YES + + 130560 + 33554432 + + NSImage + Icon_CodeBreaker_128x128 + + 0 + 3 + 0 + NO + + YES + + + + 268 + {{17, 35}, {286, 72}} + + YES + + 67239424 + 138412032 + Code Breaker cheats have not been implemented in this version of DeSmuME. + + LucidaGrande-Bold + 20 + 16 + + + + + + + + {320, 290} + NSView + + + 279 + 2 + {{230, 145}, {280, 396}} + -461896704 + Emulation Settings + NSPanel + + {1.79769e+308, 1.79769e+308} + + + 256 + + + + 12 + + + + 274 + + + + 268 + {{16, 12}, {171, 18}} + + 1 + YES + + -2080244224 + 131072 + Advanced Bus-Level Timing + + + 1211912703 + 2 + + + + + 200 + 25 + + + + {{1, 1}, {244, 38}} + + + + {{17, 322}, {246, 54}} + + {0, 0} + + 67239424 + 0 + General Settings + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{16, 52}, {158, 18}} + + 2 + YES + + 67239424 + 131072 + Use External BIOS Images + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{35, 32}, {120, 18}} + + 3 + YES + + -2080244224 + 131072 + Emulate BIOS SWIs + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{35, 12}, {132, 18}} + + 4 + YES + + 67239424 + 131072 + Patch DelayLoop SWI + + + 1211912703 + 2 + + + + + 200 + 25 + + + + {{1, 1}, {244, 78}} + + + + {{17, 224}, {246, 94}} + + {0, 0} + + 67239424 + 0 + BIOS Configuration + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{15, 32}, {177, 18}} + + 5 + YES + + 67239424 + 131072 + Use External Firmware Image + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{15, 12}, {130, 18}} + + 6 + YES + + 67239424 + 131072 + Boot From Firmware + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 265 + {{176, 54}, {27, 27}} + + YES + + -2080244224 + 134217728 + + + + -2033434369 + 160 + + + + 400 + 75 + + + + + 268 + {{15, 61}, {157, 14}} + + YES + + 68288064 + 272761856 + Configure Internal Firmware: + + + + + + + + {{1, 1}, {244, 85}} + + + + {{17, 119}, {246, 101}} + + {0, 0} + + 67239424 + 0 + Firmware Configuration + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 268 + {{63, 18}, {154, 19}} + + YES + + -2080244224 + 134217728 + Save Settings as Default + + + -2038152961 + 164 + + + 400 + 75 + + + + + 12 + + + + 274 + + + + 268 + {{15, 32}, {127, 18}} + + 9 + YES + + 67239424 + 131072 + Use Debug Console + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{15, 12}, {103, 18}} + + YES + + 67239424 + 131072 + Emulate Ensata + + + 1211912703 + 2 + + + + + 200 + 25 + + + + {{1, 1}, {244, 58}} + + + + {{17, 41}, {246, 74}} + + {0, 0} + + 67239424 + 0 + Debugger Configuration + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + {280, 396} + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + + 256 + + + + 268 + {{53, 18}, {154, 19}} + + YES + + -2080244224 + 134217728 + Apply + + + -2038152961 + 164 + + + 400 + 75 + + + + + 268 + {{107, 212}, {136, 22}} + + YES + + -2076049856 + 133120 + + + 109199615 + 129 + + + 400 + 75 + + + Gray + + 2147483647 + 1 + + + + _popUpItemAction: + + + YES + + OtherViews + + + + + Brown + + 2147483647 + + + + _popUpItemAction: + 1 + + + + + Red + + 2147483647 + + + + _popUpItemAction: + 2 + + + + + Pink + + 2147483647 + + + + _popUpItemAction: + 3 + + + + + Orange + + 2147483647 + + + + _popUpItemAction: + 4 + + + + + Yellow + + 2147483647 + + + + _popUpItemAction: + 5 + + + + + Lime Green + + 2147483647 + + + + _popUpItemAction: + 6 + + + + + Green + + 2147483647 + + + + _popUpItemAction: + 7 + + + + + Dark Green + + 2147483647 + + + + _popUpItemAction: + 8 + + + + + Sea Green + + 2147483647 + + + + _popUpItemAction: + 9 + + + + + Turquoise + + 2147483647 + + + + _popUpItemAction: + 10 + + + + + Blue + + 2147483647 + + + + _popUpItemAction: + 11 + + + + + Dark Blue + + 2147483647 + + + + _popUpItemAction: + 12 + + + + + Dark Purple + + 2147483647 + + + + _popUpItemAction: + 13 + + + + + Violet + + 2147483647 + + + + _popUpItemAction: + 14 + + + + + Magenta + + 2147483647 + + + + _popUpItemAction: + 15 + + + + + + 1 + YES + YES + 2 + + + + + 268 + {{107, 157}, {136, 22}} + + YES + + -2076049856 + 133120 + + + 109199615 + 129 + + + 400 + 75 + + + English + + 2147483647 + 1 + + + _popUpItemAction: + 1 + + + YES + + OtherViews + + + + Japanese + + 2147483647 + + + _popUpItemAction: + + + + + + French + + 2147483647 + + + _popUpItemAction: + 2 + + + + + German + + 2147483647 + + + _popUpItemAction: + 3 + + + + + Italian + + 2147483647 + + + _popUpItemAction: + 4 + + + + + Spanish + + 2147483647 + + + _popUpItemAction: + 5 + + + + + + 1 + 1 + YES + YES + 2 + + + + + 268 + {{17, 45}, {226, 98}} + + YES + + 67239424 + 272760832 + Note: To use this configuration, click Apply, and then reset the emulator. Also, these settings will be overridden if you are using an external firmware image. If you want to use this configuration, ensure that the Use External Firmware Image setting is disabled. + + + + + + + + + 268 + {{110, 186}, {133, 27}} + + YES + + 71433728 + 131072 + + 330548400 + + + + 0.0 + 224 + + + + + + + 268 + {{17, 162}, {69, 14}} + + YES + + 68288064 + 272761856 + Language: + + + + + + + + + 268 + {{17, 190}, {60, 14}} + + YES + + 68288064 + 272761856 + Birthday: + + + + + + + + + 268 + {{17, 217}, {97, 14}} + + YES + + 68288064 + 272761856 + Favorite Color: + + + + + + + + + 268 + {{17, 264}, {63, 14}} + + YES + + 68288064 + 272761856 + Message: + + + + + + + + + 268 + {{17, 291}, {71, 14}} + + YES + + 68288064 + 272761856 + Nickname: + + + + + + + + + 268 + {{110, 241}, {130, 40}} + + YES + + -1805517311 + 272760832 + + + Enter a message... + + YES + + + + + + + 268 + {{110, 289}, {130, 19}} + + YES + + -1804468671 + 272761856 + + + Enter a nickname... + + YES + + + + + + {260, 328} + NSView + + + + {260, 328} + {0, 328} + {260, 328} + 2 + 0.0 + 0.0 + + + + + 279 + 2 + {{1572, 795}, {194, 241}} + -461896704 + HUD Settings + NSPanel + + {1.79769e+308, 1.79769e+308} + + + 256 + + + + 268 + {{18, 174}, {158, 18}} + + YES + + -2080244224 + 131072 + Frame Counter + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{18, 154}, {158, 18}} + + YES + + -2080244224 + 131072 + Frames Per Second + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{18, 134}, {158, 18}} + + YES + + -2080244224 + 131072 + Input + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{18, 114}, {158, 18}} + + YES + + -2080244224 + 131072 + Graphical Input + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{18, 94}, {158, 18}} + + YES + + -2080244224 + 131072 + Lag Counter + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{18, 74}, {158, 18}} + + YES + + -2080244224 + 131072 + Microphone + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{18, 54}, {158, 18}} + + YES + + -2080244224 + 131072 + Real Time Clock + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{20, 18}, {154, 19}} + + YES + + -2080244224 + 134217728 + Save Settings as Default + + + -2038152961 + 164 + + + 400 + 75 + + + + + 268 + {{18, 205}, {158, 18}} + + YES + + -2080244224 + 131072 + Enable HUD + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 12 + {{21, 196}, {153, 5}} + + {0, 0} + + 67239424 + 0 + Box + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + 3 + 2 + 0 + NO + + + {194, 241} + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + 279 + 2 + {{1651, 316}, {204, 481}} + -461896704 + Video Output Settings + NSPanel + + {1.79769e+308, 1.79769e+308} + + + 256 + + + + 268 + {{25, 18}, {154, 19}} + + YES + + -2080244224 + 134217728 + Save Settings as Default + + + -2038152961 + 164 + + + 400 + 75 + + + + + 12 + + + + 274 + + + + 268 + {{18, 14}, {129, 358}} + + YES + 18 + 1 + + + -2080244224 + 139264 + None + + + 1211912703 + 2 + + NSImage + NSRadioButton + + + + + 200 + 25 + + + 67239424 + 139264 + LQ2x + + + 1 + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + 1140981248 + 139264 + LQ2xS + + + 2 + 1211912703 + 0 + + 12779520 + + + + + + regular + normal + + radiobutton + + {18, 18} + 0 + YES + NSCalibratedRGBColorSpace + + + + + + + 400 + 75 + + + 1140981248 + 139264 + HQ2x + + + 3 + 1211912703 + 0 + + + 400 + 75 + + + 1140981248 + 139264 + HQ2xS + + + 4 + 1211912703 + 0 + + + 400 + 75 + + + 67239424 + 139264 + HQ4x + + + 5 + 1211912703 + 0 + + + 400 + 75 + + + 1140981248 + 139264 + 2xSaI + + + 6 + 1211912703 + 0 + + + 400 + 75 + + + 67239424 + 139264 + Super 2xSaI + + + 7 + 1211912703 + 0 + + + 400 + 75 + + + 1140981248 + 139264 + Super Eagle + + + 8 + 1211912703 + 0 + + + 400 + 75 + + + 67239424 + 139264 + Scanline + + + 9 + 1211912703 + 0 + + + 400 + 75 + + + 67239424 + 139264 + Bilinear + + + 10 + 1211912703 + 0 + + + 400 + 75 + + + 1140981248 + 139264 + Nearest 2x + + + 11 + 1211912703 + 0 + + + 400 + 75 + + + 67239424 + 139264 + Nearest 1.5x + + + 12 + 1211912703 + 0 + + + 400 + 75 + + + 67239424 + 139264 + Nearest+ 1.5x + + + 13 + 1211912703 + 0 + + + 400 + 75 + + + 67239424 + 139264 + EPX + + + 14 + 1211912703 + 0 + + + 400 + 75 + + + 67239424 + 139264 + EPX+ + + + 15 + 1211912703 + 0 + + + 400 + 75 + + + 67239424 + 139264 + EPX 1.5x + + + 16 + 1211912703 + 0 + + + 400 + 75 + + + 67239424 + 131072 + EPX+ 1.5x + + + 17 + 1211912703 + 0 + + 12779520 + + + + + + regular + normal + + radiobutton + + {18, 18} + 0 + YES + NSCalibratedRGBColorSpace + + + + + + + 400 + 75 + + + {129, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 131072 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + + + + + + + {{1, 1}, {168, 382}} + + + + {{17, 41}, {170, 398}} + + {0, 0} + + 67239424 + 0 + Video Filters + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 268 + {{17, 445}, {169, 18}} + + YES + + -2080244224 + 131072 + Use Bilinear Filtered Output + + + 1211912703 + 2 + + + + + 200 + 25 + + + + {204, 481} + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + 279 + 2 + {{230, 79}, {284, 462}} + -461896704 + 3D Rendering Settings + NSPanel + + {1.79769e+308, 1.79769e+308} + + + 256 + + + + 12 + + + + 274 + + + + 268 + {{15, 97}, {206, 18}} + + YES + + -2080244224 + 131072 + High-Precision Color Interpolation + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{15, 77}, {134, 18}} + + YES + + -2080244224 + 131072 + Enable Edge Marking + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{15, 57}, {80, 18}} + + YES + + -2080244224 + 131072 + Enable Fog + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{15, 37}, {108, 18}} + + YES + + -2080244224 + 131072 + Enable Textures + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{185, 12}, {45, 19}} + + YES + + -1804468671 + 272761856 + + + + + + + + + + + + # + -∞ + + + # + +∞ + + # + # + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + NO + + + YES + + + + + + + 268 + {{15, 14}, {165, 14}} + + YES + + 68288064 + 272761856 + Depth Comparison Threshold: + + + + + + + + {{1, 1}, {248, 123}} + + + + {{17, 163}, {250, 139}} + + {0, 0} + + 67239424 + 0 + SoftRasterizer Options + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 268 + {{65, 18}, {154, 19}} + + YES + + -2080244224 + 134217728 + Save Settings as Default + + + -2038152961 + 164 + + + 400 + 75 + + + + + 12 + + + + 274 + + + + 268 + {{18, 14}, {107, 38}} + + YES + 2 + 1 + + + 67239424 + 131072 + None + + + 1211912703 + 0 + + + + 200 + 25 + + + -2080244224 + 131072 + SoftRasterizer + + + 1 + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + {107, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 131072 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + 1 + + + + + + + {{1, 1}, {248, 62}} + + + + {{17, 364}, {250, 78}} + + {0, 0} + + 67239424 + 0 + 3D Rendering Engine + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{18, 14}, {120, 78}} + + YES + 4 + 1 + + + -2080244224 + 131072 + Automatic + + + 1211912703 + 0 + + + + 200 + 25 + + + 67239424 + 131072 + Single-Threaded + + + 1 + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + 67239424 + 131072 + 2 Threads + + + 2 + 1211912703 + 0 + + 12779520 + + + + + + regular + normal + + radiobutton + + {18, 18} + 0 + YES + NSCalibratedRGBColorSpace + + + + + + + 400 + 75 + + + 67239424 + 131072 + 4 Threads + + + 4 + 1211912703 + 0 + + + 400 + 75 + + + {120, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 131072 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + + + + + + + {{1, 1}, {248, 102}} + + + + {{17, 41}, {250, 118}} + + {0, 0} + + 67239424 + 0 + SoftRasterizer Rendering Threads + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{16, 12}, {113, 18}} + + YES + + -2080244224 + 131072 + Enable Line Hack + + + 1211912703 + 2 + + + + + 200 + 25 + + + + {{1, 1}, {248, 38}} + + + + {{17, 306}, {250, 54}} + + {0, 0} + + 67239424 + 0 + General Settings + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + {284, 462} + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + 279 + 2 + {{230, 30}, {288, 511}} + -461896704 + Sound Settings + NSPanel + + {1.79769e+308, 1.79769e+308} + + + 256 + + + + 12 + + + + 274 + + + + 268 + {{18, 14}, {61, 58}} + + YES + 3 + 1 + + + 67239424 + 131072 + None + + + 1211912703 + 0 + + + + 200 + 25 + + + 67239424 + 131072 + Linear + + + 1 + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + -2080244224 + 131072 + Cosine + + + 2 + 1211912703 + 0 + + 400 + 75 + + + {61, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 131072 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + 2 + + + + + + + {{1, 1}, {253, 82}} + + + + {{16, 189}, {255, 98}} + + {0, 0} + + 67239424 + 0 + SPU Interpolation Method + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{18, 80}, {154, 38}} + + YES + 2 + 1 + + + 67239424 + 131072 + Dual SPU Synch/Asynch + + + 1211912703 + 0 + + + + 200 + 25 + + + -2080244224 + 131072 + Synchronous + + + 1 + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + {154, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 131072 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + 1 + + + + + + + + 268 + {{53, 14}, {100, 58}} + + YES + 3 + 1 + + + 67239424 + 131072 + "N" Method + + + 1211912703 + 0 + + + + 200 + 25 + + + 67239424 + 131072 + "Z" Method + + + 1 + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + -2080244224 + 131072 + "P" Method + + + 2 + 1211912703 + 0 + + 400 + 75 + + + {100, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 131072 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + 2 + + + + + + + {{1, 1}, {253, 128}} + + + + {{16, 41}, {255, 144}} + + {0, 0} + + 67239424 + 0 + SPU Sound Synchronization Method + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{15, 12}, {129, 18}} + + YES + + -2080244224 + 131072 + Advanced SPU Logic + + + 1211912703 + 2 + + + + + 200 + 25 + + + + {{1, 1}, {253, 38}} + + + + {{16, 291}, {255, 54}} + + {0, 0} + + 67239424 + 0 + SPU Configuration + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{47, 13}, {136, 21}} + + YES + + 67501824 + 0 + + + 100 + 0.0 + 100 + 0.0 + 0 + 1 + NO + NO + + + + + 268 + {{186, 17}, {52, 17}} + + YES + + 68288064 + 272634880 + + + + + + + + + + + + -∞ + + + +∞ + + + #0.0% + #0.0% + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + Volume + + + + + + + + 289 + + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + {{18, 14}, {20, 20}} + + YES + + 130560 + 33554432 + + 0 + 2 + 0 + YES + + YES + + + {{1, 1}, {253, 44}} + + + + {{16, 349}, {255, 60}} + + {0, 0} + + 67239424 + 0 + General Settings + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 268 + {{66, 18}, {154, 19}} + + YES + + -2080244224 + 134217728 + Save Settings as Default + + + -2038152961 + 164 + + + 400 + 75 + + + + + 12 + + + + 274 + + + + 268 + {{18, 14}, {116, 38}} + + YES + 2 + 1 + + + 67239424 + 131072 + None + + + 1211912703 + 0 + + + + 200 + 25 + + + -2080244224 + 131072 + OS X Core Audio + + + 58325 + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + {116, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 131072 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + 1 + + + + + + + {{1, 1}, {253, 62}} + + + + {{16, 413}, {255, 78}} + + {0, 0} + + 67239424 + 0 + Audio Output Engine + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + {288, 511} + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + 8215 + 2 + {{107, 480}, {580, 588}} + -461897728 + ROM Info + NSPanel + + {1.79769e+308, 1.79769e+308} + + + 256 + + + + + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + {{20, 440}, {128, 128}} + + YES + + 130560 + 33554432 + + 0 + 3 + 0 + NO + + YES + + + + 12 + + + + 274 + + + + 268 + {{15, 89}, {131, 17}} + + YES + + 68288064 + 272634880 + ROM Name: + + + + + + + + + 268 + {{15, 64}, {131, 17}} + + YES + + 68288064 + 272630784 + ROM Serial: + + + + + + + + + 268 + {{15, 39}, {131, 17}} + + YES + + 68288064 + 272630784 + Maker Code: + + + + + + + + + 268 + {{15, 14}, {131, 17}} + + YES + + 68288064 + 272630784 + Chip Size: + + + + + + + + + 268 + {{148, 89}, {245, 17}} + + YES + + 68288064 + 4195328 + + + ? + + + + 1 + MSAxIDEAA + + + + + + 268 + {{148, 64}, {245, 17}} + + YES + + 68288064 + 4195328 + + + ? + + + + + + + + 268 + {{148, 39}, {245, 17}} + + YES + + 68288064 + 4195328 + + + ? + + + + + + + + 268 + {{148, 14}, {245, 17}} + + YES + + 68288064 + 4195328 + + + ? + + + + + + + {{1, 1}, {408, 116}} + + + + {{153, 436}, {410, 132}} + + {0, 0} + + 67239424 + 0 + General Info + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{15, 376}, {186, 14}} + + YES + + 68288064 + 272897024 + JAPANESE TITLE: + + + + + + + + + 268 + {{15, 312}, {186, 14}} + + YES + + 68288064 + 272897024 + ENGLISH TITLE: + + + + + + + + + 268 + {{15, 248}, {186, 14}} + + YES + + 68288064 + 272897024 + FRENCH TITLE: + + + + + + + + + 268 + {{15, 184}, {186, 14}} + + YES + + 68288064 + 272897024 + GERMAN TITLE: + + + + + + + + + 268 + {{15, 120}, {186, 14}} + + YES + + 68288064 + 272897024 + ITALIAN TITLE: + + + + + + + + + 268 + {{15, 56}, {186, 14}} + + YES + + 68288064 + 272897024 + SPANISH TITLE: + + + + + + + + + 268 + {{15, 334}, {186, 42}} + + YES + + 67239424 + 272896000 + + + ? + + + + + + + + 268 + {{15, 270}, {186, 42}} + + YES + + 67239424 + 272896000 + + + ? + + + + + + + + 268 + {{15, 206}, {186, 42}} + + YES + + 67239424 + 272896000 + + + ? + + + + + + + + 268 + {{15, 142}, {186, 42}} + + YES + + 67239424 + 272896000 + + + ? + + + + + + + + 268 + {{15, 78}, {186, 42}} + + YES + + 67239424 + 272896000 + + + ? + + + + + + + + 268 + {{15, 14}, {186, 42}} + + YES + + 67239424 + 272896000 + + + ? + + + + + + + {{1, 1}, {216, 400}} + + + + {{17, 16}, {218, 416}} + + {0, 0} + + 67239424 + 0 + Titles + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{15, 168}, {186, 14}} + + YES + + 68288064 + 272630784 + ARM9 Binary ROM Offset: + + + + + + + + + 268 + {{15, 146}, {186, 14}} + + YES + + 68288064 + 272630784 + ARM9 Binary Entry Address: + + + + + + + + + 268 + {{15, 124}, {186, 14}} + + YES + + 68288064 + 272630784 + ARM9 Binary Start Address: + + + + + + + + + 268 + {{15, 102}, {186, 14}} + + YES + + 68288064 + 272630784 + ARM9 Binary Size: + + + + + + + + + 268 + {{15, 80}, {186, 14}} + + YES + + 68288064 + 272630784 + ARM7 Binary ROM Offset: + + + + + + + + + 268 + {{15, 58}, {186, 14}} + + YES + + 68288064 + 272630784 + ARM7 Binary Entry Address: + + + + + + + + + 268 + {{15, 36}, {186, 14}} + + YES + + 68288064 + 272630784 + ARM7 Binary Start Address: + + + + + + + + + 268 + {{15, 14}, {186, 14}} + + YES + + 68288064 + 272630784 + ARM7 Binary Size: + + + + + + + + + 268 + {{203, 168}, {106, 14}} + + YES + + 68288064 + 71304192 + + ? + + + + + + + + 268 + {{203, 146}, {106, 14}} + + YES + + 68288064 + 71304192 + + + ? + + + + + + + + 268 + {{203, 124}, {106, 14}} + + YES + + 68288064 + 71304192 + + + ? + + + + + + + + 268 + {{203, 102}, {106, 14}} + + YES + + 68288064 + 71304192 + + + ? bytes + + + + + + + + 268 + {{203, 80}, {106, 14}} + + YES + + 68288064 + 71304192 + + + ? + + + + + + + + 268 + {{203, 58}, {106, 14}} + + YES + + 68288064 + 71304192 + + + ? + + + + + + + + 268 + {{203, 36}, {106, 14}} + + YES + + 68288064 + 71304192 + + + ? + + + + + + + + 268 + {{203, 14}, {106, 14}} + + YES + + 68288064 + 71304192 + + + ? bytes + + + + + + + {{1, 1}, {324, 192}} + + + + {{237, 224}, {326, 208}} + + {0, 0} + + 67239424 + 0 + ARM9 & ARM7 Binaries + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{15, 80}, {186, 14}} + + YES + + 68288064 + 272630784 + FNT ROM Offset: + + + + + + + + + 268 + {{203, 80}, {106, 14}} + + YES + + 68288064 + 71304192 + + + ? + + + + + + + + 268 + {{15, 58}, {186, 14}} + + YES + + 68288064 + 272630784 + FNT Size: + + + + + + + + + 268 + {{203, 58}, {106, 14}} + + YES + + 68288064 + 71304192 + + + ? bytes + + + + + + + + 268 + {{15, 36}, {186, 14}} + + YES + + 68288064 + 272630784 + FAT ROM Offset: + + + + + + + + + 268 + {{203, 36}, {106, 14}} + + YES + + 68288064 + 71304192 + + + ? + + + + + + + + 268 + {{15, 14}, {186, 14}} + + YES + + 68288064 + 272630784 + FAT Size: + + + + + + + + + 268 + {{203, 14}, {106, 14}} + + YES + + 68288064 + 71304192 + + + ? bytes + + + + + + + {{1, 1}, {324, 104}} + + + + {{237, 98}, {326, 120}} + + {0, 0} + + 67239424 + 0 + File System + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + + + 274 + + + + 268 + {{15, 36}, {186, 14}} + + YES + + 68288064 + 272630784 + Icon/Title Region ROM Offset: + + + + + + + + + 268 + {{203, 36}, {106, 14}} + + YES + + 68288064 + 71304192 + + + ? + + + + + + + + 268 + {{15, 14}, {186, 14}} + + YES + + 68288064 + 272630784 + Used ROM Size: + + + + + + + + + 268 + {{203, 14}, {106, 14}} + + YES + + 68288064 + 71304192 + + + ? + + + + + + + {{1, 1}, {324, 60}} + + + + {{237, 16}, {326, 76}} + + {0, 0} + + 67239424 + 0 + Misc + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + {580, 588} + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + 279 + 2 + {{1360, 92}, {467, 135}} + -461897728 + Set Speed Limit + NSPanel + + {1.79769e+308, 1.79769e+308} + + + 256 + + + + 268 + {{30, 43}, {411, 26}} + + YES + + -2079981824 + 0 + + + 10 + 0.0 + 1 + 0.0 + 6 + 1 + NO + NO + + + + + 268 + {{17, 77}, {38, 17}} + + YES + + 68288064 + 138413056 + 0x + + + + + + + + + 268 + {{412, 77}, {38, 17}} + + YES + + 68288064 + 138413056 + 10x + + + + + + + + + 268 + {{97, 77}, {38, 17}} + + YES + + 68288064 + 138413056 + 2x + + + + + + + + + 268 + {{176, 77}, {38, 17}} + + YES + + 68288064 + 138413056 + 4x + + + + + + + + + 268 + {{254, 77}, {38, 17}} + + YES + + 68288064 + 138413056 + 6x + + + + + + + + + 268 + {{335, 77}, {38, 17}} + + YES + + 68288064 + 138413056 + 8x + + + + + + + + + 268 + {{32, 18}, {133, 19}} + + 100 + YES + + 67239424 + 134217728 + Set to Normal Speed + + + -2038152961 + 164 + + + 400 + 75 + + + + + 268 + {{260, 21}, {123, 17}} + + YES + + 68288064 + 272630784 + Speed limit set to: + + + + + + + + + 268 + {{385, 21}, {57, 17}} + + YES + + 68288064 + 272630784 + + + + + + + + + + + #0.00x + -∞ + + + #0.00x + +∞ + + + #0.00x + #0.00x + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + speedX + + + + + + + + 268 + {{158, 100}, {154, 18}} + + YES + + -2080244224 + 0 + Enable Speed Limiter + + + 1211912703 + 2 + + + + + 200 + 25 + + + + {467, 135} + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + 279 + 2 + {{162, 281}, {213, 198}} + -461897728 + Set Rotation + NSPanel + + {1.79769e+308, 1.79769e+308} + + + 256 + + + + 268 + {{88, 119}, {32, 34}} + + YES + + 67501824 + 0 + + + 360 + 0.0 + 0.0 + 0.0 + 4 + 1 + NO + NO + 1 + + + + + 268 + {{85, 161}, {38, 17}} + + YES + + 68288064 + 138413056 + 0º + + + + + + + + + 268 + {{85, 94}, {39, 17}} + + YES + + 68288064 + 138413056 + 180º + + + + + + + + + 268 + {{44, 127}, {39, 17}} + + YES + + 68288064 + 138413056 + 270º + + + + + + + + + 268 + {{125, 127}, {38, 17}} + + YES + + 68288064 + 138413056 + 90º + + + + + + + + + 268 + {{127, 69}, {57, 17}} + + YES + + 68288064 + 272630784 + + + + + + ¤ + + ¤¤ + + + + + + + #0.00º + º + + #0.00º + º + + #0.00º + #0.00º + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + rotX + + + + + + + + 268 + {{24, 69}, {101, 17}} + + YES + + 68288064 + 272630784 + Rotation set to: + + + + + + + + + 268 + {{27, 42}, {154, 19}} + + YES + + -2080244224 + 134217728 + Set to 0º + + + -2038152961 + 164 + + + 400 + 75 + + + + + 268 + {{27, 17}, {154, 19}} + + YES + + -2080244224 + 134217728 + Save Settings as Default + + + -2038152961 + 164 + + + 400 + 75 + + + + {213, 198} + + {{0, 0}, {1440, 878}} + {1.79769e+308, 1.79769e+308} + + + + 268 + + + + 268 + {{195, 5}, {226, 26}} + + + YES + + -2076049856 + 2048 + + + 109199615 + 1 + + + 400 + 75 + + + DeSmuME ROM Save (.dsv) + + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + + + + No$GBA ROM Save (.sav) + + 2147483647 + + + _popUpItemAction: + 1 + + + + + Raw Save File (.sav) + + 2147483647 + + + _popUpItemAction: + 2 + + + + + + 1 + YES + YES + 2 + + + + + 268 + {{33, 11}, {160, 17}} + + + YES + + 68288064 + 71304192 + Select ROM Save Format: + + + + + + + + {450, 35} + + + NSView + + + + 268 + + + + 268 + {{176, 5}, {126, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 1 + + + 400 + 75 + + + TIFF + + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + + + + BMP + + 2147483647 + + + _popUpItemAction: + 1 + + + + + GIF + + 2147483647 + + + _popUpItemAction: + 2 + + + + + JPEG + + 2147483647 + + + _popUpItemAction: + 3 + + + + + PNG + + 2147483647 + + + _popUpItemAction: + 4 + + + + + JPEG 2000 + + 2147483647 + + + _popUpItemAction: + 5 + + + + + + 1 + YES + YES + 2 + + + + + 268 + {{38, 11}, {136, 17}} + + YES + + 68288064 + 71304192 + Select Image Format: + + + + + + + + {350, 35} + NSView + + + + readMePath + licensePath + authorsPath + changeLogPath + versionString + dateString + + + + + + isSpeedLimitEnabled + isCheatingEnabled + speedScalar + isFrameSkipEnabled + emuFlagAdvancedBusLevelTiming + emuFlagUseExternalBios + emuFlagEmulateBiosInterrupts + emuFlagPatchDelayLoop + emuFlagUseExternalFirmware + emuFlagFirmwareBoot + emuFlagDebugConsole + emuFlagEmulateEnsata + + CocoaDSCore + + + + + gpuStateMainGPU + gpuStateMainBG0 + gpuStateMainBG1 + gpuStateMainBG2 + gpuStateMainBG3 + gpuStateMainOBJ + gpuStateSubGPU + gpuStateSubBG0 + gpuStateSubBG1 + gpuStateSubBG2 + gpuStateSubBG3 + gpuStateSubOBJ + displayMode + displayModeString + videoFilterType + videoFilterTypeString + render3DRenderingEngine + render3DDepthComparisonThreshold + render3DEdgeMarking + render3DFog + render3DHighPrecisionColorInterpolation + render3DTextures + render3DThreads + render3DLineHack + scale + rotation + useBilinearOutput + + YES + + + + + spuInterpolationMode + spuSyncMode + spuSyncMethod + spuAdvancedLogic + volume + audioOutputEngine + + YES + + + + + isWorking + status + volumeIconImage + volume + isRomLoaded + isShowingStatusBar + + YES + + + + + hasSelection + hasItems + cheatList + cheatSearchStyle + cheatSearchSignType + cheatSearchSearchValue + cheatSearchAddressCount + isRunningSearch + isSearchStarted + cheatDBTitle + cheatDBItemCount + cheatDBDate + + YES + + + + + Input_Up + Input_Down + Input_Left + Input_Right + Input_A + Input_B + Input_X + Input_Y + Input_L + Input_R + Input_Start + Input_Select + Input_Microphone + Input_Lid + Input_Debug + Input_SpeedHalf + Input_SpeedDouble + Input_HUD + Input_Execute + Input_Pause + Input_Reset + Arm7BiosImageName + Arm9BiosImageName + FirmwareImageName + AutoloadRomName + VideoFilterPreviewImage + volumeIconImage + R4CheatDatabaseName + AdvansceneDatabaseName + + YES + + + + + nickname + message + favoriteColor + birthday + language + consoleType + + CocoaDSFirmware + + + + + gameTitle + gameCode + makerCode + cardSize + bannerJapanese + bannerEnglish + bannerFrench + bannerGerman + bannerItalian + bannerSpanish + fntOffset + fntTableSize + fatOffset + fatSize + iconOffset + romSize + iconImage + arm9BinaryOffset + arm9BinaryEntryAddress + arm9BinaryStartAddress + arm9BinarySize + arm7BinaryOffset + arm7BinaryEntryAddress + arm7BinaryStartAddress + arm7BinarySize + romInternalName + romSerial + + + + + + enabled + cheatType + description + cheatTypeIcon + isSupportedCheatType + freezeType + codeCount + bytes + memAddress + value + code + memAddressString + memAddressSixDigitString + + CocoaDSCheatItem + YES + + + + + deviceName + elementName + useDeviceCoordinates + pointX + pointY + + YES + + YES + YES + YES + YES + YES + + + + version + kind + name + dateModified + willMigrate + + + YES + YES + YES + YES + YES + + + + enabled + cheatTypeIcon + description + cheatType + + CocoaDSCheatItem + YES + + YES + YES + YES + YES + YES + + + + value + addressString + + + YES + + + + willAdd + description + + YES + + YES + + + YES + + + + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + clearRecentDocuments: + + + + 127 + + + + performZoom: + + + + 240 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + terminate: + + + + 449 + + + + showHelp: + + + + 493 + + + + delegate + + + + 495 + + + + contentView + + + + 718 + + + + closeRom: + + + + 767 + + + + makeKeyAndOrderFront: + + + + 782 + + + + makeKeyAndOrderFront: + + + + 860 + + + + delegate + + + + 1070 + + + + launchWebsite: + + + + 1101 + + + + launchForums: + + + + 1102 + + + + bugReport: + + + + 1103 + + + + openRom: + + + + 1107 + + + + openRom: + + + + 1237 + + + + showGeneralView: + + + + 1683 + + + + showDisplayView: + + + + 1684 + + + + showInputView: + + + + 1685 + + + + window + + + + 1689 + + + + viewDisplay + + + + 1690 + + + + viewGeneral + + + + 1691 + + + + viewInput + + + + 1692 + + + + mLoadStateSlot + + + + 1775 + + + + mSaveStateSlot + + + + 1776 + + + + value: selection.speedScalar + + + + + + value: selection.speedScalar + value + selection.speedScalar + + + + + + 2 + + + 1869 + + + + value: selection.speedScalar + + + + + + value: selection.speedScalar + value + selection.speedScalar + + + + + + + 2 + + + 1872 + + + + delegate + + + + 2025 + + + + inputButtonSet: + + + + 2039 + + + + inputButtonSet: + + + + 2040 + + + + inputButtonSet: + + + + 2041 + + + + inputButtonSet: + + + + 2042 + + + + inputButtonSet: + + + + 2043 + + + + inputButtonSet: + + + + 2044 + + + + inputButtonSet: + + + + 2045 + + + + inputButtonSet: + + + + 2046 + + + + inputButtonSet: + + + + 2047 + + + + inputButtonSet: + + + + 2048 + + + + inputButtonSet: + + + + 2049 + + + + inputButtonSet: + + + + 2050 + + + + inputButtonSet: + + + + 2051 + + + + inputButtonSet: + + + + 2052 + + + + inputPrefsView + + + + 2087 + + + + prefGeneralView + + + + 2093 + + + + prefWindow + + + + 2094 + + + + prefWindow + + + + 2196 + + + + viewSound + + + + 2251 + + + + showSoundView: + + + + 2252 + + + + updateVolumeIcon: + + + + 2268 + + + + selectDisplaySize: + + + + 2306 + + + + selectDisplaySize: + + + + 2307 + + + + selectDisplaySize: + + + + 2308 + + + + selectDisplaySize: + + + + 2309 + + + + selectDisplayRotation: + + + + 2310 + + + + selectDisplayRotation: + + + + 2311 + + + + selectDisplayRotation: + + + + 2312 + + + + selectDisplayRotation: + + + + 2313 + + + + delegate + + + + 2314 + + + + displayRotationField + + + + 2315 + + + + displayRotationMenu + + + + 2316 + + + + displayRotationMenuCustomItem + + + + 2317 + + + + chooseRomForAutoload: + + + + 2322 + + + + selectAutoloadRomOption: + + + + 2323 + + + + selectAutoloadRomOption: + + + + 2324 + + + + viewEmulation + + + + 2380 + + + + showEmulationView: + + + + 2381 + + + + selectSoundInputMode: + + + + 2422 + + + + selectSoundInputMode: + + + + 2423 + + + + selectSoundInputMode: + + + + 2424 + + + + selectSoundInputMode: + + + + 2425 + + + + selectSPUSyncMode: + + + + 2451 + + + + selectSPUSyncMode: + + + + 2452 + + + + selectSPUSyncMethod: + + + + 2453 + + + + selectSPUSyncMethod: + + + + 2454 + + + + selectSPUSyncMethod: + + + + 2455 + + + + spuSyncMethodMenu + + + + 2456 + + + + speedLimitDisable: + + + + 2481 + + + + chooseFirmwareImage: + + + + 2575 + + + + chooseARM7BiosImage: + + + + 2587 + + + + chooseARM9BiosImage: + + + + 2588 + + + + makeKeyAndOrderFront: + + + + 2611 + + + + showSupportFolderInFinder: + + + + 2612 + + + + writeDefaultsDisplayRotation: + + + + 2624 + + + + saveFileMigrationSheet + + + + 2904 + + + + closeMigrationSheet: + + + + 2905 + + + + closeMigrationSheet: + + + + 2906 + + + + migrationWindow + + + + 2911 + + + + handleMigrationWindow: + + + + 2919 + + + + handleMigrationWindow: + + + + 2920 + + + + handleMigrationWindow: + + + + 2921 + + + + value: arrangedObjects.name + + + + + + value: arrangedObjects.name + value + arrangedObjects.name + + + + + + + 2 + + + 2928 + + + + value: arrangedObjects.version + + + + + + value: arrangedObjects.version + value + arrangedObjects.version + + + + + + + 2 + + + 2937 + + + + value: arrangedObjects.kind + + + + + + value: arrangedObjects.kind + value + arrangedObjects.kind + + + + + + + 2 + + + 2943 + + + + value: arrangedObjects.dateModified + + + + + + value: arrangedObjects.dateModified + value + arrangedObjects.dateModified + + + + + + + 2 + + + 2953 + + + + value: arrangedObjects.willMigrate + + + + + + value: arrangedObjects.willMigrate + value + arrangedObjects.willMigrate + + + + + + + + 2 + + + 3044 + + + + showMigrationWindow: + + + + 3066 + + + + fileMigrationList + + + + 3071 + + + + copy: + + + + 3251 + + + + cut: + + + + 3252 + + + + paste: + + + + 3257 + + + + redo: + + + + 3266 + + + + delete: + + + + 3267 + + + + selectAll: + + + + 3270 + + + + undo: + + + + 3272 + + + + enabled: migrationFilesPresent + + + + + + enabled: migrationFilesPresent + enabled + migrationFilesPresent + 2 + + + 3290 + + + + enabled: migrationFilesPresent + + + + + + enabled: migrationFilesPresent + enabled + migrationFilesPresent + 2 + + + 3292 + + + + selectVideoFilterType: + + + + 3346 + + + + selectVideoFilterType: + + + + 3347 + + + + selectVideoFilterType: + + + + 3348 + + + + selectVideoFilterType: + + + + 3349 + + + + selectVideoFilterType: + + + + 3350 + + + + selectVideoFilterType: + + + + 3351 + + + + selectVideoFilterType: + + + + 3352 + + + + selectVideoFilterType: + + + + 3353 + + + + selectVideoFilterType: + + + + 3354 + + + + selectVideoFilterType: + + + + 3355 + + + + selectVideoFilterType: + + + + 3356 + + + + selectVideoFilterType: + + + + 3357 + + + + selectVideoFilterType: + + + + 3358 + + + + selectVideoFilterType: + + + + 3359 + + + + selectVideoFilterType: + + + + 3360 + + + + selectVideoFilterType: + + + + 3361 + + + + selectVideoFilterType: + + + + 3362 + + + + mainWindow + + + + 3436 + + + + runToolbarCustomizationPalette: + + + + 3437 + + + + toggleToolbarShown: + + + + 3438 + + + + window + + + + 3439 + + + + toggleGPUState: + + + + 3441 + + + + toggleGPUState: + + + + 3442 + + + + toggleGPUState: + + + + 3443 + + + + toggleGPUState: + + + + 3446 + + + + toggleGPUState: + + + + 3447 + + + + toggleGPUState: + + + + 3449 + + + + toggleGPUState: + + + + 3450 + + + + toggleGPUState: + + + + 3451 + + + + toggleGPUState: + + + + 3452 + + + + toggleGPUState: + + + + 3453 + + + + toggleGPUState: + + + + 3454 + + + + toggleGPUState: + + + + 3455 + + + + closeMigrationSheet: + + + + 3466 + + + + closeMigrationSheet: + + + + 3467 + + + + saveStatePrecloseSheet + + + + 3470 + + + + closeMigrationSheet: + + + + 3473 + + + + resetCore: + + + + 3483 + + + + resetCore: + + + + 3484 + + + + executeCoreToggle: + + + + 3485 + + + + executeCoreToggle: + + + + 3486 + + + + prefWindowController + + + + 3532 + + + + value: selection.Input_Up + + + + + + value: selection.Input_Up + value + selection.Input_Up + 2 + + + 3536 + + + + value: selection.Input_Down + + + + + + value: selection.Input_Down + value + selection.Input_Down + 2 + + + 3537 + + + + value: selection.Input_Left + + + + + + value: selection.Input_Left + value + selection.Input_Left + 2 + + + 3538 + + + + value: selection.Input_Right + + + + + + value: selection.Input_Right + value + selection.Input_Right + 2 + + + 3539 + + + + value: selection.Input_A + + + + + + value: selection.Input_A + value + selection.Input_A + 2 + + + 3540 + + + + value: selection.Input_B + + + + + + value: selection.Input_B + value + selection.Input_B + 2 + + + 3541 + + + + value: selection.Input_X + + + + + + value: selection.Input_X + value + selection.Input_X + 2 + + + 3542 + + + + value: selection.Input_Y + + + + + + value: selection.Input_Y + value + selection.Input_Y + 2 + + + 3543 + + + + value: selection.Input_L + + + + + + value: selection.Input_L + value + selection.Input_L + 2 + + + 3545 + + + + value: selection.Input_R + + + + + + value: selection.Input_R + value + selection.Input_R + 2 + + + 3546 + + + + value: selection.Input_Start + + + + + + value: selection.Input_Start + value + selection.Input_Start + 2 + + + 3547 + + + + value: selection.Input_Select + + + + + + value: selection.Input_Select + value + selection.Input_Select + 2 + + + 3548 + + + + value: selection.Input_Lid + + + + + + value: selection.Input_Lid + value + selection.Input_Lid + 2 + + + 3549 + + + + value: selection.Input_Microphone + + + + + + value: selection.Input_Microphone + value + selection.Input_Microphone + 2 + + + 3550 + + + + value: selection.AutoloadRomName + + + + + + value: selection.AutoloadRomName + value + selection.AutoloadRomName + 2 + + + 3558 + + + + value: selection.FirmwareImageName + + + + + + value: selection.FirmwareImageName + value + selection.FirmwareImageName + 2 + + + 3561 + + + + value: selection.VideoFilterPreviewImage + + + + + + value: selection.VideoFilterPreviewImage + value + selection.VideoFilterPreviewImage + 2 + + + 3562 + + + + romInfoPanelController + + + + 3577 + + + + cdsDisplayController + + + + 3580 + + + + emuWindowController + + + + 3599 + + + + selectVideoFilterType: + + + + 3647 + + + + changeVideoFilter: + + + + 3669 + + + + changeVideoFilter: + + + + 3670 + + + + changeVideoFilter: + + + + 3671 + + + + changeVideoFilter: + + + + 3672 + + + + changeVideoFilter: + + + + 3673 + + + + changeVideoFilter: + + + + 3674 + + + + changeVideoFilter: + + + + 3675 + + + + changeVideoFilter: + + + + 3676 + + + + changeVideoFilter: + + + + 3677 + + + + changeVideoFilter: + + + + 3678 + + + + changeVideoFilter: + + + + 3679 + + + + changeVideoFilter: + + + + 3680 + + + + changeVideoFilter: + + + + 3681 + + + + changeVideoFilter: + + + + 3682 + + + + changeVideoFilter: + + + + 3683 + + + + changeVideoFilter: + + + + 3684 + + + + changeVideoFilter: + + + + 3685 + + + + changeVideoFilter: + + + + 3686 + + + + changeBilinearOutput: + + + + 3697 + + + + firmwarePanelController + + + + 3699 + + + + makeKeyAndOrderFront: + + + + 3792 + + + + writeDefaultsVideoOutputSettings: + + + + 3796 + + + + writeDefaults3DRenderingSettings: + + + + 3797 + + + + value: values.Render3D_HighPrecisionColorInterpolation + + + + + + value: values.Render3D_HighPrecisionColorInterpolation + value + values.Render3D_HighPrecisionColorInterpolation + 2 + + + 3830 + + + + value: values.Render3D_Fog + + + + + + value: values.Render3D_Fog + value + values.Render3D_Fog + 2 + + + 3832 + + + + value: values.Render3D_Textures + + + + + + value: values.Render3D_Textures + value + values.Render3D_Textures + 2 + + + 3833 + + + + value: values.Render3D_DepthComparisonThreshold + + + + + + value: values.Render3D_DepthComparisonThreshold + value + values.Render3D_DepthComparisonThreshold + 2 + + + 3834 + + + + value: values.Render3D_EdgeMarking + + + + + + value: values.Render3D_EdgeMarking + value + values.Render3D_EdgeMarking + 2 + + + 3836 + + + + change3DRenderEdgeMarking: + + + + 3871 + + + + change3DRenderFog: + + + + 3872 + + + + change3DRenderHighPrecisionColorInterpolation: + + + + 3873 + + + + change3DRenderMethod: + + + + 3874 + + + + change3DRenderMethod: + + + + 3875 + + + + change3DRenderTextures: + + + + 3876 + + + + delegate + + + + 3877 + + + + selectedTag: values.Render3D_Threads + + + + + + selectedTag: values.Render3D_Threads + selectedTag + values.Render3D_Threads + 2 + + + 3895 + + + + value: values.Render3D_LineHack + + + + + + value: values.Render3D_LineHack + value + values.Render3D_LineHack + 2 + + + 3902 + + + + change3DRenderLineHack: + + + + 3904 + + + + change3DRenderThreads: + + + + 3905 + + + + change3DRenderThreads: + + + + 3906 + + + + change3DRenderThreads: + + + + 3907 + + + + change3DRenderThreads: + + + + 3908 + + + + changeRotationRelative: + + + + 3910 + + + + changeRotationRelative: + + + + 3911 + + + + changeRotation: + + + + 3912 + + + + changeRotation: + + + + 3913 + + + + changeRotation: + + + + 3914 + + + + changeRotation: + + + + 3915 + + + + changeRotation: + + + + 3917 + + + + changeRotation: + + + + 3918 + + + + changeScale: + + + + 3919 + + + + changeScale: + + + + 3920 + + + + changeScale: + + + + 3921 + + + + changeScale: + + + + 3922 + + + + changeScale: + + + + 3923 + + + + changeCoreSpeed: + + + + 3924 + + + + changeCoreSpeed: + + + + 3925 + + + + changeCoreSpeed: + + + + 3926 + + + + changeCoreSpeed: + + + + 3928 + + + + changeCoreSpeed: + + + + 3929 + + + + changeDisplayMode: + + + + 3940 + + + + changeDisplayMode: + + + + 3941 + + + + changeDisplayMode: + + + + 3942 + + + + boxARMBinaries + + + + 3954 + + + + boxFileSystem + + + + 3955 + + + + boxGeneralInfo + + + + 3956 + + + + boxMisc + + + + 3957 + + + + boxTitles + + + + 3958 + + + + makeKeyAndOrderFront: + + + + 3964 + + + + cdsSoundController + + + + 3971 + + + + writeDefaultsSoundSettings: + + + + 3972 + + + + changeSpuAdvancedLogic: + + + + 3973 + + + + changeSpuInterpolationMode: + + + + 3974 + + + + changeSpuInterpolationMode: + + + + 3975 + + + + changeSpuInterpolationMode: + + + + 3976 + + + + changeSpuSyncMethod: + + + + 3977 + + + + changeSpuSyncMethod: + + + + 3978 + + + + changeSpuSyncMethod: + + + + 3979 + + + + changeSpuSyncMode: + + + + 3980 + + + + changeSpuSyncMode: + + + + 3981 + + + + changeVolume: + + + + 3985 + + + + changeVolume: + + + + 3987 + + + + value: selection.Arm9BiosImageName + + + + + + value: selection.Arm9BiosImageName + value + selection.Arm9BiosImageName + 2 + + + 4025 + + + + value: selection.Arm7BiosImageName + + + + + + value: selection.Arm7BiosImageName + value + selection.Arm7BiosImageName + 2 + + + 4026 + + + + contentView + + + + 4057 + + + + parentWindow + + + + 4058 + + + + makeKeyAndOrderFront: + + + + 4063 + + + + toggle: + + + + 4068 + + + + previewImageView + + + + 4127 + + + + setUseBilinear: + + + + 4128 + + + + value: values.SPU_AdvancedLogic + + + + + + value: values.SPU_AdvancedLogic + value + values.SPU_AdvancedLogic + 2 + + + 4137 + + + + selectedTag: values.SPU_InterpolationMode + + + + + + selectedTag: values.SPU_InterpolationMode + selectedTag + values.SPU_InterpolationMode + 2 + + + 4138 + + + + selectedTag: values.SPU_SyncMode + + + + + + selectedTag: values.SPU_SyncMode + selectedTag + values.SPU_SyncMode + 2 + + + 4139 + + + + selectedTag: values.SPU_SyncMethod + + + + + + selectedTag: values.SPU_SyncMethod + selectedTag + values.SPU_SyncMethod + 2 + + + 4140 + + + + value: selection.emuFlagAdvancedBusLevelTiming + + + + + + value: selection.emuFlagAdvancedBusLevelTiming + value + selection.emuFlagAdvancedBusLevelTiming + 2 + + + 4141 + + + + value: selection.emuFlagUseExternalBios + + + + + + value: selection.emuFlagUseExternalBios + value + selection.emuFlagUseExternalBios + 2 + + + 4142 + + + + value: selection.emuFlagEmulateBiosInterrupts + + + + + + value: selection.emuFlagEmulateBiosInterrupts + value + selection.emuFlagEmulateBiosInterrupts + 2 + + + 4143 + + + + value: selection.emuFlagPatchDelayLoop + + + + + + value: selection.emuFlagPatchDelayLoop + value + selection.emuFlagPatchDelayLoop + 2 + + + 4145 + + + + value: selection.emuFlagUseExternalFirmware + + + + + + value: selection.emuFlagUseExternalFirmware + value + selection.emuFlagUseExternalFirmware + 2 + + + 4146 + + + + value: selection.emuFlagFirmwareBoot + + + + + + value: selection.emuFlagFirmwareBoot + value + selection.emuFlagFirmwareBoot + 2 + + + 4147 + + + + value: selection.emuFlagDebugConsole + + + + + + value: selection.emuFlagDebugConsole + value + selection.emuFlagDebugConsole + 2 + + + 4148 + + + + value: selection.emuFlagEmulateEnsata + + + + + + value: selection.emuFlagEmulateEnsata + value + selection.emuFlagEmulateEnsata + 2 + + + 4149 + + + + enabled: selection.emuFlagUseExternalBios + + + + + + enabled: selection.emuFlagUseExternalBios + enabled + selection.emuFlagUseExternalBios + 2 + + + 4150 + + + + enabled: selection.emuFlagUseExternalBios + + + + + + enabled: selection.emuFlagUseExternalBios + enabled + selection.emuFlagUseExternalBios + 2 + + + 4151 + + + + changeCoreEmuFlags: + + + + 4154 + + + + changeCoreEmuFlags: + + + + 4155 + + + + changeCoreEmuFlags: + + + + 4156 + + + + changeCoreEmuFlags: + + + + 4157 + + + + changeCoreEmuFlags: + + + + 4158 + + + + changeCoreEmuFlags: + + + + 4159 + + + + changeCoreEmuFlags: + + + + 4160 + + + + changeCoreEmuFlags: + + + + 4161 + + + + writeDefaultsEmulationSettings: + + + + 4162 + + + + cdsCoreController + + + + 4163 + + + + makeKeyAndOrderFront: + + + + 4279 + + + + makeKeyAndOrderFront: + + + + 4280 + + + + changeFirmwareSettings: + + + + 4462 + + + + writeDefaultsHUDSettings: + + + + 4463 + + + + firmwareConfigSheet + + + + 4466 + + + + configureInternalFirmware: + + + + 4467 + + + + closeFirmwareConfigSheet: + + + + 4468 + + + + toggleAutoFrameSkip: + + + + 4475 + + + + makeKeyAndOrderFront: + + + + 4638 + + + + value: selection.isCheatingEnabled + + + + + + value: selection.isCheatingEnabled + value + selection.isCheatingEnabled + 2 + + + 4648 + + + + cheatsDisable: + + + + 4696 + + + + window + + + + 4699 + + + + delegate + + + + 4700 + + + + viewConfigureActionReplayCheat + + + + 4702 + + + + viewConfigureInternalCheat + + + + 4703 + + + + cheatConfigBox + + + + 4709 + + + + delegate + + + + 4716 + + + + cheatSelectedItemController + + + + 4717 + + + + selectCheatType: + + + + 4718 + + + + selectCheatType: + + + + 4719 + + + + addToList: + + + + 4721 + + + + applyConfiguration: + + + + 4722 + + + + cheatListTable + + + + 4728 + + + + removeFromList: + + + + 4730 + + + + cheatWindowController + + + + 4735 + + + + viewConfigureNoSelection + + + + 4747 + + + + viewConfigureCodeBreakerCheat + + + + 4748 + + + + cheatListController + + + + 4753 + + + + cheatWindowController + + + + 4754 + + + + cheatListController + + + + 4755 + + + + cheatWindowDelegate + + + + 4756 + + + + parentWindow + + + + 4791 + + + + toggle: + + + + 4819 + + + + cheatSearchListController + + + + 4922 + + + + runExactValueSearch: + + + + 4928 + + + + runComparativeSearch: + + + + 4929 + + + + runComparativeSearch: + + + + 4930 + + + + runComparativeSearch: + + + + 4931 + + + + runComparativeSearch: + + + + 4932 + + + + selectCheatSearchStyle: + + + + 4933 + + + + selectCheatSearchStyle: + + + + 4934 + + + + viewSearchComparativeContinue + + + + 4936 + + + + viewSearchComparativeStart + + + + 4937 + + + + viewSearchExactValue + + + + 4938 + + + + viewSearchNoSelection + + + + 4939 + + + + cheatSearchView + + + + 4940 + + + + resetSearch: + + + + 4941 + + + + runComparativeSearch: + + + + 4943 + + + + searchField + + + + 4944 + + + + cheatSearchListTable + + + + 4945 + + + + delegate + + + + 4946 + + + + cdsCoreController + + + + 4955 + + + + setInternalCheatValue: + + + + 5070 + + + + value: selection.R4CheatDatabaseName + + + + + + value: selection.R4CheatDatabaseName + value + selection.R4CheatDatabaseName + 2 + + + 5073 + + + + chooseCheatDatabase: + + + + 5078 + + + + viewDatabase: + + + + 5079 + + + + cheatDatabaseSheet + + + + 5108 + + + + closeCheatDatabaseSheet: + + + + 5109 + + + + closeCheatDatabaseSheet: + + + + 5110 + + + + cheatDatabaseController + + + + 5118 + + + + cheatDatabaseController + + + + 5119 + + + + selectAllCheatsInDatabase: + + + + 5122 + + + + selectNoneCheatsInDatabase: + + + + 5123 + + + + cheatWindowController + + + + 5143 + + + + emuWindowController + + + + 5144 + + + + cheatDatabaseController + + + + 5145 + + + + cheatListWindow + + + + 5146 + + + + cheatWindowController + + + + 5147 + + + + emuWindowController + + + + 5148 + + + + prefWindowController + + + + 5149 + + + + cdsCoreController + + + + 5150 + + + + value: selection.AdvansceneDatabaseName + + + + + + value: selection.AdvansceneDatabaseName + value + selection.AdvansceneDatabaseName + 2 + + + 5182 + + + + chooseAdvansceneDatabase: + + + + 5183 + + + + value: selection.Input_Debug + + + + + + value: selection.Input_Debug + value + selection.Input_Debug + 2 + + + 5317 + + + + inputButtonSet: + + + + 5318 + + + + changeRotationRelative: + + + + 5425 + + + + changeRotationRelative: + + + + 5426 + + + + delegate + + + + 5474 + + + + value: selection.nickname + + + + + + value: selection.nickname + value + selection.nickname + 2 + + + 5478 + + + + value: selection.message + + + + + + value: selection.message + value + selection.message + 2 + + + 5479 + + + + selectedTag: selection.favoriteColor + + + + + + selectedTag: selection.favoriteColor + selectedTag + selection.favoriteColor + 2 + + + 5480 + + + + value: selection.birthday + + + + + + value: selection.birthday + value + selection.birthday + 2 + + + 5481 + + + + selectedTag: selection.language + + + + + + selectedTag: selection.language + selectedTag + selection.language + 2 + + + 5482 + + + + value: selection.value + + + + + + value: selection.value + value + selection.value + 2 + + + 5484 + + + + selectedTag: selection.bytes + + + + + + selectedTag: selection.bytes + selectedTag + selection.bytes + 2 + + + 5485 + + + + value: selection.code + + + + + + value: selection.code + value + selection.code + 2 + + + 5486 + + + + selectedTag: selection.cheatType + + + + + + selectedTag: selection.cheatType + selectedTag + selection.cheatType + 2 + + + 5487 + + + + value: selection.description + + + + + + value: selection.description + value + selection.description + 2 + + + 5488 + + + + value: selection.enabled + + + + + + value: selection.enabled + value + selection.enabled + 2 + + + 5489 + + + + enabled: selection.value + + + + + + enabled: selection.value + enabled + selection.value + + NSValueTransformerName + NSIsNotNil + + 2 + + + 5490 + + + + value: arrangedObjects.enabled + + + + + + value: arrangedObjects.enabled + value + arrangedObjects.enabled + 2 + + + 5493 + + + + value: arrangedObjects.cheatTypeIcon + + + + + + value: arrangedObjects.cheatTypeIcon + value + arrangedObjects.cheatTypeIcon + 2 + + + 5494 + + + + value: arrangedObjects.description + + + + + + value: arrangedObjects.description + value + arrangedObjects.description + 2 + + + 5495 + + + + value: arrangedObjects.willAdd + + + + + + value: arrangedObjects.willAdd + value + arrangedObjects.willAdd + 2 + + + 5497 + + + + value: arrangedObjects.description + + + + + + value: arrangedObjects.description + value + arrangedObjects.description + + NSConditionallySetsEditable + + + 2 + + + 5498 + + + + value: selection.memAddressSixDigitString + + + + + + value: selection.memAddressSixDigitString + value + selection.memAddressSixDigitString + 2 + + + 5499 + + + + exportRomSave: + + + + 5500 + + + + importRomSave: + + + + 5501 + + + + openEmuSaveState: + + + + 5502 + + + + saveEmuSaveState: + + + + 5503 + + + + saveEmuSaveStateAs: + + + + 5504 + + + + revertEmuSaveState: + + + + 5505 + + + + changeRomSaveType: + + + + 5506 + + + + changeRomSaveType: + + + + 5507 + + + + changeRomSaveType: + + + + 5508 + + + + changeRomSaveType: + + + + 5509 + + + + changeRomSaveType: + + + + 5510 + + + + changeRomSaveType: + + + + 5511 + + + + changeRomSaveType: + + + + 5512 + + + + changeRomSaveType: + + + + 5513 + + + + changeRomSaveType: + + + + 5514 + + + + changeRomSaveType: + + + + 5515 + + + + changeRomSaveType: + + + + 5516 + + + + changeRomSaveType: + + + + 5517 + + + + changeRomSaveType: + + + + 5518 + + + + changeRomSaveType: + + + + 5519 + + + + changeAudioEngine: + + + + 5520 + + + + changeAudioEngine: + + + + 5521 + + + + value: selection.volume + + + + + + value: selection.volume + value + selection.volume + 2 + + + 5522 + + + + value: selection.volume + + + + + + value: selection.volume + value + selection.volume + 2 + + + 5524 + + + + value: selection.volumeIconImage + + + + + + value: selection.volumeIconImage + value + selection.volumeIconImage + 2 + + + 5525 + + + + value: selection.volumeIconImage + + + + + + value: selection.volumeIconImage + value + selection.volumeIconImage + 2 + + + 5526 + + + + value: selection.volumeIconImage + + + + + + value: selection.volumeIconImage + value + selection.volumeIconImage + 2 + + + 5527 + + + + value: selection.status + + + + + + value: selection.status + value + selection.status + + + + + + 2 + + + 5528 + + + + animate: selection.isWorking + + + + + + animate: selection.isWorking + animate + selection.isWorking + + NSRaisesForNotApplicableKeys + + + 2 + + + 5529 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5530 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5531 + + + + enabled2: selection.isSupportedCheatType + + + + + + enabled2: selection.isSupportedCheatType + enabled2 + selection.isSupportedCheatType + + + + + + + + 2 + + + 5532 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5533 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5534 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5535 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5538 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5539 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5541 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5543 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5545 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5546 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5549 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5550 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5552 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5555 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5558 + + + + enabled: selection.isRomLoaded + + + + + + enabled: selection.isRomLoaded + enabled + selection.isRomLoaded + 2 + + + 5561 + + + + displayView + + + + 5565 + + + + value: arrangedObjects.addressString + + + + + + value: arrangedObjects.addressString + value + arrangedObjects.addressString + 2 + + + 5566 + + + + value: arrangedObjects.value + + + + + + value: arrangedObjects.value + value + arrangedObjects.value + 2 + + + 5567 + + + + value: selection.rotation + + + + + + value: selection.rotation + value + selection.rotation + + + + + + + 2 + + + 5568 + + + + value: selection.rotation + + + + + + value: selection.rotation + value + selection.rotation + + + + + + 2 + + + 5569 + + + + value: selection.useBilinearOutput + + + + + + value: selection.useBilinearOutput + value + selection.useBilinearOutput + 2 + + + 5570 + + + + selectedTag: selection.videoFilterType + + + + + + selectedTag: selection.videoFilterType + selectedTag + selection.videoFilterType + 2 + + + 5579 + + + + value: selection.iconImage + + + + + + value: selection.iconImage + value + selection.iconImage + + + + + + 2 + + + 5580 + + + + value: selection.makerCode + + + + + + value: selection.makerCode + value + selection.makerCode + + + + + 2 + + + 5583 + + + + value: selection.romSize + + + + + + value: selection.romSize + value + selection.romSize + + + + + 2 + + + 5584 + + + + value: selection.bannerJapanese + + + + + + value: selection.bannerJapanese + value + selection.bannerJapanese + + + + + 2 + + + 5585 + + + + value: selection.bannerEnglish + + + + + + value: selection.bannerEnglish + value + selection.bannerEnglish + + + + + 2 + + + 5586 + + + + value: selection.bannerFrench + + + + + + value: selection.bannerFrench + value + selection.bannerFrench + + + + + 2 + + + 5587 + + + + value: selection.bannerGerman + + + + + + value: selection.bannerGerman + value + selection.bannerGerman + + + + + 2 + + + 5588 + + + + value: selection.bannerItalian + + + + + + value: selection.bannerItalian + value + selection.bannerItalian + + + + + 2 + + + 5589 + + + + value: selection.bannerSpanish + + + + + + value: selection.bannerSpanish + value + selection.bannerSpanish + + + + + 2 + + + 5590 + + + + value: selection.arm9BinaryOffset + + + + + + value: selection.arm9BinaryOffset + value + selection.arm9BinaryOffset + + + + + 2 + + + 5591 + + + + value: selection.arm9BinaryEntryAddress + + + + + + value: selection.arm9BinaryEntryAddress + value + selection.arm9BinaryEntryAddress + + + + + 2 + + + 5592 + + + + value: selection.arm9BinaryStartAddress + + + + + + value: selection.arm9BinaryStartAddress + value + selection.arm9BinaryStartAddress + + + + + 2 + + + 5593 + + + + value: selection.arm9BinarySize + + + + + + value: selection.arm9BinarySize + value + selection.arm9BinarySize + + + + + 2 + + + 5594 + + + + value: selection.arm7BinaryOffset + + + + + + value: selection.arm7BinaryOffset + value + selection.arm7BinaryOffset + + + + + 2 + + + 5595 + + + + value: selection.arm7BinaryEntryAddress + + + + + + value: selection.arm7BinaryEntryAddress + value + selection.arm7BinaryEntryAddress + + + + + 2 + + + 5596 + + + + value: selection.arm7BinaryStartAddress + + + + + + value: selection.arm7BinaryStartAddress + value + selection.arm7BinaryStartAddress + + + + + 2 + + + 5597 + + + + value: selection.arm7BinarySize + + + + + + value: selection.arm7BinarySize + value + selection.arm7BinarySize + + + + + 2 + + + 5598 + + + + value: selection.fntOffset + + + + + + value: selection.fntOffset + value + selection.fntOffset + + + + + 2 + + + 5599 + + + + value: selection.fntTableSize + + + + + + value: selection.fntTableSize + value + selection.fntTableSize + + + + + 2 + + + 5600 + + + + value: selection.fatOffset + + + + + + value: selection.fatOffset + value + selection.fatOffset + + + + + 2 + + + 5601 + + + + value: selection.fatSize + + + + + + value: selection.fatSize + value + selection.fatSize + + + + + 2 + + + 5602 + + + + value: selection.iconOffset + + + + + + value: selection.iconOffset + value + selection.iconOffset + + + + + 2 + + + 5603 + + + + value: selection.romSize + + + + + + value: selection.romSize + value + selection.romSize + + + + + 2 + + + 5604 + + + + value: selection.iconImage + + + + + + value: selection.iconImage + value + selection.iconImage + 2 + + + 5605 + + + + value: selection.romInternalName + + + + + + value: selection.romInternalName + value + selection.romInternalName + 2 + + + 5606 + + + + value: selection.romSerial + + + + + + value: selection.romSerial + value + selection.romSerial + 2 + + + 5607 + + + + selectedTag: selection.audioOutputEngine + + + + + + selectedTag: selection.audioOutputEngine + selectedTag + selection.audioOutputEngine + 2 + + + 5608 + + + + value: selection.spuAdvancedLogic + + + + + + value: selection.spuAdvancedLogic + value + selection.spuAdvancedLogic + 2 + + + 5609 + + + + selectedTag: selection.spuInterpolationMode + + + + + + selectedTag: selection.spuInterpolationMode + selectedTag + selection.spuInterpolationMode + 2 + + + 5610 + + + + selectedTag: selection.spuSyncMode + + + + + + selectedTag: selection.spuSyncMode + selectedTag + selection.spuSyncMode + 2 + + + 5611 + + + + selectedTag: selection.spuSyncMethod + + + + + + selectedTag: selection.spuSyncMethod + selectedTag + selection.spuSyncMethod + 2 + + + 5612 + + + + enabled2: selection.hasSelection + + + + + + enabled2: selection.hasSelection + enabled2 + selection.hasSelection + + + + + + + + 2 + + + 5613 + + + + enabled2: selection.hasSelection + + + + + + enabled2: selection.hasSelection + enabled2 + selection.hasSelection + + + + + + + + 2 + + + 5616 + + + + enabled3: selection.isSupportedCheatType + + + + + + enabled3: selection.isSupportedCheatType + enabled3 + selection.isSupportedCheatType + + + + + + + + 2 + + + 5617 + + + + value: selection.cheatDBTitle + + + + + + value: selection.cheatDBTitle + value + selection.cheatDBTitle + 2 + + + 5618 + + + + value: selection.cheatDBDate + + + + + + value: selection.cheatDBDate + value + selection.cheatDBDate + 2 + + + 5619 + + + + value: selection.cheatDBItemCount + + + + + + value: selection.cheatDBItemCount + value + selection.cheatDBItemCount + 2 + + + 5620 + + + + selectedTag: selection.cheatSearchStyle + + + + + + selectedTag: selection.cheatSearchStyle + selectedTag + selection.cheatSearchStyle + 2 + + + 5621 + + + + value: selection.cheatSearchAddressCount + + + + + + value: selection.cheatSearchAddressCount + value + selection.cheatSearchAddressCount + 2 + + + 5622 + + + + value: selection.cheatSearchSearchValue + + + + + + value: selection.cheatSearchSearchValue + value + selection.cheatSearchSearchValue + 2 + + + 5623 + + + + enabled2: selection.cheatSearchSearchValue + + + + + + enabled2: selection.cheatSearchSearchValue + enabled2 + selection.cheatSearchSearchValue + + + + + + NSIsNotNil + + + 2 + + + 5624 + + + + animate: selection.isRunningSearch + + + + + + animate: selection.isRunningSearch + animate + selection.isRunningSearch + 2 + + + 5626 + + + + enabled: selection.isRunningSearch + + + + + + enabled: selection.isRunningSearch + enabled + selection.isRunningSearch + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 5627 + + + + enabled3: selection.isRunningSearch + + + + + + enabled3: selection.isRunningSearch + enabled3 + selection.isRunningSearch + + + + + + NSNegateBoolean + + + 2 + + + 5630 + + + + enabled2: selection.isRunningSearch + + + + + + enabled2: selection.isRunningSearch + enabled2 + selection.isRunningSearch + + + + + + NSNegateBoolean + + + 2 + + + 5631 + + + + enabled2: selection.isSearchStarted + + + + + + enabled2: selection.isSearchStarted + enabled2 + selection.isSearchStarted + + + + + + + + 2 + + + 5636 + + + + enabled3: selection.isRunningSearch + + + + + + enabled3: selection.isRunningSearch + enabled3 + selection.isRunningSearch + + + + + + NSNegateBoolean + + + 2 + + + 5637 + + + + enabled2: selection.isSearchStarted + + + + + + enabled2: selection.isSearchStarted + enabled2 + selection.isSearchStarted + + + + + + + + 2 + + + 5638 + + + + enabled3: selection.isRunningSearch + + + + + + enabled3: selection.isRunningSearch + enabled3 + selection.isRunningSearch + + + + + + NSNegateBoolean + + + 2 + + + 5639 + + + + enabled2: selection.isSearchStarted + + + + + + enabled2: selection.isSearchStarted + enabled2 + selection.isSearchStarted + + + + + + + + 2 + + + 5640 + + + + enabled3: selection.isRunningSearch + + + + + + enabled3: selection.isRunningSearch + enabled3 + selection.isRunningSearch + + + + + + NSNegateBoolean + + + 2 + + + 5641 + + + + enabled2: selection.isSearchStarted + + + + + + enabled2: selection.isSearchStarted + enabled2 + selection.isSearchStarted + + + + + + + + 2 + + + 5642 + + + + enabled3: selection.isRunningSearch + + + + + + enabled3: selection.isRunningSearch + enabled3 + selection.isRunningSearch + + + + + + NSNegateBoolean + + + 2 + + + 5643 + + + + enabled2: selection.isSearchStarted + + + + + + enabled2: selection.isSearchStarted + enabled2 + selection.isSearchStarted + + + + + + + + 2 + + + 5644 + + + + enabled3: selection.isRomLoaded + + + + + + enabled3: selection.isRomLoaded + enabled3 + selection.isRomLoaded + + + + + + + + 2 + + + 5645 + + + + value: values.Advanscene_AutoDetectRomSaveType + + + + + + value: values.Advanscene_AutoDetectRomSaveType + value + values.Advanscene_AutoDetectRomSaveType + 2 + + + 5647 + + + + toggleStatusBar: + + + + 5650 + + + + toggleKeepMinDisplaySizeAtNormal: + + + + 5704 + + + + saveScreenshotAs: + + + + 5705 + + + + saveScreenshotPanelAccessoryView + + + + 5706 + + + + valuePath: selection.readMePath + + + + + + valuePath: selection.readMePath + valuePath + selection.readMePath + 2 + + + 5714 + + + + valuePath: selection.licensePath + + + + + + valuePath: selection.licensePath + valuePath + selection.licensePath + 2 + + + 5715 + + + + valuePath: selection.authorsPath + + + + + + valuePath: selection.authorsPath + valuePath + selection.authorsPath + 2 + + + 5716 + + + + valuePath: selection.changeLogPath + + + + + + valuePath: selection.changeLogPath + valuePath + selection.changeLogPath + 2 + + + 5717 + + + + value: selection.versionString + + + + + + value: selection.versionString + value + selection.versionString + 2 + + + 5718 + + + + value: selection.dateString + + + + + + value: selection.dateString + value + selection.dateString + 2 + + + 5719 + + + + makeKeyAndOrderFront: + + + + 5720 + + + + aboutWindowController + + + + 5721 + + + + value: selection.romSerial + + + + + + value: selection.romSerial + value + selection.romSerial + + + + + 2 + + + 5722 + + + + value: selection.romInternalName + + + + + + value: selection.romInternalName + value + selection.romInternalName + + + + + 2 + + + 5723 + + + + value: values.FirmwareConfig_Nickname + + + + + + value: values.FirmwareConfig_Nickname + value + values.FirmwareConfig_Nickname + 2 + + + 5729 + + + + value: values.FirmwareConfig_Message + + + + + + value: values.FirmwareConfig_Message + value + values.FirmwareConfig_Message + 2 + + + 5730 + + + + selectedTag: values.FirmwareConfig_FavoriteColor + + + + + + selectedTag: values.FirmwareConfig_FavoriteColor + selectedTag + values.FirmwareConfig_FavoriteColor + 2 + + + 5731 + + + + value: values.FirmwareConfig_Birthday + + + + + + value: values.FirmwareConfig_Birthday + value + values.FirmwareConfig_Birthday + 2 + + + 5732 + + + + selectedTag: values.FirmwareConfig_Language + + + + + + selectedTag: values.FirmwareConfig_Language + selectedTag + values.FirmwareConfig_Language + 2 + + + 5733 + + + + selectDisplayMode: + + + + 5735 + + + + selectDisplayMode: + + + + 5736 + + + + selectDisplayMode: + + + + 5737 + + + + value: selection.Input_Start + + + + + + value: selection.Input_Start + value + selection.Input_Start + 2 + + + 5878 + + + + value: selection.Input_B + + + + + + value: selection.Input_B + value + selection.Input_B + 2 + + + 5880 + + + + value: selection.Input_Debug + + + + + + value: selection.Input_Debug + value + selection.Input_Debug + 2 + + + 5881 + + + + value: selection.Input_Pause + + + + + + value: selection.Input_Pause + value + selection.Input_Pause + 2 + + + 5882 + + + + value: selection.Input_Up + + + + + + value: selection.Input_Up + value + selection.Input_Up + 2 + + + 5883 + + + + value: selection.Input_HUD + + + + + + value: selection.Input_HUD + value + selection.Input_HUD + 2 + + + 5884 + + + + value: selection.Input_A + + + + + + value: selection.Input_A + value + selection.Input_A + 2 + + + 5885 + + + + value: selection.Input_SpeedDouble + + + + + + value: selection.Input_SpeedDouble + value + selection.Input_SpeedDouble + 2 + + + 5886 + + + + value: selection.Input_Select + + + + + + value: selection.Input_Select + value + selection.Input_Select + 2 + + + 5887 + + + + enabled: arrangedObjects.pointY + + + + + + enabled: arrangedObjects.pointY + enabled + arrangedObjects.pointY + 2 + + + 5888 + + + + value: selection.Input_Microphone + + + + + + value: selection.Input_Microphone + value + selection.Input_Microphone + 2 + + + 5889 + + + + value: selection.Input_Y + + + + + + value: selection.Input_Y + value + selection.Input_Y + 2 + + + 5890 + + + + enabled: arrangedObjects.elementName + + + + + + enabled: arrangedObjects.elementName + enabled + arrangedObjects.elementName + 2 + + + 5891 + + + + value: selection.Input_Execute + + + + + + value: selection.Input_Execute + value + selection.Input_Execute + 2 + + + 5892 + + + + value: selection.Input_Lid + + + + + + value: selection.Input_Lid + value + selection.Input_Lid + 2 + + + 5893 + + + + enabled: arrangedObjects.deviceName + + + + + + enabled: arrangedObjects.deviceName + enabled + arrangedObjects.deviceName + 2 + + + 5894 + + + + value: selection.Input_X + + + + + + value: selection.Input_X + value + selection.Input_X + 2 + + + 5895 + + + + value: selection.Input_Reset + + + + + + value: selection.Input_Reset + value + selection.Input_Reset + 2 + + + 5896 + + + + value: selection.Input_R + + + + + + value: selection.Input_R + value + selection.Input_R + 2 + + + 5897 + + + + enabled: arrangedObjects.useDeviceCoordinates + + + + + + enabled: arrangedObjects.useDeviceCoordinates + enabled + arrangedObjects.useDeviceCoordinates + 2 + + + 5898 + + + + value: selection.Input_SpeedHalf + + + + + + value: selection.Input_SpeedHalf + value + selection.Input_SpeedHalf + 2 + + + 5899 + + + + value: selection.Input_L + + + + + + value: selection.Input_L + value + selection.Input_L + 2 + + + 5900 + + + + value: selection.Input_Left + + + + + + value: selection.Input_Left + value + selection.Input_Left + 2 + + + 5901 + + + + enabled: arrangedObjects.pointX + + + + + + enabled: arrangedObjects.pointX + enabled + arrangedObjects.pointX + 2 + + + 5902 + + + + value: selection.Input_Down + + + + + + value: selection.Input_Down + value + selection.Input_Down + 2 + + + 5903 + + + + value: selection.Input_Right + + + + + + value: selection.Input_Right + value + selection.Input_Right + 2 + + + 5904 + + + + selectSoundInputMode: + + + + 5905 + + + + inputButtonSet: + + + + 5906 + + + + inputButtonSet: + + + + 5907 + + + + inputButtonSet: + + + + 5908 + + + + inputButtonSet: + + + + 5909 + + + + inputButtonSet: + + + + 5910 + + + + inputButtonSet: + + + + 5911 + + + + inputButtonSet: + + + + 5912 + + + + inputButtonSet: + + + + 5913 + + + + inputButtonSet: + + + + 5914 + + + + inputButtonSet: + + + + 5915 + + + + add: + + + + 5916 + + + + inputButtonSet: + + + + 5917 + + + + selectSoundInputMode: + + + + 5918 + + + + selectSoundInputMode: + + + + 5919 + + + + inputButtonSet: + + + + 5920 + + + + inputButtonSet: + + + + 5921 + + + + inputButtonSet: + + + + 5922 + + + + inputButtonSet: + + + + 5923 + + + + remove: + + + + 5924 + + + + inputButtonSet: + + + + 5925 + + + + inputButtonSet: + + + + 5926 + + + + inputButtonSet: + + + + 5927 + + + + inputButtonSet: + + + + 5928 + + + + inputButtonSet: + + + + 5929 + + + + inputButtonSet: + + + + 5930 + + + + inputButtonSet: + + + + 5931 + + + + selectSoundInputMode: + + + + 5932 + + + + selectScreenshotFileFormat: + + + + 5951 + + + + selectScreenshotFileFormat: + + + + 5952 + + + + selectScreenshotFileFormat: + + + + 5953 + + + + selectScreenshotFileFormat: + + + + 5954 + + + + selectScreenshotFileFormat: + + + + 5955 + + + + selectScreenshotFileFormat: + + + + 5956 + + + + selectExportRomSaveFormat: + + + + 5957 + + + + selectExportRomSaveFormat: + + + + 5958 + + + + exportRomSavePanelAccessoryView + + + + 5959 + + + + value: selection.volume + + + + + + value: selection.volume + value + selection.volume + + + + + + 2 + + + 5962 + + + + selectExportRomSaveFormat: + + + + 5964 + + + + value: selection.isSpeedLimitEnabled + + + + + + value: selection.isSpeedLimitEnabled + value + selection.isSpeedLimitEnabled + + + + + + + 2 + + + 5971 + + + + selectedTag: values.DisplayView_Mode + + + + + + selectedTag: values.DisplayView_Mode + selectedTag + values.DisplayView_Mode + 2 + + + 5972 + + + + selectedTag: values.DisplayView_Size + + + + + + selectedTag: values.DisplayView_Size + selectedTag + values.DisplayView_Size + 2 + + + 5973 + + + + value: values.DisplayView_Rotation + + + + + + value: values.DisplayView_Rotation + value + values.DisplayView_Rotation + 2 + + + 5974 + + + + value: values.DisplayView_UseBilinearOutput + + + + + + value: values.DisplayView_UseBilinearOutput + value + values.DisplayView_UseBilinearOutput + 2 + + + 5975 + + + + selectedTag: values.DisplayView_VideoFilter + + + + + + selectedTag: values.DisplayView_VideoFilter + selectedTag + values.DisplayView_VideoFilter + 2 + + + 5976 + + + + selectedTag: values.DisplayViewCombo_MainScreenFirst + + + + + + selectedTag: values.DisplayViewCombo_MainScreenFirst + selectedTag + values.DisplayViewCombo_MainScreenFirst + 2 + + + 5977 + + + + selectedTag: values.DisplayViewCombo_Orientation + + + + + + selectedTag: values.DisplayViewCombo_Orientation + selectedTag + values.DisplayViewCombo_Orientation + 2 + + + 5978 + + + + value: values.DisplayViewCombo_Gap + + + + + + value: values.DisplayViewCombo_Gap + value + values.DisplayViewCombo_Gap + 2 + + + 5979 + + + + hidden: selection.isShowingStatusBar + + + + + + hidden: selection.isShowingStatusBar + hidden + selection.isShowingStatusBar + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 5981 + + + + hidden: selection.isShowingStatusBar + + + + + + hidden: selection.isShowingStatusBar + hidden + selection.isShowingStatusBar + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 5983 + + + + hidden: selection.isShowingStatusBar + + + + + + hidden: selection.isShowingStatusBar + hidden + selection.isShowingStatusBar + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 5985 + + + + hidden: selection.isShowingStatusBar + + + + + + hidden: selection.isShowingStatusBar + hidden + selection.isShowingStatusBar + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 5987 + + + + selectedTag: values.Sound_AudioOutputEngine + + + + + + selectedTag: values.Sound_AudioOutputEngine + selectedTag + values.Sound_AudioOutputEngine + 2 + + + 5989 + + + + value: values.Sound_Volume + + + + + + value: values.Sound_Volume + value + values.Sound_Volume + 2 + + + 5990 + + + + value: values.Sound_Volume + + + + + + value: values.Sound_Volume + value + values.Sound_Volume + + + + + 2 + + + 5991 + + + + enabled: values.Advanscene_DatabasePath + + + + + + enabled: values.Advanscene_DatabasePath + enabled + values.Advanscene_DatabasePath + + NSValueTransformerName + NSIsNotNil + + 2 + + + 5992 + + + + value: values.Emulation_AdvancedBusLevelTiming + + + + + + value: values.Emulation_AdvancedBusLevelTiming + value + values.Emulation_AdvancedBusLevelTiming + 2 + + + 5993 + + + + value: values.Emulation_BIOSEmulateSWI + + + + + + value: values.Emulation_BIOSEmulateSWI + value + values.Emulation_BIOSEmulateSWI + 2 + + + 5994 + + + + value: values.Emulation_BIOSPatchDelayLoopSWI + + + + + + value: values.Emulation_BIOSPatchDelayLoopSWI + value + values.Emulation_BIOSPatchDelayLoopSWI + 2 + + + 5995 + + + + value: values.Emulation_EmulateEnsata + + + + + + value: values.Emulation_EmulateEnsata + value + values.Emulation_EmulateEnsata + 2 + + + 5996 + + + + value: values.Emulation_UseDebugConsole + + + + + + value: values.Emulation_UseDebugConsole + value + values.Emulation_UseDebugConsole + 2 + + + 5998 + + + + value: values.Emulation_FirmwareBoot + + + + + + value: values.Emulation_FirmwareBoot + value + values.Emulation_FirmwareBoot + 2 + + + 5999 + + + + value: values.Emulation_UseExternalBIOSImages + + + + + + value: values.Emulation_UseExternalBIOSImages + value + values.Emulation_UseExternalBIOSImages + 2 + + + 6000 + + + + enabled: values.Emulation_UseExternalBIOSImages + + + + + + enabled: values.Emulation_UseExternalBIOSImages + enabled + values.Emulation_UseExternalBIOSImages + + NSRaisesForNotApplicableKeys + + + 2 + + + 6001 + + + + enabled: values.Emulation_UseExternalBIOSImages + + + + + + enabled: values.Emulation_UseExternalBIOSImages + enabled + values.Emulation_UseExternalBIOSImages + + NSRaisesForNotApplicableKeys + + + 2 + + + 6004 + + + + value: values.Emulation_UseExternalFirmwareImage + + + + + + value: values.Emulation_UseExternalFirmwareImage + value + values.Emulation_UseExternalFirmwareImage + 2 + + + 6011 + + + + enabled: values.Emulation_UseExternalFirmwareImage + + + + + + enabled: values.Emulation_UseExternalFirmwareImage + enabled + values.Emulation_UseExternalFirmwareImage + + NSRaisesForNotApplicableKeys + + + 2 + + + 6012 + + + + enabled: values.Emulation_UseExternalFirmwareImage + + + + + + enabled: values.Emulation_UseExternalFirmwareImage + enabled + values.Emulation_UseExternalFirmwareImage + 2 + + + 6013 + + + + enabled2: values.Emulation_UseExternalBIOSImages + + + + + + enabled2: values.Emulation_UseExternalBIOSImages + enabled2 + values.Emulation_UseExternalBIOSImages + + + + + + + + 2 + + + 6014 + + + + enabled: values.BIOS_ARM9ImagePath + + + + + + enabled: values.BIOS_ARM9ImagePath + enabled + values.BIOS_ARM9ImagePath + + NSValueTransformerName + NSIsNotNil + + 2 + + + 6018 + + + + enabled2: values.BIOS_ARM9ImagePath + + + + + + enabled2: values.BIOS_ARM9ImagePath + enabled2 + values.BIOS_ARM9ImagePath + + + + + + NSIsNotNil + + + 2 + + + 6020 + + + + enabled2: values.BIOS_ARM9ImagePath + + + + + + enabled2: values.BIOS_ARM9ImagePath + enabled2 + values.BIOS_ARM9ImagePath + + + + + + NSIsNotNil + + + 2 + + + 6022 + + + + enabled3: values.BIOS_ARM9ImagePath + + + + + + enabled3: values.BIOS_ARM9ImagePath + enabled3 + values.BIOS_ARM9ImagePath + + + + + + NSIsNotNil + + + 2 + + + 6024 + + + + enabled2: values.BIOS_ARM7ImagePath + + + + + + enabled2: values.BIOS_ARM7ImagePath + enabled2 + values.BIOS_ARM7ImagePath + + + + + + NSIsNotNil + + + 2 + + + 6027 + + + + enabled3: values.BIOS_ARM7ImagePath + + + + + + enabled3: values.BIOS_ARM7ImagePath + enabled3 + values.BIOS_ARM7ImagePath + + + + + + NSIsNotNil + + + 2 + + + 6028 + + + + enabled3: values.BIOS_ARM7ImagePath + + + + + + enabled3: values.BIOS_ARM7ImagePath + enabled3 + values.BIOS_ARM7ImagePath + + + + + + NSIsNotNil + + + 2 + + + 6029 + + + + enabled4: values.BIOS_ARM7ImagePath + + + + + + enabled4: values.BIOS_ARM7ImagePath + enabled4 + values.BIOS_ARM7ImagePath + + + + + + NSIsNotNil + + + 2 + + + 6030 + + + + enabled: values.Emulation_FirmwareImagePath + + + + + + enabled: values.Emulation_FirmwareImagePath + enabled + values.Emulation_FirmwareImagePath + + NSValueTransformerName + NSIsNotNil + + 2 + + + 6034 + + + + enabled5: values.Emulation_FirmwareImagePath + + + + + + enabled5: values.Emulation_FirmwareImagePath + enabled5 + values.Emulation_FirmwareImagePath + + + + + + NSIsNotNil + + + 2 + + + 6037 + + + + enabled: selection.emuFlagUseExternalFirmware + + + + + + enabled: selection.emuFlagUseExternalFirmware + enabled + selection.emuFlagUseExternalFirmware + 2 + + + 6041 + + + + enabled2: selection.emuFlagUseExternalBios + + + + + + enabled2: selection.emuFlagUseExternalBios + enabled2 + selection.emuFlagUseExternalBios + + + + + + + + 2 + + + 6042 + + + + enabled: values.Emulation_FirmwareImagePath + + + + + + enabled: values.Emulation_FirmwareImagePath + enabled + values.Emulation_FirmwareImagePath + + NSValueTransformerName + NSIsNotNil + + 2 + + + 6048 + + + + enabled3: values.BIOS_ARM9ImagePath + + + + + + enabled3: values.BIOS_ARM9ImagePath + enabled3 + values.BIOS_ARM9ImagePath + + + + + + NSIsNotNil + + + 2 + + + 6058 + + + + enabled4: values.BIOS_ARM7ImagePath + + + + + + enabled4: values.BIOS_ARM7ImagePath + enabled4 + values.BIOS_ARM7ImagePath + + + + + + NSIsNotNil + + + 2 + + + 6067 + + + + enabled5: values.Emulation_FirmwareImagePath + + + + + + enabled5: values.Emulation_FirmwareImagePath + enabled5 + values.Emulation_FirmwareImagePath + + + + + + NSIsNotNil + + + 2 + + + 6069 + + + + enabled2: values.BIOS_ARM9ImagePath + + + + + + enabled2: values.BIOS_ARM9ImagePath + enabled2 + values.BIOS_ARM9ImagePath + + + + + + NSIsNotNil + + + 2 + + + 6076 + + + + enabled3: values.BIOS_ARM7ImagePath + + + + + + enabled3: values.BIOS_ARM7ImagePath + enabled3 + values.BIOS_ARM7ImagePath + + + + + + NSIsNotNil + + + 2 + + + 6081 + + + + enabled2: values.BIOS_ARM9ImagePath + + + + + + enabled2: values.BIOS_ARM9ImagePath + enabled2 + values.BIOS_ARM9ImagePath + + + + + + NSIsNotNil + + + 2 + + + 6088 + + + + enabled3: values.BIOS_ARM7ImagePath + + + + + + enabled3: values.BIOS_ARM7ImagePath + enabled3 + values.BIOS_ARM7ImagePath + + + + + + NSIsNotNil + + + 2 + + + 6093 + + + + enabled: values.BIOS_ARM9ImagePath + + + + + + enabled: values.BIOS_ARM9ImagePath + enabled + values.BIOS_ARM9ImagePath + + NSValueTransformerName + NSIsNotNil + + 2 + + + 6100 + + + + enabled2: values.BIOS_ARM7ImagePath + + + + + + enabled2: values.BIOS_ARM7ImagePath + enabled2 + values.BIOS_ARM7ImagePath + + + + + + NSIsNotNil + + + 2 + + + 6105 + + + + enabled2: values.R4Cheat_DatabasePath + + + + + + enabled2: values.R4Cheat_DatabasePath + enabled2 + values.R4Cheat_DatabasePath + + + + + + NSIsNotNil + + + 2 + + + 6106 + + + + selectedTag: values.Input_AudioInputMode + + + + + + selectedTag: values.Input_AudioInputMode + selectedTag + values.Input_AudioInputMode + 2 + + + 6107 + + + + selectedTag: values.Input_AudioInputMode + + + + + + selectedTag: values.Input_AudioInputMode + selectedTag + values.Input_AudioInputMode + 2 + + + 6108 + + + + selectedTag: values.Render3D_RenderingEngine + + + + + + selectedTag: values.Render3D_RenderingEngine + selectedTag + values.Render3D_RenderingEngine + 2 + + + 6109 + + + + selectedTag: selection.render3DRenderingEngine + + + + + + selectedTag: selection.render3DRenderingEngine + selectedTag + selection.render3DRenderingEngine + 2 + + + 6111 + + + + value: selection.render3DLineHack + + + + + + value: selection.render3DLineHack + value + selection.render3DLineHack + 2 + + + 6112 + + + + value: selection.render3DHighPrecisionColorInterpolation + + + + + + value: selection.render3DHighPrecisionColorInterpolation + value + selection.render3DHighPrecisionColorInterpolation + 2 + + + 6113 + + + + value: selection.render3DEdgeMarking + + + + + + value: selection.render3DEdgeMarking + value + selection.render3DEdgeMarking + 2 + + + 6114 + + + + value: selection.render3DFog + + + + + + value: selection.render3DFog + value + selection.render3DFog + 2 + + + 6115 + + + + value: selection.render3DTextures + + + + + + value: selection.render3DTextures + value + selection.render3DTextures + 2 + + + 6116 + + + + value: selection.render3DDepthComparisonThreshold + + + + + + value: selection.render3DDepthComparisonThreshold + value + selection.render3DDepthComparisonThreshold + 2 + + + 6117 + + + + selectedTag: selection.render3DThreads + + + + + + selectedTag: selection.render3DThreads + selectedTag + selection.render3DThreads + 2 + + + 6118 + + + + value: values.General_ExecuteROMOnLoad + + + + + + value: values.General_ExecuteROMOnLoad + value + values.General_ExecuteROMOnLoad + 2 + + + 6119 + + + + value: values.General_AutoloadROMOnLaunch + + + + + + value: values.General_AutoloadROMOnLaunch + value + values.General_AutoloadROMOnLaunch + 2 + + + 6120 + + + + selectedTag: values.General_AutoloadROMOption + + + + + + selectedTag: values.General_AutoloadROMOption + selectedTag + values.General_AutoloadROMOption + 2 + + + 6121 + + + + enabled: values.General_AutoloadROMOnLaunch + + + + + + enabled: values.General_AutoloadROMOnLaunch + enabled + values.General_AutoloadROMOnLaunch + 2 + + + 6122 + + + + value: values.General_DoNotAskMigrate + + + + + + value: values.General_DoNotAskMigrate + value + values.General_DoNotAskMigrate + 2 + + + 6123 + + + + value: values.General_DoNotAskMigrate + + + + + + value: values.General_DoNotAskMigrate + value + values.General_DoNotAskMigrate + 2 + + + 6124 + + + + enabled: values.General_AutoloadROMSelectedPath + + + + + + enabled: values.General_AutoloadROMSelectedPath + enabled + values.General_AutoloadROMSelectedPath + + NSValueTransformerName + NSIsNotNil + + 2 + + + 6125 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + + + + + 19 + + + + + + + + 56 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + + + + + + + + + + 75 + + + + + 80 + + + + + 72 + + + + + 124 + + + + + + + + 79 + + + + + 112 + + + + + 74 + + + + + 125 + + + + + + + + 126 + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 295 + + + + + + + + 296 + + + + + + + + + + + + + + + + + + + + + 297 + + + + + 298 + + + + + 371 + + + + + + + + + 372 + + + + + + + + + + + + 494 + + + App Delegate + + + 534 + + + + + 535 + + + + + 538 + + + + + + + + 539 + + + + + + 541 + + + + + + + + 542 + + + + + + 575 + + + + + + + + 576 + + + + + + + + + + + + + + + + + + + 578 + + + + + 594 + + + + + 596 + + + + + 607 + + + + + + + + 627 + + + + + + + + + 628 + + + + + + 629 + + + + + + + + + + + + + + 634 + + + + + 635 + + + + + 650 + + + + + 651 + + + + + + + + 652 + + + + + 661 + + + + + + + + 662 + + + + + 714 + + + + + + + + + + + + + + + + Cheat Search Drawer Content View + + + 715 + + + Cheat Search Drawer + + + 766 + + + Emulation Window Delegate + + + 783 + + + + + + + + 784 + + + + + + + + + + + + + + + + 785 + + + + + 787 + + + + + + + + 788 + + + + + + + + + + + + 789 + + + + + 794 + + + + + + + + 795 + + + + + + + + + + + + + + + + + 796 + + + + + + + + 797 + + + + + + + + + + 823 + + + + + + + + 824 + + + + + 825 + + + + + + + + 826 + + + + + 827 + + + + + + + + 828 + + + + + 829 + + + + + + + + 830 + + + + + 831 + + + + + + + + 832 + + + + + 833 + + + + + + + + 834 + + + + + 835 + + + + + + + + 836 + + + + + 843 + + + + + + + + 844 + + + + + 845 + + + + + + + + 846 + + + + + 850 + + + + + 854 + + + + + 855 + + + + + 861 + + + + + + + + 862 + + + + + + + + + + + + + 865 + + + + + + + + 866 + + + + + 872 + + + + + + + + + + + + + + + 875 + + + + + + + + + + + + + + + + + + + 876 + + + + + + + + + + + + + + + + + + + + + + + 877 + + + + + + + + + + + + + + + 878 + + + + + + + + + + + 879 + + + + + + + + 880 + + + + + 883 + + + + + + + + 884 + + + + + 885 + + + + + + + + 886 + + + + + 887 + + + + + + + + 888 + + + + + 889 + + + + + + + + 890 + + + + + 897 + + + + + + + + 898 + + + + + 899 + + + + + + + + 900 + + + + + 901 + + + + + + + + 902 + + + + + 903 + + + + + + + + 904 + + + + + 905 + + + + + + + + 906 + + + + + 907 + + + + + + + + 908 + + + + + 909 + + + + + + + + 910 + + + + + 911 + + + + + + + + 912 + + + + + 913 + + + + + + + + 914 + + + + + + 924 + + + + + + + + 925 + + + + + 926 + + + + + + + + 927 + + + + + 928 + + + + + + + + 929 + + + + + 930 + + + + + + + + 931 + + + + + 932 + + + + + + + + 933 + + + + + 934 + + + + + + + + 935 + + + + + 936 + + + + + + + + 937 + + + + + 938 + + + + + + + + 939 + + + + + 940 + + + + + + + + 941 + + + + + 942 + + + + + + + + 943 + + + + + 944 + + + + + + + + 945 + + + + + 946 + + + + + + + + 947 + + + + + 948 + + + + + + + + 951 + + + + + 949 + + + + + + + + 950 + + + + + 952 + + + + + + + + 953 + + + + + + + + 954 + + + + + 955 + + + + + 956 + + + + + + + + 957 + + + + + + + + 958 + + + + + 959 + + + + + 960 + + + + + + + + 961 + + + + + + + + 962 + + + + + 963 + + + + + 964 + + + + + + + + 967 + + + + + 965 + + + + + + + + 966 + + + + + 968 + + + + + + + + 969 + + + + + + + + 970 + + + + + 971 + + + + + 983 + + + + + + + + 984 + + + + + + + + + + + + 987 + + + + + 989 + + + + + 990 + + + + + 991 + + + + + 993 + + + + + 998 + + + + + + + + 999 + + + + + + + + + + + + + + + + + + 1000 + + + + + + + + 1001 + + + + + 1002 + + + + + + + + 1003 + + + + + 1004 + + + + + + + + 1005 + + + + + 1006 + + + + + + + + 1007 + + + + + 1008 + + + + + + + + 1009 + + + + + 1010 + + + + + + + + 1011 + + + + + 1012 + + + + + + + + 1013 + + + + + 1016 + + + + + + + + 1017 + + + + + 1020 + + + + + + + + 1021 + + + + + 1024 + + + + + + + + 1025 + + + + + + + + 1034 + + + + + + + + 1035 + + + + + 1036 + + + + + + + + 1037 + + + + + 1038 + + + + + + + + 1039 + + + + + 1040 + + + + + + + + 1041 + + + + + 1113 + + + + + 1114 + + + + + 1115 + + + + + 1118 + + + + + 1119 + + + + + 1120 + + + + + 1298 + + + + + + + + + General Preferences View + + + 1301 + + + + + + Input Preferences View + + + 1496 + + + + + + + + + 1497 + + + + + + + + 1500 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1501 + + + + + + + + 1502 + + + + + + + + + + + 1365 + + + + + + + + 1366 + + + + + 1444 + + + + + + + + 1445 + + + + + 1446 + + + + + + + + 1447 + + + + + 1448 + + + + + + + + 1449 + + + + + 1450 + + + + + + + + 1451 + + + + + 1456 + + + + + + + + 1457 + + + + + 1460 + + + + + + + + 1461 + + + + + 1462 + + + + + + + + 1463 + + + + + 1464 + + + + + + + + 1465 + + + + + 1468 + + + + + + + + 1469 + + + + + 1470 + + + + + + + + 1471 + + + + + 1472 + + + + + + + + 1473 + + + + + 1474 + + + + + + + + 1475 + + + + + 1395 + + + + + + + + 1396 + + + + + 1478 + + + + + + + + 1479 + + + + + 1538 + + + + + + + + + + + + + 1299 + + + + + + + + 1300 + + + + + 1539 + + + + + + + + 1540 + + + + + 1541 + + + + + + + + 1542 + + + + + + + + 1543 + + + + + + + + + 1544 + + + + + 1545 + + + + + 1547 + + + + + + + + 1548 + + + + + 1555 + + + + + + + + 1556 + + + + + 1557 + + + + + + + + 1558 + + + + + 1559 + + + + + + + + 1560 + + + + + 1561 + + + + + + + + 1562 + + + + + 1563 + + + + + + + + 1564 + + + + + 1565 + + + + + + + + 1566 + + + + + + + + 1567 + + + + + + + + 1568 + + + + + + + + 1569 + + + + + + + + 1570 + + + + + + + + 1571 + + + + + 1572 + + + + + 1573 + + + + + 1574 + + + + + 1575 + + + + + 1576 + + + + + 1584 + + + + + + Display Preferences View + + + 1615 + + + + + + + + + + 1616 + + + + + + + + 1619 + + + + + + + + 1620 + + + + + + + + 1621 + + + + + + + + + + + + 1626 + + + + + + + + 1627 + + + + + + + + 1628 + + + + + + + + + + + + + + + + + + + + + + + + + 1629 + + + + + 1630 + + + + + 1631 + + + + + 1632 + + + + + + + + 1633 + + + + + 1634 + + + + + + + + 1635 + + + + + 1636 + + + + + 1637 + + + + + 1638 + + + + + 1639 + + + + + 1640 + + + + + 1641 + + + + + 1642 + + + + + 1643 + + + + + 1644 + + + + + 1645 + + + + + 1646 + + + + + 1647 + + + + + 1648 + + + + + 1649 + + + + + 1650 + + + + + + + + 1651 + + + + + 1679 + + + + + 1680 + + + + + 1681 + + + + + 1682 + + + + + 1709 + + + Main Display View + + + 1721 + + + CocoaDS Core Controller + + + 1736 + + + + + 1855 + + + + + 1856 + + + + + + + + 1857 + + + + + + + + + + + + + + + + 1858 + + + + + + + + 1859 + + + + + 1976 + + + + + + + + 1977 + + + + + 1978 + + + + + + + + 1979 + + + + + 1980 + + + + + + + + 1981 + + + + + 1982 + + + + + + + + 1983 + + + + + 1986 + + + + + 1987 + + + + + + + + 1988 + + + + + + + + 1998 + + + + + + + + 1999 + + + + + 2000 + + + + + 2095 + + + + + 2098 + + + + + 2154 + + + + + + + + 2155 + + + + + 2246 + + + + + 2248 + + + + + + + + + + + Sound Preferences View + + + 2250 + + + + + + + + + + 2253 + + + + + + + + 2254 + + + + + 2257 + + + + + + + + 2258 + + + + + + + + 2262 + + + + + 2265 + + + + + + + + 2266 + + + + + 2269 + + + + + + + + + + + + 1397 + + + + + + + + 1398 + + + + + 1399 + + + + + + + + 1400 + + + + + 1401 + + + + + + + + 1402 + + + + + 1409 + + + + + + + + 1410 + + + + + 1403 + + + + + + + + 1404 + + + + + + + + 1405 + + + + + + + + 1406 + + + + + 2286 + + + + + + + + + + 2276 + + + + + + + + + + + + 2283 + + + + + 2282 + + + + + 2278 + + + + + 2279 + + + + + 2277 + + + + + 2302 + + + + + + + + 2303 + + + + + 2318 + + + + + + + + 2319 + + + + + 2320 + + + + + + + + 2321 + + + + + 2327 + + + + + + + + 2328 + + + + + + + + + + + 2329 + + + + + 2330 + + + + + 2331 + + + + + 2332 + + + + + 2339 + + + + + + + + + + Emulation Preferences View + + + 2340 + + + + + 2341 + + + + + + + + 2342 + + + + + + + + + + + + + + + + 2343 + + + + + + + + + + + + + 2344 + + + + + + + + + 2345 + + + + + + + + 2346 + + + + + 2347 + + + + + + + + 2348 + + + + + 2349 + + + + + + + + 2350 + + + + + 2353 + + + + + + + + 2354 + + + + + 2355 + + + + + + + + 2356 + + + + + 2357 + + + + + + + + 2358 + + + + + + + + 2359 + + + + + + + + 2360 + + + + + 2361 + + + + + 2362 + + + + + 2363 + + + + + + + + 2364 + + + + + 2365 + + + + + + + + 2366 + + + + + 2367 + + + + + + + + 2368 + + + + + 2369 + + + + + + + + 2370 + + + + + 2371 + + + + + + + + 2378 + + + + + 2372 + + + + + + + + 2377 + + + + + 2373 + + + + + + + + 2376 + + + + + 2374 + + + + + + + + 2375 + + + + + 2382 + + + + + + + + 2383 + + + + + + + + + + + + + + + + + + + + + + 2384 + + + + + 2385 + + + + + 2386 + + + + + 2387 + + + + + 2388 + + + + + 2389 + + + + + 2390 + + + + + 2391 + + + + + 2392 + + + + + 2393 + + + + + 2394 + + + + + 2395 + + + + + 2396 + + + + + 2397 + + + + + 2398 + + + + + 2399 + + + + + 2427 + + + + + + + + + 2428 + + + + + + + + 2429 + + + + + + + + 2430 + + + + + 2431 + + + + + + + + 2432 + + + + + + + + 2433 + + + + + + + + + + 2434 + + + + + 2435 + + + + + 2436 + + + + + 2437 + + + + + + + + + + 2438 + + + + + 2439 + + + + + 2440 + + + + + 2473 + + + + + 2482 + + + + + 2483 + + + + + 2518 + + + + + + + + 2519 + + + + + 608 + + + + + + + + + + + + 1250 + + + + + + + + 1251 + + + + + + + + + + + + + + + + + + + + 1264 + + + + + 1263 + + + + + 1262 + + + + + 1261 + + + + + 1260 + + + + + 1259 + + + + + 1258 + + + + + 1257 + + + + + 1256 + + + + + 1255 + + + + + 1254 + + + + + 1253 + + + + + 1252 + + + + + 2556 + + + + + 2565 + + + + + + + + 2566 + + + + + 1480 + + + + + + + + 1481 + + + + + 1383 + + + + + + + + 1386 + + + + + 2604 + + + + + 2609 + + + + + 2610 + + + + + 2653 + + + ROM Info Panel Controller + + + 2772 + + + Emulation Window Controller + + + 2789 + + + + + + + + 2790 + + + + + + + + + + + + + + 2793 + + + + + + + + 2794 + + + + + 2799 + + + + + + + + 2800 + + + + + 2803 + + + + + + + + 2804 + + + + + 2807 + + + + + + + + 2808 + + + + + 2809 + + + + + + + + 2810 + + + + + 2811 + + + + + + + + 2812 + + + + + 2813 + + + + + + + + 2814 + + + + + 2815 + + + + + + + + 2816 + + + + + + + + 2817 + + + + + + + + 2818 + + + + + 2819 + + + + + 2820 + + + + + 2847 + + + + + + + + 2848 + + + + + + + + + + + 2863 + + + + + + + + 2864 + + + + + 2865 + + + + + + + + + + + 2866 + + + + + 2867 + + + + + 2868 + + + + + + + + + + + + 2869 + + + + + 2870 + + + + + + + + 2871 + + + + + + + + 2872 + + + + + 2873 + + + + + 2874 + + + + + + + + 2876 + + + + + + + + 2877 + + + + + 2878 + + + File Migration Array Controller + + + 2894 + + + + + + + + 2895 + + + + + + + + 2896 + + + + + + + + 2897 + + + + + + + + 2900 + + + + + 2901 + + + + + 2902 + + + + + 2903 + + + + + 2954 + + + + + + + + 2955 + + + + + 3015 + + + + + + + + 3042 + + + + + 3063 + + + + + + + + + 3059 + + + + + + + + 3060 + + + + + 3061 + + + + + + + + 3062 + + + + + 2875 + + + + + 3146 + + + + + 3148 + + + Firmware Panel Controller + + + 3204 + + + + + + + + 3205 + + + + + + + + + + + + + + + 3206 + + + + + 3207 + + + + + 3208 + + + + + 3209 + + + + + 3210 + + + + + 3211 + + + + + 3213 + + + + + 3214 + + + + + 3285 + + + + + + + + 3286 + + + + + 3382 + + + CocoaDS Display Controller + + + 641 + + + + + + + + + + + + + + + 1236 + + + + + 1234 + + + + + 1233 + + + + + 1232 + + + + + 647 + + + + + 646 + + + + + 3456 + + + + + + + + 3457 + + + + + + + + + + + + 3458 + + + + + + + + 3459 + + + + + + + + 3460 + + + + + + + + 3461 + + + + + + + + 3462 + + + + + 3463 + + + + + 3464 + + + + + 3465 + + + + + 3471 + + + + + + + + 3472 + + + + + 3480 + + + + + + + + 3481 + + + + + 3482 + + + + + 3488 + + + + + + + + 3489 + + + + + + + + + + + + + + + + + + 3496 + + + + + + + + + + + 3497 + + + + + 3498 + + + + + 3499 + + + + + + + + + + 3501 + + + + + + + + 3507 + + + + + + + + 3508 + + + + + 3509 + + + + + 3516 + + + + + + + + 3517 + + + + + 3520 + + + Preferences Window Controller + + + 3521 + + + + + 3522 + + + + + 3523 + + + + + 3526 + + + + + 3527 + + + + + 3644 + + + + + 3689 + + + + + + + + 3690 + + + + + 3709 + + + + + 3712 + + + + + + + + 3713 + + + + + + + + + + + + + 3716 + + + + + + + + 3717 + + + + + + + + + 3718 + + + + + + + + + + + 3719 + + + + + 3720 + + + + + 3721 + + + + + 3722 + + + + + + + + + + 3723 + + + + + 3724 + + + + + 3725 + + + + + 3732 + + + + + 3733 + + + + + + + + 3714 + + + + + + + + 3715 + + + + + 3747 + + + + + + + + + + 3736 + + + + + + + + 3742 + + + + + 3737 + + + + + + + + 3740 + + + + + + + + 3741 + + + + + 3738 + + + + + + + + 3739 + + + + + 3748 + + + + + + + + 3749 + + + + + 3751 + + + + + 3752 + + + + + 653 + + + + + + + + 654 + + + + + 3784 + + + + + + + + 3787 + + + + + + + + 3788 + + + + + + + + + + + + + 3692 + + + + + + + + 3693 + + + + + 3648 + + + + + + + + + + + + + + + + + + + + + + + + + + 3667 + + + + + 3666 + + + + + 3665 + + + + + 3664 + + + + + 3663 + + + + + 3662 + + + + + 3661 + + + + + 3660 + + + + + 3659 + + + + + 3658 + + + + + 3657 + + + + + 3656 + + + + + 3655 + + + + + 3654 + + + + + 3653 + + + + + 3652 + + + + + 3651 + + + + + 3650 + + + + + 3649 + + + + + 3789 + + + + + 3790 + + + + + + + + 3791 + + + + + + + + + + + + 3786 + + + + + + + + + + + + + 3777 + + + + + + + + 3775 + + + + + + + + 3773 + + + + + + + + 3771 + + + + + + + + 3779 + + + + + + Depth Comparison Threshold Text Field + + + 3782 + + + + + + + + 3783 + + + + + 3780 + + + + + + + + 3781 + + + + + 3772 + + + + + 3774 + + + + + 3776 + + + + + 3778 + + + + + 3793 + + + + + + + + 3794 + + + + + 3798 + + + + + + + + + + + + + 3804 + + + + + + + + 3803 + + + + + + + + 3802 + + + + + + + + 3801 + + + + + + + + 3800 + + + + + + + + 3799 + + + + + + + + 3811 + + + + + 3809 + + + + + + + + 3810 + + + + + 3808 + + + + + 3807 + + + + + 3806 + + + + + 3805 + + + + + 3837 + + + + + + + + 3838 + + + + + + + + + + 3839 + + + + + 3840 + + + + + 3841 + + + + + 3843 + + + + + + + + 3844 + + + + + + + + 3845 + + + + + + + + + 3846 + + + + + 3847 + + + + + 3849 + + + + + + + + 3850 + + + + + 3878 + + + + + + + + 3879 + + + + + + + + + + + + 3880 + + + + + 3881 + + + + + 3882 + + + + + 3883 + + + + + 3884 + + + + + 3885 + + + + + + + + 3886 + + + + + + + + 3887 + + + + + 3888 + + + + + + + + 3889 + + + + + + + + 3890 + + + + + + + + + + + 3894 + + + + + 3893 + + + + + 3892 + + + + + 3891 + + + + + 3896 + + + + + + + + 3897 + + + + + 3899 + + + + + + + + 3900 + + + + + + + + 3901 + + + + + 3935 + + + + + + + + 3936 + + + + + + + + + + 3937 + + + + + 3938 + + + + + 3939 + + + + + 3959 + + + CocoaDS Sound Controller + + + 3965 + + + + + + + + + + + 3966 + + + + + 3967 + + + + + 3968 + + + + + 3969 + + + + + 4024 + + + + + + + + 4001 + + + + + + + + + + 4004 + + + + + 4003 + + + + + 4002 + + + + + 4027 + + + + + + + + 4028 + + + + + + + + + + + + 4029 + + + + + + + + 4030 + + + + + + + + 4031 + + + + + 4032 + + + + + + + + + + 4033 + + + + + + + + 4034 + + + + + 4035 + + + + + + + + 4036 + + + + + 4037 + + + + + + + + 4038 + + + + + 4039 + + + + + + + + + + + 4040 + + + + + + + + 4041 + + + + + 4043 + + + + + + + + 4044 + + + + + 4045 + + + + + + + + 4046 + + + + + 4047 + + + + + + + + + 4048 + + + + + + + + 4049 + + + + + 4050 + + + + + + + + 4051 + + + + + 4053 + + + + + + + + + + + + + + + + + Internal Firmware Drawer Content View + + + 4054 + + + Internal Firmware Drawer + + + 4062 + + + + + 4059 + + + + + + + + 4060 + + + + + 4066 + + + + + + + + 4067 + + + + + 4069 + + + + + + + + 4070 + + + + + + + + 4071 + + + + + + + + 4072 + + + + + + + + 4073 + + + + + + + + 4074 + + + + + + + + 4075 + + + + + + + + 4076 + + + + + + + + 4078 + + + + + + + + 4079 + + + + + + + + 4080 + + + + + + + + 4081 + + + + + + + + 4082 + + + + + + + + + + + + + + + + + + + + + + + 4083 + + + + + 4084 + + + + + 4085 + + + + + 4086 + + + + + 4087 + + + + + 4088 + + + + + 4089 + + + + + 4090 + + + + + 4091 + + + + + 4092 + + + + + 4093 + + + + + 4094 + + + + + 4095 + + + + + 4096 + + + + + 4097 + + + + + 4098 + + + + + 4099 + + + + + + + + 4100 + + + + + + + + + + + + + 4101 + + + + + 4102 + + + + + 4103 + + + + + 4104 + + + + + 4105 + + + + + 4106 + + + + + 4107 + + + + + 4109 + + + + + 4110 + + + + + 4111 + + + + + 4112 + + + + + 4113 + + + + + 4114 + + + + + 4115 + + + + + 4116 + + + + + 4179 + + + + + + + + 4180 + + + + + 4181 + + + + + + + + 4182 + + + + + + + + + + + + + + + + + + + 4191 + + + + + + + + 4192 + + + + + + + + 4193 + + + + + + + + 4194 + + + + + + + + 4195 + + + + + + + + 4196 + + + + + + + + 4197 + + + + + + + + 4198 + + + + + + + + 4199 + + + + + + + + 4200 + + + + + + + + 4201 + + + + + + + + 4202 + + + + + + + + + + + + + + + + + + + + + + + 4203 + + + + + 4204 + + + + + 4205 + + + + + 4206 + + + + + 4207 + + + + + 4208 + + + + + 4209 + + + + + 4210 + + + + + 4211 + + + + + 4212 + + + + + 4213 + + + + + 4214 + + + + + 4215 + + + + + 4216 + + + + + 4217 + + + + + 4218 + + + + + 4219 + + + + + + + + 4220 + + + + + + + + + + + + + 4221 + + + + + 4222 + + + + + 4223 + + + + + 4224 + + + + + 4225 + + + + + 4226 + + + + + 4227 + + + + + 4228 + + + + + 4229 + + + + + 4230 + + + + + 4231 + + + + + 4232 + + + + + 4233 + + + + + 4234 + + + + + 4240 + + + + + + + + 4241 + + + + + 4275 + + + + + + + + 4276 + + + + + 4277 + + + + + + + + 4278 + + + + + 4559 + + + + + + + + 4560 + + + + + 4561 + + + + + + + + 4562 + + + + + 4565 + + + + + + + + + + + + + + + 4566 + + + + + + + + 4567 + + + + + 4568 + + + + + + + + 4569 + + + + + 4570 + + + + + + + + 4571 + + + + + 4572 + + + + + + + + 4573 + + + + + 4574 + + + + + + + + 4575 + + + + + + + + 4576 + + + + + + + + + 4577 + + + + + 4578 + + + + + 4580 + + + + + 4581 + + + + + + + + 4582 + + + + + 4583 + + + + + + + + 4584 + + + + + 4585 + + + + + + + + + + + + + + + Internal Cheat View + + + 4586 + + + + + + + + 4587 + + + + + + + + 4588 + + + + + + + + 4589 + + + + + + + + 4590 + + + + + + + + 4593 + + + + + + + + 4594 + + + + + 4597 + + + + + + + + 4598 + + + + + 4599 + + + + + 4600 + + + + + 4601 + + + + + + + + + + + + 4602 + + + + + 4603 + + + + + 4604 + + + + + 4605 + + + + + 4606 + + + + + 4610 + + + + + + + Action Replay Cheat View + + + 4632 + + + + + + + + 4633 + + + + + + + + + + 4634 + + + + + 4635 + + + + + 4636 + + + + + 4637 + + + + + 4639 + + + + + + + + 4640 + + + + + 4647 + + + + + 4651 + + + + + + + + 4652 + + + + + 4656 + + + Cheats List Array Controller + + + 4660 + + + + + + + + 4661 + + + + + + + + 4662 + + + + + 4663 + + + + + 4664 + + + + + + + + 4665 + + + + + 4673 + + + + + + + Code Breaker Cheat View + + + 4693 + + + + + + + + 4694 + + + + + 4697 + + + + + 4711 + + + Cheat Selected Item Controller + + + 4715 + + + + + 4731 + + + Cheat Window Controller + + + 4745 + + + + + + + + 4746 + + + + + 4607 + + + + + + + + 4778 + + + + + 4792 + + + + + + + + + + + 4795 + + + + + 4796 + + + + + 4797 + + + + + + + + + 4798 + + + + + 4799 + + + + + + + + 4800 + + + + + + + + 4801 + + + + + 4802 + + + + + 4809 + + + + + + + + 4810 + + + + + 4811 + + + + + + + + 4812 + + + + + 4814 + + + + + + + + 4815 + + + + + 4817 + + + + + + + + 4818 + + + + + 4822 + + + + + + + + 4823 + + + + + 4850 + + + + + + + + + Exact Value Search View + + + 4851 + + + + + + + + + + + Comparative Search Continue View + + + 4858 + + + + + + + + 4859 + + + + + + + + 4860 + + + + + + + + 4861 + + + + + + + + 4862 + + + + + + + + 4863 + + + + + + + + 4864 + + + + + 4865 + + + + + 4866 + + + + + 4867 + + + + + 4868 + + + + + 4869 + + + + + 4871 + + + + + + + + 4872 + + + + + + + + 4873 + + + + + 4874 + + + + + 4876 + + + + + + + + 4877 + + + + + + + + 4878 + + + + + 4879 + + + + + + 4880 + + + + + + + + Comparative Search Start View + + + 4887 + + + + + + + + 4888 + + + + + + + + 4889 + + + + + + + + 4890 + + + + + 4891 + + + + + 4892 + + + + + 4899 + + + + + 4900 + + + + + + + + 4901 + + + + + + + + 4902 + + + + + + + + + 4903 + + + + + 4904 + + + + + 4906 + + + + + + + + 4907 + + + + + 4908 + + + + + + + + 4909 + + + + + 4910 + + + + + + + + 4911 + + + + + + + + 4912 + + + + + + + + + 4913 + + + + + 4914 + + + + + 4916 + + + Cheat Search List Array Controller + + + 4947 + + + + + 5003 + + + + + + + + + + + 5004 + + + + + + + + 5005 + + + + + + + + 5006 + + + + + + + + 5007 + + + + + 5008 + + + + + 5009 + + + + + 5014 + + + + + + + + 5015 + + + + + 5066 + + + + + + + + 5067 + + + + + 5068 + + + + + + + + 5069 + + + + + 5080 + + + + + + + + 5081 + + + + + + + + + + + + + + + + + + 5082 + + + + + + + + + + + 5083 + + + + + 5084 + + + + + 5085 + + + + + + + + + 5086 + + + + + 5087 + + + + + + + + 5088 + + + + + + + + 5089 + + + + + 5097 + + + + + 5098 + + + + + + + + 5099 + + + + + 5100 + + + + + + + + 5101 + + + + + 5102 + + + + + + + + 5103 + + + + + 5104 + + + + + + + + 5105 + + + + + 5106 + + + + + + + + 5107 + + + + + 5111 + + + + + + + + 5112 + + + + + 5115 + + + Cheat Database Array Controller + + + 5127 + + + + + + + + 5128 + + + + + 5133 + + + + + + + + 5134 + + + + + 5135 + + + + + + + + 5136 + + + + + 5140 + + + + + + + + 5141 + + + + + 5168 + + + + + + + + 5169 + + + + + 5171 + + + + + + + + + + + 5172 + + + + + + + + 5173 + + + + + + + + 5174 + + + + + + + + 5175 + + + + + + + + 5176 + + + + + 5177 + + + + + 5178 + + + + + 5179 + + + + + 5186 + + + + + + + + 5188 + + + + + + + + 5189 + + + + + 5193 + + + + + 5281 + + + Input Prefs Touch Array Controller + + + 5313 + + + + + + + + 5314 + + + + + + + + 5315 + + + + + 5316 + + + + + 24 + + + + + + + + + + + 23 + + + + + 239 + + + + + 5 + + + + + 92 + + + + + 5329 + + + + + 490 + + + + + + + + 491 + + + + + + + + + + + + 980 + + + + + 979 + + + + + 978 + + + + + 977 + + + + + 492 + + + + + 5419 + + + + + 5420 + + + + + 5421 + + + + + 5450 + + + + + + + + + + + + + + 2287 + + + + + + + + 2288 + + + + + 2289 + + + + + + + + 2290 + + + + + 1507 + + + + + + + + 1508 + + + + + + + + 1509 + + + + + + + + + + + 1532 + + + + + 1512 + + + + + 1511 + + + + + 1510 + + + + + 1577 + + + + + + + + 1578 + + + + + + + + 1579 + + + + + 2291 + + + + + + + + 2299 + + + + + 2292 + + + + + + + + 2293 + + + + + + + + 2294 + + + + + + + + + + 5427 + + + + + 2298 + + + + + 2297 + + + + + 3994 + + + + + + + + 3995 + + + + + + + + 3996 + + + + + + + + + 3997 + + + + + 3998 + + + + + 3992 + + + + + + + + 3993 + + + + + 1525 + + + + + + + + 1526 + + + + + + + + 1527 + + + + + + + + + + + + + 1531 + + + + + 1530 + + + + + 1529 + + + + + 1528 + + + + + 1580 + + + + + 1581 + + + + + 1537 + + + + + + + + + + + + 5460 + + + + + + + + 5461 + + + + + 5462 + + + + + + + + 5463 + + + + + + + + 5464 + + + + + + + + + + + + + 5465 + + + + + 5466 + + + + + 5467 + + + + + 5468 + + + + + 5469 + + + + + 5470 + + + + + 5471 + + + + + + + + 5472 + + + + + + + + 5473 + + + + + 5476 + + + + + + + + 5451 + + + + + + + + + + 5454 + + + + + 5453 + + + + + 5452 + + + + + 5477 + + + + + + + + 1591 + + + + + + + + + + 1592 + + + + + 1593 + + + + + 1594 + + + + + 5428 + + + + + + + + 5429 + + + + + + + + + + + + 5430 + + + + + 5431 + + + + + 5432 + + + + + 5433 + + + + + 5434 + + + + + 5441 + + + + + + + + 5442 + + + + + + + + + + + + + 5449 + + + + + 5448 + + + + + 5447 + + + + + 5446 + + + + + 5445 + + + + + 5443 + + + + + 5648 + + + + + 5649 + + + + + 5651 + + + + + + + + 5652 + + + + + + + + + + + + + + 5653 + + + + + + + + 5654 + + + + + + + + + + + 5655 + + + + + + + + 5656 + + + + + + + + 5657 + + + + + + + + 5658 + + + + + + + + 5659 + + + + + + + + 5660 + + + + + 5661 + + + + + 5662 + + + + + 5663 + + + + + 5664 + + + + + 5665 + + + + + + + + 5666 + + + + + + + + 5667 + + + + + + + + 5668 + + + + + + + + 5669 + + + + + + + + 5670 + + + + + + + + + + 5671 + + + + + 5672 + + + + + 5673 + + + + + 5674 + + + + + + + + 5675 + + + + + + + + + + 5676 + + + + + 5677 + + + + + 5678 + + + + + 5679 + + + + + + + + 5680 + + + + + + + + + + 5681 + + + + + 5682 + + + + + 5683 + + + + + 5684 + + + + + + + + 5685 + + + + + + + + + + 5686 + + + + + 5687 + + + + + 5688 + + + + + 5689 + + + + + 5690 + + + + + + + Screenshot Save Panel Accessory + + + 5691 + + + + + + + + 5692 + + + + + + + + 5693 + + + + + + + + 5694 + + + + + + + + + + + + + 5695 + + + + + 5696 + + + + + 5697 + + + + + 5698 + + + + + 5699 + + + + + 5700 + + + + + 5701 + + + + + 5702 + + + + + 2529 + + + + + + + + 2530 + + + + + + + + + + + 2548 + + + + + 2549 + + + + + 2551 + + + + + 2558 + + + + + + + + 2559 + + + + + + + + 2560 + + + + + 2553 + + + + + 5703 + + + + + 5713 + + + About Window Controller + + + 5738 + + + + + + + + + + + 5739 + + + + + + + + 5740 + + + + + + + + 5741 + + + + + + + + 5742 + + + + + + + + 5743 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5744 + + + + + + + + 5745 + + + + + + + + 5746 + + + + + + + + 5747 + + + + + + + + 5748 + + + + + + + + 5749 + + + + + + + + 5750 + + + + + + + + 5751 + + + + + + + + 5752 + + + + + + + + 5753 + + + + + + + + 5754 + + + + + + + + 5755 + + + + + + + + 5756 + + + + + + + + 5757 + + + + + + + + 5758 + + + + + + + + 5759 + + + + + + + + 5760 + + + + + + + + 5761 + + + + + + + + 5762 + + + + + + + + 5763 + + + + + + + + 5764 + + + + + + + + 5765 + + + + + + + + 5766 + + + + + + + + 5767 + + + + + + + + 5768 + + + + + + + + 5769 + + + + + + + + 5770 + + + + + + + + 5771 + + + + + + + + 5772 + + + + + 5773 + + + + + 5774 + + + + + 5775 + + + + + 5776 + + + + + 5777 + + + + + 5778 + + + + + 5779 + + + + + 5780 + + + + + 5781 + + + + + 5782 + + + + + 5783 + + + + + 5784 + + + + + 5785 + + + + + 5786 + + + + + 5787 + + + + + 5788 + + + + + 5789 + + + + + 5790 + + + + + 5791 + + + + + 5792 + + + + + 5793 + + + + + 5794 + + + + + 5795 + + + + + 5796 + + + + + 5797 + + + + + 5798 + + + + + 5799 + + + + + 5800 + + + + + + + + + + 5801 + + + + + + + + + + + 5802 + + + + + + + + 5803 + + + + + + + + 5804 + + + + + 5805 + + + + + 5806 + + + + + 5807 + + + + + + + + + + + + + 5808 + + + + + 5809 + + + + + 5810 + + + + + + + + 5811 + + + + + + + + 5812 + + + + + + + + 5813 + + + + + + + + 5814 + + + + + + + + 5815 + + + + + + + + 5816 + + + + + 5817 + + + + + 5818 + + + + + 5819 + + + + + + + + 5820 + + + + + 5821 + + + + + + + + 5822 + + + + + 5823 + + + + + 5824 + + + + + + + + + + + 5825 + + + + + + + + + + 5826 + + + + + + + + + + + + 5827 + + + + + + + + 5828 + + + + + + + + 5829 + + + + + 5830 + + + + + 5831 + + + + + + + + 5832 + + + + + + + + 5833 + + + + + + + + 5834 + + + + + + + + 5835 + + + + + + + + 5836 + + + + + 5837 + + + + + + + + 5838 + + + + + + + + 5839 + + + + + 5840 + + + + + 5841 + + + + + 5842 + + + + + 5843 + + + + + + + + 5844 + + + + + + + + 5845 + + + + + + + + + + + + 5846 + + + + + 5847 + + + + + 5848 + + + + + 5849 + + + + + 5850 + + + + + 5851 + + + + + 5852 + + + + + 5853 + + + + + + + + + + + + + + + + + + + 5854 + + + + + + + + 5855 + + + + + + + + 5856 + + + + + + + + 5857 + + + + + + + + 5858 + + + + + + + + 5859 + + + + + + + + 5860 + + + + + + + + 5861 + + + + + + + + 5862 + + + + + + + + 5863 + + + + + + + + 5864 + + + + + + + + 5865 + + + + + + + + 5866 + + + + + 5867 + + + + + 5868 + + + + + 5869 + + + + + 5870 + + + + + 5871 + + + + + 5872 + + + + + 5873 + + + + + 5874 + + + + + 5875 + + + + + 5876 + + + + + 5877 + + + + + 5933 + + + + + + + Export ROM Save Panel Accessory + + + 5934 + + + + + + + + 5935 + + + + + + + + 5936 + + + + + 5937 + + + + + + + + 5938 + + + + + + + + + + 5939 + + + + + 5942 + + + + + 5963 + + + + + 5965 + + + + + + + + 5966 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABB8AAAwu4AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwxAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDzgAAwxAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCwgAAwxAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDMAAAwxAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDfgAAwxAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDp4AAwxAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCAAAAwiwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDMAAAwgwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDloAAwgwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDFAAAwtAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDFAAAwp4AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDFAAAwlgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDGQAAwkQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + {{855, 1093}, {143, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{522, 812}, {146, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1537, 853}, {117, 253}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + {{1028, 578}, {520, 486}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBgAAAweAAAA + + {{520, 1070}, {64, 6}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{436, 809}, {64, 6}} + com.apple.InterfaceBuilder.CocoaPlugin + {{643, 640}, {640, 433}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAw6eAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwjQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDGQAAw6gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGQAABC2AAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBgAAAwsoAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDVwAAwegAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCjgAAwxgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{443, 824}, {414, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwxUAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + ToolTip + + ToolTip + + Sets the DS controller's Up button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw6aAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the DS controller's Down button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCUAAAxEaAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the DS controller's Left button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCUAAAxEBAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + ToolTip + + ToolTip + + Sets the DS controller's Right button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw2gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the DS controller's A button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw46AAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the DS controller's B button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCUAAAxC2AAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the DS controller's X button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw2sAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the DS controller's Y button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCUAAAxCEAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the DS controller's L button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCUAAAxBrAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the DS controller's R button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwqQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the DS controller's Start button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCUAAAxA5AAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the DS controller's Select button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwiwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the microphone activation hotkey. Whenever this hotkey is pressed, the emulator will accept sound input. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw6cAAA + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Simulates the closing and opening of the DS lid. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwmQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + InitialTabViewItem + + InitialTabViewItem + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBUAAAw9CAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the default size for new DS display views. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDHgAAwngAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{796, 517}, {126, 83}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the default rotation for new DS display views. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDDwAAwpQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{796, 460}, {126, 113}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1085, 684}, {431, 148}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABBgAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBgAAAwxgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCCAAAwoIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{1069, 916}, {227, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC5AAAwgQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAw44AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAw4GAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAw2oAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAw1EAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwzgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDAgAAw5gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwwYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwtoAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwqgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwmwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwggAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + The default rotation for new DS display views. A custom rotation angle may be entered here. (The angle must be between 0º and 360º.) + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDkIAAwggAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{391, 644}, {489, 405}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDdgAAwzcAAA + + + ToolTip + + ToolTip + + If the display layout is vertical, the main screen will be arranged above the touch screen. If the display layout is horizontal, the main screen will be arranged left of the touch screen. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + If the display layout is vertical, the touch screen will be arranged above the main screen. If the display layout is horizontal, the touch screen will be arranged left of the main screen. [NOT YET IMPLEMENTED IN THIS VERSION] + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + InitialTabViewItem + + InitialTabViewItem + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBUAAAw8KAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the default video filter for new DS display views, producing a variety of visual effects. The incurred CPU usage is dependent on which filter is used. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC7AAAw7gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{531, 545}, {151, 363}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AULsAABCigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBIAAAw6MAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBIAAAw7aAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + OpenGLDisplayView + com.apple.InterfaceBuilder.CocoaPlugin + + AQAAAABBwAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{935, 883}, {213, 198}} + com.apple.InterfaceBuilder.CocoaPlugin + {{935, 883}, {213, 198}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCdAAAwwgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCaAAAwyEAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCxAAAwv4AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCaAAAwrwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwv4AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC8AAAwgwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwqgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABB2AAAwmwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + {{1123, 658}, {400, 373}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABDhYAAA + + + ToolTip + + ToolTip + + Sets the default sound volume. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCMAAAwmQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDjYAAwmQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGQAABCHAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUFgAABAoAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDJwAAwrQAAA + + + ToolTip + + ToolTip + + Use a physical microphone or other other sound input device connected to your Mac. [NOT YET IMPLEMENTED IN THIS VERSION] + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Predefined noise samples that simulate sounds like blowing into the microphone. (Some games, such as "The Legend of Zelda: Spirit Tracks," work especially well with this.) + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Randomly generated white noise that simulates sounds like blowing into the microphone. May also be useful if a game needs you to speak into the microphone. + + + + ToolTip + + ToolTip + + Use a sound file. (Whenever the microphone is activated, the sound will begin at the start of the file.) [NOT YET IMPLEMENTED IN THIS VERSION] + + + com.apple.InterfaceBuilder.CocoaPlugin + + AUFgAABDPAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCngAAwwcAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCTAAAwtYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCjAAAwyMAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDJQAAwyYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{796, 565}, {126, 63}} + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + New display views will show both DS screens by default. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + New display views will show only the DS touch screen by default. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABChgAAwggAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDxAAAwggAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDqAAAwhQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABC1gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwowAAA + + + ToolTip + + ToolTip + + Performs no interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Smooths the sound and eliminates the harsh sounding harmonics, but also causes a significant loss of sound detail, especially in the high-end. Negligible CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Excellent sound quality, producing the best balance between smoothness and sound detail. Neglible CPU usage. Recommended setting. + + + {{1006, 629}, {530, 527}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABDyAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABDlIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABDFwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABCjgAAA + + + ToolTip + + ToolTip + + Greatly increases emulation accuracy, which improves the compatibility for most ROMs. This setting has a very high impact on overall emulation performance. Disabling this setting may yield a very substantial performance gain, but may cause some ROMs to stop working and cause other ROMs to show erratic behavior. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Makes more features available to the emulated hardware, but may affect ROM compatibility. May incur CPU usage, depending on which BIOS options are used. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBgAAAwwUAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDDAAAwtQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwtAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDtQAAwtwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDEQAAwmAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBoAAAwlgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDtQAAwqYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Enables the BIOS to use the ARM processor SWI routines. This is required for some ROMs to work properly. May CPU usage, depending on if the ROM uses the ARM SWIs. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Prevents the Delay SWI from running. This may reduce the SWI-related CPU usage for some ROMs, but may also affect ROM compatibility. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + For developer usage only. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + For developer usage only. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Uses an external firmware image, overriding the internally emulated firmware. To change your firmware settings, you must do so through the emulated environment. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBgAAAwoAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDDAAAwiAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwhwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDtQAAwmQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1362, 663}, {156, 293}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{855, 1063}, {194, 73}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{525, 802}, {197, 73}} + + ToolTip + + ToolTip + + Performs no sound interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABBgAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABDUQAAA + + + ToolTip + + ToolTip + + Enables the advanced SPU emulation engine, which improves the accuracy of the emulated sound. This option provides a richer audio experience. Medium CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDEQAAwggAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{508, 719}, {204, 63}} + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Lowest latency and lowest CPU usage sound synchronization method that is compatible with the advanced SPU emulation engine. However, this method causes sound distortion as emulation speed decreases below normal, and causes sound detail loss as emulation speed increases above normal. Very low latency. Very low CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Pitch bends the sound depending on the emulation speed. Provides the smoothest sound, regardless of emulation speed. High latency. Medium CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sounds like "Dual SPU Synch/Asynch," but is a little smoother and has some added latency. Medium latency. Low CPU usage. Recommended setting. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwxIAAA + + + ToolTip + + ToolTip + + Has the lowest latency of all the sound synchronization methods, but is not compatible with the advanced SPU emulation engine. Neglible latency. Negligible CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Enables the use of more complex sound synchronization methods. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCAAAAwngAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1089, 1023}, {198, 113}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1478, 1073}, {129, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Upon emulator execution, starts the firmware instead of the ROM. This will allow you access to some of the emulated hardware features. To boot from firmware, an external firmware image and both BIOS images must be loaded. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBgAAAwXAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{403, 460}, {720, 364}} + com.apple.InterfaceBuilder.CocoaPlugin + {{403, 460}, {720, 364}} + + + + {600, 9999} + {600, 250} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBUAAAw70AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDMAAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBYAAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDMQAAwogAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAw7sAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAw5sAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAw3YAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwzYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwuwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwlgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{550, 435}, {380, 200}} + com.apple.InterfaceBuilder.CocoaPlugin + {{550, 435}, {380, 200}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDqQAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAADBoAAAw5YAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwzIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDhwAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDEAAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwswAAA + + {{475, 1136}, {512, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + + {74, 862} + {{6, 978}, {478, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw6WAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{749, 883}, {315, 253}} + com.apple.InterfaceBuilder.CocoaPlugin + {{475, 832}, {234, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABChgAAweAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC6AAAwnwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABBsAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{619, 983}, {151, 153}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwgAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{344, 993}, {335, 163}} + com.apple.InterfaceBuilder.CocoaPlugin + {{344, 993}, {335, 163}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC5AAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDXAAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwswAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAADBgAAAww8AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAw10AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGoAABDXwAAA + + {{851, 193}, {640, 480}} + com.apple.InterfaceBuilder.CocoaPlugin + {{851, 193}, {640, 480}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBoAAAw8EAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC4gAAwiQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCRAAAxHyAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Enable to use bilinear interpolation on the final video output by default. This creates a smoothed, but slightly blurry, image effect. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC7gAAw72AAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Enable to use bilinear interpolation on the final video output. This creates a smoothed, but slightly blurry, image effect. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw+aAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1244, 702}, {256, 408}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1244, 702}, {256, 408}} + + {{33, 99}, {480, 360}} + + {3.40282e+38, 3.40282e+38} + {256, 408} + {{1295, 577}, {288, 511}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1295, 577}, {288, 511}} + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Enables the advanced SPU emulation engine, which improves the accuracy of the emulated sound. This option provides a richer audio experience. Medium CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw1oAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABDjQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABDBgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwqwAAA + + + ToolTip + + ToolTip + + Performs no interpolation. This method produces the most accurate sound compared to the real hardware. All sound detail is preserved, but some sounds may sound harsh due to the presence of high-end harmonics. No CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Smooths the sound and eliminates the harsh sounding harmonics, but also causes a significant loss of sound detail, especially in the high-end. Negligible CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Has the lowest latency of all the sound synchronization methods, but is not compatible with the advanced SPU emulation engine. Neglible latency. Negligible CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Enables the use of more complex sound synchronization methods. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Excellent sound quality, producing the best balance between smoothness and sound detail. Neglible CPU usage. Recommended setting. + + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABDwAAAA + + + ToolTip + + ToolTip + + Sets the current sound volume. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCRAAAw9IAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDLAAAwgAAAA + + + AUGgAABDyQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABD/wAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABChgAAwwAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + When set, SoftRasterizer will produce smoother color transitions than a standard DS. No CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDegAAxDLAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + When set, SoftRasterizer will emulate the DS toon edge marking. Very low CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDegAAxC3AAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + When set, SoftRasterizer will render fog effects. This may affect the atmospheric look of 3D scenes. Low CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDegAAxCjAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + When set, SoftRasterizer will render textures onto 3D surfaces. When not set, all 3D surfaces will be solid colored (usually white). Medium CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDegAAxCPAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + When set, SoftRasterizer will adjust the order of its polygon rendering. This may improve the look of some games, such as the appearance of shadows in "The Legend of Zelda: Spirit Tracks." No CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDOQAAwegAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwxYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGwAABDNwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABDTAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{1312, 630}, {284, 462}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1312, 630}, {284, 462}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCggAAwgwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUKUAABCwAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCCAAAwfgAAA + + + ToolTip + + ToolTip + + When set, SoftRasterizer will adjust the order of its polygon rendering. This may improve the look of some games, such as the appearance of shadows in "The Legend of Zelda: Spirit Tracks." No CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDVwAAwqIAAA + + + ToolTip + + ToolTip + + When set, SoftRasterizer will produce smoother color transitions than a standard DS. No CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCCAAAwuwAAA + + + ToolTip + + ToolTip + + When set, SoftRasterizer will emulate the DS toon edge marking. Very low CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCCAAAwsQAAA + + + ToolTip + + ToolTip + + When set, SoftRasterizer will render fog effects. This may affect the atmospheric look of 3D scenes. Low CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBgAAAwpYAAA + + + ToolTip + + ToolTip + + When set, SoftRasterizer will render textures onto 3D surfaces. When not set, all 3D surfaces will be solid colored (usually white). Medium CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCCAAAwmgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwkgAAA + + + ToolTip + + ToolTip + + Disables 3D rendering. No CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + DeSmuME's internal software 3D rendering engine. Very high CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the default 3D rendering engine for new DS display views. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDXAAAw5qAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{626, 935}, {161, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Disables 3D rendering. No CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + DeSmuME's internal software 3D rendering engine. Very high CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCmgAAw5kAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABCJAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwrQAAA + + + ToolTip + + ToolTip + + DeSmuME automatically chooses the best number of rendering threads based on your hardware. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Renders 3D on the same thread as the core emulation thread. Best performance option for single processor machines. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Renders 3D on two separate threads. May improve 3D performance on multiprocessor machines, but slightly reduces performance on single processor machines. + + + + ToolTip + + ToolTip + + Renders 3D on four separate threads. May improve 3D performance on multiprocessor machines, but significantly reduces performance on single processor machines. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Fixes some graphical bugs involving lines, but causes some other bugs. Not many games use lines. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the default number of processing threads that SoftRasterizer will use for 3D rendering. This is an option for advanced users. For most cases, it's best to keep this set to Automatic. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDegAAwrgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{881, 382}, {180, 83}} + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + DeSmuME automatically chooses the best number of rendering threads based on your hardware. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Renders 3D on the same thread as the core emulation thread by default. Best performance option for single processor machines. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Renders 3D on two separate threads by default. May improve 3D performance on multiprocessor machines, but slightly reduces performance on single processor machines. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Renders 3D on four separate threads by default. May improve 3D performance on multiprocessor machines, but significantly reduces performance on single processor machines. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABB4AAAwrIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUKUAABDcQAAA + + + ToolTip + + ToolTip + + Fixes some graphical bugs involving lines, but causes some other bugs. Not many games use lines. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBgAAAweAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1022, 773}, {101, 63}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCaAAAwowAAA + + + ToolTip + + ToolTip + + Lowest latency and lowest CPU usage sound synchronization method that is compatible with the advanced SPU emulation engine. However, this method causes sound distortion as emulation speed decreases below normal, and causes sound detail loss as emulation speed increases above normal. Very low latency. Very low CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Pitch bends the sound depending on the emulation speed. Provides the smoothest sound, regardless of emulation speed. High latency. Medium CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sounds like "Dual SPU Synch/Asynch," but is a little smoother and has some added latency. Medium latency. Low CPU usage. Recommended setting. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw68AAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sets the default audio output engine. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDIwAAw7CAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{1047, 994}, {220, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Disables audio output. No CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Native audio output engine for Mac OS X. Low CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCRAAAwkgAAA + + + ToolTip + + ToolTip + + Disables audio output. No CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Native audio output engine for Mac OS X. Low CPU usage. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABEEwAAA + + {{1326, 766}, {280, 396}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1326, 766}, {280, 396}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABD2oAAA + + + ToolTip + + ToolTip + + Greatly increases emulation accuracy, which improves the compatibility for most ROMs. This setting has a very high impact on overall emulation performance. Disabling this setting may yield a very substantial performance gain, but may cause some ROMs to stop working and cause other ROMs to show erratic behavior. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABDqYAAA + + + ToolTip + + ToolTip + + Makes more features available to the emulated hardware, but may affect ROM compatibility. May incur CPU usage, depending on which BIOS options are used. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Enables the BIOS to use the ARM processor SWI routines. This is required for some ROMs to work properly. May incur CPU usage, depending on if the ROM uses the ARM SWIs. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBgAAAwkAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Prevents the Delay SWI from running. This may reduce the SWI-related CPU usage for some ROMs, but may also affect ROM compatibility. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBgAAAweAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABC7gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCNAAAwgwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Uses an external firmware image, overriding the internally emulated firmware. To change your firmware settings, you must do so through the emulated environment. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwkAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Upon emulator execution, starts the firmware instead of the ROM. This will allow you access to some of the emulated hardware features. To boot from firmware, an external firmware image and both BIOS images must be loaded. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAweAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABCVAAAA + + + ToolTip + + ToolTip + + For developer usage only. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABB8AAAwrAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + For developer usage only. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCHAAAwjQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{1357, 426}, {260, 328}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDMAAAwp4AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwpIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Nicknames should be a maximum of 10 characters. Any additional characters will be truncated. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC3AAAw5kAAA + + + ToolTip + + ToolTip + + Messages should be a maximum of 26 characters. Any additional characters will be truncated. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC3AAAw4uAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw5eAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw4oAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw2UAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw0oAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwy4AAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AULcAABDOgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAww0AAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC1gAAwzEAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC1gAAw2gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{1453, 369}, {136, 291}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1336, 489}, {164, 105}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCVAAAwgwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{999, 665}, {305, 339}} + com.apple.InterfaceBuilder.CocoaPlugin + {{999, 665}, {305, 339}} + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Nicknames should be a maximum of 10 characters. Any additional characters will be truncated. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCugAAw3sAAA + + + ToolTip + + ToolTip + + Messages should be a maximum of 26 characters. Any additional characters will be truncated. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCugAAw1sAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw3gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwtoAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwwMAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwrIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwnQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AULuAABCkAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC6AAAwoAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC6AAAwwYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{1388, 295}, {172, 323}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1340, 591}, {172, 123}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDEgAAwtIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABAwAAAwuAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC0AAAwpIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCPAAAwiAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBoAAAwiAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUOxAABCKAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCwAAAw7iAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCwAAAw+UAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC3gAAw9EAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{728, 816}, {209, 71}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBgAAAw9EAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAw5KAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{652, 866}, {320, 290}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + AUI8AABCHAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw1UAAA + + + ToolTip + + ToolTip + + All addresses start with 0x02. Enter the last 6 digits of the address here in hexadecimal format. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDFwAAw28AAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCAAAAwzcAAA + + + ToolTip + + ToolTip + + Enter the numeric value to write to the target address. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCpAAAwzkAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCngAAw1QAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Select the memory size of the target address in bytes. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwrQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{936, 459}, {320, 290}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw7YAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBoAAAw6mAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAw8SAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AcFAAABDxAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDHAAAw7gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAw7gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{782, 197}, {320, 290}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBsAAAwvIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AULKAABDDgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBoAAAw0QAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw1oAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC9AAAw2oAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Shows/hides the address search drawer. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDNgAAw4aAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Resets the memory address search. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDaQAAw18AAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{316, 1022}, {328, 134}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1183, 775}, {328, 134}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwoQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwhwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDIwAAwoQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDIwAAwhwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwuAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwsQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwvAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwtQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBoAAAwhQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDaQAAwqAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{322, 680}, {328, 134}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC6AAAwqAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwsQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwuAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AQAAAABDXQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC7AAAxALAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{466, 1100}, {136, 37}} + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Searches the DS memory for all addresses that currently carry the search value. + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Searches the DS memory for any addresses which match the comparative search criteria. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCMAAAxAIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCMAAAw/gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{926, 1043}, {224, 93}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDBQAAw8KAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{1313, 1005}, {209, 37}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDXAAAw2sAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABDVwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwjAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDqAAAwpIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABB0AAAwiwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwnAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwlQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Immediately writes the value once to the target address. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDRQAAw10AAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{330, 277}, {500, 416}} + com.apple.InterfaceBuilder.CocoaPlugin + {{330, 277}, {500, 416}} + + + {500, 272} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAAC/gAAAw+cAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDgYAAw+gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBYAAAwswAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDAAAAwswAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDwwAAwswAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDkwAAwswAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDvIAAw/SAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw+iAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDCwAAw86AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDywAAw8MAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCpAAAw9CAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwYgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AcK4AABC0gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwiAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABB0AAAwiwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDqAAAwpIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwjAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGwAABChAAAA + + + ToolTip + + ToolTip + + Whenever DeSmuME needs to determine a ROM's save type, use the ADVANsCEne database to determine the save type before using the internal autodetect algorithm. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBgAAAweAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBAAAAwfgAAA + + + ToolTip + + ToolTip + + Activates the DS's debugger mode. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAADDAAAAwegAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{855, 920}, {64, 6}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{855, 900}, {64, 6}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + New display views will show only the main DS screen by default. + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{993, 983}, {178, 93}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{993, 963}, {118, 113}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUDAAABDUwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCWAAAwy4AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwegAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDDwAAwgAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{1135, 301}, {119, 113}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + The default display separation for new DS combo display views. A custom separation may be entered here. (The value must be between 0% and 100%.) + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDiQAAwfgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUFwAABCUAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUNQAABCxAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{583, 356}, {500, 500}} + com.apple.InterfaceBuilder.CocoaPlugin + {{583, 356}, {500, 500}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDGQAAw+QAAA + + + InitialTabViewItem + + InitialTabViewItem + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBUAAAw7wAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDCwAAw8sAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDCwAAw9eAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDCwAAw/CAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDCwAAw/0AAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGgAABDvgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAADBiAAAw56AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAADAQAAAw56AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAADCHAAAw56AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAADBYAAAw56AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1162, 787}, {350, 35}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCGAAAwgwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDMAAAwiQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{1327, 695}, {126, 123}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{487, 953}, {203, 183}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{23, 794}, {245, 183}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + InitialTabViewItem + + InitialTabViewItem + + + + + {{330, 736}, {614, 409}} + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBUAAAw9CAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Activates the emulator's debug mode. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAADDAAAAwegAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBAAAAwfgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwjQAAA + + + ToolTip + + ToolTip + + Simulates the closing and opening of the DS lid. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw6wAAA + + + ToolTip + + ToolTip + + Sets the DS controller's Up button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw6aAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwggAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwmwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwqgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwtoAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwwYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAw1EAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDAgAAw5gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAwzgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAw2oAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAw4GAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAw44AAA + + {{663, 933}, {218, 203}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC+gAAw6eAAA + + + ToolTip + + ToolTip + + Sets the DS controller's A button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw46AAA + + + ToolTip + + ToolTip + + Sets the DS controller's Down button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCUAAAxEaAAA + + + ToolTip + + ToolTip + + Sets the DS controller's Left button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCUAAAxEBAAA + + + ToolTip + + ToolTip + + Sets the DS controller's Right button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw2gAAA + + + ToolTip + + ToolTip + + Sets the DS controller's B button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCUAAAxC2AAA + + + ToolTip + + ToolTip + + Sets the DS controller's X button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw2sAAA + + + ToolTip + + ToolTip + + Sets the DS controller's Y button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCUAAAxCEAAA + + + ToolTip + + ToolTip + + Sets the DS controller's L button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCUAAAxBrAAA + + + ToolTip + + ToolTip + + Sets the DS controller's R button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwqQAAA + + + ToolTip + + ToolTip + + Sets the DS controller's Start button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCUAAAxA5AAA + + + ToolTip + + ToolTip + + Sets the DS controller's Select button. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwiwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw7MAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwhQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCMAAAwhQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUFgAABDPAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUFgAABAoAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDGQAAw6gAAA + + + ToolTip + + ToolTip + + Sets the microphone activation hotkey. Whenever this hotkey is pressed, the emulator will accept sound input. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw6cAAA + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDVwAAwegAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBgAAAwsoAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGQAABC2AAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCjgAAwxgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwxUAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{443, 824}, {414, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDxAAAwggAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABChgAAwggAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDJwAAwrQAAA + + + ToolTip + + ToolTip + + Use a physical microphone or other other sound input device connected to your Mac. [NOT YET IMPLEMENTED IN THIS VERSION] + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Predefined noise samples that simulate sounds like blowing into the microphone. (Some games, such as "The Legend of Zelda: Spirit Tracks," work especially well with this.) + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Randomly generated white noise that simulates sounds like blowing into the microphone. May also be useful if a game needs you to speak into the microphone. + + + + ToolTip + + ToolTip + + Use a sound file. (Whenever the microphone is activated, the sound will begin at the start of the file.) [NOT YET IMPLEMENTED IN THIS VERSION] + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Sends the Reset command to the emulator. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw0MAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDGQAAw0UAAA + + + ToolTip + + ToolTip + + Sends the Pause command to the emulator. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw14AAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDGQAAw2AAAA + + + ToolTip + + ToolTip + + Sends the Execute command to the emulator. + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw3kAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDGQAAw3sAAA + + + ToolTip + + ToolTip + + Sets the hotkey to toggle the HUD. (Holding down the hotkey will toggle the HUD visible state. For example, if the HUD is normally hidden, and you press this hotkey, the HUD will show until the hotkey is released.) + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw4oAAA + + + ToolTip + + ToolTip + + Sets the hotkey to double the emulation speed. (The emulation speed is affected only while the hotkey is held down. When the hotkey is released, the emulation speed reverts back to its previous speed.) + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw5cAAA + + + ToolTip + + ToolTip + + Sets the hotkey to halve the emulation speed. (The emulation speed is affected only while the hotkey is held down. When the hotkey is released, the emulation speed reverts back to its previous speed.) + + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw6SAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDGQAAw6WAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDGQAAw4sAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDGQAAw5gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1040, 712}, {450, 35}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDMAAAwiQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCGAAAwgwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1224, 680}, {232, 63}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCxAAAwxMAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{799, 1053}, {257, 83}} + com.apple.InterfaceBuilder.CocoaPlugin + {{609, 360}, {400, 100}} + com.apple.InterfaceBuilder.CocoaPlugin + {{609, 360}, {400, 100}} + + com.apple.InterfaceBuilder.CocoaPlugin + {{501, 460}, {616, 0}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{507, 779}, {616, 0}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABAQAAAwjAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC/AAAwZgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwYgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AULcAAA/gAAAA + + {{1191, 651}, {328, 434}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{993, 933}, {136, 163}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1332, 1013}, {70, 103}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + {{1103, 481}, {194, 241}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1103, 481}, {194, 241}} + + + com.apple.InterfaceBuilder.CocoaPlugin + {{1069, 659}, {204, 481}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1069, 659}, {204, 481}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + {{577, 833}, {262, 303}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{145, 474}, {199, 203}} + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwz4AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwyoAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwxYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwwIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwtwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwrQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwowAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBoAAAwgwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBuAAAwgwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1040, 472}, {580, 588}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1040, 472}, {580, 588}} + + com.apple.InterfaceBuilder.CocoaPlugin + + AUFgAABEAIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUMaAABDgwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABBgAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUOSgABDYAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUOSgABCxAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUOSgABBgAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwuQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwrIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwoAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwegAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAw+gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAw0wAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwzYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwyAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwwoAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwugAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwrwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwpAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwkgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDZwAAwzQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAw6IAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAw4IAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDZwAAwx4AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDZwAAwwgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDZwAAwuQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDZwAAwrgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDZwAAwowAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDZwAAwkAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDZwAAwdAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAw0QAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwwQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwogAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwvAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDWwAAwrgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwp4AAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDWwAAwowAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwlgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDWwAAwkAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwegAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDWwAAwdAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwpoAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDWwAAwkAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwdAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDWwAAwdAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1362, 1043}, {118, 93}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1089, 663}, {467, 135}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1089, 663}, {467, 135}} + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 6125 + + + + + AppDelegate + NSObject + + id + id + id + id + id + id + + + + bugReport: + id + + + handleMigrationWindow: + id + + + launchForums: + id + + + launchWebsite: + id + + + showMigrationWindow: + id + + + showSupportFolderInFinder: + id + + + + NSObjectController + NSBox + NSBox + NSBox + NSBox + NSBox + NSObjectController + NSWindow + NSObjectController + NSObjectController + NSArrayController + InputPrefsView + NSMenu + NSMenu + NSWindow + NSWindow + NSView + NSWindow + NSObjectController + + + + aboutWindowController + NSObjectController + + + boxARMBinaries + NSBox + + + boxFileSystem + NSBox + + + boxGeneralInfo + NSBox + + + boxMisc + NSBox + + + boxTitles + NSBox + + + cdsCoreController + NSObjectController + + + cheatListWindow + NSWindow + + + cheatWindowController + NSObjectController + + + emuWindowController + NSObjectController + + + fileMigrationList + NSArrayController + + + inputPrefsView + InputPrefsView + + + mLoadStateSlot + NSMenu + + + mSaveStateSlot + NSMenu + + + mainWindow + NSWindow + + + migrationWindow + NSWindow + + + prefGeneralView + NSView + + + prefWindow + NSWindow + + + prefWindowController + NSObjectController + + + + IBProjectSource + userinterface/appDelegate.h + + + + CheatWindowDelegate + NSObject + + id + id + id + id + id + id + id + id + id + id + id + id + id + + + + addToList: + id + + + applyConfiguration: + id + + + closeCheatDatabaseSheet: + id + + + removeFromList: + id + + + resetSearch: + id + + + runComparativeSearch: + id + + + runExactValueSearch: + id + + + selectAllCheatsInDatabase: + id + + + selectCheatSearchStyle: + id + + + selectCheatType: + id + + + selectNoneCheatsInDatabase: + id + + + setInternalCheatValue: + id + + + viewDatabase: + id + + + + NSBox + NSArrayController + NSWindow + NSArrayController + NSTableView + NSArrayController + NSTableView + NSView + NSObjectController + NSObjectController + NSSearchField + NSView + NSView + NSView + NSView + NSView + NSView + NSView + NSView + NSWindow + + + + cheatConfigBox + NSBox + + + cheatDatabaseController + NSArrayController + + + cheatDatabaseSheet + NSWindow + + + cheatListController + NSArrayController + + + cheatListTable + NSTableView + + + cheatSearchListController + NSArrayController + + + cheatSearchListTable + NSTableView + + + cheatSearchView + NSView + + + cheatSelectedItemController + NSObjectController + + + cheatWindowController + NSObjectController + + + searchField + NSSearchField + + + viewConfigureActionReplayCheat + NSView + + + viewConfigureCodeBreakerCheat + NSView + + + viewConfigureInternalCheat + NSView + + + viewConfigureNoSelection + NSView + + + viewSearchComparativeContinue + NSView + + + viewSearchComparativeStart + NSView + + + viewSearchExactValue + NSView + + + viewSearchNoSelection + NSView + + + window + NSWindow + + + + IBProjectSource + userinterface/cheatWindowDelegate.h + + + + EmuWindowDelegate + NSObject + + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + + + + change3DRenderDepthComparisonThreshold: + id + + + change3DRenderEdgeMarking: + id + + + change3DRenderFog: + id + + + change3DRenderHighPrecisionColorInterpolation: + id + + + change3DRenderLineHack: + id + + + change3DRenderMethod: + id + + + change3DRenderTextures: + id + + + change3DRenderThreads: + id + + + changeAudioEngine: + id + + + changeBilinearOutput: + id + + + changeCoreEmuFlags: + id + + + changeCoreSpeed: + id + + + changeDisplayMode: + id + + + changeFirmwareSettings: + id + + + changeRomSaveType: + id + + + changeRotation: + id + + + changeRotationRelative: + id + + + changeScale: + id + + + changeSpuAdvancedLogic: + id + + + changeSpuInterpolationMode: + id + + + changeSpuSyncMethod: + id + + + changeSpuSyncMode: + id + + + changeVideoFilter: + id + + + changeVolume: + id + + + cheatsDisable: + id + + + closeMigrationSheet: + id + + + closeRom: + id + + + copy: + id + + + ejectCard: + id + + + executeCoreToggle: + id + + + exportRomSave: + id + + + hudDisable: + id + + + importRomSave: + id + + + loadEmuSaveStateSlot: + id + + + openEmuSaveState: + id + + + openRom: + id + + + resetCore: + id + + + revertEmuSaveState: + id + + + saveEmuSaveState: + id + + + saveEmuSaveStateAs: + id + + + saveEmuSaveStateSlot: + id + + + saveScreenshotAs: + id + + + selectExportRomSaveFormat: + id + + + selectScreenshotFileFormat: + id + + + speedLimitDisable: + id + + + toggleAutoFrameSkip: + id + + + toggleGPUState: + id + + + toggleKeepMinDisplaySizeAtNormal: + id + + + toggleStatusBar: + id + + + writeDefaults3DRenderingSettings: + id + + + writeDefaultsDisplayRotation: + id + + + writeDefaultsEmulationSettings: + id + + + writeDefaultsHUDSettings: + id + + + writeDefaultsSoundSettings: + id + + + writeDefaultsVideoOutputSettings: + id + + + + NSObjectController + NSObjectController + NSObjectController + NSArrayController + NSArrayController + NSObjectController + CheatWindowDelegate + NSView + NSObjectController + NSView + NSObjectController + NSObjectController + NSWindow + NSView + NSWindow + NSWindow + + + + cdsCoreController + NSObjectController + + + cdsDisplayController + NSObjectController + + + cdsSoundController + NSObjectController + + + cheatDatabaseController + NSArrayController + + + cheatListController + NSArrayController + + + cheatWindowController + NSObjectController + + + cheatWindowDelegate + CheatWindowDelegate + + + displayView + NSView + + + emuWindowController + NSObjectController + + + exportRomSavePanelAccessoryView + NSView + + + firmwarePanelController + NSObjectController + + + romInfoPanelController + NSObjectController + + + saveFileMigrationSheet + NSWindow + + + saveScreenshotPanelAccessoryView + NSView + + + saveStatePrecloseSheet + NSWindow + + + window + NSWindow + + + + IBProjectSource + userinterface/emuWindowDelegate.h + + + + InputPrefsView + NSView + + inputButtonSet: + id + + + inputButtonSet: + + inputButtonSet: + id + + + + prefWindow + NSWindow + + + prefWindow + + prefWindow + NSWindow + + + + IBProjectSource + userinterface/inputPrefsView.h + + + + OpenGLDisplayView + NSOpenGLView + + IBProjectSource + userinterface/displayView.h + + + + PreferencesWindowDelegate + NSObject + + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + + + + chooseARM7BiosImage: + id + + + chooseARM9BiosImage: + id + + + chooseAdvansceneDatabase: + id + + + chooseCheatDatabase: + id + + + chooseFirmwareImage: + id + + + chooseRomForAutoload: + id + + + closeFirmwareConfigSheet: + id + + + configureInternalFirmware: + id + + + selectAutoloadRomOption: + id + + + selectDisplayMode: + id + + + selectDisplayRotation: + id + + + selectDisplaySize: + id + + + selectSPUSyncMethod: + id + + + selectSPUSyncMode: + id + + + selectSoundInputMode: + id + + + selectVideoFilterType: + id + + + setUseBilinear: + id + + + showDisplayView: + id + + + showEmulationView: + id + + + showGeneralView: + id + + + showInputView: + id + + + showSoundView: + id + + + updateVolumeIcon: + id + + + + NSObjectController + NSArrayController + NSObjectController + NSTextField + NSPopUpButton + NSMenuItem + NSObjectController + NSWindow + NSObjectController + NSImageView + NSPopUpButton + NSView + NSView + NSView + InputPrefsView + NSView + NSWindow + + + + cdsCoreController + NSObjectController + + + cheatDatabaseController + NSArrayController + + + cheatWindowController + NSObjectController + + + displayRotationField + NSTextField + + + displayRotationMenu + NSPopUpButton + + + displayRotationMenuCustomItem + NSMenuItem + + + emuWindowController + NSObjectController + + + firmwareConfigSheet + NSWindow + + + prefWindowController + NSObjectController + + + previewImageView + NSImageView + + + spuSyncMethodMenu + NSPopUpButton + + + viewDisplay + NSView + + + viewEmulation + NSView + + + viewGeneral + NSView + + + viewInput + InputPrefsView + + + viewSound + NSView + + + window + NSWindow + + + + IBProjectSource + userinterface/preferencesWindowDelegate.h + + + + + + NSActionCell + NSCell + + IBFrameworkSource + AppKit.framework/Headers/NSActionCell.h + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSApplicationScripting.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSColorPanel.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSHelpManager.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSPageLayout.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSUserInterfaceItemSearching.h + + + + NSArrayController + NSObjectController + + IBFrameworkSource + AppKit.framework/Headers/NSArrayController.h + + + + NSBox + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSBox.h + + + + NSBrowser + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSBrowser.h + + + + NSButton + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSButton.h + + + + NSButtonCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSButtonCell.h + + + + NSCell + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSCell.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSController + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSController.h + + + + NSDatePicker + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSDatePicker.h + + + + NSDatePickerCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSDatePickerCell.h + + + + NSDocumentController + NSObject + + id + id + id + id + + + + clearRecentDocuments: + id + + + newDocument: + id + + + openDocument: + id + + + saveAllDocuments: + id + + + + IBFrameworkSource + AppKit.framework/Headers/NSDocumentController.h + + + + NSDrawer + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSDrawer.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSImageCell + NSCell + + IBFrameworkSource + AppKit.framework/Headers/NSImageCell.h + + + + NSImageView + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSImageView.h + + + + NSLevelIndicator + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSLevelIndicator.h + + + + NSLevelIndicatorCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSLevelIndicatorCell.h + + + + NSMatrix + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSMatrix.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSMenuItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSMenuItemCell + NSButtonCell + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItemCell.h + + + + NSMovieView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSMovieView.h + + + + NSNumberFormatter + NSFormatter + + IBFrameworkSource + Foundation.framework/Headers/NSNumberFormatter.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAccessibility.h + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDictionaryController.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDragging.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontManager.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontPanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSKeyValueBinding.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSNibLoading.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSOutlineView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSPasteboard.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSavePanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbarItem.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObjectScripting.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSPortCoder.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptObjectSpecifiers.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptWhoseTests.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLDownload.h + + + + NSObjectController + NSController + + IBFrameworkSource + AppKit.framework/Headers/NSObjectController.h + + + + NSOpenGLView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSOpenGLView.h + + + + NSPanel + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSPanel.h + + + + NSPopUpButton + NSButton + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButton.h + + + + NSPopUpButtonCell + NSMenuItemCell + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButtonCell.h + + + + NSProgressIndicator + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSProgressIndicator.h + + + + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSInterfaceStyle.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSScrollView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSScrollView.h + + + + NSScroller + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSScroller.h + + + + NSSearchField + NSTextField + + IBFrameworkSource + AppKit.framework/Headers/NSSearchField.h + + + + NSSearchFieldCell + NSTextFieldCell + + IBFrameworkSource + AppKit.framework/Headers/NSSearchFieldCell.h + + + + NSSlider + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSSlider.h + + + + NSSliderCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSSliderCell.h + + + + NSTabView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSTabView.h + + + + NSTabViewItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTabViewItem.h + + + + NSTableColumn + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableColumn.h + + + + NSTableHeaderView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSTableHeaderView.h + + + + NSTableView + NSControl + + + + NSText + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSText.h + + + + NSTextField + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSTextField.h + + + + NSTextFieldCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSTextFieldCell.h + + + + NSTextView + NSText + + IBFrameworkSource + AppKit.framework/Headers/NSTextView.h + + + + NSToolbar + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbar.h + + + + NSToolbarItem + NSObject + + + + NSUserDefaultsController + NSController + + IBFrameworkSource + AppKit.framework/Headers/NSUserDefaultsController.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSClipView.h + + + + NSView + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSRulerView.h + + + + NSView + NSResponder + + + + NSWindow + + + + NSWindow + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSWindowScripting.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + YES + ../../DeSmuME (XCode 3).xcodeproj + 3 + + {16, 16} + {16, 16} + {16, 16} + {16, 16} + {16, 16} + {16, 16} + {16, 16} + {16, 16} + {16, 16} + {16, 16} + {16, 16} + {16, 16} + {16, 16} + {16, 16} + {16, 16} + {16, 16} + {32, 32} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {128, 128} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {32, 32} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {20, 20} + {15, 15} + {8, 8} + {128, 128} + {9, 8} + {7, 2} + {32, 32} + {16, 15} + {8, 8} + {15, 15} + + + diff --git a/desmume/src/cocoa/userinterface/appDelegate.h b/desmume/src/cocoa/userinterface/appDelegate.h new file mode 100644 index 000000000..5f33f713f --- /dev/null +++ b/desmume/src/cocoa/userinterface/appDelegate.h @@ -0,0 +1,104 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import + +@class InputPrefsView; +@class CocoaHIDManager; + + +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 +@interface AppDelegate : NSObject +#else +@interface AppDelegate : NSObject +#endif +{ + NSObject *dummyObject; + NSArrayController *fileMigrationList; + NSObjectController *aboutWindowController; + NSObjectController *emuWindowController; + NSObjectController *prefWindowController; + NSObjectController *cheatWindowController; + NSObjectController *cdsCoreController; + + NSWindow *mainWindow; + NSWindow *prefWindow; + NSWindow *cheatListWindow; + NSWindow *migrationWindow; + NSView *prefGeneralView; + InputPrefsView *inputPrefsView; + + NSMenu *mLoadStateSlot; + NSMenu *mSaveStateSlot; + + NSBox *boxGeneralInfo; + NSBox *boxTitles; + NSBox *boxARMBinaries; + NSBox *boxFileSystem; + NSBox *boxMisc; + + CocoaHIDManager *hidManager; + BOOL migrationFilesPresent; +} + +@property (readonly) IBOutlet NSObject *dummyObject; +@property (readonly) IBOutlet NSArrayController *fileMigrationList; +@property (readonly) IBOutlet NSObjectController *aboutWindowController; +@property (readonly) IBOutlet NSObjectController *emuWindowController; +@property (readonly) IBOutlet NSObjectController *prefWindowController; +@property (readonly) IBOutlet NSObjectController *cheatWindowController; +@property (readonly) IBOutlet NSObjectController *cdsCoreController; +@property (readonly) IBOutlet NSWindow *mainWindow; +@property (readonly) IBOutlet NSWindow *prefWindow; +@property (readonly) IBOutlet NSWindow *cheatListWindow; +@property (readonly) IBOutlet NSWindow *migrationWindow; +@property (readonly) IBOutlet NSView *prefGeneralView; +@property (readonly) IBOutlet NSMenu *mLoadStateSlot; +@property (readonly) IBOutlet NSMenu *mSaveStateSlot; +@property (readonly) IBOutlet InputPrefsView *inputPrefsView; + +@property (readonly) IBOutlet NSBox *boxGeneralInfo; +@property (readonly) IBOutlet NSBox *boxTitles; +@property (readonly) IBOutlet NSBox *boxARMBinaries; +@property (readonly) IBOutlet NSBox *boxFileSystem; +@property (readonly) IBOutlet NSBox *boxMisc; + +@property (retain) CocoaHIDManager *hidManager; +@property (assign) BOOL migrationFilesPresent; + +// Emulation Menu + +// View Menu + +// Tools Menu +- (IBAction) showSupportFolderInFinder:(id)sender; + +// Help Menu +- (IBAction) launchWebsite:(id)sender; +- (IBAction) launchForums:(id)sender; +- (IBAction) bugReport:(id)sender; + +- (void) setupSlotMenuItems; +- (NSMenuItem *) addSlotMenuItem:(NSMenu *)menu slotNumber:(NSUInteger)slotNumber; +- (void) setupUserDefaults; +- (void) updateInputDisplayFields; +- (IBAction) showMigrationWindow:(id)sender; +- (IBAction) handleMigrationWindow:(id)sender; +- (void) setRomInfoPanelBoxTitleColors; + +@end diff --git a/desmume/src/cocoa/userinterface/appDelegate.mm b/desmume/src/cocoa/userinterface/appDelegate.mm new file mode 100644 index 000000000..3e010f6ba --- /dev/null +++ b/desmume/src/cocoa/userinterface/appDelegate.mm @@ -0,0 +1,589 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "appDelegate.h" +#import "emuWindowDelegate.h" +#import "preferencesWindowDelegate.h" +#import "cheatWindowDelegate.h" +#import "displayView.h" +#import "inputPrefsView.h" + +#import "cocoa_core.h" +#import "cocoa_file.h" +#import "cocoa_firmware.h" +#import "cocoa_globals.h" +#import "cocoa_hid.h" +#import "cocoa_input.h" +#import "cocoa_mic.h" + + +@implementation AppDelegate + +@dynamic dummyObject; +@synthesize mainWindow; +@synthesize prefWindow; +@synthesize cheatListWindow; +@synthesize migrationWindow; +@synthesize prefGeneralView; +@synthesize mLoadStateSlot; +@synthesize mSaveStateSlot; +@synthesize inputPrefsView; +@synthesize fileMigrationList; +@synthesize aboutWindowController; +@synthesize emuWindowController; +@synthesize prefWindowController; +@synthesize cdsCoreController; +@synthesize cheatWindowController; + +@synthesize boxGeneralInfo; +@synthesize boxTitles; +@synthesize boxARMBinaries; +@synthesize boxFileSystem; +@synthesize boxMisc; + +@synthesize hidManager; +@synthesize migrationFilesPresent; + +- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename +{ + BOOL result = NO; + NSURL *fileURL = [NSURL fileURLWithPath:filename]; + EmuWindowDelegate *mainWindowDelegate = [mainWindow delegate]; + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + + if (cdsCore == nil) + { + return result; + } + + NSString *fileKind = [CocoaDSFile fileKindByURL:fileURL]; + if ([fileKind isEqualToString:@"ROM"]) + { + result = [mainWindowDelegate handleLoadRom:fileURL]; + if ([mainWindowDelegate isShowingSaveStateSheet] || [mainWindowDelegate isShowingFileMigrationSheet]) + { + // Just reply YES if a sheet is showing, even if the ROM hasn't actually been loaded yet. + // This will prevent the error dialog from showing, which is the intended behavior in + // this case. + result = YES; + } + } + + return result; +} + +- (void)applicationWillFinishLaunching:(NSNotification *)notification +{ + EmuWindowDelegate *mainWindowDelegate = [mainWindow delegate]; + PreferencesWindowDelegate *prefWindowDelegate = [prefWindow delegate]; + CheatWindowDelegate *cheatWindowDelegate = [cheatListWindow delegate]; + + // Create the needed directories in Application Support if they haven't already + // been created. + if (![CocoaDSFile setupAllAppDirectories]) + { + // Need to show a modal dialog here. + return; + } + + [CocoaDSFile setupAllFilePaths]; + + // Setup the About window. + NSMutableDictionary *aboutWindowProperties = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [[NSBundle mainBundle] pathForResource:@FILENAME_README ofType:@""], @"readMePath", + [[NSBundle mainBundle] pathForResource:@FILENAME_COPYING ofType:@""], @"licensePath", + [[NSBundle mainBundle] pathForResource:@FILENAME_AUTHORS ofType:@""], @"authorsPath", + [[NSBundle mainBundle] pathForResource:@FILENAME_CHANGELOG ofType:@""], @"changeLogPath", + [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], @"versionString", + @__DATE__, @"dateString", + nil]; + + [aboutWindowController setContent:aboutWindowProperties]; + + // Register the application's defaults. + NSDictionary *prefsDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserPrefs" ofType:@"plist"]]; + if (prefsDict == nil) + { + [[NSAlert alertWithMessageText:NSSTRING_ALERT_CRITICAL_FILE_MISSING_PRI defaultButton:nil alternateButton:nil otherButton:nil informativeTextWithFormat:NSSTRING_ALERT_CRITICAL_FILE_MISSING_SEC] runModal]; + [NSApp terminate: nil]; + return; + } + + [[NSUserDefaults standardUserDefaults] registerDefaults:prefsDict]; + + // Change the title colors of the NSBox objects in the ROM Info panel. We change the + // colors manually here because you can't change them in Interface Builder. Boo!!! + [self setRomInfoPanelBoxTitleColors]; + + // Set up all the object controllers according to our default windows. + [emuWindowController setContent:[mainWindowDelegate bindings]]; + [prefWindowController setContent:[prefWindowDelegate bindings]]; + [cheatWindowController setContent:[cheatWindowDelegate bindings]]; + + // Set the preferences window to the general view by default. + [prefWindowDelegate switchContentView:prefGeneralView]; + + // Setup the slot menu items. We set this up manually instead of through Interface + // Builder because we're assuming an arbitrary number of slot items. + [self setupSlotMenuItems]; + + // Setup the HID Input manager. + [self setHidManager:[[[CocoaHIDManager alloc] init] autorelease]]; + + // Set the display view delegate. + DisplayViewDelegate *newDispViewDelegate = [[DisplayViewDelegate alloc] init]; + [newDispViewDelegate setView:[mainWindowDelegate displayView]]; + [mainWindowDelegate setDispViewDelegate:newDispViewDelegate]; + [[mainWindowDelegate displayView] setDispViewDelegate:newDispViewDelegate]; + + // Init the DS emulation core. + CocoaDSCore *newCore = [[[CocoaDSCore alloc] init] autorelease]; + [cdsCoreController setContent:newCore]; + + // Init the DS controller and microphone. + CocoaDSController *newController = [[[CocoaDSController alloc] init] autorelease]; + [newCore setCdsController:newController]; + [inputPrefsView setCdsController:newController]; + [newDispViewDelegate setCdsController:newController]; + + // Init the DS displays. + CocoaDSDisplay *newComboDisplay = [[[CocoaDSDisplay alloc] init] autorelease]; + [newComboDisplay setDelegate:newDispViewDelegate]; + [newCore addOutput:newComboDisplay]; + NSPort *guiPort = [NSPort port]; + [[NSRunLoop currentRunLoop] addPort:guiPort forMode:NSDefaultRunLoopMode]; + + // Init the DS speakers. + CocoaDSSpeaker *newSpeaker = [[[CocoaDSSpeaker alloc] init] autorelease]; + [newCore addOutput:newSpeaker]; + [mainWindowDelegate setCdsSpeaker:newSpeaker]; + + // Start the core thread. + [NSThread detachNewThreadSelector:@selector(runThread:) toTarget:newCore withObject:nil]; + + // Wait until the emulation core has finished starting up. + while (!([CocoaDSCore isCoreStarted] && [newCore thread] != nil)) + { + [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; + } + + // Start up the threads for our outputs. + [NSThread detachNewThreadSelector:@selector(runThread:) toTarget:newComboDisplay withObject:nil]; + [NSThread detachNewThreadSelector:@selector(runThread:) toTarget:newSpeaker withObject:nil]; + + // Wait until the GPU and SPU are finished starting up. + while (!([CocoaDSSpeaker isSPUStarted] && + [newComboDisplay thread] != nil && [newSpeaker thread] != nil)) + { + [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; + } + + // Setup the applications settings from the user defaults file. + [self setupUserDefaults]; + + // Setup the window display view. + [[mainWindowDelegate displayView] setNextResponder:mainWindow]; +} + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + EmuWindowDelegate *mainWindowDelegate = [mainWindow delegate]; + + // Load a new ROM on launch per user preferences. + BOOL loadROMOnLaunch = [[NSUserDefaults standardUserDefaults] boolForKey:@"General_AutoloadROMOnLaunch"]; + if (loadROMOnLaunch && ![mainWindowDelegate isRomLoaded]) + { + NSInteger autoloadRomOption = [[NSUserDefaults standardUserDefaults] integerForKey:@"General_AutoloadROMOption"]; + NSURL *autoloadRomURL = nil; + + if (autoloadRomOption == ROMAUTOLOADOPTION_LOAD_LAST) + { + autoloadRomURL = [CocoaDSFile lastLoadedRomURL]; + } + else if(autoloadRomOption == ROMAUTOLOADOPTION_LOAD_SELECTED) + { + NSString *autoloadRomPath = [[NSUserDefaults standardUserDefaults] stringForKey:@"General_AutoloadROMSelectedPath"]; + if (autoloadRomPath != nil && [autoloadRomPath length] > 0) + { + autoloadRomURL = [NSURL fileURLWithPath:autoloadRomPath]; + } + } + + if (autoloadRomURL != nil) + { + [mainWindowDelegate handleLoadRom:autoloadRomURL]; + } + } + + // Make the display view black. + [[mainWindowDelegate dispViewDelegate] setViewToBlack]; + + //Bring the application to the front + [NSApp activateIgnoringOtherApps:TRUE]; + [mainWindow makeKeyAndOrderFront:nil]; + [mainWindow makeMainWindow]; + + // Present the file migration window to the user (if they haven't disabled it). + [self setMigrationFilesPresent:NO]; + if (![[NSUserDefaults standardUserDefaults] boolForKey:@"General_DoNotAskMigrate"]) + { + [self showMigrationWindow:nil]; + } +} + +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender +{ + EmuWindowDelegate *mainWindowDelegate = [mainWindow delegate]; + + // If a file needs to be saved, give the user a chance to save it + // before quitting. + BOOL didRomClose = [mainWindowDelegate handleUnloadRom:REASONFORCLOSE_TERMINATE romToLoad:nil]; + if (!didRomClose) + { + if ([mainWindowDelegate isShowingSaveStateSheet]) + { + return NSTerminateLater; + } + } + + // Either there wasn't a file that needed to be saved, or there + // wasn't anything loaded. Just continue program termination normally. + return NSTerminateNow; +} + +- (void)applicationWillTerminate:(NSNotification *)notification +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + + if (cdsCore != nil) + { + [cdsCore setCoreState:CORESTATE_PAUSE]; + [cdsCore removeAllOutputs]; + [cdsCoreController setContent:nil]; + } +} + +- (IBAction) showSupportFolderInFinder:(id)sender +{ + NSURL *folderURL = [CocoaDSFile userAppSupportBaseURL]; + + [[NSWorkspace sharedWorkspace] openFile:[folderURL path] withApplication:@"Finder"]; +} + +- (IBAction) launchWebsite:(id)sender +{ + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@STRING_DESMUME_WEBSITE]]; +} + +- (IBAction) launchForums:(id)sender +{ + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@STRING_DESMUME_FORUM_SITE]]; +} + +- (IBAction) bugReport:(id)sender +{ + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@STRING_DESMUME_BUG_SITE]]; +} + +- (void) setupSlotMenuItems +{ + NSInteger i; + NSMenuItem *loadItem = nil; + NSMenuItem *saveItem = nil; + + for(i = 0; i < MAX_SAVESTATE_SLOTS; i++) + { + loadItem = [self addSlotMenuItem:mLoadStateSlot slotNumber:(NSUInteger)(i + 1)]; + [loadItem setKeyEquivalentModifierMask:0]; + [loadItem setTag:i]; + [loadItem setAction:@selector(loadEmuSaveStateSlot:)]; + + saveItem = [self addSlotMenuItem:mSaveStateSlot slotNumber:(NSUInteger)(i + 1)]; + [saveItem setKeyEquivalentModifierMask:NSShiftKeyMask]; + [saveItem setTag:i]; + [saveItem setAction:@selector(saveEmuSaveStateSlot:)]; + } +} + +- (NSMenuItem *) addSlotMenuItem:(NSMenu *)menu slotNumber:(NSUInteger)slotNumber +{ + NSUInteger slotNumberKey = slotNumber; + + if (slotNumber == 10) + { + slotNumberKey = 0; + } + + NSMenuItem *mItem = [menu addItemWithTitle:[NSString stringWithFormat:NSSTRING_TITLE_SLOT_NUMBER, slotNumber] + action:nil + keyEquivalent:[NSString stringWithFormat:@"%d", slotNumberKey]]; + + [mItem setTarget:[mainWindow delegate]]; + + return mItem; +} + +- (void) setupUserDefaults +{ + EmuWindowDelegate *mainWindowDelegate = [mainWindow delegate]; + PreferencesWindowDelegate *prefWindowDelegate = [prefWindow delegate]; + NSMutableDictionary *prefBindings = [prefWindowDelegate bindings]; + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + + // Set the emulation flags. + NSUInteger emuFlags = 0; + + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_AdvancedBusLevelTiming"]) + { + emuFlags |= EMULATION_ADVANCED_BUS_LEVEL_TIMING_MASK; + } + + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_UseExternalBIOSImages"]) + { + emuFlags |= EMULATION_USE_EXTERNAL_BIOS_MASK; + } + + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_BIOSEmulateSWI"]) + { + emuFlags |= EMULATION_BIOS_SWI_MASK; + } + + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_BIOSPatchDelayLoopSWI"]) + { + emuFlags |= EMULATION_PATCH_DELAY_LOOP_MASK; + } + + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_UseExternalFirmwareImage"]) + { + emuFlags |= EMULATION_USE_EXTERNAL_FIRMWARE_MASK; + } + + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_FirmwareBoot"]) + { + emuFlags |= EMULATION_BOOT_FROM_FIRMWARE_MASK; + } + + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_EmulateEnsata"]) + { + emuFlags |= EMULATION_ENSATA_MASK; + } + + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_UseDebugConsole"]) + { + emuFlags |= EMULATION_DEBUG_CONSOLE_MASK; + } + + [cdsCore setEmulationFlags:emuFlags]; + + // Set up the firmware per user preferences. + NSMutableDictionary *newFWDict = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Nickname"], @"Nickname", + [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Message"], @"Message", + [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_FavoriteColor"], @"FavoriteColor", + [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Birthday"], @"Birthday", + [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Language"], @"Language", + nil]; + + CocoaDSFirmware *newFirmware = [[CocoaDSFirmware alloc] initWithDictionary:newFWDict]; + [cdsCore setCdsFirmware:newFirmware]; + [newFirmware update]; + + // Setup the ARM7 BIOS, ARM9 BIOS, and firmware image paths per user preferences. + NSString *arm7BiosImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"BIOS_ARM7ImagePath"]; + if (arm7BiosImagePath != nil) + { + [cdsCore setArm7ImageURL:[NSURL fileURLWithPath:arm7BiosImagePath]]; + [prefBindings setValue:[arm7BiosImagePath lastPathComponent] forKey:@"Arm7BiosImageName"]; + } + else + { + [cdsCore setArm7ImageURL:nil]; + [prefBindings setValue:nil forKey:@"Arm7BiosImageName"]; + } + + NSString *arm9BiosImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"BIOS_ARM9ImagePath"]; + if (arm9BiosImagePath != nil) + { + [cdsCore setArm9ImageURL:[NSURL fileURLWithPath:arm9BiosImagePath]]; + [prefBindings setValue:[arm9BiosImagePath lastPathComponent] forKey:@"Arm9BiosImageName"]; + } + else + { + [cdsCore setArm9ImageURL:nil]; + [prefBindings setValue:nil forKey:@"Arm9BiosImageName"]; + } + + NSString *firmwareImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"Emulation_FirmwareImagePath"]; + if (firmwareImagePath != nil) + { + [cdsCore setFirmwareImageURL:[NSURL fileURLWithPath:firmwareImagePath]]; + [prefBindings setValue:[firmwareImagePath lastPathComponent] forKey:@"FirmwareImageName"]; + } + else + { + [cdsCore setFirmwareImageURL:nil]; + [prefBindings setValue:nil forKey:@"FirmwareImageName"]; + } + + NSString *advansceneDatabasePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"Advanscene_DatabasePath"]; + if (advansceneDatabasePath != nil) + { + [prefBindings setValue:[advansceneDatabasePath lastPathComponent] forKey:@"AdvansceneDatabaseName"]; + } + + NSString *cheatDatabasePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"R4Cheat_DatabasePath"]; + if (cheatDatabasePath != nil) + { + [prefBindings setValue:[cheatDatabasePath lastPathComponent] forKey:@"R4CheatDatabaseName"]; + } + + // Set the sound input mode per user preferences. + [[cdsCore cdsController] setSoundInputMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"Input_AudioInputMode"]]; + + // Update the SPU Sync controls in the Preferences window. + if ([[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_SyncMode"] == SPU_SYNC_MODE_DUAL_SYNC_ASYNC) + { + [[prefWindowDelegate spuSyncMethodMenu] setEnabled:NO]; + } + else + { + [[prefWindowDelegate spuSyncMethodMenu] setEnabled:YES]; + } + + // Set the text field for the autoloaded ROM. + NSString *autoloadRomPath = [[NSUserDefaults standardUserDefaults] stringForKey:@"General_AutoloadROMSelectedPath"]; + if (autoloadRomPath != nil) + { + [prefBindings setValue:[autoloadRomPath lastPathComponent] forKey:@"AutoloadRomName"]; + } + else + { + [prefBindings setValue:nil forKey:@"AutoloadRomName"]; + } + + // Update all of the input display fields. + [self updateInputDisplayFields]; + + // Set the menu for the display rotation. + double displayRotation = (double)[[NSUserDefaults standardUserDefaults] floatForKey:@"DisplayView_Rotation"]; + [prefWindowDelegate updateDisplayRotationMenu:displayRotation]; + + // Set the default sound volume per user preferences. + [prefWindowDelegate updateVolumeIcon:nil]; + + [mainWindowDelegate setupUserDefaults]; +} + +- (void) updateInputDisplayFields +{ + PreferencesWindowDelegate *prefWindowDelegate = [prefWindow delegate]; + NSMutableDictionary *prefBindings = [prefWindowDelegate bindings]; + + if ([[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"] == nil) + { + return; + } + + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Up"] forKey:@"Input_Up"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Down"] forKey:@"Input_Down"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Left"] forKey:@"Input_Left"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Right"] forKey:@"Input_Right"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"A"] forKey:@"Input_A"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"B"] forKey:@"Input_B"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"X"] forKey:@"Input_X"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Y"] forKey:@"Input_Y"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"L"] forKey:@"Input_L"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"R"] forKey:@"Input_R"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Start"] forKey:@"Input_Start"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Select"] forKey:@"Input_Select"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Microphone"] forKey:@"Input_Microphone"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Lid"] forKey:@"Input_Lid"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Debug"] forKey:@"Input_Debug"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Speed Half"] forKey:@"Input_SpeedHalf"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Speed Double"] forKey:@"Input_SpeedDouble"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"HUD"] forKey:@"Input_HUD"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Execute"] forKey:@"Input_Execute"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Pause"] forKey:@"Input_Pause"]; + [prefBindings setValue:[inputPrefsView parseMappingDisplayString:@"Reset"] forKey:@"Input_Reset"]; +} + +- (IBAction) showMigrationWindow:(id)sender +{ + NSMutableArray *fileList = [CocoaDSFile completeFileList]; + if (fileList != nil) + { + if ([fileList count] == 0) + { + [self setMigrationFilesPresent:NO]; + } + else + { + [self setMigrationFilesPresent:YES]; + } + + if (sender == nil && ![self migrationFilesPresent]) + { + return; + } + } + + [fileMigrationList setContent:fileList]; + [migrationWindow center]; + [migrationWindow makeKeyAndOrderFront:nil]; +} + +- (IBAction) handleMigrationWindow:(id)sender +{ + NSInteger option = [(NSControl *)sender tag]; + NSMutableArray *fileList = [fileMigrationList content]; + + switch (option) + { + case COCOA_DIALOG_DEFAULT: + [CocoaDSFile copyFileListToCurrent:fileList]; + break; + + case COCOA_DIALOG_OPTION: + [CocoaDSFile moveFileListToCurrent:fileList]; + break; + + default: + break; + } + + [[(NSControl *)sender window] close]; +} + +- (void) setRomInfoPanelBoxTitleColors +{ + NSColor *boxTitleColor = [NSColor whiteColor]; + + [[boxGeneralInfo titleCell] setTextColor:boxTitleColor]; + [[boxTitles titleCell] setTextColor:boxTitleColor]; + [[boxARMBinaries titleCell] setTextColor:boxTitleColor]; + [[boxFileSystem titleCell] setTextColor:boxTitleColor]; + [[boxMisc titleCell] setTextColor:boxTitleColor]; + + [boxGeneralInfo setNeedsDisplay:YES]; + [boxTitles setNeedsDisplay:YES]; + [boxARMBinaries setNeedsDisplay:YES]; + [boxFileSystem setNeedsDisplay:YES]; + [boxMisc setNeedsDisplay:YES]; +} + +@end diff --git a/desmume/src/cocoa/userinterface/cheatWindowDelegate.h b/desmume/src/cocoa/userinterface/cheatWindowDelegate.h new file mode 100644 index 000000000..c40634c55 --- /dev/null +++ b/desmume/src/cocoa/userinterface/cheatWindowDelegate.h @@ -0,0 +1,122 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import + +@class CocoaDSCheatItem; +@class CocoaDSCheatManager; +@class CocoaDSCheatSearch; +@class CocoaDSCheatSearchParams; + + +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 +@interface CheatWindowDelegate : NSObject +#else +@interface CheatWindowDelegate : NSObject +#endif +{ + NSObject *dummyObject; + NSWindow *window; + NSBox *cheatConfigBox; + NSView *cheatSearchView; + NSTableView *cheatListTable; + NSTableView *cheatSearchListTable; + NSArrayController *cheatListController; + NSArrayController *cheatSearchListController; + NSArrayController *cheatDatabaseController; + NSObjectController *cheatWindowController; + NSObjectController *cheatSelectedItemController; + + NSView *currentView; + NSView *viewConfigureNoSelection; + NSView *viewConfigureInternalCheat; + NSView *viewConfigureActionReplayCheat; + NSView *viewConfigureCodeBreakerCheat; + NSView *currentSearchStyleView; + NSView *viewSearchNoSelection; + NSView *viewSearchExactValue; + NSView *viewSearchComparativeStart; + NSView *viewSearchComparativeContinue; + + NSSearchField *searchField; + + NSWindow *cheatDatabaseSheet; + + NSUInteger untitledCount; + + NSMutableDictionary *bindings; + CocoaDSCheatItem *workingCheat; + CocoaDSCheatManager *cdsCheats; + CocoaDSCheatSearch *cdsCheatSearch; +} + +@property (assign) IBOutlet NSObject *dummyObject; +@property (readonly) IBOutlet NSWindow *window; +@property (readonly) IBOutlet NSBox *cheatConfigBox; +@property (readonly) IBOutlet NSView *cheatSearchView; +@property (readonly) IBOutlet NSTableView *cheatListTable; +@property (readonly) IBOutlet NSTableView *cheatSearchListTable; +@property (readonly) IBOutlet NSArrayController *cheatListController; +@property (readonly) IBOutlet NSArrayController *cheatSearchListController; +@property (readonly) IBOutlet NSArrayController *cheatDatabaseController; +@property (readonly) IBOutlet NSObjectController *cheatWindowController; +@property (readonly) IBOutlet NSObjectController *cheatSelectedItemController; + +@property (readonly) IBOutlet NSView *viewConfigureNoSelection; +@property (readonly) IBOutlet NSView *viewConfigureInternalCheat; +@property (readonly) IBOutlet NSView *viewConfigureActionReplayCheat; +@property (readonly) IBOutlet NSView *viewConfigureCodeBreakerCheat; + +@property (readonly) IBOutlet NSView *viewSearchNoSelection; +@property (readonly) IBOutlet NSView *viewSearchExactValue; +@property (readonly) IBOutlet NSView *viewSearchComparativeStart; +@property (readonly) IBOutlet NSView *viewSearchComparativeContinue; + +@property (readonly) IBOutlet NSSearchField *searchField; + +@property (readonly) IBOutlet NSWindow *cheatDatabaseSheet; + +@property (assign) NSUInteger untitledCount; +@property (assign) NSMutableDictionary *bindings; +@property (assign) CocoaDSCheatItem *workingCheat; +@property (assign) CocoaDSCheatManager *cdsCheats; +@property (assign) CocoaDSCheatSearch *cdsCheatSearch; + +- (IBAction) addToList:(id)sender; +- (IBAction) removeFromList:(id)sender; +- (IBAction) viewDatabase:(id)sender; +- (IBAction) setInternalCheatValue:(id)sender; +- (IBAction) applyConfiguration:(id)sender; +- (IBAction) selectCheatType:(id)sender; + +- (IBAction) selectCheatSearchStyle:(id)sender; +- (IBAction) runExactValueSearch:(id)sender; +- (IBAction) runComparativeSearch:(id)sender; +- (void) searchDidFinish:(NSNotification *)aNotification; +- (IBAction) resetSearch:(id)sender; + +- (void) setCheatConfigViewByType:(NSInteger)cheatTypeID; +- (void) setCheatSearchViewByStyle:(NSInteger)searchStyleID; + +- (IBAction) selectAllCheatsInDatabase:(id)sender; +- (IBAction) selectNoneCheatsInDatabase:(id)sender; +- (void) addSelectedFromCheatDatabase; +- (IBAction) closeCheatDatabaseSheet:(id)sender; +- (void) didEndCheatDatabaseSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; + +@end diff --git a/desmume/src/cocoa/userinterface/cheatWindowDelegate.mm b/desmume/src/cocoa/userinterface/cheatWindowDelegate.mm new file mode 100644 index 000000000..a1233c88e --- /dev/null +++ b/desmume/src/cocoa/userinterface/cheatWindowDelegate.mm @@ -0,0 +1,538 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "cheatWindowDelegate.h" + +#import "cocoa_globals.h" +#import "cocoa_cheat.h" +#import "cocoa_util.h" + + +@implementation CheatWindowDelegate + +@dynamic dummyObject; +@synthesize window; +@synthesize cheatConfigBox; +@synthesize cheatSearchView; +@synthesize cheatListTable; +@synthesize cheatSearchListTable; +@synthesize cheatListController; +@synthesize cheatSearchListController; +@synthesize cheatDatabaseController; +@synthesize cheatWindowController; +@synthesize cheatSelectedItemController; + +@synthesize viewConfigureNoSelection; +@synthesize viewConfigureInternalCheat; +@synthesize viewConfigureActionReplayCheat; +@synthesize viewConfigureCodeBreakerCheat; +@synthesize viewSearchNoSelection; +@synthesize viewSearchExactValue; +@synthesize viewSearchComparativeStart; +@synthesize viewSearchComparativeContinue; + +@synthesize searchField; + +@synthesize cheatDatabaseSheet; + +@synthesize untitledCount; +@synthesize bindings; +@synthesize cdsCheats; +@synthesize cdsCheatSearch; +@synthesize workingCheat; + +- (id)init +{ + self = [super init]; + if(self == nil) + { + return nil; + } + + bindings = [[NSMutableDictionary alloc] init]; + if (bindings == nil) + { + [self release]; + self = nil; + return self; + } + + cdsCheatSearch = [[CocoaDSCheatSearch alloc] init]; + if (cdsCheatSearch == nil) + { + [bindings release]; + [self release]; + self = nil; + return self; + } + + workingCheat = nil; + currentView = nil; + currentSearchStyleView = nil; + untitledCount = 0; + + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"hasSelection"]; + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"hasItems"]; + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isRunningSearch"]; + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isSearchStarted"]; + [bindings setValue:[NSNumber numberWithInteger:CHEATSEARCH_SEARCHSTYLE_EXACT_VALUE] forKey:@"cheatSearchStyle"]; + [bindings setValue:[NSNumber numberWithInteger:CHEATSEARCH_UNSIGNED] forKey:@"cheatSearchSignType"]; + [bindings setValue:@"Search not started." forKey:@"cheatSearchAddressCount"]; + + return self; +} + +- (void)dealloc +{ + [cdsCheatSearch release]; + [bindings release]; + + [super dealloc]; +} + +- (IBAction) addToList:(id)sender +{ + if (self.cdsCheats == nil) + { + return; + } + + NSString *untitledString = nil; + + self.untitledCount++; + if (self.untitledCount > 1) + { + untitledString = [NSString stringWithFormat:@"Untitled %d", self.untitledCount]; + } + else + { + untitledString = @"Untitled"; + } + + CocoaDSCheatItem *newCheatItem = [[[CocoaDSCheatItem alloc] init] autorelease]; + newCheatItem.cheatType = CHEAT_TYPE_INTERNAL; + newCheatItem.description = untitledString; + + [cheatListController addObject:newCheatItem]; + [self.cdsCheats add:newCheatItem]; + [self.cdsCheats save]; + + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"hasItems"]; +} + +- (IBAction) removeFromList:(id)sender +{ + NSMutableArray *cheatList = (NSMutableArray *)[cheatListController content]; + if (cdsCheats == nil || cheatList == nil) + { + return; + } + + NSUInteger selectionIndex = [cheatListController selectionIndex]; + if (selectionIndex == NSNotFound) + { + return; + } + + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:selectionIndex]; + + NSArray *selectedObjects = [cheatListController selectedObjects]; + CocoaDSCheatItem *selectedCheat = (CocoaDSCheatItem *)[selectedObjects objectAtIndex:0]; + [self.cdsCheats remove:selectedCheat]; + [cheatListController removeObject:selectedCheat]; + + [self.cdsCheats save]; + [cheatListTable deselectAll:sender]; + + NSUInteger cheatCount = [cheatList count]; + if (cheatCount > 0) + { + if (selectionIndex >= cheatCount) + { + selectionIndex--; + indexSet = [NSIndexSet indexSetWithIndex:selectionIndex]; + } + + [cheatListTable selectRowIndexes:indexSet byExtendingSelection:NO]; + } + else + { + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"hasItems"]; + } +} + +- (IBAction) viewDatabase:(id)sender +{ + [NSApp beginSheet:cheatDatabaseSheet + modalForWindow:window + modalDelegate:self + didEndSelector:@selector(didEndCheatDatabaseSheet:returnCode:contextInfo:) + contextInfo:nil]; +} + +- (IBAction) setInternalCheatValue:(id)sender +{ + // Force end of editing of any text fields. + [window makeFirstResponder:nil]; + + [self.cdsCheats applyInternalCheat:self.workingCheat]; +} + +- (IBAction) applyConfiguration:(id)sender +{ + if (self.workingCheat == nil) + { + return; + } + + // Force end of editing of any text fields. + [window makeFirstResponder:nil]; + + [self.workingCheat mergeToParent]; + + BOOL result = [self.cdsCheats update:self.workingCheat.parent]; + if (result) + { + [self.cdsCheats save]; + } + else + { + // TODO: Display an error sheet saying that the cheat applying failed. + } +} + +- (IBAction) selectCheatType:(id)sender +{ + NSInteger cheatTypeID = [CocoaDSUtil getIBActionSenderTag:sender]; + CocoaDSCheatItem *cheatItem = [cheatSelectedItemController content]; + + cheatItem.cheatType = cheatTypeID; + + [self setCheatConfigViewByType:cheatTypeID]; +} + +- (IBAction) selectCheatSearchStyle:(id)sender +{ + NSInteger searchStyle = [CocoaDSUtil getIBActionSenderTag:sender]; + [self.bindings setValue:[NSNumber numberWithInteger:searchStyle] forKey:@"cheatSearchStyle"]; + [self setCheatSearchViewByStyle:searchStyle]; +} + +- (IBAction) runExactValueSearch:(id)sender +{ + if (self.workingCheat == nil) + { + return; + } + + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isSearchStarted"]; + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isRunningSearch"]; + + NSInteger value = [searchField integerValue]; + UInt8 byteSize = self.workingCheat.bytes; + NSInteger signType = [(NSNumber *)[self.bindings valueForKey:@"cheatSearchSignType"] integerValue]; + NSUInteger addressCount = [cdsCheatSearch runExactValueSearch:value byteSize:byteSize signType:signType]; + [bindings setValue:[NSNumber numberWithUnsignedInteger:addressCount] forKey:@"cheatSearchAddressCount"]; + [cheatSearchListController setContent:cdsCheatSearch.addressList]; + + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isRunningSearch"]; + +} + +- (IBAction) runComparativeSearch:(id)sender +{ + if (self.workingCheat == nil) + { + return; + } + + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isSearchStarted"]; + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isRunningSearch"]; + + if (cdsCheatSearch.searchCount == 0) + { + [bindings setValue:@"Running initial search..." forKey:@"cheatSearchAddressCount"]; + [window displayIfNeeded]; + } + + NSInteger compSearchTypeID = [CocoaDSUtil getIBActionSenderTag:sender]; + UInt8 byteSize = self.workingCheat.bytes; + NSInteger signType = [(NSNumber *)[self.bindings valueForKey:@"cheatSearchSignType"] integerValue]; + NSUInteger addressCount = [cdsCheatSearch runComparativeSearch:compSearchTypeID byteSize:byteSize signType:signType]; + [bindings setValue:[NSNumber numberWithUnsignedInteger:addressCount] forKey:@"cheatSearchAddressCount"]; + [cheatSearchListController setContent:cdsCheatSearch.addressList]; + + NSInteger searchStyle = [(NSNumber *)[self.bindings valueForKey:@"cheatSearchStyle"] integerValue]; + if (searchStyle == CHEATSEARCH_SEARCHSTYLE_COMPARATIVE && cdsCheatSearch.searchCount == 1) + { + [self setCheatSearchViewByStyle:CHEATSEARCH_SEARCHSTYLE_COMPARATIVE]; + [bindings setValue:@"Search started!" forKey:@"cheatSearchAddressCount"]; + } + + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isRunningSearch"]; + +} + +- (void) searchDidFinish:(NSNotification *)aNotification +{ + CocoaDSCheatSearch *searcher = [aNotification object]; + NSInteger addressCount = 0; + + if (searcher != nil) + { + addressCount = searcher.addressList.count; + [bindings setValue:[NSNumber numberWithUnsignedInteger:addressCount] forKey:@"cheatSearchAddressCount"]; + [cheatSearchListController setContent:searcher.addressList]; + + NSInteger searchStyle = [(NSNumber *)[self.bindings valueForKey:@"cheatSearchStyle"] integerValue]; + if (searchStyle == CHEATSEARCH_SEARCHSTYLE_COMPARATIVE && searcher.searchCount == 1) + { + [self setCheatSearchViewByStyle:CHEATSEARCH_SEARCHSTYLE_COMPARATIVE]; + [bindings setValue:@"Search started!" forKey:@"cheatSearchAddressCount"]; + } + } + + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isRunningSearch"]; +} + +- (IBAction) resetSearch:(id)sender +{ + [cheatSearchListController setContent:nil]; + [cdsCheatSearch reset]; + [self.bindings setValue:nil forKey:@"cheatSearchSearchValue"]; + [self.bindings setValue:@"Search not started." forKey:@"cheatSearchAddressCount"]; + [self setCheatSearchViewByStyle:[(NSNumber *)[self.bindings valueForKey:@"cheatSearchStyle"] integerValue]]; + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isSearchStarted"]; +} + +- (void) setCheatConfigViewByType:(NSInteger)cheatTypeID +{ + NSView *newView = nil; + + if (currentView == nil) + { + currentView = viewConfigureNoSelection; + } + + switch (cheatTypeID) + { + case CHEAT_TYPE_INTERNAL: + newView = viewConfigureInternalCheat; + break; + + case CHEAT_TYPE_ACTION_REPLAY: + newView = viewConfigureActionReplayCheat; + break; + + case CHEAT_TYPE_CODE_BREAKER: + newView = viewConfigureCodeBreakerCheat; + break; + + default: + break; + } + + if (newView != nil) + { + NSRect frameRect = [currentView frame]; + [currentView retain]; + [cheatConfigBox replaceSubview:currentView with:newView]; + currentView = newView; + [currentView setFrame:frameRect]; + } +} + +- (void) setCheatSearchViewByStyle:(NSInteger)searchStyleID +{ + NSView *newView = nil; + + if (currentSearchStyleView == nil) + { + currentSearchStyleView = viewSearchNoSelection; + } + + switch (searchStyleID) + { + case CHEATSEARCH_SEARCHSTYLE_EXACT_VALUE: + newView = viewSearchExactValue; + break; + + case CHEATSEARCH_SEARCHSTYLE_COMPARATIVE: + if (cdsCheatSearch.searchCount == 0) + { + newView = viewSearchComparativeStart; + } + else + { + newView = viewSearchComparativeContinue; + } + break; + + default: + break; + } + + if (newView != nil) + { + NSRect frameRect = [currentSearchStyleView frame]; + [currentSearchStyleView retain]; + [cheatSearchView replaceSubview:currentSearchStyleView with:newView]; + currentSearchStyleView = newView; + [currentSearchStyleView setFrame:frameRect]; + } +} + +- (IBAction) selectAllCheatsInDatabase:(id)sender +{ + NSMutableArray *dbList = [cheatDatabaseController content]; + if (dbList == nil) + { + return; + } + + for (CocoaDSCheatItem *cheatItem in dbList) + { + cheatItem.willAdd = YES; + } +} + +- (IBAction) selectNoneCheatsInDatabase:(id)sender +{ + NSMutableArray *dbList = [cheatDatabaseController content]; + if (dbList == nil) + { + return; + } + + for (CocoaDSCheatItem *cheatItem in dbList) + { + cheatItem.willAdd = NO; + } +} + +- (void) addSelectedFromCheatDatabase +{ + NSMutableArray *dbList = [cheatDatabaseController content]; + if (dbList == nil) + { + return; + } + + for (CocoaDSCheatItem *cheatItem in dbList) + { + if (cheatItem.willAdd) + { + CocoaDSCheatItem *newCheatItem = [[[CocoaDSCheatItem alloc] initWithCheatData:cheatItem.data] autorelease]; + [newCheatItem retainData]; + [cheatListController addObject:newCheatItem]; + [self.cdsCheats add:newCheatItem]; + } + } + + if ([dbList count] > 0) + { + [self.cdsCheats save]; + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"hasItems"]; + } +} + +- (IBAction) closeCheatDatabaseSheet:(id)sender +{ + NSWindow *sheet = [(NSControl *)sender window]; + NSInteger code = [(NSControl *)sender tag]; + + [NSApp endSheet:sheet returnCode:code]; +} + +- (void) didEndCheatDatabaseSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +{ + [sheet orderOut:self]; + + switch (returnCode) + { + case NSCancelButton: + return; + break; + + case NSOKButton: + [self addSelectedFromCheatDatabase]; + break; + + default: + break; + } +} + +- (void)windowDidBecomeKey:(NSNotification *)notification +{ + [cheatWindowController setContent:self.bindings]; +} + +- (void)tableViewSelectionDidChange:(NSNotification *)aNotification +{ + NSTableView *table = (NSTableView *)[aNotification object]; + NSInteger rowIndex = [table selectedRow]; + + if (table == self.cheatListTable) + { + if (rowIndex >= 0) + { + NSArray *selectedObjects = [cheatListController selectedObjects]; + CocoaDSCheatItem *selectedCheat = [selectedObjects objectAtIndex:0]; + self.workingCheat = [selectedCheat createWorkingCopy]; + [cheatSelectedItemController setContent:self.workingCheat]; + + [self setCheatConfigViewByType:selectedCheat.cheatType]; + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"hasSelection"]; + } + else + { + if (self.workingCheat != nil) + { + [self.workingCheat.parent destroyWorkingCopy]; + } + + [cheatSelectedItemController setContent:nil]; + self.workingCheat = nil; + + NSRect frameRect = [currentView frame]; + [currentView retain]; + [cheatConfigBox replaceSubview:currentView with:viewConfigureNoSelection]; + currentView = viewConfigureNoSelection; + [currentView setFrame:frameRect]; + + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"hasSelection"]; + } + } + else if (table == self.cheatSearchListTable) + { + if (rowIndex >= 0) + { + NSArray *selectedObjects = [cheatSearchListController selectedObjects]; + NSMutableDictionary *selectedAddress = [selectedObjects objectAtIndex:0]; + NSString *addressString = [(NSString *)[selectedAddress valueForKey:@"addressString"] substringFromIndex:4]; + + if (self.workingCheat != nil) + { + self.workingCheat.memAddressSixDigitString = addressString; + } + } + } +} + +@end diff --git a/desmume/src/cocoa/userinterface/displayView.h b/desmume/src/cocoa/userinterface/displayView.h new file mode 100644 index 000000000..264fc8e1d --- /dev/null +++ b/desmume/src/cocoa/userinterface/displayView.h @@ -0,0 +1,141 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import +#include +#include + +#import "cocoa_output.h" + +@class DisplayViewDelegate; +@class CocoaDSController; + + +@protocol DisplayViewDelegate + +@required +- (void) doInitVideoOutput:(NSDictionary *)properties; +- (void) doProcessVideoFrame:(const void *)videoFrameData frameSize:(NSSize)frameSize; + +@property (retain) DisplayViewDelegate *dispViewDelegate; + +@optional +- (void) doResizeView:(NSRect)rect; +- (void) doRedraw; +- (void) doDisplayTypeChanged:(NSInteger)displayTypeID; +- (void) doBilinearOutputChanged:(BOOL)useBilinear; +- (void) doVideoFilterChanged:(NSInteger)videoFilterTypeID; + +@end + +@interface DisplayViewDelegate : NSObject +{ + NSView *view; + NSPort *sendPortDisplay; + NSPort *sendPortInput; + + CocoaDSController *cdsController; + + BOOL isHudEnabled; + BOOL isHudEditingModeEnabled; + + NSSize normalSize; + NSMutableDictionary *bindings; + + OSSpinLock spinlockGpuStateFlags; + OSSpinLock spinlockDisplayType; + OSSpinLock spinlockNormalSize; + OSSpinLock spinlockScale; + OSSpinLock spinlockRotation; + OSSpinLock spinlockUseBilinearOutput; +} + +@property (assign) NSView *view; +@property (assign) NSPort *sendPortInput; +@property (retain) CocoaDSController *cdsController; +@property (readonly) NSSize normalSize; +@property (assign) NSMutableDictionary *bindings; + +- (void) setGpuStateFlags:(UInt32)flags; +- (UInt32) gpuStateFlags; +- (void) setScale:(double)s; +- (double) scale; +- (void) setRotation:(double)angleDegrees; +- (double) rotation; +- (void) setUseBilinearOutput:(BOOL)theState; +- (BOOL) useBilinearOutput; +- (void) setDisplayType:(NSInteger)theType; +- (NSInteger) displayType; +- (void) setVideoFilterType:(NSInteger)theType; +- (void) setRender3DRenderingEngine:(NSInteger)methodID; +- (void) setRender3DHighPrecisionColorInterpolation:(BOOL)state; +- (void) setRender3DEdgeMarking:(BOOL)state; +- (void) setRender3DFog:(BOOL)state; +- (void) setRender3DTextures:(BOOL)state; +- (void) setRender3DDepthComparisonThreshold:(NSUInteger)threshold; +- (void) setRender3DThreads:(NSUInteger)numberThreads; +- (void) setRender3DLineHack:(BOOL)state; +- (void) setViewToBlack; +- (void) setViewToWhite; +- (void) requestScreenshot:(NSURL *)fileURL fileType:(NSBitmapImageFileType)fileType; +- (void) copyToPasteboard; +- (BOOL) gpuStateByBit:(UInt32)stateBit; +- (NSPoint) dsPointFromEvent:(NSEvent *)theEvent; +- (NSPoint) convertPointToDS:(NSPoint)clickLoc; +- (BOOL) handleKeyPress:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed; +- (BOOL) handleMouseButton:(NSEvent *)theEvent buttonPressed:(BOOL)buttonPressed; + +@end + +@interface ImageDisplayView : NSImageView +{ + DisplayViewDelegate *dispViewDelegate; + NSImage *imageData; + NSBitmapImageRep *currentImageRep; +} + +- (NSBitmapImageRep *) bitmapImageRep:(const void *)videoFrameData imageSize:(NSSize)imageSize; + +@end + +@interface OpenGLDisplayView : NSOpenGLView +{ + DisplayViewDelegate *dispViewDelegate; + NSSize lastFrameSize; + GLint glTexRenderStyle; + GLenum glTexPixelFormat; + GLvoid *glTexBack; + NSSize glTexBackSize; + GLuint drawTexture[1]; +} + +- (void) drawVideoFrame; +- (void) uploadFrameTexture:(const GLvoid *)frameBytes textureSize:(NSSize)textureSize; + +@end + +#ifdef __cplusplus +extern "C" +{ +#endif + +void SetupOpenGLView(GLsizei width, GLsizei height, GLfloat scalar, GLfloat angleDegrees); + +#ifdef __cplusplus +} +#endif diff --git a/desmume/src/cocoa/userinterface/displayView.mm b/desmume/src/cocoa/userinterface/displayView.mm new file mode 100644 index 000000000..4047abeef --- /dev/null +++ b/desmume/src/cocoa/userinterface/displayView.mm @@ -0,0 +1,1038 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "displayView.h" +#import "emuWindowDelegate.h" + +#import "cocoa_input.h" +#import "cocoa_globals.h" +#import "cocoa_videofilter.h" +#import "cocoa_util.h" + +#include + +#undef BOOL + +@implementation DisplayViewDelegate + +@synthesize view; +@synthesize sendPortDisplay; +@synthesize sendPortInput; +@synthesize cdsController; +@synthesize isHudEnabled; +@synthesize isHudEditingModeEnabled; +@synthesize normalSize; +@synthesize bindings; + +- (id)init +{ + self = [super init]; + if (self == nil) + { + return self; + } + + bindings = [[NSMutableDictionary alloc] init]; + if (bindings == nil) + { + [self release]; + self = nil; + return self; + } + + view = nil; + spinlockGpuStateFlags = OS_SPINLOCK_INIT; + spinlockDisplayType = OS_SPINLOCK_INIT; + spinlockNormalSize = OS_SPINLOCK_INIT; + spinlockScale = OS_SPINLOCK_INIT; + spinlockRotation = OS_SPINLOCK_INIT; + spinlockUseBilinearOutput = OS_SPINLOCK_INIT; + + normalSize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2.0); + sendPortDisplay = nil; + cdsController = nil; + isHudEnabled = NO; + isHudEditingModeEnabled = NO; + + UInt32 gpuStateFlags = GPUSTATE_MAIN_GPU_MASK | + GPUSTATE_MAIN_BG0_MASK | + GPUSTATE_MAIN_BG1_MASK | + GPUSTATE_MAIN_BG2_MASK | + GPUSTATE_MAIN_BG3_MASK | + GPUSTATE_MAIN_OBJ_MASK | + GPUSTATE_SUB_GPU_MASK | + GPUSTATE_SUB_BG0_MASK | + GPUSTATE_SUB_BG1_MASK | + GPUSTATE_SUB_BG2_MASK | + GPUSTATE_SUB_BG3_MASK | + GPUSTATE_SUB_OBJ_MASK; + + [bindings setValue:[NSNumber numberWithInt:gpuStateFlags] forKey:@"GpuStateFlags"]; + [bindings setValue:[NSNumber numberWithDouble:1.0] forKey:@"scale"]; + [bindings setValue:[NSNumber numberWithDouble:0.0] forKey:@"rotation"]; + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"useBilinearOutput"]; + [bindings setValue:[NSNumber numberWithInteger:DS_DISPLAY_TYPE_COMBO] forKey:@"displayMode"]; + [bindings setValue:@"Combo" forKey:@"displayModeString"]; + [bindings setValue:[NSNumber numberWithInteger:VideoFilterTypeID_None] forKey:@"videoFilterType"]; + [bindings setValue:[CocoaVideoFilter typeStringByID:VideoFilterTypeID_None] forKey:@"videoFilterTypeString"]; + [bindings setValue:[NSNumber numberWithInteger:CORE3DLIST_NULL] forKey:@"render3DRenderingEngine"]; + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"render3DHighPrecisionColorInterpolation"]; + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"render3DEdgeMarking"]; + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"render3DFog"]; + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"render3DTextures"]; + [bindings setValue:[NSNumber numberWithInteger:0] forKey:@"render3DDepthComparisonThreshold"]; + [bindings setValue:[NSNumber numberWithInteger:0] forKey:@"render3DThreads"]; + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"render3DLineHack"]; + + return self; +} + +- (void)dealloc +{ + [super dealloc]; +} + +- (NSSize) normalSize +{ + OSSpinLockLock(&spinlockNormalSize); + NSSize theSize = normalSize; + OSSpinLockUnlock(&spinlockNormalSize); + + return theSize; +} + +- (void) setGpuStateFlags:(UInt32)flags +{ + OSSpinLockLock(&spinlockGpuStateFlags); + [bindings setValue:[NSNumber numberWithInt:flags] forKey:@"GpuStateFlags"]; + OSSpinLockUnlock(&spinlockGpuStateFlags); + + [CocoaDSUtil messageSendOneWayWithInteger:self.sendPortDisplay msgID:MESSAGE_SET_GPU_STATE_FLAGS integerValue:flags]; +} + +- (UInt32) gpuStateFlags +{ + OSSpinLockLock(&spinlockGpuStateFlags); + UInt32 flags = [[bindings valueForKey:@"GpuStateFlags"] intValue]; + OSSpinLockUnlock(&spinlockGpuStateFlags); + + return flags; +} + +- (void) setScale:(double)s +{ + OSSpinLockLock(&spinlockScale); + [bindings setValue:[NSNumber numberWithDouble:s] forKey:@"scale"]; + OSSpinLockUnlock(&spinlockScale); +} + +- (double) scale +{ + OSSpinLockLock(&spinlockScale); + double s = [[bindings valueForKey:@"scale"] doubleValue]; + OSSpinLockUnlock(&spinlockScale); + + return s; +} + +- (void) setRotation:(double)angleDegrees +{ + OSSpinLockLock(&spinlockRotation); + [bindings setValue:[NSNumber numberWithDouble:angleDegrees] forKey:@"rotation"]; + OSSpinLockUnlock(&spinlockRotation); +} + +- (double) rotation +{ + OSSpinLockLock(&spinlockRotation); + double angleDegrees = [[bindings valueForKey:@"rotation"] doubleValue]; + OSSpinLockUnlock(&spinlockRotation); + + return angleDegrees; +} + +- (void) setUseBilinearOutput:(BOOL)theState +{ + OSSpinLockLock(&spinlockUseBilinearOutput); + [bindings setValue:[NSNumber numberWithBool:theState] forKey:@"useBilinearOutput"]; + OSSpinLockUnlock(&spinlockUseBilinearOutput); + + [CocoaDSUtil messageSendOneWayWithBool:self.sendPortDisplay msgID:MESSAGE_CHANGE_BILINEAR_OUTPUT boolValue:theState]; +} + +- (BOOL) useBilinearOutput +{ + OSSpinLockLock(&spinlockUseBilinearOutput); + BOOL theState = [[bindings valueForKey:@"useBilinearOutput"] boolValue]; + OSSpinLockUnlock(&spinlockUseBilinearOutput); + + return theState; +} + +- (void) setDisplayType:(NSInteger)theType +{ + NSSize theSize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT); + NSString *modeString = @"Unknown"; + + switch (theType) + { + case DS_DISPLAY_TYPE_MAIN: + modeString = NSSTRING_DISPLAYMODE_MAIN; + break; + + case DS_DISPLAY_TYPE_TOUCH: + modeString = NSSTRING_DISPLAYMODE_TOUCH; + break; + + case DS_DISPLAY_TYPE_COMBO: + theSize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2); + modeString = NSSTRING_DISPLAYMODE_COMBO; + break; + + default: + break; + } + + OSSpinLockLock(&spinlockDisplayType); + [bindings setValue:[NSNumber numberWithInteger:theType] forKey:@"displayMode"]; + [bindings setValue:modeString forKey:@"displayModeString"]; + OSSpinLockUnlock(&spinlockDisplayType); + + OSSpinLockLock(&spinlockNormalSize); + normalSize = theSize; + OSSpinLockUnlock(&spinlockNormalSize); + + [CocoaDSUtil messageSendOneWayWithInteger:self.sendPortDisplay msgID:MESSAGE_CHANGE_DISPLAY_TYPE integerValue:theType]; +} + +- (NSInteger) displayType +{ + OSSpinLockLock(&spinlockDisplayType); + NSInteger theType = [[bindings valueForKey:@"displayMode"] integerValue]; + OSSpinLockUnlock(&spinlockDisplayType); + + return theType; +} + +- (void) setVideoFilterType:(NSInteger)theType +{ + [bindings setValue:[NSNumber numberWithInteger:theType] forKey:@"videoFilterType"]; + [bindings setValue:[CocoaVideoFilter typeStringByID:(VideoFilterTypeID)theType] forKey:@"videoFilterTypeString"]; + [CocoaDSUtil messageSendOneWayWithInteger:self.sendPortDisplay msgID:MESSAGE_CHANGE_VIDEO_FILTER integerValue:theType]; +} + +- (void) setRender3DRenderingEngine:(NSInteger)methodID +{ + [bindings setValue:[NSNumber numberWithInteger:methodID] forKey:@"render3DRenderingEngine"]; + [CocoaDSUtil messageSendOneWayWithInteger:self.sendPortDisplay msgID:MESSAGE_SET_RENDER3D_METHOD integerValue:methodID]; +} + +- (void) setRender3DHighPrecisionColorInterpolation:(BOOL)state +{ + [bindings setValue:[NSNumber numberWithBool:state] forKey:@"render3DHighPrecisionColorInterpolation"]; + [CocoaDSUtil messageSendOneWayWithBool:self.sendPortDisplay msgID:MESSAGE_SET_RENDER3D_HIGH_PRECISION_COLOR_INTERPOLATION boolValue:state]; +} + +- (void) setRender3DEdgeMarking:(BOOL)state +{ + [bindings setValue:[NSNumber numberWithBool:state] forKey:@"render3DEdgeMarking"]; + [CocoaDSUtil messageSendOneWayWithBool:self.sendPortDisplay msgID:MESSAGE_SET_RENDER3D_EDGE_MARKING boolValue:state]; +} + +- (void) setRender3DFog:(BOOL)state +{ + [bindings setValue:[NSNumber numberWithBool:state] forKey:@"render3DFog"]; + [CocoaDSUtil messageSendOneWayWithBool:self.sendPortDisplay msgID:MESSAGE_SET_RENDER3D_FOG boolValue:state]; +} + +- (void) setRender3DTextures:(BOOL)state +{ + [bindings setValue:[NSNumber numberWithBool:state] forKey:@"render3DTextures"]; + [CocoaDSUtil messageSendOneWayWithBool:self.sendPortDisplay msgID:MESSAGE_SET_RENDER3D_TEXTURES boolValue:state]; +} + +- (void) setRender3DDepthComparisonThreshold:(NSUInteger)threshold +{ + [bindings setValue:[NSNumber numberWithInteger:threshold] forKey:@"render3DDepthComparisonThreshold"]; + [CocoaDSUtil messageSendOneWayWithInteger:self.sendPortDisplay msgID:MESSAGE_SET_RENDER3D_DEPTH_COMPARISON_THRESHOLD integerValue:threshold]; +} + +- (void) setRender3DThreads:(NSUInteger)numberThreads +{ + [bindings setValue:[NSNumber numberWithInteger:numberThreads] forKey:@"render3DThreads"]; + [CocoaDSUtil messageSendOneWayWithInteger:self.sendPortDisplay msgID:MESSAGE_SET_RENDER3D_THREADS integerValue:numberThreads]; +} + +- (void) setRender3DLineHack:(BOOL)state +{ + [bindings setValue:[NSNumber numberWithBool:state] forKey:@"render3DLineHack"]; + [CocoaDSUtil messageSendOneWayWithBool:self.sendPortDisplay msgID:MESSAGE_SET_RENDER3D_LINE_HACK boolValue:state]; +} + +- (void) setViewToBlack +{ + [CocoaDSUtil messageSendOneWay:self.sendPortDisplay msgID:MESSAGE_SET_VIEW_TO_BLACK]; +} + +- (void) setViewToWhite +{ + [CocoaDSUtil messageSendOneWay:self.sendPortDisplay msgID:MESSAGE_SET_VIEW_TO_WHITE]; +} + +- (NSPoint) dsPointFromEvent:(NSEvent *)theEvent +{ + // Convert the clicked location from window coordinates, to view coordinates, + // and finally to DS touchscreen coordinates. + NSPoint touchLoc = [theEvent locationInWindow]; + touchLoc = [view convertPoint:touchLoc fromView:nil]; + touchLoc = [self convertPointToDS:touchLoc]; + + return touchLoc; +} + +- (NSPoint) convertPointToDS:(NSPoint)clickLoc +{ + double viewAngle = [self rotation]; + if (viewAngle != 0.0) + { + viewAngle = CLOCKWISE_DEGREES(viewAngle); + } + + NSPoint touchLoc = GetNormalPointFromTransformedPoint(clickLoc, self.normalSize, [[self view] bounds].size, [self scale], viewAngle); + + // Normalize the y-coordinate to the DS. + touchLoc.y = GPU_DISPLAY_HEIGHT - touchLoc.y; + + // Constrain the touch point to the DS dimensions. + if (touchLoc.x < 0) + { + touchLoc.x = 0; + } + else if (touchLoc.x > (GPU_DISPLAY_WIDTH - 1)) + { + touchLoc.x = (GPU_DISPLAY_WIDTH - 1); + } + + if (touchLoc.y < 0) + { + touchLoc.y = 0; + } + else if (touchLoc.y > (GPU_DISPLAY_HEIGHT - 1)) + { + touchLoc.y = (GPU_DISPLAY_HEIGHT - 1); + } + + return touchLoc; +} + +- (void) requestScreenshot:(NSURL *)fileURL fileType:(NSBitmapImageFileType)fileType +{ + NSString *fileURLString = [fileURL absoluteString]; + NSData *fileURLStringData = [fileURLString dataUsingEncoding:NSUTF8StringEncoding]; + NSData *bitmapImageFileTypeData = [[NSData alloc] initWithBytes:&fileType length:sizeof(NSBitmapImageFileType)]; + NSArray *messageComponents = [[NSArray alloc] initWithObjects:fileURLStringData, bitmapImageFileTypeData, nil]; + + [CocoaDSUtil messageSendOneWayWithMessageComponents:self.sendPortDisplay msgID:MESSAGE_REQUEST_SCREENSHOT array:messageComponents]; + + [bitmapImageFileTypeData release]; + [messageComponents release]; +} + +- (void) copyToPasteboard +{ + [CocoaDSUtil messageSendOneWay:self.sendPortDisplay msgID:MESSAGE_COPY_TO_PASTEBOARD]; +} + +- (BOOL) gpuStateByBit:(UInt32)stateBit +{ + BOOL result = NO; + UInt32 flags = [self gpuStateFlags]; + + if (flags & (1 << stateBit)) + { + result = YES; + } + + return result; +} + +- (BOOL) handleKeyPress:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed +{ + BOOL isHandled = NO; + + if (self.cdsController == nil) + { + return isHandled; + } + + NSString *elementName = [NSString stringWithFormat:@"%d", [theEvent keyCode]]; + NSString *elementCode = elementName; + NSDictionary *inputAttributes = [NSDictionary dictionaryWithObjectsAndKeys: + @"NSEventKeyboard", @"deviceCode", + @"Keyboard", @"deviceName", + elementCode, @"elementCode", + elementName, @"elementName", + [NSNumber numberWithBool:keyPressed], @"on", + nil]; + + if (keyPressed && [theEvent window] != nil && [[[theEvent window] delegate] respondsToSelector:@selector(setStatus:)]) + { + [[[theEvent window] delegate] setStatus:[NSString stringWithFormat:@"Keyboard:%i", [theEvent keyCode]]]; + } + + isHandled = [self.cdsController setStateWithInput:inputAttributes]; + + return isHandled; +} + +- (BOOL) handleMouseButton:(NSEvent *)theEvent buttonPressed:(BOOL)buttonPressed +{ + BOOL isHandled = NO; + NSInteger dispType = [self displayType]; + + if (self.cdsController == nil || (dispType != DS_DISPLAY_TYPE_TOUCH && dispType != DS_DISPLAY_TYPE_COMBO)) + { + return isHandled; + } + + // Convert the clicked location from window coordinates, to view coordinates, + // and finally to DS touchscreen coordinates. + NSPoint touchLoc = [self dsPointFromEvent:theEvent]; + + NSString *elementCode = [NSString stringWithFormat:@"%i", [theEvent buttonNumber]]; + NSString *elementName = [NSString stringWithFormat:@"Button %i", [theEvent buttonNumber]]; + + switch ([theEvent buttonNumber]) + { + case kCGMouseButtonLeft: + elementName = @"Primary Button"; + break; + + case kCGMouseButtonRight: + elementName = @"Secondary Button"; + break; + + case kCGMouseButtonCenter: + elementName = @"Center Button"; + break; + + default: + break; + } + + NSDictionary *inputAttributes = [NSDictionary dictionaryWithObjectsAndKeys: + @"NSEventMouse", @"deviceCode", + @"Mouse", @"deviceName", + elementCode, @"elementCode", + elementName, @"elementName", + [NSNumber numberWithBool:buttonPressed], @"on", + [NSNumber numberWithFloat:touchLoc.x], @"pointX", + [NSNumber numberWithFloat:touchLoc.y], @"pointY", + nil]; + + if (buttonPressed && [theEvent window] != nil && [[[theEvent window] delegate] respondsToSelector:@selector(setStatus:)]) + { + [[[theEvent window] delegate] setStatus:[NSString stringWithFormat:@"Mouse:%i X:%i Y:%i", [theEvent buttonNumber], (NSInteger)(touchLoc.x), (NSInteger)(touchLoc.y)]]; + } + + isHandled = [self.cdsController setStateWithInput:inputAttributes]; + + return isHandled; +} + +- (void) doInitVideoOutput:(NSDictionary *)properties +{ + [view doInitVideoOutput:properties]; +} + +- (void) doProcessVideoFrame:(const void *)videoFrameData frameSize:(NSSize)frameSize +{ + [view doProcessVideoFrame:videoFrameData frameSize:frameSize]; +} + +- (void) doResizeView:(NSRect)rect +{ + if (view == nil || ![view respondsToSelector:@selector(doResizeView:)]) + { + return; + } + + [view doResizeView:rect]; +} + +- (void) doRedraw +{ + if (view == nil || ![view respondsToSelector:@selector(doRedraw)]) + { + return; + } + + [view doRedraw]; +} + +- (void) doDisplayTypeChanged:(NSInteger)displayTypeID +{ + if (view == nil || ![view respondsToSelector:@selector(doDisplayTypeChanged:)]) + { + return; + } + + [view doDisplayTypeChanged:displayTypeID]; +} + +- (void) doBilinearOutputChanged:(BOOL)useBilinear +{ + if (view == nil || ![view respondsToSelector:@selector(doBilinearOutputChanged:)]) + { + return; + } + + [view doBilinearOutputChanged:useBilinear]; +} + +- (void) doVideoFilterChanged:(NSInteger)videoFilterTypeID +{ + if (view == nil || ![view respondsToSelector:@selector(doVideoFilterChanged:)]) + { + return; + } + + [view doVideoFilterChanged:videoFilterTypeID]; +} + +@end + + +@implementation ImageDisplayView + +@synthesize dispViewDelegate; + +- (id) init +{ + return [self initWithFrame:NSMakeRect(0.0f, 0.0f, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2.0f)]; +} + +- (id) initWithFrame:(NSRect)frame +{ + self = [super initWithFrame:frame]; + if (self == nil) + { + return self; + } + + imageData = nil; + currentImageRep = nil; + + return self; +} + +- (void) dealloc +{ + [super dealloc]; +} + +- (void)drawRect:(NSRect)dirtyRect +{ + [CocoaDSUtil messageSendOneWay:dispViewDelegate.sendPortDisplay msgID:MESSAGE_REDRAW_VIEW]; +} + +- (void) drawVideoFrame +{ + [self setImage:imageData]; + [self setNeedsDisplay]; +} + +- (void)setFrame:(NSRect)rect +{ + [super setFrame:rect]; + [CocoaDSUtil messageSendOneWayWithRect:dispViewDelegate.sendPortDisplay msgID:MESSAGE_RESIZE_VIEW rect:rect]; +} + +- (NSBitmapImageRep *) bitmapImageRep:(const void *)videoFrameData imageSize:(NSSize)imageSize +{ + if (videoFrameData == nil) + { + return nil; + } + + NSUInteger w = (NSUInteger)imageSize.width; + NSUInteger h = (NSUInteger)imageSize.height; + NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL + pixelsWide:w + pixelsHigh:h + bitsPerSample:8 + samplesPerPixel:4 + hasAlpha:YES + isPlanar:NO + colorSpaceName:NSCalibratedRGBColorSpace + bytesPerRow:w * 4 + bitsPerPixel:32]; + + if(!imageRep) + { + return nil; + } + + uint32_t *bitmapData = (uint32_t *)[imageRep bitmapData]; + RGBA5551ToRGBA8888Buffer((const uint16_t *)videoFrameData, bitmapData, (w * h)); + +#ifdef __BIG_ENDIAN__ + uint32_t *bitmapDataEnd = bitmapData + (w * h); + while (bitmapData < bitmapDataEnd) + { + *bitmapData++ = CFSwapInt32LittleToHost(*bitmapData); + } +#endif + + return [imageRep autorelease]; +} + +- (void)keyDown:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleKeyPress:theEvent keyPressed:YES]; + if (!isHandled) + { + [super keyDown:theEvent]; + } +} + +- (void)keyUp:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleKeyPress:theEvent keyPressed:NO]; + if (!isHandled) + { + [super keyUp:theEvent]; + } +} + +- (void)mouseDown:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleMouseButton:theEvent buttonPressed:YES]; + if (!isHandled) + { + [super mouseDown:theEvent]; + } +} + +- (void)mouseDragged:(NSEvent *)theEvent +{ + [self mouseDown:theEvent]; +} + +- (void)mouseUp:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleMouseButton:theEvent buttonPressed:NO]; + if (!isHandled) + { + [super mouseUp:theEvent]; + } +} + +- (void)rightMouseDown:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleMouseButton:theEvent buttonPressed:YES]; + if (!isHandled) + { + [super rightMouseDown:theEvent]; + } +} + +- (void)rightMouseDragged:(NSEvent *)theEvent +{ + [self rightMouseDown:theEvent]; +} + +- (void)rightMouseUp:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleMouseButton:theEvent buttonPressed:NO]; + if (!isHandled) + { + [super rightMouseUp:theEvent]; + } +} + +- (void)otherMouseDown:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleMouseButton:theEvent buttonPressed:YES]; + if (!isHandled) + { + [super otherMouseDown:theEvent]; + } +} + +- (void)otherMouseDragged:(NSEvent *)theEvent +{ + [self otherMouseDown:theEvent]; +} + +- (void)otherMouseUp:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleMouseButton:theEvent buttonPressed:NO]; + if (!isHandled) + { + [super otherMouseUp:theEvent]; + } +} + +- (BOOL)acceptsFirstResponder +{ + return YES; +} + +- (BOOL)becomeFirstResponder +{ + return YES; +} + +- (BOOL)resignFirstResponder +{ + return YES; +} + +- (void)doInitVideoOutput:(NSDictionary *)properties +{ + imageData = [[NSImage alloc] initWithSize:[dispViewDelegate normalSize]]; + currentImageRep = nil; +} + +- (void)doProcessVideoFrame:(const void *)videoFrameData frameSize:(NSSize)frameSize +{ + // Render the frame in an NSBitmapImageRep + NSBitmapImageRep *newImageRep = [self bitmapImageRep:videoFrameData imageSize:frameSize]; + if (newImageRep == nil) + { + return; + } + + // Attach the rendered frame to the NSImageRep + [imageData removeRepresentation:currentImageRep]; + [imageData addRepresentation:newImageRep]; + currentImageRep = newImageRep; + + // Draw the video frame. + [self drawVideoFrame]; +} + +- (void)doRedraw +{ + [self drawVideoFrame]; +} + +@end + +@implementation OpenGLDisplayView + +@synthesize dispViewDelegate; + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super init]; + if (self == nil) + { + return self; + } + + dispViewDelegate = nil; + lastFrameSize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2.0); + glTexPixelFormat = GL_UNSIGNED_SHORT_1_5_5_5_REV; + glTexRenderStyle = GL_LINEAR; + + UInt32 w = GetNearestPositivePOT((UInt32)lastFrameSize.width); + UInt32 h = GetNearestPositivePOT((UInt32)lastFrameSize.height); + glTexBack = (GLvoid *)calloc(w * h, sizeof(UInt16)); + glTexBackSize = NSMakeSize(w, h); + + return self; +} + +- (void)dealloc +{ + [NSOpenGLContext clearCurrentContext]; + + free(glTexBack); + glTexBack = NULL; + + self.dispViewDelegate = nil; + + [super dealloc]; +} + +- (void)drawRect:(NSRect)dirtyRect +{ + [CocoaDSUtil messageSendOneWay:dispViewDelegate.sendPortDisplay msgID:MESSAGE_REDRAW_VIEW]; +} + +- (void)setFrame:(NSRect)rect +{ + NSRect frame = [self frame]; + + [super setFrame:rect]; + [CocoaDSUtil messageSendOneWayWithRect:dispViewDelegate.sendPortDisplay msgID:MESSAGE_RESIZE_VIEW rect:rect]; + + if (rect.size.width == frame.size.width && rect.size.height == frame.size.height) + { + [CocoaDSUtil messageSendOneWay:dispViewDelegate.sendPortDisplay msgID:MESSAGE_REDRAW_VIEW]; + } +} + +- (void) prepareOpenGL +{ + glDisable(GL_DITHER); + glDisable(GL_ALPHA_TEST); + glDisable(GL_BLEND); + glDisable(GL_STENCIL_TEST); + glDisable(GL_FOG); + glDisable(GL_DEPTH_TEST); + glEnable(GL_TEXTURE_2D); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClearDepth(1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glGenTextures(1, &drawTexture[0]); + glBindTexture(GL_TEXTURE_2D, drawTexture[0]); +} + +- (void) drawVideoFrame +{ + GLfloat w = (GLfloat)dispViewDelegate.normalSize.width; + GLfloat h = (GLfloat)dispViewDelegate.normalSize.height; + GLfloat texRatioW = (GLfloat)lastFrameSize.width / (GLfloat)GetNearestPositivePOT((UInt32)lastFrameSize.width); + GLfloat texRatioH = (GLfloat)lastFrameSize.height / (GLfloat)GetNearestPositivePOT((UInt32)lastFrameSize.height); + + glClear(GL_COLOR_BUFFER_BIT); + + glBegin(GL_QUADS); + + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-(w/2.0f), (h/2.0f), 0.0f); + + glTexCoord2f(texRatioW, 0.0f); + glVertex3f((w/2.0f), (h/2.0f), 0.0f); + + glTexCoord2f(texRatioW, texRatioH); + glVertex3f((w/2.0f), -(h/2.0f), 0.0f); + + glTexCoord2f(0.0f, texRatioH); + glVertex3f(-(w/2.0f), -(h/2.0f), 0.0f); + + glEnd(); + + glFlush(); +} + +- (void) uploadFrameTexture:(const GLvoid *)frameBytes textureSize:(NSSize)textureSize +{ + UInt32 w = GetNearestPositivePOT((UInt32)textureSize.width); + UInt32 h = GetNearestPositivePOT((UInt32)textureSize.height); + NSUInteger bitDepth; + + if (glTexPixelFormat == GL_UNSIGNED_SHORT_1_5_5_5_REV) + { + bitDepth = sizeof(UInt16); + } + else + { + bitDepth = sizeof(UInt32); + } + + if (glTexBackSize.width != w || glTexBackSize.height != h) + { + glTexBackSize.width = w; + glTexBackSize.height = h; + + free(glTexBack); + glTexBack = (GLvoid *)calloc(w * h, bitDepth); + if (glTexBack == NULL) + { + return; + } + } + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)w, (GLsizei)h, 0, GL_RGBA, glTexPixelFormat, glTexBack); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, (GLsizei)textureSize.width, (GLsizei)textureSize.height, GL_RGBA, glTexPixelFormat, frameBytes); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, glTexRenderStyle); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, glTexRenderStyle); +} + +- (void)keyDown:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleKeyPress:theEvent keyPressed:YES]; + if (!isHandled) + { + [super keyDown:theEvent]; + } +} + +- (void)keyUp:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleKeyPress:theEvent keyPressed:NO]; + if (!isHandled) + { + [super keyUp:theEvent]; + } +} + +- (void)mouseDown:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleMouseButton:theEvent buttonPressed:YES]; + if (!isHandled) + { + [super mouseDown:theEvent]; + } +} + +- (void)mouseDragged:(NSEvent *)theEvent +{ + [self mouseDown:theEvent]; +} + +- (void)mouseUp:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleMouseButton:theEvent buttonPressed:NO]; + if (!isHandled) + { + [super mouseUp:theEvent]; + } +} + +- (void)rightMouseDown:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleMouseButton:theEvent buttonPressed:YES]; + if (!isHandled) + { + [super rightMouseDown:theEvent]; + } +} + +- (void)rightMouseDragged:(NSEvent *)theEvent +{ + [self rightMouseDown:theEvent]; +} + +- (void)rightMouseUp:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleMouseButton:theEvent buttonPressed:NO]; + if (!isHandled) + { + [super rightMouseUp:theEvent]; + } +} + +- (void)otherMouseDown:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleMouseButton:theEvent buttonPressed:YES]; + if (!isHandled) + { + [super otherMouseDown:theEvent]; + } +} + +- (void)otherMouseDragged:(NSEvent *)theEvent +{ + [self otherMouseDown:theEvent]; +} + +- (void)otherMouseUp:(NSEvent *)theEvent +{ + BOOL isHandled = [dispViewDelegate handleMouseButton:theEvent buttonPressed:NO]; + if (!isHandled) + { + [super otherMouseUp:theEvent]; + } +} + +- (BOOL)acceptsFirstResponder +{ + return YES; +} + +- (BOOL)becomeFirstResponder +{ + return YES; +} + +- (BOOL)resignFirstResponder +{ + return YES; +} + +- (void)doInitVideoOutput:(NSDictionary *)properties +{ + GLfloat scale = (GLfloat)[dispViewDelegate scale]; + GLfloat rotation = (GLfloat)[dispViewDelegate rotation]; + NSRect rect = [self frame]; + + [[self openGLContext] makeCurrentContext]; + SetupOpenGLView((GLsizei)rect.size.width, (GLsizei)rect.size.height, scale, rotation); + + [dispViewDelegate setViewToBlack]; +} + +- (void)doProcessVideoFrame:(const void *)videoFrameData frameSize:(NSSize)frameSize +{ + [[self openGLContext] makeCurrentContext]; + [self uploadFrameTexture:(const GLvoid *)videoFrameData textureSize:frameSize]; + lastFrameSize = frameSize; + [self drawVideoFrame]; +} + +- (void)doResizeView:(NSRect)rect +{ + [[self openGLContext] makeCurrentContext]; + SetupOpenGLView((GLsizei)rect.size.width, (GLsizei)rect.size.height, (GLfloat)[dispViewDelegate scale], (GLfloat)[dispViewDelegate rotation]); + [[self openGLContext] update]; +} + +- (void)doRedraw +{ + [[self openGLContext] makeCurrentContext]; + [self drawVideoFrame]; +} + +- (void) doBilinearOutputChanged:(BOOL)useBilinear +{ + glTexRenderStyle = GL_NEAREST; + if (useBilinear) + { + glTexRenderStyle = GL_LINEAR; + } +} + +- (void)doVideoFilterChanged:(NSInteger)videoFilterTypeID +{ + glTexPixelFormat = GL_UNSIGNED_INT_8_8_8_8_REV; + if (videoFilterTypeID == VideoFilterTypeID_None) + { + glTexPixelFormat = GL_UNSIGNED_SHORT_1_5_5_5_REV; + } +} + +@end + +void SetupOpenGLView(GLsizei width, GLsizei height, GLfloat scalar, GLfloat angleDegrees) +{ + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0.0, width, 0.0, height, -1.0, 1.0); + + glTranslatef(width / 2.0f, height / 2.0f, 0.0f); + glRotatef((GLfloat)CLOCKWISE_DEGREES(angleDegrees), 0.0f, 0.0f, 1.0f); + glScalef(scalar, scalar, 0.0f); +} diff --git a/desmume/src/cocoa/userinterface/emuWindowDelegate.h b/desmume/src/cocoa/userinterface/emuWindowDelegate.h new file mode 100644 index 000000000..1ee043d76 --- /dev/null +++ b/desmume/src/cocoa/userinterface/emuWindowDelegate.h @@ -0,0 +1,215 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import + +@protocol DisplayViewDelegate; +@class CocoaDSRom; +@class CocoaDSSpeaker; +@class CocoaDSCheatManager; +@class DisplayViewDelegate; +@class CheatWindowDelegate; + + +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 +@interface EmuWindowDelegate : NSObject +#else +@interface EmuWindowDelegate : NSObject +#endif +{ + NSObject *dummyObject; + NSWindow *window; + NSWindow *saveFileMigrationSheet; + NSWindow *saveStatePrecloseSheet; + NSView *displayView; + NSView *exportRomSavePanelAccessoryView; + NSView *saveScreenshotPanelAccessoryView; + CocoaDSRom *currentRom; + CocoaDSSpeaker *cdsSpeaker; + CocoaDSCheatManager *cdsCheats; + CocoaDSCheatManager *dummyCheatList; + + DisplayViewDelegate *dispViewDelegate; + CheatWindowDelegate *cheatWindowDelegate; + NSObjectController *romInfoPanelController; + NSObjectController *firmwarePanelController; + NSObjectController *cdsCoreController; + NSObjectController *cdsDisplayController; + NSObjectController *cdsSoundController; + NSObjectController *emuWindowController; + NSObjectController *cheatWindowController; + NSArrayController *cheatListController; + NSArrayController *cheatDatabaseController; + + NSImage *iconVolumeFull; + NSImage *iconVolumeTwoThird; + NSImage *iconVolumeOneThird; + NSImage *iconVolumeMute; + NSImage *iconExecute; + NSImage *iconPause; + NSImage *iconSpeedNormal; + NSImage *iconSpeedDouble; + + BOOL isRomLoading; + BOOL isSheetControllingExecution; + BOOL isShowingSaveStateSheet; + BOOL isShowingFileMigrationSheet; + BOOL isShowingStatusBar; + NSUInteger statusBarHeight; + NSSize minDisplayViewSize; + BOOL isMinSizeNormal; + NSBitmapImageFileType screenshotFileFormat; + + NSURL *currentEmuSaveStateURL; + NSInteger selectedExportRomSaveID; + NSInteger selectedRomSaveTypeID; + + NSMutableDictionary *bindings; +} + +@property (readonly) IBOutlet NSObject *dummyObject; +@property (readonly) IBOutlet NSWindow *window; +@property (readonly) IBOutlet NSWindow *saveFileMigrationSheet; +@property (readonly) IBOutlet NSWindow *saveStatePrecloseSheet; +@property (readonly) IBOutlet NSView *displayView; +@property (readonly) IBOutlet NSView *exportRomSavePanelAccessoryView; +@property (readonly) IBOutlet NSView *saveScreenshotPanelAccessoryView; +@property (assign) CocoaDSRom *currentRom; +@property (assign) CocoaDSSpeaker *cdsSpeaker; +@property (assign) CocoaDSCheatManager *cdsCheats; + +@property (retain) DisplayViewDelegate *dispViewDelegate; +@property (readonly) IBOutlet CheatWindowDelegate *cheatWindowDelegate; +@property (readonly) IBOutlet NSObjectController *romInfoPanelController; +@property (readonly) IBOutlet NSObjectController *firmwarePanelController; +@property (readonly) IBOutlet NSObjectController *cdsCoreController; +@property (readonly) IBOutlet NSObjectController *cdsDisplayController; +@property (readonly) IBOutlet NSObjectController *cdsSoundController; +@property (readonly) IBOutlet NSObjectController *emuWindowController; +@property (readonly) IBOutlet NSObjectController *cheatWindowController; +@property (readonly) IBOutlet NSArrayController *cheatListController; +@property (readonly) IBOutlet NSArrayController *cheatDatabaseController; + +@property (assign) BOOL isSheetControllingExecution; +@property (assign) BOOL isShowingSaveStateSheet; +@property (assign) BOOL isShowingFileMigrationSheet; +@property (assign) NSInteger selectedRomSaveTypeID; + +@property (assign) NSMutableDictionary *bindings; + +- (void) setContentScalar:(double)s; +- (void) setContentRotation:(double)angleDegrees; +- (double) resizeWithTransform:(NSSize)normalBounds scalar:(double)scalar rotation:(double)angleDegrees; +- (double) maxContentScalar:(NSSize)contentBounds; +- (void) setVolume:(float)vol; +- (float) volume; +- (void) setIsRomLoaded:(BOOL)theState; +- (BOOL) isRomLoaded; +- (void) setStatus:(NSString *)theString; +- (NSString *) status; + +// File Menu +- (IBAction) openRom:(id)sender; +- (IBAction) closeRom:(id)sender; +- (IBAction) openEmuSaveState:(id)sender; +- (IBAction) saveEmuSaveState:(id)sender; +- (IBAction) saveEmuSaveStateAs:(id)sender; +- (IBAction) revertEmuSaveState:(id)sender; +- (IBAction) loadEmuSaveStateSlot:(id)sender; +- (IBAction) saveEmuSaveStateSlot:(id)sender; +- (IBAction) importRomSave:(id)sender; +- (IBAction) exportRomSave:(id)sender; +- (IBAction) selectExportRomSaveFormat:(id)sender; + +// Edit Menu +- (IBAction) copy:(id)sender; + +// Emulation Menu +- (IBAction) speedLimitDisable:(id)sender; +- (IBAction) toggleAutoFrameSkip:(id)sender; +- (IBAction) cheatsDisable:(id)sender; +- (IBAction) ejectCard:(id)sender; +- (IBAction) executeCoreToggle:(id)sender; +- (IBAction) resetCore:(id)sender; +- (IBAction) changeRomSaveType:(id)sender; + +// View Menu +- (IBAction) hudDisable:(id)sender; +- (IBAction) toggleKeepMinDisplaySizeAtNormal:(id)sender; +- (IBAction) toggleStatusBar:(id)sender; + +// Tools Menu +- (IBAction) selectScreenshotFileFormat:(id)sender; +- (IBAction) saveScreenshotAs:(id)sender; +- (void) saveScreenshotAsFinish:(NSNotification *)aNotification; +- (IBAction) toggleGPUState:(id)sender; + +// Help Menu + + +// Window Elements + +- (BOOL) handleLoadRom:(NSURL *)fileURL; +- (BOOL) handleUnloadRom:(NSInteger)reasonID romToLoad:(NSURL *)romURL; +- (BOOL) loadRom:(NSURL *)romURL; +- (void) loadRomDidFinish:(NSNotification *)aNotification; +- (BOOL) unloadRom; + +- (void) executeCore; +- (void) pauseCore; +- (void) restoreCoreState; + +- (IBAction) changeCoreSpeed:(id)sender; +- (IBAction) changeCoreEmuFlags:(id)sender; +- (IBAction) changeFirmwareSettings:(id)sender; +- (IBAction) changeVolume:(id)sender; +- (IBAction) changeAudioEngine:(id)sender; +- (IBAction) changeSpuAdvancedLogic:(id)sender; +- (IBAction) changeSpuInterpolationMode:(id)sender; +- (IBAction) changeSpuSyncMode:(id)sender; +- (IBAction) changeSpuSyncMethod:(id)sender; +- (IBAction) changeScale:(id)sender; +- (IBAction) changeRotation:(id)sender; +- (IBAction) changeRotationRelative:(id)sender; +- (IBAction) changeBilinearOutput:(id)sender; +- (IBAction) changeDisplayMode:(id)sender; +- (IBAction) changeVideoFilter:(id)sender; +- (IBAction) change3DRenderMethod:(id)sender; +- (IBAction) change3DRenderHighPrecisionColorInterpolation:(id)sender; +- (IBAction) change3DRenderEdgeMarking:(id)sender; +- (IBAction) change3DRenderFog:(id)sender; +- (IBAction) change3DRenderTextures:(id)sender; +- (IBAction) change3DRenderDepthComparisonThreshold:(id)sender; +- (IBAction) change3DRenderThreads:(id)sender; +- (IBAction) change3DRenderLineHack:(id)sender; + +- (IBAction) closeMigrationSheet:(id)sender; +- (void) didEndFileMigrationSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; +- (void) didEndSaveStateSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; +- (void) didEndSaveStateSheetOpen:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; +- (void) didEndSaveStateSheetTerminate:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; + +- (void) setupUserDefaults; +- (IBAction) writeDefaultsDisplayRotation:(id)sender; +- (IBAction) writeDefaultsHUDSettings:(id)sender; +- (IBAction) writeDefaultsVideoOutputSettings:(id)sender; +- (IBAction) writeDefaults3DRenderingSettings:(id)sender; +- (IBAction) writeDefaultsEmulationSettings:(id)sender; +- (IBAction) writeDefaultsSoundSettings:(id)sender; + +@end diff --git a/desmume/src/cocoa/userinterface/emuWindowDelegate.mm b/desmume/src/cocoa/userinterface/emuWindowDelegate.mm new file mode 100644 index 000000000..668138e95 --- /dev/null +++ b/desmume/src/cocoa/userinterface/emuWindowDelegate.mm @@ -0,0 +1,2033 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "emuWindowDelegate.h" +#import "cheatWindowDelegate.h" +#import "displayView.h" + +#import "cocoa_globals.h" +#import "cocoa_core.h" +#import "cocoa_cheat.h" +#import "cocoa_file.h" +#import "cocoa_firmware.h" +#import "cocoa_output.h" +#import "cocoa_rom.h" +#import "cocoa_util.h" + +#undef BOOL + + +@implementation EmuWindowDelegate + +@dynamic dummyObject; +@synthesize window; +@synthesize saveFileMigrationSheet; +@synthesize saveStatePrecloseSheet; +@synthesize displayView; +@synthesize exportRomSavePanelAccessoryView; +@synthesize saveScreenshotPanelAccessoryView; +@synthesize currentRom; +@synthesize cdsSpeaker; +@synthesize cdsCheats; + +@synthesize dispViewDelegate; +@synthesize cheatWindowDelegate; +@synthesize romInfoPanelController; +@synthesize firmwarePanelController; +@synthesize cdsCoreController; +@synthesize cdsDisplayController; +@synthesize cdsSoundController; +@synthesize emuWindowController; +@synthesize cheatWindowController; +@synthesize cheatListController; +@synthesize cheatDatabaseController; + +@synthesize isSheetControllingExecution; +@synthesize isShowingSaveStateSheet; +@synthesize isShowingFileMigrationSheet; +@synthesize selectedRomSaveTypeID; + +@synthesize bindings; + +- (id)init +{ + self = [super init]; + if(self == nil) + { + return nil; + } + + bindings = [[NSMutableDictionary alloc] init]; + if (bindings == nil) + { + [self release]; + self = nil; + return self; + } + + iconExecute = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Execute_420x420" ofType:@"png"]]; + iconPause = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Pause_420x420" ofType:@"png"]]; + iconSpeedNormal = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Speed1x_420x420" ofType:@"png"]]; + iconSpeedDouble = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Speed2x_420x420" ofType:@"png"]]; + iconVolumeFull = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeFull_16x16" ofType:@"png"]]; + iconVolumeTwoThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeTwoThird_16x16" ofType:@"png"]]; + iconVolumeOneThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeOneThird_16x16" ofType:@"png"]]; + iconVolumeMute = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeMute_16x16" ofType:@"png"]]; + + dispViewDelegate = nil; + currentRom = nil; + cdsSpeaker = nil; + dummyCheatList = nil; + isRomLoading = NO; + isSheetControllingExecution = NO; + isShowingSaveStateSheet = NO; + isShowingFileMigrationSheet = NO; + isShowingStatusBar = YES; + statusBarHeight = WINDOW_STATUS_BAR_HEIGHT; + minDisplayViewSize = NSMakeSize(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2); + isMinSizeNormal = YES; + screenshotFileFormat = NSTIFFFileType; + currentEmuSaveStateURL = nil; + selectedExportRomSaveID = 0; + selectedRomSaveTypeID = ROMSAVETYPE_AUTOMATIC; + + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isWorking"]; + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isRomLoaded"]; + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isShowingStatusBar"]; + [bindings setValue:[NSNumber numberWithFloat:MAX_VOLUME] forKey:@"volume"]; + [bindings setObject:iconVolumeFull forKey:@"volumeIconImage"]; + [bindings setValue:NSSTRING_STATUS_READY forKey:@"status"]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(loadRomDidFinish:) + name:@"com.DeSmuME.DeSmuME.loadRomDidFinish" + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(saveScreenshotAsFinish:) + name:@"com.DeSmuME.DeSmuME.requestScreenshotDidFinish" + object:nil]; + + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [iconExecute release]; + [iconPause release]; + [iconSpeedNormal release]; + [iconSpeedDouble release]; + [iconVolumeFull release]; + [iconVolumeTwoThird release]; + [iconVolumeOneThird release]; + [iconVolumeMute release]; + [bindings release]; + [self setDispViewDelegate:nil]; + + [super dealloc]; +} + +- (void) setContentScalar:(double)s +{ + [dispViewDelegate setScale:s]; + + // Resize the window when contentScalar changes. + NSSize drawBounds = [dispViewDelegate normalSize]; + [self resizeWithTransform:drawBounds scalar:s rotation:[dispViewDelegate rotation]]; +} + +- (void) setContentRotation:(double)angleDegrees +{ + double newAngleDegrees = fmod(angleDegrees, 360.0); + if (newAngleDegrees < 0.0) + { + newAngleDegrees = 360.0 + newAngleDegrees; + } + + if (newAngleDegrees == 360.0) + { + newAngleDegrees = 0.0; + } + + [dispViewDelegate setRotation:newAngleDegrees]; + + // Set the minimum content size for the window, since this will change based on rotation. + NSSize drawBounds = minDisplayViewSize; + NSSize minContentSize = GetTransformedBounds(drawBounds, 1.0, CLOCKWISE_DEGREES(newAngleDegrees)); + minContentSize.height += statusBarHeight; + [window setContentMinSize:minContentSize]; + + // Resize the window. + NSSize oldBounds = [window frame].size; + [self resizeWithTransform:[dispViewDelegate normalSize] scalar:[dispViewDelegate scale] rotation:newAngleDegrees]; + NSSize newBounds = [window frame].size; + + // If the window size didn't change, it is possible that the old and new rotation angles + // are 180 degrees offset from each other. In this case, we'll need to force the + // display view to update itself. + if (oldBounds.width == newBounds.width && oldBounds.height == newBounds.height) + { + NSRect newContentFrame = [[window contentView] bounds]; + newContentFrame.origin.y = statusBarHeight; + newContentFrame.size.height -= statusBarHeight; + [displayView setFrame:newContentFrame]; + } +} + +- (double) resizeWithTransform:(NSSize)normalBounds scalar:(double)scalar rotation:(double)angleDegrees +{ + // Convert angle to clockwise-direction degrees. + angleDegrees = CLOCKWISE_DEGREES(angleDegrees); + + // Get the maximum scalar size within drawBounds. Constrain scalar to maxScalar if necessary. + NSSize checkSize = GetTransformedBounds(normalBounds, 1.0, angleDegrees); + double maxScalar = [self maxContentScalar:checkSize]; + if (scalar > maxScalar) + { + scalar = maxScalar; + } + + // Get the new bounds for the window's content view based on the transformed draw bounds. + NSSize transformedBounds = GetTransformedBounds(normalBounds, scalar, angleDegrees); + + // Get the center of the content view in screen coordinates. + NSRect windowContentRect = [[window contentView] bounds]; + double translationX = (windowContentRect.size.width - transformedBounds.width) / 2.0; + double translationY = ((windowContentRect.size.height - statusBarHeight) - transformedBounds.height) / 2.0; + + // Resize the window. + NSRect windowFrame = [window frame]; + NSRect newFrame = [window frameRectForContentRect:NSMakeRect(windowFrame.origin.x + translationX, windowFrame.origin.y + translationY, transformedBounds.width, transformedBounds.height + statusBarHeight)]; + [window setFrame:newFrame display:YES animate:NO]; + + return scalar; +} + +- (double) maxContentScalar:(NSSize)contentBounds +{ + // Determine the maximum scale based on the visible screen size (which + // doesn't include the menu bar or dock). + NSRect screenFrame = [[NSScreen mainScreen] visibleFrame]; + NSRect windowFrame = [window frameRectForContentRect:NSMakeRect(0.0, 0.0, contentBounds.width, contentBounds.height + statusBarHeight)]; + + NSSize visibleScreenBounds = { (screenFrame.size.width - (windowFrame.size.width - contentBounds.width)), (screenFrame.size.height - (windowFrame.size.height - contentBounds.height)) }; + double maxS = GetMaxScalarInBounds(contentBounds.width, contentBounds.height, visibleScreenBounds.width, visibleScreenBounds.height); + + return maxS; +} + +- (void) setVolume:(float)vol +{ + [bindings setValue:[NSNumber numberWithFloat:vol] forKey:@"volume"]; + + // Update the icon. + NSImage *currentImage = [bindings valueForKey:@"volumeIconImage"]; + NSImage *newImage = nil; + if (vol <= 0.0f) + { + newImage = iconVolumeMute; + } + else if (vol > 0.0f && vol <= VOLUME_THRESHOLD_LOW) + { + newImage = iconVolumeOneThird; + } + else if (vol > VOLUME_THRESHOLD_LOW && vol <= VOLUME_THRESHOLD_HIGH) + { + newImage = iconVolumeTwoThird; + } + else + { + newImage = iconVolumeFull; + } + + if (newImage != currentImage) + { + [bindings setObject:newImage forKey:@"volumeIconImage"]; + } +} + +- (float) volume +{ + return [(NSNumber *)[bindings valueForKey:@"volume"] floatValue]; +} + +- (void) setIsRomLoaded:(BOOL)theState +{ + [bindings setValue:[NSNumber numberWithBool:theState] forKey:@"isRomLoaded"]; +} + +- (BOOL) isRomLoaded +{ + return [(NSNumber *)[bindings valueForKey:@"isRomLoaded"] boolValue]; +} + +- (void) setStatus:(NSString *)theString +{ + [bindings setValue:theString forKey:@"status"]; +} + +- (NSString *) status +{ + return (NSString *)[bindings valueForKey:@"status"]; +} + +- (IBAction) openRom:(id)sender +{ + if (isRomLoading) + { + return; + } + + NSURL *selectedFile = nil; + NSInteger buttonClicked = NSFileHandlingPanelCancelButton; + NSOpenPanel *panel = [NSOpenPanel openPanel]; + + [panel setCanChooseDirectories:NO]; + [panel setCanChooseFiles:YES]; + [panel setResolvesAliases:YES]; + [panel setAllowsMultipleSelection:NO]; + [panel setTitle:NSSTRING_TITLE_OPEN_ROM_PANEL]; + NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_ROM_DS, @FILE_EXT_ROM_GBA, nil]; + + // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: + // is deprecated in Mac OS X v10.6. +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + [panel setAllowedFileTypes:fileTypes]; + buttonClicked = [panel runModal]; +#else + buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; +#endif + + if (buttonClicked == NSFileHandlingPanelOKButton) + { + selectedFile = [[panel URLs] lastObject]; + if(selectedFile == nil) + { + return; + } + } + else + { + return; + } + + [self handleLoadRom:selectedFile]; +} + +- (IBAction) closeRom:(id)sender; +{ + [self handleUnloadRom:REASONFORCLOSE_NORMAL romToLoad:nil]; +} + +- (IBAction) openEmuSaveState:(id)sender +{ + BOOL result = NO; + NSURL *selectedFile = nil; + NSInteger buttonClicked = NSFileHandlingPanelCancelButton; + NSOpenPanel *panel = [NSOpenPanel openPanel]; + + [panel setCanChooseDirectories:NO]; + [panel setCanChooseFiles:YES]; + [panel setResolvesAliases:YES]; + [panel setAllowsMultipleSelection:NO]; + [panel setTitle:NSSTRING_TITLE_OPEN_STATE_FILE_PANEL]; + NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_SAVE_STATE, nil]; + + // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: + // is deprecated in Mac OS X v10.6. +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + [panel setAllowedFileTypes:fileTypes]; + buttonClicked = [panel runModal]; +#else + buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; +#endif + + if (buttonClicked == NSFileHandlingPanelOKButton) + { + selectedFile = [[panel URLs] lastObject]; + if(selectedFile == nil) + { + return; + } + } + else + { + return; + } + + [self pauseCore]; + + result = [CocoaDSFile loadState:selectedFile]; + if (result == NO) + { + [self setStatus:NSSTRING_STATUS_SAVESTATE_LOADING_FAILED]; + [self restoreCoreState]; + return; + } + + currentEmuSaveStateURL = selectedFile; + [currentEmuSaveStateURL retain]; + [window setDocumentEdited:YES]; + + [self restoreCoreState]; + [self setStatus:NSSTRING_STATUS_SAVESTATE_LOADED]; +} + +- (IBAction) saveEmuSaveState:(id)sender +{ + BOOL result = NO; + + if ([window isDocumentEdited] && currentEmuSaveStateURL != nil) + { + [self pauseCore]; + + result = [CocoaDSFile saveState:currentEmuSaveStateURL]; + if (result == NO) + { + [self setStatus:NSSTRING_STATUS_SAVESTATE_SAVING_FAILED]; + return; + } + + [window setDocumentEdited:YES]; + + [self restoreCoreState]; + [self setStatus:NSSTRING_STATUS_SAVESTATE_SAVED]; + } + else + { + [self saveEmuSaveStateAs:sender]; + } +} + +- (IBAction) saveEmuSaveStateAs:(id)sender +{ + BOOL result = NO; + NSInteger buttonClicked = NSFileHandlingPanelCancelButton; + NSSavePanel *panel = [NSSavePanel savePanel]; + + [panel setCanCreateDirectories:YES]; + [panel setTitle:NSSTRING_TITLE_SAVE_STATE_FILE_PANEL]; + [panel setRequiredFileType:@FILE_EXT_SAVE_STATE]; + + buttonClicked = [panel runModal]; + if(buttonClicked == NSOKButton) + { + [self pauseCore]; + + NSURL *saveFileURL = [panel URL]; + + result = [CocoaDSFile saveState:saveFileURL]; + if (result == NO) + { + [self setStatus:NSSTRING_STATUS_SAVESTATE_SAVING_FAILED]; + return; + } + + currentEmuSaveStateURL = saveFileURL; + [currentEmuSaveStateURL retain]; + [window setDocumentEdited:YES]; + + [self restoreCoreState]; + [self setStatus:NSSTRING_STATUS_SAVESTATE_SAVED]; + } +} + +- (IBAction) revertEmuSaveState:(id)sender +{ + BOOL result = NO; + + if ([window isDocumentEdited] && currentEmuSaveStateURL != nil) + { + [self pauseCore]; + + result = [CocoaDSFile loadState:currentEmuSaveStateURL]; + if (result == NO) + { + [self setStatus:NSSTRING_STATUS_SAVESTATE_REVERTING_FAILED]; + return; + } + + [window setDocumentEdited:YES]; + + [self restoreCoreState]; + [self setStatus:NSSTRING_STATUS_SAVESTATE_REVERTED]; + } +} + +- (IBAction) loadEmuSaveStateSlot:(id)sender +{ + BOOL result = NO; + NSInteger i = [CocoaDSUtil getIBActionSenderTag:sender]; + + NSString *saveStatePath = [[CocoaDSFile saveStateURL] path]; + if (saveStatePath == nil) + { + // Should throw an error message here... + return; + } + + if (i < 0 || i > MAX_SAVESTATE_SLOTS) + { + return; + } + + NSURL *currentRomURL = [[self currentRom] fileURL]; + NSString *fileName = [CocoaDSFile saveSlotFileName:currentRomURL slotNumber:(NSUInteger)(i + 1)]; + if (fileName == nil) + { + return; + } + + [self pauseCore]; + + result = [CocoaDSFile loadState:[NSURL fileURLWithPath:[saveStatePath stringByAppendingPathComponent:fileName]]]; + if (result == NO) + { + [self setStatus:NSSTRING_STATUS_SAVESTATE_LOADING_FAILED]; + } + + [self restoreCoreState]; + [self setStatus:NSSTRING_STATUS_SAVESTATE_LOADED]; +} + +- (IBAction) saveEmuSaveStateSlot:(id)sender +{ + BOOL result = NO; + NSInteger i = [CocoaDSUtil getIBActionSenderTag:sender]; + + NSString *saveStatePath = [[CocoaDSFile saveStateURL] path]; + if (saveStatePath == nil) + { + [self setStatus:NSSTRING_STATUS_CANNOT_GENERATE_SAVE_PATH]; + return; + } + + result = [CocoaDSFile createUserAppSupportDirectory:@"States"]; + if (result == NO) + { + [self setStatus:NSSTRING_STATUS_CANNOT_CREATE_SAVE_DIRECTORY]; + return; + } + + if (i < 0 || i > MAX_SAVESTATE_SLOTS) + { + return; + } + + NSURL *currentRomURL = [[self currentRom] fileURL]; + NSString *fileName = [CocoaDSFile saveSlotFileName:currentRomURL slotNumber:(NSUInteger)(i + 1)]; + if (fileName == nil) + { + return; + } + + [self pauseCore]; + + result = [CocoaDSFile saveState:[NSURL fileURLWithPath:[saveStatePath stringByAppendingPathComponent:fileName]]]; + if (result == NO) + { + [self setStatus:NSSTRING_STATUS_SAVESTATE_SAVING_FAILED]; + return; + } + + [self restoreCoreState]; + [self setStatus:NSSTRING_STATUS_SAVESTATE_SAVED]; +} + +- (IBAction) importRomSave:(id)sender +{ + NSURL *selectedFile = nil; + NSInteger buttonClicked = NSFileHandlingPanelCancelButton; + NSOpenPanel *panel = [NSOpenPanel openPanel]; + + [panel setCanChooseDirectories:NO]; + [panel setCanChooseFiles:YES]; + [panel setResolvesAliases:YES]; + [panel setAllowsMultipleSelection:NO]; + [panel setTitle:NSSTRING_TITLE_IMPORT_ROM_SAVE_PANEL]; + NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_ROM_SAVE_NOGBA, @FILE_EXT_ACTION_REPLAY_SAVE, nil]; + + // The NSOpenPanel method -(NSInt)runModalForDirectory:file:types: + // is deprecated in Mac OS X v10.6. +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + [panel setAllowedFileTypes:fileTypes]; + buttonClicked = [panel runModal]; +#else + buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes]; +#endif + + if (buttonClicked == NSFileHandlingPanelOKButton) + { + selectedFile = [[panel URLs] lastObject]; + if(selectedFile == nil) + { + return; + } + } + else + { + return; + } + + BOOL result = [CocoaDSFile importRomSave:selectedFile]; + if (!result) + { + [self setStatus:NSSTRING_STATUS_ROM_SAVE_IMPORT_FAILED]; + return; + } + + [self setStatus:NSSTRING_STATUS_ROM_SAVE_IMPORTED]; +} + +- (IBAction) exportRomSave:(id)sender +{ + [self pauseCore]; + + BOOL result = NO; + NSInteger buttonClicked; + NSSavePanel *panel = [NSSavePanel savePanel]; + [panel setTitle:NSSTRING_TITLE_EXPORT_ROM_SAVE_PANEL]; + [panel setCanCreateDirectories:YES]; + [panel setAccessoryView:exportRomSavePanelAccessoryView]; + + //save it + buttonClicked = [panel runModal]; + if(buttonClicked == NSOKButton) + { + NSURL *romSaveURL = [CocoaDSFile fileURLFromRomURL:[[self currentRom] fileURL] toKind:@"ROM Save"]; + if (romSaveURL != nil) + { + result = [CocoaDSFile exportRomSaveToURL:[panel URL] romSaveURL:romSaveURL fileType:selectedExportRomSaveID]; + if (result == NO) + { + [self setStatus:NSSTRING_STATUS_ROM_SAVE_EXPORT_FAILED]; + return; + } + + [self setStatus:NSSTRING_STATUS_ROM_SAVE_EXPORTED]; + } + } + + [self restoreCoreState]; +} + +- (IBAction) selectExportRomSaveFormat:(id)sender +{ + selectedExportRomSaveID = [CocoaDSUtil getIBActionSenderTag:sender]; +} + +- (IBAction)copy:(id)sender +{ + [dispViewDelegate copyToPasteboard]; +} + +// Emulation Menu +- (IBAction) executeCoreToggle:(id)sender +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + + if ([cdsCore coreState] == CORESTATE_PAUSE) + { + if ([self isRomLoaded]) + { + [self executeCore]; + } + } + else + { + [self pauseCore]; + } +} + +- (IBAction) resetCore:(id)sender +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + + if ([self isRomLoaded]) + { + [self setStatus:NSSTRING_STATUS_EMULATOR_RESETTING]; + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isWorking"]; + [window displayIfNeeded]; + + [cdsCore reset]; + if ([cdsCore coreState] == CORESTATE_PAUSE) + { + [[self dispViewDelegate] setViewToWhite]; + } + + [self setStatus:NSSTRING_STATUS_EMULATOR_RESET]; + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isWorking"]; + [window displayIfNeeded]; + } +} + +- (IBAction) speedLimitDisable:(id)sender +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + + if ([cdsCore isSpeedLimitEnabled]) + { + [cdsCore setIsSpeedLimitEnabled:NO]; + [self setStatus:NSSTRING_STATUS_SPEED_LIMIT_DISABLED]; + } + else + { + [cdsCore setIsSpeedLimitEnabled:YES]; + [self setStatus:NSSTRING_STATUS_SPEED_LIMIT_ENABLED]; + } +} + +- (IBAction) toggleAutoFrameSkip:(id)sender +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + + if ([cdsCore isFrameSkipEnabled]) + { + [cdsCore setIsFrameSkipEnabled:NO]; + [self setStatus:NSSTRING_STATUS_AUTO_FRAME_SKIP_DISABLED]; + } + else + { + [cdsCore setIsFrameSkipEnabled:YES]; + [self setStatus:NSSTRING_STATUS_AUTO_FRAME_SKIP_ENABLED]; + } +} + +- (IBAction) changeRomSaveType:(id)sender +{ + NSInteger saveTypeID = [CocoaDSUtil getIBActionSenderTag:sender]; + [self setSelectedRomSaveTypeID:saveTypeID]; + + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + [cdsCore changeRomSaveType:saveTypeID]; +} + +- (IBAction) cheatsDisable:(id)sender +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + + if ([cdsCore isCheatingEnabled]) + { + [cdsCore setIsCheatingEnabled:NO]; + [self setStatus:NSSTRING_STATUS_CHEATS_DISABLED]; + } + else + { + [cdsCore setIsCheatingEnabled:YES]; + [self setStatus:NSSTRING_STATUS_CHEATS_ENABLED]; + } +} + +- (IBAction) ejectCard:(id)sender +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + + [cdsCore toggleEjectCard]; +} + +// View Menu + +- (IBAction) changeCoreSpeed:(id)sender +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + + [cdsCore setSpeedScalar:(CGFloat)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0f]; +} + +- (IBAction) changeCoreEmuFlags:(id)sender +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + NSUInteger flags = [cdsCore emulationFlags]; + + NSInteger flagBit = [CocoaDSUtil getIBActionSenderTag:sender]; + if (flagBit < 0) + { + return; + } + + BOOL flagState = [CocoaDSUtil getIBActionSenderButtonStateBool:sender]; + if (flagState) + { + flags |= (1 << flagBit); + } + else + { + flags &= ~(1 << flagBit); + } + + [cdsCore setEmulationFlags:flags]; +} + +- (IBAction) changeFirmwareSettings:(id)sender +{ + // Force end of editing of any text fields. + [[(NSControl *)sender window] makeFirstResponder:nil]; + + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + [[cdsCore cdsFirmware] update]; +} + +- (IBAction) changeVolume:(id)sender +{ + float vol = [self volume]; + [self setVolume:vol]; + [self setStatus:[NSString stringWithFormat:NSSTRING_STATUS_VOLUME, vol]]; + [CocoaDSUtil messageSendOneWayWithFloat:[cdsSpeaker receivePort] msgID:MESSAGE_SET_VOLUME floatValue:vol]; +} + +- (IBAction) changeAudioEngine:(id)sender +{ + [CocoaDSUtil messageSendOneWayWithInteger:[cdsSpeaker receivePort] msgID:MESSAGE_SET_AUDIO_PROCESS_METHOD integerValue:[CocoaDSUtil getIBActionSenderTag:sender]]; +} + +- (IBAction) changeSpuAdvancedLogic:(id)sender +{ + [CocoaDSUtil messageSendOneWayWithBool:[cdsSpeaker receivePort] msgID:MESSAGE_SET_SPU_ADVANCED_LOGIC boolValue:[CocoaDSUtil getIBActionSenderButtonStateBool:sender]]; +} + +- (IBAction) changeSpuInterpolationMode:(id)sender +{ + [CocoaDSUtil messageSendOneWayWithInteger:[cdsSpeaker receivePort] msgID:MESSAGE_SET_SPU_INTERPOLATION_MODE integerValue:[CocoaDSUtil getIBActionSenderTag:sender]]; +} + +- (IBAction) changeSpuSyncMode:(id)sender +{ + [CocoaDSUtil messageSendOneWayWithInteger:[cdsSpeaker receivePort] msgID:MESSAGE_SET_SPU_SYNC_MODE integerValue:[CocoaDSUtil getIBActionSenderTag:sender]]; +} + +- (IBAction) changeSpuSyncMethod:(id)sender +{ + [CocoaDSUtil messageSendOneWayWithInteger:[cdsSpeaker receivePort] msgID:MESSAGE_SET_SPU_SYNC_METHOD integerValue:[CocoaDSUtil getIBActionSenderTag:sender]]; +} + +- (IBAction) changeScale:(id)sender +{ + [self setContentScalar:(double)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0]; +} + +- (IBAction) changeRotation:(id)sender +{ + // Get the rotation value from the sender. + if ([sender isMemberOfClass:[NSSlider class]]) + { + [self setContentRotation:[(NSSlider *)sender doubleValue]]; + } + else + { + [self setContentRotation:(double)[CocoaDSUtil getIBActionSenderTag:sender]]; + } +} + +- (IBAction) changeRotationRelative:(id)sender +{ + double angleDegrees = [dispViewDelegate rotation] + (double)[CocoaDSUtil getIBActionSenderTag:sender]; + [self setContentRotation:angleDegrees]; +} + +- (IBAction) changeBilinearOutput:(id)sender +{ + [dispViewDelegate setUseBilinearOutput:[CocoaDSUtil getIBActionSenderButtonStateBool:sender]]; +} + +- (IBAction) changeDisplayMode:(id)sender +{ + [dispViewDelegate setDisplayType:[CocoaDSUtil getIBActionSenderTag:sender]]; + [self resizeWithTransform:[dispViewDelegate normalSize] scalar:[dispViewDelegate scale] rotation:[dispViewDelegate rotation]]; +} + +- (IBAction) changeVideoFilter:(id)sender +{ + [dispViewDelegate setVideoFilterType:[CocoaDSUtil getIBActionSenderTag:sender]]; +} + +- (IBAction) change3DRenderMethod:(id)sender +{ + [dispViewDelegate setRender3DRenderingEngine:[CocoaDSUtil getIBActionSenderTag:sender]]; +} + +- (IBAction) change3DRenderHighPrecisionColorInterpolation:(id)sender +{ + [dispViewDelegate setRender3DHighPrecisionColorInterpolation:[CocoaDSUtil getIBActionSenderButtonStateBool:sender]]; +} + +- (IBAction) change3DRenderEdgeMarking:(id)sender +{ + [dispViewDelegate setRender3DEdgeMarking:[CocoaDSUtil getIBActionSenderButtonStateBool:sender]]; +} + +- (IBAction) change3DRenderFog:(id)sender +{ + [dispViewDelegate setRender3DFog:[CocoaDSUtil getIBActionSenderButtonStateBool:sender]]; +} + +- (IBAction) change3DRenderTextures:(id)sender +{ + [dispViewDelegate setRender3DTextures:[CocoaDSUtil getIBActionSenderButtonStateBool:sender]]; +} + +- (IBAction) change3DRenderDepthComparisonThreshold:(id)sender +{ + NSInteger threshold = 0; + + if ([sender respondsToSelector:@selector(integerValue)]) + { + threshold = [sender integerValue]; + if (threshold < 0) + { + return; + } + } + + [dispViewDelegate setRender3DDepthComparisonThreshold:(NSUInteger)threshold]; +} + +- (IBAction) change3DRenderThreads:(id)sender +{ + NSInteger numberThreads = [CocoaDSUtil getIBActionSenderTag:sender]; + if (numberThreads < 0) + { + return; + } + + [dispViewDelegate setRender3DThreads:(NSUInteger)numberThreads]; +} + +- (IBAction) change3DRenderLineHack:(id)sender +{ + [dispViewDelegate setRender3DLineHack:[CocoaDSUtil getIBActionSenderButtonStateBool:sender]]; +} + +- (IBAction) hudDisable:(id)sender +{ + if ([dispViewDelegate isHudEnabled]) + { + [dispViewDelegate setIsHudEnabled:NO]; + [self setStatus:NSSTRING_STATUS_HUD_DISABLED]; + } + else + { + [dispViewDelegate setIsHudEnabled:YES]; + [self setStatus:NSSTRING_STATUS_HUD_ENABLED]; + } +} + +- (IBAction) toggleKeepMinDisplaySizeAtNormal:(id)sender +{ + if (isMinSizeNormal) + { + minDisplayViewSize.width /= 4; + minDisplayViewSize.height /= 4; + isMinSizeNormal = NO; + } + else + { + minDisplayViewSize.width = GPU_DISPLAY_WIDTH; + minDisplayViewSize.height = GPU_DISPLAY_HEIGHT * 2; + isMinSizeNormal = YES; + } + + // Set the minimum content size, keeping the display rotation in mind. + NSSize transformedMinSize = GetTransformedBounds(minDisplayViewSize, 1.0, CLOCKWISE_DEGREES([dispViewDelegate rotation])); + transformedMinSize.height += statusBarHeight; + [window setContentMinSize:transformedMinSize]; + + // Resize the window if it's smaller than the minimum content size. + NSRect windowContentRect = [window contentRectForFrameRect:[window frame]]; + if (windowContentRect.size.width < transformedMinSize.width || windowContentRect.size.height < transformedMinSize.height) + { + // Prepare to resize. + NSRect oldFrameRect = [window frame]; + windowContentRect.size = transformedMinSize; + NSRect newFrameRect = [window frameRectForContentRect:windowContentRect]; + + // Keep the window centered when expanding the size. + newFrameRect.origin.x = oldFrameRect.origin.x - ((newFrameRect.size.width - oldFrameRect.size.width) / 2); + newFrameRect.origin.y = oldFrameRect.origin.y - ((newFrameRect.size.height - oldFrameRect.size.height) / 2); + + // Set the window size. + [window setFrame:newFrameRect display:YES animate:NO]; + } +} + +- (IBAction) toggleStatusBar:(id)sender +{ + NSRect frameRect = [window frame]; + + if (isShowingStatusBar) + { + isShowingStatusBar = NO; + statusBarHeight = 0; + frameRect.origin.y += WINDOW_STATUS_BAR_HEIGHT; + frameRect.size.height -= WINDOW_STATUS_BAR_HEIGHT; + } + else + { + isShowingStatusBar = YES; + statusBarHeight = WINDOW_STATUS_BAR_HEIGHT; + frameRect.origin.y -= WINDOW_STATUS_BAR_HEIGHT; + frameRect.size.height += WINDOW_STATUS_BAR_HEIGHT; + } + + [[self bindings] setValue:[NSNumber numberWithBool:isShowingStatusBar] forKey:@"isShowingStatusBar"]; + [window setFrame:frameRect display:YES animate:NO]; +} + +- (IBAction) selectScreenshotFileFormat:(id)sender +{ + screenshotFileFormat = (NSBitmapImageFileType)[CocoaDSUtil getIBActionSenderTag:sender]; +} + +- (IBAction) saveScreenshotAs:(id)sender +{ + [self pauseCore]; + + NSInteger buttonClicked = NSFileHandlingPanelCancelButton; + NSSavePanel *panel = [NSSavePanel savePanel]; + + [panel setCanCreateDirectories:YES]; + [panel setTitle:NSSTRING_TITLE_SAVE_SCREENSHOT_PANEL]; + [panel setAccessoryView:saveScreenshotPanelAccessoryView]; + + buttonClicked = [panel runModal]; + if(buttonClicked == NSOKButton) + { + [dispViewDelegate requestScreenshot:[panel URL] fileType:screenshotFileFormat]; + } + else + { + [self restoreCoreState]; + } +} + +- (void) saveScreenshotAsFinish:(NSNotification *)aNotification +{ + NSURL *fileURL = (NSURL *)[[aNotification userInfo] valueForKey:@"fileURL"]; + NSBitmapImageFileType fileType = (NSBitmapImageFileType)[(NSNumber *)[[aNotification userInfo] valueForKey:@"fileType"] integerValue]; + NSImage *screenshotImage = (NSImage *)[[aNotification userInfo] valueForKey:@"screenshotImage"]; + + BOOL fileSaved = [CocoaDSFile saveScreenshot:fileURL bitmapData:[[screenshotImage representations] objectAtIndex:0] fileType:fileType]; + if (!fileSaved) + { + [CocoaDSUtil quickDialogUsingTitle:NSSTRING_ERROR_TITLE_LEGACY message:NSSTRING_ERROR_SCREENSHOT_FAILED_LEGACY]; + } + + [self restoreCoreState]; +} + +- (IBAction) toggleGPUState:(id)sender +{ + NSInteger i = [CocoaDSUtil getIBActionSenderTag:sender]; + UInt32 flags = [dispViewDelegate gpuStateFlags]; + + flags ^= (1 << i); + + [dispViewDelegate setGpuStateFlags:flags]; +} + +- (BOOL) handleLoadRom:(NSURL *)fileURL +{ + BOOL result = NO; + + if (isRomLoading) + { + return result; + } + + if ([self isRomLoaded]) + { + BOOL closeResult = [self handleUnloadRom:REASONFORCLOSE_OPEN romToLoad:fileURL]; + if ([self isShowingSaveStateSheet]) + { + return result; + } + + if (![self isShowingSaveStateSheet] && closeResult == NO) + { + return result; + } + } + + // Check for the v0.9.7 ROM Save File + if ([CocoaDSFile romSaveExistsWithRom:fileURL] && ![CocoaDSFile romSaveExists:fileURL]) + { + SEL endSheetSelector = @selector(didEndFileMigrationSheet:returnCode:contextInfo:); + + [fileURL retain]; + [self setIsSheetControllingExecution:YES]; + [self setIsShowingSaveStateSheet:YES]; + + [NSApp beginSheet:saveFileMigrationSheet + modalForWindow:window + modalDelegate:self + didEndSelector:endSheetSelector + contextInfo:fileURL]; + } + else + { + result = [self loadRom:fileURL]; + } + + return result; +} + +- (BOOL) handleUnloadRom:(NSInteger)reasonID romToLoad:(NSURL *)romURL +{ + BOOL result = NO; + + if (isRomLoading || ![self isRomLoaded]) + { + return result; + } + + [self pauseCore]; + + if ([window isDocumentEdited] && currentEmuSaveStateURL != nil) + { + SEL endSheetSelector = @selector(didEndSaveStateSheet:returnCode:contextInfo:); + + switch (reasonID) + { + case REASONFORCLOSE_OPEN: + [romURL retain]; + endSheetSelector = @selector(didEndSaveStateSheetOpen:returnCode:contextInfo:); + break; + + case REASONFORCLOSE_TERMINATE: + endSheetSelector = @selector(didEndSaveStateSheetTerminate:returnCode:contextInfo:); + break; + + default: + break; + } + + [currentEmuSaveStateURL retain]; + [self setIsSheetControllingExecution:YES]; + [self setIsShowingSaveStateSheet:YES]; + + [NSApp beginSheet:saveStatePrecloseSheet + modalForWindow:window + modalDelegate:self + didEndSelector:endSheetSelector + contextInfo:romURL]; + } + else + { + result = [self unloadRom]; + } + + return result; +} + +- (BOOL) loadRom:(NSURL *)romURL +{ + BOOL result = NO; + + if (romURL == nil) + { + return result; + } + + [self setStatus:NSSTRING_STATUS_ROM_LOADING]; + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isWorking"]; + [window displayIfNeeded]; + + // Need to pause the core before loading the ROM. + [self pauseCore]; + + CocoaDSRom *newRom = [[CocoaDSRom alloc] init]; + if (newRom != nil) + { + isRomLoading = YES; + [romURL retain]; + [newRom setSaveType:selectedRomSaveTypeID]; + [NSThread detachNewThreadSelector:@selector(loadDataOnThread:) toTarget:newRom withObject:romURL]; + [romURL release]; + } + + result = YES; + + return result; +} + +- (void) loadRomDidFinish:(NSNotification *)aNotification +{ + CocoaDSRom *theRom = [aNotification object]; + NSDictionary *userInfo = [aNotification userInfo]; + BOOL didLoad = [(NSNumber *)[userInfo valueForKey:@"DidLoad"] boolValue]; + + if (theRom == nil || ![theRom isDataLoaded] || !didLoad) + { + // If ROM loading fails, restore the core state, but only if a ROM is already loaded. + if([self isRomLoaded]) + { + [self restoreCoreState]; + } + + if (theRom != nil) + { + [theRom release]; + } + + [self setStatus:NSSTRING_STATUS_ROM_LOADING_FAILED]; + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isWorking"]; + + isRomLoading = NO; + return; + } + + // Set the core's ROM to our newly allocated ROM object. + [self setCurrentRom:theRom]; + [romInfoPanelController setContent:[theRom bindings]]; + + // If the ROM has an associated cheat file, load it now. + NSString *cheatsPath = [[CocoaDSFile fileURLFromRomURL:[theRom fileURL] toKind:@"Cheat"] path]; + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + CocoaDSCheatManager *newCheatList = [[CocoaDSCheatManager alloc] initWithURL:cdsCore fileURL:[NSURL fileURLWithPath:cheatsPath]]; + if (newCheatList != nil) + { + NSMutableDictionary *cheatWindowBindings = (NSMutableDictionary *)[cheatWindowController content]; + + [CocoaDSCheatManager setMasterCheatList:newCheatList]; + [cheatListController setContent:[newCheatList list]]; + [self setCdsCheats:newCheatList]; + [cheatWindowBindings setValue:newCheatList forKey:@"cheatList"]; + + NSString *filePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"R4Cheat_DatabasePath"]; + if (filePath != nil) + { + NSURL *fileURL = [NSURL fileURLWithPath:filePath]; + NSInteger error = 0; + NSMutableArray *dbList = [[self cdsCheats] cheatListFromDatabase:fileURL errorCode:&error]; + if (dbList != nil) + { + [cheatDatabaseController setContent:dbList]; + + NSString *titleString = [[self cdsCheats] dbTitle]; + NSString *dateString = [[self cdsCheats] dbDate]; + + [cheatWindowBindings setValue:titleString forKey:@"cheatDBTitle"]; + [cheatWindowBindings setValue:dateString forKey:@"cheatDBDate"]; + [cheatWindowBindings setValue:[NSString stringWithFormat:@"%d", [dbList count]] forKey:@"cheatDBItemCount"]; + } + else + { + [cheatWindowBindings setValue:@"---" forKey:@"cheatDBItemCount"]; + + switch (error) + { + case CHEATEXPORT_ERROR_FILE_NOT_FOUND: + NSLog(@"R4 Cheat Database read failed! Could not load the database file!"); + [cheatWindowBindings setValue:@"Database not loaded." forKey:@"cheatDBTitle"]; + [cheatWindowBindings setValue:@"CANNOT LOAD FILE" forKey:@"cheatDBDate"]; + break; + + case CHEATEXPORT_ERROR_WRONG_FILE_FORMAT: + NSLog(@"R4 Cheat Database read failed! Wrong file format!"); + [cheatWindowBindings setValue:@"Database load error." forKey:@"cheatDBTitle"]; + [cheatWindowBindings setValue:@"FAILED TO LOAD FILE" forKey:@"cheatDBDate"]; + break; + + case CHEATEXPORT_ERROR_SERIAL_NOT_FOUND: + NSLog(@"R4 Cheat Database read failed! Could not find the serial number for this game in the database!"); + [cheatWindowBindings setValue:@"ROM not found in database." forKey:@"cheatDBTitle"]; + [cheatWindowBindings setValue:@"ROM not found." forKey:@"cheatDBDate"]; + break; + + case CHEATEXPORT_ERROR_EXPORT_FAILED: + NSLog(@"R4 Cheat Database read failed! Could not read the database file!"); + [cheatWindowBindings setValue:@"Database read error." forKey:@"cheatDBTitle"]; + [cheatWindowBindings setValue:@"CANNOT READ FILE" forKey:@"cheatDBDate"]; + break; + + default: + break; + } + } + } + + [cheatWindowDelegate setCdsCheats:newCheatList]; + [[cheatWindowDelegate cdsCheats] setCdsCore:cdsCore]; + [[cheatWindowDelegate cdsCheatSearch] setCdsCore:cdsCore]; + [cheatWindowDelegate setCheatSearchViewByStyle:CHEATSEARCH_SEARCHSTYLE_EXACT_VALUE]; + } + + // After the ROM loading is complete, send an execute message to the Cocoa DS per + // user preferences. + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"General_ExecuteROMOnLoad"]) + { + [self executeCore]; + } + + // Add the last loaded ROM to the Recent ROMs list. + [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:[theRom fileURL]]; + + // Update the UI to indicate that a ROM has indeed been loaded. + [dispViewDelegate setViewToWhite]; + [self setStatus:NSSTRING_STATUS_ROM_LOADED]; + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isWorking"]; + [self setIsRomLoaded:YES]; + [window displayIfNeeded]; + isRomLoading = NO; +} + +- (BOOL) unloadRom +{ + BOOL result = NO; + + [currentEmuSaveStateURL release]; + currentEmuSaveStateURL = nil; + [window setDocumentEdited:NO]; + + // Update the UI to indicate that the ROM has started the process of unloading. + [self setStatus:NSSTRING_STATUS_ROM_UNLOADING]; + [romInfoPanelController setContent:[CocoaDSRom romNotLoadedBindings]]; + [cheatListController setContent:nil]; + [cheatWindowDelegate resetSearch:nil]; + [cheatWindowDelegate setCdsCheats:nil]; + [cheatDatabaseController setContent:nil]; + + NSMutableDictionary *cheatWindowBindings = (NSMutableDictionary *)[cheatWindowController content]; + [cheatWindowBindings setValue:@"No ROM loaded." forKey:@"cheatDBTitle"]; + [cheatWindowBindings setValue:@"No ROM loaded." forKey:@"cheatDBDate"]; + [cheatWindowBindings setValue:@"---" forKey:@"cheatDBItemCount"]; + [cheatWindowBindings setValue:nil forKey:@"cheatList"]; + + [bindings setValue:[NSNumber numberWithBool:YES] forKey:@"isWorking"]; + [window displayIfNeeded]; + + // Unload the ROM. + [[self currentRom] release]; + [self setCurrentRom:nil]; + + // Release the current cheat list and assign the empty list. + [[self cdsCheats] release]; + [self setCdsCheats:nil]; + if (dummyCheatList == nil) + { + dummyCheatList = [[CocoaDSCheatManager alloc] init]; + } + [CocoaDSCheatManager setMasterCheatList:dummyCheatList]; + + // Update the UI to indicate that the ROM has finished unloading. + [dispViewDelegate setViewToBlack]; + [self setStatus:NSSTRING_STATUS_ROM_UNLOADED]; + [bindings setValue:[NSNumber numberWithBool:NO] forKey:@"isWorking"]; + [self setIsRomLoaded:NO]; + [window displayIfNeeded]; + + result = YES; + + return result; +} + +- (void) executeCore +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + [cdsCore setCoreState:CORESTATE_EXECUTE]; +} + +- (void) pauseCore +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + [cdsCore setCoreState:CORESTATE_PAUSE]; +} + +- (void) restoreCoreState +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + [cdsCore restoreCoreState]; +} + +- (BOOL)validateUserInterfaceItem:(id )theItem +{ + BOOL enable = YES; + SEL theAction = [theItem action]; + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + + if (theAction == @selector(importRomSave:) || + theAction == @selector(exportRomSave:)) + { + if (![self isRomLoaded]) + { + enable = NO; + } + } + else if (theAction == @selector(executeCoreToggle:)) + { + if (![self isRomLoaded] || + ![cdsCore masterExecute] || + [self isSheetControllingExecution]) + { + enable = NO; + } + + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + if ([cdsCore coreState] == CORESTATE_PAUSE) + { + [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_EXECUTE_CONTROL]; + } + else + { + [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_PAUSE_CONTROL]; + } + } + else if ([(id)theItem isMemberOfClass:[NSToolbarItem class]]) + { + if ([cdsCore coreState] == CORESTATE_PAUSE) + { + [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_EXECUTE_CONTROL]; + [(NSToolbarItem*)theItem setImage:iconExecute]; + } + else + { + [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_PAUSE_CONTROL]; + [(NSToolbarItem*)theItem setImage:iconPause]; + } + } + } + else if (theAction == @selector(executeCore) || + theAction == @selector(pauseCore)) + { + if (![self isRomLoaded] || + ![cdsCore masterExecute] || + [self isSheetControllingExecution]) + { + enable = NO; + } + } + else if (theAction == @selector(resetCore:)) + { + if (![self isRomLoaded] || [self isSheetControllingExecution]) + { + enable = NO; + } + } + else if (theAction == @selector(ejectCard:)) + { + if (![self isRomLoaded]) + { + enable = NO; + } + + if ([cdsCore ejectCardFlag]) + { + [(NSMenuItem*)theItem setState:NSOnState]; + } + else + { + [(NSMenuItem*)theItem setState:NSOffState]; + } + + } + else if (theAction == @selector(_openRecentDocument:)) + { + if ([self isShowingSaveStateSheet]) + { + enable = NO; + } + } + else if (theAction == @selector(openRom:)) + { + if (isRomLoading || [self isShowingSaveStateSheet]) + { + enable = NO; + } + } + else if (theAction == @selector(closeRom:)) + { + if (![self isRomLoaded] || isRomLoading || [self isShowingSaveStateSheet]) + { + enable = NO; + } + } + else if (theAction == @selector(loadEmuSaveStateSlot:)) + { + if (![self isRomLoaded] || [self isShowingSaveStateSheet]) + { + enable = NO; + } + else if (![CocoaDSFile saveStateExistsForSlot:[[self currentRom] fileURL] slotNumber:[theItem tag] + 1]) + { + enable = NO; + } + } + else if (theAction == @selector(saveEmuSaveStateSlot:)) + { + if (![self isRomLoaded] || [self isShowingSaveStateSheet]) + { + enable = NO; + } + + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + if ([CocoaDSFile saveStateExistsForSlot:[[self currentRom] fileURL] slotNumber:[theItem tag] + 1]) + { + [(NSMenuItem*)theItem setState:NSOnState]; + } + else + { + [(NSMenuItem*)theItem setState:NSOffState]; + } + } + } + else if (theAction == @selector(changeCoreSpeed:)) + { + NSInteger speedScalar = (NSInteger)([cdsCore speedScalar] * 100.0); + + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + if ([theItem tag] == -1) + { + if (speedScalar == (NSInteger)(SPEED_SCALAR_HALF * 100.0) || + speedScalar == (NSInteger)(SPEED_SCALAR_NORMAL * 100.0) || + speedScalar == (NSInteger)(SPEED_SCALAR_DOUBLE * 100.0)) + { + [(NSMenuItem*)theItem setState:NSOffState]; + } + else + { + [(NSMenuItem*)theItem setState:NSOnState]; + } + } + else if (speedScalar == [theItem tag]) + { + [(NSMenuItem*)theItem setState:NSOnState]; + } + else + { + [(NSMenuItem*)theItem setState:NSOffState]; + } + } + else if ([(id)theItem isMemberOfClass:[NSToolbarItem class]]) + { + if (speedScalar == (NSInteger)(SPEED_SCALAR_DOUBLE * 100.0)) + { + [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_SPEED_1X]; + [(NSToolbarItem*)theItem setTag:100]; + [(NSToolbarItem*)theItem setImage:iconSpeedNormal]; + } + else + { + [(NSToolbarItem*)theItem setLabel:NSSTRING_TITLE_SPEED_2X]; + [(NSToolbarItem*)theItem setTag:200]; + [(NSToolbarItem*)theItem setImage:iconSpeedDouble]; + } + } + } + else if (theAction == @selector(speedLimitDisable:)) + { + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + if ([cdsCore isSpeedLimitEnabled]) + { + [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_DISABLE_SPEED_LIMIT]; + } + else + { + [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_ENABLE_SPEED_LIMIT]; + } + } + } + else if (theAction == @selector(toggleAutoFrameSkip:)) + { + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + if ([cdsCore isFrameSkipEnabled]) + { + [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_DISABLE_AUTO_FRAME_SKIP]; + } + else + { + [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_ENABLE_AUTO_FRAME_SKIP]; + } + } + } + else if (theAction == @selector(cheatsDisable:)) + { + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + if ([cdsCore isCheatingEnabled]) + { + [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_DISABLE_CHEATS]; + } + else + { + [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_ENABLE_CHEATS]; + } + } + } + else if (theAction == @selector(changeRomSaveType:)) + { + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + if ([self selectedRomSaveTypeID] == [theItem tag]) + { + [(NSMenuItem*)theItem setState:NSOnState]; + } + else + { + [(NSMenuItem*)theItem setState:NSOffState]; + } + } + } + else if (theAction == @selector(changeScale:)) + { + NSInteger viewScale = (NSInteger)([dispViewDelegate scale] * 100.0); + + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + if (viewScale == [theItem tag]) + { + [(NSMenuItem*)theItem setState:NSOnState]; + } + else + { + [(NSMenuItem*)theItem setState:NSOffState]; + } + } + } + else if (theAction == @selector(changeRotation:)) + { + NSInteger viewRotation = (NSInteger)([dispViewDelegate rotation]); + + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + if ([theItem tag] == -1) + { + if (viewRotation == 0 || + viewRotation == 90 || + viewRotation == 180 || + viewRotation == 270) + { + [(NSMenuItem*)theItem setState:NSOffState]; + } + else + { + [(NSMenuItem*)theItem setState:NSOnState]; + } + } + else if (viewRotation == [theItem tag]) + { + [(NSMenuItem*)theItem setState:NSOnState]; + } + else + { + [(NSMenuItem*)theItem setState:NSOffState]; + } + } + } + else if (theAction == @selector(changeDisplayMode:)) + { + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + if ([dispViewDelegate displayType] == [theItem tag]) + { + [(NSMenuItem*)theItem setState:NSOnState]; + } + else + { + [(NSMenuItem*)theItem setState:NSOffState]; + } + } + } + else if (theAction == @selector(openEmuSaveState:) || + theAction == @selector(saveEmuSaveState:) || + theAction == @selector(saveEmuSaveStateAs:)) + { + if (![self isRomLoaded] || [self isShowingSaveStateSheet]) + { + enable = NO; + } + } + else if (theAction == @selector(revertEmuSaveState:)) + { + if (![self isRomLoaded] || + [self isShowingSaveStateSheet] || + currentEmuSaveStateURL == nil) + { + enable = NO; + } + } + else if (theAction == @selector(toggleGPUState:)) + { + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + if ([dispViewDelegate gpuStateByBit:[theItem tag]]) + { + [(NSMenuItem*)theItem setState:NSOnState]; + } + else + { + [(NSMenuItem*)theItem setState:NSOffState]; + } + } + } + else if (theAction == @selector(hudDisable:)) + { + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + if ([dispViewDelegate isHudEnabled]) + { + [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_DISABLE_HUD]; + } + else + { + [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_ENABLE_HUD]; + } + } + } + else if (theAction == @selector(toggleStatusBar:)) + { + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + if (isShowingStatusBar) + { + [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_HIDE_STATUS_BAR]; + } + else + { + [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_SHOW_STATUS_BAR]; + } + } + } + else if (theAction == @selector(toggleKeepMinDisplaySizeAtNormal:)) + { + if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) + { + if (isMinSizeNormal) + { + [(NSMenuItem*)theItem setState:NSOnState]; + } + else + { + [(NSMenuItem*)theItem setState:NSOffState]; + } + } + } + + return enable; +} + +- (void)windowDidBecomeMain:(NSNotification *)notification +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + + if ([self isRomLoaded]) + { + [romInfoPanelController setContent:[[self currentRom] bindings]]; + } + else + { + [romInfoPanelController setContent:[CocoaDSRom romNotLoadedBindings]]; + } + + [firmwarePanelController setContent:[cdsCore cdsFirmware]]; + [emuWindowController setContent:[self bindings]]; + [cdsDisplayController setContent:[dispViewDelegate bindings]]; + [cdsSoundController setContent:[cdsSpeaker property]]; +} + +- (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize +{ + NSSize finalSize = frameSize; + const NSSize normalBounds = [dispViewDelegate normalSize]; + + // Get a content Rect so that we can make our comparison. + // This will be based on the proposed frameSize. + const NSRect frameRect = NSMakeRect(0.0f, 0.0f, frameSize.width, frameSize.height); + const NSRect contentRect = [sender contentRectForFrameRect:frameRect]; + + // Find the maximum scalar we can use for the display view, bounded by the + // content Rect. + const NSSize checkSize = GetTransformedBounds(normalBounds, 1.0, [dispViewDelegate rotation]); + const NSSize contentBounds = NSMakeSize(contentRect.size.width, contentRect.size.height - statusBarHeight); + const double maxS = GetMaxScalarInBounds(checkSize.width, checkSize.height, contentBounds.width, contentBounds.height); + [dispViewDelegate setScale:maxS]; + + // Make a new content Rect with our max scalar, and convert it back to a frame Rect. + const NSRect finalContentRect = NSMakeRect(0.0f, 0.0f, checkSize.width * maxS, (checkSize.height * maxS) + statusBarHeight); + NSRect finalFrameRect = [sender frameRectForContentRect:finalContentRect]; + + // Set the final size based on our new frame Rect. + finalSize.width = finalFrameRect.size.width; + finalSize.height = finalFrameRect.size.height; + + return finalSize; +} + +- (void)windowDidResize:(NSNotification *)notification +{ + if (dispViewDelegate == nil) + { + return; + } + + const NSSize normalBounds = [dispViewDelegate normalSize]; + const double r = [dispViewDelegate rotation]; + + // Get the max scalar within the window's current content bounds. + const NSSize checkSize = GetTransformedBounds(normalBounds, 1.0, r); + NSSize contentBounds = [[window contentView] bounds].size; + contentBounds.height -= statusBarHeight; + const double maxS = GetMaxScalarInBounds(checkSize.width, checkSize.height, contentBounds.width, contentBounds.height); + + // Set the display view's properties. + [dispViewDelegate setScale:maxS]; + + // Resize the view. + NSRect newContentFrame = [[window contentView] bounds]; + newContentFrame.origin.y = statusBarHeight; + newContentFrame.size.height -= statusBarHeight; + [displayView setFrame:newContentFrame]; +} + +- (BOOL)windowShouldClose:(id)sender +{ + BOOL shouldClose = YES; + + // If no ROM is loaded, terminate the application. + if (![self isRomLoaded]) + { + [NSApp terminate:sender]; + } + // If a ROM is loaded, just close the ROM, but don't terminate. + else + { + shouldClose = NO; + [self closeRom:nil]; + } + + return shouldClose; +} + +- (IBAction) closeMigrationSheet:(id)sender +{ + NSWindow *sheet = [(NSControl *)sender window]; + NSInteger code = [(NSControl *)sender tag]; + + [NSApp endSheet:sheet returnCode:code]; +} + +- (void) didEndFileMigrationSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +{ + NSURL *romURL = (NSURL *)contextInfo; + NSURL *romSaveURL = [CocoaDSFile romSaveURLFromRomURL:romURL]; + + [sheet orderOut:self]; + + switch (returnCode) + { + case NSOKButton: + [CocoaDSFile moveFileToCurrentDirectory:romSaveURL]; + break; + + default: + break; + } + + [self setIsSheetControllingExecution:NO]; + [self setIsShowingFileMigrationSheet:NO]; + + [self loadRom:romURL]; + + // We retained this when we initially put up the sheet, so we need to release it now. + [romURL release]; +} + +- (void) didEndSaveStateSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +{ + BOOL result = NO; + + [sheet orderOut:self]; + + switch (returnCode) + { + case NSCancelButton: // Cancel + [self restoreCoreState]; + [self setIsSheetControllingExecution:NO]; + [self setIsShowingSaveStateSheet:NO]; + return; + break; + + case COCOA_DIALOG_DEFAULT: // Save + result = [CocoaDSFile saveState:currentEmuSaveStateURL]; + if (result == NO) + { + // Throw an error here... + return; + } + break; + + case COCOA_DIALOG_OPTION: // Don't Save + break; + + default: + break; + } + + [self unloadRom]; + + [self setIsSheetControllingExecution:NO]; + [self setIsShowingSaveStateSheet:NO]; + + // We retained this when we initially put up the sheet, so we need to release it now. + [currentEmuSaveStateURL release]; + currentEmuSaveStateURL = nil; +} + +- (void) didEndSaveStateSheetOpen:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +{ + [self didEndSaveStateSheet:sheet returnCode:returnCode contextInfo:contextInfo]; + + NSURL *romURL = (NSURL *)contextInfo; + [self handleLoadRom:romURL]; + [romURL release]; +} + +- (void) didEndSaveStateSheetTerminate:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +{ + [self didEndSaveStateSheet:sheet returnCode:returnCode contextInfo:contextInfo]; + + if (returnCode == NSCancelButton) + { + [NSApp replyToApplicationShouldTerminate:NO]; + } + else + { + if (currentEmuSaveStateURL == nil) + { + [NSApp replyToApplicationShouldTerminate:YES]; + } + } +} + +- (void) setupUserDefaults +{ + // Set the display mode, sizing, and rotation. + double displayScalar = (double)([[NSUserDefaults standardUserDefaults] floatForKey:@"DisplayView_Size"] / 100.0); + double displayRotation = (double)[[NSUserDefaults standardUserDefaults] floatForKey:@"DisplayView_Rotation"]; + [dispViewDelegate setDisplayType:[[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayView_Mode"]]; + [self setContentScalar:displayScalar]; + [self setContentRotation:displayRotation]; + + // Set the SPU settings per user preferences. + [self setVolume:[[NSUserDefaults standardUserDefaults] floatForKey:@"Sound_Volume"]]; + [[self cdsSpeaker] setVolume:[[NSUserDefaults standardUserDefaults] floatForKey:@"Sound_Volume"]]; + [[self cdsSpeaker] setAudioOutputEngine:[[NSUserDefaults standardUserDefaults] integerForKey:@"Sound_AudioOutputEngine"]]; + [[self cdsSpeaker] setSpuAdvancedLogic:[[NSUserDefaults standardUserDefaults] boolForKey:@"SPU_AdvancedLogic"]]; + [[self cdsSpeaker] setSpuInterpolationMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_InterpolationMode"]]; + [[self cdsSpeaker] setSpuSyncMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_SyncMode"]]; + [[self cdsSpeaker] setSpuSyncMethod:[[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_SyncMethod"]]; + + // Setup the window display view per user preferences. + [[self dispViewDelegate] setVideoFilterType:[[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayView_VideoFilter"]]; + [[self dispViewDelegate] setUseBilinearOutput:[[NSUserDefaults standardUserDefaults] boolForKey:@"DisplayView_UseBilinearOutput"]]; + + // Set the 3D rendering options per user preferences. + [[self dispViewDelegate] setRender3DThreads:(NSUInteger)[[NSUserDefaults standardUserDefaults] integerForKey:@"Render3D_Threads"]]; + [[self dispViewDelegate] setRender3DRenderingEngine:[[NSUserDefaults standardUserDefaults] integerForKey:@"Render3D_RenderingEngine"]]; + [[self dispViewDelegate] setRender3DHighPrecisionColorInterpolation:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_HighPrecisionColorInterpolation"]]; + [[self dispViewDelegate] setRender3DEdgeMarking:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_EdgeMarking"]]; + [[self dispViewDelegate] setRender3DFog:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_Fog"]]; + [[self dispViewDelegate] setRender3DTextures:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_Textures"]]; + [[self dispViewDelegate] setRender3DDepthComparisonThreshold:(NSUInteger)[[NSUserDefaults standardUserDefaults] integerForKey:@"Render3D_DepthComparisonThreshold"]]; + [[self dispViewDelegate] setRender3DLineHack:[[NSUserDefaults standardUserDefaults] boolForKey:@"Render3D_LineHack"]]; +} + +- (IBAction) writeDefaultsDisplayRotation:(id)sender +{ + NSMutableDictionary *dispViewBindings = (NSMutableDictionary *)[cdsDisplayController content]; + + [[NSUserDefaults standardUserDefaults] setDouble:[[dispViewBindings valueForKey:@"rotation"] doubleValue] forKey:@"DisplayView_Rotation"]; +} + +- (IBAction) writeDefaultsHUDSettings:(id)sender +{ + // TODO: Not implemented. +} + +- (IBAction) writeDefaultsVideoOutputSettings:(id)sender +{ + NSMutableDictionary *dispViewBindings = (NSMutableDictionary *)[cdsDisplayController content]; + + [[NSUserDefaults standardUserDefaults] setInteger:[[dispViewBindings valueForKey:@"videoFilterType"] integerValue] forKey:@"DisplayView_VideoFilter"]; + [[NSUserDefaults standardUserDefaults] setBool:[[dispViewBindings valueForKey:@"useBilinearOutput"] boolValue] forKey:@"DisplayView_UseBilinearOutput"]; +} + +- (IBAction) writeDefaults3DRenderingSettings:(id)sender +{ + NSMutableDictionary *dispViewBindings = (NSMutableDictionary *)[cdsDisplayController content]; + + // Force end of editing of any text fields. + [[(NSControl *)sender window] makeFirstResponder:nil]; + + [[NSUserDefaults standardUserDefaults] setInteger:[[dispViewBindings valueForKey:@"render3DRenderingEngine"] integerValue] forKey:@"Render3D_RenderingEngine"]; + [[NSUserDefaults standardUserDefaults] setBool:[[dispViewBindings valueForKey:@"render3DHighPrecisionColorInterpolation"] boolValue] forKey:@"Render3D_HighPrecisionColorInterpolation"]; + [[NSUserDefaults standardUserDefaults] setBool:[[dispViewBindings valueForKey:@"render3DEdgeMarking"] boolValue] forKey:@"Render3D_EdgeMarking"]; + [[NSUserDefaults standardUserDefaults] setBool:[[dispViewBindings valueForKey:@"render3DFog"] boolValue] forKey:@"Render3D_Fog"]; + [[NSUserDefaults standardUserDefaults] setBool:[[dispViewBindings valueForKey:@"render3DTextures"] boolValue] forKey:@"Render3D_Textures"]; + [[NSUserDefaults standardUserDefaults] setInteger:[[dispViewBindings valueForKey:@"render3DDepthComparisonThreshold"] integerValue] forKey:@"Render3D_DepthComparisonThreshold"]; + [[NSUserDefaults standardUserDefaults] setInteger:[[dispViewBindings valueForKey:@"render3DThreads"] integerValue] forKey:@"Render3D_Threads"]; + [[NSUserDefaults standardUserDefaults] setBool:[[dispViewBindings valueForKey:@"render3DLineHack"] boolValue] forKey:@"Render3D_LineHack"]; +} + +- (IBAction) writeDefaultsEmulationSettings:(id)sender +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + NSDictionary *firmwareDict = [(CocoaDSFirmware *)[firmwarePanelController content] dataDictionary]; + + // Force end of editing of any text fields. + [[(NSControl *)sender window] makeFirstResponder:nil]; + + [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagAdvancedBusLevelTiming] forKey:@"Emulation_AdvancedBusLevelTiming"]; + [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagUseExternalBios] forKey:@"Emulation_UseExternalBIOSImages"]; + [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagEmulateBiosInterrupts] forKey:@"Emulation_BIOSEmulateSWI"]; + [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagPatchDelayLoop] forKey:@"Emulation_BIOSPatchDelayLoopSWI"]; + [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagUseExternalFirmware] forKey:@"Emulation_UseExternalFirmwareImage"]; + [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagFirmwareBoot] forKey:@"Emulation_FirmwareBoot"]; + [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagEmulateEnsata] forKey:@"Emulation_EmulateEnsata"]; + [[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagDebugConsole] forKey:@"Emulation_UseDebugConsole"]; + + [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"Nickname"] forKey:@"FirmwareConfig_Nickname"]; + [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"Message"] forKey:@"FirmwareConfig_Message"]; + [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"FavoriteColor"] forKey:@"FirmwareConfig_FavoriteColor"]; + [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"Birthday"] forKey:@"FirmwareConfig_Birthday"]; + [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"Language"] forKey:@"FirmwareConfig_Language"]; +} + +- (IBAction) writeDefaultsSoundSettings:(id)sender +{ + NSMutableDictionary *speakerBindings = (NSMutableDictionary *)[cdsSoundController content]; + + [[NSUserDefaults standardUserDefaults] setFloat:[[speakerBindings valueForKey:@"volume"] floatValue] forKey:@"Sound_Volume"]; + [[NSUserDefaults standardUserDefaults] setInteger:[[speakerBindings valueForKey:@"audioOutputEngine"] integerValue] forKey:@"Sound_AudioOutputEngine"]; + [[NSUserDefaults standardUserDefaults] setBool:[[speakerBindings valueForKey:@"spuAdvancedLogic"] boolValue] forKey:@"SPU_AdvancedLogic"]; + [[NSUserDefaults standardUserDefaults] setInteger:[[speakerBindings valueForKey:@"spuInterpolationMode"] integerValue] forKey:@"SPU_InterpolationMode"]; + [[NSUserDefaults standardUserDefaults] setInteger:[[speakerBindings valueForKey:@"spuSyncMode"] integerValue] forKey:@"SPU_SyncMode"]; + [[NSUserDefaults standardUserDefaults] setInteger:[[speakerBindings valueForKey:@"spuSyncMethod"] integerValue] forKey:@"SPU_SyncMethod"]; +} + +- (void)controlTextDidEndEditing:(NSNotification *)aNotification +{ + [self change3DRenderDepthComparisonThreshold:[aNotification object]]; +} + +@end diff --git a/desmume/src/cocoa/userinterface/inputPrefsView.h b/desmume/src/cocoa/userinterface/inputPrefsView.h new file mode 100644 index 000000000..2e4fb3809 --- /dev/null +++ b/desmume/src/cocoa/userinterface/inputPrefsView.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import + +@class CocoaDSController; + + +@interface InputPrefsView : NSView +{ + NSWindow *prefWindow; + NSButton *lastConfigButton; + NSInteger configInput; + NSDictionary *keyNameTable; + + CocoaDSController *cdsController; +} + +@property (readonly) IBOutlet NSWindow *prefWindow; +@property (assign) NSInteger configInput; +@property (retain) CocoaDSController *cdsController; + +- (BOOL) handleMouseDown:(NSEvent *)mouseEvent; +- (void) addMappingById:(NSInteger)dsControlID deviceCode:(NSString *)deviceCode deviceName:(NSString *)deviceName elementCode:(NSString *)elementCode elementName:(NSString *)elementName; +- (void) addMappingByKey:(NSString *)dsControlKey deviceCode:(NSString *)deviceCode deviceName:(NSString *)deviceName elementCode:(NSString *)elementCode elementName:(NSString *)elementName; +- (void) addMappingByKey:(NSString *)dsControlKey deviceInfo:(NSDictionary *)deviceInfo; +- (NSString *) parseMappingDisplayString:(NSString *)keyString; +- (IBAction) inputButtonSet:(id)sender; +- (void) inputButtonCancelConfig; +- (void) handleHIDInput:(NSNotification *)aNotification; + +@end diff --git a/desmume/src/cocoa/userinterface/inputPrefsView.mm b/desmume/src/cocoa/userinterface/inputPrefsView.mm new file mode 100644 index 000000000..8ea736fdb --- /dev/null +++ b/desmume/src/cocoa/userinterface/inputPrefsView.mm @@ -0,0 +1,417 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "inputPrefsView.h" +#import "preferencesWindowDelegate.h" + +#import "cocoa_globals.h" +#import "cocoa_input.h" + +@implementation InputPrefsView + +@synthesize prefWindow; +@synthesize configInput; +@synthesize cdsController; + +- (id)initWithFrame:(NSRect)frame +{ + self = [super initWithFrame:frame]; + if (self == nil) + { + return self; + } + + lastConfigButton = nil; + configInput = 0; + keyNameTable = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"KeyNames" ofType:@"plist"]]; + cdsController = nil; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleHIDInput:) + name:@"com.DeSmuME.DeSmuME.hidInputDetected" + object:nil]; + + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [keyNameTable release]; + + [super dealloc]; +} + +- (void)keyDown:(NSEvent *)theEvent +{ + NSString *elementCode = [NSString stringWithFormat:@"%d", [theEvent keyCode]]; + NSString *elementName = (NSString *)[keyNameTable valueForKey:elementCode]; + + if (configInput != 0) + { + [self addMappingById:configInput deviceCode:@"NSEventKeyboard" deviceName:@"Keyboard" elementCode:elementCode elementName:elementName]; + [self inputButtonCancelConfig]; + } +} + +- (void)mouseDown:(NSEvent *)theEvent +{ + BOOL isHandled = [self handleMouseDown:theEvent]; + if (!isHandled) + { + [super mouseDown:theEvent]; + } +} + +- (void)mouseDragged:(NSEvent *)theEvent +{ + [self mouseDown:theEvent]; +} + +- (void)rightMouseDown:(NSEvent *)theEvent +{ + BOOL isHandled = [self handleMouseDown:theEvent]; + if (!isHandled) + { + [super rightMouseDown:theEvent]; + } +} + +- (void)rightMouseDragged:(NSEvent *)theEvent +{ + [self rightMouseDown:theEvent]; +} + +- (void)otherMouseDown:(NSEvent *)theEvent +{ + BOOL isHandled = [self handleMouseDown:theEvent]; + if (!isHandled) + { + [super otherMouseDown:theEvent]; + } +} + +- (void)otherMouseDragged:(NSEvent *)theEvent +{ + [self otherMouseDown:theEvent]; +} + +- (BOOL) handleMouseDown:(NSEvent *)mouseEvent +{ + BOOL isHandled = NO; + NSString *elementCode = [NSString stringWithFormat:@"%i", [mouseEvent buttonNumber]]; + NSString *elementName = [NSString stringWithFormat:@"Button %i", [mouseEvent buttonNumber]]; + + switch ([mouseEvent buttonNumber]) + { + case kCGMouseButtonLeft: + elementName = @"Primary Button"; + break; + + case kCGMouseButtonRight: + elementName = @"Secondary Button"; + break; + + case kCGMouseButtonCenter: + elementName = @"Center Button"; + break; + + default: + break; + } + + if (configInput != 0) + { + [self addMappingById:configInput deviceCode:@"NSEventMouse" deviceName:@"Mouse" elementCode:elementCode elementName:elementName]; + [self inputButtonCancelConfig]; + isHandled = YES; + } + + return isHandled; +} + +- (void) addMappingById:(NSInteger)dsControlID deviceCode:(NSString *)deviceCode deviceName:(NSString *)deviceName elementCode:(NSString *)elementCode elementName:(NSString *)elementName +{ + NSString *dsControlKey = nil; + NSString *displayBindingsKey = nil; + + switch (dsControlID) + { + case PREF_INPUT_BUTTON_UP: + dsControlKey = @"Up"; + displayBindingsKey = @"Input_Up"; + break; + + case PREF_INPUT_BUTTON_DOWN: + dsControlKey = @"Down"; + displayBindingsKey = @"Input_Down"; + break; + + case PREF_INPUT_BUTTON_LEFT: + dsControlKey = @"Left"; + displayBindingsKey = @"Input_Left"; + break; + + case PREF_INPUT_BUTTON_RIGHT: + dsControlKey = @"Right"; + displayBindingsKey = @"Input_Right"; + break; + + case PREF_INPUT_BUTTON_A: + dsControlKey = @"A"; + displayBindingsKey = @"Input_A"; + break; + + case PREF_INPUT_BUTTON_B: + dsControlKey = @"B"; + displayBindingsKey = @"Input_B"; + break; + + case PREF_INPUT_BUTTON_X: + dsControlKey = @"X"; + displayBindingsKey = @"Input_X"; + break; + + case PREF_INPUT_BUTTON_Y: + dsControlKey = @"Y"; + displayBindingsKey = @"Input_Y"; + break; + + case PREF_INPUT_BUTTON_L: + dsControlKey = @"L"; + displayBindingsKey = @"Input_L"; + break; + + case PREF_INPUT_BUTTON_R: + dsControlKey = @"R"; + displayBindingsKey = @"Input_R"; + break; + + case PREF_INPUT_BUTTON_START: + dsControlKey = @"Start"; + displayBindingsKey = @"Input_Start"; + break; + + case PREF_INPUT_BUTTON_SELECT: + dsControlKey = @"Select"; + displayBindingsKey = @"Input_Select"; + break; + + case PREF_INPUT_BUTTON_SIM_MIC: + dsControlKey = @"Microphone"; + displayBindingsKey = @"Input_Microphone"; + break; + + case PREF_INPUT_BUTTON_LID: + dsControlKey = @"Lid"; + displayBindingsKey = @"Input_Lid"; + break; + + case PREF_INPUT_BUTTON_DEBUG: + dsControlKey = @"Debug"; + displayBindingsKey = @"Input_Debug"; + break; + + case PREF_INPUT_BUTTON_SPEED_HALF: + dsControlKey = @"Speed Half"; + displayBindingsKey = @"Input_SpeedHalf"; + break; + + case PREF_INPUT_BUTTON_SPEED_DOUBLE: + dsControlKey = @"Speed Double"; + displayBindingsKey = @"Input_SpeedDouble"; + break; + + case PREF_INPUT_BUTTON_TOGGLE_HUD: + dsControlKey = @"HUD"; + displayBindingsKey = @"Input_HUD"; + break; + + case PREF_INPUT_BUTTON_EXECUTE: + dsControlKey = @"Execute"; + displayBindingsKey = @"Input_Execute"; + break; + + case PREF_INPUT_BUTTON_PAUSE: + dsControlKey = @"Pause"; + displayBindingsKey = @"Input_Pause"; + break; + + case PREF_INPUT_BUTTON_RESET: + dsControlKey = @"Reset"; + displayBindingsKey = @"Input_Reset"; + break; + + case PREF_INPUT_BUTTON_TOUCH: + dsControlKey = @"Touch"; + break; + + default: + return; + break; + } + + if (dsControlKey != nil) + { + [self addMappingByKey:dsControlKey deviceCode:deviceCode deviceName:deviceName elementCode:elementCode elementName:elementName]; + if (dsControlID != PREF_INPUT_BUTTON_TOUCH) + { + NSMutableDictionary *prefWindowBindings = [(PreferencesWindowDelegate *)[prefWindow delegate] bindings]; + [prefWindowBindings setValue:[self parseMappingDisplayString:dsControlKey] forKey:displayBindingsKey]; + } + } +} + +- (void) addMappingByKey:(NSString *)dsControlKey deviceCode:(NSString *)deviceCode deviceName:(NSString *)deviceName elementCode:(NSString *)elementCode elementName:(NSString *)elementName +{ + if (deviceCode == nil || elementCode == nil) + { + return; + } + + if (deviceName == nil) + { + deviceName = deviceCode; + } + + if (elementName == nil) + { + elementName = elementCode; + } + + BOOL useDeviceValues = NO; + if ([deviceCode isEqualToString:@"NSEventMouse"]) + { + useDeviceValues = YES; + } + + NSDictionary *deviceInfo = [NSDictionary dictionaryWithObjectsAndKeys: + deviceCode, @"deviceCode", + deviceName, @"deviceName", + elementCode, @"elementCode", + elementName, @"elementName", + [NSNumber numberWithBool:useDeviceValues], @"useDeviceValues", + nil]; + + [self addMappingByKey:dsControlKey deviceInfo:deviceInfo]; +} + +- (void) addMappingByKey:(NSString *)dsControlKey deviceInfo:(NSDictionary *)deviceInfo +{ + [cdsController addMapping:dsControlKey deviceInfo:deviceInfo]; + + NSMutableDictionary *tempUserMappings = [NSMutableDictionary dictionaryWithDictionary:[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"]]; + [tempUserMappings setValue:[NSArray arrayWithObject:deviceInfo] forKey:dsControlKey]; + [[NSUserDefaults standardUserDefaults] setValue:tempUserMappings forKey:@"Input_ControllerMappings"]; +} + +- (NSString *) parseMappingDisplayString:(NSString *)keyString +{ + NSDictionary *userMappings = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"]; + NSArray *mappingList = (NSArray *)[userMappings valueForKey:keyString]; + NSDictionary *mapping = (NSDictionary *)[mappingList objectAtIndex:0]; + NSString *deviceName = (NSString *)[mapping valueForKey:@"deviceName"]; + NSString *elementName = (NSString *)[mapping valueForKey:@"elementName"]; + + NSString *displayString = [NSString stringWithString:deviceName]; + displayString = [displayString stringByAppendingString:@": "]; + displayString = [displayString stringByAppendingString:elementName]; + + return displayString; +} + +- (IBAction) inputButtonSet:(id)sender +{ + NSButton *theButton = (NSButton *)sender; + + if (configInput && lastConfigButton != theButton) + { + [lastConfigButton setState:NSOffState]; + } + + if ([theButton state] == NSOnState) + { + lastConfigButton = theButton; + configInput = [theButton tag]; + } + else + { + [self inputButtonCancelConfig]; + } + +} + +- (void) inputButtonCancelConfig +{ + if (lastConfigButton != nil) + { + [lastConfigButton setState:NSOffState]; + lastConfigButton = nil; + } + + configInput = 0; +} + +- (BOOL)acceptsFirstResponder +{ + return YES; +} + +- (BOOL)becomeFirstResponder +{ + return YES; +} + +- (BOOL)resignFirstResponder +{ + return YES; +} + +- (void) handleHIDInput:(NSNotification *)aNotification +{ + if (configInput == 0) + { + return; + } + + NSArray *inputPropertiesList = (NSArray *)[aNotification object]; + BOOL inputOn = NO; + + for (NSDictionary *inputProperties in inputPropertiesList) + { + NSNumber *onState = (NSNumber *)[inputProperties valueForKey:@"on"]; + if (onState != nil) + { + inputOn = [onState boolValue]; + if (inputOn) + { + NSString *deviceCode = (NSString *)[inputProperties valueForKey:@"deviceCode"]; + NSString *deviceName = (NSString *)[inputProperties valueForKey:@"deviceName"]; + NSString *elementCode = (NSString *)[inputProperties valueForKey:@"elementCode"]; + NSString *elementName = (NSString *)[inputProperties valueForKey:@"elementName"]; + + [self addMappingById:configInput deviceCode:deviceCode deviceName:deviceName elementCode:elementCode elementName:elementName]; + [self inputButtonCancelConfig]; + break; + } + } + } +} + +@end diff --git a/desmume/src/cocoa/userinterface/preferencesWindowDelegate.h b/desmume/src/cocoa/userinterface/preferencesWindowDelegate.h new file mode 100644 index 000000000..7d1794b77 --- /dev/null +++ b/desmume/src/cocoa/userinterface/preferencesWindowDelegate.h @@ -0,0 +1,126 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import + +@class InputPrefsView; +@class CocoaVideoFilter; + + +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 +@interface PreferencesWindowDelegate : NSObject +#else +@interface PreferencesWindowDelegate : NSObject +#endif +{ + NSObject *dummyObject; + NSWindow *window; + NSWindow *firmwareConfigSheet; + NSObjectController *cdsCoreController; + NSObjectController *emuWindowController; + NSObjectController *prefWindowController; + NSObjectController *cheatWindowController; + NSArrayController *cheatDatabaseController; + + NSView *viewGeneral; + InputPrefsView *viewInput; + NSView *viewDisplay; + NSView *viewSound; + NSView *viewEmulation; + + NSPopUpButton *displayRotationMenu; + NSMenuItem *displayRotationMenuCustomItem; + NSTextField *displayRotationField; + + NSImage *iconVolumeFull; + NSImage *iconVolumeTwoThird; + NSImage *iconVolumeOneThird; + NSImage *iconVolumeMute; + NSPopUpButton *spuSyncMethodMenu; + + NSImageView *previewImageView; + CocoaVideoFilter *videoFilter; + CocoaVideoFilter *bilinearVideoFilter; + + NSMutableDictionary *bindings; +} + +@property (readonly) IBOutlet NSObject *dummyObject; +@property (readonly) IBOutlet NSWindow *window; +@property (readonly) IBOutlet NSWindow *firmwareConfigSheet; +@property (readonly) IBOutlet NSObjectController *cdsCoreController; +@property (readonly) IBOutlet NSObjectController *emuWindowController; +@property (readonly) IBOutlet NSObjectController *prefWindowController; +@property (readonly) IBOutlet NSObjectController *cheatWindowController; +@property (readonly) IBOutlet NSArrayController *cheatDatabaseController; +@property (readonly) IBOutlet NSView *viewGeneral; +@property (readonly) IBOutlet InputPrefsView *viewInput; +@property (readonly) IBOutlet NSView *viewDisplay; +@property (readonly) IBOutlet NSView *viewSound; +@property (readonly) IBOutlet NSView *viewEmulation; + +@property (readonly) IBOutlet NSPopUpButton *displayRotationMenu; +@property (readonly) IBOutlet NSMenuItem *displayRotationMenuCustomItem; +@property (readonly) IBOutlet NSTextField *displayRotationField; +@property (readonly) IBOutlet NSPopUpButton *spuSyncMethodMenu; + +@property (readonly) IBOutlet NSImageView *previewImageView; + +@property (assign) NSMutableDictionary *bindings; + +- (IBAction) showGeneralView:(id)sender; +- (IBAction) showInputView:(id)sender; +- (IBAction) showDisplayView:(id)sender; +- (IBAction) showSoundView:(id)sender; +- (IBAction) showEmulationView:(id)sender; + +- (IBAction) selectAutoloadRomOption:(id)sender; +- (IBAction) chooseAdvansceneDatabase:(id)sender; +- (void) chooseAdvansceneDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; +- (IBAction) chooseRomForAutoload:(id)sender; +- (void) chooseRomForAutoloadDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; +- (IBAction) chooseCheatDatabase:(id)sender; +- (void) chooseCheatDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; + +- (IBAction) selectSoundInputMode:(id)sender; + +- (IBAction) selectDisplayMode:(id)sender; +- (IBAction) selectDisplaySize:(id)sender; +- (IBAction) selectDisplayRotation:(id)sender; +- (void) updateDisplayRotationMenu:(double)displayRotation; + +- (IBAction) setUseBilinear:(id)sender; +- (IBAction) selectVideoFilterType:(id)sender; + +- (IBAction) updateVolumeIcon:(id)sender; +- (IBAction) selectSPUSyncMode:(id)sender; +- (IBAction) selectSPUSyncMethod:(id)sender; + +- (IBAction) chooseARM9BiosImage:(id)sender; +- (IBAction) chooseARM7BiosImage:(id)sender; +- (IBAction) chooseFirmwareImage:(id)sender; +- (void) chooseArm9BiosImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; +- (void) chooseArm7BiosImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; +- (void) chooseFirmwareImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; +- (IBAction) configureInternalFirmware:(id)sender; +- (IBAction) closeFirmwareConfigSheet:(id)sender; +- (void) didEndFirmwareConfigSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; + +- (void) switchContentView:(NSView *)theView; + +@end diff --git a/desmume/src/cocoa/userinterface/preferencesWindowDelegate.mm b/desmume/src/cocoa/userinterface/preferencesWindowDelegate.mm new file mode 100644 index 000000000..edb3acf41 --- /dev/null +++ b/desmume/src/cocoa/userinterface/preferencesWindowDelegate.mm @@ -0,0 +1,824 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#import "preferencesWindowDelegate.h" +#import "displayView.h" + +#import "cocoa_core.h" +#import "cocoa_cheat.h" +#import "cocoa_globals.h" +#import "cocoa_input.h" +#import "cocoa_file.h" +#import "cocoa_mic.h" +#import "cocoa_videofilter.h" +#import "cocoa_util.h" + + +@implementation PreferencesWindowDelegate + +@synthesize dummyObject; +@synthesize window; +@synthesize firmwareConfigSheet; +@synthesize cdsCoreController; +@synthesize emuWindowController; +@synthesize prefWindowController; +@synthesize cheatWindowController; +@synthesize cheatDatabaseController; + +@synthesize viewGeneral; +@synthesize viewInput; +@synthesize viewDisplay; +@synthesize viewSound; +@synthesize viewEmulation; + +@synthesize displayRotationMenu; +@synthesize displayRotationMenuCustomItem; +@synthesize displayRotationField; +@synthesize spuSyncMethodMenu; + +@synthesize previewImageView; + +@synthesize bindings; + +- (id)init +{ + self = [super init]; + if(self == nil) + { + return nil; + } + + bindings = [[NSMutableDictionary alloc] init]; + if (bindings == nil) + { + [self release]; + self = nil; + return self; + } + + VideoFilterTypeID vfType = (VideoFilterTypeID)[[NSUserDefaults standardUserDefaults] integerForKey:@"DisplayView_VideoFilter"]; + NSImage *videoFilterImage = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"VideoFilterPreview_64x64" ofType:@"png"]]; + + videoFilter = [[CocoaVideoFilter alloc] initWithSize:[videoFilterImage size] typeID:vfType]; + NSSize vfDestSize = [videoFilter destSize]; + NSUInteger vfWidth = (NSUInteger)vfDestSize.width; + NSUInteger vfHeight = (NSUInteger)vfDestSize.height; + + NSArray *imageRepArray = [videoFilterImage representations]; + const NSBitmapImageRep *imageRep = [imageRepArray objectAtIndex:0]; + RGB888ToRGBA8888Buffer((const uint32_t *)[imageRep bitmapData], (uint32_t *)[videoFilter srcBufferPtr], (64 * 64)); + [videoFilterImage release]; + + BOOL useBilinear = [[NSUserDefaults standardUserDefaults] boolForKey:@"DisplayView_UseBilinearOutput"]; + + if (vfWidth <= 64 || vfHeight <= 64) + { + [videoFilter changeFilter:VideoFilterTypeID_Nearest2X]; + vfDestSize = [videoFilter destSize]; + vfWidth = (NSUInteger)vfDestSize.width; + vfHeight = (NSUInteger)vfDestSize.height; + + if (useBilinear) + { + bilinearVideoFilter = [[CocoaVideoFilter alloc] initWithSize:vfDestSize typeID:VideoFilterTypeID_Bilinear]; + } + else + { + bilinearVideoFilter = [[CocoaVideoFilter alloc] initWithSize:vfDestSize typeID:VideoFilterTypeID_Nearest2X]; + } + } + else if (vfWidth >= 256 || vfHeight >= 256) + { + bilinearVideoFilter = [[CocoaVideoFilter alloc] initWithSize:vfDestSize typeID:VideoFilterTypeID_None]; + } + else + { + if (useBilinear) + { + bilinearVideoFilter = [[CocoaVideoFilter alloc] initWithSize:vfDestSize typeID:VideoFilterTypeID_Bilinear]; + } + else + { + bilinearVideoFilter = [[CocoaVideoFilter alloc] initWithSize:vfDestSize typeID:VideoFilterTypeID_Nearest2X]; + } + } + + RGB888ToRGBA8888Buffer((const uint32_t *)[videoFilter runFilter], (uint32_t *)[bilinearVideoFilter srcBufferPtr], (vfWidth * vfHeight)); + [bindings setObject:[bilinearVideoFilter image] forKey:@"VideoFilterPreviewImage"]; + + iconVolumeFull = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeFull_16x16" ofType:@"png"]]; + iconVolumeTwoThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeTwoThird_16x16" ofType:@"png"]]; + iconVolumeOneThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeOneThird_16x16" ofType:@"png"]]; + iconVolumeMute = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeMute_16x16" ofType:@"png"]]; + + [bindings setObject:iconVolumeFull forKey:@"volumeIconImage"]; + + return self; +} + +- (void)dealloc +{ + [iconVolumeFull release]; + [iconVolumeTwoThird release]; + [iconVolumeOneThird release]; + [iconVolumeMute release]; + [bindings release]; + [videoFilter release]; + + [super dealloc]; +} + +- (IBAction) showGeneralView:(id)sender +{ + [self switchContentView:viewGeneral]; +} + +- (IBAction) showInputView:(id)sender +{ + [self switchContentView:(NSView *)viewInput]; + [window makeFirstResponder:(NSView *)viewInput]; +} + +- (IBAction) showDisplayView:(id)sender +{ + [self switchContentView:viewDisplay]; +} + +- (IBAction) showSoundView:(id)sender +{ + [self switchContentView:viewSound]; +} + +- (IBAction) showEmulationView:(id)sender +{ + [self switchContentView:viewEmulation]; +} + +- (IBAction) selectAutoloadRomOption:(id)sender +{ + NSInteger option = [(NSMenuItem *)sender tag]; + + [[NSUserDefaults standardUserDefaults] setInteger:option forKey:@"General_AutoloadROMOption"]; + + if (option == 1) + { + NSString *autoloadRomPath = [[NSUserDefaults standardUserDefaults] stringForKey:@"General_AutoloadROMSelectedPath"]; + if ([autoloadRomPath length] == 0) + { + [self chooseRomForAutoload:sender]; + } + } +} + +- (IBAction) chooseRomForAutoload:(id)sender +{ + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setCanChooseDirectories:NO]; + [panel setCanChooseFiles:YES]; + [panel setResolvesAliases:YES]; + [panel setAllowsMultipleSelection:NO]; + [panel setTitle:NSSTRING_TITLE_SELECT_ROM_PANEL]; + NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_ROM_DS, @FILE_EXT_ROM_GBA, nil]; + + // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo + // is deprecated in Mac OS X v10.6. +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + [panel setAllowedFileTypes:fileTypes]; + [panel beginSheetModalForWindow:window + completionHandler:^(NSInteger result) { + [self chooseRomForAutoloadDidEnd:panel returnCode:result contextInfo:nil]; + } ]; +#else + [panel beginSheetForDirectory:nil + file:nil + types:fileTypes + modalForWindow:window + modalDelegate:self + didEndSelector:@selector(chooseRomForAutoloadDidEnd:returnCode:contextInfo:) + contextInfo:nil]; +#endif +} + +- (void) chooseRomForAutoloadDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo +{ + [sheet orderOut:self]; + + if (returnCode == NSCancelButton) + { + return; + } + + NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object + if(selectedFileURL == nil) + { + return; + } + + NSString *selectedFile = [selectedFileURL path]; + + [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"General_AutoloadROMSelectedPath"]; + [bindings setValue:[selectedFile lastPathComponent] forKey:@"AutoloadRomName"]; +} + +- (IBAction) chooseAdvansceneDatabase:(id)sender +{ + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setCanChooseDirectories:NO]; + [panel setCanChooseFiles:YES]; + [panel setResolvesAliases:YES]; + [panel setAllowsMultipleSelection:NO]; + [panel setTitle:NSSTRING_TITLE_SELECT_ADVANSCENE_DB_PANEL]; + NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_ADVANSCENE_DB, nil]; + + // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo + // is deprecated in Mac OS X v10.6. +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + [panel setAllowedFileTypes:fileTypes]; + [panel beginSheetModalForWindow:window + completionHandler:^(NSInteger result) { + [self chooseAdvansceneDatabaseDidEnd:panel returnCode:result contextInfo:nil]; + } ]; +#else + [panel beginSheetForDirectory:nil + file:nil + types:fileTypes + modalForWindow:window + modalDelegate:self + didEndSelector:@selector(chooseAdvansceneDatabaseDidEnd:returnCode:contextInfo:) + contextInfo:nil]; +#endif +} + +- (void) chooseAdvansceneDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo +{ + [sheet orderOut:self]; + + if (returnCode == NSCancelButton) + { + return; + } + + NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object + if(selectedFileURL == nil) + { + return; + } + + NSString *selectedFile = [selectedFileURL path]; + + [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"Advanscene_DatabasePath"]; + [bindings setValue:[selectedFile lastPathComponent] forKey:@"AdvansceneDatabaseName"]; +} + +- (IBAction) chooseCheatDatabase:(id)sender +{ + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setCanChooseDirectories:NO]; + [panel setCanChooseFiles:YES]; + [panel setResolvesAliases:YES]; + [panel setAllowsMultipleSelection:NO]; + [panel setTitle:NSSTRING_TITLE_SELECT_R4_CHEAT_DB_PANEL]; + NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_R4_CHEAT_DB, nil]; + + // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo + // is deprecated in Mac OS X v10.6. +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + [panel setAllowedFileTypes:fileTypes]; + [panel beginSheetModalForWindow:window + completionHandler:^(NSInteger result) { + [self chooseCheatDatabaseDidEnd:panel returnCode:result contextInfo:nil]; + } ]; +#else + [panel beginSheetForDirectory:nil + file:nil + types:fileTypes + modalForWindow:window + modalDelegate:self + didEndSelector:@selector(chooseCheatDatabaseDidEnd:returnCode:contextInfo:) + contextInfo:nil]; +#endif +} + +- (void) chooseCheatDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo +{ + [sheet orderOut:self]; + + if (returnCode == NSCancelButton) + { + return; + } + + NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object + if(selectedFileURL == nil) + { + return; + } + + NSString *selectedFile = [selectedFileURL path]; + + [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"R4Cheat_DatabasePath"]; + [bindings setValue:[selectedFile lastPathComponent] forKey:@"R4CheatDatabaseName"]; + + BOOL isRomLoaded = [(NSNumber *)[(NSMutableDictionary *)[emuWindowController content] valueForKey:@"isRomLoaded"] boolValue]; + NSMutableDictionary *cheatWindowBindings = (NSMutableDictionary *)[cheatWindowController content]; + CocoaDSCheatManager *cdsCheats = (CocoaDSCheatManager *)[cheatWindowBindings valueForKey:@"cheatList"]; + + if (isRomLoaded == YES && cdsCheats != nil) + { + NSInteger error = 0; + NSMutableArray *dbList = [cdsCheats cheatListFromDatabase:selectedFileURL errorCode:&error]; + if (dbList != nil) + { + [cheatDatabaseController setContent:dbList]; + + NSString *titleString = cdsCheats.dbTitle; + NSString *dateString = cdsCheats.dbDate; + + [cheatWindowBindings setValue:titleString forKey:@"cheatDBTitle"]; + [cheatWindowBindings setValue:dateString forKey:@"cheatDBDate"]; + [cheatWindowBindings setValue:[NSString stringWithFormat:@"%d", [dbList count]] forKey:@"cheatDBItemCount"]; + } + else + { + // TODO: Display an error message here. + [cheatWindowBindings setValue:@"---" forKey:@"cheatDBItemCount"]; + + switch (error) + { + case CHEATEXPORT_ERROR_FILE_NOT_FOUND: + NSLog(@"R4 Cheat Database read failed! Could not load the database file!"); + [cheatWindowBindings setValue:@"Database not loaded." forKey:@"cheatDBTitle"]; + [cheatWindowBindings setValue:@"CANNOT LOAD FILE" forKey:@"cheatDBDate"]; + break; + + case CHEATEXPORT_ERROR_WRONG_FILE_FORMAT: + NSLog(@"R4 Cheat Database read failed! Wrong file format!"); + [cheatWindowBindings setValue:@"Database load error." forKey:@"cheatDBTitle"]; + [cheatWindowBindings setValue:@"FAILED TO LOAD FILE" forKey:@"cheatDBDate"]; + break; + + case CHEATEXPORT_ERROR_SERIAL_NOT_FOUND: + NSLog(@"R4 Cheat Database read failed! Could not find the serial number for this game in the database!"); + [cheatWindowBindings setValue:@"ROM not found in database." forKey:@"cheatDBTitle"]; + [cheatWindowBindings setValue:@"ROM not found." forKey:@"cheatDBDate"]; + break; + + case CHEATEXPORT_ERROR_EXPORT_FAILED: + NSLog(@"R4 Cheat Database read failed! Could not read the database file!"); + [cheatWindowBindings setValue:@"Database read error." forKey:@"cheatDBTitle"]; + [cheatWindowBindings setValue:@"CANNOT READ FILE" forKey:@"cheatDBDate"]; + break; + + default: + break; + } + } + } +} + +- (IBAction) selectSoundInputMode:(id)sender +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + if (cdsCore != nil) + { + [cdsCore.cdsController setSoundInputMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"Input_AudioInputMode"]]; + } +} + +- (IBAction) selectDisplayMode:(id)sender +{ + NSInteger displayMode = [(NSMenuItem *)sender tag]; + + [[NSUserDefaults standardUserDefaults] setInteger:displayMode forKey:@"DisplayView_Mode"]; +} + +- (IBAction) selectDisplaySize:(id)sender +{ + NSInteger displaySize = [(NSMenuItem *)sender tag]; + + [[NSUserDefaults standardUserDefaults] setInteger:displaySize forKey:@"DisplayView_Size"]; +} + +- (IBAction) selectDisplayRotation:(id)sender +{ + NSInteger displayRotation = [(NSMenuItem *)sender tag]; + + if (displayRotation != -1) + { + [[NSUserDefaults standardUserDefaults] setDouble:displayRotation forKey:@"DisplayView_Rotation"]; + } +} + +- (IBAction) setUseBilinear:(id)sender +{ + BOOL useBilinear = [CocoaDSUtil getIBActionSenderButtonStateBool:sender]; + NSUInteger previewSrcWidth = (NSUInteger)[bilinearVideoFilter srcSize].width; + NSUInteger previewSrcHeight = (NSUInteger)[bilinearVideoFilter srcSize].height; + + if (previewSrcWidth <= 128 || previewSrcHeight <= 128) + { + if (useBilinear) + { + [bilinearVideoFilter changeFilter:VideoFilterTypeID_Bilinear]; + } + else + { + [bilinearVideoFilter changeFilter:VideoFilterTypeID_Nearest2X]; + } + } + + NSBitmapImageRep *newPreviewImageRep = [bilinearVideoFilter bitmapImageRep]; + + NSImage *videoFilterPreviewImage = [bindings objectForKey:@"VideoFilterPreviewImage"]; + NSArray *imageRepArray = [videoFilterPreviewImage representations]; + NSImageRep *oldImageRep = [imageRepArray objectAtIndex:0]; + [videoFilterPreviewImage removeRepresentation:oldImageRep]; + [videoFilterPreviewImage addRepresentation:newPreviewImageRep]; + + [previewImageView setNeedsDisplay:YES]; +} + +- (IBAction) selectVideoFilterType:(id)sender +{ + VideoFilterTypeID vfType = (VideoFilterTypeID)[CocoaDSUtil getIBActionSenderTag:sender]; + BOOL useBilinear = [[NSUserDefaults standardUserDefaults] boolForKey:@"DisplayView_UseBilinearOutput"]; + + [[NSUserDefaults standardUserDefaults] setInteger:vfType forKey:@"DisplayView_VideoFilter"]; + + [videoFilter changeFilter:vfType]; + NSSize vfDestSize = [videoFilter destSize]; + NSUInteger vfWidth = (NSUInteger)[videoFilter destSize].width; + NSUInteger vfHeight = (NSUInteger)[videoFilter destSize].height; + + if (vfWidth <= 64 || vfHeight <= 64) + { + [videoFilter changeFilter:VideoFilterTypeID_Nearest2X]; + vfDestSize = [videoFilter destSize]; + vfWidth = (NSUInteger)vfDestSize.width; + vfHeight = (NSUInteger)vfDestSize.height; + [bilinearVideoFilter setSourceSize:vfDestSize]; + + if (useBilinear) + { + [bilinearVideoFilter changeFilter:VideoFilterTypeID_Bilinear]; + } + else + { + [bilinearVideoFilter changeFilter:VideoFilterTypeID_Nearest2X]; + } + } + else if (vfWidth >= 256 || vfHeight >= 256) + { + [bilinearVideoFilter setSourceSize:vfDestSize]; + [bilinearVideoFilter changeFilter:VideoFilterTypeID_None]; + } + else + { + [bilinearVideoFilter setSourceSize:vfDestSize]; + + if (useBilinear) + { + [bilinearVideoFilter changeFilter:VideoFilterTypeID_Bilinear]; + } + else + { + [bilinearVideoFilter changeFilter:VideoFilterTypeID_Nearest2X]; + } + } + + RGB888ToRGBA8888Buffer((const uint32_t *)[videoFilter runFilter], (uint32_t *)[bilinearVideoFilter srcBufferPtr], (vfWidth * vfHeight)); + NSBitmapImageRep *newPreviewImageRep = [bilinearVideoFilter bitmapImageRep]; + + NSImage *videoFilterPreviewImage = [bindings objectForKey:@"VideoFilterPreviewImage"]; + NSArray *imageRepArray = [videoFilterPreviewImage representations]; + NSImageRep *oldImageRep = [imageRepArray objectAtIndex:0]; + [videoFilterPreviewImage removeRepresentation:oldImageRep]; + [videoFilterPreviewImage addRepresentation:newPreviewImageRep]; + + [previewImageView setNeedsDisplay:YES]; +} + +- (IBAction) updateVolumeIcon:(id)sender +{ + NSImage *iconImage = (NSImage *)[bindings objectForKey:@"volumeIconImage"]; + float vol = [[NSUserDefaults standardUserDefaults] floatForKey:@"Sound_Volume"]; + + if (vol <= 0.0f) + { + if (iconImage == iconVolumeMute) + { + return; + } + + iconImage = iconVolumeMute; + } + else if (vol > 0.0f && vol <= VOLUME_THRESHOLD_LOW) + { + if (iconImage == iconVolumeOneThird) + { + return; + } + + iconImage = iconVolumeOneThird; + } + else if (vol > VOLUME_THRESHOLD_LOW && vol <= VOLUME_THRESHOLD_HIGH) + { + if (iconImage == iconVolumeTwoThird) + { + return; + } + + iconImage = iconVolumeTwoThird; + } + else + { + if (iconImage == iconVolumeFull) + { + return; + } + + iconImage = iconVolumeFull; + } + + [bindings setObject:iconImage forKey:@"volumeIconImage"]; +} + +- (IBAction) selectSPUSyncMode:(id)sender +{ + NSInteger spuSyncMode = [[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_SyncMode"]; + if (spuSyncMode == SPU_SYNC_MODE_DUAL_SYNC_ASYNC) + { + [spuSyncMethodMenu setEnabled:NO]; + } + else + { + [spuSyncMethodMenu setEnabled:YES]; + } +} + +- (IBAction) selectSPUSyncMethod:(id)sender +{ + NSInteger spuSyncMethod = [(NSMenuItem *)sender tag]; + [[NSUserDefaults standardUserDefaults] setInteger:spuSyncMethod forKey:@"SPU_SyncMethod"]; +} + +- (void) updateDisplayRotationMenu:(double)displayRotation +{ + if (displayRotation == 0.0f || + displayRotation == 90.0f || + displayRotation == 180.0f || + displayRotation == 270.0f) + { + [displayRotationMenu selectItemWithTag:(NSInteger)displayRotation]; + } + else if (displayRotation < 0.0f || displayRotation >= 360.0f) + { + displayRotation = 0.0f; + [displayRotationField setFloatValue:displayRotation]; + [displayRotationMenu selectItemWithTag:(NSInteger)displayRotation]; + } + else + { + [displayRotationMenu selectItem:displayRotationMenuCustomItem]; + } +} + +- (IBAction) chooseARM9BiosImage:(id)sender +{ + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setCanChooseDirectories:NO]; + [panel setCanChooseFiles:YES]; + [panel setResolvesAliases:YES]; + [panel setAllowsMultipleSelection:NO]; + [panel setTitle:NSSTRING_TITLE_SELECT_ARM9_IMAGE_PANEL]; + NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_HW_IMAGE_FILE, nil]; + + // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo + // is deprecated in Mac OS X v10.6. +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + [panel setAllowedFileTypes:fileTypes]; + [panel beginSheetModalForWindow:window + completionHandler:^(NSInteger result) { + [self chooseArm9BiosImageDidEnd:panel returnCode:result contextInfo:nil]; + } ]; +#else + [panel beginSheetForDirectory:nil + file:nil + types:fileTypes + modalForWindow:window + modalDelegate:self + didEndSelector:@selector(chooseArm9BiosImageDidEnd:returnCode:contextInfo:) + contextInfo:nil]; +#endif +} + +- (IBAction) chooseARM7BiosImage:(id)sender +{ + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setCanChooseDirectories:NO]; + [panel setCanChooseFiles:YES]; + [panel setResolvesAliases:YES]; + [panel setAllowsMultipleSelection:NO]; + [panel setTitle:NSSTRING_TITLE_SELECT_ARM7_IMAGE_PANEL]; + NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_HW_IMAGE_FILE, nil]; + + // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo + // is deprecated in Mac OS X v10.6. +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + [panel setAllowedFileTypes:fileTypes]; + [panel beginSheetModalForWindow:window + completionHandler:^(NSInteger result) { + [self chooseArm7BiosImageDidEnd:panel returnCode:result contextInfo:nil]; + } ]; +#else + [panel beginSheetForDirectory:nil + file:nil + types:fileTypes + modalForWindow:window + modalDelegate:self + didEndSelector:@selector(chooseArm7BiosImageDidEnd:returnCode:contextInfo:) + contextInfo:nil]; +#endif +} + +- (IBAction) chooseFirmwareImage:(id)sender +{ + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setCanChooseDirectories:NO]; + [panel setCanChooseFiles:YES]; + [panel setResolvesAliases:YES]; + [panel setAllowsMultipleSelection:NO]; + [panel setTitle:NSSTRING_TITLE_SELECT_FIRMWARE_IMAGE_PANEL]; + NSArray *fileTypes = [NSArray arrayWithObjects:@FILE_EXT_HW_IMAGE_FILE, nil]; + + // The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo + // is deprecated in Mac OS X v10.6. +#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 + [panel setAllowedFileTypes:fileTypes]; + [panel beginSheetModalForWindow:window + completionHandler:^(NSInteger result) { + [self chooseFirmwareImageDidEnd:panel returnCode:result contextInfo:nil]; + } ]; +#else + [panel beginSheetForDirectory:nil + file:nil + types:fileTypes + modalForWindow:window + modalDelegate:self + didEndSelector:@selector(chooseFirmwareImageDidEnd:returnCode:contextInfo:) + contextInfo:nil]; +#endif +} + +- (void) chooseArm9BiosImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo +{ + [sheet orderOut:self]; + + if (returnCode == NSCancelButton) + { + return; + } + + NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object + if(selectedFileURL == nil) + { + return; + } + + NSString *selectedFile = [selectedFileURL path]; + + [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"BIOS_ARM9ImagePath"]; + [bindings setValue:[selectedFile lastPathComponent] forKey:@"Arm9BiosImageName"]; + + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + if (cdsCore != nil) + { + [cdsCore setArm9ImageURL:selectedFileURL]; + } +} + +- (void) chooseArm7BiosImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo +{ + [sheet orderOut:self]; + + if (returnCode == NSCancelButton) + { + return; + } + + NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object + if(selectedFileURL == nil) + { + return; + } + + NSString *selectedFile = [selectedFileURL path]; + + [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"BIOS_ARM7ImagePath"]; + [bindings setValue:[selectedFile lastPathComponent] forKey:@"Arm7BiosImageName"]; + + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + if (cdsCore != nil) + { + [cdsCore setArm7ImageURL:selectedFileURL]; + } +} + +- (void) chooseFirmwareImageDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo +{ + [sheet orderOut:self]; + + if (returnCode == NSCancelButton) + { + return; + } + + NSURL *selectedFileURL = [[sheet URLs] lastObject]; //hopefully also the first object + if(selectedFileURL == nil) + { + return; + } + + NSString *selectedFile = [selectedFileURL path]; + + [[NSUserDefaults standardUserDefaults] setObject:selectedFile forKey:@"Emulation_FirmwareImagePath"]; + [bindings setValue:[selectedFile lastPathComponent] forKey:@"FirmwareImageName"]; + + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + if (cdsCore != nil) + { + [cdsCore setFirmwareImageURL:selectedFileURL]; + } +} + +- (IBAction) configureInternalFirmware:(id)sender +{ + [NSApp beginSheet:firmwareConfigSheet + modalForWindow:window + modalDelegate:self + didEndSelector:@selector(didEndFirmwareConfigSheet:returnCode:contextInfo:) + contextInfo:nil]; +} + +- (IBAction) closeFirmwareConfigSheet:(id)sender +{ + NSWindow *sheet = [(NSControl *)sender window]; + NSInteger code = [CocoaDSUtil getIBActionSenderTag:sender]; + + // Force end of editing of any text fields. + [sheet makeFirstResponder:nil]; + + [NSApp endSheet:sheet returnCode:code]; +} + +- (void) didEndFirmwareConfigSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +{ + [sheet orderOut:self]; +} + +- (void)controlTextDidEndEditing:(NSNotification *)aNotification +{ + [self updateDisplayRotationMenu:[displayRotationField floatValue]]; +} + +- (void) switchContentView:(NSView *)theView +{ + if ([window contentView] == theView) + { + return; + } + + NSRect newFrame = [window frameRectForContentRect:[theView frame]]; + newFrame.origin.x = [window frame].origin.x; + newFrame.origin.y = [window frame].origin.y + [[window contentView] frame].size.height - [theView frame].size.height; + + [[window contentView] retain]; + + NSView *tempView = [[NSView alloc] initWithFrame:[[window contentView] frame]]; + [window setContentView:tempView]; + + [window setFrame:newFrame display:YES animate:YES]; + [window setContentView:theView]; +} + +- (void)windowDidBecomeKey:(NSNotification *)notification +{ + [prefWindowController setContent:self.bindings]; +} + +@end diff --git a/desmume/src/cocoa/videofilter.cpp b/desmume/src/cocoa/videofilter.cpp new file mode 100644 index 000000000..cc7b10611 --- /dev/null +++ b/desmume/src/cocoa/videofilter.cpp @@ -0,0 +1,608 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#include "videofilter.h" + +// Parameters for Scanline filter +int scanline_filter_a = 2; +int scanline_filter_b = 4; + + +/******************************************************************************************** + CLASS CONSTRUCTORS + ********************************************************************************************/ +VideoFilter::VideoFilter() +{ + SSurface *newSrcSurface = (SSurface *)malloc(sizeof(SSurface)); + if (newSrcSurface == NULL) + { + throw; + } + + SSurface *newDestSurface = (SSurface *)malloc(sizeof(SSurface)); + if (newDestSurface == NULL) + { + free(newSrcSurface); + newSrcSurface = NULL; + throw; + } + + pthread_mutex_init(&_mutexSrc, NULL); + pthread_mutex_init(&_mutexDest, NULL); + pthread_mutex_init(&_mutexTypeID, NULL); + pthread_mutex_init(&_mutexTypeString, NULL); + pthread_cond_init(&_condRunning, NULL); + + _isFilterRunning = false; + _srcSurfaceBufferMaster = NULL; + newSrcSurface->Surface = NULL; + newDestSurface->Surface = NULL; + + _srcSurface = newSrcSurface; + _destSurface = newDestSurface; + _typeID = VideoFilterTypeID_None; + + SetSourceSize(1, 1); +} + +VideoFilter::VideoFilter(unsigned int srcWidth, unsigned int srcHeight) +{ + SSurface *newSrcSurface = (SSurface *)malloc(sizeof(SSurface)); + if (newSrcSurface == NULL) + { + throw; + } + + SSurface *newDestSurface = (SSurface *)malloc(sizeof(SSurface)); + if (newDestSurface == NULL) + { + free(newSrcSurface); + newSrcSurface = NULL; + throw; + } + + pthread_mutex_init(&_mutexSrc, NULL); + pthread_mutex_init(&_mutexDest, NULL); + pthread_mutex_init(&_mutexTypeID, NULL); + pthread_mutex_init(&_mutexTypeString, NULL); + pthread_cond_init(&_condRunning, NULL); + + _isFilterRunning = false; + _srcSurfaceBufferMaster = NULL; + newSrcSurface->Surface = NULL; + newDestSurface->Surface = NULL; + + _srcSurface = newSrcSurface; + _destSurface = newDestSurface; + _typeID = VideoFilterTypeID_None; + + SetSourceSize(srcWidth, srcHeight); +} + +VideoFilter::VideoFilter(unsigned int srcWidth, unsigned int srcHeight, VideoFilterTypeID typeID) +{ + SSurface *newSrcSurface = (SSurface *)malloc(sizeof(SSurface)); + if (newSrcSurface == NULL) + { + throw; + } + + SSurface *newDestSurface = (SSurface *)malloc(sizeof(SSurface)); + if (newDestSurface == NULL) + { + free(newSrcSurface); + newSrcSurface = NULL; + throw; + } + + pthread_mutex_init(&_mutexSrc, NULL); + pthread_mutex_init(&_mutexDest, NULL); + pthread_mutex_init(&_mutexTypeID, NULL); + pthread_mutex_init(&_mutexTypeString, NULL); + pthread_cond_init(&_condRunning, NULL); + + _isFilterRunning = false; + _srcSurfaceBufferMaster = NULL; + newSrcSurface->Surface = NULL; + newDestSurface->Surface = NULL; + + _srcSurface = newSrcSurface; + _destSurface = newDestSurface; + _typeID = typeID; + + SetSourceSize(srcWidth, srcHeight); +} + +/******************************************************************************************** + CLASS DESTRUCTOR + ********************************************************************************************/ +VideoFilter::~VideoFilter() +{ + pthread_mutex_lock(&this->_mutexDest); + + while (this->_isFilterRunning) + { + pthread_cond_wait(&this->_condRunning, &this->_mutexDest); + } + + free(_destSurface->Surface); + _destSurface->Surface = NULL; + free(_destSurface); + _destSurface = NULL; + + pthread_mutex_unlock(&_mutexDest); + + pthread_mutex_lock(&_mutexSrc); + + free(_srcSurfaceBufferMaster); + _srcSurfaceBufferMaster = NULL; + _srcSurface->Surface = NULL; + free(_srcSurface); + _srcSurface = NULL; + + pthread_mutex_unlock(&_mutexSrc); + + pthread_mutex_destroy(&_mutexSrc); + pthread_mutex_destroy(&_mutexDest); + pthread_mutex_destroy(&_mutexTypeID); + pthread_mutex_destroy(&_mutexTypeString); + pthread_cond_destroy(&_condRunning); +} + +/******************************************************************************************** + SetSourceSize() + + Sets the rectangular size of the source image. This method reallocates memory based + on the input size, and therefore returns a bool value upon success or failure of + resizing. + + Takes: + width - The width of the source image in pixels. + height - The height of the source image in pixels. + + Returns: + A bool that reports if the resizing was successful. A value of true means success, + while a value of false means failure. + ********************************************************************************************/ +bool VideoFilter::SetSourceSize(unsigned int width, unsigned int height) +{ + bool result = false; + + pthread_mutex_lock(&this->_mutexSrc); + + // Overallocate the source buffer by 8 rows of pixels to account for out-of-bounds + // memory reads done by some filters. + uint32_t *newSurfaceBuffer = (uint32_t *)calloc(width * (height + 8), sizeof(uint32_t)); + if (newSurfaceBuffer == NULL) + { + return result; + } + + this->_srcSurface->Width = width; + this->_srcSurface->Height = height; + this->_srcSurface->Pitch = width * 2; + // Set the working source buffer pointer so that the working memory block is padded + // with 4 pixel rows worth of memory on both sides. + this->_srcSurface->Surface = (unsigned char *)(newSurfaceBuffer + (width * 4)); + + free(this->_srcSurfaceBufferMaster); + this->_srcSurfaceBufferMaster = newSurfaceBuffer; + + pthread_mutex_unlock(&this->_mutexSrc); + + result = this->ChangeFilter(this->GetTypeID()); + + return result; +} + +/******************************************************************************************** + ChangeFilter() + + Changes the video filter type. + + Takes: + typeID - The type ID of the video filter. See the VideoFilterTypeID + enumeration for possible values. + + Returns: + A bool that reports if the filter change was successful. A value of true means + success, while a value of false means failure. + ********************************************************************************************/ +bool VideoFilter::ChangeFilter(VideoFilterTypeID typeID) +{ + bool result = false; + + pthread_mutex_lock(&this->_mutexSrc); + const unsigned int srcWidth = this->_srcSurface->Width; + const unsigned int srcHeight = this->_srcSurface->Height; + pthread_mutex_unlock(&this->_mutexSrc); + + unsigned int destWidth = srcWidth; + unsigned int destHeight = srcHeight; + const char *typeString = VideoFilter::GetTypeStringByID(typeID); + VideoFilterCallback filterCallback = NULL; + + switch (typeID) + { + case VideoFilterTypeID_None: + break; + + case VideoFilterTypeID_LQ2X: + destWidth = srcWidth * 2; + destHeight = srcHeight * 2; + filterCallback = &RenderLQ2X; + break; + + case VideoFilterTypeID_LQ2XS: + destWidth = srcWidth * 2; + destHeight = srcHeight * 2; + filterCallback = &RenderLQ2XS; + break; + + case VideoFilterTypeID_HQ2X: + destWidth = srcWidth * 2; + destHeight = srcHeight * 2; + filterCallback = &RenderHQ2X; + break; + + case VideoFilterTypeID_HQ2XS: + destWidth = srcWidth * 2; + destHeight = srcHeight * 2; + filterCallback = &RenderHQ2XS; + break; + + case VideoFilterTypeID_HQ4X: + destWidth = srcWidth * 4; + destHeight = srcHeight * 4; + filterCallback = &RenderHQ4X; + break; + + case VideoFilterTypeID_2xSaI: + destWidth = srcWidth * 2; + destHeight = srcHeight * 2; + filterCallback = &Render2xSaI; + break; + + case VideoFilterTypeID_Super2xSaI: + destWidth = srcWidth * 2; + destHeight = srcHeight * 2; + filterCallback = &RenderSuper2xSaI; + break; + + case VideoFilterTypeID_SuperEagle: + destWidth = srcWidth * 2; + destHeight = srcHeight * 2; + filterCallback = &RenderSuperEagle; + break; + + case VideoFilterTypeID_Scanline: + destWidth = srcWidth * 2; + destHeight = srcHeight * 2; + filterCallback = &RenderScanline; + break; + + case VideoFilterTypeID_Bilinear: + destWidth = srcWidth * 2; + destHeight = srcHeight * 2; + filterCallback = &RenderBilinear; + break; + + case VideoFilterTypeID_Nearest2X: + destWidth = srcWidth * 2; + destHeight = srcHeight * 2; + filterCallback = &RenderNearest2X; + break; + + case VideoFilterTypeID_Nearest1_5X: + destWidth = srcWidth * 3 / 2; + destHeight = srcHeight * 3 / 2; + filterCallback = &RenderNearest_1Point5x; + break; + + case VideoFilterTypeID_NearestPlus1_5X: + destWidth = srcWidth * 3 / 2; + destHeight = srcHeight * 3 / 2; + filterCallback = &RenderNearestPlus_1Point5x; + break; + + case VideoFilterTypeID_EPX: + destWidth = srcWidth * 2; + destHeight = srcHeight * 2; + filterCallback = &RenderEPX; + break; + + case VideoFilterTypeID_EPXPlus: + destWidth = srcWidth * 2; + destHeight = srcHeight * 2; + filterCallback = &RenderEPXPlus; + break; + + case VideoFilterTypeID_EPX1_5X: + destWidth = srcWidth * 3 / 2; + destHeight = srcHeight * 3 / 2; + filterCallback = &RenderEPX_1Point5x; + break; + + case VideoFilterTypeID_EPXPlus1_5X: + destWidth = srcWidth * 3 / 2; + destHeight = srcHeight * 3 / 2; + filterCallback = &RenderEPXPlus_1Point5x; + break; + + default: + break; + } + + pthread_mutex_lock(&this->_mutexDest); + + uint32_t *newSurfaceBuffer = (uint32_t *)calloc(destWidth * destHeight, sizeof(uint32_t)); + if (newSurfaceBuffer == NULL) + { + return result; + } + + this->_filterCallback = filterCallback; + this->_destSurface->Width = destWidth; + this->_destSurface->Height = destHeight; + this->_destSurface->Pitch = destWidth * 2; + + free(this->_destSurface->Surface); + this->_destSurface->Surface = (unsigned char*)newSurfaceBuffer; + + pthread_mutex_unlock(&this->_mutexDest); + + this->SetTypeID(typeID); + this->SetTypeString(typeString); + + result = true; + + return result; +} + +/******************************************************************************************** + RunFilter() + + Runs the pixels in the source buffer through the video filter, and then stores + the resulting pixels into the destination buffer. + + Takes: + Nothing. + + Returns: + A pointer to the destination buffer. + ********************************************************************************************/ +uint32_t* VideoFilter::RunFilter() +{ + pthread_mutex_lock(&this->_mutexDest); + + this->_isFilterRunning = true; + uint32_t *destBufPtr = (uint32_t *)this->_destSurface->Surface; + + pthread_mutex_lock(&this->_mutexSrc); + + if (this->_filterCallback == NULL) + { + memcpy(this->_destSurface->Surface, this->_srcSurface->Surface, this->_destSurface->Width * this->_destSurface->Height * sizeof(uint32_t)); + } + else + { + this->_filterCallback(*this->_srcSurface, *this->_destSurface); + } + + pthread_mutex_unlock(&this->_mutexSrc); + + this->_isFilterRunning = false; + pthread_cond_signal(&this->_condRunning); + pthread_mutex_unlock(&this->_mutexDest); + + return destBufPtr; +} + +/******************************************************************************************** + GetTypeStringByID() - STATIC + + Returns a C-string representation of the passed in video filter type. + + Takes: + typeID - The type ID of the video filter. See the VideoFilterTypeID + enumeration for possible values. + + Returns: + A C-string that represents the video filter type. If typeID is invalid, + this method returns the string "Unknown". + ********************************************************************************************/ +const char* VideoFilter::GetTypeStringByID(VideoFilterTypeID typeID) +{ + const char *typeString = "Unknown"; + + switch (typeID) + { + case VideoFilterTypeID_None: + typeString = VIDEOFILTERTYPE_NONE_STRING; + break; + + case VideoFilterTypeID_LQ2X: + typeString = VIDEOFILTERTYPE_LQ2X_STRING; + break; + + case VideoFilterTypeID_LQ2XS: + typeString = VIDEOFILTERTYPE_LQ2XS_STRING; + break; + + case VideoFilterTypeID_HQ2X: + typeString = VIDEOFILTERTYPE_HQ2X_STRING; + break; + + case VideoFilterTypeID_HQ2XS: + typeString = VIDEOFILTERTYPE_HQ2XS_STRING; + break; + + case VideoFilterTypeID_HQ4X: + typeString = VIDEOFILTERTYPE_HQ4X_STRING; + break; + + case VideoFilterTypeID_2xSaI: + typeString = VIDEOFILTERTYPE_2XSAI_STRING; + break; + + case VideoFilterTypeID_Super2xSaI: + typeString = VIDEOFILTERTYPE_SUPER_2XSAI_STRING; + break; + + case VideoFilterTypeID_SuperEagle: + typeString = VIDEOFILTERTYPE_SUPER_EAGLE_STRING; + break; + + case VideoFilterTypeID_Scanline: + typeString = VIDEOFILTERTYPE_SCANLINE_STRING; + break; + + case VideoFilterTypeID_Bilinear: + typeString = VIDEOFILTERTYPE_BILINEAR_STRING; + break; + + case VideoFilterTypeID_Nearest2X: + typeString = VIDEOFILTERTYPE_NEAREST_2X_STRING; + break; + + case VideoFilterTypeID_Nearest1_5X: + typeString = VIDEOFILTERTYPE_NEAREST_1_5X_STRING; + break; + + case VideoFilterTypeID_NearestPlus1_5X: + typeString = VIDEOFILTERTYPE_NEAREST_PLUS_1_5X_STRING; + break; + + case VideoFilterTypeID_EPX: + typeString = VIDEOFILTERTYPE_EPX_STRING; + break; + + case VideoFilterTypeID_EPXPlus: + typeString = VIDEOFILTERTYPE_EPX_PLUS_STRING; + break; + + case VideoFilterTypeID_EPX1_5X: + typeString = VIDEOFILTERTYPE_EPX_1_5X_STRING; + break; + + case VideoFilterTypeID_EPXPlus1_5X: + typeString = VIDEOFILTERTYPE_EPX_PLUS_1_5X_STRING; + break; + + default: + break; + } + + return typeString; +} + +/******************************************************************************************** + ACCESSORS + ********************************************************************************************/ +VideoFilterTypeID VideoFilter::GetTypeID() +{ + pthread_mutex_lock(&this->_mutexTypeID); + VideoFilterTypeID typeID = this->_typeID; + pthread_mutex_unlock(&this->_mutexTypeID); + + return typeID; +} + +void VideoFilter::SetTypeID(VideoFilterTypeID typeID) +{ + pthread_mutex_lock(&this->_mutexTypeID); + this->_typeID = typeID; + pthread_mutex_unlock(&this->_mutexTypeID); +} + +const char* VideoFilter::GetTypeString() +{ + pthread_mutex_lock(&this->_mutexTypeString); + const char *typeString = this->_typeString.c_str(); + pthread_mutex_unlock(&this->_mutexTypeString); + + return typeString; +} + +void VideoFilter::SetTypeString(const char *typeString) +{ + pthread_mutex_lock(&this->_mutexTypeString); + this->_typeString = typeString; + pthread_mutex_unlock(&this->_mutexTypeString); +} + +void VideoFilter::SetTypeString(std::string typeString) +{ + pthread_mutex_lock(&this->_mutexTypeString); + this->_typeString = typeString; + pthread_mutex_unlock(&this->_mutexTypeString); +} + +uint32_t* VideoFilter::GetSrcBufferPtr() +{ + pthread_mutex_lock(&this->_mutexSrc); + uint32_t *ptr = (uint32_t *)this->_srcSurface->Surface; + pthread_mutex_unlock(&this->_mutexSrc); + + return ptr; +} + +uint32_t* VideoFilter::GetDestBufferPtr() +{ + pthread_mutex_lock(&this->_mutexDest); + uint32_t *ptr = (uint32_t *)this->_destSurface->Surface; + pthread_mutex_unlock(&this->_mutexDest); + + return ptr; +} + +unsigned int VideoFilter::GetSrcWidth() +{ + pthread_mutex_lock(&this->_mutexSrc); + unsigned int width = this->_srcSurface->Width; + pthread_mutex_unlock(&this->_mutexSrc); + + return width; +} + +unsigned int VideoFilter::GetSrcHeight() +{ + pthread_mutex_lock(&this->_mutexSrc); + unsigned int height = this->_srcSurface->Height; + pthread_mutex_unlock(&this->_mutexSrc); + + return height; +} + +unsigned int VideoFilter::GetDestWidth() +{ + pthread_mutex_lock(&this->_mutexDest); + unsigned int width = this->_destSurface->Width; + pthread_mutex_unlock(&this->_mutexDest); + + return width; +} + +unsigned int VideoFilter::GetDestHeight() +{ + pthread_mutex_lock(&this->_mutexDest); + unsigned int height = this->_destSurface->Height; + pthread_mutex_unlock(&this->_mutexDest); + + return height; +} diff --git a/desmume/src/cocoa/videofilter.h b/desmume/src/cocoa/videofilter.h new file mode 100644 index 000000000..6ee5a576d --- /dev/null +++ b/desmume/src/cocoa/videofilter.h @@ -0,0 +1,139 @@ +/* + Copyright (C) 2011 Roger Manuel + Copyright (C) 2012 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . +*/ + +#ifndef _VIDEOFILTER_ +#define _VIDEOFILTER_ + +#include +#include +#include +#include "types.h" +#include "../windows/filter/filter.h" + + +// VIDEO FILTER TYPES +enum VideoFilterTypeID +{ + VideoFilterTypeID_None = 0, + VideoFilterTypeID_LQ2X, + VideoFilterTypeID_LQ2XS, + VideoFilterTypeID_HQ2X, + VideoFilterTypeID_HQ2XS, + VideoFilterTypeID_HQ4X, + VideoFilterTypeID_2xSaI, + VideoFilterTypeID_Super2xSaI, + VideoFilterTypeID_SuperEagle, + VideoFilterTypeID_Scanline, + VideoFilterTypeID_Bilinear, + VideoFilterTypeID_Nearest2X, + VideoFilterTypeID_Nearest1_5X, + VideoFilterTypeID_NearestPlus1_5X, + VideoFilterTypeID_EPX, + VideoFilterTypeID_EPXPlus, + VideoFilterTypeID_EPX1_5X, + VideoFilterTypeID_EPXPlus1_5X +}; + +// VIDEO FILTER TYPE STRINGS +#define VIDEOFILTERTYPE_NONE_STRING "None" +#define VIDEOFILTERTYPE_LQ2X_STRING "LQ2X" +#define VIDEOFILTERTYPE_LQ2XS_STRING "LQ2XS" +#define VIDEOFILTERTYPE_HQ2X_STRING "HQ2X" +#define VIDEOFILTERTYPE_HQ2XS_STRING "HQ2XS" +#define VIDEOFILTERTYPE_HQ4X_STRING "HQ4X" +#define VIDEOFILTERTYPE_2XSAI_STRING "2xSaI" +#define VIDEOFILTERTYPE_SUPER_2XSAI_STRING "Super 2xSaI" +#define VIDEOFILTERTYPE_SUPER_EAGLE_STRING "Super Eagle" +#define VIDEOFILTERTYPE_SCANLINE_STRING "Scanline" +#define VIDEOFILTERTYPE_BILINEAR_STRING "Bilinear" +#define VIDEOFILTERTYPE_NEAREST_2X_STRING "Nearest 2x" +#define VIDEOFILTERTYPE_NEAREST_1_5X_STRING "Nearest 1.5x" +#define VIDEOFILTERTYPE_NEAREST_PLUS_1_5X_STRING "Nearest+ 1.5x" +#define VIDEOFILTERTYPE_EPX_STRING "EPX" +#define VIDEOFILTERTYPE_EPX_PLUS_STRING "EPX+" +#define VIDEOFILTERTYPE_EPX_1_5X_STRING "EPX 1.5x" +#define VIDEOFILTERTYPE_EPX_PLUS_1_5X_STRING "EPX+ 1.5x" +#define VIDEOFILTERTYPE_UNKNOWN_STRING "Unknown" + +typedef void (*VideoFilterCallback)(SSurface Src, SSurface Dst); + +/******************************************************************************************** + VideoFilter - C++ CLASS + + This is a wrapper class for managing the video filter functions from filter.h. + + The steps to using a video filter are as follows: + 1. Instantiate this class. + 2. Set the rectangular size of the source image in pixels. (Can be done during + instantiation.) + 3. Set the video filter type. (Can be done during instantiation.) + 4. Fill in the source buffer with pixels in RGBA8888 format. This class provides + the GetSrcBufferPtr() accessor for the source buffer pointer. + 5. Call RunFilter(). This runs the source buffer pixels through the chosen filter, + and then stores the resulting pixels into the destination buffer in RGBA8888 + format. + 6. At this point, the destination buffer pixels can be used. RunFilter() returns + a pointer to the destination buffer. Alternatively, GetDestBufferPtr() can be + used to get the pointer. + + Thread Safety: + All methods are thread-safe. + ********************************************************************************************/ +class VideoFilter +{ +private: + VideoFilterTypeID _typeID; + std::string _typeString; + SSurface *_srcSurface; + SSurface *_destSurface; + uint32_t *_srcSurfaceBufferMaster; + VideoFilterCallback _filterCallback; + bool _isFilterRunning; + + pthread_mutex_t _mutexSrc; + pthread_mutex_t _mutexDest; + pthread_mutex_t _mutexTypeID; + pthread_mutex_t _mutexTypeString; + pthread_cond_t _condRunning; + + void SetTypeID(VideoFilterTypeID typeID); + void SetTypeString(const char *typeString); + void SetTypeString(std::string typeString); + +public: + VideoFilter(); + VideoFilter(unsigned int srcWidth, unsigned int srcHeight); + VideoFilter(unsigned int srcWidth, unsigned int srcHeight, VideoFilterTypeID typeID); + ~VideoFilter(); + + bool SetSourceSize(unsigned int width, unsigned int height); + bool ChangeFilter(VideoFilterTypeID typeID); + uint32_t* RunFilter(); + static const char* GetTypeStringByID(VideoFilterTypeID typeID); + + VideoFilterTypeID GetTypeID(); + const char* GetTypeString(); + uint32_t* GetSrcBufferPtr(); + uint32_t* GetDestBufferPtr(); + unsigned int GetSrcWidth(); + unsigned int GetSrcHeight(); + unsigned int GetDestWidth(); + unsigned int GetDestHeight(); +}; + +#endif