From 366ce0b105727cd9dee3585cd9d62969a482c064 Mon Sep 17 00:00:00 2001 From: Michael Buckley Date: Mon, 2 Sep 2019 10:20:32 -0700 Subject: [PATCH] Get app running that can load ROMs and be controlled with the default key bindings. No configuration is yet possible. --- ...acheIndex-39754f5c7639f1405cb8f271288abde4 | Bin 146 -> 0 bytes .../Build/Intermediates/XCBuildData/build.db | Bin 348160 -> 0 bytes macosx/Snes9x/AppDelegate.h | 14 + macosx/Snes9x/AppDelegate.m | 38 + .../AppIcon.appiconset/Contents.json | 58 + macosx/Snes9x/Assets.xcassets/Contents.json | 6 + macosx/Snes9x/Base.lproj/MainMenu.xib | 678 +++++++ macosx/Snes9x/Info.plist | 30 + macosx/Snes9x/Snes9x.entitlements | 5 + macosx/Snes9x/main.m | 12 + macosx/mac-appleevent.h | 1 + macosx/mac-appleevent.mm | 1 + macosx/mac-audio.h | 1 + macosx/mac-audio.mm | 25 +- macosx/mac-cart.h | 1 + macosx/mac-cheat.h | 1 + macosx/mac-cheat.mm | 1 + macosx/mac-cheatfinder.h | 1 + macosx/mac-cheatfinder.mm | 1 + macosx/mac-cocoatools.h | 1 + macosx/mac-cocoatools.mm | 3 +- macosx/mac-controls.h | 1 + macosx/mac-controls.mm | 3 +- macosx/mac-coreimage.h | 1 + macosx/mac-coreimage.mm | 1 + macosx/mac-file.h | 1 + macosx/mac-file.mm | 1 + macosx/mac-global_prefix.h | 1 + macosx/mac-gworld.h | 1 + macosx/mac-gworld.mm | 1 + macosx/mac-joypad.h | 1 + macosx/mac-joypad.mm | 1 + macosx/mac-keyboard.h | 1 + macosx/mac-keyboard.mm | 1 + macosx/mac-multicart.h | 1 + macosx/mac-multicart.mm | 1 + macosx/mac-musicbox.h | 1 + macosx/mac-musicbox.mm | 1 + macosx/mac-netplay.h | 1 + macosx/mac-netplay.mm | 1 + macosx/mac-os.h | 24 +- macosx/mac-os.mm | 1799 ++++++++--------- macosx/mac-prefix.h | 1 + macosx/mac-prefs.h | 1 + macosx/mac-prefs.mm | 1 + macosx/mac-render.h | 1 + macosx/mac-render.mm | 459 +---- macosx/mac-snes9x.h | 1 + macosx/mac-snes9x.mm | 14 +- macosx/mac-stringtools.h | 1 + macosx/mac-stringtools.mm | 1 + macosx/snes9x framework/snes9x_framework.h | 4 +- macosx/snes9x.xcodeproj/project.pbxproj | 762 ++----- .../UserInterfaceState.xcuserstate | Bin 103377 -> 0 bytes 54 files changed, 2056 insertions(+), 1912 deletions(-) delete mode 100644 macosx/Build/Intermediates/XCBuildData/BuildDescriptionCacheIndex-39754f5c7639f1405cb8f271288abde4 delete mode 100644 macosx/Build/Intermediates/XCBuildData/build.db create mode 100644 macosx/Snes9x/AppDelegate.h create mode 100644 macosx/Snes9x/AppDelegate.m create mode 100644 macosx/Snes9x/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 macosx/Snes9x/Assets.xcassets/Contents.json create mode 100644 macosx/Snes9x/Base.lproj/MainMenu.xib create mode 100644 macosx/Snes9x/Info.plist create mode 100644 macosx/Snes9x/Snes9x.entitlements create mode 100644 macosx/Snes9x/main.m delete mode 100644 macosx/snes9x.xcodeproj/project.xcworkspace/xcuserdata/buckley.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/macosx/Build/Intermediates/XCBuildData/BuildDescriptionCacheIndex-39754f5c7639f1405cb8f271288abde4 b/macosx/Build/Intermediates/XCBuildData/BuildDescriptionCacheIndex-39754f5c7639f1405cb8f271288abde4 deleted file mode 100644 index ad76aceed1f071d52b354d00dc7c69eb6d6593b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmWN|yOl#B3`J3wLh4K)^r4sukS?moO}Gy_a6|J>y4U%=p8nqWer_vGM8G>m>4C2v z;Bj>3N?R$njjfYo@|Z$&s#H4Cup$)sz-_EuRD`j8OoyP%;d-oAF~z#gb`?znaXN3` M#?Nfa5fGuF|7avCM*si- diff --git a/macosx/Build/Intermediates/XCBuildData/build.db b/macosx/Build/Intermediates/XCBuildData/build.db deleted file mode 100644 index 0b1b3da41f294c133f55f1ed8373434664199045..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 348160 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 LgNU~+(c}LK%qUtp diff --git a/macosx/Snes9x/AppDelegate.h b/macosx/Snes9x/AppDelegate.h new file mode 100644 index 00000000..c9c16577 --- /dev/null +++ b/macosx/Snes9x/AppDelegate.h @@ -0,0 +1,14 @@ +// +// AppDelegate.h +// Snes9x +// +// Created by Buckley on 8/21/19. +// + +#import + +@interface AppDelegate : NSObject + + +@end + diff --git a/macosx/Snes9x/AppDelegate.m b/macosx/Snes9x/AppDelegate.m new file mode 100644 index 00000000..da826e80 --- /dev/null +++ b/macosx/Snes9x/AppDelegate.m @@ -0,0 +1,38 @@ +// +// AppDelegate.m +// Snes9x +// +// Created by Buckley on 8/21/19. +// + +#import "AppDelegate.h" +#import + +@interface AppDelegate () + +@property (strong) S9xEngine *s9xEngine; +@end + +@implementation AppDelegate + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + self.s9xEngine = [S9xEngine new]; +} + + +- (void)applicationWillTerminate:(NSNotification *)aNotification { + // Insert code here to tear down your application +} + +- (IBAction)openDocument:(id)sender +{ + NSOpenPanel* panel = [NSOpenPanel new]; + NSModalResponse response = [panel runModal]; + + if ( response == NSModalResponseOK ) + { + [self.s9xEngine loadROM:panel.URL]; + } +} + +@end diff --git a/macosx/Snes9x/Assets.xcassets/AppIcon.appiconset/Contents.json b/macosx/Snes9x/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..2db2b1c7 --- /dev/null +++ b/macosx/Snes9x/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/macosx/Snes9x/Assets.xcassets/Contents.json b/macosx/Snes9x/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/macosx/Snes9x/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/macosx/Snes9x/Base.lproj/MainMenu.xib b/macosx/Snes9x/Base.lproj/MainMenu.xib new file mode 100644 index 00000000..cb4a74d9 --- /dev/null +++ b/macosx/Snes9x/Base.lproj/MainMenu.xib @@ -0,0 +1,678 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macosx/Snes9x/Info.plist b/macosx/Snes9x/Info.plist new file mode 100644 index 00000000..3588abd0 --- /dev/null +++ b/macosx/Snes9x/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/macosx/Snes9x/Snes9x.entitlements b/macosx/Snes9x/Snes9x.entitlements new file mode 100644 index 00000000..0c67376e --- /dev/null +++ b/macosx/Snes9x/Snes9x.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/macosx/Snes9x/main.m b/macosx/Snes9x/main.m new file mode 100644 index 00000000..777c2034 --- /dev/null +++ b/macosx/Snes9x/main.m @@ -0,0 +1,12 @@ +// +// main.m +// Snes9x +// +// Created by Buckley on 8/21/19. +// + +#import + +int main(int argc, const char * argv[]) { + return NSApplicationMain(argc, argv); +} diff --git a/macosx/mac-appleevent.h b/macosx/mac-appleevent.h index ea82660c..d4e74962 100755 --- a/macosx/mac-appleevent.h +++ b/macosx/mac-appleevent.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-appleevent.mm b/macosx/mac-appleevent.mm index 2010b206..89abbe0c 100755 --- a/macosx/mac-appleevent.mm +++ b/macosx/mac-appleevent.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-audio.h b/macosx/mac-audio.h index fac84b37..513c5dbf 100644 --- a/macosx/mac-audio.h +++ b/macosx/mac-audio.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-audio.mm b/macosx/mac-audio.mm index 5baa4617..deb685af 100644 --- a/macosx/mac-audio.mm +++ b/macosx/mac-audio.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ @@ -43,11 +44,6 @@ int cureffect = kAUReverb; static AUGraph agraph; static AUNode outNode, cnvNode, revNode, eqlNode; static AudioUnit outAU, cnvAU, revAU, eqlAU; -static AudioUnitCarbonView carbonView = NULL; -static EventHandlerUPP carbonViewEventUPP = NULL; -static EventHandlerRef carbonViewEventRef = NULL; -static WindowRef effectWRef; -static HISize effectWSize; static pthread_mutex_t mutex; static UInt32 outStoredFrames, cnvStoredFrames, revStoredFrames, eqlStoredFrames, devStoredFrames; static int16_t *audioBuffer; @@ -73,11 +69,7 @@ void InitMacSound (void) err = NewAUGraph(&agraph); -#ifndef MAC_LEOPARD_TIGER_PANTHER_SUPPORT AudioComponentDescription outdesc, cnvdesc, revdesc, eqldesc; -#else - ComponentDescription outdesc, cnvdesc, revdesc, eqldesc; -#endif outdesc.componentType = kAudioUnitType_Output; outdesc.componentSubType = kAudioUnitSubType_DefaultOutput; @@ -103,31 +95,18 @@ void InitMacSound (void) eqldesc.componentFlags = 0; eqldesc.componentFlagsMask = 0; -#ifndef MAC_LEOPARD_TIGER_PANTHER_SUPPORT err = AUGraphAddNode(agraph, &outdesc, &outNode); err = AUGraphAddNode(agraph, &cnvdesc, &cnvNode); err = AUGraphAddNode(agraph, &revdesc, &revNode); err = AUGraphAddNode(agraph, &eqldesc, &eqlNode); -#else - err = AUGraphNewNode(agraph, &outdesc, 0, NULL, &outNode); - err = AUGraphNewNode(agraph, &cnvdesc, 0, NULL, &cnvNode); - err = AUGraphNewNode(agraph, &revdesc, 0, NULL, &revNode); - err = AUGraphNewNode(agraph, &eqldesc, 0, NULL, &eqlNode); -#endif err = AUGraphOpen(agraph); -#ifndef MAC_LEOPARD_TIGER_PANTHER_SUPPORT err = AUGraphNodeInfo(agraph, outNode, NULL, &outAU); err = AUGraphNodeInfo(agraph, cnvNode, NULL, &cnvAU); err = AUGraphNodeInfo(agraph, revNode, NULL, &revAU); err = AUGraphNodeInfo(agraph, eqlNode, NULL, &eqlAU); -#else - err = AUGraphGetNodeInfo(agraph, outNode, NULL, NULL, NULL, &outAU); - err = AUGraphGetNodeInfo(agraph, cnvNode, NULL, NULL, NULL, &cnvAU); - err = AUGraphGetNodeInfo(agraph, revNode, NULL, NULL, NULL, &revAU); - err = AUGraphGetNodeInfo(agraph, eqlNode, NULL, NULL, NULL, &eqlAU); -#endif + SetAudioUnitSoundFormat(); SetAudioUnitVolume(); diff --git a/macosx/mac-cart.h b/macosx/mac-cart.h index 044cd108..d908ffc3 100755 --- a/macosx/mac-cart.h +++ b/macosx/mac-cart.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-cheat.h b/macosx/mac-cheat.h index fed7c33e..bef15b91 100755 --- a/macosx/mac-cheat.h +++ b/macosx/mac-cheat.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-cheat.mm b/macosx/mac-cheat.mm index 4197871c..f0baf09a 100755 --- a/macosx/mac-cheat.mm +++ b/macosx/mac-cheat.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-cheatfinder.h b/macosx/mac-cheatfinder.h index e467023e..529bebc1 100755 --- a/macosx/mac-cheatfinder.h +++ b/macosx/mac-cheatfinder.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-cheatfinder.mm b/macosx/mac-cheatfinder.mm index 1ea0921a..855caeeb 100755 --- a/macosx/mac-cheatfinder.mm +++ b/macosx/mac-cheatfinder.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-cocoatools.h b/macosx/mac-cocoatools.h index 2281c236..02870031 100644 --- a/macosx/mac-cocoatools.h +++ b/macosx/mac-cocoatools.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-cocoatools.mm b/macosx/mac-cocoatools.mm index 5c41d865..b716166c 100644 --- a/macosx/mac-cocoatools.mm +++ b/macosx/mac-cocoatools.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ @@ -128,7 +129,7 @@ void CocoaAddPopUpBtnToView (NSView *view, NSArray *array, float x, float y, flo { NSPopUpButton *control; NSMenu *menu; - int n; + NSUInteger n; menu = [[NSMenu alloc] init]; diff --git a/macosx/mac-controls.h b/macosx/mac-controls.h index 409cfdaf..8575a92a 100644 --- a/macosx/mac-controls.h +++ b/macosx/mac-controls.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-controls.mm b/macosx/mac-controls.mm index d3295f06..46c4a517 100644 --- a/macosx/mac-controls.mm +++ b/macosx/mac-controls.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ @@ -32,8 +33,6 @@ #define ASSIGN_POINTRf(n, s) S9xMapPointer(n, cmd = S9xGetCommandT(s), false) #define ASSIGN_POINTRt(n, s) S9xMapPointer(n, cmd = S9xGetCommandT(s), true) -#define KeyIsPressed(km, k) (1 & (((unsigned char *) km) [(k) >> 3] >> ((k) & 7))) - void S9xSetupDefaultKeymap (void) { diff --git a/macosx/mac-coreimage.h b/macosx/mac-coreimage.h index 030849dd..6614d2b4 100644 --- a/macosx/mac-coreimage.h +++ b/macosx/mac-coreimage.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-coreimage.mm b/macosx/mac-coreimage.mm index 918e498b..cd270f64 100644 --- a/macosx/mac-coreimage.mm +++ b/macosx/mac-coreimage.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-file.h b/macosx/mac-file.h index 841b1a74..2f721274 100644 --- a/macosx/mac-file.h +++ b/macosx/mac-file.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-file.mm b/macosx/mac-file.mm index 28d80d96..9084491c 100644 --- a/macosx/mac-file.mm +++ b/macosx/mac-file.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ #import diff --git a/macosx/mac-global_prefix.h b/macosx/mac-global_prefix.h index 85298359..b20fa1f4 100644 --- a/macosx/mac-global_prefix.h +++ b/macosx/mac-global_prefix.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-gworld.h b/macosx/mac-gworld.h index 961b50d3..3cf1a899 100755 --- a/macosx/mac-gworld.h +++ b/macosx/mac-gworld.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-gworld.mm b/macosx/mac-gworld.mm index 3a27eaab..97cfefb5 100755 --- a/macosx/mac-gworld.mm +++ b/macosx/mac-gworld.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-joypad.h b/macosx/mac-joypad.h index 7db4b017..c530c358 100755 --- a/macosx/mac-joypad.h +++ b/macosx/mac-joypad.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-joypad.mm b/macosx/mac-joypad.mm index bf891970..bc041dc0 100755 --- a/macosx/mac-joypad.mm +++ b/macosx/mac-joypad.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-keyboard.h b/macosx/mac-keyboard.h index 53f3ca96..b6d2afd3 100755 --- a/macosx/mac-keyboard.h +++ b/macosx/mac-keyboard.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-keyboard.mm b/macosx/mac-keyboard.mm index a1c91f5e..a7a2bc12 100755 --- a/macosx/mac-keyboard.mm +++ b/macosx/mac-keyboard.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-multicart.h b/macosx/mac-multicart.h index c7ef139a..28a24993 100644 --- a/macosx/mac-multicart.h +++ b/macosx/mac-multicart.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-multicart.mm b/macosx/mac-multicart.mm index c531f5f2..da53f2da 100644 --- a/macosx/mac-multicart.mm +++ b/macosx/mac-multicart.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-musicbox.h b/macosx/mac-musicbox.h index cd1dca76..5effce26 100755 --- a/macosx/mac-musicbox.h +++ b/macosx/mac-musicbox.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-musicbox.mm b/macosx/mac-musicbox.mm index 74455ac6..d9201c06 100755 --- a/macosx/mac-musicbox.mm +++ b/macosx/mac-musicbox.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-netplay.h b/macosx/mac-netplay.h index dc299f07..ecdf8299 100644 --- a/macosx/mac-netplay.h +++ b/macosx/mac-netplay.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-netplay.mm b/macosx/mac-netplay.mm index 16b70212..b9d92007 100644 --- a/macosx/mac-netplay.mm +++ b/macosx/mac-netplay.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-os.h b/macosx/mac-os.h index 02174c4d..d694224c 100644 --- a/macosx/mac-os.h +++ b/macosx/mac-os.h @@ -15,12 +15,17 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ #ifndef _mac_os_h_ #define _mac_os_h_ +#import + +@class NSOpenGLView; + enum { kDrawingReserved1 = 1, // unused @@ -107,6 +112,7 @@ typedef struct #define kMacWindowHeight (SNES_HEIGHT_EXTENDED << 1) #define MAC_MAX_PLAYERS 8 #define MAC_MAX_CHEATS 150 +#define MAC_NUM_KEYCODES 255 extern volatile bool8 running, s9xthreadrunning; extern volatile bool8 eventQueued, windowExtend; @@ -114,8 +120,7 @@ extern volatile int windowResizeCount; extern uint32 controlPad[MAC_MAX_PLAYERS]; extern uint8 romDetect, interleaveDetect, videoDetect, headerDetect; extern WindowRef gWindow; -extern HIRect gWindowRect; -extern int glScreenW, glScreenH; +extern uint32 glScreenW, glScreenH; extern CGRect glScreenBounds; extern Point windowPos[kWindowCount]; extern CGSize windowSize[kWindowCount]; @@ -158,6 +163,11 @@ extern CFStringRef multiCartPath[2]; extern IconRef macIconRef[118]; #endif +extern bool8 pressedKeys[MAC_NUM_KEYCODES]; +extern os_unfair_lock keyLock; + +extern NSOpenGLView *s9xView; + void AddRecentItem (NSURL *); void AdjustMenus (void); void UpdateMenuCommandStatus (Boolean); @@ -167,6 +177,14 @@ void ChangeInputDevice (void); void GetGameScreenPointer (int16 *, int16 *, bool); void PostQueueToSubEventLoop (void); int PromptFreezeDefrost (Boolean); -uint64 GetMicroseconds(); +uint64 GetMicroseconds(void); + +@interface S9xEngine : NSObject + +- (void)start; + +- (void)loadROM:(NSURL *)fileURL; + +@end #endif diff --git a/macosx/mac-os.mm b/macosx/mac-os.mm index 9d1ac411..d710342a 100644 --- a/macosx/mac-os.mm +++ b/macosx/mac-os.mm @@ -62,13 +62,11 @@ #import "mac-os.h" #define kRecentMenu_MAX 20 -#define KeyIsPressed(km, k) (1 & (((unsigned char *) km) [(k) >> 3] >> ((k) & 7))) +#define KeyIsPressed(km, k) (km[k]) volatile bool8 running = false; volatile bool8 s9xthreadrunning = false; -volatile bool8 eventQueued = false; - volatile int windowResizeCount = 1; volatile bool8 windowExtend = true; @@ -80,8 +78,7 @@ uint8 romDetect = 0, headerDetect = 0; WindowRef gWindow = NULL; -HIRect gWindowRect; -int glScreenW, +uint32 glScreenW, glScreenH; CGRect glScreenBounds; Point windowPos[kWindowCount]; @@ -173,6 +170,11 @@ CFStringRef multiCartPath[2]; IconRef macIconRef[118]; #endif +bool8 pressedKeys[MAC_NUM_KEYCODES]; +os_unfair_lock keyLock; + +NSOpenGLView *s9xView; + enum { mApple = 128, @@ -286,18 +288,8 @@ static volatile bool8 rejectinput = false; static bool8 pauseEmulation = false, frameAdvance = false; -static pthread_t s9xthread; - -static MenuRef recentMenu; static CFStringRef recentItem[kRecentMenu_MAX + 1]; -static EventHandlerUPP gameWindowUPP, - gameWUPaneUPP; -static EventHandlerRef gameWindowEventRef, - gameWUPaneEventRef; - -static int windowZoomCount = 0; - static int frameCount = 0; static bool8 frzselecting = false; @@ -339,8 +331,6 @@ static void InitAutofire (void); static void InitRecentItems (void); static void DeinitRecentItems (void); static void ClearRecentItems (void); -static void InitRecentMenu (void); -static void DeinitRecentMenu (void); static void ProcessInput (void); static void ResizeGameWindow (void); static void ChangeAutofireSettings (int, int); @@ -349,164 +339,60 @@ static void CFTimerCallback (CFRunLoopTimerRef, void *); static void UpdateFreezeDefrostScreen (int, CGImageRef, uint8 *, CGContextRef); static void * MacSnes9xThread (void *); static inline void EmulationLoop (void); +static inline void CopyPressedKeys(uint8 destination[MAC_NUM_KEYCODES]); int main (int argc, const char *argv[]) { return NSApplicationMain(argc, argv); } -//{ -// Initialize(); -// -// while (!finished) -// { -// if (cartOpen && running) -// { -// #ifdef DEBUGGER -// CPU.Flags |= DEBUG_MODE_FLAG; -// S9xDoDebug(); -// #endif -// -// eventQueued = false; -// -// Microseconds((UnsignedWide *) &lastFrame); -// frameCount = 0; -// if (macFrameSkip < 0) -// skipFrames = 3; -// else -// skipFrames = macFrameSkip; -// -// err = RemoveEventHandler(eref); -// DisposeEventHandlerUPP(eUPP); -// #ifdef MAC_PANTHER_SUPPORT -// [pool release]; -// -// pool = [[NSAutoreleasePool alloc] init]; -// #endif -// eUPP = NewEventHandlerUPP(SubEventHandler); -// err = InstallApplicationEventHandler(eUPP, GetEventTypeCount(sEvents), sEvents, NULL, &eref); -// -// S9xInitDisplay(NULL, NULL); -// ClearGFXScreen(); -// -// if (!fullscreen) -// ForceChangingKeyScript(); -// -// pthread_create(&s9xthread, NULL, MacSnes9xThread, NULL); -// -// CFRunLoopTimerRef cftimer = NULL; -// CFRunLoopTimerContext cftimerctx = { 0, NULL, NULL, NULL, NULL }; -// -// if (!fullscreen) -// { -// cftimer = CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent(), 30, 0, 0, CFTimerCallback, &cftimerctx); -// if (cftimer) -// CFRunLoopAddTimer(CFRunLoopGetCurrent(), cftimer, kCFRunLoopCommonModes); -// } -// -// AdjustMenus(); -// -// RunApplicationEventLoop(); -// -// if (!fullscreen) -// { -// if (cftimer) -// { -// CFRunLoopTimerInvalidate(cftimer); -// CFRelease(cftimer); -// cftimer = NULL; -// } -// } -// -// pthread_join(s9xthread, NULL); -// -// if (!Settings.NetPlay || Settings.NetPlayServer) -// { -// SNES9X_SaveSRAM(); -// S9xResetSaveTimer(false); -// S9xSaveCheatFile(S9xGetFilename(".cht", CHEAT_DIR)); -// } -// -// S9xDeinitDisplay(); -// -// if (Settings.NetPlay) -// { -// if (!Settings.NetPlayServer) -// { -// DeinitGameWindow(); -// cartOpen = false; -// } -// -// Settings.NetPlay = false; -// Settings.NetPlayServer = false; -// } -// -// err = RemoveEventHandler(eref); -// DisposeEventHandlerUPP(eUPP); -// #ifdef MAC_PANTHER_SUPPORT -// [pool release]; -// -// pool = [[NSAutoreleasePool alloc] init]; -// #endif -// eUPP = NewEventHandlerUPP(MainEventHandler); -// err = InstallApplicationEventHandler(eUPP, GetEventTypeCount(mEvents), mEvents, NULL, &eref); -// } -// -// if (!finished) -// { -// AdjustMenus(); -// RunApplicationEventLoop(); -// } -// } -// -// Deinitialize(); -// -// err = RemoveEventHandler(eref); -// DisposeEventHandlerUPP(eUPP); -//#ifdef MAC_PANTHER_SUPPORT -// [pool release]; -//#endif -// -// return (0); -//} -// -static void CFTimerCallback (CFRunLoopTimerRef timer, void *info) -{ -// OSStatus err; -// -// err = UpdateSystemActivity(OverallAct); -} -// + static void * MacSnes9xThread (void *) { -// Settings.StopEmulation = false; -// s9xthreadrunning = true; -// -// EmulationLoop(); -// -// s9xthreadrunning = false; -// Settings.StopEmulation = true; -// + Settings.StopEmulation = false; + s9xthreadrunning = true; + + EmulationLoop(); + + s9xthreadrunning = false; + Settings.StopEmulation = true; + return (NULL); } -// + +static inline void CopyPressedKeys(uint8 destination[MAC_NUM_KEYCODES]) +{ + os_unfair_lock_lock(&keyLock); + NSEventModifierFlags flags = [NSEvent modifierFlags]; + pressedKeys[kVK_Shift] = (flags & NSEventModifierFlagShift) != 0; + pressedKeys[kVK_Command] = (flags & NSEventModifierFlagCommand) != 0; + pressedKeys[kVK_Control] = (flags & NSEventModifierFlagControl) != 0; + pressedKeys[kVK_CapsLock] = (flags & NSEventModifierFlagCapsLock) != 0; + pressedKeys[kVK_Option] = (flags & NSEventModifierFlagOption) != 0; + pressedKeys[kVK_Help] = (flags & NSEventModifierFlagHelp) != 0; + pressedKeys[kVK_Function] = (flags & NSEventModifierFlagFunction) != 0; + + memcpy(destination, pressedKeys, sizeof(pressedKeys)); + os_unfair_lock_unlock(&keyLock); +} + static inline void EmulationLoop (void) { -// bool8 olddisplayframerate = false; -// int storedMacFrameSkip = macFrameSkip; -// -// pauseEmulation = false; -// frameAdvance = false; -// -// if (macQTRecord) -// { -// olddisplayframerate = Settings.DisplayFrameRate; -// Settings.DisplayFrameRate = false; -// } -// -// MacStartSound(); -// -// if (Settings.NetPlay) -// { + bool8 olddisplayframerate = false; + int storedMacFrameSkip = macFrameSkip; + + pauseEmulation = false; + frameAdvance = false; + + if (macQTRecord) + { + olddisplayframerate = Settings.DisplayFrameRate; + Settings.DisplayFrameRate = false; + } + + MacStartSound(); + + if (Settings.NetPlay) + { // if (Settings.NetPlayServer) // { // NPServerDetachNetPlayThread(); @@ -537,42 +423,42 @@ static inline void EmulationLoop (void) // // NPClientRestoreConfig(); // } -// } -// else -// { -// while (running) -// { -// ProcessInput(); -// -// if (!pauseEmulation) -// S9xMainLoop(); -// else -// { -// if (frameAdvance) -// { -// macFrameSkip = 1; -// skipFrames = 1; -// frameAdvance = false; -// S9xMainLoop(); -// macFrameSkip = storedMacFrameSkip; -// } -// -// usleep(Settings.FrameTime); -// } -// } -// } -// -// MacStopSound(); -// -// if (macQTRecord) -// { + } + else + { + while (running) + { + ProcessInput(); + + if (!pauseEmulation) + S9xMainLoop(); + else + { + if (frameAdvance) + { + macFrameSkip = 1; + skipFrames = 1; + frameAdvance = false; + S9xMainLoop(); + macFrameSkip = storedMacFrameSkip; + } + + usleep(Settings.FrameTime); + } + } + } + + MacStopSound(); + + if (macQTRecord) + { // MacQTStopRecording(); // macQTRecord = false; -// -// Settings.DisplayFrameRate = olddisplayframerate; -// } -// -// S9xMovieShutdown(); + + Settings.DisplayFrameRate = olddisplayframerate; + } + + S9xMovieShutdown(); } // //static OSStatus MainEventHandler (EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void *inUserData) @@ -1100,73 +986,73 @@ static inline void EmulationLoop (void) // return (result); //} // -//static void InitRecentItems (void) -//{ -// CFStringRef keyRef, pathRef; -// int count; -// char key[32]; +static void InitRecentItems (void) +{ + CFStringRef keyRef, pathRef; + int count; + char key[32]; + + count = 0; + + for (int i = 0; i <= kRecentMenu_MAX; i++) + recentItem[i] = NULL; + + for (int i = 0; i < kRecentMenu_MAX; i++) + { + sprintf(key, "RecentItem_%02d", i); + keyRef = CFStringCreateWithCString(kCFAllocatorDefault, key, CFStringGetSystemEncoding()); + if (keyRef) + { + pathRef = (CFStringRef) CFPreferencesCopyAppValue(keyRef, kCFPreferencesCurrentApplication); + if (pathRef) + { + recentItem[count] = pathRef; + count++; + } + + CFRelease(keyRef); + } + } +} // -// count = 0; -// -// for (int i = 0; i <= kRecentMenu_MAX; i++) -// recentItem[i] = NULL; -// -// for (int i = 0; i < kRecentMenu_MAX; i++) -// { -// sprintf(key, "RecentItem_%02d", i); -// keyRef = CFStringCreateWithCString(kCFAllocatorDefault, key, CFStringGetSystemEncoding()); -// if (keyRef) -// { -// pathRef = (CFStringRef) CFPreferencesCopyAppValue(keyRef, kCFPreferencesCurrentApplication); -// if (pathRef) -// { -// recentItem[count] = pathRef; -// count++; -// } -// -// CFRelease(keyRef); -// } -// } -//} -// -//static void DeinitRecentItems (void) -//{ -// CFStringRef keyRef; -// char key[32]; -// -// for (int i = 0; i < kRecentMenu_MAX; i++) -// { -// sprintf(key, "RecentItem_%02d", i); -// keyRef = CFStringCreateWithCString(kCFAllocatorDefault, key, CFStringGetSystemEncoding()); -// if (keyRef) -// { -// if (recentItem[i]) -// { -// CFPreferencesSetAppValue(keyRef, recentItem[i], kCFPreferencesCurrentApplication); -// CFRelease(recentItem[i]); -// recentItem[i] = NULL; -// } -// else -// CFPreferencesSetAppValue(keyRef, NULL, kCFPreferencesCurrentApplication); -// -// CFRelease(keyRef); -// } -// } -// -// CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication); -//} -// -//static void ClearRecentItems (void) -//{ -// for (int i = 0; i < kRecentMenu_MAX; i++) -// { -// if (recentItem[i]) -// { -// CFRelease(recentItem[i]); -// recentItem[i] = NULL; -// } -// } -//} +static void DeinitRecentItems (void) +{ + CFStringRef keyRef; + char key[32]; + + for (int i = 0; i < kRecentMenu_MAX; i++) + { + sprintf(key, "RecentItem_%02d", i); + keyRef = CFStringCreateWithCString(kCFAllocatorDefault, key, CFStringGetSystemEncoding()); + if (keyRef) + { + if (recentItem[i]) + { + CFPreferencesSetAppValue(keyRef, recentItem[i], kCFPreferencesCurrentApplication); + CFRelease(recentItem[i]); + recentItem[i] = NULL; + } + else + CFPreferencesSetAppValue(keyRef, NULL, kCFPreferencesCurrentApplication); + + CFRelease(keyRef); + } + } + + CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication); +} + +static void ClearRecentItems (void) +{ + for (int i = 0; i < kRecentMenu_MAX; i++) + { + if (recentItem[i]) + { + CFRelease(recentItem[i]); + recentItem[i] = NULL; + } + } +} // void AddRecentItem (NSURL *url) { @@ -1801,59 +1687,59 @@ void AddRecentItem (NSURL *url) // return (result); //} // -//void ChangeInputDevice (void) -//{ -// switch (deviceSetting) -// { -// case iPad: -// S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); -// S9xSetController(1, CTL_JOYPAD, 1, 0, 0, 0); -// macControllerOption = SNES_JOYPAD; -// break; -// -// case iMouse: -// S9xSetController(0, CTL_MOUSE, 0, 0, 0, 0); -// S9xSetController(1, CTL_JOYPAD, 1, 0, 0, 0); -// macControllerOption = SNES_MOUSE; -// break; -// -// case iMouse2: -// S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); -// S9xSetController(1, CTL_MOUSE, 1, 0, 0, 0); -// macControllerOption = SNES_MOUSE_SWAPPED; -// break; -// -// case iSuperScope: -// S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); -// S9xSetController(1, CTL_SUPERSCOPE, 0, 0, 0, 0); -// macControllerOption = SNES_SUPERSCOPE; -// break; -// -// case iMultiPlayer5: -// S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); -// S9xSetController(1, CTL_MP5, 1, 2, 3, 4); -// macControllerOption = SNES_MULTIPLAYER5; -// break; -// -// case iMultiPlayer5_2: -// S9xSetController(0, CTL_MP5, 0, 1, 2, 3); -// S9xSetController(1, CTL_MP5, 4, 5, 6, 7); -// macControllerOption = SNES_MULTIPLAYER5_2; -// break; -// -// case iJustifier1: -// S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); -// S9xSetController(1, CTL_JUSTIFIER, 0, 0, 0, 0); -// macControllerOption = SNES_JUSTIFIER; -// break; -// -// case iJustifier2: -// S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); -// S9xSetController(1, CTL_JUSTIFIER, 1, 0, 0, 0); -// macControllerOption = SNES_JUSTIFIER_2; -// break; -// } -//} +void ChangeInputDevice (void) +{ + switch (deviceSetting) + { + case iPad: + S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController(1, CTL_JOYPAD, 1, 0, 0, 0); + macControllerOption = SNES_JOYPAD; + break; + + case iMouse: + S9xSetController(0, CTL_MOUSE, 0, 0, 0, 0); + S9xSetController(1, CTL_JOYPAD, 1, 0, 0, 0); + macControllerOption = SNES_MOUSE; + break; + + case iMouse2: + S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController(1, CTL_MOUSE, 1, 0, 0, 0); + macControllerOption = SNES_MOUSE_SWAPPED; + break; + + case iSuperScope: + S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController(1, CTL_SUPERSCOPE, 0, 0, 0, 0); + macControllerOption = SNES_SUPERSCOPE; + break; + + case iMultiPlayer5: + S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController(1, CTL_MP5, 1, 2, 3, 4); + macControllerOption = SNES_MULTIPLAYER5; + break; + + case iMultiPlayer5_2: + S9xSetController(0, CTL_MP5, 0, 1, 2, 3); + S9xSetController(1, CTL_MP5, 4, 5, 6, 7); + macControllerOption = SNES_MULTIPLAYER5_2; + break; + + case iJustifier1: + S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController(1, CTL_JUSTIFIER, 0, 0, 0, 0); + macControllerOption = SNES_JUSTIFIER; + break; + + case iJustifier2: + S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController(1, CTL_JUSTIFIER, 1, 0, 0, 0); + macControllerOption = SNES_JUSTIFIER_2; + break; + } +} // void ApplyNSRTHeaderControllers (void) { @@ -2176,14 +2062,14 @@ int PromptFreezeDefrost (Boolean freezing) // { // if (!rejectinput) // { -// GetKeys(keys); +// CopyPressedKeys(keys); // // for (int count = 0; count <= 12; count++) // { // while (KeyIsPressed(keys, keyCheck[count])) // { // result = count - 1; -// GetKeys(keys); +// CopyPressedKeys(keys); // } // } // @@ -2195,7 +2081,7 @@ int PromptFreezeDefrost (Boolean freezing) // current_selection -= 12; // UpdateFreezeDefrostScreen(current_selection, image, draw, ctx); // while (KeyIsPressed(keys, keyCode[k1PRight]) && (TickCount() < (startTime + repeatDelay))) -// GetKeys(keys); +// CopyPressedKeys(keys); // } // // while (KeyIsPressed(keys, keyCode[k1PLeft])) @@ -2206,7 +2092,7 @@ int PromptFreezeDefrost (Boolean freezing) // current_selection += 12; // UpdateFreezeDefrostScreen(current_selection, image, draw, ctx); // while (KeyIsPressed(keys, keyCode[k1PLeft]) && (TickCount() < (startTime + repeatDelay))) -// GetKeys(keys); +// CopyPressedKeys(keys); // } // // while (KeyIsPressed(keys, keyCode[k1PDown])) @@ -2217,7 +2103,7 @@ int PromptFreezeDefrost (Boolean freezing) // current_selection -= 12; // UpdateFreezeDefrostScreen(current_selection, image, draw, ctx); // while (KeyIsPressed(keys, keyCode[k1PDown]) && (TickCount() < (startTime + repeatDelay))) -// GetKeys(keys); +// CopyPressedKeys(keys); // } // // while (KeyIsPressed(keys, keyCode[k1PUp])) @@ -2228,7 +2114,7 @@ int PromptFreezeDefrost (Boolean freezing) // current_selection += 12; // UpdateFreezeDefrostScreen(current_selection, image, draw, ctx); // while (KeyIsPressed(keys, keyCode[k1PUp]) && (TickCount() < (startTime + repeatDelay))) -// GetKeys(keys); +// CopyPressedKeys(keys); // } // // while (KeyIsPressed(keys, keyCode[k1PA] ) || @@ -2244,7 +2130,7 @@ int PromptFreezeDefrost (Boolean freezing) // KeyIsPressed(keys, keyCode[k1PSelect]) || // KeyIsPressed(keys, keyCode[k2PSelect])) // { -// GetKeys(keys); +// CopyPressedKeys(keys); // result = current_selection; // } // @@ -2390,581 +2276,560 @@ int PromptFreezeDefrost (Boolean freezing) // DrawFreezeDefrostScreen(draw); //} // -//static void ProcessInput (void) -//{ -// KeyMap myKeys; -// bool8 isok, fnbtn, altbtn, tcbtn; -// static bool8 toggleff = false, lastTimeTT = false, lastTimeFn = false, ffUp = false, ffDown = false, ffUpSp = false, ffDownSp = false; -// -// if (rejectinput) -// return; -// -// if (ISpKeyIsPressed(kISpEsc)) -// { -// if (s9xthreadrunning) -// { -// if (!eventQueued) -// { -// PostQueueToSubEventLoop(); -// eventQueued = true; -// } -// } -// else -// running = false; -// -// return; -// } -// -// if (ISpKeyIsPressed(kISpFreeze)) -// { -// MacStopSound(); -// while (ISpKeyIsPressed(kISpFreeze)); -// -// isok = SNES9X_Freeze(); -// ClearGFXScreen(); -// return; -// } -// -// if (ISpKeyIsPressed(kISpDefrost)) -// { -// MacStopSound(); -// while (ISpKeyIsPressed(kISpDefrost)); -// -// isok = SNES9X_Defrost(); -// ClearGFXScreen(); -// return; -// } -// -// if (ISpKeyIsPressed(kISpScreenshot)) -// { -// Settings.TakeScreenshot = true; -// while (ISpKeyIsPressed(kISpScreenshot)); -// } -// -// if (ISpKeyIsPressed(kISpSPC)) -// { -// S9xDumpSPCSnapshot(); -// while (ISpKeyIsPressed(kISpSPC)); -// } -// -// if (ISpKeyIsPressed(kISpFFUp)) -// { -// if (!ffUpSp) -// { -// ChangeTurboRate(+1); -// ffUpSp = true; -// } -// } -// else -// ffUpSp = false; -// -// if (ISpKeyIsPressed(kISpFFDown)) -// { -// if (!ffDownSp) -// { -// ChangeTurboRate(-1); -// ffDownSp = true; -// } -// } -// else -// ffDownSp = false; -// -// controlPad[0] = controlPad[1] = 0; -// -// JoypadScanDirection(0, &(controlPad[0])); -// if (ISpKeyIsPressed(kISp1PR )) controlPad[0] |= 0x0010; -// if (ISpKeyIsPressed(kISp1PL )) controlPad[0] |= 0x0020; -// if (ISpKeyIsPressed(kISp1PX )) controlPad[0] |= 0x0040; -// if (ISpKeyIsPressed(kISp1PA )) controlPad[0] |= 0x0080; -// if (ISpKeyIsPressed(kISp1PStart )) controlPad[0] |= 0x1000; -// if (ISpKeyIsPressed(kISp1PSelect)) controlPad[0] |= 0x2000; -// if (ISpKeyIsPressed(kISp1PY )) controlPad[0] |= 0x4000; -// if (ISpKeyIsPressed(kISp1PB )) controlPad[0] |= 0x8000; -// -// JoypadScanDirection(1, &(controlPad[1])); -// if (ISpKeyIsPressed(kISp2PR )) controlPad[1] |= 0x0010; -// if (ISpKeyIsPressed(kISp2PL )) controlPad[1] |= 0x0020; -// if (ISpKeyIsPressed(kISp2PX )) controlPad[1] |= 0x0040; -// if (ISpKeyIsPressed(kISp2PA )) controlPad[1] |= 0x0080; -// if (ISpKeyIsPressed(kISp2PStart )) controlPad[1] |= 0x1000; -// if (ISpKeyIsPressed(kISp2PSelect)) controlPad[1] |= 0x2000; -// if (ISpKeyIsPressed(kISp2PY )) controlPad[1] |= 0x4000; -// if (ISpKeyIsPressed(kISp2PB )) controlPad[1] |= 0x8000; -// -// if (((macControllerOption == SNES_MULTIPLAYER5) || (macControllerOption == SNES_MULTIPLAYER5_2)) && Settings.MultiPlayer5Master) -// { -// controlPad[2] = controlPad[3] = controlPad[4] = 0; -// -// JoypadScanDirection(2, &(controlPad[2])); -// if (ISpKeyIsPressed(kISp3PR )) controlPad[2] |= 0x0010; -// if (ISpKeyIsPressed(kISp3PL )) controlPad[2] |= 0x0020; -// if (ISpKeyIsPressed(kISp3PX )) controlPad[2] |= 0x0040; -// if (ISpKeyIsPressed(kISp3PA )) controlPad[2] |= 0x0080; -// if (ISpKeyIsPressed(kISp3PStart )) controlPad[2] |= 0x1000; -// if (ISpKeyIsPressed(kISp3PSelect)) controlPad[2] |= 0x2000; -// if (ISpKeyIsPressed(kISp3PY )) controlPad[2] |= 0x4000; -// if (ISpKeyIsPressed(kISp3PB )) controlPad[2] |= 0x8000; -// -// JoypadScanDirection(3, &(controlPad[3])); -// if (ISpKeyIsPressed(kISp4PR )) controlPad[3] |= 0x0010; -// if (ISpKeyIsPressed(kISp4PL )) controlPad[3] |= 0x0020; -// if (ISpKeyIsPressed(kISp4PX )) controlPad[3] |= 0x0040; -// if (ISpKeyIsPressed(kISp4PA )) controlPad[3] |= 0x0080; -// if (ISpKeyIsPressed(kISp4PStart )) controlPad[3] |= 0x1000; -// if (ISpKeyIsPressed(kISp4PSelect)) controlPad[3] |= 0x2000; -// if (ISpKeyIsPressed(kISp4PY )) controlPad[3] |= 0x4000; -// if (ISpKeyIsPressed(kISp4PB )) controlPad[3] |= 0x8000; -// -// JoypadScanDirection(4, &(controlPad[4])); -// if (ISpKeyIsPressed(kISp5PR )) controlPad[4] |= 0x0010; -// if (ISpKeyIsPressed(kISp5PL )) controlPad[4] |= 0x0020; -// if (ISpKeyIsPressed(kISp5PX )) controlPad[4] |= 0x0040; -// if (ISpKeyIsPressed(kISp5PA )) controlPad[4] |= 0x0080; -// if (ISpKeyIsPressed(kISp5PStart )) controlPad[4] |= 0x1000; -// if (ISpKeyIsPressed(kISp5PSelect)) controlPad[4] |= 0x2000; -// if (ISpKeyIsPressed(kISp5PY )) controlPad[4] |= 0x4000; -// if (ISpKeyIsPressed(kISp5PB )) controlPad[4] |= 0x8000; -// -// ControlPadFlagsToS9xReportButtons(2, controlPad[2]); -// ControlPadFlagsToS9xReportButtons(3, controlPad[3]); -// ControlPadFlagsToS9xReportButtons(4, controlPad[4]); -// -// if (macControllerOption == SNES_MULTIPLAYER5_2) -// { -// controlPad[5] = controlPad[6] = controlPad[7] = 0; -// -// JoypadScanDirection(5, &(controlPad[5])); -// if (ISpKeyIsPressed(kISp6PR )) controlPad[5] |= 0x0010; -// if (ISpKeyIsPressed(kISp6PL )) controlPad[5] |= 0x0020; -// if (ISpKeyIsPressed(kISp6PX )) controlPad[5] |= 0x0040; -// if (ISpKeyIsPressed(kISp6PA )) controlPad[5] |= 0x0080; -// if (ISpKeyIsPressed(kISp6PStart )) controlPad[5] |= 0x1000; -// if (ISpKeyIsPressed(kISp6PSelect)) controlPad[5] |= 0x2000; -// if (ISpKeyIsPressed(kISp6PY )) controlPad[5] |= 0x4000; -// if (ISpKeyIsPressed(kISp6PB )) controlPad[5] |= 0x8000; -// -// JoypadScanDirection(6, &(controlPad[6])); -// if (ISpKeyIsPressed(kISp7PR )) controlPad[6] |= 0x0010; -// if (ISpKeyIsPressed(kISp7PL )) controlPad[6] |= 0x0020; -// if (ISpKeyIsPressed(kISp7PX )) controlPad[6] |= 0x0040; -// if (ISpKeyIsPressed(kISp7PA )) controlPad[6] |= 0x0080; -// if (ISpKeyIsPressed(kISp7PStart )) controlPad[6] |= 0x1000; -// if (ISpKeyIsPressed(kISp7PSelect)) controlPad[6] |= 0x2000; -// if (ISpKeyIsPressed(kISp7PY )) controlPad[6] |= 0x4000; -// if (ISpKeyIsPressed(kISp7PB )) controlPad[6] |= 0x8000; -// -// JoypadScanDirection(7, &(controlPad[7])); -// if (ISpKeyIsPressed(kISp8PR )) controlPad[7] |= 0x0010; -// if (ISpKeyIsPressed(kISp8PL )) controlPad[7] |= 0x0020; -// if (ISpKeyIsPressed(kISp8PX )) controlPad[7] |= 0x0040; -// if (ISpKeyIsPressed(kISp8PA )) controlPad[7] |= 0x0080; -// if (ISpKeyIsPressed(kISp8PStart )) controlPad[7] |= 0x1000; -// if (ISpKeyIsPressed(kISp8PSelect)) controlPad[7] |= 0x2000; -// if (ISpKeyIsPressed(kISp8PY )) controlPad[7] |= 0x4000; -// if (ISpKeyIsPressed(kISp8PB )) controlPad[7] |= 0x8000; -// -// ControlPadFlagsToS9xReportButtons(5, controlPad[5]); -// ControlPadFlagsToS9xReportButtons(6, controlPad[6]); -// ControlPadFlagsToS9xReportButtons(7, controlPad[7]); -// } -// } -// -// GetKeys(myKeys); -// -// fnbtn = (KeyIsPressed(myKeys, keyCode[kKeyFunction]) || ISpKeyIsPressed(kISpFunction)); -// altbtn = (KeyIsPressed(myKeys, keyCode[kKeyAlt] ) || ISpKeyIsPressed(kISpAlt) ); -// -// if (fnbtn) -// { -// if (!lastTimeFn) -// { -// for (unsigned int i = 0; i < kCommandListSize; i++) -// btncmd[i].held = false; -// } -// -// lastTimeFn = true; -// lastTimeTT = false; -// ffUp = ffDown = false; -// -// for (unsigned int i = 0; i < kCommandListSize; i++) -// { -// if (KeyIsPressed(myKeys, btncmd[i].keycode)) -// { -// if (!(btncmd[i].held)) -// { -// btncmd[i].held = true; -// -// if (strncmp(btncmd[i].command, "_mac", 4) == 0) -// { -// static char msg[64]; -// -// switch (btncmd[i].command[4] - '0') -// { -// case 1: -// Settings.DisplayPressedKeys = !Settings.DisplayPressedKeys; -// break; -// -// case 2: -// if (S9xMovieActive()) -// Settings.DisplayMovieFrame = !Settings.DisplayMovieFrame; -// break; -// -// case 3: -// if (macFrameAdvanceRate < 5000000) -// macFrameAdvanceRate += 100000; -// sprintf(msg, "Emulation Speed: 100/%d", macFrameAdvanceRate / 10000); -// S9xSetInfoString(msg); -// break; -// -// case 4: -// if (macFrameAdvanceRate > 500000) -// macFrameAdvanceRate -= 100000; -// sprintf(msg, "Emulation Speed: 100/%d", macFrameAdvanceRate / 10000); -// S9xSetInfoString(msg); -// break; -// -// case 5: -// pauseEmulation = !pauseEmulation; -// break; -// -// case 6: -// frameAdvance = true; -// break; -// } -// } -// else -// { -// s9xcommand_t s9xcmd; -// -// s9xcmd = S9xGetCommandT(btncmd[i].command); -// S9xApplyCommand(s9xcmd, 1, 0); -// } -// } -// } -// else -// btncmd[i].held = false; -// } -// } -// else -// { -// lastTimeFn = false; -// -// if (KeyIsPressed(myKeys, keyCode[kKeyEsc])) -// { -// if (s9xthreadrunning) -// { -// if (!eventQueued) -// { -// PostQueueToSubEventLoop(); -// eventQueued = true; -// } -// } -// else -// running = false; -// -// return; -// } -// -// if (KeyIsPressed(myKeys, keyCode[kKeyFreeze])) -// { -// MacStopSound(); -// while (KeyIsPressed(myKeys, keyCode[kKeyFreeze])) -// GetKeys(myKeys); -// -// isok = SNES9X_Freeze(); -// ClearGFXScreen(); -// return; -// } -// -// if (KeyIsPressed(myKeys, keyCode[kKeyDefrost])) -// { -// MacStopSound(); -// while (KeyIsPressed(myKeys, keyCode[kKeyDefrost])) -// GetKeys(myKeys); -// -// isok = SNES9X_Defrost(); -// ClearGFXScreen(); -// return; -// } -// -// if (KeyIsPressed(myKeys, keyCode[kKeyScreenshot])) -// { -// Settings.TakeScreenshot = true; -// while (KeyIsPressed(myKeys, keyCode[kKeyScreenshot])) -// GetKeys(myKeys); -// } -// -// if (KeyIsPressed(myKeys, keyCode[kKeySPC])) -// { -// S9xDumpSPCSnapshot(); -// while (KeyIsPressed(myKeys, keyCode[kKeySPC])) -// GetKeys(myKeys); -// } -// -// if (KeyIsPressed(myKeys, keyCode[kKeyFFUp])) -// { -// if (!ffUp) -// { -// ChangeTurboRate(+1); -// ffUp = true; -// } -// } -// else -// ffUp = false; -// -// if (KeyIsPressed(myKeys, keyCode[kKeyFFDown])) -// { -// if (!ffDown) -// { -// ChangeTurboRate(-1); -// ffDown = true; -// } -// } -// else -// ffDown = false; -// -// if (KeyIsPressed(myKeys, keyCode[k1PR] )) controlPad[0] |= 0x0010; -// if (KeyIsPressed(myKeys, keyCode[k1PL] )) controlPad[0] |= 0x0020; -// if (KeyIsPressed(myKeys, keyCode[k1PX] )) controlPad[0] |= 0x0040; -// if (KeyIsPressed(myKeys, keyCode[k1PA] )) controlPad[0] |= 0x0080; -// if (KeyIsPressed(myKeys, keyCode[k1PRight] )) controlPad[0] |= 0x0100; -// if (KeyIsPressed(myKeys, keyCode[k1PLeft] )) controlPad[0] |= 0x0200; -// if (KeyIsPressed(myKeys, keyCode[k1PDown] )) controlPad[0] |= 0x0400; -// if (KeyIsPressed(myKeys, keyCode[k1PUp] )) controlPad[0] |= 0x0800; -// if (KeyIsPressed(myKeys, keyCode[k1PStart] )) controlPad[0] |= 0x1000; -// if (KeyIsPressed(myKeys, keyCode[k1PSelect])) controlPad[0] |= 0x2000; -// if (KeyIsPressed(myKeys, keyCode[k1PY] )) controlPad[0] |= 0x4000; -// if (KeyIsPressed(myKeys, keyCode[k1PB] )) controlPad[0] |= 0x8000; -// -// if (KeyIsPressed(myKeys, keyCode[k2PR] )) controlPad[1] |= 0x0010; -// if (KeyIsPressed(myKeys, keyCode[k2PL] )) controlPad[1] |= 0x0020; -// if (KeyIsPressed(myKeys, keyCode[k2PX] )) controlPad[1] |= 0x0040; -// if (KeyIsPressed(myKeys, keyCode[k2PA] )) controlPad[1] |= 0x0080; -// if (KeyIsPressed(myKeys, keyCode[k2PRight] )) controlPad[1] |= 0x0100; -// if (KeyIsPressed(myKeys, keyCode[k2PLeft] )) controlPad[1] |= 0x0200; -// if (KeyIsPressed(myKeys, keyCode[k2PDown] )) controlPad[1] |= 0x0400; -// if (KeyIsPressed(myKeys, keyCode[k2PUp] )) controlPad[1] |= 0x0800; -// if (KeyIsPressed(myKeys, keyCode[k2PStart] )) controlPad[1] |= 0x1000; -// if (KeyIsPressed(myKeys, keyCode[k2PSelect])) controlPad[1] |= 0x2000; -// if (KeyIsPressed(myKeys, keyCode[k2PY] )) controlPad[1] |= 0x4000; -// if (KeyIsPressed(myKeys, keyCode[k2PB] )) controlPad[1] |= 0x8000; -// -// if (altbtn) -// { -// if (!lastTimeTT) -// changeAuto[0] = changeAuto[1] = 0; -// -// for (int i = 0; i < 2; i++) -// { -// for (int j = 0; j < 12; j++) -// { -// uint16 mask = 0x0010 << j; -// -// if (controlPad[i] & mask & autofireRec[i].toggleMask) -// { -// controlPad[i] &= ~mask; -// -// if (!(changeAuto[i] & mask)) -// { -// changeAuto[i] |= mask; -// ChangeAutofireSettings(i, j); -// } -// } -// else -// changeAuto[i] &= ~mask; -// } -// } -// -// lastTimeTT = true; -// } -// else -// lastTimeTT = false; -// } -// -// if (enabletoggle) -// { -// if ((ISpKeyIsPressed(kISpFastForward) || KeyIsPressed(myKeys, keyCode[kKeyFastForward])) && !fnbtn) -// { -// if (!toggleff) -// { -// toggleff = true; -// Settings.TurboMode = !Settings.TurboMode; -// S9xSetInfoString(Settings.TurboMode ? "Turbo mode on" : "Turbo mode off"); -// if (!Settings.TurboMode) -// S9xClearSamples(); -// } -// } -// else -// toggleff = false; -// } -// else -// { -// bool8 old = Settings.TurboMode; -// Settings.TurboMode = ((ISpKeyIsPressed(kISpFastForward) || KeyIsPressed(myKeys, keyCode[kKeyFastForward])) && !fnbtn) ? true : false; -// if (!Settings.TurboMode && old) -// S9xClearSamples(); -// } -// -// for (int i = 0; i < 2; i++) -// controlPad[i] ^= autofireRec[i].invertMask; -// -// if (autofire) -// { -// long long currentTime; -// uint16 changeMask; -// -// Microseconds((UnsignedWide *) ¤tTime); -// tcbtn = (KeyIsPressed(myKeys, keyCode[kKeyTC]) || ISpKeyIsPressed(kISpTC)); -// -// for (int i = 0; i < 2; i++) -// { -// changeMask = (lastTimeTT ? (~changeAuto[i]) : 0xFFFF); -// -// for (int j = 0; j < 12; j++) -// { -// uint16 mask = (0x0010 << j) & changeMask; -// -// if (autofireRec[i].tcMask & mask) -// { -// if (!tcbtn) -// continue; -// } -// -// if (autofireRec[i].buttonMask & mask) -// { -// if (controlPad[i] & mask) -// { -// if (currentTime > autofireRec[i].nextTime[j]) -// { -// if (Settings.TurboMode) -// autofireRec[i].nextTime[j] = currentTime + (long long) ((1.0 / (float) autofireRec[i].frequency) * 1000000.0 / macFastForwardRate); -// else -// autofireRec[i].nextTime[j] = currentTime + (long long) ((1.0 / (float) autofireRec[i].frequency) * 1000000.0); -// } -// else -// controlPad[i] &= ~mask; -// } -// } -// } -// } -// } -// -// ControlPadFlagsToS9xReportButtons(0, controlPad[0]); -// ControlPadFlagsToS9xReportButtons(1, controlPad[1]); -// -// if (macControllerOption == SNES_JUSTIFIER_2) -// ControlPadFlagsToS9xPseudoPointer(controlPad[1]); -//} -// -//static void ChangeAutofireSettings (int player, int btn) -//{ -// static char msg[64]; -// uint16 mask, m; -// -// mask = 0x0010 << btn; -// autofireRec[player].buttonMask ^= mask; -// autofire = (autofireRec[0].buttonMask || autofireRec[1].buttonMask); -// -// m = autofireRec[player].buttonMask; -// if (m) -// snprintf(msg, sizeof(msg), "Autofire %d:%s%s%s%s%s%s%s%s%s%s%s%s%s", player + 1, -// (m & 0xC0F0 ? " " : ""), -// (m & 0x0080 ? "A" : ""), -// (m & 0x8000 ? "B" : ""), -// (m & 0x0040 ? "X" : ""), -// (m & 0x4000 ? "Y" : ""), -// (m & 0x0020 ? "L" : ""), -// (m & 0x0010 ? "R" : ""), -// (m & 0x0800 ? " Up" : ""), -// (m & 0x0400 ? " Dn" : ""), -// (m & 0x0200 ? " Lf" : ""), -// (m & 0x0100 ? " Rt" : ""), -// (m & 0x1000 ? " St" : ""), -// (m & 0x2000 ? " Se" : "")); -// else -// snprintf(msg, sizeof(msg), "Autofire %d: Off", player + 1); -// -// S9xSetInfoString(msg); -//} -// -//static void ChangeTurboRate (int d) -//{ -// static char msg[64]; -// -// macFastForwardRate += d; -// if (macFastForwardRate < 1) -// macFastForwardRate = 1; -// else -// if (macFastForwardRate > 15) -// macFastForwardRate = 15; -// -// snprintf(msg, sizeof(msg), "Turbo Rate: %d", macFastForwardRate); -// S9xSetInfoString(msg); -//} -// +static void ProcessInput (void) +{ + bool8 myKeys[MAC_NUM_KEYCODES]; + bool8 isok, fnbtn, altbtn, tcbtn; + static bool8 toggleff = false, lastTimeTT = false, lastTimeFn = false, ffUp = false, ffDown = false, ffUpSp = false, ffDownSp = false; + + if (rejectinput) + return; + + if (ISpKeyIsPressed(kISpEsc)) + { + if (!s9xthreadrunning) + running = false; + + return; + } + + if (ISpKeyIsPressed(kISpFreeze)) + { + MacStopSound(); + while (ISpKeyIsPressed(kISpFreeze)); + + isok = SNES9X_Freeze(); + ClearGFXScreen(); + return; + } + + if (ISpKeyIsPressed(kISpDefrost)) + { + MacStopSound(); + while (ISpKeyIsPressed(kISpDefrost)); + + isok = SNES9X_Defrost(); + ClearGFXScreen(); + return; + } + + if (ISpKeyIsPressed(kISpScreenshot)) + { + Settings.TakeScreenshot = true; + while (ISpKeyIsPressed(kISpScreenshot)); + } + + if (ISpKeyIsPressed(kISpSPC)) + { + S9xDumpSPCSnapshot(); + while (ISpKeyIsPressed(kISpSPC)); + } + + if (ISpKeyIsPressed(kISpFFUp)) + { + if (!ffUpSp) + { + ChangeTurboRate(+1); + ffUpSp = true; + } + } + else + ffUpSp = false; + + if (ISpKeyIsPressed(kISpFFDown)) + { + if (!ffDownSp) + { + ChangeTurboRate(-1); + ffDownSp = true; + } + } + else + ffDownSp = false; + + controlPad[0] = controlPad[1] = 0; + + JoypadScanDirection(0, &(controlPad[0])); + if (ISpKeyIsPressed(kISp1PR )) controlPad[0] |= 0x0010; + if (ISpKeyIsPressed(kISp1PL )) controlPad[0] |= 0x0020; + if (ISpKeyIsPressed(kISp1PX )) controlPad[0] |= 0x0040; + if (ISpKeyIsPressed(kISp1PA )) controlPad[0] |= 0x0080; + if (ISpKeyIsPressed(kISp1PStart )) controlPad[0] |= 0x1000; + if (ISpKeyIsPressed(kISp1PSelect)) controlPad[0] |= 0x2000; + if (ISpKeyIsPressed(kISp1PY )) controlPad[0] |= 0x4000; + if (ISpKeyIsPressed(kISp1PB )) controlPad[0] |= 0x8000; + + JoypadScanDirection(1, &(controlPad[1])); + if (ISpKeyIsPressed(kISp2PR )) controlPad[1] |= 0x0010; + if (ISpKeyIsPressed(kISp2PL )) controlPad[1] |= 0x0020; + if (ISpKeyIsPressed(kISp2PX )) controlPad[1] |= 0x0040; + if (ISpKeyIsPressed(kISp2PA )) controlPad[1] |= 0x0080; + if (ISpKeyIsPressed(kISp2PStart )) controlPad[1] |= 0x1000; + if (ISpKeyIsPressed(kISp2PSelect)) controlPad[1] |= 0x2000; + if (ISpKeyIsPressed(kISp2PY )) controlPad[1] |= 0x4000; + if (ISpKeyIsPressed(kISp2PB )) controlPad[1] |= 0x8000; + + if (((macControllerOption == SNES_MULTIPLAYER5) || (macControllerOption == SNES_MULTIPLAYER5_2)) && Settings.MultiPlayer5Master) + { + controlPad[2] = controlPad[3] = controlPad[4] = 0; + + JoypadScanDirection(2, &(controlPad[2])); + if (ISpKeyIsPressed(kISp3PR )) controlPad[2] |= 0x0010; + if (ISpKeyIsPressed(kISp3PL )) controlPad[2] |= 0x0020; + if (ISpKeyIsPressed(kISp3PX )) controlPad[2] |= 0x0040; + if (ISpKeyIsPressed(kISp3PA )) controlPad[2] |= 0x0080; + if (ISpKeyIsPressed(kISp3PStart )) controlPad[2] |= 0x1000; + if (ISpKeyIsPressed(kISp3PSelect)) controlPad[2] |= 0x2000; + if (ISpKeyIsPressed(kISp3PY )) controlPad[2] |= 0x4000; + if (ISpKeyIsPressed(kISp3PB )) controlPad[2] |= 0x8000; + + JoypadScanDirection(3, &(controlPad[3])); + if (ISpKeyIsPressed(kISp4PR )) controlPad[3] |= 0x0010; + if (ISpKeyIsPressed(kISp4PL )) controlPad[3] |= 0x0020; + if (ISpKeyIsPressed(kISp4PX )) controlPad[3] |= 0x0040; + if (ISpKeyIsPressed(kISp4PA )) controlPad[3] |= 0x0080; + if (ISpKeyIsPressed(kISp4PStart )) controlPad[3] |= 0x1000; + if (ISpKeyIsPressed(kISp4PSelect)) controlPad[3] |= 0x2000; + if (ISpKeyIsPressed(kISp4PY )) controlPad[3] |= 0x4000; + if (ISpKeyIsPressed(kISp4PB )) controlPad[3] |= 0x8000; + + JoypadScanDirection(4, &(controlPad[4])); + if (ISpKeyIsPressed(kISp5PR )) controlPad[4] |= 0x0010; + if (ISpKeyIsPressed(kISp5PL )) controlPad[4] |= 0x0020; + if (ISpKeyIsPressed(kISp5PX )) controlPad[4] |= 0x0040; + if (ISpKeyIsPressed(kISp5PA )) controlPad[4] |= 0x0080; + if (ISpKeyIsPressed(kISp5PStart )) controlPad[4] |= 0x1000; + if (ISpKeyIsPressed(kISp5PSelect)) controlPad[4] |= 0x2000; + if (ISpKeyIsPressed(kISp5PY )) controlPad[4] |= 0x4000; + if (ISpKeyIsPressed(kISp5PB )) controlPad[4] |= 0x8000; + + ControlPadFlagsToS9xReportButtons(2, controlPad[2]); + ControlPadFlagsToS9xReportButtons(3, controlPad[3]); + ControlPadFlagsToS9xReportButtons(4, controlPad[4]); + + if (macControllerOption == SNES_MULTIPLAYER5_2) + { + controlPad[5] = controlPad[6] = controlPad[7] = 0; + + JoypadScanDirection(5, &(controlPad[5])); + if (ISpKeyIsPressed(kISp6PR )) controlPad[5] |= 0x0010; + if (ISpKeyIsPressed(kISp6PL )) controlPad[5] |= 0x0020; + if (ISpKeyIsPressed(kISp6PX )) controlPad[5] |= 0x0040; + if (ISpKeyIsPressed(kISp6PA )) controlPad[5] |= 0x0080; + if (ISpKeyIsPressed(kISp6PStart )) controlPad[5] |= 0x1000; + if (ISpKeyIsPressed(kISp6PSelect)) controlPad[5] |= 0x2000; + if (ISpKeyIsPressed(kISp6PY )) controlPad[5] |= 0x4000; + if (ISpKeyIsPressed(kISp6PB )) controlPad[5] |= 0x8000; + + JoypadScanDirection(6, &(controlPad[6])); + if (ISpKeyIsPressed(kISp7PR )) controlPad[6] |= 0x0010; + if (ISpKeyIsPressed(kISp7PL )) controlPad[6] |= 0x0020; + if (ISpKeyIsPressed(kISp7PX )) controlPad[6] |= 0x0040; + if (ISpKeyIsPressed(kISp7PA )) controlPad[6] |= 0x0080; + if (ISpKeyIsPressed(kISp7PStart )) controlPad[6] |= 0x1000; + if (ISpKeyIsPressed(kISp7PSelect)) controlPad[6] |= 0x2000; + if (ISpKeyIsPressed(kISp7PY )) controlPad[6] |= 0x4000; + if (ISpKeyIsPressed(kISp7PB )) controlPad[6] |= 0x8000; + + JoypadScanDirection(7, &(controlPad[7])); + if (ISpKeyIsPressed(kISp8PR )) controlPad[7] |= 0x0010; + if (ISpKeyIsPressed(kISp8PL )) controlPad[7] |= 0x0020; + if (ISpKeyIsPressed(kISp8PX )) controlPad[7] |= 0x0040; + if (ISpKeyIsPressed(kISp8PA )) controlPad[7] |= 0x0080; + if (ISpKeyIsPressed(kISp8PStart )) controlPad[7] |= 0x1000; + if (ISpKeyIsPressed(kISp8PSelect)) controlPad[7] |= 0x2000; + if (ISpKeyIsPressed(kISp8PY )) controlPad[7] |= 0x4000; + if (ISpKeyIsPressed(kISp8PB )) controlPad[7] |= 0x8000; + + ControlPadFlagsToS9xReportButtons(5, controlPad[5]); + ControlPadFlagsToS9xReportButtons(6, controlPad[6]); + ControlPadFlagsToS9xReportButtons(7, controlPad[7]); + } + } + + CopyPressedKeys(myKeys); + + fnbtn = (KeyIsPressed(myKeys, keyCode[kKeyFunction]) || ISpKeyIsPressed(kISpFunction)); + altbtn = (KeyIsPressed(myKeys, keyCode[kKeyAlt] ) || ISpKeyIsPressed(kISpAlt) ); + + if (fnbtn) + { + if (!lastTimeFn) + { + for (unsigned int i = 0; i < kCommandListSize; i++) + btncmd[i].held = false; + } + + lastTimeFn = true; + lastTimeTT = false; + ffUp = ffDown = false; + + for (unsigned int i = 0; i < kCommandListSize; i++) + { + if (KeyIsPressed(myKeys, btncmd[i].keycode)) + { + if (!(btncmd[i].held)) + { + btncmd[i].held = true; + + if (strncmp(btncmd[i].command, "_mac", 4) == 0) + { + static char msg[64]; + + switch (btncmd[i].command[4] - '0') + { + case 1: + Settings.DisplayPressedKeys = !Settings.DisplayPressedKeys; + break; + + case 2: + if (S9xMovieActive()) + Settings.DisplayMovieFrame = !Settings.DisplayMovieFrame; + break; + + case 3: + if (macFrameAdvanceRate < 5000000) + macFrameAdvanceRate += 100000; + sprintf(msg, "Emulation Speed: 100/%d", macFrameAdvanceRate / 10000); + S9xSetInfoString(msg); + break; + + case 4: + if (macFrameAdvanceRate > 500000) + macFrameAdvanceRate -= 100000; + sprintf(msg, "Emulation Speed: 100/%d", macFrameAdvanceRate / 10000); + S9xSetInfoString(msg); + break; + + case 5: + pauseEmulation = !pauseEmulation; + break; + + case 6: + frameAdvance = true; + break; + } + } + else + { + s9xcommand_t s9xcmd; + + s9xcmd = S9xGetCommandT(btncmd[i].command); + S9xApplyCommand(s9xcmd, 1, 0); + } + } + } + else + btncmd[i].held = false; + } + } + else + { + lastTimeFn = false; + + if (KeyIsPressed(myKeys, keyCode[kKeyEsc])) + { + if (!s9xthreadrunning) + running = false; + + return; + } + + if (KeyIsPressed(myKeys, keyCode[kKeyFreeze])) + { + MacStopSound(); + while (KeyIsPressed(myKeys, keyCode[kKeyFreeze])) + CopyPressedKeys(myKeys); + + isok = SNES9X_Freeze(); + ClearGFXScreen(); + return; + } + + if (KeyIsPressed(myKeys, keyCode[kKeyDefrost])) + { + MacStopSound(); + while (KeyIsPressed(myKeys, keyCode[kKeyDefrost])) + CopyPressedKeys(myKeys); + + isok = SNES9X_Defrost(); + ClearGFXScreen(); + return; + } + + if (KeyIsPressed(myKeys, keyCode[kKeyScreenshot])) + { + Settings.TakeScreenshot = true; + while (KeyIsPressed(myKeys, keyCode[kKeyScreenshot])) + CopyPressedKeys(myKeys); + } + + if (KeyIsPressed(myKeys, keyCode[kKeySPC])) + { + S9xDumpSPCSnapshot(); + while (KeyIsPressed(myKeys, keyCode[kKeySPC])) + CopyPressedKeys(myKeys); + } + + if (KeyIsPressed(myKeys, keyCode[kKeyFFUp])) + { + if (!ffUp) + { + ChangeTurboRate(+1); + ffUp = true; + } + } + else + ffUp = false; + + if (KeyIsPressed(myKeys, keyCode[kKeyFFDown])) + { + if (!ffDown) + { + ChangeTurboRate(-1); + ffDown = true; + } + } + else + ffDown = false; + + if (KeyIsPressed(myKeys, keyCode[k1PR] )) controlPad[0] |= 0x0010; + if (KeyIsPressed(myKeys, keyCode[k1PL] )) controlPad[0] |= 0x0020; + if (KeyIsPressed(myKeys, keyCode[k1PX] )) controlPad[0] |= 0x0040; + if (KeyIsPressed(myKeys, keyCode[k1PA] )) controlPad[0] |= 0x0080; + if (KeyIsPressed(myKeys, keyCode[k1PRight] )) controlPad[0] |= 0x0100; + if (KeyIsPressed(myKeys, keyCode[k1PLeft] )) controlPad[0] |= 0x0200; + if (KeyIsPressed(myKeys, keyCode[k1PDown] )) controlPad[0] |= 0x0400; + if (KeyIsPressed(myKeys, keyCode[k1PUp] )) controlPad[0] |= 0x0800; + if (KeyIsPressed(myKeys, keyCode[k1PStart] )) controlPad[0] |= 0x1000; + if (KeyIsPressed(myKeys, keyCode[k1PSelect])) controlPad[0] |= 0x2000; + if (KeyIsPressed(myKeys, keyCode[k1PY] )) controlPad[0] |= 0x4000; + if (KeyIsPressed(myKeys, keyCode[k1PB] )) controlPad[0] |= 0x8000; + + if (KeyIsPressed(myKeys, keyCode[k2PR] )) controlPad[1] |= 0x0010; + if (KeyIsPressed(myKeys, keyCode[k2PL] )) controlPad[1] |= 0x0020; + if (KeyIsPressed(myKeys, keyCode[k2PX] )) controlPad[1] |= 0x0040; + if (KeyIsPressed(myKeys, keyCode[k2PA] )) controlPad[1] |= 0x0080; + if (KeyIsPressed(myKeys, keyCode[k2PRight] )) controlPad[1] |= 0x0100; + if (KeyIsPressed(myKeys, keyCode[k2PLeft] )) controlPad[1] |= 0x0200; + if (KeyIsPressed(myKeys, keyCode[k2PDown] )) controlPad[1] |= 0x0400; + if (KeyIsPressed(myKeys, keyCode[k2PUp] )) controlPad[1] |= 0x0800; + if (KeyIsPressed(myKeys, keyCode[k2PStart] )) controlPad[1] |= 0x1000; + if (KeyIsPressed(myKeys, keyCode[k2PSelect])) controlPad[1] |= 0x2000; + if (KeyIsPressed(myKeys, keyCode[k2PY] )) controlPad[1] |= 0x4000; + if (KeyIsPressed(myKeys, keyCode[k2PB] )) controlPad[1] |= 0x8000; + + if (altbtn) + { + if (!lastTimeTT) + changeAuto[0] = changeAuto[1] = 0; + + for (int i = 0; i < 2; i++) + { + for (int j = 0; j < 12; j++) + { + uint16 mask = 0x0010 << j; + + if (controlPad[i] & mask & autofireRec[i].toggleMask) + { + controlPad[i] &= ~mask; + + if (!(changeAuto[i] & mask)) + { + changeAuto[i] |= mask; + ChangeAutofireSettings(i, j); + } + } + else + changeAuto[i] &= ~mask; + } + } + + lastTimeTT = true; + } + else + lastTimeTT = false; + } + + if (enabletoggle) + { + if ((ISpKeyIsPressed(kISpFastForward) || KeyIsPressed(myKeys, keyCode[kKeyFastForward])) && !fnbtn) + { + if (!toggleff) + { + toggleff = true; + Settings.TurboMode = !Settings.TurboMode; + S9xSetInfoString(Settings.TurboMode ? "Turbo mode on" : "Turbo mode off"); + if (!Settings.TurboMode) + S9xClearSamples(); + } + } + else + toggleff = false; + } + else + { + bool8 old = Settings.TurboMode; + Settings.TurboMode = ((ISpKeyIsPressed(kISpFastForward) || KeyIsPressed(myKeys, keyCode[kKeyFastForward])) && !fnbtn) ? true : false; + if (!Settings.TurboMode && old) + S9xClearSamples(); + } + + for (int i = 0; i < 2; i++) + controlPad[i] ^= autofireRec[i].invertMask; + + if (autofire) + { + long long currentTime; + uint16 changeMask; + + currentTime = GetMicroseconds(); + tcbtn = (KeyIsPressed(myKeys, keyCode[kKeyTC]) || ISpKeyIsPressed(kISpTC)); + + for (int i = 0; i < 2; i++) + { + changeMask = (lastTimeTT ? (~changeAuto[i]) : 0xFFFF); + + for (int j = 0; j < 12; j++) + { + uint16 mask = (0x0010 << j) & changeMask; + + if (autofireRec[i].tcMask & mask) + { + if (!tcbtn) + continue; + } + + if (autofireRec[i].buttonMask & mask) + { + if (controlPad[i] & mask) + { + if (currentTime > autofireRec[i].nextTime[j]) + { + if (Settings.TurboMode) + autofireRec[i].nextTime[j] = currentTime + (long long) ((1.0 / (float) autofireRec[i].frequency) * 1000000.0 / macFastForwardRate); + else + autofireRec[i].nextTime[j] = currentTime + (long long) ((1.0 / (float) autofireRec[i].frequency) * 1000000.0); + } + else + controlPad[i] &= ~mask; + } + } + } + } + } + + ControlPadFlagsToS9xReportButtons(0, controlPad[0]); + ControlPadFlagsToS9xReportButtons(1, controlPad[1]); + + if (macControllerOption == SNES_JUSTIFIER_2) + ControlPadFlagsToS9xPseudoPointer(controlPad[1]); +} + +static void ChangeAutofireSettings (int player, int btn) +{ + static char msg[64]; + uint16 mask, m; + + mask = 0x0010 << btn; + autofireRec[player].buttonMask ^= mask; + autofire = (autofireRec[0].buttonMask || autofireRec[1].buttonMask); + + m = autofireRec[player].buttonMask; + if (m) + snprintf(msg, sizeof(msg), "Autofire %d:%s%s%s%s%s%s%s%s%s%s%s%s%s", player + 1, + (m & 0xC0F0 ? " " : ""), + (m & 0x0080 ? "A" : ""), + (m & 0x8000 ? "B" : ""), + (m & 0x0040 ? "X" : ""), + (m & 0x4000 ? "Y" : ""), + (m & 0x0020 ? "L" : ""), + (m & 0x0010 ? "R" : ""), + (m & 0x0800 ? " Up" : ""), + (m & 0x0400 ? " Dn" : ""), + (m & 0x0200 ? " Lf" : ""), + (m & 0x0100 ? " Rt" : ""), + (m & 0x1000 ? " St" : ""), + (m & 0x2000 ? " Se" : "")); + else + snprintf(msg, sizeof(msg), "Autofire %d: Off", player + 1); + + S9xSetInfoString(msg); +} + +static void ChangeTurboRate (int d) +{ + static char msg[64]; + + macFastForwardRate += d; + if (macFastForwardRate < 1) + macFastForwardRate = 1; + else + if (macFastForwardRate > 15) + macFastForwardRate = 15; + + snprintf(msg, sizeof(msg), "Turbo Rate: %d", macFastForwardRate); + S9xSetInfoString(msg); +} + void GetGameScreenPointer (int16 *x, int16 *y, bool fullmouse) { -// int ph; -// -// ph = !drawoverscan ? ((IPPU.RenderedScreenHeight > 256) ? IPPU.RenderedScreenHeight : (IPPU.RenderedScreenHeight << 1)) : (SNES_HEIGHT_EXTENDED << 1); -// -// if (fullscreen) -// { -// if (glstretch) -// { -// float fpw = (float) glScreenH / (float) ph * 512.0f; -// -// scopeViewInfo.width = (int) (fpw + ((float) glScreenW - fpw) * (float) macAspectRatio / 10000.0); -// scopeViewInfo.height = glScreenH; -// scopeViewInfo.globalLeft = (int) glScreenBounds.origin.x + ((glScreenW - scopeViewInfo.width) >> 1); -// scopeViewInfo.globalTop = (int) glScreenBounds.origin.y; -// } -// else -// { -// scopeViewInfo.width = 512; -// scopeViewInfo.height = ph; -// scopeViewInfo.globalLeft = (int) glScreenBounds.origin.x + ((glScreenW - 512) >> 1); -// scopeViewInfo.globalTop = (int) glScreenBounds.origin.y + ((glScreenH - ph ) >> 1); -// } -// } -// else -// { -// Rect rct; -// -// GetWindowBounds(gWindow, kWindowContentRgn, &rct); -// -// int ww = rct.right - rct.left, -// wh = rct.bottom - rct.top; -// -// scopeViewInfo.width = ww; -// scopeViewInfo.globalLeft = rct.left; -// -// if (windowExtend) -// { -// scopeViewInfo.height = ph * wh / kMacWindowHeight; -// scopeViewInfo.globalTop = rct.top + ((kMacWindowHeight - ph) >> 1) * wh / kMacWindowHeight; -// } -// else -// { -// scopeViewInfo.height = wh; -// scopeViewInfo.globalTop = rct.top; -// } -// } -// -// if (!fullmouse) -// { -// Point pos; -// -// GetGlobalMouse(&pos); -// -// *x = (int16) (((float) (pos.h - scopeViewInfo.globalLeft)) / ((float) scopeViewInfo.width ) * (float) IPPU.RenderedScreenWidth); -// *y = (int16) (((float) (pos.v - scopeViewInfo.globalTop )) / ((float) scopeViewInfo.height) * (float) (!drawoverscan ? IPPU.RenderedScreenHeight : SNES_HEIGHT_EXTENDED)); -// } -// else -// { -// *x = (int16) (unlimitedCursor.x / (float) scopeViewInfo.width * (float) IPPU.RenderedScreenWidth); -// *y = (int16) (unlimitedCursor.y / (float) scopeViewInfo.height * (float) (!drawoverscan ? IPPU.RenderedScreenHeight : SNES_HEIGHT_EXTENDED)); -// } + int ph; + + ph = !drawoverscan ? ((IPPU.RenderedScreenHeight > 256) ? IPPU.RenderedScreenHeight : (IPPU.RenderedScreenHeight << 1)) : (SNES_HEIGHT_EXTENDED << 1); + + if (fullscreen) + { + if (glstretch) + { + float fpw = (float) glScreenH / (float) ph * 512.0f; + + scopeViewInfo.width = (int) (fpw + ((float) glScreenW - fpw) * (float) macAspectRatio / 10000.0); + scopeViewInfo.height = glScreenH; + scopeViewInfo.globalLeft = (int) glScreenBounds.origin.x + ((glScreenW - scopeViewInfo.width) >> 1); + scopeViewInfo.globalTop = (int) glScreenBounds.origin.y; + } + else + { + scopeViewInfo.width = 512; + scopeViewInfo.height = ph; + scopeViewInfo.globalLeft = (int) glScreenBounds.origin.x + ((glScreenW - 512) >> 1); + scopeViewInfo.globalTop = (int) glScreenBounds.origin.y + ((glScreenH - ph ) >> 1); + } + } + else + { + CGRect frame = s9xView.frame; + frame = [s9xView convertRect:frame toView:nil]; + frame = [s9xView.window convertRectToScreen:frame]; + + scopeViewInfo.width = frame.size.width; + scopeViewInfo.globalLeft = frame.origin.x; + + if (windowExtend) + { + scopeViewInfo.height = ph * frame.size.height / kMacWindowHeight; + scopeViewInfo.globalTop = frame.origin.y + ((kMacWindowHeight - ph) >> 1) * frame.size.height / kMacWindowHeight; + } + else + { + scopeViewInfo.height = frame.size.height; + scopeViewInfo.globalTop = frame.origin.y; + } + } + + if (!fullmouse) + { + CGPoint point = [NSEvent mouseLocation]; + + *x = (int16) (((float) (point.x - scopeViewInfo.globalLeft)) / ((float) scopeViewInfo.width ) * (float) IPPU.RenderedScreenWidth); + *y = (int16) (((float) (point.y - scopeViewInfo.globalTop )) / ((float) scopeViewInfo.height) * (float) (!drawoverscan ? IPPU.RenderedScreenHeight : SNES_HEIGHT_EXTENDED)); + } + else + { + *x = (int16) (unlimitedCursor.x / (float) scopeViewInfo.width * (float) IPPU.RenderedScreenWidth); + *y = (int16) (unlimitedCursor.y / (float) scopeViewInfo.height * (float) (!drawoverscan ? IPPU.RenderedScreenHeight : SNES_HEIGHT_EXTENDED)); + } } static void Initialize (void) @@ -3037,11 +2902,7 @@ static void Initialize (void) InitMacSound(); SetUpHID(); - RegisterHelpBook(); - InitRecentItems(); - InitRecentMenu(); - //BuildRecentMenu(); InitMultiCart(); @@ -3078,7 +2939,6 @@ static void Deinitialize (void) deviceSetting = deviceSettingMaster; DeinitMultiCart(); - DeinitRecentMenu(); DeinitRecentItems(); SavePrefs(); ReleaseHID(); @@ -3094,7 +2954,7 @@ static void Deinitialize (void) Memory.Deinit(); } -uint64 GetMicroseconds() +uint64 GetMicroseconds(void) { uint64 ms = mach_absolute_time(); ms *= machTimeNumerator; @@ -3271,3 +3131,136 @@ void QuitWithFatalError ( NSString *message) [alert runModal]; [NSApp terminate:nil]; } + +@interface S9xView : NSOpenGLView +@end + +@implementation S9xView + ++ (void)initialize +{ + keyLock = OS_UNFAIR_LOCK_INIT; +} + +- (void)keyDown:(NSEvent *)event +{ + os_unfair_lock_lock(&keyLock); + pressedKeys[event.keyCode] = true; + os_unfair_lock_unlock(&keyLock); +} + +- (void)keyUp:(NSEvent *)event +{ + os_unfair_lock_lock(&keyLock); + pressedKeys[event.keyCode] = false; + os_unfair_lock_unlock(&keyLock); +} + +- (BOOL)acceptsFirstResponder +{ + return YES; +} + +- (BOOL)canBecomeKeyView +{ + return YES; +} + +@end + +@implementation S9xEngine + +- (instancetype)init +{ + if (self = [super init]) + { + Initialize(); + + CGRect frame = NSMakeRect(0, 0, SNES_WIDTH * 2.0, kMacWindowHeight); + s9xView = [[S9xView alloc] initWithFrame:frame pixelFormat:nil]; + s9xView.wantsLayer = YES; + s9xView.layer.backgroundColor = NSColor.blackColor.CGColor; + NSWindow *window = [[NSWindow alloc] initWithContentRect:frame styleMask:NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskMiniaturizable backing:NSBackingStoreBuffered defer:NO]; + window.contentView = s9xView; + window.title = @"Snes9x"; + + [window center]; + [window makeKeyAndOrderFront:self]; + } + + return self; +} + +- (void)dealloc +{ + Deinitialize(); +} + +- (void) start +{ + NSLog(@"Starting"); + if (!finished) + { +#ifdef DEBUGGER + CPU.Flags |= DEBUG_MODE_FLAG; + S9xDoDebug(); +#endif + + lastFrame = GetMicroseconds(); + frameCount = 0; + if (macFrameSkip < 0) + skipFrames = 3; + else + skipFrames = macFrameSkip; + + S9xInitDisplay(NULL, NULL); + ClearGFXScreen(); + + [NSThread detachNewThreadWithBlock:^ + { + MacSnes9xThread(NULL); + + dispatch_sync(dispatch_get_main_queue(), ^ + { + if (!Settings.NetPlay || Settings.NetPlayServer) + { + SNES9X_SaveSRAM(); + S9xResetSaveTimer(false); + S9xSaveCheatFile(S9xGetFilename(".cht", CHEAT_DIR)); + } + + S9xDeinitDisplay(); + + if (Settings.NetPlay) + { + if (!Settings.NetPlayServer) + { + // DeinitGameWindow(); + cartOpen = false; + } + + Settings.NetPlay = false; + Settings.NetPlayServer = false; + } + + if (!finished) + { + [self start]; + } + }); + }]; + } +} + +- (void)loadROM:(NSURL *)fileURL +{ + if ( SNES9X_OpenCart(fileURL) ) + { + SNES9X_Go(); + s9xView.window.title = fileURL.lastPathComponent.stringByDeletingPathExtension; + [s9xView.window makeKeyAndOrderFront:nil]; + [self start]; + } +} + +@end diff --git a/macosx/mac-prefix.h b/macosx/mac-prefix.h index 7b29300a..f2f395e4 100755 --- a/macosx/mac-prefix.h +++ b/macosx/mac-prefix.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-prefs.h b/macosx/mac-prefs.h index 25f3f15e..0a6cd2fd 100755 --- a/macosx/mac-prefs.h +++ b/macosx/mac-prefs.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-prefs.mm b/macosx/mac-prefs.mm index 3737a2fd..be079da4 100755 --- a/macosx/mac-prefs.mm +++ b/macosx/mac-prefs.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-render.h b/macosx/mac-render.h index ea8af417..d92c802d 100644 --- a/macosx/mac-render.h +++ b/macosx/mac-render.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-render.mm b/macosx/mac-render.mm index 967b21d6..5eb71041 100644 --- a/macosx/mac-render.mm +++ b/macosx/mac-render.mm @@ -15,8 +15,10 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ +#import #include "snes9x.h" #include "memmap.h" @@ -47,10 +49,8 @@ static void S9xInitFullScreen (void); static void S9xDeinitFullScreen (void); static void S9xInitWindowMode (void); static void S9xDeinitWindowMode (void); -static void S9xInitOpenGLFullScreen (void); -static void S9xDeinitOpenGLFullScreen (void); -static void S9xInitOpenGLWindowMode (void); -static void S9xDeinitOpenGLWindowMode (void); +static void S9xInitOpenGL (void); +static void S9xDeinitOpenGL(void); static void S9xInitBlitGL (void); static void S9xDeinitBlitGL (void); static void S9xInitOpenGLContext (void); @@ -64,9 +64,6 @@ static void GLMakeScreenMesh (GLfloat *, int, int); static void GLMakeTextureMesh (GLfloat *, int, int, float, float); static void GLPrepareTexture (bool8, int, int, int, int, int, int); static inline void RenderBlitScreen (Blitter, int, int, int, int, int, uint16 *); -#ifndef MAC_LEOPARD_TIGER_PANTHER_SUPPORT -static void SetBestDisplayMode (int, int); -#endif enum { @@ -144,8 +141,6 @@ static uint16 *gfxScreen[2], *snesScreenB; static uint8 *blitGLBuffer; -static CGDirectDisplayID gGameDisplayID; - static MPTaskID taskID = NULL; static MPQueueID notificationQueue = NULL, taskQueue = NULL; @@ -153,17 +148,7 @@ static MPSemaphoreID readySemaphore = NULL; static MPData *mpBlit = NULL; static OpenGLData OpenGL; -static CGLContextObj glContext; -static AGLContext agContext; -static CGLPixelFormatObj cglpix; -static AGLPixelFormat aglpix; -static GLint glSwapInterval = 0; -static GLint agSwapInterval = 0; -#ifdef MAC_LEOPARD_TIGER_PANTHER_SUPPORT -static CFDictionaryRef oldDisplayMode; -#else -static CGDisplayModeRef oldDisplayModeRef; -#endif + static CGImageRef cgGameImage = NULL, cgBlitImage = NULL; @@ -338,252 +323,54 @@ void ClearGFXScreen (void) imageWidth[1] = imageHeight[1] = 0; prevBlitWidth = prevBlitHeight = 0; - if (fullscreen) - { - CGLSetCurrentContext(glContext); - glViewport(0, 0, glScreenW, glScreenH); - } - else - { - aglSetCurrentContext(agContext); - aglUpdateContext(agContext); - glViewport(0, 0, (GLsizei) gWindowRect.size.width, (GLsizei) gWindowRect.size.height); - } + CGLSetCurrentContext(s9xView.openGLContext.CGLContextObj); + glViewport(0, 0, glScreenW, glScreenH); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); for (int i = 0; i < 2; i++) { glClear(GL_COLOR_BUFFER_BIT); - - if (fullscreen) - CGLFlushDrawable(glContext); - else - aglSwapBuffers(agContext); + glSwapAPPLE(); + //CGLFlushDrawable(s9xView.openGLContext.CGLContextObj); } } -#ifndef MAC_LEOPARD_TIGER_PANTHER_SUPPORT -static void SetBestDisplayMode (int width, int height) -{ - if (autoRes || !gl32bit) - { - CGError err; - CGDisplayModeRef mode; - CFArrayRef array; - CFStringRef pixenc, pix; - CFIndex n, i; - size_t w, h; - bool r; - - pixenc = gl32bit ? CFSTR(IO32BitDirectPixels) : CFSTR(IO16BitDirectPixels); - - array = CGDisplayCopyAllDisplayModes(gGameDisplayID, NULL); - n = CFArrayGetCount(array); - - for (i = 0; i < n; i++) - { - mode = (CGDisplayModeRef) CFArrayGetValueAtIndex(array, i); - - w = CGDisplayModeGetWidth(mode); - h = CGDisplayModeGetHeight(mode); - pix = CGDisplayModeCopyPixelEncoding(mode); - r = CFStringCompare(pix, pixenc, 0) == kCFCompareEqualTo; - CFRelease(pix); - - if (w == (size_t) width && h == (size_t) height && r) - break; - } - - if (i < n) - err = CGDisplaySetDisplayMode(gGameDisplayID, mode, NULL); - - CFRelease(array); - } -} -#endif - static void S9xInitFullScreen (void) { - size_t width, height; - - width = autoRes ? 640 : CGDisplayPixelsWide(gGameDisplayID); - height = autoRes ? 480 : CGDisplayPixelsHigh(gGameDisplayID); - -#ifdef MAC_LEOPARD_TIGER_PANTHER_SUPPORT - CFDictionaryRef mode; - boolean_t exactMatch; - size_t depth = gl32bit ? 32 : 16; - - oldDisplayMode = CGDisplayCurrentMode(gGameDisplayID); - mode = CGDisplayBestModeForParameters(gGameDisplayID, depth, width, height, &exactMatch); - CGDisplayCapture(gGameDisplayID); - CGDisplaySwitchToMode(gGameDisplayID, mode); -#else - oldDisplayModeRef = CGDisplayCopyDisplayMode(gGameDisplayID); - CGDisplayCapture(gGameDisplayID); - SetBestDisplayMode(width, height); -#endif - - CGDisplayErr cgErr; - CGDisplayCount numDisplays, maxDisplays = 32; - CGDirectDisplayID activeDisplays[32]; - - cgErr = CGGetActiveDisplayList(maxDisplays, activeDisplays, &numDisplays); - if (cgErr == noErr) - { - if ((macControllerOption == SNES_MOUSE) || (macControllerOption == SNES_MOUSE_SWAPPED) || (numDisplays == 1)) - CGDisplayHideCursor(gGameDisplayID); - - if ((macControllerOption == SNES_MOUSE) || (macControllerOption == SNES_MOUSE_SWAPPED)) - { - CGDisplayMoveCursorToPoint(gGameDisplayID, CGPointMake((float) (width >> 1), (float) (height >> 1))); - CGAssociateMouseAndMouseCursorPosition(false); - } - } + [NSCursor hide]; + CGAssociateMouseAndMouseCursorPosition(false); } static void S9xDeinitFullScreen (void) { CGAssociateMouseAndMouseCursorPosition(true); - CGDisplayShowCursor(gGameDisplayID); - -#ifdef MAC_LEOPARD_TIGER_PANTHER_SUPPORT - CGDisplaySwitchToMode(gGameDisplayID, oldDisplayMode); -#else - CGError err; - - err = CGDisplaySetDisplayMode(gGameDisplayID, oldDisplayModeRef, NULL); - CGDisplayModeRelease(oldDisplayModeRef); -#endif - - CGDisplayRelease(gGameDisplayID); + [NSCursor unhide]; } static void S9xInitWindowMode (void) { - Rect rct; - size_t width, height; - - width = CGDisplayPixelsWide(gGameDisplayID); - height = CGDisplayPixelsHigh(gGameDisplayID); - -#ifdef MAC_LEOPARD_TIGER_PANTHER_SUPPORT - CFDictionaryRef mode; - boolean_t exactMatch; - size_t depth = gl32bit ? 32 : 16; - - oldDisplayMode = CGDisplayCurrentMode(gGameDisplayID); - mode = CGDisplayBestModeForParameters(gGameDisplayID, depth, width, height, &exactMatch); - if (exactMatch) - CGDisplaySwitchToMode(gGameDisplayID, mode); -#else - oldDisplayModeRef = CGDisplayCopyDisplayMode(gGameDisplayID); - SetBestDisplayMode(width, height); -#endif - -// InitGameWindow(); -// ShowWindow(gWindow); -// -// GetWindowBounds(gWindow, kWindowContentRgn, &rct); -// gWindowRect = CGRectMake((float) rct.left, (float) rct.top, (float) (rct.right - rct.left), (float) (rct.bottom - rct.top)); - - // UpdateGameWindow(); } static void S9xDeinitWindowMode (void) { -#ifdef MAC_LEOPARD_TIGER_PANTHER_SUPPORT - CGDisplaySwitchToMode(gGameDisplayID, oldDisplayMode); -#else - CGError err; - - err = CGDisplaySetDisplayMode(gGameDisplayID, oldDisplayModeRef, NULL); - CGDisplayModeRelease(oldDisplayModeRef); -#endif - - // UpdateGameWindow(); } -static void S9xInitOpenGLFullScreen (void) +static void S9xInitOpenGL (void) { - CGOpenGLDisplayMask displayMask; - GLint numPixelFormats; + GLint glSwapInterval = vsync ? 1 : 0; + if (extraOptions.benchmark) + glSwapInterval = 0; + CGLSetParameter(s9xView.openGLContext.CGLContextObj, kCGLCPSwapInterval, &glSwapInterval); + CGLSetCurrentContext(s9xView.openGLContext.CGLContextObj); - displayMask = CGDisplayIDToOpenGLDisplayMask(gGameDisplayID); - CGLPixelFormatAttribute attribs[] = { (CGLPixelFormatAttribute) kCGLPFAFullScreen, - (CGLPixelFormatAttribute) kCGLPFADoubleBuffer, - (CGLPixelFormatAttribute) kCGLPFAAccelerated, - (CGLPixelFormatAttribute) kCGLPFANoRecovery, - (CGLPixelFormatAttribute) kCGLPFAColorSize, - (CGLPixelFormatAttribute) (gl32bit ? 32 : 16), - (CGLPixelFormatAttribute) kCGLPFADisplayMask, - (CGLPixelFormatAttribute) displayMask, - (CGLPixelFormatAttribute) 0 }; - - CGLChoosePixelFormat(attribs, &cglpix, &numPixelFormats); - CGLCreateContext(cglpix, NULL, &glContext); - glSwapInterval = vsync ? 1 : 0; - if (extraOptions.benchmark) - glSwapInterval = 0; - CGLSetParameter(glContext, kCGLCPSwapInterval, &glSwapInterval); - CGLSetCurrentContext(glContext); - -#ifdef MAC_LEOPARD_TIGER_PANTHER_SUPPORT - CGLSetFullScreen(glContext); -#else - CGLSetFullScreenOnDisplay(glContext, CGDisplayIDToOpenGLDisplayMask(gGameDisplayID)); -#endif - - glScreenW = CGDisplayPixelsWide(gGameDisplayID); - glScreenH = CGDisplayPixelsHigh(gGameDisplayID); + glScreenW = glScreenBounds.size.width; + glScreenH = glScreenBounds.size.height; } -static void S9xDeinitOpenGLFullScreen (void) +static void S9xDeinitOpenGL (void) { - if (glContext) - { - CGLSetCurrentContext(NULL); - CGLClearDrawable(glContext); - CGLDestroyContext(glContext); - CGLDestroyPixelFormat(cglpix); - } -} - -static void S9xInitOpenGLWindowMode (void) -{ - GLint attribs[] = { AGL_RGBA, - AGL_DOUBLEBUFFER, - AGL_ACCELERATED, - AGL_NO_RECOVERY, - AGL_PIXEL_SIZE, gl32bit ? 32 : 16, - AGL_NONE }; - - aglpix = aglChoosePixelFormat(NULL, 0, attribs); - agContext = aglCreateContext(aglpix, NULL); - - aglSetWindowRef(agContext, gWindow); - - agSwapInterval = vsync ? 1 : 0; - if (extraOptions.benchmark) - agSwapInterval = 0; - aglSetInteger(agContext, AGL_SWAP_INTERVAL, &agSwapInterval); - aglSetCurrentContext(agContext); - - aglGetCGLPixelFormat(aglpix, (void **) &cglpix); - aglGetCGLContext(agContext, (void **) &glContext); -} - -static void S9xDeinitOpenGLWindowMode (void) -{ - if (agContext) - { - aglSetWindowRef(agContext, NULL); - - aglSetCurrentContext(NULL); - aglDestroyContext(agContext); - aglDestroyPixelFormat(aglpix); - } + CGLSetCurrentContext(NULL); } static void S9xInitBlitGL (void) @@ -601,9 +388,6 @@ static void S9xDeinitBlitGL (void) { if (multiprocessor) { - MPNotifyQueue(taskQueue, (void *) kMPBlitDone, 0, 0); - MPWaitOnQueue(notificationQueue, NULL, NULL, NULL, kDurationForever); - MPDeleteQueue(notificationQueue); notificationQueue = NULL; printf("MP: Successfully received terminate signal from BlitGL thread.\n"); @@ -700,8 +484,8 @@ static void GLMakeTextureMesh (GLfloat *vertex2D, int meshx, int meshy, float lx static void S9xInitOpenGLContext (void) { OpenGL.internal_format = GL_RGB5_A1; - OpenGL.format = GL_BGRA; - OpenGL.type = GL_UNSIGNED_SHORT_1_5_5_5_REV; + OpenGL.format = GL_BGRA; + OpenGL.type = GL_UNSIGNED_SHORT_1_5_5_5_REV; OpenGL.rangeExt = gluCheckExtension((const GLubyte *) "GL_APPLE_texture_range", glGetString(GL_EXTENSIONS)); OpenGL.target = OpenGL.rangeExt ? GL_TEXTURE_RECTANGLE_EXT : GL_TEXTURE_2D; @@ -805,28 +589,15 @@ static void S9xInitOpenGLContext (void) GLMakeScreenMesh(scScnArray, kSCMeshX, kSCMeshY); } - if (fullscreen) - { - CGLSetCurrentContext(glContext); - glViewport(0, 0, glScreenW, glScreenH); - } - else - { - aglSetCurrentContext(agContext); - aglUpdateContext(agContext); - glViewport(0, 0, (GLsizei) gWindowRect.size.width, (GLsizei) gWindowRect.size.height); - } + CGLSetCurrentContext(s9xView.openGLContext.CGLContextObj); + glViewport(0, 0, glScreenW, glScreenH); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); for (int i = 0; i < 2; i++) { - glClear(GL_COLOR_BUFFER_BIT); - - if (fullscreen) - CGLFlushDrawable(glContext); - else - aglSwapBuffers(agContext); + glClear(GL_COLOR_BUFFER_BIT); + //CGLFlushDrawable(s9xView.openGLContext.CGLContextObj); } } @@ -871,7 +642,7 @@ static void S9xInitCoreImage (void) cgGameImage = NULL; cgBlitImage = NULL; - InitCoreImageContext(glContext, cglpix); + InitCoreImageContext(s9xView.openGLContext.CGLContextObj, s9xView.pixelFormat.CGLPixelFormatObj); } static void S9xDeinitCoreImage (void) @@ -893,29 +664,10 @@ static void S9xDeinitCoreImage (void) void GetGameDisplay (int *w, int *h) { - CGDisplayErr cgErr; - CGDisplayCount numDisplays, maxDisplays = 32; - CGDirectDisplayID activeDisplays[32]; - CGPoint windowAt; - - gGameDisplayID = CGMainDisplayID(); - - windowAt = CGPointMake((float) windowPos[kWindowScreen].h, (float) windowPos[kWindowScreen].v); - - cgErr = CGGetDisplaysWithPoint(windowAt, maxDisplays, activeDisplays, &numDisplays); - if ((cgErr == noErr) && (numDisplays > 0)) - { - for (unsigned int i = 0; i < numDisplays; i++) - { - if (activeDisplays[i] != CGMainDisplayID()) - gGameDisplayID = activeDisplays[i]; - } - } - if (w != NULL && h != NULL) { - *w = CGDisplayPixelsWide(gGameDisplayID); - *h = CGDisplayPixelsHigh(gGameDisplayID); + *w = s9xView.frame.size.width; + *h = s9xView.frame.size.height; } } @@ -924,9 +676,7 @@ void S9xInitDisplay (int argc, char **argv) if (directDisplay) return; - GetGameDisplay(NULL, NULL); - - glScreenBounds = CGDisplayBounds(gGameDisplayID); + glScreenBounds = s9xView.frame; unlimitedCursor = CGPointMake(0.0f, 0.0f); @@ -969,14 +719,14 @@ void S9xInitDisplay (int argc, char **argv) if (fullscreen) { S9xInitFullScreen(); - S9xInitOpenGLFullScreen(); } else { S9xInitWindowMode(); - S9xInitOpenGLWindowMode(); } + S9xInitOpenGL(); + S9xInitOpenGLContext(); if (ciFilterEnable) S9xInitCoreImage(); @@ -984,7 +734,7 @@ void S9xInitDisplay (int argc, char **argv) S9xInitBlitGL(); S9xSetSoundMute(false); - Microseconds((UnsignedWide *) &lastFrame); + lastFrame = GetMicroseconds(); windowResizeCount = 1; @@ -1008,15 +758,15 @@ void S9xDeinitDisplay (void) if (fullscreen) { - S9xDeinitOpenGLFullScreen(); S9xDeinitFullScreen(); } else { - S9xDeinitOpenGLWindowMode(); S9xDeinitWindowMode(); } + S9xDeinitOpenGL(); + directDisplay = false; } @@ -1239,39 +989,29 @@ static void S9xPutImageOpenGL (int width, int height) int vh = (height > 256) ? height : (height << 1); - if (fullscreen) - { - CGLSetCurrentContext(glContext); + CGLSetCurrentContext(s9xView.openGLContext.CGLContextObj); - glViewport(0, 0, glScreenW, glScreenH); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT); + glViewport(0, 0, glScreenW, glScreenH); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT); - if (glstretch) - { - float fpw = (float) glScreenH / vh * 512.0f; - int pw = (int) (fpw + ((float) glScreenW - fpw) * (float) macAspectRatio / 10000.0); + if ( fullscreen ) + { + if (glstretch) + { + float fpw = (float) glScreenH / vh * 512.0f; + int pw = (int) (fpw + ((float) glScreenW - fpw) * (float) macAspectRatio / 10000.0); - glViewport((glScreenW - pw) >> 1, 0, pw, glScreenH); - } - else - glViewport((glScreenW - 512) >> 1, (glScreenH - vh) >> 1, 512, vh); - } - else - { - int ww = (int) gWindowRect.size.width, - wh = (int) gWindowRect.size.height; - - aglSetCurrentContext(agContext); - aglUpdateContext(agContext); - - glViewport(0, 0, ww, wh); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT); - - if (windowExtend) - glViewport(0, ((kMacWindowHeight - vh) >> 1) * wh / kMacWindowHeight, ww, vh * wh / kMacWindowHeight); - } + glViewport((glScreenW - pw) >> 1, 0, pw, glScreenH); + } + else + glViewport((glScreenW - 512) >> 1, (glScreenH - vh) >> 1, 512, vh); + } + else + { + if (windowExtend) + glViewport(0, ((kMacWindowHeight - vh) >> 1) * glScreenH / kMacWindowHeight, glScreenW, vh * glScreenH / kMacWindowHeight); + } glPixelStorei(GL_UNPACK_ROW_LENGTH, width); @@ -1350,10 +1090,8 @@ static void S9xPutImageOpenGL (int width, int height) DrawWithCoreImageFilter(src, cgGameImage); } - if (fullscreen) - CGLFlushDrawable(glContext); - else - aglSwapBuffers(agContext); + //CGLFlushDrawable(s9xView.openGLContext.CGLContextObj); + glSwapAPPLE(); } static void S9xPutImageBlitGL (int width, int height) @@ -1532,58 +1270,37 @@ static void S9xPutImageBlitGL2 (int blit_width, int blit_height) if (windowResizeCount > 0) { - if (fullscreen) - { - CGLSetCurrentContext(glContext); + CGLSetCurrentContext(s9xView.openGLContext.CGLContextObj); - glViewport(0, 0, glScreenW, glScreenH); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT); + glViewport(0, 0, glScreenW, glScreenH); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT); - if (glstretch) - { - int sh = (blit_width < blit_height) ? (blit_height >> 1) : ((blit_width > blit_height * 2) ? (blit_height << 1) : blit_height); - float fpw = (float) glScreenH / (float) sh * (float) blit_width; - int pw = (int) (fpw + ((float) glScreenW - fpw) * (float) macAspectRatio / 10000.0); + if (glstretch) + { + int sh = (blit_width < blit_height) ? (blit_height >> 1) : ((blit_width > blit_height * 2) ? (blit_height << 1) : blit_height); + float fpw = (float) glScreenH / (float) sh * (float) blit_width; + int pw = (int) (fpw + ((float) glScreenW - fpw) * (float) macAspectRatio / 10000.0); - glViewport((glScreenW - pw) >> 1, 0, pw, glScreenH); - } - else - { - int sw, sh; + glViewport((glScreenW - pw) >> 1, 0, pw, glScreenH); + } + else + { + int sw, sh; - if (nx < 0) - { - sw = ntsc_width; - sh = ((blit_height % SNES_HEIGHT) ? SNES_HEIGHT_EXTENDED : SNES_HEIGHT) * 2; - } - else - { - sw = SNES_WIDTH * nx; - sh = ((blit_height % SNES_HEIGHT) ? SNES_HEIGHT_EXTENDED : SNES_HEIGHT) * nx; - } + if (nx < 0) + { + sw = ntsc_width; + sh = ((blit_height % SNES_HEIGHT) ? SNES_HEIGHT_EXTENDED : SNES_HEIGHT) * 2; + } + else + { + sw = SNES_WIDTH * nx; + sh = ((blit_height % SNES_HEIGHT) ? SNES_HEIGHT_EXTENDED : SNES_HEIGHT) * nx; + } - glViewport((glScreenW - sw) >> 1, (glScreenH - sh) >> 1, sw, sh); - } - } - else - { - int ww = (int) gWindowRect.size.width, - wh = (int) gWindowRect.size.height; - - aglSetCurrentContext(agContext); - aglUpdateContext(agContext); - - glViewport(0, 0, ww, wh); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT); - - if (windowExtend) - { - int bh = (blit_height % SNES_HEIGHT) ? (SNES_HEIGHT_EXTENDED << 1) : (SNES_HEIGHT << 1); - glViewport(0, ((kMacWindowHeight - bh) >> 1) * wh / kMacWindowHeight, ww, bh * wh / kMacWindowHeight); - } - } + glViewport((glScreenW - sw) >> 1, (glScreenH - sh) >> 1, sw, sh); + } if (!ciFilterEnable) { @@ -1717,10 +1434,8 @@ static void S9xPutImageBlitGL2 (int blit_width, int blit_height) DrawWithCoreImageFilter(src, cgBlitImage); } - if (fullscreen) - CGLFlushDrawable(glContext); - else - aglSwapBuffers(agContext); + //CGLFlushDrawable(s9xView.openGLContext.CGLContextObj); + glSwapAPPLE(); } void S9xTextMode (void) diff --git a/macosx/mac-snes9x.h b/macosx/mac-snes9x.h index 484232d5..cfa8bf76 100755 --- a/macosx/mac-snes9x.h +++ b/macosx/mac-snes9x.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-snes9x.mm b/macosx/mac-snes9x.mm index 248af35c..d4bac756 100755 --- a/macosx/mac-snes9x.mm +++ b/macosx/mac-snes9x.mm @@ -53,7 +53,7 @@ void SNES9X_Go (void) bool8 SNES9X_OpenCart (NSURL *inRef) { NSURL *cartRef; - const char *filename = inRef.lastPathComponent.UTF8String; + const char *filename = inRef.path.UTF8String; if (cartOpen) { @@ -304,7 +304,7 @@ bool8 SNES9X_FreezeTo (void) NSURL *url = NavFreezeTo(); if (url != nil) { - const char *filename = url.lastPathComponent.UTF8String; + const char *filename = url.path.UTF8String; unlink(filename); S9xFreezeGame(filename); @@ -320,14 +320,12 @@ bool8 SNES9X_FreezeTo (void) bool8 SNES9X_DefrostFrom (void) { - char filename[PATH_MAX + 1]; - if (cartOpen) { NSURL *url = NavDefrostFrom(); if (url != nil) { - const char *filename = url.lastPathComponent.UTF8String; + const char *filename = url.path.UTF8String; S9xUnfreezeGame(filename); SNES9X_Go(); @@ -346,7 +344,7 @@ bool8 SNES9X_RecordMovie (void) NSURL *url = NavRecordMovieTo(); if (url != nil) { - const char *filename = url.lastPathComponent.UTF8String; + const char *filename = url.path.UTF8String; unlink(filename); int r; @@ -390,7 +388,7 @@ bool8 SNES9X_PlayMovie (void) NSURL *url = NavPlayMovieFrom(); if (url != nil) { - const char *filename = url.lastPathComponent.UTF8String; + const char *filename = url.path.UTF8String; int r; r = S9xMovieOpen(filename, macPlayFlag & 1); @@ -415,7 +413,7 @@ bool8 SNES9X_QTMovieRecord (void) NSURL *url = NavQTMovieRecordTo(); if (url != nil) { - const char *filename = url.lastPathComponent.UTF8String; + const char *filename = url.path.UTF8String; macQTRecord = true; SNES9X_Go(); diff --git a/macosx/mac-stringtools.h b/macosx/mac-stringtools.h index 430ce462..66667fac 100755 --- a/macosx/mac-stringtools.h +++ b/macosx/mac-stringtools.h @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/mac-stringtools.mm b/macosx/mac-stringtools.mm index fae1c6aa..fb3ebeb2 100755 --- a/macosx/mac-stringtools.mm +++ b/macosx/mac-stringtools.mm @@ -15,6 +15,7 @@ (c) Copyright 2004 Alexander and Sander (c) Copyright 2004 - 2005 Steven Seeger (c) Copyright 2005 Ryan Vogt + (c) Copyright 2019 Michael Donald Buckley ***********************************************************************************/ diff --git a/macosx/snes9x framework/snes9x_framework.h b/macosx/snes9x framework/snes9x_framework.h index 09129bb4..b4c397fd 100644 --- a/macosx/snes9x framework/snes9x_framework.h +++ b/macosx/snes9x framework/snes9x_framework.h @@ -7,12 +7,14 @@ #import + //! Project version number for snes9x_framework. FOUNDATION_EXPORT double snes9x_frameworkVersionNumber; //! Project version string for snes9x_framework. FOUNDATION_EXPORT const unsigned char snes9x_frameworkVersionString[]; -// In this header, you should import all the public headers of your framework using statements like #import +#import +#import diff --git a/macosx/snes9x.xcodeproj/project.pbxproj b/macosx/snes9x.xcodeproj/project.pbxproj index ed74a4ee..575c2109 100755 --- a/macosx/snes9x.xcodeproj/project.pbxproj +++ b/macosx/snes9x.xcodeproj/project.pbxproj @@ -14,15 +14,17 @@ 302EECA322DAD0C5006D1502 /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 302EECA222DAD0C5006D1502 /* CoreImage.framework */; }; 302EECA522DAD1B9006D1502 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 302EECA422DAD1B9006D1502 /* CoreAudio.framework */; }; 3045A1EF22D03C4B0092B97D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3045A1EE22D03C4B0092B97D /* Cocoa.framework */; }; + 30714719230E379500917F82 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 30714718230E379500917F82 /* AppDelegate.m */; }; + 3071471B230E379600917F82 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3071471A230E379600917F82 /* Assets.xcassets */; }; + 3071471E230E379600917F82 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3071471C230E379600917F82 /* MainMenu.xib */; }; + 30714721230E379600917F82 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 30714720230E379600917F82 /* main.m */; }; + 30714728230E37D500917F82 /* snes9x_framework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30D15CEF22CE6B5A005BC352 /* snes9x_framework.framework */; }; + 30714729230E387700917F82 /* mac-os.h in Headers */ = {isa = PBXBuildFile; fileRef = EAECB68204AC7FCE00A80003 /* mac-os.h */; settings = {ATTRIBUTES = (Public, ); }; }; 307C860B22D22C87001B879E /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 307C860A22D22C87001B879E /* libz.tbd */; }; 307C860C22D23A5B001B879E /* mac-file.mm in Sources */ = {isa = PBXBuildFile; fileRef = EA2DBC0C0510ABE700A80003 /* mac-file.mm */; }; - 307C861122D27C53001B879E /* tileimpl-n1x1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 307C860D22D27C53001B879E /* tileimpl-n1x1.cpp */; }; 307C861222D27C53001B879E /* tileimpl-n1x1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 307C860D22D27C53001B879E /* tileimpl-n1x1.cpp */; }; - 307C861322D27C53001B879E /* tileimpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 307C860E22D27C53001B879E /* tileimpl.h */; }; 307C861422D27C53001B879E /* tileimpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 307C860E22D27C53001B879E /* tileimpl.h */; }; - 307C861522D27C53001B879E /* tileimpl-n2x1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 307C860F22D27C53001B879E /* tileimpl-n2x1.cpp */; }; 307C861622D27C53001B879E /* tileimpl-n2x1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 307C860F22D27C53001B879E /* tileimpl-n2x1.cpp */; }; - 307C861722D27C53001B879E /* tileimpl-h2x1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 307C861022D27C53001B879E /* tileimpl-h2x1.cpp */; }; 307C861822D27C53001B879E /* tileimpl-h2x1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 307C861022D27C53001B879E /* tileimpl-h2x1.cpp */; }; 307C861922D29CAA001B879E /* mac-joypad.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAECB67B04AC7FCE00A80003 /* mac-joypad.mm */; }; 307C861B22D29D6D001B879E /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 307C861A22D29D6D001B879E /* IOKit.framework */; }; @@ -45,232 +47,7 @@ 307C863022D29E29001B879E /* mac-render.mm in Sources */ = {isa = PBXBuildFile; fileRef = EA942A50059B0F9000D7D022 /* mac-render.mm */; }; 307C863222D29E29001B879E /* mac-snes9x.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAECB68604AC7FCE00A80003 /* mac-snes9x.mm */; }; 307C863322D29E29001B879E /* mac-stringtools.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAECB68804AC7FCE00A80003 /* mac-stringtools.mm */; }; - 30CCAC532290472E00549AED /* 65c816.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE0615A0526CCB900A80003 /* 65c816.h */; }; - 30CCAC542290472E00549AED /* bsx.h in Headers */ = {isa = PBXBuildFile; fileRef = EA2F381A09B17E9E0078DCA7 /* bsx.h */; }; - 30CCAC552290472E00549AED /* blargg_source.h in Headers */ = {isa = PBXBuildFile; fileRef = BF0B39811FA5792F002B04D3 /* blargg_source.h */; }; - 30CCAC562290472E00549AED /* c4.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061600526CCB900A80003 /* c4.h */; }; - 30CCAC572290472E00549AED /* sdsp.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BF0B39831FA5792F002B04D3 /* sdsp.hpp */; }; - 30CCAC582290472E00549AED /* cheats.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061640526CCB900A80003 /* cheats.h */; }; - 30CCAC592290472E00549AED /* controls.h in Headers */ = {isa = PBXBuildFile; fileRef = EA809E9308F8D6C40072CDFB /* controls.h */; }; - 30CCAC5A2290472E00549AED /* cpuaddr.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE0616A0526CCB900A80003 /* cpuaddr.h */; }; - 30CCAC5B2290472E00549AED /* cpuexec.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE0616C0526CCB900A80003 /* cpuexec.h */; }; - 30CCAC5C2290472E00549AED /* cpumacro.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE0616D0526CCB900A80003 /* cpumacro.h */; }; - 30CCAC5D2290472E00549AED /* SPC_DSP.h in Headers */ = {isa = PBXBuildFile; fileRef = BF0B39851FA5792F002B04D3 /* SPC_DSP.h */; }; - 30CCAC5E2290472E00549AED /* cpuops.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE0616F0526CCB900A80003 /* cpuops.h */; }; - 30CCAC5F2290472E00549AED /* crosshairs.h in Headers */ = {isa = PBXBuildFile; fileRef = EA809E9D08F8D73A0072CDFB /* crosshairs.h */; }; - 30CCAC602290472E00549AED /* debug.h in Headers */ = {isa = PBXBuildFile; fileRef = EA6E6C0E08F9734500CB3555 /* debug.h */; }; - 30CCAC612290472E00549AED /* display.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061730526CCB900A80003 /* display.h */; }; - 30CCAC622290472E00549AED /* snes.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BF0B39AB1FA5792F002B04D3 /* snes.hpp */; }; - 30CCAC632290472E00549AED /* dma.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061750526CCB900A80003 /* dma.h */; }; - 30CCAC642290472E00549AED /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = CF5D3E100FAFD34200340007 /* dsp.h */; }; - 30CCAC652290472E00549AED /* font.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE0617A0526CCB900A80003 /* font.h */; }; - 30CCAC662290472E00549AED /* fxemu.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE0617D0526CCB900A80003 /* fxemu.h */; }; - 30CCAC672290472E00549AED /* fxinst.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE0617F0526CCB900A80003 /* fxinst.h */; }; - 30CCAC682290472E00549AED /* getset.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061800526CCB900A80003 /* getset.h */; }; - 30CCAC692290472E00549AED /* blargg_endian.h in Headers */ = {isa = PBXBuildFile; fileRef = BF0B39801FA5792F002B04D3 /* blargg_endian.h */; }; - 30CCAC6A2290472E00549AED /* gfx.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061820526CCB900A80003 /* gfx.h */; }; - 30CCAC6B2290472E00549AED /* language.h in Headers */ = {isa = PBXBuildFile; fileRef = EA809E9508F8D6E00072CDFB /* language.h */; }; - 30CCAC6C2290472E00549AED /* logger.h in Headers */ = {isa = PBXBuildFile; fileRef = EA00D01F0A5A998F000C58E0 /* logger.h */; }; - 30CCAC6D2290472E00549AED /* memmap.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061B10526CCB900A80003 /* memmap.h */; }; - 30CCAC6E2290472E00549AED /* messages.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061B20526CCB900A80003 /* messages.h */; }; - 30CCAC6F2290472E00549AED /* missing.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061B30526CCB900A80003 /* missing.h */; }; - 30CCAC702290472E00549AED /* movie.h in Headers */ = {isa = PBXBuildFile; fileRef = EA813E86066F5076004F99B5 /* movie.h */; }; - 30CCAC712290472E00549AED /* obc1.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061C40526CCB900A80003 /* obc1.h */; }; - 30CCAC722290472E00549AED /* pixform.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061C60526CCB900A80003 /* pixform.h */; }; - 30CCAC732290472E00549AED /* port.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061C70526CCB900A80003 /* port.h */; }; - 30CCAC742290472E00549AED /* ppu.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061C90526CCB900A80003 /* ppu.h */; }; - 30CCAC752290472E00549AED /* stream.h in Headers */ = {isa = PBXBuildFile; fileRef = EA809E9708F8D70D0072CDFB /* stream.h */; }; - 30CCAC762290472E00549AED /* sa1.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061CC0526CCB900A80003 /* sa1.h */; }; - 30CCAC772290472E00549AED /* sar.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061CE0526CCB900A80003 /* sar.h */; }; - 30CCAC782290472E00549AED /* screenshot.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061D00526CCB900A80003 /* screenshot.h */; }; - 30CCAC792290472E00549AED /* sdd1.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061D20526CCB900A80003 /* sdd1.h */; }; - 30CCAC7A2290472E00549AED /* sdd1emu.h in Headers */ = {isa = PBXBuildFile; fileRef = EA22EFA2053EEDE500A80003 /* sdd1emu.h */; }; - 30CCAC7B2290472E00549AED /* seta.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061D50526CCB900A80003 /* seta.h */; }; - 30CCAC7C2290472E00549AED /* snapshot.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061DC0526CCB900A80003 /* snapshot.h */; }; - 30CCAC7D2290472E00549AED /* snes9x.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061DE0526CCB900A80003 /* snes9x.h */; }; - 30CCAC7E2290472E00549AED /* spc7110.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061E60526CCB900A80003 /* spc7110.h */; }; - 30CCAC7F2290472E00549AED /* srtc.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061EA0526CCB900A80003 /* srtc.h */; }; - 30CCAC802290472E00549AED /* tile.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061EC0526CCB900A80003 /* tile.h */; }; - 30CCAC812290472E00549AED /* 2xsai.h in Headers */ = {isa = PBXBuildFile; fileRef = CF5553B20EA24C36005957E4 /* 2xsai.h */; }; - 30CCAC822290472E00549AED /* blit.h in Headers */ = {isa = PBXBuildFile; fileRef = CF5553B40EA24C36005957E4 /* blit.h */; }; - 30CCAC832290472E00549AED /* epx.h in Headers */ = {isa = PBXBuildFile; fileRef = CF5553B60EA24C36005957E4 /* epx.h */; }; - 30CCAC842290472E00549AED /* hq2x.h in Headers */ = {isa = PBXBuildFile; fileRef = CF5553B80EA24C36005957E4 /* hq2x.h */; }; - 30CCAC852290472E00549AED /* snes_ntsc.h in Headers */ = {isa = PBXBuildFile; fileRef = CFEFAE9010EAC92B00FB081A /* snes_ntsc.h */; }; - 30CCAC862290472E00549AED /* snes_ntsc_config.h in Headers */ = {isa = PBXBuildFile; fileRef = CFEFAE8E10EAC92B00FB081A /* snes_ntsc_config.h */; }; - 30CCAC872290472E00549AED /* snes_ntsc_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = CFEFAE8F10EAC92B00FB081A /* snes_ntsc_impl.h */; }; - 30CCAC882290472E00549AED /* crypt.h in Headers */ = {isa = PBXBuildFile; fileRef = CFA518E50EBCB5B1008379F6 /* crypt.h */; }; - 30CCAC892290472E00549AED /* ioapi.h in Headers */ = {isa = PBXBuildFile; fileRef = CFA518D60EBCB4CA008379F6 /* ioapi.h */; }; - 30CCAC8A2290472E00549AED /* unzip.h in Headers */ = {isa = PBXBuildFile; fileRef = CFA518DA0EBCB4D2008379F6 /* unzip.h */; }; - 30CCAC8B2290472E00549AED /* 7z.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5D907609F76001BAB8B /* 7z.h */; }; - 30CCAC8C2290472E00549AED /* aribitcd.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5DB07609F76001BAB8B /* aribitcd.h */; }; - 30CCAC8D2290472E00549AED /* ariconst.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5DC07609F76001BAB8B /* ariconst.h */; }; - 30CCAC8E2290472E00549AED /* ariprice.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5DD07609F76001BAB8B /* ariprice.h */; }; - 30CCAC8F2290472E00549AED /* btreecd.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5DE07609F76001BAB8B /* btreecd.h */; }; - 30CCAC902290472E00549AED /* crc32.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5E007609F76001BAB8B /* crc32.h */; }; - 30CCAC912290472E00549AED /* blargg_config.h in Headers */ = {isa = PBXBuildFile; fileRef = BF0B397F1FA5792F002B04D3 /* blargg_config.h */; }; - 30CCAC922290472E00549AED /* iiostrm.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5E207609F76001BAB8B /* iiostrm.h */; }; - 30CCAC932290472E00549AED /* blargg_common.h in Headers */ = {isa = PBXBuildFile; fileRef = BF0B397E1FA5792F002B04D3 /* blargg_common.h */; }; - 30CCAC942290472E00549AED /* inbyte.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5E407609F76001BAB8B /* inbyte.h */; }; - 30CCAC952290472E00549AED /* jma.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5E607609F76001BAB8B /* jma.h */; }; - 30CCAC962290472E00549AED /* lencoder.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5E707609F76001BAB8B /* lencoder.h */; }; - 30CCAC972290472E00549AED /* litcoder.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5E807609F76001BAB8B /* litcoder.h */; }; - 30CCAC982290472E00549AED /* resampler.h in Headers */ = {isa = PBXBuildFile; fileRef = BF0B39AD1FA5792F002B04D3 /* resampler.h */; }; - 30CCAC992290472E00549AED /* lzma.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5EA07609F76001BAB8B /* lzma.h */; }; - 30CCAC9A2290472E00549AED /* smp.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BF0B39A71FA5792F002B04D3 /* smp.hpp */; }; - 30CCAC9B2290472E00549AED /* lzmadec.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5EC07609F76001BAB8B /* lzmadec.h */; }; - 30CCAC9C2290472E00549AED /* portable.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5ED07609F76001BAB8B /* portable.h */; }; - 30CCAC9D2290472E00549AED /* rcdefs.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5EE07609F76001BAB8B /* rcdefs.h */; }; - 30CCAC9E2290472E00549AED /* rngcoder.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5EF07609F76001BAB8B /* rngcoder.h */; }; - 30CCAC9F2290472E00549AED /* s9x-jma.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5F107609F76001BAB8B /* s9x-jma.h */; }; - 30CCACA02290472E00549AED /* winout.h in Headers */ = {isa = PBXBuildFile; fileRef = EAA7B5F307609F76001BAB8B /* winout.h */; }; - 30CCACA12290472E00549AED /* mac-appleevent.h in Headers */ = {isa = PBXBuildFile; fileRef = EAECB66D04AC7FCD00A80003 /* mac-appleevent.h */; }; - 30CCACA22290472E00549AED /* mac-audio.h in Headers */ = {isa = PBXBuildFile; fileRef = EADE6349052E5C5300A80003 /* mac-audio.h */; }; - 30CCACA32290472E00549AED /* mac-cart.h in Headers */ = {isa = PBXBuildFile; fileRef = EAECB67104AC7FCE00A80003 /* mac-cart.h */; }; - 30CCACA42290472E00549AED /* mac-cheat.h in Headers */ = {isa = PBXBuildFile; fileRef = EAECB67304AC7FCE00A80003 /* mac-cheat.h */; }; - 30CCACA52290472E00549AED /* mac-cheatfinder.h in Headers */ = {isa = PBXBuildFile; fileRef = EAECB67504AC7FCE00A80003 /* mac-cheatfinder.h */; }; - 30CCACA72290472E00549AED /* mac-cocoatools.h in Headers */ = {isa = PBXBuildFile; fileRef = EA85C24D0B4EC13300F5F9C9 /* mac-cocoatools.h */; }; - 30CCACA82290472E00549AED /* mac-controls.h in Headers */ = {isa = PBXBuildFile; fileRef = EA809F9D08F8F2190072CDFB /* mac-controls.h */; }; - 30CCACA92290472E00549AED /* mac-coreimage.h in Headers */ = {isa = PBXBuildFile; fileRef = EA0C952D08364A4A009307B4 /* mac-coreimage.h */; }; - 30CCACAB2290472E00549AED /* mac-file.h in Headers */ = {isa = PBXBuildFile; fileRef = EA2DBC0A0510ABE700A80003 /* mac-file.h */; }; - 30CCACAC2290472E00549AED /* mac-gworld.h in Headers */ = {isa = PBXBuildFile; fileRef = EAECB67A04AC7FCE00A80003 /* mac-gworld.h */; }; - 30CCACAD2290472E00549AED /* mac-joypad.h in Headers */ = {isa = PBXBuildFile; fileRef = EAECB67C04AC7FCE00A80003 /* mac-joypad.h */; }; - 30CCACAE2290472E00549AED /* mac-keyboard.h in Headers */ = {isa = PBXBuildFile; fileRef = EAECB67E04AC7FCE00A80003 /* mac-keyboard.h */; }; - 30CCACAF2290472E00549AED /* apu.h in Headers */ = {isa = PBXBuildFile; fileRef = BF0B397B1FA5792F002B04D3 /* apu.h */; }; - 30CCACB02290472E00549AED /* mac-multicart.h in Headers */ = {isa = PBXBuildFile; fileRef = EA26BBD90B36771500A570B5 /* mac-multicart.h */; }; - 30CCACB12290472E00549AED /* mac-musicbox.h in Headers */ = {isa = PBXBuildFile; fileRef = EAECB68004AC7FCE00A80003 /* mac-musicbox.h */; }; - 30CCACB22290472E00549AED /* mac-netplay.h in Headers */ = {isa = PBXBuildFile; fileRef = EA16053E0639E655004412AB /* mac-netplay.h */; }; - 30CCACB32290472E00549AED /* mac-os.h in Headers */ = {isa = PBXBuildFile; fileRef = EAECB68204AC7FCE00A80003 /* mac-os.h */; }; - 30CCACB42290472E00549AED /* mac-prefs.h in Headers */ = {isa = PBXBuildFile; fileRef = EAECB68504AC7FCE00A80003 /* mac-prefs.h */; }; - 30CCACB62290472E00549AED /* mac-render.h in Headers */ = {isa = PBXBuildFile; fileRef = EA2DBC090510ABE700A80003 /* mac-render.h */; }; - 30CCACB72290472E00549AED /* msu1.h in Headers */ = {isa = PBXBuildFile; fileRef = BF0B39E21FA58124002B04D3 /* msu1.h */; }; - 30CCACB82290472E00549AED /* mac-screenshot.h in Headers */ = {isa = PBXBuildFile; fileRef = EA2DBC070510ABE700A80003 /* mac-screenshot.h */; }; - 30CCACBA2290472E00549AED /* mac-snes9x.h in Headers */ = {isa = PBXBuildFile; fileRef = EAECB68704AC7FCE00A80003 /* mac-snes9x.h */; }; - 30CCACBB2290472E00549AED /* mac-stringtools.h in Headers */ = {isa = PBXBuildFile; fileRef = EAECB68904AC7FCE00A80003 /* mac-stringtools.h */; }; - 30CCACBC2290472E00549AED /* mac-prefix.h in Headers */ = {isa = PBXBuildFile; fileRef = EAECB68304AC7FCE00A80003 /* mac-prefix.h */; }; - 30CCACBD2290472E00549AED /* mac-global_prefix.h in Headers */ = {isa = PBXBuildFile; fileRef = EAD978980555059300E8BBFD /* mac-global_prefix.h */; }; - 30CCACBE2290472E00549AED /* HID_Utilities_External.h in Headers */ = {isa = PBXBuildFile; fileRef = EA362C3E086119D100FBE476 /* HID_Utilities_External.h */; }; - 30CCACBF2290472E00549AED /* zconf.h in Headers */ = {isa = PBXBuildFile; fileRef = CF3E45BD137349960077DE32 /* zconf.h */; }; - 30CCACC02290472E00549AED /* zlib.h in Headers */ = {isa = PBXBuildFile; fileRef = CF3E45D013734A920077DE32 /* zlib.h */; }; - 30CCACC22290472E00549AED /* APPL.icns in Resources */ = {isa = PBXBuildFile; fileRef = EA3D2F3D0A26083B00BDACCC /* APPL.icns */; }; - 30CCACC32290472E00549AED /* CART.icns in Resources */ = {isa = PBXBuildFile; fileRef = EA3D2F3C0A26083B00BDACCC /* CART.icns */; }; - 30CCACC42290472E00549AED /* SRAM.icns in Resources */ = {isa = PBXBuildFile; fileRef = EA3D2F360A26083B00BDACCC /* SRAM.icns */; }; - 30CCACC52290472E00549AED /* SAVE.icns in Resources */ = {isa = PBXBuildFile; fileRef = EA3D2F370A26083B00BDACCC /* SAVE.icns */; }; - 30CCACC62290472E00549AED /* folder_SRAMs.icns in Resources */ = {isa = PBXBuildFile; fileRef = EA3D2F3A0A26083B00BDACCC /* folder_SRAMs.icns */; }; - 30CCACC72290472E00549AED /* folder_Freezes.icns in Resources */ = {isa = PBXBuildFile; fileRef = EA3D2F3B0A26083B00BDACCC /* folder_Freezes.icns */; }; - 30CCACC82290472E00549AED /* icons.png in Resources */ = {isa = PBXBuildFile; fileRef = CF4B7C420CF841580080E643 /* icons.png */; }; - 30CCACC92290472E00549AED /* logo_freeze.png in Resources */ = {isa = PBXBuildFile; fileRef = EA3D300B0A260A3200BDACCC /* logo_freeze.png */; }; - 30CCACCA2290472E00549AED /* logo_defrost.png in Resources */ = {isa = PBXBuildFile; fileRef = EA3D300C0A260A3200BDACCC /* logo_defrost.png */; }; - 30CCACCB2290472E00549AED /* musicbox_indicator.png in Resources */ = {isa = PBXBuildFile; fileRef = EA3D300A0A260A3200BDACCC /* musicbox_indicator.png */; }; - 30CCACCC2290472E00549AED /* musicbox_pause.png in Resources */ = {isa = PBXBuildFile; fileRef = CF46BEAD133E256D005A17A5 /* musicbox_pause.png */; }; - 30CCACCD2290472E00549AED /* musicbox_rewind.png in Resources */ = {isa = PBXBuildFile; fileRef = CFCE2D46133F591900DF6C4E /* musicbox_rewind.png */; }; - 30CCACCE2290472E00549AED /* musicbox_effect.png in Resources */ = {isa = PBXBuildFile; fileRef = CFCE2D45133F591900DF6C4E /* musicbox_effect.png */; }; - 30CCACCF2290472E00549AED /* musicbox_ledon.icns in Resources */ = {isa = PBXBuildFile; fileRef = EA3D2F380A26083B00BDACCC /* musicbox_ledon.icns */; }; - 30CCACD02290472E00549AED /* musicbox_ledoff.icns in Resources */ = {isa = PBXBuildFile; fileRef = EA3D2F390A26083B00BDACCC /* musicbox_ledoff.icns */; }; - 30CCACD12290472E00549AED /* freeze_defrost.aiff in Resources */ = {isa = PBXBuildFile; fileRef = EA85C3560B4ECBD900F5F9C9 /* freeze_defrost.aiff */; }; - 30CCACD22290472E00549AED /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = EA3BEA9E0A28384E00A8FAE5 /* InfoPlist.strings */; }; - 30CCACD32290472E00549AED /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = EA3BEA980A28384E00A8FAE5 /* Localizable.strings */; }; - 30CCACD42290472E00549AED /* Snes9x.xib in Resources */ = {isa = PBXBuildFile; fileRef = CF14733C132DA4E1000D0F91 /* Snes9x.xib */; }; - 30CCACD52290472E00549AED /* musicbox.xib in Resources */ = {isa = PBXBuildFile; fileRef = CF46BEA8133E2559005A17A5 /* musicbox.xib */; }; - 30CCACD62290472E00549AED /* Snes9x Help in Resources */ = {isa = PBXBuildFile; fileRef = EA3BEAA80A28386500A8FAE5 /* Snes9x Help */; }; - 30CCACD82290472E00549AED /* bsx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA2F380F09B17E070078DCA7 /* bsx.cpp */; }; - 30CCACD92290472E00549AED /* c4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE0615F0526CCB900A80003 /* c4.cpp */; }; - 30CCACDA2290472E00549AED /* c4emu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061610526CCB900A80003 /* c4emu.cpp */; }; - 30CCACDB2290472E00549AED /* cheats.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061630526CCB900A80003 /* cheats.cpp */; }; - 30CCACDC2290472E00549AED /* cheats2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061650526CCB900A80003 /* cheats2.cpp */; }; - 30CCACDD2290472E00549AED /* clip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061660526CCB900A80003 /* clip.cpp */; }; - 30CCACDE2290472E00549AED /* apu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BF0B397A1FA5792F002B04D3 /* apu.cpp */; }; - 30CCACDF2290472E00549AED /* controls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA809E9908F8D7240072CDFB /* controls.cpp */; }; - 30CCACE02290472E00549AED /* cpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061690526CCB900A80003 /* cpu.cpp */; }; - 30CCACE12290472E00549AED /* cpuexec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE0616B0526CCB900A80003 /* cpuexec.cpp */; }; - 30CCACE22290472E00549AED /* cpuops.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE0616E0526CCB900A80003 /* cpuops.cpp */; }; - 30CCACE32290472E00549AED /* crosshairs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA809E9B08F8D72C0072CDFB /* crosshairs.cpp */; }; - 30CCACE42290472E00549AED /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061710526CCB900A80003 /* debug.cpp */; }; - 30CCACE52290472E00549AED /* dma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061740526CCB900A80003 /* dma.cpp */; }; - 30CCACE62290472E00549AED /* dsp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CF5D3E270FAFD35A00340007 /* dsp.cpp */; }; - 30CCACE72290472E00549AED /* dsp1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061760526CCB900A80003 /* dsp1.cpp */; }; - 30CCACE82290472E00549AED /* dsp2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CF5D3E1B0FAFD35400340007 /* dsp2.cpp */; }; - 30CCACE92290472E00549AED /* dsp3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CF5D3E1D0FAFD35400340007 /* dsp3.cpp */; }; - 30CCACEA2290472E00549AED /* dsp4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CF5D3E1C0FAFD35400340007 /* dsp4.cpp */; }; - 30CCACEB2290472E00549AED /* fxemu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE0617C0526CCB900A80003 /* fxemu.cpp */; }; - 30CCACEC2290472E00549AED /* fxinst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE0617E0526CCB900A80003 /* fxinst.cpp */; }; - 30CCACED2290472E00549AED /* gfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA31FE2D05F7743E00E13748 /* gfx.cpp */; }; - 30CCACEE2290472E00549AED /* globals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061830526CCB900A80003 /* globals.cpp */; }; - 30CCACEF2290472E00549AED /* loadzip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061A90526CCB900A80003 /* loadzip.cpp */; }; - 30CCACF02290472E00549AED /* logger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA00D01D0A5A9956000C58E0 /* logger.cpp */; }; - 30CCACF12290472E00549AED /* memmap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAB7319C0527033000A80003 /* memmap.cpp */; }; - 30CCACF22290472E00549AED /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA813E9A066F50A5004F99B5 /* movie.cpp */; }; - 30CCACF32290472E00549AED /* obc1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061C30526CCB900A80003 /* obc1.cpp */; }; - 30CCACF42290472E00549AED /* ppu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061C80526CCB900A80003 /* ppu.cpp */; }; - 30CCACF52290472E00549AED /* stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA809E9F08F8D7530072CDFB /* stream.cpp */; }; - 30CCACF62290472E00549AED /* sa1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061CB0526CCB900A80003 /* sa1.cpp */; }; - 30CCACF72290472E00549AED /* sa1cpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061CD0526CCB900A80003 /* sa1cpu.cpp */; }; - 30CCACF82290472E00549AED /* sdd1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061D10526CCB900A80003 /* sdd1.cpp */; }; - 30CCACF92290472E00549AED /* sdd1emu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA22EFA4053EEE0700A80003 /* sdd1emu.cpp */; }; - 30CCACFA2290472E00549AED /* msu1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BF0B39DE1FA580F9002B04D3 /* msu1.cpp */; }; - 30CCACFB2290472E00549AED /* seta.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061D40526CCB900A80003 /* seta.cpp */; }; - 30CCACFC2290472E00549AED /* seta010.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061D60526CCB900A80003 /* seta010.cpp */; }; - 30CCACFD2290472E00549AED /* seta011.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061D70526CCB900A80003 /* seta011.cpp */; }; - 30CCACFE2290472E00549AED /* seta018.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061D80526CCB900A80003 /* seta018.cpp */; }; - 30CCACFF2290472E00549AED /* snapshot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061DB0526CCB900A80003 /* snapshot.cpp */; }; - 30CCAD002290472E00549AED /* spc7110.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061E50526CCB900A80003 /* spc7110.cpp */; }; - 30CCAD012290472E00549AED /* srtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061E90526CCB900A80003 /* srtc.cpp */; }; - 30CCAD022290472E00549AED /* tile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAE061EB0526CCB900A80003 /* tile.cpp */; }; - 30CCAD032290472E00549AED /* 2xsai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CF5553B10EA24C36005957E4 /* 2xsai.cpp */; }; - 30CCAD042290472E00549AED /* blit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CF5553B30EA24C36005957E4 /* blit.cpp */; }; - 30CCAD052290472E00549AED /* epx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CF5553B50EA24C36005957E4 /* epx.cpp */; }; - 30CCAD062290472E00549AED /* hq2x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CF5553B70EA24C36005957E4 /* hq2x.cpp */; }; - 30CCAD072290472E00549AED /* snes_ntsc.c in Sources */ = {isa = PBXBuildFile; fileRef = CFEFAE8A10EAC92300FB081A /* snes_ntsc.c */; }; - 30CCAD082290472E00549AED /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = CFA518D10EBCB4AD008379F6 /* ioapi.c */; }; - 30CCAD092290472E00549AED /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = CFA518BC0EBCB3ED008379F6 /* unzip.c */; }; - 30CCAD0A2290472E00549AED /* 7zlzma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA7B5DA07609F76001BAB8B /* 7zlzma.cpp */; settings = {COMPILER_FLAGS = "-fexceptions"; }; }; - 30CCAD0B2290472E00549AED /* crc32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA7B5DF07609F76001BAB8B /* crc32.cpp */; settings = {COMPILER_FLAGS = "-fexceptions"; }; }; - 30CCAD0C2290472E00549AED /* iiostrm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA7B5E107609F76001BAB8B /* iiostrm.cpp */; settings = {COMPILER_FLAGS = "-fexceptions"; }; }; - 30CCAD0D2290472E00549AED /* inbyte.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA7B5E307609F76001BAB8B /* inbyte.cpp */; settings = {COMPILER_FLAGS = "-fexceptions"; }; }; - 30CCAD0E2290472E00549AED /* jma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA7B5E507609F76001BAB8B /* jma.cpp */; settings = {COMPILER_FLAGS = "-fexceptions"; }; }; - 30CCAD0F2290472E00549AED /* lzma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA7B5E907609F76001BAB8B /* lzma.cpp */; settings = {COMPILER_FLAGS = "-fexceptions"; }; }; - 30CCAD102290472E00549AED /* lzmadec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA7B5EB07609F76001BAB8B /* lzmadec.cpp */; settings = {COMPILER_FLAGS = "-fexceptions"; }; }; - 30CCAD112290472E00549AED /* s9x-jma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA7B5F007609F76001BAB8B /* s9x-jma.cpp */; settings = {COMPILER_FLAGS = "-fexceptions"; }; }; - 30CCAD122290472E00549AED /* winout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA7B5F207609F76001BAB8B /* winout.cpp */; settings = {COMPILER_FLAGS = "-fexceptions"; }; }; - 30CCAD132290472E00549AED /* mac-appleevent.mm in Sources */ = {isa = PBXBuildFile; fileRef = EACDDBB004D6A89700A80003 /* mac-appleevent.mm */; }; - 30CCAD142290472E00549AED /* mac-audio.mm in Sources */ = {isa = PBXBuildFile; fileRef = EADE6347052E5C4300A80003 /* mac-audio.mm */; }; - 30CCAD152290472E00549AED /* mac-cart.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAECB67004AC7FCE00A80003 /* mac-cart.mm */; }; - 30CCAD162290472E00549AED /* mac-cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAECB67204AC7FCE00A80003 /* mac-cheat.mm */; }; - 30CCAD172290472E00549AED /* smp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BF0B39A61FA5792F002B04D3 /* smp.cpp */; }; - 30CCAD182290472E00549AED /* mac-cheatfinder.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAECB67404AC7FCE00A80003 /* mac-cheatfinder.mm */; }; - 30CCAD1A2290472E00549AED /* mac-cocoatools.mm in Sources */ = {isa = PBXBuildFile; fileRef = EA85C24E0B4EC13300F5F9C9 /* mac-cocoatools.mm */; }; - 30CCAD1B2290472E00549AED /* mac-controls.mm in Sources */ = {isa = PBXBuildFile; fileRef = EA809FA108F8F2420072CDFB /* mac-controls.mm */; }; - 30CCAD1C2290472E00549AED /* mac-coreimage.mm in Sources */ = {isa = PBXBuildFile; fileRef = EA0C952E08364A4A009307B4 /* mac-coreimage.mm */; }; - 30CCAD1D2290472E00549AED /* smp_state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BF0B39A81FA5792F002B04D3 /* smp_state.cpp */; }; - 30CCAD1E2290472E00549AED /* sdsp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BF0B39821FA5792F002B04D3 /* sdsp.cpp */; }; - 30CCAD202290472E00549AED /* mac-file.mm in Sources */ = {isa = PBXBuildFile; fileRef = EA2DBC0C0510ABE700A80003 /* mac-file.mm */; }; - 30CCAD212290472E00549AED /* mac-gworld.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAECB67904AC7FCE00A80003 /* mac-gworld.mm */; }; - 30CCAD222290472E00549AED /* mac-joypad.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAECB67B04AC7FCE00A80003 /* mac-joypad.mm */; }; - 30CCAD232290472E00549AED /* mac-keyboard.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAECB67D04AC7FCE00A80003 /* mac-keyboard.mm */; }; - 30CCAD242290472E00549AED /* mac-multicart.mm in Sources */ = {isa = PBXBuildFile; fileRef = EA26BBD50B3676E800A570B5 /* mac-multicart.mm */; }; - 30CCAD252290472E00549AED /* mac-musicbox.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAECB67F04AC7FCE00A80003 /* mac-musicbox.mm */; }; - 30CCAD262290472E00549AED /* mac-netplay.mm in Sources */ = {isa = PBXBuildFile; fileRef = EA1605500639E735004412AB /* mac-netplay.mm */; }; - 30CCAD272290472E00549AED /* mac-os.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAE0E96604D582B700A80003 /* mac-os.mm */; }; - 30CCAD282290472E00549AED /* mac-prefs.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAE0E96B04D584B700A80003 /* mac-prefs.mm */; }; - 30CCAD2A2290472E00549AED /* mac-render.mm in Sources */ = {isa = PBXBuildFile; fileRef = EA942A50059B0F9000D7D022 /* mac-render.mm */; }; - 30CCAD2B2290472E00549AED /* mac-screenshot.mm in Sources */ = {isa = PBXBuildFile; fileRef = EA2DBC0D0510ABE700A80003 /* mac-screenshot.mm */; }; - 30CCAD2D2290472E00549AED /* mac-snes9x.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAECB68604AC7FCE00A80003 /* mac-snes9x.mm */; }; - 30CCAD2E2290472E00549AED /* mac-stringtools.mm in Sources */ = {isa = PBXBuildFile; fileRef = EAECB68804AC7FCE00A80003 /* mac-stringtools.mm */; }; - 30CCAD302290472E00549AED /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAC5E47003D2D9C800A80004 /* AGL.framework */; }; - 30CCAD312290472E00549AED /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA85C2AC0B4ECA8300F5F9C9 /* AppKit.framework */; }; - 30CCAD322290472E00549AED /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EADE634B052E5D3600A80003 /* AudioToolbox.framework */; }; - 30CCAD332290472E00549AED /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EADE634C052E5D3600A80003 /* AudioUnit.framework */; }; - 30CCAD342290472E00549AED /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 20286C33FDCF999611CA2CEA /* Carbon.framework */; }; - 30CCAD352290472E00549AED /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EADE634D052E5D3600A80003 /* CoreAudio.framework */; }; - 30CCAD362290472E00549AED /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA0C95D808364AAE009307B4 /* Foundation.framework */; }; - 30CCAD372290472E00549AED /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F5FC76BD03873BBF01A80002 /* IOKit.framework */; }; - 30CCAD382290472E00549AED /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA8FA89603D294C000A80004 /* OpenGL.framework */; }; - 30CCAD392290472E00549AED /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF05677E0CF9971000C7877C /* QuartzCore.framework */; }; - 30CCAD3A2290472E00549AED /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F5C108DD0386806001A80002 /* QuickTime.framework */; }; - 30CCAD3B2290472E00549AED /* libHIDUtilities_u.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EA3D2F580A26085800BDACCC /* libHIDUtilities_u.a */; }; - 30CCAD3C2290472E00549AED /* libz_u.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CF3E42491372D48F0077DE32 /* libz_u.a */; }; 30D15CF322CE6B5A005BC352 /* snes9x_framework.h in Headers */ = {isa = PBXBuildFile; fileRef = 30D15CF122CE6B5A005BC352 /* snes9x_framework.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30D15CF622CE6B5A005BC352 /* snes9x_framework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30D15CEF22CE6B5A005BC352 /* snes9x_framework.framework */; }; - 30D15CF722CE6B5A005BC352 /* snes9x_framework.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 30D15CEF22CE6B5A005BC352 /* snes9x_framework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 30D15CFC22CE6B74005BC352 /* sha256.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 85FEF90A20DDB18D00C038E9 /* sha256.cpp */; }; 30D15CFE22CE6B74005BC352 /* bml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 85FEF90620DDB15B00C038E9 /* bml.cpp */; }; 30D15D2D22CE6B74005BC352 /* bsx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA2F380F09B17E070078DCA7 /* bsx.cpp */; }; @@ -365,7 +142,7 @@ 30D15DB022CE6BC9005BC352 /* msu1.h in Headers */ = {isa = PBXBuildFile; fileRef = BF0B39E21FA58124002B04D3 /* msu1.h */; }; 30D15DB122CE6BC9005BC352 /* obc1.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061C40526CCB900A80003 /* obc1.h */; }; 30D15DB222CE6BC9005BC352 /* pixform.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061C60526CCB900A80003 /* pixform.h */; }; - 30D15DB322CE6BC9005BC352 /* port.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061C70526CCB900A80003 /* port.h */; }; + 30D15DB322CE6BC9005BC352 /* port.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061C70526CCB900A80003 /* port.h */; settings = {ATTRIBUTES = (Public, ); }; }; 30D15DB422CE6BC9005BC352 /* ppu.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061C90526CCB900A80003 /* ppu.h */; }; 30D15DB522CE6BC9005BC352 /* stream.h in Headers */ = {isa = PBXBuildFile; fileRef = EA809E9708F8D70D0072CDFB /* stream.h */; }; 30D15DB622CE6BC9005BC352 /* sa1.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE061CC0526CCB900A80003 /* sa1.h */; }; @@ -421,7 +198,7 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 30D15CF422CE6B5A005BC352 /* PBXContainerItemProxy */ = { + 30714726230E379C00917F82 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 20286C28FDCF999611CA2CEA /* Project object */; proxyType = 1; @@ -430,20 +207,6 @@ }; /* End PBXContainerItemProxy section */ -/* Begin PBXCopyFilesBuildPhase section */ - 30D15CFB22CE6B5A005BC352 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 30D15CF722CE6B5A005BC352 /* snes9x_framework.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - /* Begin PBXFileReference section */ 20286C33FDCF999611CA2CEA /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; 302EEC9A22DAD0AB006D1502 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; @@ -454,6 +217,18 @@ 302EECA422DAD1B9006D1502 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; 3045A1EC22D03C430092B97D /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 3045A1EE22D03C4B0092B97D /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 30714704230E372B00917F82 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 30714707230E372B00917F82 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 30714709230E372B00917F82 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 3071470A230E372B00917F82 /* Snes9x.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Snes9x.entitlements; sourceTree = ""; }; + 30714715230E379500917F82 /* Snes9x.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Snes9x.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 30714717230E379500917F82 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 30714718230E379500917F82 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 3071471A230E379600917F82 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 3071471D230E379600917F82 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 3071471F230E379600917F82 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 30714720230E379600917F82 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 30714722230E379600917F82 /* Snes9x.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Snes9x.entitlements; sourceTree = ""; }; 307C860A22D22C87001B879E /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; 307C860D22D27C53001B879E /* tileimpl-n1x1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "tileimpl-n1x1.cpp"; sourceTree = ""; usesTabs = 1; }; 307C860E22D27C53001B879E /* tileimpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tileimpl.h; sourceTree = ""; usesTabs = 1; }; @@ -465,8 +240,6 @@ 30AD1D1F22FBB2EA000EE989 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 30AD1D2022FBB2EA000EE989 /* en */ = {isa = PBXFileReference; lastKnownFileType = folder; name = en; path = "en.lproj/Snes9x Help"; sourceTree = ""; }; 30AD1D2122FBB2EA000EE989 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/Snes9x.xib; sourceTree = ""; }; - 30AD1D2222FBB2EA000EE989 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/musicbox.xib; sourceTree = ""; }; - 30CCAD412290472E00549AED /* Snes9x.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Snes9x.app; sourceTree = BUILT_PRODUCTS_DIR; }; 30CCAD422290472E00549AED /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = /Users/buckley/Projects/snes9x/macosx/Info.plist; sourceTree = ""; }; 30D15CEF22CE6B5A005BC352 /* snes9x_framework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = snes9x_framework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 30D15CF122CE6B5A005BC352 /* snes9x_framework.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = snes9x_framework.h; sourceTree = ""; }; @@ -702,24 +475,11 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 30CCAD2F2290472E00549AED /* Frameworks */ = { + 30714712230E379500917F82 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 30CCAD302290472E00549AED /* AGL.framework in Frameworks */, - 30CCAD312290472E00549AED /* AppKit.framework in Frameworks */, - 30CCAD322290472E00549AED /* AudioToolbox.framework in Frameworks */, - 30CCAD332290472E00549AED /* AudioUnit.framework in Frameworks */, - 30CCAD342290472E00549AED /* Carbon.framework in Frameworks */, - 30CCAD352290472E00549AED /* CoreAudio.framework in Frameworks */, - 30CCAD362290472E00549AED /* Foundation.framework in Frameworks */, - 30CCAD372290472E00549AED /* IOKit.framework in Frameworks */, - 30CCAD382290472E00549AED /* OpenGL.framework in Frameworks */, - 30D15CF622CE6B5A005BC352 /* snes9x_framework.framework in Frameworks */, - 30CCAD392290472E00549AED /* QuartzCore.framework in Frameworks */, - 30CCAD3A2290472E00549AED /* QuickTime.framework in Frameworks */, - 30CCAD3B2290472E00549AED /* libHIDUtilities_u.a in Frameworks */, - 30CCAD3C2290472E00549AED /* libz_u.a in Frameworks */, + 30714728230E37D500917F82 /* snes9x_framework.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -746,8 +506,8 @@ 195DF8C9FE9D4F0611CA2CBB /* Products */ = { isa = PBXGroup; children = ( - 30CCAD412290472E00549AED /* Snes9x.app */, 30D15CEF22CE6B5A005BC352 /* snes9x_framework.framework */, + 30714715230E379500917F82 /* Snes9x.app */, ); name = Products; sourceTree = ""; @@ -758,6 +518,8 @@ 20286C2AFDCF999611CA2CEA /* Sources */, 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */, 30D15CF022CE6B5A005BC352 /* snes9x framework */, + 30714701230E372A00917F82 /* Snes9x */, + 30714716230E379500917F82 /* Snes9x */, 195DF8C9FE9D4F0611CA2CBB /* Products */, 3045A1EB22D03C420092B97D /* Frameworks */, ); @@ -808,6 +570,31 @@ name = Frameworks; sourceTree = ""; }; + 30714701230E372A00917F82 /* Snes9x */ = { + isa = PBXGroup; + children = ( + 30714704230E372B00917F82 /* Assets.xcassets */, + 30714706230E372B00917F82 /* MainMenu.xib */, + 30714709230E372B00917F82 /* Info.plist */, + 3071470A230E372B00917F82 /* Snes9x.entitlements */, + ); + path = Snes9x; + sourceTree = ""; + }; + 30714716230E379500917F82 /* Snes9x */ = { + isa = PBXGroup; + children = ( + 30714717230E379500917F82 /* AppDelegate.h */, + 30714718230E379500917F82 /* AppDelegate.m */, + 3071471A230E379600917F82 /* Assets.xcassets */, + 3071471C230E379600917F82 /* MainMenu.xib */, + 3071471F230E379600917F82 /* Info.plist */, + 30714720230E379600917F82 /* main.m */, + 30714722230E379600917F82 /* Snes9x.entitlements */, + ); + path = Snes9x; + sourceTree = ""; + }; 30D15CF022CE6B5A005BC352 /* snes9x framework */ = { isa = PBXGroup; children = ( @@ -1116,7 +903,6 @@ EA3BEA9E0A28384E00A8FAE5 /* InfoPlist.strings */, EA3BEA980A28384E00A8FAE5 /* Localizable.strings */, CF14733C132DA4E1000D0F91 /* Snes9x.xib */, - CF46BEA8133E2559005A17A5 /* musicbox.xib */, EA3BEAA80A28386500A8FAE5 /* Snes9x Help */, EA3D2F580A26085800BDACCC /* libHIDUtilities_u.a */, CF3E42491372D48F0077DE32 /* libz_u.a */, @@ -1128,125 +914,13 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 30CCAC522290472E00549AED /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 30CCAC532290472E00549AED /* 65c816.h in Headers */, - 30CCAC542290472E00549AED /* bsx.h in Headers */, - 30CCAC552290472E00549AED /* blargg_source.h in Headers */, - 30CCAC562290472E00549AED /* c4.h in Headers */, - 30CCAC572290472E00549AED /* sdsp.hpp in Headers */, - 30CCAC582290472E00549AED /* cheats.h in Headers */, - 30CCAC592290472E00549AED /* controls.h in Headers */, - 30CCAC5A2290472E00549AED /* cpuaddr.h in Headers */, - 30CCAC5B2290472E00549AED /* cpuexec.h in Headers */, - 30CCAC5C2290472E00549AED /* cpumacro.h in Headers */, - 30CCAC5D2290472E00549AED /* SPC_DSP.h in Headers */, - 30CCAC5E2290472E00549AED /* cpuops.h in Headers */, - 30CCAC5F2290472E00549AED /* crosshairs.h in Headers */, - 30CCAC602290472E00549AED /* debug.h in Headers */, - 30CCAC612290472E00549AED /* display.h in Headers */, - 30CCAC622290472E00549AED /* snes.hpp in Headers */, - 30CCAC632290472E00549AED /* dma.h in Headers */, - 30CCAC642290472E00549AED /* dsp.h in Headers */, - 30CCAC652290472E00549AED /* font.h in Headers */, - 30CCAC662290472E00549AED /* fxemu.h in Headers */, - 30CCAC672290472E00549AED /* fxinst.h in Headers */, - 30CCAC682290472E00549AED /* getset.h in Headers */, - 30CCAC692290472E00549AED /* blargg_endian.h in Headers */, - 30CCAC6A2290472E00549AED /* gfx.h in Headers */, - 30CCAC6B2290472E00549AED /* language.h in Headers */, - 30CCAC6C2290472E00549AED /* logger.h in Headers */, - 30CCAC6D2290472E00549AED /* memmap.h in Headers */, - 30CCAC6E2290472E00549AED /* messages.h in Headers */, - 30CCAC6F2290472E00549AED /* missing.h in Headers */, - 30CCAC702290472E00549AED /* movie.h in Headers */, - 30CCAC712290472E00549AED /* obc1.h in Headers */, - 307C861322D27C53001B879E /* tileimpl.h in Headers */, - 30CCAC722290472E00549AED /* pixform.h in Headers */, - 30CCAC732290472E00549AED /* port.h in Headers */, - 30CCAC742290472E00549AED /* ppu.h in Headers */, - 30CCAC752290472E00549AED /* stream.h in Headers */, - 30CCAC762290472E00549AED /* sa1.h in Headers */, - 30CCAC772290472E00549AED /* sar.h in Headers */, - 30CCAC782290472E00549AED /* screenshot.h in Headers */, - 30CCAC792290472E00549AED /* sdd1.h in Headers */, - 30CCAC7A2290472E00549AED /* sdd1emu.h in Headers */, - 30CCAC7B2290472E00549AED /* seta.h in Headers */, - 30CCAC7C2290472E00549AED /* snapshot.h in Headers */, - 30CCAC7D2290472E00549AED /* snes9x.h in Headers */, - 30CCAC7E2290472E00549AED /* spc7110.h in Headers */, - 30CCAC7F2290472E00549AED /* srtc.h in Headers */, - 30CCAC802290472E00549AED /* tile.h in Headers */, - 30CCAC812290472E00549AED /* 2xsai.h in Headers */, - 30CCAC822290472E00549AED /* blit.h in Headers */, - 30CCAC832290472E00549AED /* epx.h in Headers */, - 30CCAC842290472E00549AED /* hq2x.h in Headers */, - 30CCAC852290472E00549AED /* snes_ntsc.h in Headers */, - 30CCAC862290472E00549AED /* snes_ntsc_config.h in Headers */, - 30CCAC872290472E00549AED /* snes_ntsc_impl.h in Headers */, - 30CCAC882290472E00549AED /* crypt.h in Headers */, - 30CCAC892290472E00549AED /* ioapi.h in Headers */, - 30CCAC8A2290472E00549AED /* unzip.h in Headers */, - 30CCAC8B2290472E00549AED /* 7z.h in Headers */, - 30CCAC8C2290472E00549AED /* aribitcd.h in Headers */, - 30CCAC8D2290472E00549AED /* ariconst.h in Headers */, - 30CCAC8E2290472E00549AED /* ariprice.h in Headers */, - 30CCAC8F2290472E00549AED /* btreecd.h in Headers */, - 30CCAC902290472E00549AED /* crc32.h in Headers */, - 30CCAC912290472E00549AED /* blargg_config.h in Headers */, - 30CCAC922290472E00549AED /* iiostrm.h in Headers */, - 30CCAC932290472E00549AED /* blargg_common.h in Headers */, - 30CCAC942290472E00549AED /* inbyte.h in Headers */, - 30CCAC952290472E00549AED /* jma.h in Headers */, - 30CCAC962290472E00549AED /* lencoder.h in Headers */, - 30CCAC972290472E00549AED /* litcoder.h in Headers */, - 30CCAC982290472E00549AED /* resampler.h in Headers */, - 30CCAC992290472E00549AED /* lzma.h in Headers */, - 30CCAC9A2290472E00549AED /* smp.hpp in Headers */, - 30CCAC9B2290472E00549AED /* lzmadec.h in Headers */, - 30CCAC9C2290472E00549AED /* portable.h in Headers */, - 30CCAC9D2290472E00549AED /* rcdefs.h in Headers */, - 30CCAC9E2290472E00549AED /* rngcoder.h in Headers */, - 30CCAC9F2290472E00549AED /* s9x-jma.h in Headers */, - 30CCACA02290472E00549AED /* winout.h in Headers */, - 30CCACA12290472E00549AED /* mac-appleevent.h in Headers */, - 30CCACA22290472E00549AED /* mac-audio.h in Headers */, - 30CCACA32290472E00549AED /* mac-cart.h in Headers */, - 30CCACA42290472E00549AED /* mac-cheat.h in Headers */, - 30CCACA52290472E00549AED /* mac-cheatfinder.h in Headers */, - 30CCACA72290472E00549AED /* mac-cocoatools.h in Headers */, - 30CCACA82290472E00549AED /* mac-controls.h in Headers */, - 30CCACA92290472E00549AED /* mac-coreimage.h in Headers */, - 30CCACAB2290472E00549AED /* mac-file.h in Headers */, - 30CCACAC2290472E00549AED /* mac-gworld.h in Headers */, - 30CCACAD2290472E00549AED /* mac-joypad.h in Headers */, - 30CCACAE2290472E00549AED /* mac-keyboard.h in Headers */, - 30CCACAF2290472E00549AED /* apu.h in Headers */, - 30CCACB02290472E00549AED /* mac-multicart.h in Headers */, - 30CCACB12290472E00549AED /* mac-musicbox.h in Headers */, - 30CCACB22290472E00549AED /* mac-netplay.h in Headers */, - 30CCACB32290472E00549AED /* mac-os.h in Headers */, - 30CCACB42290472E00549AED /* mac-prefs.h in Headers */, - 30CCACB62290472E00549AED /* mac-render.h in Headers */, - 30CCACB72290472E00549AED /* msu1.h in Headers */, - 30CCACB82290472E00549AED /* mac-screenshot.h in Headers */, - 30CCACBA2290472E00549AED /* mac-snes9x.h in Headers */, - 30CCACBB2290472E00549AED /* mac-stringtools.h in Headers */, - 30CCACBC2290472E00549AED /* mac-prefix.h in Headers */, - 30CCACBD2290472E00549AED /* mac-global_prefix.h in Headers */, - 30CCACBE2290472E00549AED /* HID_Utilities_External.h in Headers */, - 30CCACBF2290472E00549AED /* zconf.h in Headers */, - 30CCACC02290472E00549AED /* zlib.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 30D15CEA22CE6B5A005BC352 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 30D15DB322CE6BC9005BC352 /* port.h in Headers */, 30D15CF322CE6B5A005BC352 /* snes9x_framework.h in Headers */, + 30714729230E387700917F82 /* mac-os.h in Headers */, 30D15D9522CE6BC9005BC352 /* sha256.h in Headers */, 30D15D9622CE6BC9005BC352 /* bml.h in Headers */, 30D15D9722CE6BC9005BC352 /* 65c816.h in Headers */, @@ -1278,7 +952,6 @@ 30D15DB022CE6BC9005BC352 /* msu1.h in Headers */, 30D15DB122CE6BC9005BC352 /* obc1.h in Headers */, 30D15DB222CE6BC9005BC352 /* pixform.h in Headers */, - 30D15DB322CE6BC9005BC352 /* port.h in Headers */, 30D15DB422CE6BC9005BC352 /* ppu.h in Headers */, 30D15DB522CE6BC9005BC352 /* stream.h in Headers */, 30D15DB622CE6BC9005BC352 /* sa1.h in Headers */, @@ -1336,25 +1009,22 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 30CCAC512290472E00549AED /* Snes9x */ = { + 30714714230E379500917F82 /* Snes9x */ = { isa = PBXNativeTarget; - buildConfigurationList = 30CCAD3E2290472E00549AED /* Build configuration list for PBXNativeTarget "Snes9x" */; + buildConfigurationList = 30714723230E379600917F82 /* Build configuration list for PBXNativeTarget "Snes9x" */; buildPhases = ( - 30CCAC522290472E00549AED /* Headers */, - 30CCACC12290472E00549AED /* Resources */, - 30CCACD72290472E00549AED /* Sources */, - 30CCAD2F2290472E00549AED /* Frameworks */, - 30CCAD3D2290472E00549AED /* Rez */, - 30D15CFB22CE6B5A005BC352 /* Embed Frameworks */, + 30714711230E379500917F82 /* Sources */, + 30714712230E379500917F82 /* Frameworks */, + 30714713230E379500917F82 /* Resources */, ); buildRules = ( ); dependencies = ( - 30D15CF522CE6B5A005BC352 /* PBXTargetDependency */, + 30714727230E379C00917F82 /* PBXTargetDependency */, ); name = Snes9x; - productName = "¬´PROJECTNAME»"; - productReference = 30CCAD412290472E00549AED /* Snes9x.app */; + productName = Snes9x; + productReference = 30714715230E379500917F82 /* Snes9x.app */; productType = "com.apple.product-type.application"; }; 30D15CEE22CE6B5A005BC352 /* snes9x framework */ = { @@ -1381,8 +1051,17 @@ 20286C28FDCF999611CA2CEA /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftUpdateCheck = 1030; LastUpgradeCheck = 1020; TargetAttributes = { + 30714714230E379500917F82 = { + CreatedOnToolsVersion = 10.3; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 0; + }; + }; + }; 30D15CEE22CE6B5A005BC352 = { CreatedOnToolsVersion = 10.2.1; }; @@ -1397,43 +1076,25 @@ de, ja, en, + Base, ); mainGroup = 20286C29FDCF999611CA2CEA /* Snes9x CVS */; projectDirPath = ""; projectRoot = ..; targets = ( - 30CCAC512290472E00549AED /* Snes9x */, 30D15CEE22CE6B5A005BC352 /* snes9x framework */, + 30714714230E379500917F82 /* Snes9x */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 30CCACC12290472E00549AED /* Resources */ = { + 30714713230E379500917F82 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 30CCACC22290472E00549AED /* APPL.icns in Resources */, - 30CCACC32290472E00549AED /* CART.icns in Resources */, - 30CCACC42290472E00549AED /* SRAM.icns in Resources */, - 30CCACC52290472E00549AED /* SAVE.icns in Resources */, - 30CCACC62290472E00549AED /* folder_SRAMs.icns in Resources */, - 30CCACC72290472E00549AED /* folder_Freezes.icns in Resources */, - 30CCACC82290472E00549AED /* icons.png in Resources */, - 30CCACC92290472E00549AED /* logo_freeze.png in Resources */, - 30CCACCA2290472E00549AED /* logo_defrost.png in Resources */, - 30CCACCB2290472E00549AED /* musicbox_indicator.png in Resources */, - 30CCACCC2290472E00549AED /* musicbox_pause.png in Resources */, - 30CCACCD2290472E00549AED /* musicbox_rewind.png in Resources */, - 30CCACCE2290472E00549AED /* musicbox_effect.png in Resources */, - 30CCACCF2290472E00549AED /* musicbox_ledon.icns in Resources */, - 30CCACD02290472E00549AED /* musicbox_ledoff.icns in Resources */, - 30CCACD12290472E00549AED /* freeze_defrost.aiff in Resources */, - 30CCACD22290472E00549AED /* InfoPlist.strings in Resources */, - 30CCACD32290472E00549AED /* Localizable.strings in Resources */, - 30CCACD42290472E00549AED /* Snes9x.xib in Resources */, - 30CCACD52290472E00549AED /* musicbox.xib in Resources */, - 30CCACD62290472E00549AED /* Snes9x Help in Resources */, + 3071471B230E379600917F82 /* Assets.xcassets in Resources */, + 3071471E230E379600917F82 /* MainMenu.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1446,107 +1107,13 @@ }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXRezBuildPhase section */ - 30CCAD3D2290472E00549AED /* Rez */ = { - isa = PBXRezBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXRezBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ - 30CCACD72290472E00549AED /* Sources */ = { + 30714711230E379500917F82 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 30CCACD82290472E00549AED /* bsx.cpp in Sources */, - 30CCACD92290472E00549AED /* c4.cpp in Sources */, - 30CCACDA2290472E00549AED /* c4emu.cpp in Sources */, - 30CCACDB2290472E00549AED /* cheats.cpp in Sources */, - 307C861722D27C53001B879E /* tileimpl-h2x1.cpp in Sources */, - 30CCACDC2290472E00549AED /* cheats2.cpp in Sources */, - 30CCACDD2290472E00549AED /* clip.cpp in Sources */, - 30CCACDE2290472E00549AED /* apu.cpp in Sources */, - 30CCACDF2290472E00549AED /* controls.cpp in Sources */, - 30CCACE02290472E00549AED /* cpu.cpp in Sources */, - 30CCACE12290472E00549AED /* cpuexec.cpp in Sources */, - 30CCACE22290472E00549AED /* cpuops.cpp in Sources */, - 30CCACE32290472E00549AED /* crosshairs.cpp in Sources */, - 30CCACE42290472E00549AED /* debug.cpp in Sources */, - 30CCACE52290472E00549AED /* dma.cpp in Sources */, - 30CCACE62290472E00549AED /* dsp.cpp in Sources */, - 30CCACE72290472E00549AED /* dsp1.cpp in Sources */, - 30CCACE82290472E00549AED /* dsp2.cpp in Sources */, - 30CCACE92290472E00549AED /* dsp3.cpp in Sources */, - 30CCACEA2290472E00549AED /* dsp4.cpp in Sources */, - 30CCACEB2290472E00549AED /* fxemu.cpp in Sources */, - 30CCACEC2290472E00549AED /* fxinst.cpp in Sources */, - 30CCACED2290472E00549AED /* gfx.cpp in Sources */, - 30CCACEE2290472E00549AED /* globals.cpp in Sources */, - 30CCACEF2290472E00549AED /* loadzip.cpp in Sources */, - 30CCACF02290472E00549AED /* logger.cpp in Sources */, - 30CCACF12290472E00549AED /* memmap.cpp in Sources */, - 30CCACF22290472E00549AED /* movie.cpp in Sources */, - 30CCACF32290472E00549AED /* obc1.cpp in Sources */, - 30CCACF42290472E00549AED /* ppu.cpp in Sources */, - 30CCACF52290472E00549AED /* stream.cpp in Sources */, - 30CCACF62290472E00549AED /* sa1.cpp in Sources */, - 30CCACF72290472E00549AED /* sa1cpu.cpp in Sources */, - 30CCACF82290472E00549AED /* sdd1.cpp in Sources */, - 30CCACF92290472E00549AED /* sdd1emu.cpp in Sources */, - 30CCACFA2290472E00549AED /* msu1.cpp in Sources */, - 30CCACFB2290472E00549AED /* seta.cpp in Sources */, - 30CCACFC2290472E00549AED /* seta010.cpp in Sources */, - 30CCACFD2290472E00549AED /* seta011.cpp in Sources */, - 30CCACFE2290472E00549AED /* seta018.cpp in Sources */, - 30CCACFF2290472E00549AED /* snapshot.cpp in Sources */, - 30CCAD002290472E00549AED /* spc7110.cpp in Sources */, - 30CCAD012290472E00549AED /* srtc.cpp in Sources */, - 30CCAD022290472E00549AED /* tile.cpp in Sources */, - 30CCAD032290472E00549AED /* 2xsai.cpp in Sources */, - 30CCAD042290472E00549AED /* blit.cpp in Sources */, - 30CCAD052290472E00549AED /* epx.cpp in Sources */, - 30CCAD062290472E00549AED /* hq2x.cpp in Sources */, - 30CCAD072290472E00549AED /* snes_ntsc.c in Sources */, - 30CCAD082290472E00549AED /* ioapi.c in Sources */, - 30CCAD092290472E00549AED /* unzip.c in Sources */, - 30CCAD0A2290472E00549AED /* 7zlzma.cpp in Sources */, - 30CCAD0B2290472E00549AED /* crc32.cpp in Sources */, - 30CCAD0C2290472E00549AED /* iiostrm.cpp in Sources */, - 30CCAD0D2290472E00549AED /* inbyte.cpp in Sources */, - 30CCAD0E2290472E00549AED /* jma.cpp in Sources */, - 30CCAD0F2290472E00549AED /* lzma.cpp in Sources */, - 30CCAD102290472E00549AED /* lzmadec.cpp in Sources */, - 30CCAD112290472E00549AED /* s9x-jma.cpp in Sources */, - 30CCAD122290472E00549AED /* winout.cpp in Sources */, - 30CCAD132290472E00549AED /* mac-appleevent.mm in Sources */, - 30CCAD142290472E00549AED /* mac-audio.mm in Sources */, - 30CCAD152290472E00549AED /* mac-cart.mm in Sources */, - 30CCAD162290472E00549AED /* mac-cheat.mm in Sources */, - 30CCAD172290472E00549AED /* smp.cpp in Sources */, - 30CCAD182290472E00549AED /* mac-cheatfinder.mm in Sources */, - 30CCAD1A2290472E00549AED /* mac-cocoatools.mm in Sources */, - 30CCAD1B2290472E00549AED /* mac-controls.mm in Sources */, - 30CCAD1C2290472E00549AED /* mac-coreimage.mm in Sources */, - 30CCAD1D2290472E00549AED /* smp_state.cpp in Sources */, - 30CCAD1E2290472E00549AED /* sdsp.cpp in Sources */, - 30CCAD202290472E00549AED /* mac-file.mm in Sources */, - 30CCAD212290472E00549AED /* mac-gworld.mm in Sources */, - 30CCAD222290472E00549AED /* mac-joypad.mm in Sources */, - 30CCAD232290472E00549AED /* mac-keyboard.mm in Sources */, - 30CCAD242290472E00549AED /* mac-multicart.mm in Sources */, - 30CCAD252290472E00549AED /* mac-musicbox.mm in Sources */, - 30CCAD262290472E00549AED /* mac-netplay.mm in Sources */, - 30CCAD272290472E00549AED /* mac-os.mm in Sources */, - 307C861522D27C53001B879E /* tileimpl-n2x1.cpp in Sources */, - 30CCAD282290472E00549AED /* mac-prefs.mm in Sources */, - 30CCAD2A2290472E00549AED /* mac-render.mm in Sources */, - 30CCAD2B2290472E00549AED /* mac-screenshot.mm in Sources */, - 30CCAD2D2290472E00549AED /* mac-snes9x.mm in Sources */, - 30CCAD2E2290472E00549AED /* mac-stringtools.mm in Sources */, - 307C861122D27C53001B879E /* tileimpl-n1x1.cpp in Sources */, + 30714721230E379600917F82 /* main.m in Sources */, + 30714719230E379500917F82 /* AppDelegate.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1648,14 +1215,30 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 30D15CF522CE6B5A005BC352 /* PBXTargetDependency */ = { + 30714727230E379C00917F82 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 30D15CEE22CE6B5A005BC352 /* snes9x framework */; - targetProxy = 30D15CF422CE6B5A005BC352 /* PBXContainerItemProxy */; + targetProxy = 30714726230E379C00917F82 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + 30714706230E372B00917F82 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 30714707230E372B00917F82 /* Base */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; + 3071471C230E379600917F82 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 3071471D230E379600917F82 /* Base */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; CF14733C132DA4E1000D0F91 /* Snes9x.xib */ = { isa = PBXVariantGroup; children = ( @@ -1664,14 +1247,6 @@ name = Snes9x.xib; sourceTree = ""; }; - CF46BEA8133E2559005A17A5 /* musicbox.xib */ = { - isa = PBXVariantGroup; - children = ( - 30AD1D2222FBB2EA000EE989 /* en */, - ); - name = musicbox.xib; - sourceTree = ""; - }; EA3BEA980A28384E00A8FAE5 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( @@ -1699,103 +1274,84 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 30CCAD3F2290472E00549AED /* Release */ = { + 30714724230E379600917F82 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_IDENTITY = "-"; - DEAD_CODE_STRIPPING = YES; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - GCC_MODEL_TUNING = ""; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 3; - GCC_PREFIX_HEADER = "mac-global_prefix.h"; - GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_STRICT_ALIASING = YES; - GCC_UNROLL_LOOPS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; - GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; - GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; - GCC_WARN_MISSING_PARENTHESES = YES; - GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; - GCC_WARN_SIGN_COMPARE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNKNOWN_PRAGMAS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_LABEL = YES; - GCC_WARN_UNUSED_VALUE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = Info.plist; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = Snes9x/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = ( - ., - "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", - ); - LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\""; - MACOSX_DEPLOYMENT_TARGET = 10.11; - OTHER_CFLAGS = ( - "-fomit-frame-pointer", - "-fast", - ); + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.snes9x.macos.snes9x; PRODUCT_NAME = "$(TARGET_NAME)"; - WARNING_CFLAGS = "-Wfloat-equal"; + SDKROOT = macosx; + VALID_ARCHS = x86_64; }; name = Release; }; - 30CCAD402290472E00549AED /* Debug */ = { + 30714725230E379600917F82 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = YES; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_MODEL_TUNING = ""; - GCC_NO_COMMON_BLOCKS = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREFIX_HEADER = "mac-global_prefix.h"; - GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_STRICT_ALIASING = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; - GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; - GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; - GCC_WARN_MISSING_PARENTHESES = YES; - GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; - GCC_WARN_SIGN_COMPARE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNKNOWN_PRAGMAS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_LABEL = YES; - GCC_WARN_UNUSED_VALUE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = ( - ., - "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", ); - LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\""; - MACOSX_DEPLOYMENT_TARGET = 10.11; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = Snes9x/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.snes9x.macos.snes9x; PRODUCT_NAME = "$(TARGET_NAME)"; - WARNING_CFLAGS = "-Wfloat-equal"; + SDKROOT = macosx; + VALID_ARCHS = x86_64; }; name = Debug; }; @@ -1803,6 +1359,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -1827,6 +1384,8 @@ ENABLE_NS_ASSERTIONS = NO; FRAMEWORK_VERSION = A; GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "mac-global_prefix.h"; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "snes9x framework/Info.plist"; @@ -1839,6 +1398,7 @@ MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; + OTHER_CFLAGS = "-DGL_SILENCE_DEPRECATION"; PRODUCT_BUNDLE_IDENTIFIER = "com.snes9x.macos.snes9x-framework"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = macosx; @@ -1852,6 +1412,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -1877,6 +1438,8 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "mac-global_prefix.h"; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -1893,6 +1456,7 @@ MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; + OTHER_CFLAGS = "-DGL_SILENCE_DEPRECATION"; PRODUCT_BUNDLE_IDENTIFIER = "com.snes9x.macos.snes9x-framework"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = macosx; @@ -1973,11 +1537,11 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 30CCAD3E2290472E00549AED /* Build configuration list for PBXNativeTarget "Snes9x" */ = { + 30714723230E379600917F82 /* Build configuration list for PBXNativeTarget "Snes9x" */ = { isa = XCConfigurationList; buildConfigurations = ( - 30CCAD3F2290472E00549AED /* Release */, - 30CCAD402290472E00549AED /* Debug */, + 30714724230E379600917F82 /* Release */, + 30714725230E379600917F82 /* Debug */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/macosx/snes9x.xcodeproj/project.xcworkspace/xcuserdata/buckley.xcuserdatad/UserInterfaceState.xcuserstate b/macosx/snes9x.xcodeproj/project.xcworkspace/xcuserdata/buckley.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 0d623c3dec198e2149131850a5cfe720c1a8d723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103377 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 t=5LdVUAHlN8?(1L9E4omm~-*}1