From d877d0a95b0dd85d1c001152758184c9c111d3a2 Mon Sep 17 00:00:00 2001 From: markgrebe Date: Wed, 16 Jun 2004 02:30:32 +0000 Subject: [PATCH] This commit was generated by cvs2svn to compensate for changes in r269, which included commits to RCS files with non-trunk default branches. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@270 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba --- stella/src/macosx/.DS_Store | Bin 0 -> 12292 bytes stella/src/macosx/AboutBox.h | 30 + stella/src/macosx/AboutBox.m | 193 ++ stella/src/macosx/AboutBox.nib/classes.nib | 14 + stella/src/macosx/AboutBox.nib/info.nib | 16 + .../src/macosx/AboutBox.nib/keyedobjects.nib | Bin 0 -> 6682 bytes stella/src/macosx/AboutBoxTextView.h | 13 + stella/src/macosx/AboutBoxTextView.m | 26 + stella/src/macosx/Credits.html | 50 + stella/src/macosx/English.lproj/.DS_Store | Bin 0 -> 6148 bytes .../macosx/English.lproj/InfoPlist.strings | Bin 0 -> 520 bytes stella/src/macosx/Menus.h | 47 + stella/src/macosx/Menus.m | 301 ++ stella/src/macosx/Preferences.h | 22 + stella/src/macosx/Preferences.m | 80 + stella/src/macosx/READMEbuild.txt | 31 + stella/src/macosx/SDLMain.h | 16 + stella/src/macosx/SDLMain.m | 238 ++ stella/src/macosx/SDLMain.nib/.DS_Store | Bin 0 -> 6148 bytes stella/src/macosx/SDLMain.nib/classes.nib | 49 + stella/src/macosx/SDLMain.nib/info.nib | 22 + stella/src/macosx/SDLMain.nib/objects.nib | Bin 0 -> 7570 bytes stella/src/macosx/SettingsMACOSX.cxx | 122 + stella/src/macosx/SettingsMACOSX.hxx | 86 + stella/src/macosx/Stella.icns | Bin 0 -> 52008 bytes stella/src/macosx/build/.DS_Store | Bin 0 -> 6148 bytes stella/src/macosx/mainSDL.cxx | 1177 ++++++++ stella/src/macosx/stella.pbproj/.DS_Store | Bin 0 -> 6148 bytes .../macosx/stella.pbproj/TemplateInfo.plist | 12 + .../src/macosx/stella.pbproj/project.pbxproj | 2586 +++++++++++++++++ 30 files changed, 5131 insertions(+) create mode 100644 stella/src/macosx/.DS_Store create mode 100644 stella/src/macosx/AboutBox.h create mode 100644 stella/src/macosx/AboutBox.m create mode 100644 stella/src/macosx/AboutBox.nib/classes.nib create mode 100644 stella/src/macosx/AboutBox.nib/info.nib create mode 100644 stella/src/macosx/AboutBox.nib/keyedobjects.nib create mode 100644 stella/src/macosx/AboutBoxTextView.h create mode 100644 stella/src/macosx/AboutBoxTextView.m create mode 100644 stella/src/macosx/Credits.html create mode 100644 stella/src/macosx/English.lproj/.DS_Store create mode 100755 stella/src/macosx/English.lproj/InfoPlist.strings create mode 100755 stella/src/macosx/Menus.h create mode 100755 stella/src/macosx/Menus.m create mode 100755 stella/src/macosx/Preferences.h create mode 100755 stella/src/macosx/Preferences.m create mode 100644 stella/src/macosx/READMEbuild.txt create mode 100755 stella/src/macosx/SDLMain.h create mode 100755 stella/src/macosx/SDLMain.m create mode 100644 stella/src/macosx/SDLMain.nib/.DS_Store create mode 100644 stella/src/macosx/SDLMain.nib/classes.nib create mode 100644 stella/src/macosx/SDLMain.nib/info.nib create mode 100644 stella/src/macosx/SDLMain.nib/objects.nib create mode 100644 stella/src/macosx/SettingsMACOSX.cxx create mode 100644 stella/src/macosx/SettingsMACOSX.hxx create mode 100644 stella/src/macosx/Stella.icns create mode 100644 stella/src/macosx/build/.DS_Store create mode 100644 stella/src/macosx/mainSDL.cxx create mode 100644 stella/src/macosx/stella.pbproj/.DS_Store create mode 100644 stella/src/macosx/stella.pbproj/TemplateInfo.plist create mode 100755 stella/src/macosx/stella.pbproj/project.pbxproj diff --git a/stella/src/macosx/.DS_Store b/stella/src/macosx/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e16232a0cd4ce3f59325f97a25eae85a7fb25ace GIT binary patch literal 12292 zcmeHLOKuZE5Pcnj2sjof8?ph-2@tH<8pl~6VSyBc*oF8%Xfk8rG0rZ&4M*V+9D*aj ztL_%+`Pp6}gsZLY8qL(}s(RHu<7xn=yBxg$P5~UTi+t4LP}AhO^h!JMcb-xj;(;7p zWVpdI%qrS?Lm5y8lmTTx8BhlP1qS%dmUh(e-FHuQR0foRy<|Y%4-vb_j+bjE?W==> zEdeMGdD}K#vktJB$jgqGYbPy~bGqumc&PCuhH-E{k3^la-J?>zrRkh;ULKdd@ft+lKt^7+jv!vxh`VNlM?2* z#!iYDgA(pX33pP#y~miR3^_g!J;qAT8;WySe=h@ncbTKk|8S1GWNAr@2}VV0Mm%oN zoUG#K0gqG!;$iyLzEy!>&dF-AO0slHg)i*ElX$q8`#Hjcm}8t#bBqyv%CWGgE;+7| z6uq-td<(c};~Xibj3Xv$MqGk9XUg!oh_o5p5jk26lR=gx65j>`4WYE?_7&Ypae*G* z(4`?0d{c5qX#N=lau0ompE4;n_@cIiZC*BN*Ce~3-Nrjh?t~VE+DGKcSM$K zS`Tjn5AXZv`<{!+vX+FH&4`i>>s^RwRczQTxMi6(q6$m4L8~F>C-h{@g`3;FPswec z8~qG#dH-Yc3NYUT#av=9!q9H+G9IOU)Jsl1M;DwvL!YbSY!?e8B1==Z;_n6Syv kK^ag6lmTTx8Bhk40cAiLPzIC%Wk4BF29yD1;J;zuH$Z>5djJ3c literal 0 HcmV?d00001 diff --git a/stella/src/macosx/AboutBox.h b/stella/src/macosx/AboutBox.h new file mode 100644 index 000000000..4099f16fa --- /dev/null +++ b/stella/src/macosx/AboutBox.h @@ -0,0 +1,30 @@ +/* AboutBox.h - Header for About Box + window class and support functions for the + Macintosh OS X SDL port of Stella + Mark Grebe + +*/ +/* $Id: AboutBox.h,v 1.1.1.1 2004-06-16 02:30:30 markgrebe Exp $ */ + + +#import + +@interface AboutBox : NSObject +{ + IBOutlet id appNameField; + IBOutlet id creditsField; + IBOutlet id versionField; + NSTimer *scrollTimer; + float currentPosition; + float maxScrollHeight; + NSTimeInterval startTime; + BOOL restartAtTop; +} + ++ (AboutBox *)sharedInstance; +- (IBAction)showPanel:(id)sender; +- (void)scrollCredits; +- (void)clicked; +- (void)doubleClicked; + +@end diff --git a/stella/src/macosx/AboutBox.m b/stella/src/macosx/AboutBox.m new file mode 100644 index 000000000..5610e2fe3 --- /dev/null +++ b/stella/src/macosx/AboutBox.m @@ -0,0 +1,193 @@ +/* AboutBox.m - AboutBox window + class and support functions for the + Macintosh OS X SDL port of Stella + Mark Grebe +*/ +/* $Id: AboutBox.m,v 1.1.1.1 2004-06-16 02:30:30 markgrebe Exp $ */ + +#import "AboutBox.h"; + +static int boxDisplayed = FALSE; +static int shouldScroll = TRUE; + +/*------------------------------------------------------------------------------ +* AboutBoxScroll - Function call which is called from main emulator loop +* If About Box is key window, and scrolling hasn't been stop, it will +* call the scrollCredits method to advance the scroll. +*-----------------------------------------------------------------------------*/ +void AboutBoxScroll(void) +{ + if (boxDisplayed && shouldScroll) + [[AboutBox sharedInstance] scrollCredits]; +} + +@implementation AboutBox + +static AboutBox *sharedInstance = nil; + ++ (AboutBox *)sharedInstance +{ + return sharedInstance ? sharedInstance : [[self alloc] init]; +} + +- (id)init +{ + if (sharedInstance) { + [self dealloc]; + } else { + sharedInstance = [super init]; + } + + return sharedInstance; +} + +/*------------------------------------------------------------------------------ +* showPanel - Display the About Box. +*-----------------------------------------------------------------------------*/ +- (IBAction)showPanel:(id)sender +{ + NSRect creditsBounds; + + if (!appNameField) + { + NSWindow *theWindow; + NSString *creditsPath; + NSAttributedString *creditsString; + NSString *appName; + NSString *versionString; + NSDictionary *infoDictionary; + CFBundleRef localInfoBundle; + NSDictionary *localInfoDict; + + if (![NSBundle loadNibNamed:@"AboutBox" owner:self]) + { + NSLog( @"Failed to load AboutBox.nib" ); + NSBeep(); + return; + } + theWindow = [appNameField window]; + + // Get the info dictionary (Info.plist) + infoDictionary = [[NSBundle mainBundle] infoDictionary]; + + + // Get the localized info dictionary (InfoPlist.strings) + localInfoBundle = CFBundleGetMainBundle(); + localInfoDict = (NSDictionary *) + CFBundleGetLocalInfoDictionary( localInfoBundle ); + + // Setup the app name field + appName = @"StellaOSX"; + [appNameField setStringValue:appName]; + + // Set the about box window title + [theWindow setTitle:[NSString stringWithFormat:@"About %@", appName]]; + + // Setup the version field + versionString = [infoDictionary objectForKey:@"CFBundleVersion"]; + [versionField setStringValue:[NSString stringWithFormat:@"Version %@", + versionString]]; + + // Setup our credits + creditsPath = [[NSBundle mainBundle] pathForResource:@"Credits" + ofType:@"html"]; + + creditsString = [[NSAttributedString alloc] initWithPath:creditsPath + documentAttributes:nil]; + + [creditsField replaceCharactersInRange:NSMakeRange( 0, 0 ) + withRTF:[creditsString RTFFromRange: + NSMakeRange( 0, [creditsString length] ) + documentAttributes:nil]]; + + // Prepare some scroll info + creditsBounds = [creditsField bounds]; + maxScrollHeight = creditsBounds.size.height*2.75; + + // Setup the window + [theWindow setExcludedFromWindowsMenu:YES]; + [theWindow setMenu:nil]; + [theWindow center]; + + } + + if (![[appNameField window] isVisible]) + { + currentPosition = 0; + restartAtTop = NO; + [creditsField scrollPoint:NSMakePoint( 0, 0 )]; + } + + // Show the window + [[appNameField window] makeKeyAndOrderFront:nil]; + +} + +/*------------------------------------------------------------------------------ +* windowDidBecomeKey - Start the scrolling when the about box is displayed. +*-----------------------------------------------------------------------------*/ +- (void)windowDidBecomeKey:(NSNotification *)notification +{ + boxDisplayed = TRUE; + shouldScroll = TRUE; +} + +/*------------------------------------------------------------------------------ +* windowDidResignKey - Stop the scrolling when the about box is gone. +*-----------------------------------------------------------------------------*/ +- (void)windowDidResignKey:(NSNotification *)notification +{ + boxDisplayed = FALSE; +} + +/*------------------------------------------------------------------------------ +* scrollCredits - Perform the scrolling. +*-----------------------------------------------------------------------------*/ +- (void)scrollCredits +{ + if (restartAtTop) + { + restartAtTop = NO; + + // Set the position + [creditsField scrollPoint:NSMakePoint( 0, 0 )]; + + return; + } + if (currentPosition >= maxScrollHeight) + { + // Reset the position + currentPosition = 0; + restartAtTop = YES; + } + else + { + // Scroll to the position + [creditsField scrollPoint:NSMakePoint( 0, currentPosition )]; + + // Increment the scroll position + currentPosition += 0.25; + } +} + +/*------------------------------------------------------------------------------ +* clicked - Starts/stops scrolling on mouse click in about box text view. +*-----------------------------------------------------------------------------*/ +- (void)clicked +{ + shouldScroll = !shouldScroll; +} + +/*------------------------------------------------------------------------------ +* clicked - Restarts at start of about box on double mouse click in about box +* text view. +*-----------------------------------------------------------------------------*/ +- (void)doubleClicked +{ + shouldScroll = !shouldScroll; + currentPosition = 0; + restartAtTop = YES; +} + +@end + diff --git a/stella/src/macosx/AboutBox.nib/classes.nib b/stella/src/macosx/AboutBox.nib/classes.nib new file mode 100644 index 000000000..f940e90b9 --- /dev/null +++ b/stella/src/macosx/AboutBox.nib/classes.nib @@ -0,0 +1,14 @@ +{ + IBClasses = ( + { + ACTIONS = {scrollClick = id; }; + CLASS = AboutBox; + LANGUAGE = ObjC; + OUTLETS = {appNameField = id; creditsField = id; versionField = id; }; + SUPERCLASS = NSObject; + }, + {CLASS = AboutBoxTextView; LANGUAGE = ObjC; SUPERCLASS = NSTextView; }, + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/stella/src/macosx/AboutBox.nib/info.nib b/stella/src/macosx/AboutBox.nib/info.nib new file mode 100644 index 000000000..180149545 --- /dev/null +++ b/stella/src/macosx/AboutBox.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBDocumentLocation + 395 603 356 240 0 0 1280 1002 + IBFramework Version + 349.0 + IBOpenObjects + + 20 + + IBSystem Version + 7F44 + + diff --git a/stella/src/macosx/AboutBox.nib/keyedobjects.nib b/stella/src/macosx/AboutBox.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..c791dec8a2f2f0089c602d7e4e907c6872593949 GIT binary patch literal 6682 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
  • @@5(oG^T0_{#8&;akH`hMx_;8h$q_ zjTU2X<3QtJW3n;Dm~9+oEHF+oRvBj+>x_QmLgQV=RmOG3M~&N!yNrj7hmA*#XN3r>G*gBt%T#EZU@9?9Gc}kRO+nKd(=(2TxvzPUIoX_IPBo{S zGtJrN9PB$MeN}2|tmq<{S7%KFH7ETluB@z5HtaNq#5)E`Nysl>dSM z-J-CVEh8=CER!rVEDe@MOVBdM616m2S}Y4Ji!945_gFStwp(^sUbF169I%|UDy>Fq zcdOHyXic&XvJSD1wU%3FSnI73>x0%utdCi@Sf8?Pvu?NUx1P5CVm)uu+mdVpYy)kh zZEl;#CfK&xUbnqvd)xMo?K9hH+ZnsT-rb&Qzs8| zj-X?XBjRXs%yqOn+8phU`HlsSg^rsYw>lO(mN=F=?sP13EO)GMtaPk#tOx0j +*/ +/* $Id: AboutBoxTextView.h,v 1.1.1.1 2004-06-16 02:30:30 markgrebe Exp $ */ + +#import + +@interface AboutBoxTextView : NSTextView +{ +} +@end diff --git a/stella/src/macosx/AboutBoxTextView.m b/stella/src/macosx/AboutBoxTextView.m new file mode 100644 index 000000000..ada80a526 --- /dev/null +++ b/stella/src/macosx/AboutBoxTextView.m @@ -0,0 +1,26 @@ +/* AboutBoxTextView.m - + AboutBoxTextView view class for the + Macintosh OS X SDL port of Stella + Mark Grebe +*/ +/* $Id: AboutBoxTextView.m,v 1.1.1.1 2004-06-16 02:30:30 markgrebe Exp $ */ + +#import "AboutBoxTextView.h" +#import "AboutBox.h" + +@implementation AboutBoxTextView +/*------------------------------------------------------------------------------ +* mouseDown - This method notifies the AboutBox class of a mouse click, then +* calls the normal text view mouseDown. +*-----------------------------------------------------------------------------*/ +- (void)mouseDown:(NSEvent *)theEvent +{ + if ([theEvent clickCount] >= 2) + [[AboutBox sharedInstance] doubleClicked]; + else + [[AboutBox sharedInstance] clicked]; + [super mouseDown:theEvent]; +} + + +@end diff --git a/stella/src/macosx/Credits.html b/stella/src/macosx/Credits.html new file mode 100644 index 000000000..45257d15c --- /dev/null +++ b/stella/src/macosx/Credits.html @@ -0,0 +1,50 @@ + + + + Acknowledgements + + + +
    +

    +
    +
    +
    +StellaOSX
    +
    +
    Copyright © 1996-2003 Bradford W. Mott
    +
    +
    Stella Main Web Page
    +http://stella.sourceforge.net
    +
    +
    Macintosh OS X version by Mark Grebe
    +
    Copyright © 2004
    +
    +
    Current active members of the Stella development team:
    +    Bradford Mott (Original Author)
    +    Steve Anthony (Current Maintainer)
    +    Mark Grebe  (Mac OSX)
    +
    +Graphics by Simple DirectMedia Layer library
    +http://www.libsdl.org
    +
    +This program is free software; you can redistribute it and/or
    +modify it under the terms of the GNU General Public License
    +as published by the Free Software Fuoundation;  either version 2
    +of the License, or (at your option) any later version.
    +
    + This program is distributed in the hope that it will be useful,
    +but WITHOUT ANY WARRENTY; without even the
    +implied warranty of MERCHANTABILITY or
    +FITNESS FOR A PARTICULAR PURPOSE. 
    +See the GNU General Public License for more details.
    +
    +  You should have received a copy of the GNU General
    +Public License with this program; if not, write to the:
    +Free Software Foundation, Inc.,
    +59 Temple Place - Suite 330,
    +Boston, MA 02111-1307, USA.
    +
    +
    + + diff --git a/stella/src/macosx/English.lproj/.DS_Store b/stella/src/macosx/English.lproj/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c0482546f324c6150c0e0bf7cb4b3da9ce99c9fd GIT binary patch literal 6148 zcmeH~u}T9$5QhKJ6akx9X}M1z_y$XeMLNL;P@*WpkprXsb$RUg&&(MT|=49@psbj2&KaG0FZu;I*e%V~a=h zqk7-vg}ZI>gx$L9?>Ak)VYdI&Tl(1{j5C=Ch=2%)fCz}d?+JMCrOi)LHHv@;h`=WS z|2`DDYi&BD#;1crTmh&vhQm0Iy9Bj(fLfalsf^GpOQ~6E?TTSp&Uk5gwds(W<*+!J z`?Qm--B2t}XS_r@tfp!d0TCDzIL_t5`~MaFhx`AyNGlN#fqzB7W~-aklCRWy>*VFU v*B1I6{ll0W=^UaJQ==7g;jQ@mOJ4CgpVy{CYLqh`N1q*# literal 0 HcmV?d00001 diff --git a/stella/src/macosx/English.lproj/InfoPlist.strings b/stella/src/macosx/English.lproj/InfoPlist.strings new file mode 100755 index 0000000000000000000000000000000000000000..696d6cf5695cb3a6816d867caa0464c71706ec5d GIT binary patch literal 520 zcmb`EOAoBv67}ey{B_#&P=a2 zl@-XStDRZl0^WBG0h0Uu>gs^33 zyUuszmPb7O{!_1%EB5i-CZjETBpRX@kyfOsPppCOJ*hgEF)6s5-?MY+8TEM1@)SQE UPvLlAQvQ=s3r35EB?<5R4!>+z5&!@I literal 0 HcmV?d00001 diff --git a/stella/src/macosx/Menus.h b/stella/src/macosx/Menus.h new file mode 100755 index 000000000..ecb50e842 --- /dev/null +++ b/stella/src/macosx/Menus.h @@ -0,0 +1,47 @@ +/* Menus.h - Header for Menus + window class and support functions for the + Macintosh OS X SDL port of Stella + Mark Grebe + +*/ +/* $Id: Menus.h,v 1.1.1.1 2004-06-16 02:30:30 markgrebe Exp $ */ + +#import + +@interface Menus : NSObject { + IBOutlet id limitSpeedMenu; + IBOutlet id paddlesMenu; + IBOutlet id filterMenu; + IBOutlet id videoModeMatrix; + IBOutlet id volumeSlider; + IBOutlet id aspectRatioField; + int openGlEnabled; + int gameMenusEnabled; +} + ++ (Menus *)sharedInstance; +- (void)setSpeedLimitMenu:(int)limit; +- (void)initVideoMenu:(int)openGl; +- (void)setPaddleMenu:(int)number; +- (void)prefsStart; +- (void)enableGameMenus; +- (void)pushKeyEvent:(int)key:(bool)shift; +- (IBAction) paddleChange:(id) sender; +- (IBAction) prefsOK:(id) sender; +- (IBAction)prefsMenu:(id)sender; +- (IBAction)biggerScreen:(id)sender; +- (IBAction)smallerScreen:(id)sender; +- (IBAction)fullScreen:(id)sender; +- (IBAction)openCart:(id)sender; +- (IBAction)speedLimit:(id)sender; +- (IBAction)pauseGame:(id)sender; +- (IBAction)ntscPalMode:(id)sender; +- (IBAction)togglePallette:(id)sender; +- (IBAction)toggleGlFilter:(id)sender; +- (IBAction)grabMouse:(id)sender; +- (IBAction)xStartPlus:(id)sender; +- (IBAction)xStartMinus:(id)sender; +- (IBAction)yStartPlus:(id)sender; +- (IBAction)yStartMinus:(id)sender; + +@end diff --git a/stella/src/macosx/Menus.m b/stella/src/macosx/Menus.m new file mode 100755 index 000000000..bc1b922b0 --- /dev/null +++ b/stella/src/macosx/Menus.m @@ -0,0 +1,301 @@ +/* Menus.m - Menus window + class and support functions for the + Macintosh OS X SDL port of Stella + Mark Grebe + +*/ +/* $Id: Menus.m,v 1.1.1.1 2004-06-16 02:30:30 markgrebe Exp $ */ + +#import +#import "Menus.h" +#import "SDL.h" + +#define QZ_m 0x2E +#define QZ_o 0x1F +#define QZ_h 0x04 +#define QZ_SLASH 0x2C +#define QZ_COMMA 0x2B + +extern void setPaddleMode(int mode); +extern void getPrefsSettings(int *gl, int *volume, float *aspect); +extern void setPrefsSettings(int gl, int volume, float aspect); + +/*------------------------------------------------------------------------------ +* releaseCmdKeys - This method fixes an issue when modal windows are used with +* the Mac OSX version of the SDL library. +* As the SDL normally captures all keystrokes, but we need to type in some +* Mac windows, all of the control menu windows run in modal mode. However, +* when this happens, the release of the command key and the shortcut key +* are not sent to SDL. We have to manually cause these events to happen +* to keep the SDL library in a sane state, otherwise only everyother shortcut +* keypress will work. +*-----------------------------------------------------------------------------*/ +void releaseCmdKeys(NSString *character, int keyCode) +{ + NSEvent *event1, *event2; + NSPoint point; + + event1 = [NSEvent keyEventWithType:NSKeyUp location:point modifierFlags:0 + timestamp:nil windowNumber:0 context:nil characters:character + charactersIgnoringModifiers:character isARepeat:NO keyCode:keyCode]; + [NSApp postEvent:event1 atStart:NO]; + + event2 = [NSEvent keyEventWithType:NSFlagsChanged location:point modifierFlags:0 + timestamp:nil windowNumber:0 context:nil characters:nil + charactersIgnoringModifiers:nil isARepeat:NO keyCode:0]; + [NSApp postEvent:event2 atStart:NO]; +} + +/*------------------------------------------------------------------------------ +* browseFile - This allows the user to chose a file to read in. +*-----------------------------------------------------------------------------*/ +char *browseFile(void) { + NSOpenPanel *openPanel = nil; + char *fileName; + + fileName = malloc(FILENAME_MAX); + if (fileName == NULL) + return NULL; + + openPanel = [NSOpenPanel openPanel]; + [openPanel setCanChooseDirectories:NO]; + [openPanel setCanChooseFiles:YES]; + + if ([openPanel runModalForDirectory:nil file:nil types:nil] == NSOKButton) { + [[[openPanel filenames] objectAtIndex:0] getCString:fileName]; + releaseCmdKeys(@"o",QZ_o); + return fileName; + } + else { + releaseCmdKeys(@"o",QZ_o); + return NULL; + } + } + +void prefsStart(void) +{ + [[Menus sharedInstance] prefsStart]; + releaseCmdKeys(@",",QZ_m); +} + +void hideApp(void) { + [NSApp hide:nil]; + releaseCmdKeys(@"h",QZ_h); +} + +void showHelp(void) { + [NSApp showHelp:nil]; + releaseCmdKeys(@"?",QZ_SLASH); +} + +void miniturizeWindow(void) { + [[NSApp keyWindow] performMiniaturize:nil]; + releaseCmdKeys(@"m",QZ_m); +} + +void initVideoMenu(int openGl) +{ + [[Menus sharedInstance] initVideoMenu:openGl]; +} + +void setPaddleMenu(int number) +{ + if (number < 4) + [[Menus sharedInstance] setPaddleMenu:number]; +} + +void setSpeedLimitMenu(int limit) +{ + [[Menus sharedInstance] setSpeedLimitMenu:limit]; +} + +void enableGameMenus(void) +{ + [[Menus sharedInstance] enableGameMenus]; +} + +@implementation Menus + +static Menus *sharedInstance = nil; + ++ (Menus *)sharedInstance { + return sharedInstance ? sharedInstance : [[self alloc] init]; +} + +- (id)init +{ + sharedInstance = self; + gameMenusEnabled = 0; + return(self); +} + +- (void)setSpeedLimitMenu:(int)limit +{ + if (limit) + [limitSpeedMenu setState:NSOnState]; + else + [limitSpeedMenu setState:NSOffState]; +} + +- (void)setPaddleMenu:(int)number +{ + int i; + + for (i=0;i<4;i++) + [[paddlesMenu itemAtIndex:i] setState:NSOffState]; + if (number < 4) + [[paddlesMenu itemAtIndex:number] setState:NSOnState]; +} + +- (void)initVideoMenu:(int)openGl +{ + openGlEnabled = openGl; +} + +- (void)enableGameMenus +{ + gameMenusEnabled = 1; +} + +- (IBAction) paddleChange:(id) sender +{ + setPaddleMode([sender tag]); + [self setPaddleMenu:[sender tag]]; +} + +- (void) prefsStart +{ + int gl, volume; + float aspectRatio; + + getPrefsSettings(&gl, &volume, &aspectRatio); + + [volumeSlider setIntValue:volume]; + [videoModeMatrix selectCellWithTag:gl]; + [aspectRatioField setFloatValue:aspectRatio]; + + [NSApp runModalForWindow:[volumeSlider window]]; + + gl = [[videoModeMatrix selectedCell] tag]; + volume = [volumeSlider intValue]; + aspectRatio = [aspectRatioField floatValue]; + + setPrefsSettings(gl, volume, aspectRatio); +} + +- (IBAction) prefsOK:(id) sender +{ + [NSApp stopModal]; + [[volumeSlider window] close]; +} +- (IBAction)prefsMenu:(id)sender +{ + [[Menus sharedInstance] prefsStart]; +} + +-(void)pushKeyEvent:(int)key:(bool)shift +{ + SDL_Event theEvent; + + theEvent.key.type = SDL_KEYDOWN; + theEvent.key.state = SDL_PRESSED; + theEvent.key.keysym.scancode = 0; + theEvent.key.keysym.sym = key; + theEvent.key.keysym.mod = KMOD_LMETA; + if (shift) + theEvent.key.keysym.mod |= KMOD_LSHIFT; + theEvent.key.keysym.unicode = 0; + SDL_PushEvent(&theEvent); +} + +- (IBAction)biggerScreen:(id)sender +{ + [self pushKeyEvent:SDLK_EQUALS:NO]; +} + +- (IBAction)smallerScreen:(id)sender +{ + [self pushKeyEvent:SDLK_MINUS:NO]; +} + +- (IBAction)fullScreen:(id)sender +{ + [self pushKeyEvent:SDLK_RETURN:NO]; +} + +- (IBAction)openCart:(id)sender +{ + [self pushKeyEvent:SDLK_o:NO]; +} + +- (IBAction)speedLimit:(id)sender +{ + [self pushKeyEvent:SDLK_l:NO]; +} + +- (IBAction)pauseGame:(id)sender +{ + [self pushKeyEvent:SDLK_p:NO]; +} + +- (IBAction)ntscPalMode:(id)sender +{ + [self pushKeyEvent:SDLK_f:YES]; +} + +- (IBAction)toggleGlFilter:(id)sender +{ + [self pushKeyEvent:SDLK_f:NO]; +} + +- (IBAction)togglePallette:(id)sender +{ + [self pushKeyEvent:SDLK_p:YES]; +} + +- (IBAction)grabMouse:(id)sender +{ + [self pushKeyEvent:SDLK_g:NO]; +} + +- (IBAction)xStartPlus:(id)sender +{ + [self pushKeyEvent:SDLK_HOME:NO]; +} + +- (IBAction)xStartMinus:(id)sender +{ + [self pushKeyEvent:SDLK_END:NO]; +} + +- (IBAction)yStartPlus:(id)sender +{ + [self pushKeyEvent:SDLK_PAGEUP:NO]; +} + +- (IBAction)yStartMinus:(id)sender +{ + [self pushKeyEvent:SDLK_PAGEDOWN:NO]; +} + +- (BOOL)validateMenuItem:(id )menuItem +{ + if (gameMenusEnabled) { + if ([[menuItem title] isEqualToString:@"Toggle Open GL Filter"]) { + if (openGlEnabled) + return YES; + else + return NO; + } + else + return YES; + } + else { + if ([[menuItem title] isEqualToString:@"Open New CartridgeÉ"] || + [[menuItem title] isEqualToString:@"Preferences..."]) + return YES; + else + return NO; + } +} +@end diff --git a/stella/src/macosx/Preferences.h b/stella/src/macosx/Preferences.h new file mode 100755 index 000000000..de8427f3d --- /dev/null +++ b/stella/src/macosx/Preferences.h @@ -0,0 +1,22 @@ +/* Preferences.h - Header for Preferences + class and support functions for the + Macintosh OS X SDL port of Stella + Mark Grebe + + Based on the Preferences pane of the + TextEdit application. + +*/ +/* $Id: Preferences.h,v 1.1.1.1 2004-06-16 02:30:30 markgrebe Exp $ */ +#import + +@interface Preferences : NSObject { + NSUserDefaults *defaults; /* Defaults pointer */ +} + ++ (Preferences *)sharedInstance; +- (void)setString:(char *)key:(char *)value; +- (void)getString:(char *)key:(char *)value; +- (void)save; + +@end diff --git a/stella/src/macosx/Preferences.m b/stella/src/macosx/Preferences.m new file mode 100755 index 000000000..605a3b04f --- /dev/null +++ b/stella/src/macosx/Preferences.m @@ -0,0 +1,80 @@ +/* Preferences.m - Preferences + class and support functions for the + Macintosh OS X SDL port of Stella + Mark Grebe + + Based on the Preferences pane of the + TextEdit application. + +*/ +/* $Id: Preferences.m,v 1.1.1.1 2004-06-16 02:30:30 markgrebe Exp $ */ + +#import +#import "Preferences.h" +#import "SDL.h" + +void prefsSetString(char *key, char *value) +{ + [[Preferences sharedInstance] setString:key:value]; +} + +void prefsGetString(char *key, char *value) +{ + [[Preferences sharedInstance] getString:key:value]; +} + +void prefsSave(void) +{ + [[Preferences sharedInstance] save]; +} + +@implementation Preferences + +static Preferences *sharedInstance = nil; + ++ (Preferences *)sharedInstance { + return sharedInstance ? sharedInstance : [[self alloc] init]; +} + +- (id)init +{ + defaults = [NSUserDefaults standardUserDefaults]; + sharedInstance = self; + return(self); +} + +- (void)setString:(char *)key:(char *)value +{ + NSNumber *theValue; + NSString *theKey; + + theKey = [NSString stringWithCString:key]; + theValue = [NSString stringWithCString:value]; + [defaults setObject:theValue forKey:theKey]; + [theKey release]; + [theValue release]; +} + +- (void)getString:(char *)key:(char *)value +{ + NSString *theKey; + NSString *theValue; + + theKey = [NSString stringWithCString:key]; + theValue = [defaults objectForKey:theKey]; + if (theValue == nil) + value[0] = 0; + else { + [theValue getCString:value maxLength:1023]; + [theKey release]; + } +} + +- (void)save +{ + [defaults synchronize]; +} + + + +@end diff --git a/stella/src/macosx/READMEbuild.txt b/stella/src/macosx/READMEbuild.txt new file mode 100644 index 000000000..74ce75efd --- /dev/null +++ b/stella/src/macosx/READMEbuild.txt @@ -0,0 +1,31 @@ +README for Building StellaOSX +----------------------------- + +StellaOSX is configured to be built using Xcode. The project file for doing +this is in this directory, named stella.pbproj. + +The project links the application with two external static libraries. + +The first of these is SDL. The project expects a copy of the SDL.Framework to +be present in the macosx directory. It will then link against this +framework, and place a copy of the framework in the Application bundle. The +current version of the SDL framework may be downloaded from www.libsdl.org. The +current release is linked against version 1.2.7 for MacOSX. The SDL framework +may be located else where, but the project include and copy framework settings +would need to be changed. + +The second library which the application is linked libpng. The library source +may be downloaded from http://www.libpng.org/pub/png/libpng.html. I am +currently using version 1.2.5. The source will need to be built for MacOSX +(but not necessarily installed). The following files will then need to +be placed in the stella/src/macosx diretory: + + libpng.a + png.h + pngconf.h + +Finally, the application is going to + +Mark Grebe + +$Id: READMEbuild.txt,v 1.1.1.1 2004-06-16 02:30:30 markgrebe Exp $ diff --git a/stella/src/macosx/SDLMain.h b/stella/src/macosx/SDLMain.h new file mode 100755 index 000000000..7fdc81c72 --- /dev/null +++ b/stella/src/macosx/SDLMain.h @@ -0,0 +1,16 @@ +/* SDLMain.h - main entry point for our Cocoa-ized SDL app + Initial Version: Darrell Walisser + Non-NIB-Code & other changes: Max Horn + + Feel free to customize this file to suit your needs +*/ +/* $Id: SDLMain.h,v 1.1.1.1 2004-06-16 02:30:30 markgrebe Exp $ */ + +#import + +@interface SDLMain : NSObject +{ +} ++ (SDLMain *)sharedInstance; + +@end diff --git a/stella/src/macosx/SDLMain.m b/stella/src/macosx/SDLMain.m new file mode 100755 index 000000000..9e1de9c01 --- /dev/null +++ b/stella/src/macosx/SDLMain.m @@ -0,0 +1,238 @@ +/* SDLMain.m - main entry point for our Cocoa-ized SDL app + Initial Version: Darrell Walisser + Non-NIB-Code & other changes: Max Horn + + Feel free to customize this file to suit your needs +*/ +/* $Id: SDLMain.m,v 1.1.1.1 2004-06-16 02:30:30 markgrebe Exp $ */ + +#import "SDL.h" +#import "SDLMain.h" +#import "Preferences.h" +#import /* for MAXPATHLEN */ +#import + +extern int stellaMain(int argc, char* argv[]); + +static int gArgc; +static char **gArgv; +static BOOL gFinderLaunch; +static BOOL started=NO; +static char startupFile[FILENAME_MAX]; +int fileToLoad = FALSE; + +/* A helper category for NSString */ +@interface NSString (ReplaceSubString) +- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString; +@end + +@interface SDLApplication : NSApplication +@end + +@implementation SDLApplication +/* Invoked from the Quit menu item */ +- (void)terminate:(id)sender +{ + /* Post a SDL_QUIT event */ + SDL_Event event; + event.type = SDL_QUIT; + SDL_PushEvent(&event); +} +@end + + +/* The main class of the application, the application's delegate */ +@implementation SDLMain + +static SDLMain *sharedInstance = nil; + ++ (SDLMain *)sharedInstance { + return sharedInstance; +} + +/* Set the working directory to the .app's parent directory */ +- (void) setupWorkingDirectory:(BOOL)shouldChdir +{ + char parentdir[MAXPATHLEN]; + char *c; + + strncpy ( parentdir, gArgv[0], sizeof(parentdir) ); + c = (char*) parentdir; + + while (*c != '\0') /* go to end */ + c++; + + while (*c != '/') /* back up to parent */ + c--; + + *c++ = '\0'; /* cut off last part (binary name) */ + + if (shouldChdir) + { + assert ( chdir (parentdir) == 0 ); /* chdir to the binary app's parent */ + assert ( chdir ("../../../") == 0 ); /* chdir to the .app's parent */ + } +} + +/* Fix menu to contain the real app name instead of "SDL App" */ +- (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName +{ + NSRange aRange; + NSEnumerator *enumerator; + NSMenuItem *menuItem; + + aRange = [[aMenu title] rangeOfString:@"SDL App"]; + if (aRange.length != 0) + [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:appName]]; + + enumerator = [[aMenu itemArray] objectEnumerator]; + while ((menuItem = [enumerator nextObject])) + { + aRange = [[menuItem title] rangeOfString:@"SDL App"]; + if (aRange.length != 0) + [menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:appName]]; + if ([menuItem hasSubmenu]) + [self fixMenu:[menuItem submenu] withAppName:appName]; + } + [ aMenu sizeToFit ]; +} + +char *appName = "StellaOSX"; +char fileName[FILENAME_MAX]; + +/* Called when the internal event loop has just started running */ +- (void) applicationDidFinishLaunching: (NSNotification *) note +{ + int status; + char *args[2]; + + started = YES; + + /* Set the working directory to the .app's parent directory */ + [self setupWorkingDirectory:gFinderLaunch]; + + /* Set the main menu to contain the real app name instead of "SDL App" */ + [self fixMenu:[NSApp mainMenu] withAppName:[[NSProcessInfo processInfo] processName]]; + + /* Hand off to main application code */ + args[0] = appName; + if (fileToLoad) + args[1] = startupFile; + else + args[1] = NULL; + status = stellaMain(2,args); + + /* We're done, thank you for playing */ + exit(status); +} + +/*------------------------------------------------------------------------------ +* application openFile - Open a file dragged to the application. +*-----------------------------------------------------------------------------*/ +- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename +{ + SDL_Event event; + char *cFilename; + + if (started) { + cFilename = malloc(FILENAME_MAX); + if (cFilename) + { + [filename getCString:cFilename]; + event.type = SDL_USEREVENT; + event.user.code = 1; + event.user.data1 = cFilename; + event.user.data2 = 0; + SDL_PushEvent(&event); + } + } + else { + fileToLoad = TRUE; + [filename getCString:startupFile]; + } + + return(FALSE); +} + +@end + + +@implementation NSString (ReplaceSubString) + +- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString +{ + unsigned int bufferSize; + unsigned int selfLen = [self length]; + unsigned int aStringLen = [aString length]; + unichar *buffer; + NSRange localRange; + NSString *result; + + bufferSize = selfLen + aStringLen - aRange.length; + buffer = NSAllocateMemoryPages(bufferSize*sizeof(unichar)); + + /* Get first part into buffer */ + localRange.location = 0; + localRange.length = aRange.location; + [self getCharacters:buffer range:localRange]; + + /* Get middle part into buffer */ + localRange.location = 0; + localRange.length = aStringLen; + [aString getCharacters:(buffer+aRange.location) range:localRange]; + + /* Get last part into buffer */ + localRange.location = aRange.location + aRange.length; + localRange.length = selfLen - localRange.location; + [self getCharacters:(buffer+aRange.location+aStringLen) range:localRange]; + + /* Build output string */ + result = [NSString stringWithCharacters:buffer length:bufferSize]; + + NSDeallocateMemoryPages(buffer, bufferSize); + + return result; +} + +@end + + + +#ifdef main +# undef main +#endif + +/* Main entry point to executable - should *not* be SDL_main! */ +int main (int argc, char **argv) +{ + static Preferences *myPrefs; + /* Copy the arguments into a global variable */ + int i; + + /* This is passed if we are launched by double-clicking */ + if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { + gArgc = 1; + gFinderLaunch = YES; + } else { + gArgc = argc; + gFinderLaunch = NO; + } + gArgv = (char**) malloc (sizeof(*gArgv) * (gArgc+1)); + assert (gArgv != NULL); + for (i = 0; i < gArgc; i++) + gArgv[i] = argv[i]; + gArgv[i] = NULL; + + myPrefs = [Preferences sharedInstance]; + + [SDLApplication poseAsClass:[NSApplication class]]; + NSApplicationMain (argc, argv); + return 0; +} + +/* Routine to center the application window */ +void centerAppWindow(void) +{ + [[[SDLApplication sharedApplication] keyWindow] center]; +} + diff --git a/stella/src/macosx/SDLMain.nib/.DS_Store b/stella/src/macosx/SDLMain.nib/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..803d86d12b92cbce69d825abf053dd9f43035dd0 GIT binary patch literal 6148 zcmeH~!Ab)$5Qb;8hr(WZ(~FQN5PXBB)PrXqK;2cLvbcxpJ@4tm=>N}*#jbl45t)JH zPm`Hs^Ffo0i0JzD{z7CWB1;sivN2=qo*g<0=VPea96NcCot(?FY-c9=i(UNoMtT|K z4qyKD`@5@Q?7Ly?;6Xe$C@1e`Xc5U4`+Sr!_B-*{vx$EL&rY5|sF#;LrD@dLB#JAg zC4nT61d>1!_(=k|vuVr5HR~jh1d_m>0MCblLTy8p>1e& z#RyD26zZWGDTaDD`b+q=q1DyHMI-spSot$~QCl7J7jqYFU9(OCN#KwGb6?ns_x~mS zGP6m(xnz|DlE8l@po`7*W{us&-TG~xylV@}Eeef(l?@o$2af>!;5l+?gFar^hF=?6 UT{#Q;EgYH;0Rxg%68HrIA40x0s{jB1 literal 0 HcmV?d00001 diff --git a/stella/src/macosx/SDLMain.nib/classes.nib b/stella/src/macosx/SDLMain.nib/classes.nib new file mode 100644 index 000000000..8d4a3e273 --- /dev/null +++ b/stella/src/macosx/SDLMain.nib/classes.nib @@ -0,0 +1,49 @@ +{ + IBClasses = ( + { + ACTIONS = {showPanel = id; }; + CLASS = AboutBox; + LANGUAGE = ObjC; + OUTLETS = {appNameField = id; creditsField = id; versionField = id; }; + SUPERCLASS = NSObject; + }, + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = { + biggerScreen = id; + fullScreen = id; + grabMouse = id; + leftJoyChange = id; + ntscPalMode = id; + openCart = id; + paddleChange = id; + pauseGame = id; + prefsMenu = id; + prefsOK = id; + rightJoyChange = id; + smallerScreen = id; + speedLimit = id; + toggleGlFilter = id; + togglePallette = id; + xStartMinus = id; + xStartPlus = id; + yStartMinus = id; + yStartPlus = id; + }; + CLASS = Menus; + LANGUAGE = ObjC; + OUTLETS = { + aspectRatioField = id; + filterMenu = id; + limitSpeedMenu = id; + paddlesMenu = id; + videoModeMatrix = id; + volumeSlider = id; + }; + SUPERCLASS = NSObject; + }, + {CLASS = Preferences; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = SDLMain; LANGUAGE = ObjC; SUPERCLASS = NSObject; } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/stella/src/macosx/SDLMain.nib/info.nib b/stella/src/macosx/SDLMain.nib/info.nib new file mode 100644 index 000000000..f05116f85 --- /dev/null +++ b/stella/src/macosx/SDLMain.nib/info.nib @@ -0,0 +1,22 @@ + + + + + IBDocumentLocation + 495 397 359 316 0 0 1280 1002 + IBEditorPositions + + 29 + 116 460 371 44 0 0 1280 1002 + + IBFramework Version + 349.0 + IBOpenObjects + + 29 + 578 + + IBSystem Version + 7H63 + + diff --git a/stella/src/macosx/SDLMain.nib/objects.nib b/stella/src/macosx/SDLMain.nib/objects.nib new file mode 100644 index 0000000000000000000000000000000000000000..2671fa26f33d9dd352ea4da2aa664ffe1843879f GIT binary patch literal 7570 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 +#include +#include + +#include +#include +#include + +#include "bspf.hxx" +#include "Console.hxx" +#include "EventHandler.hxx" +#include "StellaEvent.hxx" + +#include "Settings.hxx" +#include "SettingsMACOSX.hxx" + +extern "C" { +void prefsSetString(char *key, char *value); +void prefsGetString(char *key, char *value); +void prefsSave(void); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +SettingsMACOSX::SettingsMACOSX() +{ + // First set variables that the parent class needs + myBaseDir = "./"; + string stelladir = myBaseDir; + + myStateDir = stelladir + "state/"; + if(access(myStateDir.c_str(), R_OK|W_OK|X_OK) != 0 ) + mkdir(myStateDir.c_str(), 0777); + + myUserPropertiesFile = stelladir + "stella.pro"; + mySystemPropertiesFile = stelladir + "stella.pro"; + myUserConfigFile = ""; + mySystemConfigFile = ""; + + // Set up the names of the input and output config files + mySettingsOutputFilename = myUserConfigFile; + mySettingsInputFilename = myUserConfigFile; + + mySnapshotFile = ""; + myStateFile = ""; + + // Now create MacOSX specific settings +#ifdef SNAPSHOT_SUPPORT + set("ssdir", "./"); +#endif +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +SettingsMACOSX::~SettingsMACOSX() +{ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void SettingsMACOSX::usage(string& message) +{ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void SettingsMACOSX::loadConfig() +{ + string key, value; + char cvalue[1024]; + + // Write out each of the key and value pairs + for(uInt32 i = 0; i < mySize; ++i) + { + prefsGetString((char *) mySettings[i].key.c_str(),cvalue); + if (cvalue[0] != 0) + mySettings[i].value.assign(cvalue); + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void SettingsMACOSX::saveConfig() +{ + // Write out each of the key and value pairs + for(uInt32 i = 0; i < mySize; ++i) + if(mySettings[i].save) + { + prefsSetString((char *) mySettings[i].key.c_str(), + (char *) mySettings[i].value.c_str()); + } + prefsSave(); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +string SettingsMACOSX::stateFilename(const string& md5, uInt32 state) +{ + ostringstream buf; + buf << myStateDir << md5 << ".st" << state; + + myStateFile = buf.str(); + return myStateFile; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool SettingsMACOSX::fileExists(const string& filename) +{ + return (access(filename.c_str(), F_OK|W_OK) == 0); +} diff --git a/stella/src/macosx/SettingsMACOSX.hxx b/stella/src/macosx/SettingsMACOSX.hxx new file mode 100644 index 000000000..9e510fe47 --- /dev/null +++ b/stella/src/macosx/SettingsMACOSX.hxx @@ -0,0 +1,86 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-1999 by Bradford W. Mott +// +// See the file "license" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +// +// $Id: SettingsMACOSX.hxx,v 1.1.1.1 2004-06-16 02:30:30 markgrebe Exp $ +//============================================================================ + +#ifndef SETTINGS_MAC_OSX_HXX +#define SETTINGS_MAX_OSX_HXX + +#include "bspf.hxx" + +class Console; + + +/** + This class defines Macintosh OSX system specific settings. + + @author Mark Grebe + @version $Id: SettingsMACOSX.hxx,v 1.1.1.1 2004-06-16 02:30:30 markgrebe Exp $ +*/ +class SettingsMACOSX : public Settings +{ + public: + /** + Create a new UNIX settings object + */ + SettingsMACOSX(); + + /** + Destructor + */ + virtual ~SettingsMACOSX(); + + public: + /** + This method should be called to get the filename of a state file + given the state number. + + @return String representing the full path of the state filename. + */ + virtual string stateFilename(const string& md5, uInt32 state); + + /** + This method should be called to test whether the given file exists. + + @param filename The filename to test for existence. + + @return boolean representing whether or not the file exists + */ + virtual bool fileExists(const string& filename); + + /** + Display the commandline settings for this UNIX version of Stella. + + @param message A short message about this version of Stella + */ + virtual void usage(string& message); + + /** + This method should be called to load the current settings from the + standard Mac preferences. + */ + void loadConfig(); + + /** + This method should be called to save the current settings to the + standard Mac preferences. + */ + + void saveConfig(); + +}; + +#endif diff --git a/stella/src/macosx/Stella.icns b/stella/src/macosx/Stella.icns new file mode 100644 index 0000000000000000000000000000000000000000..b6f20f11984fe5fdb6c2be7f922f11003e18fce3 GIT binary patch literal 52008 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
      =xh2$6q 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 +#include +#include +#include +#include + +#ifdef HAVE_GETTIMEOFDAY + #include + #include +#endif + +#include + +#include "bspf.hxx" +#include "Console.hxx" +#include "Event.hxx" +#include "StellaEvent.hxx" +#include "EventHandler.hxx" +#include "FrameBuffer.hxx" +#include "FrameBufferSDL.hxx" +#include "FrameBufferSoft.hxx" +#include "PropsSet.hxx" +#include "Sound.hxx" +#include "SoundSDL.hxx" +#include "Settings.hxx" + +#ifdef DISPLAY_OPENGL + #include "FrameBufferGL.hxx" + + // Indicates whether to use OpenGL mode + static bool theUseOpenGLFlag; +#endif + +#include "SettingsMACOSX.hxx" + +extern "C" { +int stellaMain(int argc, char* argv[]); +void setPaddleMode(int mode); +void setLeftJoystickMode(int mode); +void setRightJoystickMode(int mode); +void getPrefsSettings(int *gl, int *volume, float *aspect); +void setPrefsSettings(int gl, int volume, float aspect); +char *browseFile(void); +void prefsStart(void); +void hideApp(void); +void showHelp(void); +void miniturizeWindow(void); +void centerAppWindow(void); +void setPaddleMenu(int number); +void setSpeedLimitMenu(int number); +void initVideoMenu(bool theUseOpenGLFlag); +void enableGameMenus(void); +void AboutBoxScroll(void); +} + +static void cleanup(); +static bool setupJoystick(); +static void handleEvents(); +static bool handleInitialEvents(); +static bool setupProperties(PropertiesSet& set); +static double Atari_time(void); + +#ifdef JOYSTICK_SUPPORT +// static uInt32 thePaddleNumber; + + // Lookup table for joystick numbers and events + StellaEvent::JoyStick joyList[StellaEvent::LastJSTICK] = { + StellaEvent::JSTICK_0, StellaEvent::JSTICK_1, StellaEvent::JSTICK_2, + StellaEvent::JSTICK_3, StellaEvent::JSTICK_5, StellaEvent::JSTICK_5 + }; + StellaEvent::JoyCode joyButtonList[StellaEvent::LastJCODE] = { + StellaEvent::JBUTTON_0, StellaEvent::JBUTTON_1, StellaEvent::JBUTTON_2, + StellaEvent::JBUTTON_3, StellaEvent::JBUTTON_4, StellaEvent::JBUTTON_5, + StellaEvent::JBUTTON_6, StellaEvent::JBUTTON_7, StellaEvent::JBUTTON_8, + StellaEvent::JBUTTON_9, StellaEvent::JBUTTON_10, StellaEvent::JBUTTON_11, + StellaEvent::JBUTTON_12, StellaEvent::JBUTTON_13, StellaEvent::JBUTTON_14, + StellaEvent::JBUTTON_15, StellaEvent::JBUTTON_16, StellaEvent::JBUTTON_17, + StellaEvent::JBUTTON_18, StellaEvent::JBUTTON_19 + }; + + enum JoyType { JT_NONE, JT_REGULAR, JT_STELLADAPTOR_1, JT_STELLADAPTOR_2 }; + + struct Stella_Joystick + { + SDL_Joystick* stick; + JoyType type; + }; + + static Stella_Joystick theJoysticks[StellaEvent::LastJSTICK]; + + // Static lookup tables for Stelladaptor axis support + static Event::Type SA_Axis[2][2][3] = { + Event::JoystickZeroLeft, Event::JoystickZeroRight, Event::PaddleZeroResistance, + Event::JoystickZeroUp, Event::JoystickZeroDown, Event::PaddleOneResistance, + Event::JoystickOneLeft, Event::JoystickOneRight, Event::PaddleTwoResistance, + Event::JoystickOneUp, Event::JoystickOneDown, Event::PaddleThreeResistance + }; + static Event::Type SA_DrivingValue[2] = { + Event::DrivingZeroValue, Event::DrivingOneValue + }; +#endif + +// Pointer to the console object or the null pointer +static Console* theConsole = (Console*) NULL; + +// Pointer to the display object or the null pointer +static FrameBufferSDL* theDisplay = (FrameBufferSDL*) NULL; + +// Pointer to the sound object or the null pointer +static Sound* theSound = (Sound*) NULL; + +// Pointer to the settings object or the null pointer +static Settings* theSettings = (Settings*) NULL; + +// Indicates if the mouse should be grabbed +static bool theGrabMouseIndicator = false; + +// Indicates if the mouse cursor should be hidden +static bool theHideCursorIndicator = false; + +// Indicates the current paddle mode +static Int32 thePaddleMode; + +// Indicates relative mouse position horizontally +static Int32 mouseX = 0; + +// Indicates whether to show information during program execution +static bool theShowInfoFlag; + +// Indicates user wants to play a new game, not quit +static bool newGame; + +// Indicates the time per frame, which is the inverse of the framerate +static double timePerFrame; + +// Pointer to hold the name of the next game to play +static char *gameFile; + +static bool fileToLoad = false; + + +struct Switches +{ + SDLKey scanCode; + StellaEvent::KeyCode keyCode; +}; + +// Place the most used keys first to speed up access +// Todo - initialize this array in the same order as the SDLK +// keys are defined, so it can be a constant-time LUT +static Switches keyList[] = { + { SDLK_F1, StellaEvent::KCODE_F1 }, + { SDLK_F2, StellaEvent::KCODE_F2 }, + { SDLK_F3, StellaEvent::KCODE_F3 }, + { SDLK_F4, StellaEvent::KCODE_F4 }, + { SDLK_F5, StellaEvent::KCODE_F5 }, + { SDLK_F6, StellaEvent::KCODE_F6 }, + { SDLK_F7, StellaEvent::KCODE_F7 }, + { SDLK_F8, StellaEvent::KCODE_F8 }, + { SDLK_F9, StellaEvent::KCODE_F9 }, + { SDLK_F10, StellaEvent::KCODE_F10 }, + { SDLK_F11, StellaEvent::KCODE_F11 }, + { SDLK_F12, StellaEvent::KCODE_F12 }, + { SDLK_F13, StellaEvent::KCODE_F13 }, + { SDLK_F14, StellaEvent::KCODE_F14 }, + { SDLK_F15, StellaEvent::KCODE_F15 }, + + { SDLK_UP, StellaEvent::KCODE_UP }, + { SDLK_DOWN, StellaEvent::KCODE_DOWN }, + { SDLK_LEFT, StellaEvent::KCODE_LEFT }, + { SDLK_RIGHT, StellaEvent::KCODE_RIGHT }, + { SDLK_SPACE, StellaEvent::KCODE_SPACE }, + { SDLK_LCTRL, StellaEvent::KCODE_LCTRL }, + { SDLK_RCTRL, StellaEvent::KCODE_RCTRL }, + { SDLK_LALT, StellaEvent::KCODE_LALT }, + { SDLK_RALT, StellaEvent::KCODE_RALT }, + { SDLK_LSUPER, StellaEvent::KCODE_LWIN }, + { SDLK_RSUPER, StellaEvent::KCODE_RWIN }, + { SDLK_MENU, StellaEvent::KCODE_MENU }, + + { SDLK_a, StellaEvent::KCODE_a }, + { SDLK_b, StellaEvent::KCODE_b }, + { SDLK_c, StellaEvent::KCODE_c }, + { SDLK_d, StellaEvent::KCODE_d }, + { SDLK_e, StellaEvent::KCODE_e }, + { SDLK_f, StellaEvent::KCODE_f }, + { SDLK_g, StellaEvent::KCODE_g }, + { SDLK_h, StellaEvent::KCODE_h }, + { SDLK_i, StellaEvent::KCODE_i }, + { SDLK_j, StellaEvent::KCODE_j }, + { SDLK_k, StellaEvent::KCODE_k }, + { SDLK_l, StellaEvent::KCODE_l }, + { SDLK_m, StellaEvent::KCODE_m }, + { SDLK_n, StellaEvent::KCODE_n }, + { SDLK_o, StellaEvent::KCODE_o }, + { SDLK_p, StellaEvent::KCODE_p }, + { SDLK_q, StellaEvent::KCODE_q }, + { SDLK_r, StellaEvent::KCODE_r }, + { SDLK_s, StellaEvent::KCODE_s }, + { SDLK_t, StellaEvent::KCODE_t }, + { SDLK_u, StellaEvent::KCODE_u }, + { SDLK_v, StellaEvent::KCODE_v }, + { SDLK_w, StellaEvent::KCODE_w }, + { SDLK_x, StellaEvent::KCODE_x }, + { SDLK_y, StellaEvent::KCODE_y }, + { SDLK_z, StellaEvent::KCODE_z }, + + { SDLK_0, StellaEvent::KCODE_0 }, + { SDLK_1, StellaEvent::KCODE_1 }, + { SDLK_2, StellaEvent::KCODE_2 }, + { SDLK_3, StellaEvent::KCODE_3 }, + { SDLK_4, StellaEvent::KCODE_4 }, + { SDLK_5, StellaEvent::KCODE_5 }, + { SDLK_6, StellaEvent::KCODE_6 }, + { SDLK_7, StellaEvent::KCODE_7 }, + { SDLK_8, StellaEvent::KCODE_8 }, + { SDLK_9, StellaEvent::KCODE_9 }, + + { SDLK_KP0, StellaEvent::KCODE_KP0 }, + { SDLK_KP1, StellaEvent::KCODE_KP1 }, + { SDLK_KP2, StellaEvent::KCODE_KP2 }, + { SDLK_KP3, StellaEvent::KCODE_KP3 }, + { SDLK_KP4, StellaEvent::KCODE_KP4 }, + { SDLK_KP5, StellaEvent::KCODE_KP5 }, + { SDLK_KP6, StellaEvent::KCODE_KP6 }, + { SDLK_KP7, StellaEvent::KCODE_KP7 }, + { SDLK_KP8, StellaEvent::KCODE_KP8 }, + { SDLK_KP9, StellaEvent::KCODE_KP9 }, + { SDLK_KP_PERIOD, StellaEvent::KCODE_KP_PERIOD }, + { SDLK_KP_DIVIDE, StellaEvent::KCODE_KP_DIVIDE }, + { SDLK_KP_MULTIPLY, StellaEvent::KCODE_KP_MULTIPLY}, + { SDLK_KP_MINUS, StellaEvent::KCODE_KP_MINUS }, + { SDLK_KP_PLUS, StellaEvent::KCODE_KP_PLUS }, + { SDLK_KP_ENTER, StellaEvent::KCODE_KP_ENTER }, + { SDLK_KP_EQUALS, StellaEvent::KCODE_KP_EQUALS }, + + { SDLK_BACKSPACE, StellaEvent::KCODE_BACKSPACE }, + { SDLK_TAB, StellaEvent::KCODE_TAB }, + { SDLK_CLEAR, StellaEvent::KCODE_CLEAR }, + { SDLK_RETURN, StellaEvent::KCODE_RETURN }, + { SDLK_ESCAPE, StellaEvent::KCODE_ESCAPE }, + { SDLK_COMMA, StellaEvent::KCODE_COMMA }, + { SDLK_MINUS, StellaEvent::KCODE_MINUS }, + { SDLK_PERIOD, StellaEvent::KCODE_PERIOD }, + { SDLK_SLASH, StellaEvent::KCODE_SLASH }, + { SDLK_BACKSLASH, StellaEvent::KCODE_BACKSLASH }, + { SDLK_SEMICOLON, StellaEvent::KCODE_SEMICOLON }, + { SDLK_EQUALS, StellaEvent::KCODE_EQUALS }, + { SDLK_QUOTE, StellaEvent::KCODE_QUOTE }, + { SDLK_BACKQUOTE, StellaEvent::KCODE_BACKQUOTE }, + { SDLK_LEFTBRACKET, StellaEvent::KCODE_LEFTBRACKET}, + { SDLK_RIGHTBRACKET,StellaEvent::KCODE_RIGHTBRACKET}, + + { SDLK_PRINT, StellaEvent::KCODE_PRTSCREEN }, + { SDLK_MODE, StellaEvent::KCODE_SCRLOCK }, + { SDLK_PAUSE, StellaEvent::KCODE_PAUSE }, + { SDLK_INSERT, StellaEvent::KCODE_INSERT }, + { SDLK_HOME, StellaEvent::KCODE_HOME }, + { SDLK_PAGEUP, StellaEvent::KCODE_PAGEUP }, + { SDLK_DELETE, StellaEvent::KCODE_DELETE }, + { SDLK_END, StellaEvent::KCODE_END }, + { SDLK_PAGEDOWN, StellaEvent::KCODE_PAGEDOWN } + }; + +void setPaddleMode(int mode) +{ + thePaddleMode = mode; + theSettings->setInt("paddle",thePaddleMode); +} + +void getPrefsSettings(int *gl, int *volume, float *aspect) +{ + if (theSettings->getString("video") == "gl") + *gl = 1; + else + *gl = 0; + + *volume = theSettings->getInt("volume"); + if (*volume == -1) + *volume = 100; + + *aspect = theSettings->getFloat("gl_aspect"); +} + +void setPrefsSettings(int gl, int volume, float aspect) +{ + if (gl) + theSettings->setString("video","gl"); + else + theSettings->setString("video","soft"); + + theSettings->setInt("volume",volume); + theSound->setVolume(volume); + + theSettings->setFloat("gl_aspect",aspect); +} + +/** + This routine should be called once setupDisplay is called + to create the joystick stuff. +*/ +bool setupJoystick() +{ +#ifdef JOYSTICK_SUPPORT + // Keep track of how many Stelladaptors we've found + uInt8 saCount = 0; + + // First clear the joystick array + for(uInt32 i = 0; i < StellaEvent::LastJSTICK; i++) + { + theJoysticks[i].stick = (SDL_Joystick*) NULL; + theJoysticks[i].type = JT_NONE; + } + + // Initialize the joystick subsystem + if((SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1) || (SDL_NumJoysticks() <= 0)) + { + if(theShowInfoFlag) + cout << "No joysticks present, use the keyboard.\n"; + + return true; + } + + // Try to open 4 regular joysticks and 2 Stelladaptor devices + uInt32 limit = SDL_NumJoysticks() <= StellaEvent::LastJSTICK ? + SDL_NumJoysticks() : StellaEvent::LastJSTICK; + for(uInt32 i = 0; i < limit; i++) + { + string name = SDL_JoystickName(i); + theJoysticks[i].stick = SDL_JoystickOpen(i); + + // Skip if we couldn't open it for any reason + if(theJoysticks[i].stick == NULL) + continue; + + // Figure out what type of joystick this is + if(name.find("Stelladaptor", 0) != string::npos) + { + saCount++; + if(saCount > 2) // Ignore more than 2 Stelladaptors + { + theJoysticks[i].type = JT_NONE; + continue; + } + else if(saCount == 1) + { + name = "Left Stelladaptor (Left joystick, Paddles 0 and 1, Left driving controller)"; + theJoysticks[i].type = JT_STELLADAPTOR_1; + } + else if(saCount == 2) + { + name = "Right Stelladaptor (Right joystick, Paddles 2 and 3, Right driving controller)"; + theJoysticks[i].type = JT_STELLADAPTOR_2; + } + + if(theShowInfoFlag) + cout << "Joystick " << i << ": " << name << endl; + } + else + { + theJoysticks[i].type = JT_REGULAR; + if(theShowInfoFlag) + { + cout << "Joystick " << i << ": " << SDL_JoystickName(i) + << " with " << SDL_JoystickNumButtons(theJoysticks[i].stick) + << " buttons.\n"; + } + } + } +#endif + + return true; +} + +/** + This routine is called to handle events if user cancels initial open panel +*/ +bool handleInitialEvents(void) +{ + SDL_Event event; + SDLKey key; + SDLMod mod; + bool status; + + // Check for an event + while(1) + { + while(SDL_PollEvent(&event)) + { + // keyboard events + if(event.type == SDL_KEYDOWN) + { + key = event.key.keysym.sym; + mod = event.key.keysym.mod; + + if((mod & KMOD_META) && !(mod & KMOD_SHIFT)) + { + if(key == SDLK_q) // Command-q quits + { + return(false); + } + else if(key == SDLK_o) // Command-o starts a new game + { + return(true); + } + } + } + else if(event.type == SDL_QUIT) + { + return(false); + } + } + AboutBoxScroll(); + usleep(16667); + } + return status; +} + +/** + This routine should be called regularly to handle events +*/ +void handleEvents() +{ + SDL_Event event; + Uint8 type; + SDLKey key; + SDLMod mod; + + // Check for an event + while(SDL_PollEvent(&event)) + { + // keyboard events + if(event.type == SDL_KEYDOWN) + { + key = event.key.keysym.sym; + mod = event.key.keysym.mod; + type = event.type; + + // An attempt to speed up event processing + // All SDL-specific event actions are accessed by either + // Control or Alt keys. So we quickly check for those. + if((mod & KMOD_META) && (mod & KMOD_SHIFT)) + { + if(key == SDLK_p) // Shift-Command-p toggles different palettes + { + theConsole->togglePalette(); + theDisplay->setupPalette(); + } + else if(key == SDLK_f) // Command-f toggles NTSC/PAL mode + { + theConsole->toggleFormat(); + theDisplay->setupPalette(); + } + } + else if((mod & KMOD_META) && !(mod & KMOD_SHIFT)) + { + if(key == SDLK_EQUALS) { + theDisplay->resize(1); + centerAppWindow(); + } + else if(key == SDLK_MINUS) { + theDisplay->resize(-1); + centerAppWindow(); + } + else if(key == SDLK_RETURN) + { + theDisplay->toggleFullscreen(); + centerAppWindow(); + } + else if(key == SDLK_q) // Command-q quits + { + newGame = false; + theConsole->eventHandler().sendEvent(Event::Quit, 1); + } + else if(key == SDLK_o) // Command-o starts a new game + { + char *file; + bool wasFullscreen; + + wasFullscreen = theDisplay->fullScreen(); + if (wasFullscreen) { + theDisplay->toggleFullscreen(); + centerAppWindow(); + } + theDisplay->grabMouse(false); + theDisplay->showCursor(true); + file = browseFile(); + if (file) + { + newGame = true; + fileToLoad = true; + gameFile = file; + if (wasFullscreen) { + theDisplay->toggleFullscreen(); + centerAppWindow(); + } + theConsole->eventHandler().sendEvent(Event::Quit, 1); + } + } + else if(key == SDLK_g) + { + // don't change grabmouse in fullscreen mode + if(!theDisplay->fullScreen()) + { + theGrabMouseIndicator = !theGrabMouseIndicator; + theSettings->setBool("grabmouse", theGrabMouseIndicator); + theDisplay->grabMouse(theGrabMouseIndicator); + theHideCursorIndicator = !theHideCursorIndicator; + theSettings->setBool("hidecursor", theHideCursorIndicator); + theDisplay->showCursor(!theHideCursorIndicator); + } + } +#ifdef DISPLAY_OPENGL + else if(key == SDLK_f && theUseOpenGLFlag) + ((FrameBufferGL*)theDisplay)->toggleFilter(); +#endif + else if(key == SDLK_l) // Command-l toggles frame limit + { + if (theSettings->getInt("framerate") != 10000000) + { + theSettings->setInt("framerate",10000000); + timePerFrame = 1.0 / 10000000.0; + setSpeedLimitMenu(0); + } + else + { + theSettings->setInt("framerate",60); + timePerFrame = 1.0 / 60.0; + setSpeedLimitMenu(1); + } + } + else if(key == SDLK_p) // Command-p toggles pause mode + { + theConsole->eventHandler().sendEvent(Event::Pause, 1); + } + else if(key == SDLK_h) // Command-h hides the application + { + if(!theDisplay->fullScreen()) + hideApp(); + } + else if(key == SDLK_m) // Command-m minimizes the window + { + if(!theDisplay->fullScreen()) + miniturizeWindow(); + } + else if(key == SDLK_COMMA) // Command-, runs the preferences pane. + { + if(!theDisplay->fullScreen()) + prefsStart(); + } + else if(key == SDLK_SLASH) // Command-? runs the help. + { + if(!theDisplay->fullScreen()) + showHelp(); + } + else if (key == SDLK_0) // Command-0 sets the mouse to paddle 0 + { + setPaddleMode(0); + setPaddleMenu(0); + } + else if (key == SDLK_1) // Command-0 sets the mouse to paddle 1 + { + setPaddleMode(1); + setPaddleMenu(1); + } + else if (key == SDLK_2) // Command-0 sets the mouse to paddle 2 + { + setPaddleMode(2); + setPaddleMenu(2); + } + else if (key == SDLK_3) // Command-0 sets the mouse to paddle 3 + { + setPaddleMode(3); + setPaddleMenu(3); + } +#ifdef DEVELOPER_SUPPORT + else if(key == SDLK_END) // Alt-End increases XStart + { + theConsole->changeXStart(1); + theDisplay->resize(0); + } + else if(key == SDLK_HOME) // Alt-Home decreases XStart + { + theConsole->changeXStart(0); + theDisplay->resize(0); + } + else if(key == SDLK_PAGEUP) // Alt-PageUp increases YStart + { + theConsole->changeYStart(1); + theDisplay->resize(0); + } + else if(key == SDLK_PAGEDOWN) // Alt-PageDown decreases YStart + { + theConsole->changeYStart(0); + theDisplay->resize(0); + } +#endif + } + else // check all the other keys + { + for(unsigned int i = 0; i < sizeof(keyList) / sizeof(Switches); ++i) + { + if(keyList[i].scanCode == key) + theConsole->eventHandler().sendKeyEvent(keyList[i].keyCode, 1); + } + } + } + else if(event.type == SDL_KEYUP) + { + key = event.key.keysym.sym; + type = event.type; + + for(unsigned int i = 0; i < sizeof(keyList) / sizeof(Switches); ++i) + { + if(keyList[i].scanCode == key) + theConsole->eventHandler().sendKeyEvent(keyList[i].keyCode, 0); + } + } + else if(event.type == SDL_MOUSEMOTION ) + { + Int32 resistance; + uInt32 zoom = theDisplay->zoomLevel(); + Int32 width = theDisplay->width() * zoom; + Event::Type type = Event::NoType; + + // Grabmouse and hidecursor introduce some lag into the mouse movement, + // so we need to fudge the numbers a bit + if(theGrabMouseIndicator && theHideCursorIndicator) + { + mouseX = (int)((float)mouseX + (float)event.motion.xrel + * 1.5 * (float) zoom); + } + else + { + mouseX = mouseX + event.motion.xrel * zoom; + } + + // Check to make sure mouseX is within the game window + if(mouseX < 0) + mouseX = 0; + else if(mouseX > width) + mouseX = width; + + resistance = (Int32)(1000000.0 * (width - mouseX) / width); + + // Now, set the event of the correct paddle to the calculated resistance + if(thePaddleMode == 0) + type = Event::PaddleZeroResistance; + else if(thePaddleMode == 1) + type = Event::PaddleOneResistance; + else if(thePaddleMode == 2) + type = Event::PaddleTwoResistance; + else if(thePaddleMode == 3) + type = Event::PaddleThreeResistance; + + theConsole->eventHandler().sendEvent(type, resistance); + } + else if(event.type == SDL_MOUSEBUTTONDOWN || event.type == SDL_MOUSEBUTTONUP) + { + Event::Type type = Event::LastType; + Int32 value; + + if(event.type == SDL_MOUSEBUTTONDOWN) + value = 1; + else + value = 0; + + if(thePaddleMode == 0) + type = Event::PaddleZeroFire; + else if(thePaddleMode == 1) + type = Event::PaddleOneFire; + else if(thePaddleMode == 2) + type = Event::PaddleTwoFire; + else if(thePaddleMode == 3) + type = Event::PaddleThreeFire; + + theConsole->eventHandler().sendEvent(type, value); + } + else if(event.type == SDL_ACTIVEEVENT) + { + static bool appActivateWasPaused; + static bool appInputWasPaused; + + if (event.active.state & (SDL_APPACTIVE)) { + if (event.active.gain == 0) { + appActivateWasPaused = theConsole->eventHandler().doPause(); + if (!appActivateWasPaused) + theConsole->eventHandler().sendEvent(Event::Pause, 1); + } + else { + if (!appActivateWasPaused) + theConsole->eventHandler().sendEvent(Event::Pause, 1); + } + } + if (event.active.state & (SDL_APPINPUTFOCUS)) { + if (event.active.gain == 0) { + appInputWasPaused = theConsole->eventHandler().doPause() || + theDisplay->fullScreen(); + if (!appInputWasPaused) + theConsole->eventHandler().sendEvent(Event::Pause, 1); + } + else { + if (!appInputWasPaused) + theConsole->eventHandler().sendEvent(Event::Pause, 1); + } + } + } + else if(event.type == SDL_QUIT) + { + newGame = false; + theConsole->eventHandler().sendEvent(Event::Quit, 1); + } + else if(event.type == SDL_VIDEOEXPOSE) + { + theDisplay->refresh(); + } + else if(event.type == SDL_USEREVENT) + { + if (event.user.code == 1) + { + newGame = true; + fileToLoad = true; + gameFile = (char *) event.user.data1; + theConsole->eventHandler().sendEvent(Event::Quit, 1); + } + } + +#ifdef JOYSTICK_SUPPORT + // Read joystick events and modify event states + StellaEvent::JoyStick stick; + StellaEvent::JoyCode code; + Int32 state; + Uint8 axis; + Uint8 button; + Int32 resistance; + Sint16 value; + JoyType type; + + if(event.jbutton.which >= StellaEvent::LastJSTICK) + return; + + stick = joyList[event.jbutton.which]; + type = theJoysticks[event.jbutton.which].type; + + // Figure put what type of joystick we're dealing with + // Stelladaptors behave differently, and can't be remapped + switch(type) + { + case JT_NONE: + break; + + case JT_REGULAR: + + if((event.type == SDL_JOYBUTTONDOWN) || (event.type == SDL_JOYBUTTONUP)) + { + if(event.jbutton.button >= StellaEvent::LastJCODE) + return; + + code = joyButtonList[event.jbutton.button]; + state = event.jbutton.state == SDL_PRESSED ? 1 : 0; + + theConsole->eventHandler().sendJoyEvent(stick, code, state); + } + else if(event.type == SDL_JOYAXISMOTION) + { + axis = event.jaxis.axis; + value = event.jaxis.value; + + if(axis == 0) // x-axis + { + theConsole->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_LEFT, + (value < -16384) ? 1 : 0); + theConsole->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_RIGHT, + (value > 16384) ? 1 : 0); + } + else if(axis == 1) // y-axis + { + theConsole->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_UP, + (value < -16384) ? 1 : 0); + theConsole->eventHandler().sendJoyEvent(stick, StellaEvent::JAXIS_DOWN, + (value > 16384) ? 1 : 0); + } + } + break; // Regular joystick + + case JT_STELLADAPTOR_1: + case JT_STELLADAPTOR_2: + + if((event.type == SDL_JOYBUTTONDOWN) || (event.type == SDL_JOYBUTTONUP)) + { + button = event.jbutton.button; + state = event.jbutton.state == SDL_PRESSED ? 1 : 0; + + // Send button events for the joysticks/paddles + if(button == 0) + { + if(type == JT_STELLADAPTOR_1) + { + theConsole->eventHandler().sendEvent(Event::JoystickZeroFire, state); + theConsole->eventHandler().sendEvent(Event::DrivingZeroFire, state); + theConsole->eventHandler().sendEvent(Event::PaddleZeroFire, state); + } + else + { + theConsole->eventHandler().sendEvent(Event::JoystickOneFire, state); + theConsole->eventHandler().sendEvent(Event::DrivingOneFire, state); + theConsole->eventHandler().sendEvent(Event::PaddleTwoFire, state); + } + } + else if(button == 1) + { + if(type == JT_STELLADAPTOR_1) + theConsole->eventHandler().sendEvent(Event::PaddleOneFire, state); + else + theConsole->eventHandler().sendEvent(Event::PaddleThreeFire, state); + } + } + else if(event.type == SDL_JOYAXISMOTION) + { + axis = event.jaxis.axis; + value = event.jaxis.value; + + // Send axis events for the joysticks + theConsole->eventHandler().sendEvent(SA_Axis[type-2][axis][0], + (value < -16384) ? 1 : 0); + theConsole->eventHandler().sendEvent(SA_Axis[type-2][axis][1], + (value > 16384) ? 1 : 0); + + // Send axis events for the paddles + resistance = (Int32) (1000000.0 * (32767 - value) / 65534); + theConsole->eventHandler().sendEvent(SA_Axis[type-2][axis][2], resistance); + + // Send events for the driving controllers + if (axis == 1) + { + if (value <= -16384-4096) + { + theConsole->eventHandler().sendEvent(SA_DrivingValue[type-2],2); + } + else if (value > 16384+4096) + { + theConsole->eventHandler().sendEvent(SA_DrivingValue[type-2],1); + } + else if (value >= 16384-4096) + { + theConsole->eventHandler().sendEvent(SA_DrivingValue[type-2],0); + } + else + { + theConsole->eventHandler().sendEvent(SA_DrivingValue[type-2],3); + } + } + } + break; // Stelladaptor joystick + + default: + break; + } +#endif + } +} + + +/** + Setup the properties set by first checking for a user file + "$HOME/.stella/stella.pro", then a system-wide file "/etc/stella.pro". + Return false if neither file is found, else return true. + + @param set The properties set to setup +*/ +bool setupProperties(PropertiesSet& set) +{ + bool useMemList = false; + string theAlternateProFile = theSettings->getString("altpro"); + string theUserProFile = theSettings->userPropertiesFilename(); + string theSystemProFile = theSettings->systemPropertiesFilename(); + +#ifdef DEVELOPER_SUPPORT + // If the user wishes to merge any property modifications to the + // PropertiesSet file, then the PropertiesSet file MUST be loaded + // into memory. + useMemList = theSettings->getBool("mergeprops"); +#endif + + // Check to see if the user has specified an alternate .pro file. + + if(theAlternateProFile != "") + { + set.load(theAlternateProFile, &Console::defaultProperties(), useMemList); + return true; + } + + if(theUserProFile != "") + { + set.load(theUserProFile, &Console::defaultProperties(), useMemList); + return true; + } + else if(theSystemProFile != "") + { + set.load(theSystemProFile, &Console::defaultProperties(), useMemList); + return true; + } + else + { + set.load("", &Console::defaultProperties(), false); + return true; + } +} + + +/** + Does general in case any operation failed (or at end of program). +*/ +void cleanup() +{ +#ifdef JOYSTICK_SUPPORT + if(SDL_WasInit(SDL_INIT_JOYSTICK) & SDL_INIT_JOYSTICK) + { + for(uInt32 i = 0; i < StellaEvent::LastJSTICK; i++) + { + if(SDL_JoystickOpened(i)) + SDL_JoystickClose(theJoysticks[i].stick); + } + } +#endif + + if(theSettings) + delete theSettings; + + if(theConsole) + delete theConsole; + + if(theSound) + delete theSound; + + if(theDisplay) + delete theDisplay; + + if(SDL_WasInit(SDL_INIT_VIDEO) & SDL_INIT_VIDEO) + SDL_Quit(); +} + + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +int stellaMain(int argc, char* argv[]) +{ + theSettings = new SettingsMACOSX(); + + if(!theSettings) + { + cleanup(); + return 0; + } + theSettings->loadConfig(); + + // Cache some settings so they don't have to be repeatedly searched for + thePaddleMode = theSettings->getInt("paddle"); + setPaddleMenu(thePaddleMode); + theShowInfoFlag = theSettings->getBool("showinfo"); + theGrabMouseIndicator = theSettings->getBool("grabmouse"); + theHideCursorIndicator = theSettings->getBool("hidecursor"); + timePerFrame = 1.0 / (double)theSettings->getInt("framerate"); + if (theSettings->getInt("framerate") == 60) + setSpeedLimitMenu(1); + + // Initialize SDL Library + Uint32 initflags = SDL_INIT_VIDEO | SDL_INIT_TIMER; + if(SDL_Init(initflags) < 0) + { + return(0); + } + + // Create an SDL window + string videodriver = theSettings->getString("video"); + if(videodriver == "soft") + { + theDisplay = new FrameBufferSoft(); + if(theShowInfoFlag) + cout << "Using software mode for video.\n"; + } +#ifdef DISPLAY_OPENGL + else if(videodriver == "gl") + { + theDisplay = new FrameBufferGL(); + theUseOpenGLFlag = true; + if(theShowInfoFlag) + cout << "Using OpenGL mode for video.\n"; + } +#endif + else // a driver that doesn't exist was requested, so use software mode + { + theDisplay = new FrameBufferSoft(); + if(theShowInfoFlag) + cout << "Using software mode for video.\n"; + } + + initVideoMenu(theUseOpenGLFlag); + + if(!theDisplay) + { + cerr << "ERROR: Couldn't set up display.\n"; + cleanup(); + return 0; + } + + // Create a sound object for playing audio + if(theSettings->getBool("sound")) + { + uInt32 fragsize = theSettings->getInt("fragsize"); + theSound = new SoundSDL(fragsize); + if(theShowInfoFlag) + { + cout << "Sound enabled, using fragment size = " << fragsize; + cout << "." << endl; + } + } + else // even if sound has been disabled, we still need a sound object + { + theSound = new Sound(); + if(theShowInfoFlag) + cout << "Sound disabled.\n"; + } + theSound->setVolume(theSettings->getInt("volume")); + + if (argv[1] != NULL) + { + fileToLoad = true; + gameFile = argv[1]; + } + +while(1) { + // Get a pointer to the file which contains the cartridge ROM + char* file; + + if (fileToLoad) + { + file = gameFile; + } + else + { + do + { + file = browseFile(); + if (file == NULL) + { + if (!handleInitialEvents()) + return 0; + } + } while (file == NULL); + } + fileToLoad = false; + + // Open the cartridge image and read it in + ifstream in(file, ios_base::binary); + if(!in) + { + cerr << "ERROR: Couldn't open " << file << "..." << endl; + cleanup(); + return 0; + } + + uInt8* image = new uInt8[512 * 1024]; + in.read((char*)image, 512 * 1024); + uInt32 size = in.gcount(); + in.close(); + + // Create a properties set for us to use and set it up + PropertiesSet propertiesSet; + if(!setupProperties(propertiesSet)) + { + delete[] image; + cleanup(); + return 0; + } + + // Get just the filename of the file containing the ROM image + const char* filename = (!strrchr(file, '/')) ? file : strrchr(file, '/') + 1; + + // Create the 2600 game console + theConsole = new Console(image, size, filename, *theSettings, propertiesSet, + *theDisplay, *theSound); + + // Free the image since we don't need it any longer + delete[] image; + free(file); + + // Setup the SDL joysticks + // This must be done after the console is created + if(!setupJoystick()) + { + cerr << "ERROR: Couldn't set up joysticks.\n"; + cleanup(); + return 0; + } + + double lasttime = Atari_time(); + double frametime = 0.1; /* measure time between two runs */ + + enableGameMenus(); + + // Set the base for the timers + // Main game loop + for(;;) + { + // Exit if the user wants to quit + if(theConsole->eventHandler().doQuit()) + { + break; + } + + handleEvents(); + theConsole->update(); + + double lastcurtime = 0; + double curtime, delaytime; + + if (timePerFrame > 0.0) + { + curtime = Atari_time(); + delaytime = lasttime + timePerFrame - curtime; + if (delaytime > 0) + usleep((int) (delaytime * 1e6)); + curtime = Atari_time(); + + /* make average time */ + frametime = (frametime * 4.0 + curtime - lastcurtime) * 0.2; + // fps = 1.0 / frametime; + lastcurtime = curtime; + + lasttime += timePerFrame; + if ((lasttime + timePerFrame) < curtime) + lasttime = curtime; + } + AboutBoxScroll(); + } + + delete theConsole; + theConsole = NULL; + + if (!newGame) + break; + newGame = false; +} + + // Cleanup time ... + cleanup(); + + return 0; +} + +static double Atari_time(void) +{ + struct timeval tp; + + gettimeofday(&tp, NULL); + return 1000000 * tp.tv_sec + 1e-6 * tp.tv_usec; +} + + diff --git a/stella/src/macosx/stella.pbproj/.DS_Store b/stella/src/macosx/stella.pbproj/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7f419608e81a6945d662c21f925d3d92f6a80795 GIT binary patch literal 6148 zcmeHK%Sr=55UkN00v-%r^dig`2>!tk;vr}K08NabtgdJTkNcl~j8=6|#Ep9nBHb`u zvpwBC(*-*Z0BQPmdk#zhjM;=qodJ<~aA>bO3zOwoVTm=)@QlSkqQ7X;+7G$j7qoc5 z&-K4=tn;Q_E}B*qk*0J?JpMGXf{t*-xJP<7xMB4x%<+Uf<`WMM?(vHCR*sLY9F{0l zFc1s`1HnKruoDJ&W=qBgj-i8rU?3RyWo%U?*NX0R9Fc1v%8QAyFiO&BE z{xXA){C-G$1p~prKVu+`W|y-mi>hbqukv)(X0~fKiTpZsDD3wx0sPQDa$ + + + + Description + This project builds an SDL-based application with Cocoa menus. + FilesToMacroExpand + + English.lproj/InfoPlist.strings + + + diff --git a/stella/src/macosx/stella.pbproj/project.pbxproj b/stella/src/macosx/stella.pbproj/project.pbxproj new file mode 100755 index 000000000..48b6bba90 --- /dev/null +++ b/stella/src/macosx/stella.pbproj/project.pbxproj @@ -0,0 +1,2586 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 39; + objects = { + 080E96DDFE201D6D7F000001 = { + children = ( + F5A47A9D01A0482F01D3D55B, + F5A47A9E01A0483001D3D55B, + 2D94482C0628F97500DD9879, + 2D94482D0628F97500DD9879, + 2DD8799F063A2131008FF2A2, + 2DD879A0063A2131008FF2A2, + 2D7B4F66063B506700579B93, + 2D7B4F67063B506700579B93, + 2D7B4F6E063B51DB00579B93, + 2D7B4F6F063B51DB00579B93, + ); + isa = PBXGroup; + name = Classes; + refType = 4; + sourceTree = ""; + }; + 089C165CFE840E0CC02AAC07 = { + children = ( + 089C165DFE840E0CC02AAC07, + ); + isa = PBXVariantGroup; + name = InfoPlist.strings; + refType = 4; + sourceTree = ""; + }; + 089C165DFE840E0CC02AAC07 = { + fileEncoding = 10; + isa = PBXFileReference; + lastKnownFileType = text.plist.strings; + name = English; + path = English.lproj/InfoPlist.strings; + refType = 4; + sourceTree = ""; + }; + 089C165EFE840E0CC02AAC07 = { + fileRef = 089C165CFE840E0CC02AAC07; + isa = PBXBuildFile; + settings = { + }; + }; +//080 +//081 +//082 +//083 +//084 +//100 +//101 +//102 +//103 +//104 + 1058C7A0FEA54F0111CA2CBB = { + children = ( + 1058C7A1FEA54F0111CA2CBB, + ); + isa = PBXGroup; + name = "Linked Frameworks"; + refType = 4; + sourceTree = ""; + }; + 1058C7A1FEA54F0111CA2CBB = { + fallbackIsa = PBXFileReference; + isa = PBXFrameworkReference; + lastKnownFileType = wrapper.framework; + name = Cocoa.framework; + path = /System/Library/Frameworks/Cocoa.framework; + refType = 0; + sourceTree = ""; + }; + 1058C7A2FEA54F0111CA2CBB = { + children = ( + 2D4764C806683C5F00F63D87, + 2DEB3D4C0629BD24007EBBD3, + 29B97325FDCFA39411CA2CEA, + 29B97324FDCFA39411CA2CEA, + ); + isa = PBXGroup; + name = "Other Frameworks"; + refType = 4; + sourceTree = ""; + }; + 1058C7A3FEA54F0111CA2CBB = { + fileRef = 1058C7A1FEA54F0111CA2CBB; + isa = PBXBuildFile; + settings = { + }; + }; +//100 +//101 +//102 +//103 +//104 +//170 +//171 +//172 +//173 +//174 + 17587328FF379C6511CA2CBB = { + explicitFileType = wrapper.application; + fallbackIsa = PBXFileReference; + isa = PBXApplicationReference; + path = StellaOSX.app; + refType = 3; + sourceTree = BUILT_PRODUCTS_DIR; + }; +//170 +//171 +//172 +//173 +//174 +//190 +//191 +//192 +//193 +//194 + 19C28FACFE9D520D11CA2CBB = { + children = ( + 17587328FF379C6511CA2CBB, + ); + isa = PBXGroup; + name = Products; + refType = 4; + sourceTree = ""; + }; +//190 +//191 +//192 +//193 +//194 +//290 +//291 +//292 +//293 +//294 + 29B97313FDCFA39411CA2CEA = { + buildSettings = { + }; + buildStyles = ( + 4A9504CCFFE6A4B311CA0CBA, + 4A9504CDFFE6A4B311CA0CBA, + ); + hasScannedForEncodings = 1; + isa = PBXProject; + mainGroup = 29B97314FDCFA39411CA2CEA; + projectDirPath = ""; + targets = ( + 29B97326FDCFA39411CA2CEA, + ); + }; + 29B97314FDCFA39411CA2CEA = { + children = ( + 080E96DDFE201D6D7F000001, + 29B97315FDCFA39411CA2CEA, + 29B97317FDCFA39411CA2CEA, + 29B97323FDCFA39411CA2CEA, + 19C28FACFE9D520D11CA2CBB, + ); + isa = PBXGroup; + name = "«PROJECTNAMEASXML»"; + path = ""; + refType = 4; + sourceTree = ""; + }; + 29B97315FDCFA39411CA2CEA = { + children = ( + 2D07AD480630E634004BFF22, + 2DE2DF100627AE07006BEC99, + 2DE2DF110627AE07006BEC99, + 2DE2DF120627AE07006BEC99, + 2DE2DF130627AE07006BEC99, + 2DE2DF140627AE07006BEC99, + 2DE2DF150627AE07006BEC99, + 2DE2DF160627AE07006BEC99, + 2DE2DF170627AE07006BEC99, + 2DE2DF180627AE07006BEC99, + 2DE2DF190627AE07006BEC99, + 2DE2DF1A0627AE07006BEC99, + 2DE2DF1B0627AE07006BEC99, + 2DE2DF1C0627AE07006BEC99, + 2DE2DF1D0627AE07006BEC99, + 2DE2DF1E0627AE07006BEC99, + 2DE2DF1F0627AE07006BEC99, + 2DE2DF200627AE07006BEC99, + 2DE2DF210627AE07006BEC99, + 2DE2DF220627AE07006BEC99, + 2DE2DF230627AE07006BEC99, + 2DE2DF240627AE07006BEC99, + 2DE2DF250627AE07006BEC99, + 2DE2DF260627AE07006BEC99, + 2DE2DF270627AE07006BEC99, + 2DE2DF280627AE07006BEC99, + 2DE2DF290627AE07006BEC99, + 2DE2DF2A0627AE07006BEC99, + 2DE2DF2B0627AE07006BEC99, + 2DE2DF2C0627AE07006BEC99, + 2DE2DF2D0627AE07006BEC99, + 2DE2DF2E0627AE07006BEC99, + 2DE2DF2F0627AE07006BEC99, + 2DE2DF300627AE07006BEC99, + 2DE2DF310627AE07006BEC99, + 2DE2DF320627AE07006BEC99, + 2DE2DF330627AE07006BEC99, + 2DE2DF340627AE07006BEC99, + 2DE2DF350627AE07006BEC99, + 2DE2DF360627AE07006BEC99, + 2DE2DF370627AE07006BEC99, + 2DE2DF380627AE07006BEC99, + 2DE2DF390627AE07006BEC99, + 2DE2DF3A0627AE07006BEC99, + 2DE2DF3B0627AE07006BEC99, + 2DE2DF3C0627AE07006BEC99, + 2DE2DF3D0627AE07006BEC99, + 2DE2DF3E0627AE07006BEC99, + 2DE2DF3F0627AE07006BEC99, + 2DE2DF400627AE07006BEC99, + 2DE2DF410627AE07006BEC99, + 2D733D6E062895B2006265D9, + 2D733D6F062895B2006265D9, + 2D733D70062895B2006265D9, + 2D733D71062895B2006265D9, + 2DE2DF420627AE07006BEC99, + 2DE2DF430627AE07006BEC99, + 2DE2DF440627AE07006BEC99, + 2DE2DF450627AE07006BEC99, + 2DE2DF7C0627AE33006BEC99, + 2DE2DF7D0627AE33006BEC99, + 2DE2DF7E0627AE33006BEC99, + 2DE2DF7F0627AE34006BEC99, + 2DE2DF800627AE34006BEC99, + 2DE2DF810627AE34006BEC99, + 2DE2DF820627AE34006BEC99, + 2DE2DF830627AE34006BEC99, + 2DE2DF840627AE34006BEC99, + 2DE2DF850627AE34006BEC99, + 2DE2DF860627AE34006BEC99, + 2DE2DF870627AE34006BEC99, + 2DE2DF880627AE34006BEC99, + 2DE2DF890627AE34006BEC99, + 2DE2DF8A0627AE34006BEC99, + 2DE2DF8B0627AE34006BEC99, + 2D733D77062895F1006265D9, + 2D944848062904E800DD9879, + 2DE2DF8C0627AE34006BEC99, + 2DE2DF8D0627AE34006BEC99, + 2DE2DF8E0627AE34006BEC99, + 2DE2DF8F0627AE34006BEC99, + 2DE2DF900627AE34006BEC99, + 2DE2DF910627AE34006BEC99, + 2DE2DFAD0627AFF9006BEC99, + 2DE2DFAE0627AFF9006BEC99, + 2DE2DFBC0627B1DF006BEC99, + 2DE2DFBD0627B1DF006BEC99, + 2DE2DFBE0627B1DF006BEC99, + 2DE2DFBF0627B1DF006BEC99, + 2DE2DFC00627B1DF006BEC99, + 2DE2DFC10627B1DF006BEC99, + 2DE2DFC20627B1DF006BEC99, + 2DE2DFC30627B1DF006BEC99, + 2DE2DFC40627B1DF006BEC99, + 2DE2DFC50627B1DF006BEC99, + 2DE2DFC60627B1DF006BEC99, + 2DE2DFC70627B1DF006BEC99, + 2DE2DFC80627B1DF006BEC99, + 2DE2DFC90627B1DF006BEC99, + 2D733D5D062893E7006265D9, + 2D733D5E062893E7006265D9, + 2D733D5F062893E7006265D9, + 2D733D60062893E7006265D9, + 2D733D61062893E7006265D9, + 2D733D62062893E7006265D9, + 2DDA34020665817D00CDD299, + 2DDA34030665817D00CDD299, + 2D944866062911CD00DD9879, + 2D94486C0629124700DD9879, + 2D11C9A90667003F00724063, + 2D11C9AA0667003F00724063, + ); + isa = PBXGroup; + name = "Other Sources"; + path = ""; + refType = 4; + sourceTree = ""; + }; + 29B97317FDCFA39411CA2CEA = { + children = ( + 2D113E090672BF2100317017, + 2D16A8E106324136005DF364, + 2D7B4F6C063B513200579B93, + 089C165CFE840E0CC02AAC07, + B2F367C504C7ADC700A80002, + 2D7B4F6A063B507400579B93, + ); + isa = PBXGroup; + name = Resources; + path = ""; + refType = 4; + sourceTree = ""; + }; + 29B97323FDCFA39411CA2CEA = { + children = ( + 1058C7A0FEA54F0111CA2CBB, + 1058C7A2FEA54F0111CA2CBB, + ); + isa = PBXGroup; + name = Frameworks; + path = ""; + refType = 4; + sourceTree = ""; + }; + 29B97324FDCFA39411CA2CEA = { + fallbackIsa = PBXFileReference; + isa = PBXFrameworkReference; + lastKnownFileType = wrapper.framework; + name = AppKit.framework; + path = /System/Library/Frameworks/AppKit.framework; + refType = 0; + sourceTree = ""; + }; + 29B97325FDCFA39411CA2CEA = { + fallbackIsa = PBXFileReference; + isa = PBXFrameworkReference; + lastKnownFileType = wrapper.framework; + name = Foundation.framework; + path = /System/Library/Frameworks/Foundation.framework; + refType = 0; + sourceTree = ""; + }; + 29B97326FDCFA39411CA2CEA = { + buildPhases = ( + 2D9BDF110679649300F84C4D, + 29B97327FDCFA39411CA2CEA, + 29B97328FDCFA39411CA2CEA, + 29B9732BFDCFA39411CA2CEA, + 29B9732DFDCFA39411CA2CEA, + 2D02685F0627C1C100A8E7DB, + 2D26484006795BCC0075A98A, + ); + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "\"$(HOME)/Library/Frameworks\" ."; + HEADER_SEARCH_PATHS = "./SDL.framework/Headers ../emucore ../emucore/m6502/src/bspf/src ../emucore/m6502/src ../ui/sound ../common ."; + INSTALL_PATH = "$(HOME)/Applications"; + LIBRARY_SEARCH_PATHS = .; + OPTIMIZATION_CFLAGS = "-O0"; + OTHER_CFLAGS = "-DMAC_OSX -DJOYSTICK_SUPPORT -DDISPLAY_OPENGL -DTEXTURES_ARE_LOST -DDEVELOPER_SUPPORT -DHAVE_GETTIMEOFDAY -DSNAPSHOT_SUPPORT -DBSPF_MAC_OSX"; + OTHER_LDFLAGS = "-framework SDL -lz -lpng"; + PRODUCT_NAME = StellaOSX; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; + WRAPPER_EXTENSION = app; + }; + dependencies = ( + ); + isa = PBXApplicationTarget; + name = StellaOSX; + productInstallPath = "$(HOME)/Applications"; + productName = "«PROJECTNAME»"; + productReference = 17587328FF379C6511CA2CBB; + productSettingsXML = " + + + + CFBundleDevelopmentRegion + English + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + bin + BIN + + CFBundleTypeName + Atari 2600 Cartridge File + CFBundleTypeOSTypes + + Cart + + CFBundleTypeRole + Viewer + + + CFBundleExecutable + StellaOSX + CFBundleGetInfoString + 1.4 + CFBundleHelpBookFolder + docs + CFBundleHelpBookName + docs + CFBundleIconFile + Stella + CFBundleIdentifier + StellaOSX + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleSignature + StLa + CFBundleVersion + 1.4 + NSMainNibFile + SDLMain.nib + NSPrincipalClass + SDLApplication + «PROJECTNAMEASXML» + SDL Cocoa App + + +"; + }; + 29B97327FDCFA39411CA2CEA = { + buildActionMask = 2147483647; + files = ( + F5A47AA101A0483001D3D55B, + 2DE2DF470627AE07006BEC99, + 2DE2DF490627AE07006BEC99, + 2DE2DF4B0627AE07006BEC99, + 2DE2DF4D0627AE07006BEC99, + 2DE2DF4F0627AE07006BEC99, + 2DE2DF510627AE07006BEC99, + 2DE2DF530627AE07006BEC99, + 2DE2DF550627AE07006BEC99, + 2DE2DF570627AE07006BEC99, + 2DE2DF590627AE07006BEC99, + 2DE2DF5B0627AE07006BEC99, + 2DE2DF5D0627AE07006BEC99, + 2DE2DF5F0627AE07006BEC99, + 2DE2DF610627AE07006BEC99, + 2DE2DF630627AE07006BEC99, + 2DE2DF650627AE07006BEC99, + 2DE2DF670627AE07006BEC99, + 2DE2DF690627AE07006BEC99, + 2DE2DF6B0627AE07006BEC99, + 2DE2DF6D0627AE07006BEC99, + 2DE2DF6F0627AE07006BEC99, + 2DE2DF710627AE07006BEC99, + 2DE2DF730627AE07006BEC99, + 2DE2DF750627AE07006BEC99, + 2DE2DF770627AE07006BEC99, + 2DE2DF790627AE07006BEC99, + 2DE2DF7B0627AE07006BEC99, + 2DE2DF930627AE34006BEC99, + 2DE2DF950627AE34006BEC99, + 2DE2DF970627AE34006BEC99, + 2DE2DF990627AE34006BEC99, + 2DE2DF9B0627AE34006BEC99, + 2DE2DF9D0627AE34006BEC99, + 2DE2DF9F0627AE34006BEC99, + 2DE2DFA10627AE34006BEC99, + 2DE2DFA30627AE34006BEC99, + 2DE2DFA50627AE34006BEC99, + 2DE2DFA70627AE34006BEC99, + 2DE2DFB00627AFF9006BEC99, + 2DE2DFCB0627B1DF006BEC99, + 2DE2DFCD0627B1DF006BEC99, + 2DE2DFCF0627B1DF006BEC99, + 2DE2DFD10627B1DF006BEC99, + 2DE2DFD30627B1DF006BEC99, + 2DE2DFD50627B1DF006BEC99, + 2DE2DFD70627B1DF006BEC99, + 2D733D66062893E7006265D9, + 2D733D68062893E7006265D9, + 2D733D6A062893E7006265D9, + 2D733D73062895B2006265D9, + 2D733D75062895B2006265D9, + 2D733D79062895F1006265D9, + 2D94482E0628F97500DD9879, + 2D94486D0629124700DD9879, + 2DD879A1063A2131008FF2A2, + 2D7B4F68063B506700579B93, + 2D7B4F70063B51DB00579B93, + 2DDA34050665817D00CDD299, + 2D11C9AC0667003F00724063, + ); + isa = PBXHeadersBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 29B97328FDCFA39411CA2CEA = { + buildActionMask = 2147483647; + files = ( + 089C165EFE840E0CC02AAC07, + B2F367C604C7ADC700A80002, + 2D16A8E206324136005DF364, + 2D7B4F6B063B507400579B93, + 2D7B4F6D063B513200579B93, + 2D113E110672BF2100317017, + ); + isa = PBXResourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 29B9732BFDCFA39411CA2CEA = { + buildActionMask = 2147483647; + files = ( + F5A47AA301A0483001D3D55B, + 2DE2DF460627AE07006BEC99, + 2DE2DF480627AE07006BEC99, + 2DE2DF4A0627AE07006BEC99, + 2DE2DF4C0627AE07006BEC99, + 2DE2DF4E0627AE07006BEC99, + 2DE2DF500627AE07006BEC99, + 2DE2DF520627AE07006BEC99, + 2DE2DF540627AE07006BEC99, + 2DE2DF560627AE07006BEC99, + 2DE2DF580627AE07006BEC99, + 2DE2DF5A0627AE07006BEC99, + 2DE2DF5C0627AE07006BEC99, + 2DE2DF5E0627AE07006BEC99, + 2DE2DF600627AE07006BEC99, + 2DE2DF620627AE07006BEC99, + 2DE2DF640627AE07006BEC99, + 2DE2DF660627AE07006BEC99, + 2DE2DF680627AE07006BEC99, + 2DE2DF6A0627AE07006BEC99, + 2DE2DF6C0627AE07006BEC99, + 2DE2DF6E0627AE07006BEC99, + 2DE2DF700627AE07006BEC99, + 2DE2DF720627AE07006BEC99, + 2DE2DF740627AE07006BEC99, + 2DE2DF760627AE07006BEC99, + 2DE2DF780627AE07006BEC99, + 2DE2DF7A0627AE07006BEC99, + 2DE2DF920627AE34006BEC99, + 2DE2DF940627AE34006BEC99, + 2DE2DF960627AE34006BEC99, + 2DE2DF980627AE34006BEC99, + 2DE2DF9A0627AE34006BEC99, + 2DE2DF9C0627AE34006BEC99, + 2DE2DF9E0627AE34006BEC99, + 2DE2DFA00627AE34006BEC99, + 2DE2DFA20627AE34006BEC99, + 2DE2DFA40627AE34006BEC99, + 2DE2DFA60627AE34006BEC99, + 2DE2DFAF0627AFF9006BEC99, + 2DE2DFCA0627B1DF006BEC99, + 2DE2DFCC0627B1DF006BEC99, + 2DE2DFCE0627B1DF006BEC99, + 2DE2DFD00627B1DF006BEC99, + 2DE2DFD20627B1DF006BEC99, + 2DE2DFD40627B1DF006BEC99, + 2DE2DFD60627B1DF006BEC99, + 2D733D65062893E7006265D9, + 2D733D67062893E7006265D9, + 2D733D69062893E7006265D9, + 2D733D72062895B2006265D9, + 2D733D74062895B2006265D9, + 2D94482F0628F97500DD9879, + 2D944849062904E800DD9879, + 2D944867062911CD00DD9879, + 2D07AD490630E634004BFF22, + 2DD879A2063A2131008FF2A2, + 2D7B4F69063B506700579B93, + 2D7B4F71063B51DB00579B93, + 2DDA34040665817D00CDD299, + 2D11C9AB0667003F00724063, + ); + isa = PBXSourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 29B9732DFDCFA39411CA2CEA = { + buildActionMask = 2147483647; + files = ( + 1058C7A3FEA54F0111CA2CBB, + 2DEB3D4D0629BD24007EBBD3, + 2D4764C906683C6000F63D87, + ); + isa = PBXFrameworksBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; +//290 +//291 +//292 +//293 +//294 +//2D0 +//2D1 +//2D2 +//2D3 +//2D4 + 2D02685F0627C1C100A8E7DB = { + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 2D113DFA0672BE0800317017, + ); + isa = PBXCopyFilesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 2D07AD480630E634004BFF22 = { + fileEncoding = 30; + indentWidth = 4; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = mainSDL.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + tabWidth = 4; + usesTabs = 0; + }; + 2D07AD490630E634004BFF22 = { + fileRef = 2D07AD480630E634004BFF22; + isa = PBXBuildFile; + settings = { + }; + }; + 2D113DFA0672BE0800317017 = { + fileRef = 2D4764C806683C5F00F63D87; + isa = PBXBuildFile; + settings = { + }; + }; + 2D113E090672BF2100317017 = { + explicitFileType = folder; + isa = PBXFileReference; + path = ../../docs; + refType = 4; + sourceTree = ""; + }; + 2D113E110672BF2100317017 = { + fileRef = 2D113E090672BF2100317017; + isa = PBXBuildFile; + settings = { + }; + }; + 2D11C9A90667003F00724063 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Snapshot.cxx; + path = ../common/Snapshot.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D11C9AA0667003F00724063 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Snapshot.hxx; + path = ../common/Snapshot.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D11C9AB0667003F00724063 = { + fileRef = 2D11C9A90667003F00724063; + isa = PBXBuildFile; + settings = { + }; + }; + 2D11C9AC0667003F00724063 = { + fileRef = 2D11C9AA0667003F00724063; + isa = PBXBuildFile; + settings = { + }; + }; + 2D16A8E106324136005DF364 = { + isa = PBXFileReference; + lastKnownFileType = image.icns; + path = Stella.icns; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D16A8E206324136005DF364 = { + fileRef = 2D16A8E106324136005DF364; + isa = PBXBuildFile; + settings = { + }; + }; + 2D26484006795BCC0075A98A = { + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + isa = PBXShellScriptBuildPhase; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [[! -a build/StellaOSX.app/Contents/Resources/docs/index.html ]];\nthen\nmv build/StellaOSX.app/Contents/Resources/docs/stella.html build/StellaOSX.app/Contents/Resources/docs/index.html;\nfi\n"; + }; + 2D4764C806683C5F00F63D87 = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + path = SDL.framework; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D4764C906683C6000F63D87 = { + fileRef = 2D4764C806683C5F00F63D87; + isa = PBXBuildFile; + settings = { + }; + }; + 2D733D5D062893E7006265D9 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = FrameBufferGL.cxx; + path = ../common/FrameBufferGL.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D733D5E062893E7006265D9 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = FrameBufferGL.hxx; + path = ../common/FrameBufferGL.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D733D5F062893E7006265D9 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = FrameBufferSDL.cxx; + path = ../common/FrameBufferSDL.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D733D60062893E7006265D9 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = FrameBufferSDL.hxx; + path = ../common/FrameBufferSDL.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D733D61062893E7006265D9 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = FrameBufferSoft.cxx; + path = ../common/FrameBufferSoft.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D733D62062893E7006265D9 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = FrameBufferSoft.hxx; + path = ../common/FrameBufferSoft.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D733D65062893E7006265D9 = { + fileRef = 2D733D5D062893E7006265D9; + isa = PBXBuildFile; + settings = { + }; + }; + 2D733D66062893E7006265D9 = { + fileRef = 2D733D5E062893E7006265D9; + isa = PBXBuildFile; + settings = { + }; + }; + 2D733D67062893E7006265D9 = { + fileRef = 2D733D5F062893E7006265D9; + isa = PBXBuildFile; + settings = { + }; + }; + 2D733D68062893E7006265D9 = { + fileRef = 2D733D60062893E7006265D9; + isa = PBXBuildFile; + settings = { + }; + }; + 2D733D69062893E7006265D9 = { + fileRef = 2D733D61062893E7006265D9; + isa = PBXBuildFile; + settings = { + }; + }; + 2D733D6A062893E7006265D9 = { + fileRef = 2D733D62062893E7006265D9; + isa = PBXBuildFile; + settings = { + }; + }; + 2D733D6E062895B2006265D9 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = EventHandler.cxx; + path = ../emucore/EventHandler.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D733D6F062895B2006265D9 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = EventHandler.hxx; + path = ../emucore/EventHandler.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D733D70062895B2006265D9 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = FrameBuffer.cxx; + path = ../emucore/FrameBuffer.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D733D71062895B2006265D9 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = FrameBuffer.hxx; + path = ../emucore/FrameBuffer.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D733D72062895B2006265D9 = { + fileRef = 2D733D6E062895B2006265D9; + isa = PBXBuildFile; + settings = { + }; + }; + 2D733D73062895B2006265D9 = { + fileRef = 2D733D6F062895B2006265D9; + isa = PBXBuildFile; + settings = { + }; + }; + 2D733D74062895B2006265D9 = { + fileRef = 2D733D70062895B2006265D9; + isa = PBXBuildFile; + settings = { + }; + }; + 2D733D75062895B2006265D9 = { + fileRef = 2D733D71062895B2006265D9; + isa = PBXBuildFile; + settings = { + }; + }; + 2D733D77062895F1006265D9 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Settings.hxx; + path = ../emucore/Settings.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D733D79062895F1006265D9 = { + fileRef = 2D733D77062895F1006265D9; + isa = PBXBuildFile; + settings = { + }; + }; + 2D7B4F66063B506700579B93 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = AboutBox.h; + refType = 4; + sourceTree = ""; + }; + 2D7B4F67063B506700579B93 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = AboutBox.m; + refType = 4; + sourceTree = ""; + }; + 2D7B4F68063B506700579B93 = { + fileRef = 2D7B4F66063B506700579B93; + isa = PBXBuildFile; + settings = { + }; + }; + 2D7B4F69063B506700579B93 = { + fileRef = 2D7B4F67063B506700579B93; + isa = PBXBuildFile; + settings = { + }; + }; + 2D7B4F6A063B507400579B93 = { + isa = PBXFileReference; + lastKnownFileType = wrapper.nib; + path = AboutBox.nib; + refType = 4; + sourceTree = ""; + }; + 2D7B4F6B063B507400579B93 = { + fileRef = 2D7B4F6A063B507400579B93; + isa = PBXBuildFile; + settings = { + }; + }; + 2D7B4F6C063B513200579B93 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = text.html; + path = Credits.html; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D7B4F6D063B513200579B93 = { + fileRef = 2D7B4F6C063B513200579B93; + isa = PBXBuildFile; + settings = { + }; + }; + 2D7B4F6E063B51DB00579B93 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = AboutBoxTextView.h; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D7B4F6F063B51DB00579B93 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = AboutBoxTextView.m; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D7B4F70063B51DB00579B93 = { + fileRef = 2D7B4F6E063B51DB00579B93; + isa = PBXBuildFile; + settings = { + }; + }; + 2D7B4F71063B51DB00579B93 = { + fileRef = 2D7B4F6F063B51DB00579B93; + isa = PBXBuildFile; + settings = { + }; + }; + 2D94482C0628F97500DD9879 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = Preferences.h; + refType = 4; + sourceTree = ""; + }; + 2D94482D0628F97500DD9879 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = Preferences.m; + refType = 4; + sourceTree = ""; + }; + 2D94482E0628F97500DD9879 = { + fileRef = 2D94482C0628F97500DD9879; + isa = PBXBuildFile; + settings = { + }; + }; + 2D94482F0628F97500DD9879 = { + fileRef = 2D94482D0628F97500DD9879; + isa = PBXBuildFile; + settings = { + }; + }; + 2D944848062904E800DD9879 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Settings.cxx; + path = ../emucore/Settings.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D944849062904E800DD9879 = { + fileRef = 2D944848062904E800DD9879; + isa = PBXBuildFile; + settings = { + }; + }; + 2D944866062911CD00DD9879 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + path = SettingsMACOSX.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D944867062911CD00DD9879 = { + fileRef = 2D944866062911CD00DD9879; + isa = PBXBuildFile; + settings = { + }; + }; + 2D94486C0629124700DD9879 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + path = SettingsMACOSX.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2D94486D0629124700DD9879 = { + fileRef = 2D94486C0629124700DD9879; + isa = PBXBuildFile; + settings = { + }; + }; + 2D9BDF110679649300F84C4D = { + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + isa = PBXShellScriptBuildPhase; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "m4 ../emucore/m6502/src/M6502Low.m4 ../emucore/m6502/src/M6502.m4 > M6502Low.ins\nm4 ../emucore/m6502/src/M6502Hi.m4 ../emucore/m6502/src/M6502.m4 > M6502Hi.ins\n"; + }; + 2DD8799F063A2131008FF2A2 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = Menus.h; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DD879A0063A2131008FF2A2 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = Menus.m; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DD879A1063A2131008FF2A2 = { + fileRef = 2DD8799F063A2131008FF2A2; + isa = PBXBuildFile; + settings = { + }; + }; + 2DD879A2063A2131008FF2A2 = { + fileRef = 2DD879A0063A2131008FF2A2; + isa = PBXBuildFile; + settings = { + }; + }; + 2DDA34020665817D00CDD299 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = SoundSDL.cxx; + path = ../common/SoundSDL.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DDA34030665817D00CDD299 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = SoundSDL.hxx; + path = ../common/SoundSDL.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DDA34040665817D00CDD299 = { + fileRef = 2DDA34020665817D00CDD299; + isa = PBXBuildFile; + settings = { + }; + }; + 2DDA34050665817D00CDD299 = { + fileRef = 2DDA34030665817D00CDD299; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF100627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Booster.cxx; + path = ../emucore/Booster.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF110627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Booster.hxx; + path = ../emucore/Booster.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF120627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Cart.cxx; + path = ../emucore/Cart.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF130627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Cart.hxx; + path = ../emucore/Cart.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF140627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Cart2K.cxx; + path = ../emucore/Cart2K.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF150627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Cart2K.hxx; + path = ../emucore/Cart2K.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF160627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Cart3F.cxx; + path = ../emucore/Cart3F.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF170627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Cart3F.hxx; + path = ../emucore/Cart3F.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF180627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Cart4K.cxx; + path = ../emucore/Cart4K.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF190627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Cart4K.hxx; + path = ../emucore/Cart4K.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF1A0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartAR.cxx; + path = ../emucore/CartAR.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF1B0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartAR.hxx; + path = ../emucore/CartAR.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF1C0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartCV.cxx; + path = ../emucore/CartCV.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF1D0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartCV.hxx; + path = ../emucore/CartCV.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF1E0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartDPC.cxx; + path = ../emucore/CartDPC.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF1F0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartDPC.hxx; + path = ../emucore/CartDPC.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF200627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartE0.cxx; + path = ../emucore/CartE0.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF210627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartE0.hxx; + path = ../emucore/CartE0.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF220627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartE7.cxx; + path = ../emucore/CartE7.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF230627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartE7.hxx; + path = ../emucore/CartE7.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF240627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartF4.cxx; + path = ../emucore/CartF4.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF250627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartF4.hxx; + path = ../emucore/CartF4.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF260627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartF4SC.cxx; + path = ../emucore/CartF4SC.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF270627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartF4SC.hxx; + path = ../emucore/CartF4SC.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF280627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartF6.cxx; + path = ../emucore/CartF6.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF290627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartF6.hxx; + path = ../emucore/CartF6.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF2A0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartF6SC.cxx; + path = ../emucore/CartF6SC.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF2B0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartF6SC.hxx; + path = ../emucore/CartF6SC.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF2C0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartF8.cxx; + path = ../emucore/CartF8.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF2D0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartF8.hxx; + path = ../emucore/CartF8.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF2E0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartF8SC.cxx; + path = ../emucore/CartF8SC.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF2F0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartF8SC.hxx; + path = ../emucore/CartF8SC.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF300627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartFASC.cxx; + path = ../emucore/CartFASC.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF310627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartFASC.hxx; + path = ../emucore/CartFASC.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF320627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartFE.cxx; + path = ../emucore/CartFE.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF330627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartFE.hxx; + path = ../emucore/CartFE.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF340627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartMB.cxx; + path = ../emucore/CartMB.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF350627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartMB.hxx; + path = ../emucore/CartMB.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF360627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = CartMC.cxx; + path = ../emucore/CartMC.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF370627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = CartMC.hxx; + path = ../emucore/CartMC.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF380627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Console.cxx; + path = ../emucore/Console.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF390627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Console.hxx; + path = ../emucore/Console.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF3A0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Control.cxx; + path = ../emucore/Control.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF3B0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Control.hxx; + path = ../emucore/Control.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF3C0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Deserializer.cxx; + path = ../emucore/Deserializer.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF3D0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Deserializer.hxx; + path = ../emucore/Deserializer.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF3E0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Driving.cxx; + path = ../emucore/Driving.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF3F0627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Driving.hxx; + path = ../emucore/Driving.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF400627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Event.cxx; + path = ../emucore/Event.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF410627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Event.hxx; + path = ../emucore/Event.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF420627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Joystick.cxx; + path = ../emucore/Joystick.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF430627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Joystick.hxx; + path = ../emucore/Joystick.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF440627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Keyboard.cxx; + path = ../emucore/Keyboard.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF450627AE07006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Keyboard.hxx; + path = ../emucore/Keyboard.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF460627AE07006BEC99 = { + fileRef = 2DE2DF100627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF470627AE07006BEC99 = { + fileRef = 2DE2DF110627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF480627AE07006BEC99 = { + fileRef = 2DE2DF120627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF490627AE07006BEC99 = { + fileRef = 2DE2DF130627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF4A0627AE07006BEC99 = { + fileRef = 2DE2DF140627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF4B0627AE07006BEC99 = { + fileRef = 2DE2DF150627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF4C0627AE07006BEC99 = { + fileRef = 2DE2DF160627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF4D0627AE07006BEC99 = { + fileRef = 2DE2DF170627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF4E0627AE07006BEC99 = { + fileRef = 2DE2DF180627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF4F0627AE07006BEC99 = { + fileRef = 2DE2DF190627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF500627AE07006BEC99 = { + fileRef = 2DE2DF1A0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF510627AE07006BEC99 = { + fileRef = 2DE2DF1B0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF520627AE07006BEC99 = { + fileRef = 2DE2DF1C0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF530627AE07006BEC99 = { + fileRef = 2DE2DF1D0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF540627AE07006BEC99 = { + fileRef = 2DE2DF1E0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF550627AE07006BEC99 = { + fileRef = 2DE2DF1F0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF560627AE07006BEC99 = { + fileRef = 2DE2DF200627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF570627AE07006BEC99 = { + fileRef = 2DE2DF210627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF580627AE07006BEC99 = { + fileRef = 2DE2DF220627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF590627AE07006BEC99 = { + fileRef = 2DE2DF230627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF5A0627AE07006BEC99 = { + fileRef = 2DE2DF240627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF5B0627AE07006BEC99 = { + fileRef = 2DE2DF250627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF5C0627AE07006BEC99 = { + fileRef = 2DE2DF260627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF5D0627AE07006BEC99 = { + fileRef = 2DE2DF270627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF5E0627AE07006BEC99 = { + fileRef = 2DE2DF280627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF5F0627AE07006BEC99 = { + fileRef = 2DE2DF290627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF600627AE07006BEC99 = { + fileRef = 2DE2DF2A0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF610627AE07006BEC99 = { + fileRef = 2DE2DF2B0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF620627AE07006BEC99 = { + fileRef = 2DE2DF2C0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF630627AE07006BEC99 = { + fileRef = 2DE2DF2D0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF640627AE07006BEC99 = { + fileRef = 2DE2DF2E0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF650627AE07006BEC99 = { + fileRef = 2DE2DF2F0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF660627AE07006BEC99 = { + fileRef = 2DE2DF300627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF670627AE07006BEC99 = { + fileRef = 2DE2DF310627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF680627AE07006BEC99 = { + fileRef = 2DE2DF320627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF690627AE07006BEC99 = { + fileRef = 2DE2DF330627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF6A0627AE07006BEC99 = { + fileRef = 2DE2DF340627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF6B0627AE07006BEC99 = { + fileRef = 2DE2DF350627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF6C0627AE07006BEC99 = { + fileRef = 2DE2DF360627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF6D0627AE07006BEC99 = { + fileRef = 2DE2DF370627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF6E0627AE07006BEC99 = { + fileRef = 2DE2DF380627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF6F0627AE07006BEC99 = { + fileRef = 2DE2DF390627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF700627AE07006BEC99 = { + fileRef = 2DE2DF3A0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF710627AE07006BEC99 = { + fileRef = 2DE2DF3B0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF720627AE07006BEC99 = { + fileRef = 2DE2DF3C0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF730627AE07006BEC99 = { + fileRef = 2DE2DF3D0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF740627AE07006BEC99 = { + fileRef = 2DE2DF3E0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF750627AE07006BEC99 = { + fileRef = 2DE2DF3F0627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF760627AE07006BEC99 = { + fileRef = 2DE2DF400627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF770627AE07006BEC99 = { + fileRef = 2DE2DF410627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF780627AE07006BEC99 = { + fileRef = 2DE2DF420627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF790627AE07006BEC99 = { + fileRef = 2DE2DF430627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF7A0627AE07006BEC99 = { + fileRef = 2DE2DF440627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF7B0627AE07006BEC99 = { + fileRef = 2DE2DF450627AE07006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF7C0627AE33006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = M6532.cxx; + path = ../emucore/M6532.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF7D0627AE33006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = M6532.hxx; + path = ../emucore/M6532.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF7E0627AE33006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = MD5.cxx; + path = ../emucore/MD5.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF7F0627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = MD5.hxx; + path = ../emucore/MD5.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF800627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = MediaSrc.cxx; + path = ../emucore/MediaSrc.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF810627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = MediaSrc.hxx; + path = ../emucore/MediaSrc.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF820627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Paddles.cxx; + path = ../emucore/Paddles.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF830627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Paddles.hxx; + path = ../emucore/Paddles.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF840627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Props.cxx; + path = ../emucore/Props.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF850627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Props.hxx; + path = ../emucore/Props.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF860627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = PropsSet.cxx; + path = ../emucore/PropsSet.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF870627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = PropsSet.hxx; + path = ../emucore/PropsSet.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF880627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Random.cxx; + path = ../emucore/Random.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF890627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Random.hxx; + path = ../emucore/Random.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF8A0627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Serializer.cxx; + path = ../emucore/Serializer.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF8B0627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Serializer.hxx; + path = ../emucore/Serializer.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF8C0627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Sound.cxx; + path = ../emucore/Sound.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF8D0627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Sound.hxx; + path = ../emucore/Sound.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF8E0627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Switches.cxx; + path = ../emucore/Switches.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF8F0627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Switches.hxx; + path = ../emucore/Switches.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF900627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = TIA.cxx; + path = ../emucore/TIA.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF910627AE34006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = TIA.hxx; + path = ../emucore/TIA.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DF920627AE34006BEC99 = { + fileRef = 2DE2DF7C0627AE33006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF930627AE34006BEC99 = { + fileRef = 2DE2DF7D0627AE33006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF940627AE34006BEC99 = { + fileRef = 2DE2DF7E0627AE33006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF950627AE34006BEC99 = { + fileRef = 2DE2DF7F0627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF960627AE34006BEC99 = { + fileRef = 2DE2DF800627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF970627AE34006BEC99 = { + fileRef = 2DE2DF810627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF980627AE34006BEC99 = { + fileRef = 2DE2DF820627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF990627AE34006BEC99 = { + fileRef = 2DE2DF830627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF9A0627AE34006BEC99 = { + fileRef = 2DE2DF840627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF9B0627AE34006BEC99 = { + fileRef = 2DE2DF850627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF9C0627AE34006BEC99 = { + fileRef = 2DE2DF860627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF9D0627AE34006BEC99 = { + fileRef = 2DE2DF870627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF9E0627AE34006BEC99 = { + fileRef = 2DE2DF880627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DF9F0627AE34006BEC99 = { + fileRef = 2DE2DF890627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFA00627AE34006BEC99 = { + fileRef = 2DE2DF8A0627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFA10627AE34006BEC99 = { + fileRef = 2DE2DF8B0627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFA20627AE34006BEC99 = { + fileRef = 2DE2DF8C0627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFA30627AE34006BEC99 = { + fileRef = 2DE2DF8D0627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFA40627AE34006BEC99 = { + fileRef = 2DE2DF8E0627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFA50627AE34006BEC99 = { + fileRef = 2DE2DF8F0627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFA60627AE34006BEC99 = { + fileRef = 2DE2DF900627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFA70627AE34006BEC99 = { + fileRef = 2DE2DF910627AE34006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFAD0627AFF9006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.c; + name = TIASound.c; + path = ../emucore/TIASound.c; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFAE0627AFF9006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = TIASound.h; + path = ../emucore/TIASound.h; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFAF0627AFF9006BEC99 = { + fileRef = 2DE2DFAD0627AFF9006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFB00627AFF9006BEC99 = { + fileRef = 2DE2DFAE0627AFF9006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFBC0627B1DF006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = D6502.cxx; + path = ../emucore/m6502/src/D6502.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFBD0627B1DF006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = D6502.hxx; + path = ../emucore/m6502/src/D6502.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFBE0627B1DF006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = Device.cxx; + path = ../emucore/m6502/src/Device.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFBF0627B1DF006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = Device.hxx; + path = ../emucore/m6502/src/Device.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFC00627B1DF006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = M6502.cxx; + path = ../emucore/m6502/src/M6502.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFC10627B1DF006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = M6502.hxx; + path = ../emucore/m6502/src/M6502.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFC20627B1DF006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = M6502Hi.cxx; + path = ../emucore/m6502/src/M6502Hi.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFC30627B1DF006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = M6502Hi.hxx; + path = ../emucore/m6502/src/M6502Hi.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFC40627B1DF006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = M6502Low.cxx; + path = ../emucore/m6502/src/M6502Low.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFC50627B1DF006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = M6502Low.hxx; + path = ../emucore/m6502/src/M6502Low.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFC60627B1DF006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = NullDev.cxx; + path = ../emucore/m6502/src/NullDev.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFC70627B1DF006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = NullDev.hxx; + path = ../emucore/m6502/src/NullDev.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFC80627B1DF006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.cpp; + name = System.cxx; + path = ../emucore/m6502/src/System.cxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFC90627B1DF006BEC99 = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.h; + name = System.hxx; + path = ../emucore/m6502/src/System.hxx; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + 2DE2DFCA0627B1DF006BEC99 = { + fileRef = 2DE2DFBC0627B1DF006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFCB0627B1DF006BEC99 = { + fileRef = 2DE2DFBD0627B1DF006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFCC0627B1DF006BEC99 = { + fileRef = 2DE2DFBE0627B1DF006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFCD0627B1DF006BEC99 = { + fileRef = 2DE2DFBF0627B1DF006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFCE0627B1DF006BEC99 = { + fileRef = 2DE2DFC00627B1DF006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFCF0627B1DF006BEC99 = { + fileRef = 2DE2DFC10627B1DF006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFD00627B1DF006BEC99 = { + fileRef = 2DE2DFC20627B1DF006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFD10627B1DF006BEC99 = { + fileRef = 2DE2DFC30627B1DF006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFD20627B1DF006BEC99 = { + fileRef = 2DE2DFC40627B1DF006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFD30627B1DF006BEC99 = { + fileRef = 2DE2DFC50627B1DF006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFD40627B1DF006BEC99 = { + fileRef = 2DE2DFC60627B1DF006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFD50627B1DF006BEC99 = { + fileRef = 2DE2DFC70627B1DF006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFD60627B1DF006BEC99 = { + fileRef = 2DE2DFC80627B1DF006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DE2DFD70627B1DF006BEC99 = { + fileRef = 2DE2DFC90627B1DF006BEC99; + isa = PBXBuildFile; + settings = { + }; + }; + 2DEB3D4C0629BD24007EBBD3 = { + isa = PBXFileReference; + lastKnownFileType = wrapper.framework; + name = OpenGL.framework; + path = /System/Library/Frameworks/OpenGL.framework; + refType = 0; + sourceTree = ""; + }; + 2DEB3D4D0629BD24007EBBD3 = { + fileRef = 2DEB3D4C0629BD24007EBBD3; + isa = PBXBuildFile; + settings = { + }; + }; +//2D0 +//2D1 +//2D2 +//2D3 +//2D4 +//4A0 +//4A1 +//4A2 +//4A3 +//4A4 + 4A9504CCFFE6A4B311CA0CBA = { + buildRules = ( + ); + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + OPTIMIZATION_CFLAGS = "-O0"; + ZERO_LINK = YES; + }; + isa = PBXBuildStyle; + name = Development; + }; + 4A9504CDFFE6A4B311CA0CBA = { + buildRules = ( + ); + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + ZERO_LINK = NO; + }; + isa = PBXBuildStyle; + name = Deployment; + }; +//4A0 +//4A1 +//4A2 +//4A3 +//4A4 +//B20 +//B21 +//B22 +//B23 +//B24 + B2F367C504C7ADC700A80002 = { + isa = PBXFileReference; + lastKnownFileType = wrapper.nib; + path = SDLMain.nib; + refType = 4; + sourceTree = ""; + }; + B2F367C604C7ADC700A80002 = { + fileRef = B2F367C504C7ADC700A80002; + isa = PBXBuildFile; + settings = { + }; + }; +//B20 +//B21 +//B22 +//B23 +//B24 +//F50 +//F51 +//F52 +//F53 +//F54 + F5A47A9D01A0482F01D3D55B = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + path = SDLMain.h; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + F5A47A9E01A0483001D3D55B = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = SDLMain.m; + refType = 2; + sourceTree = SOURCE_ROOT; + }; + F5A47AA101A0483001D3D55B = { + fileRef = F5A47A9D01A0482F01D3D55B; + isa = PBXBuildFile; + settings = { + }; + }; + F5A47AA301A0483001D3D55B = { + fileRef = F5A47A9E01A0483001D3D55B; + isa = PBXBuildFile; + settings = { + }; + }; + }; + rootObject = 29B97313FDCFA39411CA2CEA; +}