diff --git a/Apple2Mac/Apple2Mac.xcodeproj/project.pbxproj b/Apple2Mac/Apple2Mac.xcodeproj/project.pbxproj index 113e5af0..0f269f45 100644 --- a/Apple2Mac/Apple2Mac.xcodeproj/project.pbxproj +++ b/Apple2Mac/Apple2Mac.xcodeproj/project.pbxproj @@ -8,8 +8,9 @@ /* Begin PBXBuildFile section */ 4A2636F919FDEDB700DBFB00 /* Apple2Mac.help in Resources */ = {isa = PBXBuildFile; fileRef = 4A2636F819FDEDB700DBFB00 /* Apple2Mac.help */; }; + 4A61119C1A6A1DE60035F7DE /* blank.po.gz in Resources */ = {isa = PBXBuildFile; fileRef = 4A61119B1A6A1DE60035F7DE /* blank.po.gz */; }; 4A61119D1A6A1DE60035F7DE /* blank.po.gz in Resources */ = {isa = PBXBuildFile; fileRef = 4A61119B1A6A1DE60035F7DE /* blank.po.gz */; }; - 4A69C1801A33D6D7001579EF /* images in Resources */ = {isa = PBXBuildFile; fileRef = 4A69C17F1A33D6D7001579EF /* images */; }; + 4A6111A31A6A1DFC0035F7DE /* flapple140.po.gz in Resources */ = {isa = PBXBuildFile; fileRef = 4A6111A21A6A1DFC0035F7DE /* flapple140.po.gz */; }; 4A69C1921A33DB90001579EF /* DDHidLib.framework in Copy Files (1 item) */ = {isa = PBXBuildFile; fileRef = 77C2796F1A1047AF000FE33F /* DDHidLib.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 4A7EDC931AE092680072E98A /* glhudmodel.c in Sources */ = {isa = PBXBuildFile; fileRef = 4A7EDC911AE092680072E98A /* glhudmodel.c */; }; 4A7EDC941AE092680072E98A /* glhudmodel.c in Sources */ = {isa = PBXBuildFile; fileRef = 4A7EDC911AE092680072E98A /* glhudmodel.c */; }; @@ -26,6 +27,7 @@ 4A7EDCA01AE092B80072E98A /* interface.c in Sources */ = {isa = PBXBuildFile; fileRef = 4A7EDC9D1AE092B80072E98A /* interface.c */; }; 4A7EDCA11AE092B80072E98A /* interface.c in Sources */ = {isa = PBXBuildFile; fileRef = 4A7EDC9D1AE092B80072E98A /* interface.c */; }; 4A7EDCA21AE092B80072E98A /* interface.c in Sources */ = {isa = PBXBuildFile; fileRef = 4A7EDC9D1AE092B80072E98A /* interface.c */; }; + 4AC7A76D19ECC3FB00BCD457 /* EmulatorWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AC7A76C19ECC3FB00BCD457 /* EmulatorWindow.m */; }; 4AD4FE941A52464F00F958EC /* cpu.S in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D9019568A570085CE5F /* cpu.S */; }; 4AD4FE951A52464F00F958EC /* prefs.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7719568A570085CE5F /* prefs.c */; }; 4AD4FE961A52464F00F958EC /* display.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D6419568A570085CE5F /* display.c */; }; @@ -42,6 +44,7 @@ 4AD4FEA11A52464F00F958EC /* rom-shim.c in Sources */ = {isa = PBXBuildFile; fileRef = 779DD826195764E200DF89E5 /* rom-shim.c */; }; 4AD4FEA21A52464F00F958EC /* zlib-helpers.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D9519568A570085CE5F /* zlib-helpers.c */; }; 4AD4FEA31A52464F00F958EC /* darwin-shim.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D6019568A570085CE5F /* darwin-shim.c */; }; + 4AD4FEA41A52464F00F958EC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D1B1956885A0085CE5F /* main.m */; }; 4AD4FEA51A52464F00F958EC /* vectorUtil.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0A919D72700004344E0 /* vectorUtil.c */; }; 4AD4FEA61A52464F00F958EC /* debug.l in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7219568A570085CE5F /* debug.l */; }; 4AD4FEA71A52464F00F958EC /* CPUTestAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 779DD854195BDB1700DF89E5 /* CPUTestAppDelegate.m */; }; @@ -66,7 +69,6 @@ 4AD4FEBE1A52464F00F958EC /* Basic.vsh in Resources */ = {isa = PBXBuildFile; fileRef = 779F562719E4FE9E00A6F107 /* Basic.vsh */; }; 4AD4FEBF1A52464F00F958EC /* Basic.fsh in Resources */ = {isa = PBXBuildFile; fileRef = 779F562819E4FE9E00A6F107 /* Basic.fsh */; }; 4AD4FECB1A52468700F958EC /* testdisk.c in Sources */ = {isa = PBXBuildFile; fileRef = 4AD4FEC91A52467D00F958EC /* testdisk.c */; }; - 4AD4FED21A524BED00F958EC /* Apple2MacTestDisk-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 4AD4FEC41A52464F00F958EC /* Apple2MacTestDisk-Info.plist */; }; 4ADC51C219E8BD3700186B36 /* vectorUtil.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0A919D72700004344E0 /* vectorUtil.c */; }; 4ADC51C319E8BD3A00186B36 /* sourceUtil.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0AB19D72700004344E0 /* sourceUtil.c */; }; 4ADC51C419E8BD3D00186B36 /* modelUtil.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0AD19D72700004344E0 /* modelUtil.c */; }; @@ -75,6 +77,7 @@ 4ADC51C719E8BD5800186B36 /* Basic.vsh in Resources */ = {isa = PBXBuildFile; fileRef = 779F562719E4FE9E00A6F107 /* Basic.vsh */; }; 4ADC51C819E8BD5A00186B36 /* Basic.fsh in Resources */ = {isa = PBXBuildFile; fileRef = 779F562819E4FE9E00A6F107 /* Basic.fsh */; }; 4ADC51CD19E8C19A00186B36 /* MainMenu-Test.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4ADC51C919E8BEB700186B36 /* MainMenu-Test.xib */; }; + 4ADC51FA19E8C6EF00186B36 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D1B1956885A0085CE5F /* main.m */; }; 4ADC51FE19E8CA4500186B36 /* cpu.S in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D9019568A570085CE5F /* cpu.S */; }; 4ADC51FF19E8CA4500186B36 /* prefs.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7719568A570085CE5F /* prefs.c */; }; 4ADC520019E8CA4500186B36 /* display.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D6419568A570085CE5F /* display.c */; }; @@ -91,6 +94,7 @@ 4ADC520B19E8CA4500186B36 /* rom-shim.c in Sources */ = {isa = PBXBuildFile; fileRef = 779DD826195764E200DF89E5 /* rom-shim.c */; }; 4ADC520C19E8CA4500186B36 /* zlib-helpers.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D9519568A570085CE5F /* zlib-helpers.c */; }; 4ADC520D19E8CA4500186B36 /* darwin-shim.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D6019568A570085CE5F /* darwin-shim.c */; }; + 4ADC520E19E8CA4500186B36 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D1B1956885A0085CE5F /* main.m */; }; 4ADC520F19E8CA4500186B36 /* vectorUtil.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0A919D72700004344E0 /* vectorUtil.c */; }; 4ADC521019E8CA4500186B36 /* debug.l in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7219568A570085CE5F /* debug.l */; }; 4ADC521119E8CA4500186B36 /* CPUTestAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 779DD854195BDB1700DF89E5 /* CPUTestAppDelegate.m */; }; @@ -119,14 +123,17 @@ 4AFC170C1AAE9C3200B215FA /* sha1.c in Sources */ = {isa = PBXBuildFile; fileRef = 4AFC17091AAE9C3200B215FA /* sha1.c */; }; 4AFC170D1AAE9C3200B215FA /* sha1.c in Sources */ = {isa = PBXBuildFile; fileRef = 4AFC17091AAE9C3200B215FA /* sha1.c */; }; 4AFC170E1AAE9C3200B215FA /* sha1.c in Sources */ = {isa = PBXBuildFile; fileRef = 4AFC17091AAE9C3200B215FA /* sha1.c */; }; + 4AFC17111AAE9CC000B215FA /* testdisplay1.nib.gz in Resources */ = {isa = PBXBuildFile; fileRef = 4AFC170F1AAE9CC000B215FA /* testdisplay1.nib.gz */; }; 4AFC17121AAE9CC000B215FA /* testdisplay1.nib.gz in Resources */ = {isa = PBXBuildFile; fileRef = 4AFC170F1AAE9CC000B215FA /* testdisplay1.nib.gz */; }; 4AFC17131AAE9CC000B215FA /* testdisplay1.nib.gz in Resources */ = {isa = PBXBuildFile; fileRef = 4AFC170F1AAE9CC000B215FA /* testdisplay1.nib.gz */; }; 4AFC17141AAE9CC000B215FA /* testdisplay1.nib.gz in Resources */ = {isa = PBXBuildFile; fileRef = 4AFC170F1AAE9CC000B215FA /* testdisplay1.nib.gz */; }; + 4AFC17151AAE9CC000B215FA /* testvm1.nib.gz in Resources */ = {isa = PBXBuildFile; fileRef = 4AFC17101AAE9CC000B215FA /* testvm1.nib.gz */; }; 4AFC17161AAE9CC000B215FA /* testvm1.nib.gz in Resources */ = {isa = PBXBuildFile; fileRef = 4AFC17101AAE9CC000B215FA /* testvm1.nib.gz */; }; 4AFC17171AAE9CC000B215FA /* testvm1.nib.gz in Resources */ = {isa = PBXBuildFile; fileRef = 4AFC17101AAE9CC000B215FA /* testvm1.nib.gz */; }; 4AFC17181AAE9CC000B215FA /* testvm1.nib.gz in Resources */ = {isa = PBXBuildFile; fileRef = 4AFC17101AAE9CC000B215FA /* testvm1.nib.gz */; }; 773B3D101956885A0085CE5F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 773B3D0F1956885A0085CE5F /* Cocoa.framework */; }; 773B3D1A1956885A0085CE5F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 773B3D181956885A0085CE5F /* InfoPlist.strings */; }; + 773B3D1C1956885A0085CE5F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D1B1956885A0085CE5F /* main.m */; }; 773B3D201956885A0085CE5F /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 773B3D1E1956885A0085CE5F /* Credits.rtf */; }; 773B3D281956885A0085CE5F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 773B3D271956885A0085CE5F /* Images.xcassets */; }; 773B3DA019568A570085CE5F /* cpu-supp.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D5D19568A570085CE5F /* cpu-supp.c */; }; @@ -146,6 +153,8 @@ 773B3DC019568A570085CE5F /* darwin-glue.S in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D9119568A570085CE5F /* darwin-glue.S */; }; 773B3DC319568A570085CE5F /* zlib-helpers.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D9519568A570085CE5F /* zlib-helpers.c */; }; 773B3DCB1956903D0085CE5F /* libz.1.1.3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 773B3DCA1956903D0085CE5F /* libz.1.1.3.dylib */; }; + 773BC91619F2E6A900996893 /* EmulatorDiskController.m in Sources */ = {isa = PBXBuildFile; fileRef = 773BC91519F2E6A900996893 /* EmulatorDiskController.m */; }; + 773BC91919F2FD4500996893 /* EmulatorPrefsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 773BC91819F2FD4500996893 /* EmulatorPrefsController.m */; }; 773BC91A19F31E7B00996893 /* prefs.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7719568A570085CE5F /* prefs.c */; }; 779DD827195764E200DF89E5 /* rom-shim.c in Sources */ = {isa = PBXBuildFile; fileRef = 779DD826195764E200DF89E5 /* rom-shim.c */; }; 779DD82F195BD9F900DF89E5 /* cpu.S in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D9019568A570085CE5F /* cpu.S */; }; @@ -201,6 +210,7 @@ 779F567119EB0B9100A6F107 /* rom-shim.c in Sources */ = {isa = PBXBuildFile; fileRef = 779DD826195764E200DF89E5 /* rom-shim.c */; }; 779F567219EB0B9100A6F107 /* zlib-helpers.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D9519568A570085CE5F /* zlib-helpers.c */; }; 779F567319EB0B9100A6F107 /* darwin-shim.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D6019568A570085CE5F /* darwin-shim.c */; }; + 779F567419EB0B9100A6F107 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D1B1956885A0085CE5F /* main.m */; }; 779F567519EB0B9100A6F107 /* vectorUtil.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0A919D72700004344E0 /* vectorUtil.c */; }; 779F567619EB0B9100A6F107 /* debug.l in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7219568A570085CE5F /* debug.l */; }; 779F567719EB0B9100A6F107 /* CPUTestAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 779DD854195BDB1700DF89E5 /* CPUTestAppDelegate.m */; }; @@ -224,81 +234,18 @@ 779F569319EB0D1E00A6F107 /* testdisplay.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7F19568A570085CE5F /* testdisplay.c */; }; 779F569419EB10A100A6F107 /* testdisplay1.dsk.gz in Resources */ = {isa = PBXBuildFile; fileRef = 4ADC523719E8D3F600186B36 /* testdisplay1.dsk.gz */; }; 77C279701A1047DD000FE33F /* DDHidLib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77C2796F1A1047AF000FE33F /* DDHidLib.framework */; }; + 77C279751A1048B4000FE33F /* EmulatorJoystickController.m in Sources */ = {isa = PBXBuildFile; fileRef = 77C279741A1048B4000FE33F /* EmulatorJoystickController.m */; }; 77E1C0B319D72700004344E0 /* vectorUtil.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0A919D72700004344E0 /* vectorUtil.c */; }; 77E1C0B419D72700004344E0 /* sourceUtil.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0AB19D72700004344E0 /* sourceUtil.c */; }; 77E1C0B519D72700004344E0 /* modelUtil.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0AD19D72700004344E0 /* modelUtil.c */; }; 77E1C0B619D72700004344E0 /* matrixUtil.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0AF19D72700004344E0 /* matrixUtil.c */; }; 77E1C0B719D72700004344E0 /* imageUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0B019D72700004344E0 /* imageUtil.m */; }; + 77E1C0C419D7298F004344E0 /* EmulatorWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0BE19D7298F004344E0 /* EmulatorWindowController.m */; }; + 77E1C0C519D7298F004344E0 /* EmulatorGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0C019D7298F004344E0 /* EmulatorGLView.m */; }; + 77E1C0C619D7298F004344E0 /* EmulatorFullscreenWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0C219D7298F004344E0 /* EmulatorFullscreenWindow.m */; }; 77EB316C1A27A9AF00DC5A8A /* blank.dsk.gz in Resources */ = {isa = PBXBuildFile; fileRef = 4ADC523019E8D3F600186B36 /* blank.dsk.gz */; }; 77EB316D1A27A9AF00DC5A8A /* blank.nib.gz in Resources */ = {isa = PBXBuildFile; fileRef = 4ADC523119E8D3F600186B36 /* blank.nib.gz */; }; - 93206C781C14E14000668153 /* Apple2iOS.strings in Resources */ = {isa = PBXBuildFile; fileRef = 93206C761C14E14000668153 /* Apple2iOS.strings */; }; - 93206C851C156BD300668153 /* A2IXPopupChoreographer.m in Sources */ = {isa = PBXBuildFile; fileRef = 93206C841C156BD300668153 /* A2IXPopupChoreographer.m */; }; - 935C55131C12B61D0013166D /* EmulatorGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C55041C12B61D0013166D /* EmulatorGLView.m */; }; - 935C55141C12B61D0013166D /* EmulatorDiskController.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C55061C12B61D0013166D /* EmulatorDiskController.m */; }; - 935C55151C12B61D0013166D /* EmulatorFullscreenWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C55081C12B61D0013166D /* EmulatorFullscreenWindow.m */; }; - 935C55161C12B61D0013166D /* EmulatorJoystickCalibrationView.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C550A1C12B61D0013166D /* EmulatorJoystickCalibrationView.m */; }; - 935C55171C12B61D0013166D /* EmulatorJoystickController.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C550C1C12B61D0013166D /* EmulatorJoystickController.m */; }; - 935C55181C12B61D0013166D /* EmulatorPrefsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C550E1C12B61D0013166D /* EmulatorPrefsController.m */; }; - 935C55191C12B61D0013166D /* EmulatorWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C55101C12B61D0013166D /* EmulatorWindow.m */; }; - 935C551A1C12B61D0013166D /* EmulatorWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C55121C12B61D0013166D /* EmulatorWindowController.m */; }; - 935C551C1C12B6400013166D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C551B1C12B6400013166D /* main.m */; }; - 935C551D1C12B6450013166D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C551B1C12B6400013166D /* main.m */; }; - 935C551E1C12B6450013166D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C551B1C12B6400013166D /* main.m */; }; - 935C551F1C12B6460013166D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C551B1C12B6400013166D /* main.m */; }; - 935C55201C12B64A0013166D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C551B1C12B6400013166D /* main.m */; }; - 935C55351C12BA5F0013166D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 935C55331C12BA5F0013166D /* Main.storyboard */; }; - 935C55371C12BA5F0013166D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 935C55361C12BA5F0013166D /* Assets.xcassets */; }; - 935C55431C12BCFD0013166D /* Apple2iOS-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 935C55421C12BCFD0013166D /* Apple2iOS-Info.plist */; }; - 935C55461C12BE110013166D /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 935C55441C12BE110013166D /* LaunchScreen.xib */; }; - 935C554D1C12BE510013166D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C55481C12BE510013166D /* AppDelegate.m */; }; - 935C554E1C12BE510013166D /* EAGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C554A1C12BE510013166D /* EAGLView.m */; }; - 935C55511C136DF40013166D /* alhelpers.c in Sources */ = {isa = PBXBuildFile; fileRef = 779F564719EAF66E00A6F107 /* alhelpers.c */; }; - 935C55521C136DF40013166D /* AY8910.c in Sources */ = {isa = PBXBuildFile; fileRef = 779F564919EAF66E00A6F107 /* AY8910.c */; }; - 935C55531C136DF40013166D /* mockingboard.c in Sources */ = {isa = PBXBuildFile; fileRef = 779F564C19EAF66E00A6F107 /* mockingboard.c */; }; - 935C55541C136DF40013166D /* playqueue.c in Sources */ = {isa = PBXBuildFile; fileRef = 93BC72561BF6FF11005CDFCA /* playqueue.c */; }; - 935C55551C136DF40013166D /* soundcore-openal.c in Sources */ = {isa = PBXBuildFile; fileRef = 779F564F19EAF66E00A6F107 /* soundcore-openal.c */; }; - 935C55561C136DF40013166D /* soundcore.c in Sources */ = {isa = PBXBuildFile; fileRef = 779F565119EAF66E00A6F107 /* soundcore.c */; }; - 935C55571C136DF40013166D /* speaker.c in Sources */ = {isa = PBXBuildFile; fileRef = 779F565319EAF66E00A6F107 /* speaker.c */; }; - 935C55581C136DF40013166D /* cpu-supp.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D5D19568A570085CE5F /* cpu-supp.c */; }; - 935C55591C136DF40013166D /* darwin-shim.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D6019568A570085CE5F /* darwin-shim.c */; }; - 935C555A1C136DF40013166D /* disk.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D6219568A570085CE5F /* disk.c */; }; - 935C555B1C136DF40013166D /* display.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D6419568A570085CE5F /* display.c */; }; - 935C555C1C136DF40013166D /* font.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D6519568A570085CE5F /* font.c */; }; - 935C555D1C136DF40013166D /* interface.c in Sources */ = {isa = PBXBuildFile; fileRef = 4A7EDC9D1AE092B80072E98A /* interface.c */; }; - 935C555E1C136DF40013166D /* joystick.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D6C19568A570085CE5F /* joystick.c */; }; - 935C555F1C136DF40013166D /* keys.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D6E19568A570085CE5F /* keys.c */; }; - 935C55601C136E070013166D /* debugger.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7319568A570085CE5F /* debugger.c */; }; - 935C55611C136E070013166D /* opcodes.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7419568A570085CE5F /* opcodes.c */; }; - 935C55621C136E070013166D /* misc.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7519568A570085CE5F /* misc.c */; }; - 935C55631C136E070013166D /* prefs.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7719568A570085CE5F /* prefs.c */; }; - 935C55641C136E070013166D /* rom-shim.c in Sources */ = {isa = PBXBuildFile; fileRef = 779DD826195764E200DF89E5 /* rom-shim.c */; }; - 935C55651C136E070013166D /* timing.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D8719568A570085CE5F /* timing.c */; }; - 935C55661C136E070013166D /* glalert.c in Sources */ = {isa = PBXBuildFile; fileRef = 93BC72541BF6F8E2005CDFCA /* glalert.c */; }; - 935C55671C136E070013166D /* glhudmodel.c in Sources */ = {isa = PBXBuildFile; fileRef = 4A7EDC911AE092680072E98A /* glhudmodel.c */; }; - 935C55681C136E070013166D /* glnode.c in Sources */ = {isa = PBXBuildFile; fileRef = 4A7EDC921AE092680072E98A /* glnode.c */; }; - 935C55691C136E070013166D /* glvideo.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0C719D736EB004344E0 /* glvideo.c */; }; - 935C556A1C136E070013166D /* matrixUtil.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0AF19D72700004344E0 /* matrixUtil.c */; }; - 935C556B1C136E070013166D /* modelUtil.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0AD19D72700004344E0 /* modelUtil.c */; }; - 935C556C1C136E070013166D /* sourceUtil.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0AB19D72700004344E0 /* sourceUtil.c */; }; - 935C556D1C136E070013166D /* vectorUtil.c in Sources */ = {isa = PBXBuildFile; fileRef = 77E1C0A919D72700004344E0 /* vectorUtil.c */; }; - 935C556E1C136E070013166D /* vm.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D8D19568A570085CE5F /* vm.c */; }; - 935C556F1C136E070013166D /* zlib-helpers.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D9519568A570085CE5F /* zlib-helpers.c */; }; - 935C55721C136E6F0013166D /* json_parse.c in Sources */ = {isa = PBXBuildFile; fileRef = 935C55701C136E6F0013166D /* json_parse.c */; }; - 935C55731C136E6F0013166D /* json_parse.c in Sources */ = {isa = PBXBuildFile; fileRef = 935C55701C136E6F0013166D /* json_parse.c */; }; - 935C558A1C1370800013166D /* gltouchjoy_joy.c in Sources */ = {isa = PBXBuildFile; fileRef = 935C55841C1370800013166D /* gltouchjoy_joy.c */; }; - 935C558B1C1370800013166D /* gltouchjoy_kpad.c in Sources */ = {isa = PBXBuildFile; fileRef = 935C55851C1370800013166D /* gltouchjoy_kpad.c */; }; - 935C558C1C1370800013166D /* gltouchjoy.c in Sources */ = {isa = PBXBuildFile; fileRef = 935C55861C1370800013166D /* gltouchjoy.c */; }; - 935C558D1C1370800013166D /* gltouchkbd.c in Sources */ = {isa = PBXBuildFile; fileRef = 935C55881C1370800013166D /* gltouchkbd.c */; }; - 935C558E1C1370800013166D /* gltouchmenu.c in Sources */ = {isa = PBXBuildFile; fileRef = 935C55891C1370800013166D /* gltouchmenu.c */; }; - 935C55911C1371AD0013166D /* Basic.fsh in Resources */ = {isa = PBXBuildFile; fileRef = 779F562819E4FE9E00A6F107 /* Basic.fsh */; }; - 935C55921C1371AD0013166D /* Basic.vsh in Resources */ = {isa = PBXBuildFile; fileRef = 779F562719E4FE9E00A6F107 /* Basic.vsh */; }; - 935C55931C1371C80013166D /* images in Resources */ = {isa = PBXBuildFile; fileRef = 4A69C17F1A33D6D7001579EF /* images */; }; - 935C559F1C1384240013166D /* darwin-cpu-glue.S in Sources */ = {isa = PBXBuildFile; fileRef = 935C559E1C1384240013166D /* darwin-cpu-glue.S */; }; - 935C55A11C13887E0013166D /* sha1.c in Sources */ = {isa = PBXBuildFile; fileRef = 4AFC17091AAE9C3200B215FA /* sha1.c */; }; - 935C55A31C1388CB0013166D /* libz.1.1.3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 935C55A21C1388CB0013166D /* libz.1.1.3.tbd */; }; - 935C55A41C1388E30013166D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 935C551B1C12B6400013166D /* main.m */; }; - 935C55A91C1389370013166D /* jsmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 935C55A71C1389370013166D /* jsmn.c */; }; - 935C55AA1C138C2F0013166D /* jsmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 935C55A71C1389370013166D /* jsmn.c */; }; + 77F80B441A2D95E300D45030 /* EmulatorJoystickCalibrationView.m in Sources */ = {isa = PBXBuildFile; fileRef = 77F80B421A2D95E300D45030 /* EmulatorJoystickCalibrationView.m */; }; 93BC72551BF6F8E2005CDFCA /* glalert.c in Sources */ = {isa = PBXBuildFile; fileRef = 93BC72541BF6F8E2005CDFCA /* glalert.c */; }; 93BC72571BF6FF11005CDFCA /* playqueue.c in Sources */ = {isa = PBXBuildFile; fileRef = 93BC72561BF6FF11005CDFCA /* playqueue.c */; }; /* End PBXBuildFile section */ @@ -359,10 +306,11 @@ 4A2636F819FDEDB700DBFB00 /* Apple2Mac.help */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Apple2Mac.help; sourceTree = ""; }; 4A61119B1A6A1DE60035F7DE /* blank.po.gz */ = {isa = PBXFileReference; lastKnownFileType = archive.gzip; path = blank.po.gz; sourceTree = ""; }; 4A6111A21A6A1DFC0035F7DE /* flapple140.po.gz */ = {isa = PBXFileReference; lastKnownFileType = archive.gzip; path = flapple140.po.gz; sourceTree = ""; }; - 4A69C17F1A33D6D7001579EF /* images */ = {isa = PBXFileReference; lastKnownFileType = folder; name = images; path = ../images; sourceTree = ""; }; 4A7EDC911AE092680072E98A /* glhudmodel.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = glhudmodel.c; sourceTree = ""; }; 4A7EDC921AE092680072E98A /* glnode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = glnode.c; sourceTree = ""; }; 4A7EDC9D1AE092B80072E98A /* interface.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = interface.c; sourceTree = ""; }; + 4AC7A76B19ECC3FB00BCD457 /* EmulatorWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorWindow.h; path = Classes/OSX/EmulatorWindow.h; sourceTree = ""; }; + 4AC7A76C19ECC3FB00BCD457 /* EmulatorWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorWindow.m; path = Classes/OSX/EmulatorWindow.m; sourceTree = ""; }; 4AD4FEC31A52464F00F958EC /* Apple2MacTestDisk.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Apple2MacTestDisk.app; sourceTree = BUILT_PRODUCTS_DIR; }; 4AD4FEC41A52464F00F958EC /* Apple2MacTestDisk-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Apple2MacTestDisk-Info.plist"; path = "Apple2MacTests/Apple2MacTestDisk-Info.plist"; sourceTree = SOURCE_ROOT; }; 4AD4FEC91A52467D00F958EC /* testdisk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = testdisk.c; sourceTree = ""; }; @@ -381,6 +329,10 @@ 4AFC17091AAE9C3200B215FA /* sha1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sha1.c; sourceTree = ""; }; 4AFC170F1AAE9CC000B215FA /* testdisplay1.nib.gz */ = {isa = PBXFileReference; lastKnownFileType = archive.gzip; path = testdisplay1.nib.gz; sourceTree = ""; }; 4AFC17101AAE9CC000B215FA /* testvm1.nib.gz */ = {isa = PBXFileReference; lastKnownFileType = archive.gzip; path = testvm1.nib.gz; sourceTree = ""; }; + 4EE95E771C247060009877CE /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; + 4EE95E781C247060009877CE /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = fr; path = fr.lproj/Credits.rtf; sourceTree = ""; }; + 4EE95E791C247060009877CE /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; + 4EE95E7F1C24710F009877CE /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = fr.lproj/MainMenu.xib; sourceTree = ""; }; 773B3D0C1956885A0085CE5F /* Apple2Mac.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Apple2Mac.app; sourceTree = BUILT_PRODUCTS_DIR; }; 773B3D0F1956885A0085CE5F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 773B3D121956885A0085CE5F /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; @@ -388,6 +340,8 @@ 773B3D141956885A0085CE5F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 773B3D171956885A0085CE5F /* Apple2Mac-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Apple2Mac-Info.plist"; sourceTree = ""; }; 773B3D191956885A0085CE5F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 773B3D1B1956885A0085CE5F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 773B3D1D1956885A0085CE5F /* Apple2Mac-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Apple2Mac-Prefix.pch"; sourceTree = ""; }; 773B3D1F1956885A0085CE5F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; 773B3D251956885A0085CE5F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 773B3D271956885A0085CE5F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; @@ -432,6 +386,10 @@ 773B3D9519568A570085CE5F /* zlib-helpers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "zlib-helpers.c"; sourceTree = ""; }; 773B3D9619568A570085CE5F /* zlib-helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "zlib-helpers.h"; sourceTree = ""; }; 773B3DCA1956903D0085CE5F /* libz.1.1.3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.1.1.3.dylib; path = usr/lib/libz.1.1.3.dylib; sourceTree = SDKROOT; }; + 773BC91419F2E6A900996893 /* EmulatorDiskController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorDiskController.h; path = Classes/OSX/EmulatorDiskController.h; sourceTree = ""; }; + 773BC91519F2E6A900996893 /* EmulatorDiskController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorDiskController.m; path = Classes/OSX/EmulatorDiskController.m; sourceTree = ""; }; + 773BC91719F2FD4500996893 /* EmulatorPrefsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorPrefsController.h; path = Classes/OSX/EmulatorPrefsController.h; sourceTree = ""; }; + 773BC91819F2FD4500996893 /* EmulatorPrefsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorPrefsController.m; path = Classes/OSX/EmulatorPrefsController.m; sourceTree = ""; }; 779DD826195764E200DF89E5 /* rom-shim.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "rom-shim.c"; sourceTree = ""; }; 779DD850195BD9F900DF89E5 /* Apple2MacTestCPU.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Apple2MacTestCPU.app; sourceTree = BUILT_PRODUCTS_DIR; }; 779DD851195BD9F900DF89E5 /* Apple2MacTestCPU-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Apple2MacTestCPU-Info.plist"; path = "Apple2MacTests/Apple2MacTestCPU-Info.plist"; sourceTree = SOURCE_ROOT; }; @@ -456,6 +414,8 @@ 779F569119EB0B9100A6F107 /* Apple2MacTestDisplay.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Apple2MacTestDisplay.app; sourceTree = BUILT_PRODUCTS_DIR; }; 779F569219EB0B9100A6F107 /* Apple2MacTestDisplay-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Apple2MacTestDisplay-Info.plist"; path = "Apple2MacTests/Apple2MacTestDisplay-Info.plist"; sourceTree = SOURCE_ROOT; }; 77C279601A1047AE000FE33F /* DDHidLib.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = DDHidLib.xcodeproj; path = DDHidLib/DDHidLib.xcodeproj; sourceTree = ""; }; + 77C279731A1048B4000FE33F /* EmulatorJoystickController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorJoystickController.h; path = Classes/OSX/EmulatorJoystickController.h; sourceTree = ""; }; + 77C279741A1048B4000FE33F /* EmulatorJoystickController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorJoystickController.m; path = Classes/OSX/EmulatorJoystickController.m; sourceTree = ""; }; 77E1C0A819D72700004344E0 /* vectorUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vectorUtil.h; path = video_util/vectorUtil.h; sourceTree = ""; }; 77E1C0A919D72700004344E0 /* vectorUtil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vectorUtil.c; path = video_util/vectorUtil.c; sourceTree = ""; }; 77E1C0AA19D72700004344E0 /* sourceUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sourceUtil.h; path = video_util/sourceUtil.h; sourceTree = ""; }; @@ -467,58 +427,15 @@ 77E1C0B019D72700004344E0 /* imageUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = imageUtil.m; path = video_util/imageUtil.m; sourceTree = ""; }; 77E1C0B119D72700004344E0 /* imageUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imageUtil.h; path = video_util/imageUtil.h; sourceTree = ""; }; 77E1C0B219D72700004344E0 /* glUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = glUtil.h; path = video_util/glUtil.h; sourceTree = ""; }; + 77E1C0BE19D7298F004344E0 /* EmulatorWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorWindowController.m; path = Classes/OSX/EmulatorWindowController.m; sourceTree = ""; }; + 77E1C0BF19D7298F004344E0 /* EmulatorWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorWindowController.h; path = Classes/OSX/EmulatorWindowController.h; sourceTree = ""; }; + 77E1C0C019D7298F004344E0 /* EmulatorGLView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorGLView.m; path = Classes/OSX/EmulatorGLView.m; sourceTree = ""; }; + 77E1C0C119D7298F004344E0 /* EmulatorGLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorGLView.h; path = Classes/OSX/EmulatorGLView.h; sourceTree = ""; }; + 77E1C0C219D7298F004344E0 /* EmulatorFullscreenWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorFullscreenWindow.m; path = Classes/OSX/EmulatorFullscreenWindow.m; sourceTree = ""; }; + 77E1C0C319D7298F004344E0 /* EmulatorFullscreenWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorFullscreenWindow.h; path = Classes/OSX/EmulatorFullscreenWindow.h; sourceTree = ""; }; 77E1C0C719D736EB004344E0 /* glvideo.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = glvideo.c; sourceTree = ""; }; - 93206C771C14E14000668153 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Apple2iOS.strings; sourceTree = ""; }; - 93206C831C156BD300668153 /* A2IXPopupChoreographer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = A2IXPopupChoreographer.h; path = Classes/iOS/A2IXPopupChoreographer.h; sourceTree = SOURCE_ROOT; }; - 93206C841C156BD300668153 /* A2IXPopupChoreographer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = A2IXPopupChoreographer.m; path = Classes/iOS/A2IXPopupChoreographer.m; sourceTree = SOURCE_ROOT; }; - 935C55031C12B61D0013166D /* EmulatorGLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorGLView.h; path = Classes/OSX/EmulatorGLView.h; sourceTree = SOURCE_ROOT; }; - 935C55041C12B61D0013166D /* EmulatorGLView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorGLView.m; path = Classes/OSX/EmulatorGLView.m; sourceTree = SOURCE_ROOT; }; - 935C55051C12B61D0013166D /* EmulatorDiskController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorDiskController.h; path = Classes/OSX/EmulatorDiskController.h; sourceTree = SOURCE_ROOT; }; - 935C55061C12B61D0013166D /* EmulatorDiskController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorDiskController.m; path = Classes/OSX/EmulatorDiskController.m; sourceTree = SOURCE_ROOT; }; - 935C55071C12B61D0013166D /* EmulatorFullscreenWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorFullscreenWindow.h; path = Classes/OSX/EmulatorFullscreenWindow.h; sourceTree = SOURCE_ROOT; }; - 935C55081C12B61D0013166D /* EmulatorFullscreenWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorFullscreenWindow.m; path = Classes/OSX/EmulatorFullscreenWindow.m; sourceTree = SOURCE_ROOT; }; - 935C55091C12B61D0013166D /* EmulatorJoystickCalibrationView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorJoystickCalibrationView.h; path = Classes/OSX/EmulatorJoystickCalibrationView.h; sourceTree = SOURCE_ROOT; }; - 935C550A1C12B61D0013166D /* EmulatorJoystickCalibrationView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorJoystickCalibrationView.m; path = Classes/OSX/EmulatorJoystickCalibrationView.m; sourceTree = SOURCE_ROOT; }; - 935C550B1C12B61D0013166D /* EmulatorJoystickController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorJoystickController.h; path = Classes/OSX/EmulatorJoystickController.h; sourceTree = SOURCE_ROOT; }; - 935C550C1C12B61D0013166D /* EmulatorJoystickController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorJoystickController.m; path = Classes/OSX/EmulatorJoystickController.m; sourceTree = SOURCE_ROOT; }; - 935C550D1C12B61D0013166D /* EmulatorPrefsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorPrefsController.h; path = Classes/OSX/EmulatorPrefsController.h; sourceTree = SOURCE_ROOT; }; - 935C550E1C12B61D0013166D /* EmulatorPrefsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorPrefsController.m; path = Classes/OSX/EmulatorPrefsController.m; sourceTree = SOURCE_ROOT; }; - 935C550F1C12B61D0013166D /* EmulatorWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorWindow.h; path = Classes/OSX/EmulatorWindow.h; sourceTree = SOURCE_ROOT; }; - 935C55101C12B61D0013166D /* EmulatorWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorWindow.m; path = Classes/OSX/EmulatorWindow.m; sourceTree = SOURCE_ROOT; }; - 935C55111C12B61D0013166D /* EmulatorWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorWindowController.h; path = Classes/OSX/EmulatorWindowController.h; sourceTree = SOURCE_ROOT; }; - 935C55121C12B61D0013166D /* EmulatorWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorWindowController.m; path = Classes/OSX/EmulatorWindowController.m; sourceTree = SOURCE_ROOT; }; - 935C551B1C12B6400013166D /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 935C55211C12B6650013166D /* Apple2Mac-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Apple2Mac-Prefix.pch"; sourceTree = ""; }; - 935C55281C12BA5F0013166D /* Apple2iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Apple2iOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 935C55341C12BA5F0013166D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 935C55361C12BA5F0013166D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 935C55421C12BCFD0013166D /* Apple2iOS-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Apple2iOS-Info.plist"; sourceTree = ""; }; - 935C55451C12BE110013166D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 935C55471C12BE510013166D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Classes/iOS/AppDelegate.h; sourceTree = SOURCE_ROOT; }; - 935C55481C12BE510013166D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Classes/iOS/AppDelegate.m; sourceTree = SOURCE_ROOT; }; - 935C55491C12BE510013166D /* EAGLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EAGLView.h; path = Classes/iOS/EAGLView.h; sourceTree = SOURCE_ROOT; }; - 935C554A1C12BE510013166D /* EAGLView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EAGLView.m; path = Classes/iOS/EAGLView.m; sourceTree = SOURCE_ROOT; }; - 935C55701C136E6F0013166D /* json_parse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = json_parse.c; sourceTree = ""; }; - 935C55711C136E6F0013166D /* json_parse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = json_parse.h; sourceTree = ""; }; - 935C55741C136ED40013166D /* playqueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = playqueue.h; sourceTree = ""; }; - 935C55751C136F0D0013166D /* testtrace.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = testtrace.c; sourceTree = ""; }; - 935C55771C136F260013166D /* sha1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha1.h; sourceTree = ""; }; - 935C557A1C136F7E0013166D /* cpu-regs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "cpu-regs.h"; path = "arm/cpu-regs.h"; sourceTree = ""; }; - 935C557C1C136FBD0013166D /* glue-prologue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "glue-prologue.h"; path = "arm/glue-prologue.h"; sourceTree = ""; }; - 935C557F1C136FEF0013166D /* glvideo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = glvideo.h; sourceTree = ""; }; - 935C55811C13702A0013166D /* glhudmodel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = glhudmodel.h; sourceTree = ""; }; - 935C55821C13703F0013166D /* glnode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = glnode.h; sourceTree = ""; }; - 935C55841C1370800013166D /* gltouchjoy_joy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gltouchjoy_joy.c; sourceTree = ""; }; - 935C55851C1370800013166D /* gltouchjoy_kpad.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gltouchjoy_kpad.c; sourceTree = ""; }; - 935C55861C1370800013166D /* gltouchjoy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gltouchjoy.c; sourceTree = ""; }; - 935C55871C1370800013166D /* gltouchjoy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gltouchjoy.h; sourceTree = ""; }; - 935C55881C1370800013166D /* gltouchkbd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gltouchkbd.c; sourceTree = ""; }; - 935C55891C1370800013166D /* gltouchmenu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gltouchmenu.c; sourceTree = ""; }; - 935C559E1C1384240013166D /* darwin-cpu-glue.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = "darwin-cpu-glue.S"; sourceTree = ""; }; - 935C55A01C1384400013166D /* cpu.S */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; name = cpu.S; path = arm/cpu.S; sourceTree = ""; }; - 935C55A21C1388CB0013166D /* libz.1.1.3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.1.1.3.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.1.sdk/usr/lib/libz.1.1.3.tbd; sourceTree = DEVELOPER_DIR; }; - 935C55A71C1389370013166D /* jsmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jsmn.c; path = ../externals/jsmn/jsmn.c; sourceTree = ""; }; - 935C55A81C1389370013166D /* jsmn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jsmn.h; path = ../externals/jsmn/jsmn.h; sourceTree = ""; }; + 77F80B421A2D95E300D45030 /* EmulatorJoystickCalibrationView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorJoystickCalibrationView.m; path = Classes/OSX/EmulatorJoystickCalibrationView.m; sourceTree = ""; }; + 77F80B431A2D95E300D45030 /* EmulatorJoystickCalibrationView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorJoystickCalibrationView.h; path = Classes/OSX/EmulatorJoystickCalibrationView.h; sourceTree = ""; }; 93BC72541BF6F8E2005CDFCA /* glalert.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = glalert.c; sourceTree = ""; }; 93BC72561BF6FF11005CDFCA /* playqueue.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = playqueue.c; sourceTree = ""; }; /* End PBXFileReference section */ @@ -573,14 +490,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 935C55251C12BA5F0013166D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 935C55A31C1388CB0013166D /* libz.1.1.3.tbd in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -602,22 +511,14 @@ 4ADC523819E8D3F600186B36 /* testvm1.dsk.gz */, ); name = disks; - path = ../disks; + path = ../../disks; sourceTree = ""; }; 773B3D03195688590085CE5F = { isa = PBXGroup; children = ( - 935C551B1C12B6400013166D /* main.m */, - 935C55211C12B6650013166D /* Apple2Mac-Prefix.pch */, - 773B3D331956885A0085CE5F /* Apple2MacTests */, 773B3D151956885A0085CE5F /* Apple2Mac */, - 935C55291C12BA5F0013166D /* Apple2iOS */, - 773B3D431956897D0085CE5F /* Classes */, - 773B3D4519568A570085CE5F /* src */, - 935C55A51C1389000013166D /* externals */, - 4ADC522F19E8D3F600186B36 /* disks */, - 4A69C17F1A33D6D7001579EF /* images */, + 773B3D331956885A0085CE5F /* Apple2MacTests */, 773B3D0E1956885A0085CE5F /* Frameworks */, 773B3D0D1956885A0085CE5F /* Products */, ); @@ -631,7 +532,6 @@ 4ADC522719E8CA4500186B36 /* Apple2MacTestVM.app */, 779F569119EB0B9100A6F107 /* Apple2MacTestDisplay.app */, 4AD4FEC31A52464F00F958EC /* Apple2MacTestDisk.app */, - 935C55281C12BA5F0013166D /* Apple2iOS.app */, ); name = Products; sourceTree = ""; @@ -639,7 +539,6 @@ 773B3D0E1956885A0085CE5F /* Frameworks */ = { isa = PBXGroup; children = ( - 935C55A21C1388CB0013166D /* libz.1.1.3.tbd */, 77C279601A1047AE000FE33F /* DDHidLib.xcodeproj */, 779F565F19EAF6D000A6F107 /* OpenAL.framework */, 773B3DCA1956903D0085CE5F /* libz.1.1.3.dylib */, @@ -662,22 +561,33 @@ 773B3D151956885A0085CE5F /* Apple2Mac */ = { isa = PBXGroup; children = ( - 773B3D171956885A0085CE5F /* Apple2Mac-Info.plist */, - 4A2636F819FDEDB700DBFB00 /* Apple2Mac.help */, - 773B3D1E1956885A0085CE5F /* Credits.rtf */, - 773B3D181956885A0085CE5F /* InfoPlist.strings */, - 773B3D271956885A0085CE5F /* Images.xcassets */, - 773B3D241956885A0085CE5F /* MainMenu.xib */, - 4ADC51C919E8BEB700186B36 /* MainMenu-Test.xib */, + 4ADC522F19E8D3F600186B36 /* disks */, + 773B3D4519568A570085CE5F /* src */, + 773B3D431956897D0085CE5F /* Classes */, + 773B3D44195689910085CE5F /* Resources */, + 773B3D161956885A0085CE5F /* Supporting Files */, ); path = Apple2Mac; sourceTree = ""; }; + 773B3D161956885A0085CE5F /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 773B3D171956885A0085CE5F /* Apple2Mac-Info.plist */, + 773B3D181956885A0085CE5F /* InfoPlist.strings */, + 773B3D1B1956885A0085CE5F /* main.m */, + 773B3D1D1956885A0085CE5F /* Apple2Mac-Prefix.pch */, + 773B3D1E1956885A0085CE5F /* Credits.rtf */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; 773B3D331956885A0085CE5F /* Apple2MacTests */ = { isa = PBXGroup; children = ( 779DD854195BDB1700DF89E5 /* CPUTestAppDelegate.m */, 779DD855195BDB1700DF89E5 /* CPUTestAppDelegate.h */, + 773B3D7919568A570085CE5F /* test */, 773B3D341956885A0085CE5F /* Supporting Files */, ); path = Apple2MacTests; @@ -698,46 +608,65 @@ 773B3D431956897D0085CE5F /* Classes */ = { isa = PBXGroup; children = ( - 935C54741C129C740013166D /* OSX */, - 935C55231C12B9CE0013166D /* iOS */, + 773BC91419F2E6A900996893 /* EmulatorDiskController.h */, + 773BC91519F2E6A900996893 /* EmulatorDiskController.m */, + 77E1C0C219D7298F004344E0 /* EmulatorFullscreenWindow.m */, + 77E1C0C319D7298F004344E0 /* EmulatorFullscreenWindow.h */, + 77E1C0C019D7298F004344E0 /* EmulatorGLView.m */, + 77E1C0C119D7298F004344E0 /* EmulatorGLView.h */, + 77F80B421A2D95E300D45030 /* EmulatorJoystickCalibrationView.m */, + 77F80B431A2D95E300D45030 /* EmulatorJoystickCalibrationView.h */, + 77C279731A1048B4000FE33F /* EmulatorJoystickController.h */, + 77C279741A1048B4000FE33F /* EmulatorJoystickController.m */, + 773BC91719F2FD4500996893 /* EmulatorPrefsController.h */, + 773BC91819F2FD4500996893 /* EmulatorPrefsController.m */, + 77E1C0BE19D7298F004344E0 /* EmulatorWindowController.m */, + 77E1C0BF19D7298F004344E0 /* EmulatorWindowController.h */, + 4AC7A76B19ECC3FB00BCD457 /* EmulatorWindow.h */, + 4AC7A76C19ECC3FB00BCD457 /* EmulatorWindow.m */, ); name = Classes; - path = Apple2Mac; + sourceTree = ""; + }; + 773B3D44195689910085CE5F /* Resources */ = { + isa = PBXGroup; + children = ( + 4A2636F819FDEDB700DBFB00 /* Apple2Mac.help */, + 773B3D271956885A0085CE5F /* Images.xcassets */, + 773B3D241956885A0085CE5F /* MainMenu.xib */, + 4ADC51C919E8BEB700186B36 /* MainMenu-Test.xib */, + ); + name = Resources; sourceTree = ""; }; 773B3D4519568A570085CE5F /* src */ = { isa = PBXGroup; children = ( - 935C55781C136F550013166D /* arm */, 779F564619EAF66E00A6F107 /* audio */, 773B3D5C19568A570085CE5F /* common.h */, 773B3D5D19568A570085CE5F /* cpu-supp.c */, 773B3D5E19568A570085CE5F /* cpu.h */, - 935C559E1C1384240013166D /* darwin-cpu-glue.S */, - 773B3D6119568A570085CE5F /* darwin-shim.h */, 773B3D6019568A570085CE5F /* darwin-shim.c */, - 773B3D6319568A570085CE5F /* disk.h */, + 773B3D6119568A570085CE5F /* darwin-shim.h */, 773B3D6219568A570085CE5F /* disk.c */, + 773B3D6319568A570085CE5F /* disk.h */, 773B3D6419568A570085CE5F /* display.c */, 773B3D6519568A570085CE5F /* font.c */, 773B3D6919568A570085CE5F /* glue.h */, 4A7EDC9D1AE092B80072E98A /* interface.c */, - 773B3D6D19568A570085CE5F /* joystick.h */, 773B3D6C19568A570085CE5F /* joystick.c */, - 935C55711C136E6F0013166D /* json_parse.h */, - 935C55701C136E6F0013166D /* json_parse.c */, - 773B3D6F19568A570085CE5F /* keys.h */, + 773B3D6D19568A570085CE5F /* joystick.h */, 773B3D6E19568A570085CE5F /* keys.c */, + 773B3D6F19568A570085CE5F /* keys.h */, 773B3D7019568A570085CE5F /* meta */, - 773B3D7619568A570085CE5F /* misc.h */, 773B3D7519568A570085CE5F /* misc.c */, + 773B3D7619568A570085CE5F /* misc.h */, 773B3D7719568A570085CE5F /* prefs.c */, 773B3D7819568A570085CE5F /* prefs.h */, 779DD826195764E200DF89E5 /* rom-shim.c */, 773B3D8719568A570085CE5F /* timing.c */, 773B3D8819568A570085CE5F /* timing.h */, 773B3D8919568A570085CE5F /* uthash.h */, - 773B3D7919568A570085CE5F /* test */, 773B3D8A19568A570085CE5F /* video */, 77E1C0A719D726E8004344E0 /* video_util */, 773B3D8D19568A570085CE5F /* vm.c */, @@ -746,7 +675,7 @@ 773B3D9619568A570085CE5F /* zlib-helpers.h */, ); name = src; - path = ../src; + path = ../../src; sourceTree = ""; }; 773B3D7019568A570085CE5F /* meta */ = { @@ -763,32 +692,27 @@ 773B3D7919568A570085CE5F /* test */ = { isa = PBXGroup; children = ( - 773B3D7A19568A570085CE5F /* greatest.h */, - 935C55771C136F260013166D /* sha1.h */, 4AFC17091AAE9C3200B215FA /* sha1.c */, - 773B3D7D19568A570085CE5F /* testcommon.h */, + 773B3D7A19568A570085CE5F /* greatest.h */, 773B3D7C19568A570085CE5F /* testcommon.c */, + 773B3D7D19568A570085CE5F /* testcommon.h */, 773B3D7E19568A570085CE5F /* testcpu.c */, 4AD4FEC91A52467D00F958EC /* testdisk.c */, 773B3D7F19568A570085CE5F /* testdisplay.c */, - 935C55751C136F0D0013166D /* testtrace.c */, 773B3D8619568A570085CE5F /* testvm.c */, ); - path = test; + name = test; + path = ../../src/test; sourceTree = ""; }; 773B3D8A19568A570085CE5F /* video */ = { isa = PBXGroup; children = ( - 935C55801C1370160013166D /* gltouch */, 779F562819E4FE9E00A6F107 /* Basic.fsh */, 779F562719E4FE9E00A6F107 /* Basic.vsh */, 93BC72541BF6F8E2005CDFCA /* glalert.c */, - 935C55811C13702A0013166D /* glhudmodel.h */, 4A7EDC911AE092680072E98A /* glhudmodel.c */, - 935C55821C13703F0013166D /* glnode.h */, 4A7EDC921AE092680072E98A /* glnode.c */, - 935C557F1C136FEF0013166D /* glvideo.h */, 77E1C0C719D736EB004344E0 /* glvideo.c */, 773B3D8B19568A570085CE5F /* video.h */, ); @@ -809,20 +733,19 @@ 779F564619EAF66E00A6F107 /* audio */ = { isa = PBXGroup; children = ( - 779F564819EAF66E00A6F107 /* alhelpers.h */, 779F564719EAF66E00A6F107 /* alhelpers.c */, - 779F564A19EAF66E00A6F107 /* AY8910.h */, + 779F564819EAF66E00A6F107 /* alhelpers.h */, 779F564919EAF66E00A6F107 /* AY8910.c */, - 779F564D19EAF66E00A6F107 /* mockingboard.h */, + 779F564A19EAF66E00A6F107 /* AY8910.h */, 779F564C19EAF66E00A6F107 /* mockingboard.c */, + 779F564D19EAF66E00A6F107 /* mockingboard.h */, 779F564E19EAF66E00A6F107 /* peripherals.h */, - 935C55741C136ED40013166D /* playqueue.h */, 93BC72561BF6FF11005CDFCA /* playqueue.c */, 779F564F19EAF66E00A6F107 /* soundcore-openal.c */, - 779F565219EAF66E00A6F107 /* soundcore.h */, 779F565119EAF66E00A6F107 /* soundcore.c */, - 779F565419EAF66E00A6F107 /* speaker.h */, + 779F565219EAF66E00A6F107 /* soundcore.h */, 779F565319EAF66E00A6F107 /* speaker.c */, + 779F565419EAF66E00A6F107 /* speaker.h */, 779F565519EAF66E00A6F107 /* SSI263Phonemes.h */, ); path = audio; @@ -857,94 +780,6 @@ name = video_util; sourceTree = ""; }; - 935C54741C129C740013166D /* OSX */ = { - isa = PBXGroup; - children = ( - 935C55051C12B61D0013166D /* EmulatorDiskController.h */, - 935C55061C12B61D0013166D /* EmulatorDiskController.m */, - 935C55071C12B61D0013166D /* EmulatorFullscreenWindow.h */, - 935C55081C12B61D0013166D /* EmulatorFullscreenWindow.m */, - 935C55031C12B61D0013166D /* EmulatorGLView.h */, - 935C55041C12B61D0013166D /* EmulatorGLView.m */, - 935C55091C12B61D0013166D /* EmulatorJoystickCalibrationView.h */, - 935C550A1C12B61D0013166D /* EmulatorJoystickCalibrationView.m */, - 935C550B1C12B61D0013166D /* EmulatorJoystickController.h */, - 935C550C1C12B61D0013166D /* EmulatorJoystickController.m */, - 935C550D1C12B61D0013166D /* EmulatorPrefsController.h */, - 935C550E1C12B61D0013166D /* EmulatorPrefsController.m */, - 935C550F1C12B61D0013166D /* EmulatorWindow.h */, - 935C55101C12B61D0013166D /* EmulatorWindow.m */, - 935C55111C12B61D0013166D /* EmulatorWindowController.h */, - 935C55121C12B61D0013166D /* EmulatorWindowController.m */, - ); - name = OSX; - sourceTree = ""; - }; - 935C55231C12B9CE0013166D /* iOS */ = { - isa = PBXGroup; - children = ( - 935C55471C12BE510013166D /* AppDelegate.h */, - 935C55481C12BE510013166D /* AppDelegate.m */, - 93206C831C156BD300668153 /* A2IXPopupChoreographer.h */, - 93206C841C156BD300668153 /* A2IXPopupChoreographer.m */, - 935C55491C12BE510013166D /* EAGLView.h */, - 935C554A1C12BE510013166D /* EAGLView.m */, - ); - name = iOS; - sourceTree = ""; - }; - 935C55291C12BA5F0013166D /* Apple2iOS */ = { - isa = PBXGroup; - children = ( - 93206C761C14E14000668153 /* Apple2iOS.strings */, - 935C55421C12BCFD0013166D /* Apple2iOS-Info.plist */, - 935C55361C12BA5F0013166D /* Assets.xcassets */, - 935C55441C12BE110013166D /* LaunchScreen.xib */, - 935C55331C12BA5F0013166D /* Main.storyboard */, - ); - path = Apple2iOS; - sourceTree = ""; - }; - 935C55781C136F550013166D /* arm */ = { - isa = PBXGroup; - children = ( - 935C55A01C1384400013166D /* cpu.S */, - 935C557C1C136FBD0013166D /* glue-prologue.h */, - 935C557A1C136F7E0013166D /* cpu-regs.h */, - ); - name = arm; - sourceTree = ""; - }; - 935C55801C1370160013166D /* gltouch */ = { - isa = PBXGroup; - children = ( - 935C55841C1370800013166D /* gltouchjoy_joy.c */, - 935C55851C1370800013166D /* gltouchjoy_kpad.c */, - 935C55861C1370800013166D /* gltouchjoy.c */, - 935C55871C1370800013166D /* gltouchjoy.h */, - 935C55881C1370800013166D /* gltouchkbd.c */, - 935C55891C1370800013166D /* gltouchmenu.c */, - ); - name = gltouch; - sourceTree = ""; - }; - 935C55A51C1389000013166D /* externals */ = { - isa = PBXGroup; - children = ( - 935C55A61C13890D0013166D /* jsmn */, - ); - name = externals; - sourceTree = ""; - }; - 935C55A61C13890D0013166D /* jsmn */ = { - isa = PBXGroup; - children = ( - 935C55A71C1389370013166D /* jsmn.c */, - 935C55A81C1389370013166D /* jsmn.h */, - ); - name = jsmn; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1045,38 +880,14 @@ productReference = 779F569119EB0B9100A6F107 /* Apple2MacTestDisplay.app */; productType = "com.apple.product-type.application"; }; - 935C55271C12BA5F0013166D /* Apple2iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 935C553C1C12BA5F0013166D /* Build configuration list for PBXNativeTarget "Apple2iOS" */; - buildPhases = ( - 935C558F1C1371020013166D /* ShellScript */, - 935C55241C12BA5F0013166D /* Sources */, - 935C55251C12BA5F0013166D /* Frameworks */, - 935C55901C13715A0013166D /* ShellScript */, - 935C55261C12BA5F0013166D /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Apple2iOS; - productName = Apple2iOS; - productReference = 935C55281C12BA5F0013166D /* Apple2iOS.app */; - productType = "com.apple.product-type.application"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 773B3D04195688590085CE5F /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0510; + LastUpgradeCheck = 0720; ORGANIZATIONNAME = deadc0de.org; - TargetAttributes = { - 935C55271C12BA5F0013166D = { - CreatedOnToolsVersion = 7.1.1; - }; - }; }; buildConfigurationList = 773B3D07195688590085CE5F /* Build configuration list for PBXProject "Apple2Mac" */; compatibilityVersion = "Xcode 3.2"; @@ -1085,6 +896,7 @@ knownRegions = ( en, Base, + fr, ); mainGroup = 773B3D03195688590085CE5F; productRefGroup = 773B3D0D1956885A0085CE5F /* Products */; @@ -1102,7 +914,6 @@ 4AD4FE911A52464F00F958EC /* Apple2MacTestDisk */, 779F566119EB0B9100A6F107 /* Apple2MacTestDisplay */, 4ADC51FB19E8CA4500186B36 /* Apple2MacTestVM */, - 935C55271C12BA5F0013166D /* Apple2iOS */, ); }; /* End PBXProject section */ @@ -1147,7 +958,6 @@ 4AD4FEB51A52464F00F958EC /* blank.dsk.gz in Resources */, 4AD4FEB61A52464F00F958EC /* blank.nib.gz in Resources */, 4AD4FEB71A52464F00F958EC /* testvm1.dsk.gz in Resources */, - 4AD4FED21A524BED00F958EC /* Apple2MacTestDisk-Info.plist in Resources */, 4AD4FEB81A52464F00F958EC /* README in Resources */, 4AFC17161AAE9CC000B215FA /* testvm1.nib.gz in Resources */, 4AD4FEB91A52464F00F958EC /* MainMenu-Test.xib in Resources */, @@ -1185,14 +995,17 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4A69C1801A33D6D7001579EF /* images in Resources */, - 773B3D281956885A0085CE5F /* Images.xcassets in Resources */, + 4AFC17151AAE9CC000B215FA /* testvm1.nib.gz in Resources */, 773B3D1A1956885A0085CE5F /* InfoPlist.strings in Resources */, + 773B3D281956885A0085CE5F /* Images.xcassets in Resources */, + 4A6111A31A6A1DFC0035F7DE /* flapple140.po.gz in Resources */, 773B3D201956885A0085CE5F /* Credits.rtf in Resources */, + 4A61119C1A6A1DE60035F7DE /* blank.po.gz in Resources */, 4A2636F919FDEDB700DBFB00 /* Apple2Mac.help in Resources */, - 779F562319DA59D600A6F107 /* MainMenu.xib in Resources */, + 4AFC17111AAE9CC000B215FA /* testdisplay1.nib.gz in Resources */, 779F562919E4FE9E00A6F107 /* Basic.vsh in Resources */, 779F562A19E4FE9E00A6F107 /* Basic.fsh in Resources */, + 779F562319DA59D600A6F107 /* MainMenu.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1229,21 +1042,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 935C55261C12BA5F0013166D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 935C55931C1371C80013166D /* images in Resources */, - 935C55371C12BA5F0013166D /* Assets.xcassets in Resources */, - 935C55431C12BCFD0013166D /* Apple2iOS-Info.plist in Resources */, - 935C55461C12BE110013166D /* LaunchScreen.xib in Resources */, - 935C55351C12BA5F0013166D /* Main.storyboard in Resources */, - 935C55921C1371AD0013166D /* Basic.vsh in Resources */, - 935C55911C1371AD0013166D /* Basic.fsh in Resources */, - 93206C781C14E14000668153 /* Apple2iOS.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -1387,34 +1185,6 @@ shellScript = "/bin/rm -f \"$SRCROOT/../src/x86/glue.S\""; showEnvVarsInLog = 0; }; - 935C558F1C1371020013166D /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"$SRCROOT/../src/arm/genglue\" \"$SRCROOT/../src/disk.c\" \"$SRCROOT/../src/misc.c\" \"$SRCROOT/../src/display.c\" \"$SRCROOT/../src/vm.c\" \"$SRCROOT/../src/audio/speaker.c\" \"$SRCROOT/../src/audio/mockingboard.c\" > \"$SRCROOT/../src/arm/glue.S\"\n\"$SRCROOT/../src/x86/genglue\" \"$SRCROOT/../src/disk.c\" \"$SRCROOT/../src/misc.c\" \"$SRCROOT/../src/display.c\" \"$SRCROOT/../src/vm.c\" \"$SRCROOT/../src/audio/speaker.c\" \"$SRCROOT/../src/audio/mockingboard.c\" > \"$SRCROOT/../src/x86/glue.S\""; - showEnvVarsInLog = 0; - }; - 935C55901C13715A0013166D /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/rm -f \"$SRCROOT/../src/arm/glue.S\""; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1435,13 +1205,13 @@ 4AD4FE9D1A52464F00F958EC /* testcommon.c in Sources */, 4AD4FE9E1A52464F00F958EC /* misc.c in Sources */, 4AD4FE9F1A52464F00F958EC /* opcodes.c in Sources */, - 935C551F1C12B6460013166D /* main.m in Sources */, 4A7EDCA01AE092B80072E98A /* interface.c in Sources */, 4AD4FEA01A52464F00F958EC /* glvideo.c in Sources */, 4AD4FEA11A52464F00F958EC /* rom-shim.c in Sources */, 4AD4FEA21A52464F00F958EC /* zlib-helpers.c in Sources */, 4AD4FEA31A52464F00F958EC /* darwin-shim.c in Sources */, 4A7EDC9A1AE092680072E98A /* glnode.c in Sources */, + 4AD4FEA41A52464F00F958EC /* main.m in Sources */, 4AD4FECB1A52468700F958EC /* testdisk.c in Sources */, 4AD4FEA51A52464F00F958EC /* vectorUtil.c in Sources */, 4AD4FEA61A52464F00F958EC /* debug.l in Sources */, @@ -1473,13 +1243,13 @@ 4ADC520719E8CA4500186B36 /* testcommon.c in Sources */, 4ADC520819E8CA4500186B36 /* misc.c in Sources */, 4ADC520919E8CA4500186B36 /* opcodes.c in Sources */, - 935C551D1C12B6450013166D /* main.m in Sources */, 4A7EDCA21AE092B80072E98A /* interface.c in Sources */, 4ADC520A19E8CA4500186B36 /* glvideo.c in Sources */, 4ADC520B19E8CA4500186B36 /* rom-shim.c in Sources */, 4ADC520C19E8CA4500186B36 /* zlib-helpers.c in Sources */, 4ADC520D19E8CA4500186B36 /* darwin-shim.c in Sources */, 4A7EDC9C1AE092680072E98A /* glnode.c in Sources */, + 4ADC520E19E8CA4500186B36 /* main.m in Sources */, 4ADC520F19E8CA4500186B36 /* vectorUtil.c in Sources */, 4ADC521019E8CA4500186B36 /* debug.l in Sources */, 4ADC521119E8CA4500186B36 /* CPUTestAppDelegate.m in Sources */, @@ -1499,52 +1269,50 @@ buildActionMask = 2147483647; files = ( 773B3DBF19568A570085CE5F /* cpu.S in Sources */, - 773B3DAF19568A570085CE5F /* misc.c in Sources */, - 779F565B19EAF66E00A6F107 /* soundcore-openal.c in Sources */, - 779F561C19D7929100A6F107 /* glvideo.c in Sources */, - 935C55151C12B61D0013166D /* EmulatorFullscreenWindow.m in Sources */, - 935C55AA1C138C2F0013166D /* jsmn.c in Sources */, 4A7EDC931AE092680072E98A /* glhudmodel.c in Sources */, 779F565D19EAF66E00A6F107 /* speaker.c in Sources */, + 779F565B19EAF66E00A6F107 /* soundcore-openal.c in Sources */, 773B3DA419568A570085CE5F /* display.c in Sources */, - 935C55171C12B61D0013166D /* EmulatorJoystickController.m in Sources */, 773B3DA319568A570085CE5F /* disk.c in Sources */, 773B3DAD19568A570085CE5F /* debugger.c in Sources */, 77E1C0B319D72700004344E0 /* vectorUtil.c in Sources */, + 4AC7A76D19ECC3FB00BCD457 /* EmulatorWindow.m in Sources */, + 77F80B441A2D95E300D45030 /* EmulatorJoystickCalibrationView.m in Sources */, 4A7EDC9E1AE092B80072E98A /* interface.c in Sources */, 773B3DAB19568A570085CE5F /* keys.c in Sources */, 773B3DBC19568A570085CE5F /* timing.c in Sources */, + 773B3DAF19568A570085CE5F /* misc.c in Sources */, + 77E1C0C419D7298F004344E0 /* EmulatorWindowController.m in Sources */, 773BC91A19F31E7B00996893 /* prefs.c in Sources */, 77E1C0B619D72700004344E0 /* matrixUtil.c in Sources */, + 77E1C0C519D7298F004344E0 /* EmulatorGLView.m in Sources */, 773B3DAE19568A570085CE5F /* opcodes.c in Sources */, + 773BC91619F2E6A900996893 /* EmulatorDiskController.m in Sources */, 779F565C19EAF66E00A6F107 /* soundcore.c in Sources */, - 935C55131C12B61D0013166D /* EmulatorGLView.m in Sources */, 779DD827195764E200DF89E5 /* rom-shim.c in Sources */, - 935C55191C12B61D0013166D /* EmulatorWindow.m in Sources */, 4A7EDC981AE092680072E98A /* glnode.c in Sources */, 773B3DC319568A570085CE5F /* zlib-helpers.c in Sources */, 77E1C0B719D72700004344E0 /* imageUtil.m in Sources */, 773B3DA219568A570085CE5F /* darwin-shim.c in Sources */, - 935C551C1C12B6400013166D /* main.m in Sources */, 77E1C0B519D72700004344E0 /* modelUtil.c in Sources */, 773B3DAC19568A570085CE5F /* debug.l in Sources */, - 935C55161C12B61D0013166D /* EmulatorJoystickCalibrationView.m in Sources */, 779F565919EAF66E00A6F107 /* AY8910.c in Sources */, - 935C55181C12B61D0013166D /* EmulatorPrefsController.m in Sources */, + 77E1C0C619D7298F004344E0 /* EmulatorFullscreenWindow.m in Sources */, 93BC72571BF6FF11005CDFCA /* playqueue.c in Sources */, + 773BC91919F2FD4500996893 /* EmulatorPrefsController.m in Sources */, 773B3DA519568A570085CE5F /* font.c in Sources */, 773B3DA019568A570085CE5F /* cpu-supp.c in Sources */, + 77C279751A1048B4000FE33F /* EmulatorJoystickController.m in Sources */, + 779F561C19D7929100A6F107 /* glvideo.c in Sources */, 779F565A19EAF66E00A6F107 /* mockingboard.c in Sources */, 77E1C0B419D72700004344E0 /* sourceUtil.c in Sources */, 779F565819EAF66E00A6F107 /* alhelpers.c in Sources */, 93BC72551BF6F8E2005CDFCA /* glalert.c in Sources */, - 935C55141C12B61D0013166D /* EmulatorDiskController.m in Sources */, 4AFC170A1AAE9C3200B215FA /* sha1.c in Sources */, - 935C551A1C12B61D0013166D /* EmulatorWindowController.m in Sources */, 773B3DBE19568A570085CE5F /* vm.c in Sources */, 773B3DC019568A570085CE5F /* darwin-glue.S in Sources */, + 773B3D1C1956885A0085CE5F /* main.m in Sources */, 773B3DAA19568A570085CE5F /* joystick.c in Sources */, - 935C55721C136E6F0013166D /* json_parse.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1565,13 +1333,13 @@ 779DD853195BDA3400DF89E5 /* testcommon.c in Sources */, 779DD836195BD9F900DF89E5 /* misc.c in Sources */, 779DD837195BD9F900DF89E5 /* opcodes.c in Sources */, - 935C55201C12B64A0013166D /* main.m in Sources */, 4A7EDC9F1AE092B80072E98A /* interface.c in Sources */, 4ADC51C619E8BD5200186B36 /* glvideo.c in Sources */, 779DD838195BD9F900DF89E5 /* rom-shim.c in Sources */, 779DD839195BD9F900DF89E5 /* zlib-helpers.c in Sources */, 779DD83A195BD9F900DF89E5 /* darwin-shim.c in Sources */, 4A7EDC991AE092680072E98A /* glnode.c in Sources */, + 4ADC51FA19E8C6EF00186B36 /* main.m in Sources */, 4ADC51C219E8BD3700186B36 /* vectorUtil.c in Sources */, 779DD83C195BD9F900DF89E5 /* debug.l in Sources */, 779DD856195BDB1700DF89E5 /* CPUTestAppDelegate.m in Sources */, @@ -1603,7 +1371,6 @@ 779F566C19EB0B9100A6F107 /* timing.c in Sources */, 779F566D19EB0B9100A6F107 /* testcommon.c in Sources */, 779F566E19EB0B9100A6F107 /* misc.c in Sources */, - 935C551E1C12B6450013166D /* main.m in Sources */, 4A7EDCA11AE092B80072E98A /* interface.c in Sources */, 779F566F19EB0B9100A6F107 /* opcodes.c in Sources */, 779F567019EB0B9100A6F107 /* glvideo.c in Sources */, @@ -1611,6 +1378,7 @@ 779F567219EB0B9100A6F107 /* zlib-helpers.c in Sources */, 4A7EDC9B1AE092680072E98A /* glnode.c in Sources */, 779F567319EB0B9100A6F107 /* darwin-shim.c in Sources */, + 779F567419EB0B9100A6F107 /* main.m in Sources */, 779F567519EB0B9100A6F107 /* vectorUtil.c in Sources */, 779F567619EB0B9100A6F107 /* debug.l in Sources */, 779F567719EB0B9100A6F107 /* CPUTestAppDelegate.m in Sources */, @@ -1624,57 +1392,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 935C55241C12BA5F0013166D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 935C559F1C1384240013166D /* darwin-cpu-glue.S in Sources */, - 935C55621C136E070013166D /* misc.c in Sources */, - 935C55691C136E070013166D /* glvideo.c in Sources */, - 935C558A1C1370800013166D /* gltouchjoy_joy.c in Sources */, - 93206C851C156BD300668153 /* A2IXPopupChoreographer.m in Sources */, - 935C558B1C1370800013166D /* gltouchjoy_kpad.c in Sources */, - 935C558C1C1370800013166D /* gltouchjoy.c in Sources */, - 935C55561C136DF40013166D /* soundcore.c in Sources */, - 935C55551C136DF40013166D /* soundcore-openal.c in Sources */, - 935C55611C136E070013166D /* opcodes.c in Sources */, - 935C55631C136E070013166D /* prefs.c in Sources */, - 935C55731C136E6F0013166D /* json_parse.c in Sources */, - 935C55641C136E070013166D /* rom-shim.c in Sources */, - 935C55651C136E070013166D /* timing.c in Sources */, - 935C55661C136E070013166D /* glalert.c in Sources */, - 935C55A91C1389370013166D /* jsmn.c in Sources */, - 935C55671C136E070013166D /* glhudmodel.c in Sources */, - 935C55681C136E070013166D /* glnode.c in Sources */, - 935C556A1C136E070013166D /* matrixUtil.c in Sources */, - 935C556B1C136E070013166D /* modelUtil.c in Sources */, - 935C556C1C136E070013166D /* sourceUtil.c in Sources */, - 935C556D1C136E070013166D /* vectorUtil.c in Sources */, - 935C556E1C136E070013166D /* vm.c in Sources */, - 935C556F1C136E070013166D /* zlib-helpers.c in Sources */, - 935C558D1C1370800013166D /* gltouchkbd.c in Sources */, - 935C55511C136DF40013166D /* alhelpers.c in Sources */, - 935C55521C136DF40013166D /* AY8910.c in Sources */, - 935C55531C136DF40013166D /* mockingboard.c in Sources */, - 935C55541C136DF40013166D /* playqueue.c in Sources */, - 935C558E1C1370800013166D /* gltouchmenu.c in Sources */, - 935C55571C136DF40013166D /* speaker.c in Sources */, - 935C55581C136DF40013166D /* cpu-supp.c in Sources */, - 935C55591C136DF40013166D /* darwin-shim.c in Sources */, - 935C55601C136E070013166D /* debugger.c in Sources */, - 935C555A1C136DF40013166D /* disk.c in Sources */, - 935C555B1C136DF40013166D /* display.c in Sources */, - 935C555C1C136DF40013166D /* font.c in Sources */, - 935C555D1C136DF40013166D /* interface.c in Sources */, - 935C555E1C136DF40013166D /* joystick.c in Sources */, - 935C55A11C13887E0013166D /* sha1.c in Sources */, - 935C555F1C136DF40013166D /* keys.c in Sources */, - 935C554D1C12BE510013166D /* AppDelegate.m in Sources */, - 935C55A41C1388E30013166D /* main.m in Sources */, - 935C554E1C12BE510013166D /* EAGLView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -1698,6 +1415,7 @@ isa = PBXVariantGroup; children = ( 773B3D191956885A0085CE5F /* en */, + 4EE95E771C247060009877CE /* fr */, ); name = InfoPlist.strings; sourceTree = ""; @@ -1706,6 +1424,7 @@ isa = PBXVariantGroup; children = ( 773B3D1F1956885A0085CE5F /* en */, + 4EE95E781C247060009877CE /* fr */, ); name = Credits.rtf; sourceTree = ""; @@ -1714,6 +1433,7 @@ isa = PBXVariantGroup; children = ( 773B3D251956885A0085CE5F /* Base */, + 4EE95E7F1C24710F009877CE /* fr */, ); name = MainMenu.xib; sourceTree = ""; @@ -1722,34 +1442,11 @@ isa = PBXVariantGroup; children = ( 773B3D371956885A0085CE5F /* en */, + 4EE95E791C247060009877CE /* fr */, ); name = InfoPlist.strings; sourceTree = ""; }; - 93206C761C14E14000668153 /* Apple2iOS.strings */ = { - isa = PBXVariantGroup; - children = ( - 93206C771C14E14000668153 /* Base */, - ); - name = Apple2iOS.strings; - sourceTree = ""; - }; - 935C55331C12BA5F0013166D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 935C55341C12BA5F0013166D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 935C55441C12BE110013166D /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 935C55451C12BE110013166D /* Base */, - ); - name = LaunchScreen.xib; - sourceTree = ""; - }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ @@ -1777,6 +1474,7 @@ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); INFOPLIST_FILE = "$(SRCROOT)/Apple2MacTests/Apple2MacTestDisk-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.deadc0de.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = Apple2MacTestDisk; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../src"; WRAPPER_EXTENSION = app; @@ -1806,6 +1504,7 @@ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); INFOPLIST_FILE = "$(SRCROOT)/Apple2MacTests/Apple2MacTestDisk-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.deadc0de.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = Apple2MacTestDisk; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../src"; WRAPPER_EXTENSION = app; @@ -1836,6 +1535,7 @@ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); INFOPLIST_FILE = "$(SRCROOT)/Apple2MacTests/Apple2MacTestVM-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.deadc0de.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = Apple2MacTestVM; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../src"; WRAPPER_EXTENSION = app; @@ -1865,6 +1565,7 @@ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); INFOPLIST_FILE = "$(SRCROOT)/Apple2MacTests/Apple2MacTestVM-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.deadc0de.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = Apple2MacTestVM; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../src"; WRAPPER_EXTENSION = app; @@ -1888,6 +1589,8 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; @@ -1903,7 +1606,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; + MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; @@ -1936,7 +1639,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; + MACOSX_DEPLOYMENT_TARGET = 10.8; SDKROOT = macosx; }; name = Release; @@ -1949,7 +1652,7 @@ CLANG_ENABLE_OBJC_ARC = NO; COMBINE_HIDPI_IMAGES = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Apple2Mac-Prefix.pch"; + GCC_PREFIX_HEADER = "Apple2Mac/Apple2Mac-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( "APPLE2IX=1", "DEBUGGER=1", @@ -1962,6 +1665,7 @@ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); INFOPLIST_FILE = "Apple2Mac/Apple2Mac-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = org.deadc0de.Apple2Mac; PRODUCT_NAME = "$(TARGET_NAME)"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../src"; WRAPPER_EXTENSION = app; @@ -1976,7 +1680,7 @@ CLANG_ENABLE_OBJC_ARC = NO; COMBINE_HIDPI_IMAGES = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Apple2Mac-Prefix.pch"; + GCC_PREFIX_HEADER = "Apple2Mac/Apple2Mac-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( "NDEBUG=1", "APPLE2IX=1", @@ -1990,6 +1694,7 @@ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); INFOPLIST_FILE = "Apple2Mac/Apple2Mac-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = org.deadc0de.Apple2Mac; PRODUCT_NAME = "$(TARGET_NAME)"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../src"; WRAPPER_EXTENSION = app; @@ -2017,6 +1722,7 @@ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); INFOPLIST_FILE = "Apple2MacTests/Apple2MacTestCPU-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.deadc0de.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = Apple2MacTestCPU; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../src"; WRAPPER_EXTENSION = app; @@ -2045,6 +1751,7 @@ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); INFOPLIST_FILE = "Apple2MacTests/Apple2MacTestCPU-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.deadc0de.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = Apple2MacTestCPU; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../src"; WRAPPER_EXTENSION = app; @@ -2075,6 +1782,7 @@ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); INFOPLIST_FILE = "$(SRCROOT)/Apple2MacTests/Apple2MacTestDisplay-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.deadc0de.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = Apple2MacTestDisplay; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../src"; WRAPPER_EXTENSION = app; @@ -2104,86 +1812,13 @@ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); INFOPLIST_FILE = "$(SRCROOT)/Apple2MacTests/Apple2MacTestDisplay-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.deadc0de.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = Apple2MacTestDisplay; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../src"; WRAPPER_EXTENSION = app; }; name = Release; }; - 935C553D1C12BA5F0013166D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - ARCHS = armv7; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_OBJC_ARC = NO; - CLANG_WARN_UNREACHABLE_CODE = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Apple2Mac-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "APPLE2IX=1", - "INTERFACE_TOUCH=1", - "MOBILE_DEVICE=1", - "DEBUGGER=1", - "VIDEO_OPENGL=1", - "AUDIO_ENABLED=1", - ); - INFOPLIST_FILE = "$(SRCROOT)/Apple2iOS/Apple2iOS-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 7.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.deadc0de.Apple2iOS; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../src"; - VALID_ARCHS = "armv7 armv7s"; - }; - name = Debug; - }; - 935C553E1C12BA5F0013166D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - ARCHS = armv7; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_OBJC_ARC = NO; - CLANG_WARN_UNREACHABLE_CODE = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Apple2Mac-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "NDEBUG=1", - "APPLE2IX=1", - "INTERFACE_TOUCH=1", - "MOBILE_DEVICE=1", - "DEBUGGER=1", - "VIDEO_OPENGL=1", - "AUDIO_ENABLED=1", - ); - INFOPLIST_FILE = "$(SRCROOT)/Apple2iOS/Apple2iOS-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 7.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = com.deadc0de.Apple2iOS; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../src"; - VALIDATE_PRODUCT = YES; - VALID_ARCHS = "armv7 armv7s"; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -2241,15 +1876,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 935C553C1C12BA5F0013166D /* Build configuration list for PBXNativeTarget "Apple2iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 935C553D1C12BA5F0013166D /* Debug */, - 935C553E1C12BA5F0013166D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = 773B3D04195688590085CE5F /* Project object */; diff --git a/Apple2Mac/Apple2Mac/Apple2Mac-Info.plist b/Apple2Mac/Apple2Mac/Apple2Mac-Info.plist index d32d0a36..32029024 100644 --- a/Apple2Mac/Apple2Mac/Apple2Mac-Info.plist +++ b/Apple2Mac/Apple2Mac/Apple2Mac-Info.plist @@ -13,7 +13,7 @@ CFBundleIconFile CFBundleIdentifier - org.deadc0de.Apple2Mac + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -21,7 +21,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.9.2 + 0.9.1 CFBundleSignature ???? CFBundleVersion diff --git a/Apple2Mac/Apple2Mac/Apple2Mac-Prefix.pch b/Apple2Mac/Apple2Mac/Apple2Mac-Prefix.pch new file mode 100644 index 00000000..35d76409 --- /dev/null +++ b/Apple2Mac/Apple2Mac/Apple2Mac-Prefix.pch @@ -0,0 +1,9 @@ +// +// Prefix header +// +// The contents of this file are implicitly included at the beginning of every source file. +// + +#ifdef __OBJC__ + #import +#endif diff --git a/Apple2Mac/Apple2Mac/Base.lproj/MainMenu-Test.xib b/Apple2Mac/Apple2Mac/Base.lproj/MainMenu-Test.xib index 646d5d84..a784c1ca 100644 --- a/Apple2Mac/Apple2Mac/Base.lproj/MainMenu-Test.xib +++ b/Apple2Mac/Apple2Mac/Base.lproj/MainMenu-Test.xib @@ -1,8 +1,8 @@ - + - + @@ -88,7 +88,7 @@ - + diff --git a/Apple2Mac/Apple2Mac/Base.lproj/MainMenu.xib b/Apple2Mac/Apple2Mac/Base.lproj/MainMenu.xib index 9062ae18..a9ce772c 100644 --- a/Apple2Mac/Apple2Mac/Base.lproj/MainMenu.xib +++ b/Apple2Mac/Apple2Mac/Base.lproj/MainMenu.xib @@ -1,8 +1,8 @@ - + - + @@ -23,27 +23,6 @@ - - -CA - - - - - - - - - - - - - - - - - - @@ -52,21 +31,6 @@ CA - - - - - - - - - - - - - - - @@ -103,6 +67,299 @@ CA + + + + + + +CA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -118,21 +375,56 @@ CA - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @@ -238,7 +530,7 @@ CA - + @@ -266,7 +558,7 @@ CA - + @@ -365,7 +657,7 @@ DQ - + @@ -730,4 +1022,12 @@ DQ + + + + + + + + diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorDiskController.h b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorDiskController.h new file mode 100644 index 00000000..85e2e3c8 --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorDiskController.h @@ -0,0 +1,22 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2013-2015 Aaron Culliney + * + */ + +#import + +typedef void (^DiskCompletionHandler)(NSOpenPanel *openPanel, NSInteger result); + +@interface EmulatorDiskController : NSWindowController + ++ (NSSet *)emulatorFileTypes; ++ (NSString *)extensionForPath:(NSString *)path; ++ (void)chooseDiskForWindow:(NSWindow *)window completionHandler:(DiskCompletionHandler)handler; + +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorDiskController.m b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorDiskController.m new file mode 100644 index 00000000..ed0c74db --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorDiskController.m @@ -0,0 +1,324 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2014, 2015 Aaron Culliney + * + */ + +#import "EmulatorDiskController.h" +#import "EmulatorPrefsController.h" +#import "common.h" + +#define READONLY_CHOICE_INDEX 0 +#define NO_DISK_INSERTED @"(No Disk Inserted)" +#define DSK_PROPERTIES @".dsk 143360 bytes" +#define NIB_PROPERTIES @".nib 232960 bytes" + +#define kApple2DisksURL @"kApple2DisksURL" + +@interface EmulatorDiskController () + +@property (assign) IBOutlet NSWindow *disksWindow; +@property (assign) IBOutlet NSTextField *diskInA; +@property (assign) IBOutlet NSTextField *diskInB; +@property (assign) IBOutlet NSTextField *diskAProperties; +@property (assign) IBOutlet NSTextField *diskBProperties; +@property (assign) IBOutlet NSMatrix *diskAProtection; +@property (assign) IBOutlet NSMatrix *diskBProtection; +@property (assign) IBOutlet NSButton *chooseDiskA; +@property (assign) IBOutlet NSButton *chooseDiskB; +@property (assign) IBOutlet NSButton *startupLoadDiskA; +@property (assign) IBOutlet NSButton *startupLoadDiskB; + +@end + +@implementation EmulatorDiskController + +- (void)awakeFromNib +{ +#if CRASH_APP_ON_LOAD_BECAUSE_YAY_GJ_APPLE + glGetError(); +#endif + + [self.diskInA setStringValue:NO_DISK_INSERTED]; + [self.diskAProperties setStringValue:@""]; + [self.diskInB setStringValue:NO_DISK_INSERTED]; + [self.diskBProperties setStringValue:@""]; + [self.chooseDiskA setKeyEquivalent:@"\r"]; + [self.chooseDiskA setBezelStyle:NSRoundedBezelStyle]; + [self.startupLoadDiskA setState:NSOffState]; + [self.startupLoadDiskB setState:NSOffState]; + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + NSString *startupDiskA = [defaults stringForKey:kApple2PrefStartupDiskA]; + BOOL readOnlyA = [defaults boolForKey:kApple2PrefStartupDiskAProtected]; + if (startupDiskA) + { + const char *err = disk6_insert(0, [[NSString stringWithFormat:@"%@.gz", startupDiskA] UTF8String], readOnlyA); + if (!err) + { + [self.diskInA setStringValue:[[startupDiskA pathComponents] lastObject]]; + [self.startupLoadDiskA setState:NSOnState]; + [self.diskAProtection setState:(readOnlyA ? NSOnState : NSOffState) atRow:0 column:0]; + [self.diskAProtection setState:(!readOnlyA ? NSOnState : NSOffState) atRow:0 column:1]; + } + } + + NSString *startupDiskB = [defaults stringForKey:kApple2PrefStartupDiskB]; + BOOL readOnlyB = [defaults boolForKey:kApple2PrefStartupDiskBProtected]; + if (startupDiskB) + { + const char *err = disk6_insert(1, [[NSString stringWithFormat:@"%@.gz", startupDiskB] UTF8String], readOnlyB); + if (!err) + { + [self.diskInB setStringValue:[[startupDiskB pathComponents] lastObject]]; + [self.startupLoadDiskB setState:NSOnState]; + [self.diskBProtection setState:(readOnlyB ? NSOnState : NSOffState) atRow:0 column:0]; + [self.diskBProtection setState:(!readOnlyB ? NSOnState : NSOffState) atRow:0 column:1]; + } + } +} + +- (void)_savePrefs +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + [defaults removeObjectForKey:kApple2PrefStartupDiskA]; + [defaults removeObjectForKey:kApple2PrefStartupDiskB]; + [defaults removeObjectForKey:kApple2PrefStartupDiskAProtected]; + [defaults removeObjectForKey:kApple2PrefStartupDiskBProtected]; + + if ([self.startupLoadDiskA state] == NSOnState) + { + if (disk6.disk[0].fd >= 0) + { + NSString *diskA = [NSString stringWithUTF8String:disk6.disk[0].file_name]; + [defaults setObject:diskA forKey:kApple2PrefStartupDiskA]; + NSButtonCell *readOnlyChoice = (NSButtonCell *)[[[self diskAProtection] cells] firstObject]; + [defaults setBool:([readOnlyChoice state] == NSOnState) forKey:kApple2PrefStartupDiskAProtected]; + } + } + + if ([self.startupLoadDiskB state] == NSOnState) + { + if (disk6.disk[1].fd >= 0) + { + NSString *diskB = [NSString stringWithUTF8String:disk6.disk[1].file_name]; + [defaults setObject:diskB forKey:kApple2PrefStartupDiskB]; + NSButtonCell *readOnlyChoice = (NSButtonCell *)[[[self diskBProtection] cells] firstObject]; + [defaults setBool:([readOnlyChoice state] == NSOnState) forKey:kApple2PrefStartupDiskBProtected]; + } + } +} + +- (void)_protectionChangedForDrive:(int)drive +{ + if (disk6.disk[drive].fd < 0) + { + return; + } + // HACK NOTE : dispatch so that state of outlet property is set properly + dispatch_async(dispatch_get_main_queue(), ^{ + NSButtonCell *readOnlyChoice = (NSButtonCell *)[[(drive == 0 ? [self diskAProtection] : [self diskBProtection]) cells] firstObject]; + NSString *path = [NSString stringWithUTF8String:disk6.disk[drive].file_name]; + [self _insertDisketteInDrive:drive path:path type:[EmulatorDiskController extensionForPath:path] readOnly:([readOnlyChoice state] == NSOnState)]; + [self _savePrefs]; + }); +} + +- (IBAction)diskAProtectionChanged:(id)sender +{ + [self _protectionChangedForDrive:0]; +} + +- (IBAction)diskBProtectionChanged:(id)sender +{ + [self _protectionChangedForDrive:1]; +} + +- (BOOL)_insertDisketteInDrive:(int)drive path:(NSString *)path type:(NSString *)type readOnly:(BOOL)readOnly +{ + disk6_eject(drive); + + const char *errMsg = disk6_insert(drive, [path UTF8String], readOnly); + if (errMsg) + { + path = [NSString stringWithFormat:@"%@.gz", path]; + errMsg = disk6_insert(drive, [path UTF8String], readOnly); + if (errMsg) + { + NSAlert *alert = [NSAlert alertWithError:[NSError errorWithDomain:[NSString stringWithUTF8String:errMsg] code:-1 userInfo:nil]]; + [alert beginSheetModalForWindow:[self disksWindow] completionHandler:nil]; + if (!drive) + { + [[self diskInA] setStringValue:NO_DISK_INSERTED]; + [[self diskAProperties] setStringValue:@""]; + } + else + { + [[self diskInB] setStringValue:NO_DISK_INSERTED]; + [[self diskBProperties] setStringValue:@""]; + } + return NO; + } + } + path = [NSString stringWithUTF8String:disk6.disk[drive].file_name]; + NSString *imageName = [[path pathComponents] lastObject]; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + if (drive == 0) + { + [[self diskInA] setStringValue:imageName]; + if ([[defaults stringForKey:kApple2PrefStartupDiskA] isEqualToString:path]) + { + [self.startupLoadDiskA setState:NSOnState]; + //[self.diskAProtection setState:(readOnly ? NSOnState : NSOffState) atRow:0 column:0]; + //[self.diskAProtection setState:(!readOnly ? NSOnState : NSOffState) atRow:0 column:1]; + } + } + else + { + [[self diskInB] setStringValue:imageName]; + if ([[defaults stringForKey:kApple2PrefStartupDiskB] isEqualToString:path]) + { + [self.startupLoadDiskB setState:NSOnState]; + //[self.diskBProtection setState:(readOnly ? NSOnState : NSOffState) atRow:0 column:0]; + //[self.diskBProtection setState:(!readOnly ? NSOnState : NSOffState) atRow:0 column:1]; + } + } + + if ([type isEqualToString:@"dsk"] || [type isEqualToString:@"do"] || [type isEqualToString:@"po"]) + { + if (!drive) + { + [[self diskAProperties] setStringValue:DSK_PROPERTIES]; + } + else + { + [[self diskBProperties] setStringValue:DSK_PROPERTIES]; + } + } + else + { + if (!drive) + { + [[self diskAProperties] setStringValue:NIB_PROPERTIES]; + } + else + { + [[self diskBProperties] setStringValue:NIB_PROPERTIES]; + } + } + + return YES; +} + ++ (NSSet *)emulatorFileTypes +{ + static NSSet *set = nil; + static dispatch_once_t onceToken = 0L; + dispatch_once(&onceToken, ^{ + set = [[NSSet alloc] initWithObjects:@"dsk", @"nib", @"do", @"po", @"gz", nil]; + }); + return [[set retain] autorelease]; +} + ++ (NSString *)extensionForPath:(NSString *)path +{ + NSString *extension0 = [path pathExtension]; + NSString *extension1 = [[path stringByDeletingPathExtension] pathExtension]; + if ([extension0 isEqualToString:@"gz"]) + { + extension0 = extension1; + } + return extension0; +} + ++ (void)chooseDiskForWindow:(NSWindow *)window completionHandler:(DiskCompletionHandler)handler +{ + NSOpenPanel *openPanel = [[NSOpenPanel openPanel] retain]; + [openPanel setTitle:@"Choose a disk image"]; + NSURL *url = [[NSUserDefaults standardUserDefaults] URLForKey:kApple2DisksURL]; + if (!url) + { + url = [[NSBundle mainBundle] URLForResource:@"images" withExtension:nil]; + } + [openPanel setDirectoryURL:url]; + [openPanel setShowsResizeIndicator:YES]; + [openPanel setShowsHiddenFiles:NO]; + [openPanel setCanChooseFiles:YES]; + [openPanel setCanChooseDirectories:NO]; + [openPanel setCanCreateDirectories:NO]; + [openPanel setAllowsMultipleSelection:NO]; + + // NOTE : Doesn't appear to be a way to specify ".dsk.gz" ... so we may inadvertently allow files of ".foo.gz" here + NSSet *fileTypes = [EmulatorDiskController emulatorFileTypes]; + [openPanel setAllowedFileTypes:[fileTypes allObjects]]; + handler = Block_copy(handler); + [openPanel beginSheetModalForWindow:window completionHandler:^(NSInteger result) { + handler(openPanel, result); + Block_release(handler); + [openPanel autorelease]; + }]; +} + +- (void)_chooseDisk:(int)drive readOnly:(BOOL)readOnly +{ + [EmulatorDiskController chooseDiskForWindow:[self disksWindow] completionHandler:^(NSOpenPanel *openPanel, NSInteger result) { + if (result == NSOKButton) + { + NSURL *selection = [[openPanel URLs] firstObject]; + NSString *path = [[selection path] stringByResolvingSymlinksInPath]; + NSString *extension = [EmulatorDiskController extensionForPath:path]; + NSSet *fileTypes = [EmulatorDiskController emulatorFileTypes]; + + NSString *directory = [path stringByDeletingLastPathComponent]; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults setURL:[NSURL URLWithString:directory] forKey:kApple2DisksURL]; + + if (![fileTypes containsObject:extension]) + { + NSAlert *alert = [NSAlert alertWithError:[NSError errorWithDomain:@"Disk image must have file extension of .dsk, .do, .po, or .nib only" code:-1 userInfo:nil]]; + [alert beginSheetModalForWindow:[self disksWindow] completionHandler:nil]; + return; + } + + [(drive == 0) ? self.startupLoadDiskA : self.startupLoadDiskB setState:NSOffState]; + [self _insertDisketteInDrive:drive path:path type:extension readOnly:readOnly]; + } + }]; +} + +- (IBAction)chooseDriveA:(id)sender +{ + NSButtonCell *readOnlyChoice = (NSButtonCell *)[[[self diskAProtection] cells] firstObject]; + [self _chooseDisk:0 readOnly:([readOnlyChoice state] == NSOnState)]; +} + +- (IBAction)chooseDriveB:(id)sender +{ + NSButtonCell *readOnlyChoice = (NSButtonCell *)[[[self diskBProtection] cells] firstObject]; + [self _chooseDisk:1 readOnly:([readOnlyChoice state] == NSOnState)]; +} + +- (IBAction)startupDiskAChoiceChanged:(id)sender +{ + [self _savePrefs]; +} + +- (IBAction)startupDiskBChoiceChanged:(id)sender +{ + [self _savePrefs]; +} + +- (IBAction)disksOK:(id)sender +{ + [[self disksWindow] close]; +} + +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorFullscreenWindow.h b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorFullscreenWindow.h new file mode 100644 index 00000000..af2385d9 --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorFullscreenWindow.h @@ -0,0 +1,18 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2014, 2015 Aaron Culliney + * + */ + +// Based on sample code from https://developer.apple.com/library/mac/samplecode/GLEssentials/Introduction/Intro.html + +#import + +@interface EmulatorFullscreenWindow : NSWindow + +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorFullscreenWindow.m b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorFullscreenWindow.m new file mode 100644 index 00000000..de0dc50e --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorFullscreenWindow.m @@ -0,0 +1,54 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2014, 2015 Aaron Culliney + * + */ + +// Based on sample code from https://developer.apple.com/library/mac/samplecode/GLEssentials/Introduction/Intro.html + +#import "EmulatorFullscreenWindow.h" + +@implementation EmulatorFullscreenWindow + +- (id)init +{ + // Create a screen-sized window on the display you want to take over + NSRect screenRect = [[NSScreen mainScreen] frame]; + + // Initialize the window making it size of the screen and borderless + self = [super initWithContentRect:screenRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES]; + + // Set the window level to be above the menu bar to cover everything else + [self setLevel:NSMainMenuWindowLevel+1]; + + // Set opaque + [self setOpaque:YES]; + + // Hide this when user switches to another window (or app) + [self setHidesOnDeactivate:YES]; + + return self; +} + +- (BOOL)canBecomeKeyWindow +{ + // Return yes so that this borderless window can receive input + return YES; +} + +- (void)keyUp:(NSEvent *)event +{ + [[self windowController] keyUp:event]; +} + +- (void)keyDown:(NSEvent *)event +{ + [[self windowController] keyDown:event]; +} + +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorGLView.h b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorGLView.h new file mode 100644 index 00000000..d3f16222 --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorGLView.h @@ -0,0 +1,21 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2014, 2015 Aaron Culliney + * + */ + +// Based on sample code from https://developer.apple.com/library/mac/samplecode/GLEssentials/Introduction/Intro.html + +#import +#import + +#import "modelUtil.h" +#import "imageUtil.h" + +@interface EmulatorGLView : NSOpenGLView +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorGLView.m b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorGLView.m new file mode 100644 index 00000000..36d83057 --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorGLView.m @@ -0,0 +1,321 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2014, 2015 Aaron Culliney + * + */ + +// Based on sample code from https://developer.apple.com/library/mac/samplecode/GLEssentials/Introduction/Intro.html + +#import "EmulatorGLView.h" + +// Apple //e common routines +#import "common.h" + +#if TARGET_OS_MAC +#define USE_DISPLAYLINK 0 +#define BROKEN_DISPLAYLINK 1 +#else +// iOS uses CADisplayLink +#define USE_DISPLAYLINK 1 +#endif + +#define SUPPORT_RETINA_RESOLUTION 1 + +const NSString *kDrawTimerNotification = @"kDrawTimerNotification"; + +@interface EmulatorGLView () + +#if USE_DISPLAYLINK +@property (nonatomic, assign) CVDisplayLinkRef displayLink; +#else +@property (nonatomic, retain) NSTimer *timer; +#endif + +- (void)initGL; + +@end + + +@implementation EmulatorGLView + +#if USE_DISPLAYLINK +@synthesize displayLink = _displayLink; +#else +@synthesize timer = _timer; +#endif + +#pragma mark CVDisplayLink / NSTimer stuff + +#if USE_DISPLAYLINK +- (CVReturn)getFrameForTime:(const CVTimeStamp *)outputTime +{ + // There is no autorelease pool when this method is called + // because it will be called from a background thread. + // It's important to create one or app can leak objects. + @autoreleasepool { + // We draw on a secondary thread through the display link + // When resizing the view, -reshape is called automatically on the main + // thread. Add a mutex around to avoid the threads accessing the context + // simultaneously when resizing + +#if BROKEN_DISPLAYLINK +#warning ASC NOTE 2014/09/27 multi-threaded OpenGL on Mac considered harmful to developer sanity + // 2014/09/27 Kinda defeats the purpose of using CVDisplayLink ... but keeps it from crashing to dispatch to main queue + dispatch_async(dispatch_get_main_queue(), ^{ +#endif + [[self openGLContext] makeCurrentContext]; + [self drawView]; +#if BROKEN_DISPLAYLINK + }); +#endif + } + return kCVReturnSuccess; +} + +// This is the renderer output callback function +static CVReturn displayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp *now, const CVTimeStamp *outputTime, CVOptionFlags flagsIn, CVOptionFlags *flagsOut, void *displayLinkContext) +{ + CVReturn result = [(EmulatorGLView *)displayLinkContext getFrameForTime:outputTime]; + return result; +} + +#else // use NSTimer +- (void)targetMethod:(NSTimer *)theTimer +{ + NSAssert([NSThread isMainThread], @"Timer fired on non-main thread!"); + [[self openGLContext] makeCurrentContext]; + [self drawView]; +} + +#endif + +#pragma mark - + +- (void)awakeFromNib +{ + NSOpenGLPixelFormatAttribute attrs[] = + { + NSOpenGLPFADoubleBuffer, + NSOpenGLPFADepthSize, 24, + // Must specify the 3.2 Core Profile to use OpenGL 3.2 + NSOpenGLPFAOpenGLProfile, + NSOpenGLProfileVersion3_2Core, + 0 + }; + + NSOpenGLPixelFormat *pf = [[[NSOpenGLPixelFormat alloc] initWithAttributes:attrs] autorelease]; + + if (!pf) + { + NSLog(@"No OpenGL pixel format"); + } + + NSOpenGLContext* context = [[[NSOpenGLContext alloc] initWithFormat:pf shareContext:nil] autorelease]; + +#if defined(DEBUG) + // When we're using a CoreProfile context, crash if we call a legacy OpenGL function + // This will make it much more obvious where and when such a function call is made so + // that we can remove such calls. + // Without this we'd simply get GL_INVALID_OPERATION error for calling legacy functions + // but it would be more difficult to see where that function was called. + CGLEnable([context CGLContextObj], kCGLCECrashOnRemovedFunctions); +#endif + + [self setPixelFormat:pf]; + [self setOpenGLContext:context]; + +#if SUPPORT_RETINA_RESOLUTION + // Opt-In to Retina resolution + [self setWantsBestResolutionOpenGLSurface:YES]; +#endif // SUPPORT_RETINA_RESOLUTION +} + +- (void)prepareOpenGL +{ + [super prepareOpenGL]; + + // Make all the OpenGL calls to setup rendering + // and build the necessary rendering objects + [self initGL]; + +#if USE_DISPLAYLINK + // Create a display link capable of being used with all active displays + CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink); + + // Set the renderer output callback function + CVDisplayLinkSetOutputCallback(_displayLink, &displayLinkCallback, self); + + // Set the display link for the current renderer + CGLContextObj cglContext = [[self openGLContext] CGLContextObj]; + CGLPixelFormatObj cglPixelFormat = [[self pixelFormat] CGLPixelFormatObj]; + CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(_displayLink, cglContext, cglPixelFormat); + + // Activate the display link + CVDisplayLinkStart(_displayLink); +#else + [self.timer invalidate]; + self.timer = nil; + self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0/60.0 target:self selector:@selector(targetMethod:) userInfo:nil repeats:YES]; +#endif + + // Register to be notified when the window closes so we can stop the displaylink + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowWillClose:) name:NSWindowWillCloseNotification object:[self window]]; +} + +- (void)windowWillClose:(NSNotification*)notification +{ + // Stop the display link when the window is closing because default + // OpenGL render buffers will be destroyed. If display link continues to + // fire without renderbuffers, OpenGL draw calls will set errors. +#if USE_DISPLAYLINK + CVDisplayLinkStop(_displayLink); +#else + [self.timer invalidate]; + self.timer = nil; +#endif +} + +- (void)initGL +{ + // The reshape function may have changed the thread to which our OpenGL + // context is attached before prepareOpenGL and initGL are called. So call + // makeCurrentContext to ensure that our OpenGL context current to this + // thread (i.e. makeCurrentContext directs all OpenGL calls on this thread + // to [self openGLContext]) + [[self openGLContext] makeCurrentContext]; + + emulator_start(); + + // Synchronize buffer swaps with vertical refresh rate + GLint swapInt = 1; + [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval]; + + // Init our renderer. Use 0 for the defaultFBO which is appropriate for + // OSX (but not iOS since iOS apps must create their own FBO) +#if TARGET_OS_MAC + video_backend->init(0); +#elif TARGET_OS_IPHONE +# error "FBO FIXME TODO" + video_backend->init(otherFBO); +#else +# error "unknown/unsupported Apple platform +#endif +} + +- (void)reshape +{ + [super reshape]; + + // We draw on a secondary thread through the display link. However, when + // resizing the view, -drawRect is called on the main thread. + // Add a mutex around to avoid the threads accessing the context + // simultaneously when resizing. + CGLLockContext([[self openGLContext] CGLContextObj]); + + // Get the view size in Points + NSRect viewRectPoints = [self bounds]; + +#if SUPPORT_RETINA_RESOLUTION + + // Rendering at retina resolutions will reduce aliasing, but at the potential + // cost of framerate and battery life due to the GPU needing to render more + // pixels. + + // Any calculations the renderer does which use pixel dimentions, must be + // in "retina" space. [NSView convertRectToBacking] converts point sizes + // to pixel sizes. Thus the renderer gets the size in pixels, not points, + // so that it can set it's viewport and perform and other pixel based + // calculations appropriately. + // viewRectPixels will be larger (2x) than viewRectPoints for retina displays. + // viewRectPixels will be the same as viewRectPoints for non-retina displays + NSRect viewRectPixels = [self convertRectToBacking:viewRectPoints]; + +#else //if !SUPPORT_RETINA_RESOLUTION + + // App will typically render faster and use less power rendering at + // non-retina resolutions since the GPU needs to render less pixels. There + // is the cost of more aliasing, but it will be no-worse than on a Mac + // without a retina display. + + // Points:Pixels is always 1:1 when not supporting retina resolutions + NSRect viewRectPixels = viewRectPoints; + +#endif // !SUPPORT_RETINA_RESOLUTION + + // Set the new dimensions in our renderer + video_backend->reshape((int)viewRectPixels.size.width, (int)viewRectPixels.size.height); + + CGLUnlockContext([[self openGLContext] CGLContextObj]); +} + +- (void)renewGState +{ + // Called whenever graphics state updated (such as window resize) + + // OpenGL rendering is not synchronous with other rendering on the OSX. + // Therefore, call disableScreenUpdatesUntilFlush so the window server + // doesn't render non-OpenGL content in the window asynchronously from + // OpenGL content, which could cause flickering. (non-OpenGL content + // includes the title bar and drawing done by the app with other APIs) + [[self window] disableScreenUpdatesUntilFlush]; + [super renewGState]; +} + +- (void)drawRect:(NSRect)theRect +{ + NSAssert([NSThread isMainThread], @"drawRect called on non-main thread!"); + // Called during resize operations + // Avoid flickering during resize by drawing + [[self openGLContext] makeCurrentContext]; + [self drawView]; +} + +- (void)drawView +{ + CGLLockContext([[self openGLContext] CGLContextObj]); + video_backend->render(); + CGLFlushDrawable([[self openGLContext] CGLContextObj]); + CGLUnlockContext([[self openGLContext] CGLContextObj]); + [[NSNotificationCenter defaultCenter] postNotificationName:(NSString *)kDrawTimerNotification object:nil]; +} + +- (void)dealloc +{ + // Stop the display link BEFORE releasing anything in the view + // otherwise the display link thread may call into the view and crash + // when it encounters something that has been release +#if USE_DISPLAYLINK + CVDisplayLinkStop(_displayLink); + CVDisplayLinkRelease(_displayLink); +#else + [self.timer invalidate]; + self.timer = nil; +#endif + + // shut down common OpenGL stuff AFTER display link has been released + emulator_shutdown(); + + [super dealloc]; +} + +#pragma mark - +#pragma mark Application Delegate methods + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)application +{ + return YES; +} + +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)application +{ + disk6_eject(0); + disk6_eject(1); + return NSTerminateNow; +} + +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorJoystickCalibrationView.h b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorJoystickCalibrationView.h new file mode 100644 index 00000000..cce7ea35 --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorJoystickCalibrationView.h @@ -0,0 +1,16 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2014, 2015 Aaron Culliney + * + */ + +#import + +@interface EmulatorJoystickCalibrationView : NSView + +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorJoystickCalibrationView.m b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorJoystickCalibrationView.m new file mode 100644 index 00000000..29798b04 --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorJoystickCalibrationView.m @@ -0,0 +1,67 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2013-2015 Aaron Culliney + * + */ + +#import "EmulatorJoystickCalibrationView.h" +#import "common.h" +#import + +@implementation EmulatorJoystickCalibrationView + +- (void)drawRect:(NSRect)dirtyRect +{ + [super drawRect:dirtyRect]; + [self drawView]; +} + +- (void)drawView +{ + static int pulseSize = 1; + + CGRect bounds = [self bounds]; + + NSAssert(bounds.size.height == JOY_RANGE, @"view should be 256pts high"); + NSAssert(bounds.size.width == JOY_RANGE, @"view should be 256pts wide"); + + CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort]; + CGContextSaveGState(context); + CGContextSetLineWidth(context, 1); + + if (joy_clip_to_radius && (joy_mode == JOY_PCJOY)) + { + CGContextSetRGBStrokeColor(context, 0, 0, 0, 1); + CGContextAddEllipseInRect(context, bounds); + CGContextStrokePath(context); + } + + CGFloat x_val = joy_x; + CGFloat y_val = JOY_RANGE-joy_y; + + CGContextSetRGBStrokeColor(context, 1, 0, 0, 1); + CGRect cursor = CGRectMake(x_val-(pulseSize/2.f), y_val-(pulseSize/2.f), pulseSize, pulseSize); + CGContextAddEllipseInRect(context, cursor); + + CGContextStrokePath(context); + CGContextRestoreGState(context); + + pulseSize = ((pulseSize+1) & 0x7) +1; +} + +- (void)keyUp:(NSEvent *)event +{ + [[self nextResponder] keyUp:event]; +} + +- (void)keyDown:(NSEvent *)event +{ + [[self nextResponder] keyDown:event]; +} + +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorJoystickController.h b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorJoystickController.h new file mode 100644 index 00000000..2f98781d --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorJoystickController.h @@ -0,0 +1,16 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2013-2015 Aaron Culliney + * + */ + +#import + +@interface EmulatorJoystickController : NSObject + +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorJoystickController.m b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorJoystickController.m new file mode 100644 index 00000000..b1452419 --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorJoystickController.m @@ -0,0 +1,228 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2014, 2015 Aaron Culliney + * + */ + +#import "EmulatorJoystickController.h" +#import "EmulatorWindowController.h" +#import "common.h" + +#import + +@interface EmulatorJoystickController() +@property (nonatomic, retain) NSDictionary *allJoysticks; ++ (EmulatorJoystickController *)sharedInstance; +- (void)resetJoysticks; +@end + +void gldriver_joystick_reset(void) { + [EmulatorJoystickController sharedInstance]; +} + +@implementation EmulatorJoystickController + +@synthesize allJoysticks = _allJoysticks; + ++ (EmulatorJoystickController *)sharedInstance +{ + static dispatch_once_t onceToken = 0L; + static EmulatorJoystickController *joystickController = nil; + dispatch_once(&onceToken, ^{ + joystickController = [[EmulatorJoystickController alloc] init]; + }); + return joystickController; +} + +- (instancetype)init +{ + self = [super init]; + if (self) + { + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(connectivityPoll:) name:(NSString *)kDrawTimerNotification object:nil]; + } + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + self.allJoysticks = nil; + [super dealloc]; +} + +- (void)resetJoysticks +{ + for (DDHidJoystick *joystick in [self.allJoysticks allValues]) + { + @try { + [joystick setDelegate:nil]; + [joystick stopListening]; + } @catch (NSException *e) { + // hot-plugging joysticks can cause glitches + NSLog(@"Joystick device library raised exception on close : %@", e); + } + } + NSArray *joysticks = [DDHidJoystick allJoysticks]; + NSMutableDictionary *allJoysticks = [NSMutableDictionary dictionary]; + for (DDHidJoystick *joystick in joysticks) { + NSString *key =[NSString stringWithFormat:@"%@-%@-%@", [joystick manufacturer], [joystick serialNumber], [joystick transport]]; + [allJoysticks setObject:joystick forKey:key]; + } + self.allJoysticks = allJoysticks; + dispatch_async(dispatch_get_main_queue(), ^ { + for (DDHidJoystick *joystick in [self.allJoysticks allValues]) + { + NSLog(@"found joystick : '%@' '%@' '%@' %@", [joystick manufacturer], [joystick serialNumber], [joystick transport], joystick); + @try { + [joystick setDelegate:self]; + [joystick startListening]; + } @catch (NSException *e) { + // hot-plugging joystick can cause glitches + NSLog(@"Joystick device library raised exception on start : %@", e); + } + } + }); +} + +#pragma mark - +#pragma mark Joystick connectivity polling + +- (void)connectivityPoll:(NSNotification *)notification +{ + static unsigned int counter = 0; + counter = (counter+1) % 60; + if (counter == 0) + { + NSArray *joysticks = [DDHidJoystick allJoysticks]; + BOOL changed = ([joysticks count] != [self.allJoysticks count]); + for (DDHidJoystick *joystick in joysticks) + { + NSString *key =[NSString stringWithFormat:@"%@-%@-%@", [joystick manufacturer], [joystick serialNumber], [joystick transport]]; + if (![self.allJoysticks objectForKey:key]) + { + changed = YES; + break; + } + } + if (changed) + { + [self resetJoysticks]; + } + } +#ifdef KEYPAD_JOYSTICK + if (joy_mode == JOY_KPAD) + { + c_keys_handle_input(-1, 0, 0); + } +#endif +} + +#pragma mark - +#pragma mark NSObject(DDHidJoystickDelegate) + +#define DDHID_JOYSTICK_NORMALIZER ((float)JOY_RANGE/(DDHID_JOYSTICK_VALUE_MAX*2)) +#define QUARTER_JOY (HALF_JOY_RANGE>>1) + +static inline void clampBeyondRadius(void) { + CGFloat half_x = joy_x - HALF_JOY_RANGE; + CGFloat half_y = joy_y - HALF_JOY_RANGE; + CGFloat r = sqrtf(half_x*half_x + half_y*half_y); + bool shouldClip = (r > HALF_JOY_RANGE); + if (joy_clip_to_radius && shouldClip) { + if (joy_x < HALF_JOY_RANGE) { + joy_x = (joy_x < QUARTER_JOY) ? 0.f : joy_x; + } else { + joy_x = (joy_x < HALF_JOY_RANGE+QUARTER_JOY) ? joy_x : JOY_RANGE-1; + } + if (joy_y < HALF_JOY_RANGE) { + joy_y = (joy_y < QUARTER_JOY) ? 0.f : joy_y; + } else { + joy_y = (joy_y < HALF_JOY_RANGE+QUARTER_JOY) ? joy_y : JOY_RANGE-1; + } + } +} + +- (void)ddhidJoystick:(DDHidJoystick *)joystick stick:(unsigned int)stick xChanged:(int)value +{ +#ifdef KEYPAD_JOYSTICK + if (joy_mode == JOY_KPAD) { + return; + } +#endif + + joy_x = (uint16_t)((value+DDHID_JOYSTICK_VALUE_MAX) * DDHID_JOYSTICK_NORMALIZER); + if (joy_x > 0xFF) { + joy_x = 0xFF; + } + + clampBeyondRadius(); +} + +- (void)ddhidJoystick:(DDHidJoystick *)joystick stick:(unsigned int)stick yChanged:(int)value +{ +#ifdef KEYPAD_JOYSTICK + if (joy_mode == JOY_KPAD) { + return; + } +#endif + + joy_y = (uint16_t)((value+DDHID_JOYSTICK_VALUE_MAX) * DDHID_JOYSTICK_NORMALIZER); + if (joy_y > 0xFF) { + joy_y = 0xFF; + } + + clampBeyondRadius(); +} + +- (void)ddhidJoystick:(DDHidJoystick *)joystick stick:(unsigned int)stick otherAxis:(unsigned)otherAxis valueChanged:(int)value +{ + // NOOP ... +} + +- (void)ddhidJoystick:(DDHidJoystick *)joystick stick:(unsigned int)stick povNumber:(unsigned)povNumber valueChanged:(int)value +{ + // NOOP ... +} + +- (void)ddhidJoystick:(DDHidJoystick *)joystick buttonDown:(unsigned int)buttonNumber +{ +#ifdef KEYPAD_JOYSTICK + if (joy_mode == JOY_KPAD) { + return; + } +#endif + + // sample buttons only if apple keys aren't pressed. keys get set to 0xff, and js buttons are set to 0x80. + if ((buttonNumber == 0x01) && !(joy_button0 & 0x7f)) { + joy_button0 = 0x80; + } + if ((buttonNumber == 0x02) && !(joy_button1 & 0x7f)) { + joy_button1 = 0x80; + } +} + +- (void)ddhidJoystick:(DDHidJoystick *)joystick buttonUp:(unsigned int)buttonNumber +{ +#ifdef KEYPAD_JOYSTICK + if (joy_mode == JOY_KPAD) { + return; + } +#endif + + // sample buttons only if apple keys aren't pressed. keys get set to 0xff, and js buttons are set to 0x80. + if ((buttonNumber == 0x01) && !(joy_button0 & 0x7f)) { + joy_button0 = 0x0; + } + if ((buttonNumber == 0x02) && !(joy_button1 & 0x7f)) { + joy_button1 = 0x0; + } +} + + +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorPrefsController.h b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorPrefsController.h new file mode 100644 index 00000000..f9721221 --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorPrefsController.h @@ -0,0 +1,21 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2013-2015 Aaron Culliney + * + */ + +#import + +#define kApple2PrefStartupDiskA @"kApple2PrefStartupDiskA" +#define kApple2PrefStartupDiskAProtected @"kApple2PrefStartupDiskAProtected" +#define kApple2PrefStartupDiskB @"kApple2PrefStartupDiskB" +#define kApple2PrefStartupDiskBProtected @"kApple2PrefStartupDiskBProtected" + +@interface EmulatorPrefsController : NSWindowController + +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorPrefsController.m b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorPrefsController.m new file mode 100644 index 00000000..8d31c517 --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorPrefsController.m @@ -0,0 +1,353 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2013-2015 Aaron Culliney + * + */ + +#import "EmulatorPrefsController.h" +#import "EmulatorDiskController.h" +#import "EmulatorJoystickCalibrationView.h" +#import "EmulatorWindowController.h" +#import "common.h" + +#define kApple2SavedPrefs @"kApple2SavedPrefs" +#define kApple2CPUSpeed @"kApple2CPUSpeed" +#define kApple2CPUSpeedIsMax @"kApple2CPUSpeedIsMax" +#define kApple2AltSpeed @"kApple2AltSpeed" +#define kApple2AltSpeedIsMax @"kApple2AltSpeedIsMax" +#define kApple2SoundcardConfig @"kApple2SoundcardConfig" +#define kApple2ColorConfig @"kApple2ColorConfig" +#define kApple2JoystickConfig @"kApple2JoystickConfig" +#define kApple2JoystickAutoRecenter @"kApple2JoystickAutoRecenter" +#define kApple2JoystickClipToRadius @"kApple2JoystickClipToRadius" +#define kApple2JoystickStep @"kApple2JoystickStep" + +@interface EmulatorPrefsController () + +@property (assign) IBOutlet NSSlider *cpuSlider; +@property (assign) IBOutlet NSSlider *altSlider; +@property (assign) IBOutlet NSTextField *cpuSliderLabel; +@property (assign) IBOutlet NSTextField *altSliderLabel; +@property (assign) IBOutlet NSButton *cpuMaxChoice; +@property (assign) IBOutlet NSButton *altMaxChoice; + +@property (assign) IBOutlet NSMatrix *soundCardChoice; + +@property (assign) IBOutlet NSPopUpButton *colorChoice; + +@property (assign) IBOutlet NSPopUpButton *joystickChoice; +@property (assign) IBOutlet NSButton *joystickRecenter; +@property (assign) IBOutlet NSButton *joystickClipToRadius; +@property (assign) IBOutlet NSTextField *joystickStepLabel; +@property (assign) IBOutlet NSStepper *joystickStepper; +@property (assign) IBOutlet NSTextField *joystickStepperLabel; +@property (assign) IBOutlet NSTextField *joystickKPadNotes; +@property (assign) IBOutlet NSTextField *joystickDeviceNotes; + +@property (assign) IBOutlet NSTextField *button0Pressed; +@property (assign) IBOutlet NSTextField *button1Pressed; +@property (assign) IBOutlet EmulatorJoystickCalibrationView *joystickCalibrationView; + +@end + +@implementation EmulatorPrefsController + +- (void)awakeFromNib +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + BOOL firstTime = ![defaults boolForKey:kApple2SavedPrefs]; + if (firstTime) + { + [defaults setBool:YES forKey:kApple2SavedPrefs]; + [defaults setDouble:1.0 forKey:kApple2CPUSpeed]; + [defaults setDouble:CPU_SCALE_SLOWEST forKey:kApple2AltSpeed]; + [defaults setBool:NO forKey:kApple2CPUSpeedIsMax]; + [defaults setBool:NO forKey:kApple2AltSpeedIsMax]; + [defaults setInteger:COLOR_INTERP forKey:kApple2ColorConfig]; + [defaults setInteger:JOY_KPAD forKey:kApple2JoystickConfig]; + [defaults setBool:YES forKey:kApple2JoystickAutoRecenter]; + [defaults removeObjectForKey:kApple2PrefStartupDiskA]; + [defaults removeObjectForKey:kApple2PrefStartupDiskB]; + } + + cpu_scale_factor = [defaults doubleForKey:kApple2CPUSpeed]; + [self.cpuSlider setDoubleValue:cpu_scale_factor]; + [self.cpuSliderLabel setStringValue:[NSString stringWithFormat:@"%.0f%%", cpu_scale_factor*100]]; + if ([defaults boolForKey:kApple2CPUSpeedIsMax]) + { + cpu_scale_factor = CPU_SCALE_FASTEST; + [self.cpuMaxChoice setState:NSOnState]; + [self.cpuSlider setEnabled:NO]; + } + else + { + [self.cpuMaxChoice setState:NSOffState]; + [self.cpuSlider setEnabled:YES]; + } + + cpu_altscale_factor = [defaults doubleForKey:kApple2AltSpeed]; + [self.altSlider setDoubleValue:cpu_altscale_factor]; + [self.altSliderLabel setStringValue:[NSString stringWithFormat:@"%.0f%%", cpu_altscale_factor*100]]; + if ([defaults boolForKey:kApple2AltSpeedIsMax]) + { + cpu_altscale_factor = CPU_SCALE_FASTEST; + [self.altMaxChoice setState:NSOnState]; + [self.altSlider setEnabled:NO]; + } + else + { + [self.altMaxChoice setState:NSOffState]; + [self.altSlider setEnabled:YES]; + } + +#warning TODO : actually implement sound card choices + [self.soundCardChoice deselectAllCells]; + [self.soundCardChoice selectCellAtRow:1 column:0]; + + NSInteger mode = [defaults integerForKey:kApple2ColorConfig]; + if (! ((mode >= COLOR_NONE) && (mode < NUM_COLOROPTS)) ) + { + mode = COLOR_NONE; + } + [self.colorChoice selectItemAtIndex:mode]; + color_mode = (color_mode_t)mode; + + mode = [defaults integerForKey:kApple2JoystickConfig]; + if (! ((mode >= JOY_PCJOY) && (mode < NUM_JOYOPTS)) ) + { + mode = JOY_PCJOY; + } + joy_mode = (joystick_mode_t)mode; + [self.joystickChoice selectItemAtIndex:mode]; + +#ifdef KEYPAD_JOYSTICK + joy_auto_recenter = [defaults integerForKey:kApple2JoystickAutoRecenter]; + [self.joystickRecenter setState:joy_auto_recenter ? NSOnState : NSOffState]; + joy_step = [defaults integerForKey:kApple2JoystickStep]; + if (!joy_step) + { + joy_step = 1; + } + [self.joystickStepLabel setIntegerValue:joy_step]; + [self.joystickStepper setIntegerValue:joy_step]; +#endif + + joy_clip_to_radius = [defaults boolForKey:kApple2JoystickClipToRadius]; + [self.joystickClipToRadius setState:joy_clip_to_radius ? NSOnState : NSOffState]; + + [self _setupJoystickUI]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(drawJoystickCalibration:) name:(NSString *)kDrawTimerNotification object:nil]; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [super dealloc]; +} + +- (void)_savePrefs +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults setBool:YES forKey:kApple2SavedPrefs]; + [defaults setDouble:cpu_scale_factor forKey:kApple2CPUSpeed]; + [defaults setDouble:cpu_altscale_factor forKey:kApple2AltSpeed]; + [defaults setBool:([self.cpuMaxChoice state] == NSOnState) forKey:kApple2CPUSpeedIsMax]; + [defaults setBool:([self.altMaxChoice state] == NSOnState) forKey:kApple2AltSpeedIsMax]; + [defaults setInteger:color_mode forKey:kApple2ColorConfig]; + [defaults setInteger:joy_mode forKey:kApple2JoystickConfig]; + [defaults setInteger:joy_step forKey:kApple2JoystickStep]; + [defaults setBool:joy_auto_recenter forKey:kApple2JoystickAutoRecenter]; + [defaults setBool:joy_clip_to_radius forKey:kApple2JoystickClipToRadius]; +} + +- (IBAction)sliderDidMove:(id)sender +{ + NSSlider *slider = (NSSlider *)sender; + double value = [slider doubleValue]; + if (slider == self.cpuSlider) + { + cpu_scale_factor = value; + [self.cpuSliderLabel setStringValue:[NSString stringWithFormat:@"%.0f%%", value*100]]; + } + else + { + cpu_altscale_factor = value; + [self.altSliderLabel setStringValue:[NSString stringWithFormat:@"%.0f%%", value*100]]; + } + + timing_initialize(); + + [self _savePrefs]; +} + +- (IBAction)peggedChoiceChanged:(id)sender +{ + NSButton *maxButton = (NSButton *)sender; + if (maxButton == self.cpuMaxChoice) + { + [self.cpuSlider setEnabled:([maxButton state] != NSOnState)]; + cpu_scale_factor = ([maxButton state] == NSOnState) ? CPU_SCALE_FASTEST : [self.cpuSlider doubleValue]; + } + else + { + [self.altSlider setEnabled:([maxButton state] != NSOnState)]; + cpu_altscale_factor = ([maxButton state] == NSOnState) ? CPU_SCALE_FASTEST : [self.altSlider doubleValue]; + } + + timing_initialize(); + + [self _savePrefs]; +} + +- (IBAction)colorChoiceChanged:(id)sender +{ + NSInteger mode = [self.colorChoice indexOfSelectedItem]; + if (! ((mode >= COLOR_NONE) && (mode < NUM_COLOROPTS)) ) + { + mode = COLOR_NONE; + } + color_mode = (color_mode_t)mode; + [self _savePrefs]; + +#warning HACK TODO FIXME need to refactor video resetting procedure + video_reset(); + video_setpage(!!(softswitches & SS_SCREEN)); + video_redraw(); +} + +- (IBAction)soundCardChoiceChanged:(id)sender +{ +#warning TODO : make soundcard configurable at runtime +} + +#pragma mark - +#pragma mark Joystick preferences + +- (void)_setupJoystickUI +{ + [self.joystickRecenter setHidden:(joy_mode == JOY_PCJOY)]; + [self.joystickClipToRadius setHidden:(joy_mode != JOY_PCJOY)]; + [self.joystickStepLabel setHidden:(joy_mode == JOY_PCJOY)]; + [self.joystickStepper setHidden:(joy_mode == JOY_PCJOY)]; + [self.joystickStepperLabel setHidden:(joy_mode == JOY_PCJOY)]; + [self.joystickKPadNotes setHidden:(joy_mode == JOY_PCJOY)]; + [self.joystickDeviceNotes setHidden:(joy_mode != JOY_PCJOY)]; +} + +- (IBAction)joystickChoiceChanged:(id)sender +{ + NSInteger mode = [self.joystickChoice indexOfSelectedItem]; + if (! ((mode >= JOY_PCJOY) && (mode < NUM_JOYOPTS)) ) + { + mode = JOY_PCJOY; + } + joy_mode = (joystick_mode_t)mode; + [self _setupJoystickUI]; + [self _savePrefs]; +} + +- (IBAction)autoRecenterChoiceChanged:(id)sender +{ + joy_auto_recenter = ([self.joystickRecenter state] == NSOnState); + [self _savePrefs]; +} + +- (IBAction)clipToRadiusChoiceChanged:(id)sender +{ + joy_clip_to_radius = ([self.joystickClipToRadius state] == NSOnState); + [self _savePrefs]; +} + +- (IBAction)stepValueChanged:(id)sender +{ + joy_step = [self.joystickStepper intValue]; + [self.joystickStepLabel setIntegerValue:joy_step]; + [self _savePrefs]; +} + +#pragma mark - +#pragma Joystick calibration + +- (void)drawJoystickCalibration:(NSNotification *)notification +{ + if (![self.joystickCalibrationView isHidden]) + { + [self.joystickCalibrationView setNeedsDisplay:YES]; + [self.button0Pressed setHidden:!(joy_button0)]; + [self.button1Pressed setHidden:!(joy_button1)]; + } +} + +- (void)flagsChanged:(NSEvent*)event +{ + // NOTE : yay, awesome! checking for ([event modifierFlags] & NSAlternateKeyMask) does not work properly if both were pressed and then one ALT key is unpressed ... kudoes to Apple for an excellent key-handling API /sarc + static BOOL leftAltEngaged = NO; + static BOOL rightAltEngaged = NO; + switch ([event keyCode]) + { + case ALT_LT: + leftAltEngaged = !leftAltEngaged; + c_keys_handle_input(SCODE_L_ALT, /*pressed:*/leftAltEngaged, /*cooked:*/0); + break; + case ALT_RT: + rightAltEngaged = !rightAltEngaged; + c_keys_handle_input(SCODE_R_ALT, /*pressed:*/rightAltEngaged, /*cooked:*/0); + break; + default: + break; + } + if (!([event modifierFlags] & NSAlternateKeyMask)) + { + // But we can trust the system state if no alt modifier exists ... this resets b0rken edge cases + leftAltEngaged = NO; + rightAltEngaged = NO; + } + [self.button0Pressed setHidden:!(joy_button0)]; + [self.button1Pressed setHidden:!(joy_button1)]; +} + +- (void)_handleKeyEvent:(NSEvent *)event pressed:(BOOL)pressed +{ + unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0]; + int scode = (int)c; + switch (scode) + { + case NSUpArrowFunctionKey: + c_keys_handle_input(SCODE_U, pressed, /*cooked:*/0); + break; + case NSDownArrowFunctionKey: + c_keys_handle_input(SCODE_D, pressed, /*cooked:*/0); + break; + case NSLeftArrowFunctionKey: + c_keys_handle_input(SCODE_L, pressed, /*cooked:*/0); + break; + case NSRightArrowFunctionKey: + c_keys_handle_input(SCODE_R, pressed, /*cooked:*/0); + break; + default: + break; + } +} + +- (void)keyUp:(NSEvent *)event +{ + [self _handleKeyEvent:event pressed:NO]; + + // Allow other character to be handled (or not and beep) + //[super keyDown:event]; +} + +- (void)keyDown:(NSEvent *)event +{ + [self _handleKeyEvent:event pressed:YES]; + + // Allow other character to be handled (or not and beep) + //[super keyDown:event]; +} + +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorWindow.h b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorWindow.h new file mode 100644 index 00000000..a9564934 --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorWindow.h @@ -0,0 +1,16 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2013-2015 Aaron Culliney + * + */ + +#import + +@interface EmulatorWindow : NSWindow + +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorWindow.m b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorWindow.m new file mode 100644 index 00000000..b0d98654 --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorWindow.m @@ -0,0 +1,26 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2013-2015 Aaron Culliney + * + */ + +#import "EmulatorWindow.h" + +@implementation EmulatorWindow + +- (void)keyUp:(NSEvent *)event +{ + [[self windowController] keyUp:event]; +} + +- (void)keyDown:(NSEvent *)event +{ + [[self windowController] keyDown:event]; +} + +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorWindowController.h b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorWindowController.h new file mode 100644 index 00000000..9562f4e2 --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorWindowController.h @@ -0,0 +1,29 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2013-2015 Aaron Culliney + * + */ + +// Based on sample code from https://developer.apple.com/library/mac/samplecode/GLEssentials/Introduction/Intro.html + +#import +#import "EmulatorGLView.h" + +#define CAPS_LOCK 0x39 +#define SHIFT_LT 0x38 +#define SHIFT_RT 0x3c +#define CTRL_LT 0x3b +#define CTRL_RT 0x3e +#define ALT_LT 0x3a +#define ALT_RT 0x3d + +extern const NSString *kDrawTimerNotification; + +@interface EmulatorWindowController : NSWindowController + +@end diff --git a/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorWindowController.m b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorWindowController.m new file mode 100644 index 00000000..79367081 --- /dev/null +++ b/Apple2Mac/Apple2Mac/Classes/OSX/EmulatorWindowController.m @@ -0,0 +1,404 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2013-2015 Aaron Culliney + * + */ + +// Based on sample code from https://developer.apple.com/library/mac/samplecode/GLEssentials/Introduction/Intro.html + +#import "EmulatorWindowController.h" +#import "EmulatorFullscreenWindow.h" +#import "common.h" + +@interface EmulatorWindowController () + +@property (nonatomic, assign) BOOL paused; + +@property (assign) IBOutlet EmulatorGLView *view; +@property (assign) IBOutlet NSWindow *disksWindow; +@property (assign) IBOutlet NSWindow *prefsWindow; +@property (assign) IBOutlet NSMenuItem *pauseMenuItem; +@property (assign) IBOutlet NSToolbar *toolBar; +@property (assign) IBOutlet NSToolbarItem *pauseItem; +@property (assign) IBOutlet NSToolbarItem *disk1Item; +@property (assign) IBOutlet NSToolbarItem *disk2Item; +@property (nonatomic, retain) EmulatorFullscreenWindow *fullscreenWindow; +@property (nonatomic, retain) NSWindow *standardWindow; + +@end + + +@implementation EmulatorWindowController + +@synthesize paused = _paused; +@synthesize fullscreenWindow = _fullscreenWindow; +@synthesize standardWindow = _standardWindow; + +- (id)initWithWindow:(NSWindow *)window +{ + self = [super initWithWindow:window]; + + if (self) + { + // Initialize to nil since it indicates app is not fullscreen + self.fullscreenWindow = nil; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowWillClose:) name:NSWindowWillCloseNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowWillOpen:) name:NSWindowDidBecomeKeyNotification object:nil]; + } + + return self; +} + +- (void)dealloc +{ +#warning TODO FIXME ... probably should exit emulator if this gets invoked ... + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [super dealloc]; +} + +- (IBAction)reboot:(id)sender +{ + [[self disksWindow] close]; + cpu65_reboot(); +} + +- (IBAction)showDisksWindow:(id)sender +{ + if (self.fullscreenWindow) + { + [self toggleFullScreen:nil]; + [self.standardWindow setFrame:[[NSScreen mainScreen] frame] display:YES]; + } + [self.disksWindow makeKeyAndOrderFront:sender]; +} + +- (IBAction)showPreferences:(id)sender +{ + if (self.fullscreenWindow) + { + [self toggleFullScreen:nil]; + [self.standardWindow setFrame:[[NSScreen mainScreen] frame] display:YES]; + } + [self.prefsWindow makeKeyAndOrderFront:sender]; +} + +- (IBAction)toggleFullScreen:(id)sender +{ + if (self.fullscreenWindow) + { + [NSCursor unhide]; + [self goWindow]; + } + else + { + [NSCursor hide]; + [self goFullscreen]; + } +} + +- (IBAction)toggleCPUSpeed:(id)sender +{ + cpu_pause(); + timing_toggleCPUSpeed(); + if (video_backend && video_backend->animation_showCPUSpeed) + { + video_backend->animation_showCPUSpeed(); + } + cpu_resume(); +} + +- (IBAction)togglePause:(id)sender +{ + NSAssert(pthread_main_np(), @"Pause emulation called from non-main thread"); + self.paused = !_paused; +} + +- (void)setPaused:(BOOL)paused +{ + if (_paused == paused) + { + return; + } + + _paused = paused; + if (paused) + { + [[self pauseMenuItem] setTitle:@"Resume Emulation"]; + [[self pauseItem] setImage:[NSImage imageNamed:@"Run"]]; + [[self pauseItem] setLabel:@"Paused"]; + cpu_pause(); + } + else + { + [[self pauseMenuItem] setTitle:@"Pause Emulation"]; + [[self pauseItem] setImage:[NSImage imageNamed:@"Stop"]]; + [[self pauseItem] setLabel:@"Running"]; + cpu_resume(); + } + if (video_backend && video_backend->animation_showPaused) + { + video_backend->animation_showPaused(); + } +} + +- (void)windowWillOpen:(NSNotification *)notification +{ + if ((self.prefsWindow == notification.object) || (self.disksWindow == notification.object)) + { + self.paused = YES; + } +} + +- (void)windowWillClose:(NSNotification *)notification +{ + if (self.prefsWindow == notification.object) + { + self.paused = [self.disksWindow isVisible]; + } + if (self.disksWindow == notification.object) + { + self.paused = [self.prefsWindow isVisible]; + } +} + +- (void)goFullscreen +{ + // If app is already fullscreen... + if (self.fullscreenWindow) + { + //...don't do anything + return; + } + + // Allocate a new fullscreen window + self.fullscreenWindow = [[[EmulatorFullscreenWindow alloc] init] autorelease]; + + // Resize the view to screensize + NSRect viewRect = [self.fullscreenWindow frame]; + + // Set the view to the size of the fullscreen window + [self.view setFrameSize: viewRect.size]; + + // Set the view in the fullscreen window + [self.fullscreenWindow setContentView:self.view]; + + self.standardWindow = [self window]; + + // Hide non-fullscreen window so it doesn't show up when switching out + // of this app (i.e. with CMD-TAB) + [self.standardWindow orderOut:self]; + + // Set controller to the fullscreen window so that all input will go to + // this controller (self) + [self setWindow:self.fullscreenWindow]; + + // Show the window and make it the key window for input + [self.fullscreenWindow makeKeyAndOrderFront:self]; +} + +- (void)goWindow +{ + // If controller doesn't have a full screen window... + if (self.fullscreenWindow == nil) + { + //...app is already windowed so don't do anything + return; + } + + // Get the rectangle of the original window + NSRect viewRect = [self.standardWindow frame]; + + // Set the view rect to the new size + [self.view setFrame:viewRect]; + + // Set controller to the standard window so that all input will go to + // this controller (self) + [self setWindow:self.standardWindow]; + + // Set the content of the orginal window to the view + [[self window] setContentView:self.view]; + + // Show the window and make it the key window for input + [[self window] makeKeyAndOrderFront:self]; + + // Release/nilify fullscreenWindow + self.fullscreenWindow = nil; +} + +- (void)flagsChanged:(NSEvent*)event +{ + static BOOL modified_caps_lock = NO; + switch ([event keyCode]) + { + case CAPS_LOCK: + { + if ([event modifierFlags] & NSAlphaShiftKeyMask) + { + modified_caps_lock = YES; + caps_lock = true; + } + else + { + caps_lock = false; + } + } + + case SHIFT_LT: + c_keys_handle_input(SCODE_L_SHIFT, ([event modifierFlags] & NSShiftKeyMask), 0); + break; + + case SHIFT_RT: + c_keys_handle_input(SCODE_R_SHIFT, ([event modifierFlags] & NSShiftKeyMask), 0); + break; + + case CTRL_LT: + c_keys_handle_input(SCODE_L_CTRL, ([event modifierFlags] & NSControlKeyMask), 0); + break; + + case CTRL_RT: + c_keys_handle_input(SCODE_R_CTRL, ([event modifierFlags] & NSControlKeyMask), 0); + break; + + case ALT_LT: + c_keys_handle_input(SCODE_L_ALT, ([event modifierFlags] & NSAlternateKeyMask), 0); + break; + + case ALT_RT: + c_keys_handle_input(SCODE_R_ALT, ([event modifierFlags] & NSAlternateKeyMask), 0); + break; + + default: + break; + } +} + +- (void)_handleKeyEvent:(NSEvent *)event pressed:(BOOL)pressed +{ + unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0]; + int scode = (int)c; + + int cooked = 0; + switch (scode) + { + case 0x1b: + scode = SCODE_ESC; + break; + + case NSUpArrowFunctionKey: + scode = SCODE_U; + break; + case NSDownArrowFunctionKey: + scode = SCODE_D; + break; + case NSLeftArrowFunctionKey: + scode = SCODE_L; + break; + case NSRightArrowFunctionKey: + scode = SCODE_R; + break; + + case NSF1FunctionKey: + scode = SCODE_F1; + break; + case NSF2FunctionKey: + scode = SCODE_F2; + break; + case NSF3FunctionKey: + scode = SCODE_F3; + break; + case NSF4FunctionKey: + scode = SCODE_F4; + break; + case NSF5FunctionKey: + scode = SCODE_F5; + break; + case NSF6FunctionKey: + scode = SCODE_F6; + break; + case NSF7FunctionKey: + scode = SCODE_F7; + break; + case NSF8FunctionKey: + scode = SCODE_F8; + break; + case NSF9FunctionKey: + scode = SCODE_F9; + break; + case NSF10FunctionKey: + scode = SCODE_F10; + break; + case NSF11FunctionKey: + scode = SCODE_F11; + break; + case NSF12FunctionKey: + scode = SCODE_F12; + break; + + case NSInsertFunctionKey: + scode = SCODE_INS; + break; + case NSDeleteFunctionKey: + scode = SCODE_DEL; + break; + case NSHomeFunctionKey: + scode = SCODE_HOME; + break; + case NSEndFunctionKey: + scode = SCODE_END; + break; + + case NSPageUpFunctionKey: + scode = SCODE_PGUP; + break; + case NSPageDownFunctionKey: + scode = SCODE_PGDN; + break; + + case NSPrintScreenFunctionKey: + scode = SCODE_PRNT; + break; + case NSPauseFunctionKey: + scode = SCODE_PAUSE; + break; + case NSBreakFunctionKey: + scode = SCODE_BRK; + break; + + default: + if ([event modifierFlags] & NSControlKeyMask) + { + scode = c_keys_ascii_to_scancode(scode); + cooked = 0; + } + else + { + cooked = 1; + } + break; + } + + c_keys_handle_input(scode, pressed, cooked); +} + +- (void)keyUp:(NSEvent *)event +{ + [self _handleKeyEvent:event pressed:NO]; + + // Allow other character to be handled (or not and beep) + //[super keyDown:event]; +} + +- (void)keyDown:(NSEvent *)event +{ + [self _handleKeyEvent:event pressed:YES]; + + // Allow other character to be handled (or not and beep) + //[super keyDown:event]; +} + +@end diff --git a/Apple2Mac/Apple2Mac/Images.xcassets/Contents.json b/Apple2Mac/Apple2Mac/Images.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Apple2Mac/Apple2Mac/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Apple2Mac/Apple2Mac/Images.xcassets/Run.imageset/Contents.json b/Apple2Mac/Apple2Mac/Images.xcassets/Run.imageset/Contents.json new file mode 100644 index 00000000..8d226a5d --- /dev/null +++ b/Apple2Mac/Apple2Mac/Images.xcassets/Run.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "StepForwardNormalBlue.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Apple2Mac/Apple2Mac/Images.xcassets/Run.imageset/StepForwardNormalBlue.png b/Apple2Mac/Apple2Mac/Images.xcassets/Run.imageset/StepForwardNormalBlue.png new file mode 100644 index 00000000..60839c8d Binary files /dev/null and b/Apple2Mac/Apple2Mac/Images.xcassets/Run.imageset/StepForwardNormalBlue.png differ diff --git a/Apple2Mac/Apple2Mac/Images.xcassets/Stop.imageset/Contents.json b/Apple2Mac/Apple2Mac/Images.xcassets/Stop.imageset/Contents.json new file mode 100644 index 00000000..a200218c --- /dev/null +++ b/Apple2Mac/Apple2Mac/Images.xcassets/Stop.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Stop1NormalBlue.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Apple2Mac/Apple2Mac/Images.xcassets/Stop.imageset/Stop1NormalBlue.png b/Apple2Mac/Apple2Mac/Images.xcassets/Stop.imageset/Stop1NormalBlue.png new file mode 100644 index 00000000..40b188d4 Binary files /dev/null and b/Apple2Mac/Apple2Mac/Images.xcassets/Stop.imageset/Stop1NormalBlue.png differ diff --git a/Apple2Mac/Apple2Mac/fr.lproj/Credits.rtf b/Apple2Mac/Apple2Mac/fr.lproj/Credits.rtf new file mode 100644 index 00000000..221cc8d9 --- /dev/null +++ b/Apple2Mac/Apple2Mac/fr.lproj/Credits.rtf @@ -0,0 +1,29 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210 +{\fonttbl\f0\fnil\fcharset0 Menlo-Bold;\f1\fnil\fcharset0 Menlo-Regular;\f2\fnil\fcharset0 Menlo-Italic; +} +{\colortbl;\red255\green255\blue255;} +\vieww9600\viewh8400\viewkind0 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\sl216\slmult1\qc + +\f0\b\fs24 \cf0 Authors\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\sl216\slmult1\pardirnatural\qc + +\f1\b0 \cf0 Aaron Culliney\ +and other contributors\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\sl120\slmult1\pardirnatural\qc +\cf0 \ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\sl216\slmult1\pardirnatural\qc + +\f0\b \cf0 Web Resources +\f1\b0 \ + +\f2\i ftp.apple.asimov.net +\f1\i0 and elsewhere\ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\sl120\slmult1\pardirnatural\qc +\cf0 \ +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\sl216\slmult1\pardirnatural\qc + +\f0\b \cf0 Special thanks to +\f1\b0 \ +Tom Charlesworth\ +and the AppleWin project} diff --git a/Apple2Mac/Apple2Mac/fr.lproj/InfoPlist.strings b/Apple2Mac/Apple2Mac/fr.lproj/InfoPlist.strings new file mode 100644 index 00000000..477b28ff --- /dev/null +++ b/Apple2Mac/Apple2Mac/fr.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Apple2Mac/Apple2Mac/fr.lproj/MainMenu.xib b/Apple2Mac/Apple2Mac/fr.lproj/MainMenu.xib new file mode 100644 index 00000000..cc4ad149 --- /dev/null +++ b/Apple2Mac/Apple2Mac/fr.lproj/MainMenu.xib @@ -0,0 +1,1065 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "Clamp Beyond Radius" setting is recommended for gamepad devices (not traditional joysticks) which cannot generate values in the extreme corners. + + + + Clamp Beyond Radius setting is recommended for gamepad devices (not traditional joysticks) which cannot generate values in the extreme corners. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Apple2Mac/Apple2Mac/main.m b/Apple2Mac/Apple2Mac/main.m new file mode 100644 index 00000000..b6ba8c81 --- /dev/null +++ b/Apple2Mac/Apple2Mac/main.m @@ -0,0 +1,36 @@ +/* + * Apple // emulator for *ix + * + * This software package is subject to the GNU General Public License + * version 3 or later (your choice) as published by the Free Software + * Foundation. + * + * Copyright 2014, 2015 Aaron Culliney + * + */ + +#if TARGET_OS_IPHONE +#import +#else +#import +#endif + +extern int argc; +extern const char **argv; + +int main(int argc_, const char *argv_[]) +{ + int retVal = 1; + argc = argc_; + argv = argv_; + +#if TARGET_OS_IPHONE + @autoreleasepool { + retVal = UIApplicationMain(argc, argv, nil, nil); + } +#else + retVal = NSApplicationMain(argc, argv); +#endif + + return retVal; +}