A Mac preferences window and settings

This commit is contained in:
Aaron Culliney 2014-10-19 12:56:30 -07:00
parent c140c5c7e0
commit cfc779a86f
7 changed files with 788 additions and 41 deletions

View File

@ -82,7 +82,6 @@
773B3DAD19568A570085CE5F /* debugger.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7319568A570085CE5F /* debugger.c */; };
773B3DAE19568A570085CE5F /* opcodes.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7419568A570085CE5F /* opcodes.c */; };
773B3DAF19568A570085CE5F /* misc.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7519568A570085CE5F /* misc.c */; };
773B3DB019568A570085CE5F /* prefs.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7719568A570085CE5F /* prefs.c */; };
773B3DBC19568A570085CE5F /* timing.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D8719568A570085CE5F /* timing.c */; };
773B3DBE19568A570085CE5F /* vm.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D8D19568A570085CE5F /* vm.c */; };
773B3DBF19568A570085CE5F /* cpu.S in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D9019568A570085CE5F /* cpu.S */; };
@ -90,6 +89,8 @@
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 */; };
779DD830195BD9F900DF89E5 /* prefs.c in Sources */ = {isa = PBXBuildFile; fileRef = 773B3D7719568A570085CE5F /* prefs.c */; };
@ -250,6 +251,8 @@
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 = "<group>"; };
773BC91519F2E6A900996893 /* EmulatorDiskController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorDiskController.m; path = Classes/OSX/EmulatorDiskController.m; sourceTree = "<group>"; };
773BC91719F2FD4500996893 /* EmulatorPrefsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulatorPrefsController.h; path = Classes/OSX/EmulatorPrefsController.h; sourceTree = "<group>"; };
773BC91819F2FD4500996893 /* EmulatorPrefsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmulatorPrefsController.m; path = Classes/OSX/EmulatorPrefsController.m; sourceTree = "<group>"; };
779DD826195764E200DF89E5 /* rom-shim.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "rom-shim.c"; sourceTree = "<group>"; };
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 = "/Users/aaronculliney/Documents/00web/apple2/Apple2Mac/Apple2MacTests/Apple2MacTestCPU-Info.plist"; sourceTree = "<absolute>"; };
@ -450,16 +453,18 @@
773B3D431956897D0085CE5F /* Classes */ = {
isa = PBXGroup;
children = (
773BC91419F2E6A900996893 /* EmulatorDiskController.h */,
773BC91519F2E6A900996893 /* EmulatorDiskController.m */,
77E1C0C219D7298F004344E0 /* EmulatorFullscreenWindow.m */,
77E1C0C319D7298F004344E0 /* EmulatorFullscreenWindow.h */,
77E1C0C019D7298F004344E0 /* EmulatorGLView.m */,
77E1C0C119D7298F004344E0 /* EmulatorGLView.h */,
773BC91719F2FD4500996893 /* EmulatorPrefsController.h */,
773BC91819F2FD4500996893 /* EmulatorPrefsController.m */,
77E1C0BE19D7298F004344E0 /* EmulatorWindowController.m */,
77E1C0BF19D7298F004344E0 /* EmulatorWindowController.h */,
4AC7A76B19ECC3FB00BCD457 /* EmulatorWindow.h */,
4AC7A76C19ECC3FB00BCD457 /* EmulatorWindow.m */,
773BC91419F2E6A900996893 /* EmulatorDiskController.h */,
773BC91519F2E6A900996893 /* EmulatorDiskController.m */,
);
name = Classes;
sourceTree = "<group>";
@ -948,7 +953,6 @@
773B3DBF19568A570085CE5F /* cpu.S in Sources */,
779F565D19EAF66E00A6F107 /* speaker.c in Sources */,
779F565B19EAF66E00A6F107 /* soundcore-openal.c in Sources */,
773B3DB019568A570085CE5F /* prefs.c in Sources */,
773B3DA419568A570085CE5F /* display.c in Sources */,
773B3DA319568A570085CE5F /* disk.c in Sources */,
773B3DAD19568A570085CE5F /* debugger.c in Sources */,
@ -958,6 +962,7 @@
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 */,
@ -972,6 +977,7 @@
779F565E19EAF66E00A6F107 /* win-shim.c in Sources */,
779F565919EAF66E00A6F107 /* AY8910.c in Sources */,
77E1C0C619D7298F004344E0 /* EmulatorFullscreenWindow.m in Sources */,
773BC91919F2FD4500996893 /* EmulatorPrefsController.m in Sources */,
773B3DA519568A570085CE5F /* font.c in Sources */,
773B3DA019568A570085CE5F /* cpu-supp.c in Sources */,
779F561C19D7929100A6F107 /* glvideo.c in Sources */,

View File

@ -47,12 +47,21 @@ CA
<menuItem isSeparatorItem="YES" id="236">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Preferences…" keyEquivalent="," id="129"/>
<menuItem title="Preferences…" keyEquivalent="," id="129">
<connections>
<action selector="makeKeyAndOrderFront:" target="Mzv-VG-jce" id="Oek-48-Eyd"/>
</connections>
</menuItem>
<menuItem title="Toggle Full Screen..." keyEquivalent="F" id="rP9-cs-9dM">
<connections>
<action selector="toggleFullScreen:" target="M8b-ga-iOS" id="Xan-eQ-CRM"/>
</connections>
</menuItem>
<menuItem title="Toggle CPU Speed" keyEquivalent="S" id="b9q-zr-oNh">
<connections>
<action selector="toggleCPUSpeed:" target="M8b-ga-iOS" id="fA3-dJ-wtg"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="143">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
@ -106,12 +115,13 @@ CA
<window title="Apple2Mac" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371" userLabel="Window - Apple2Mac" customClass="EmulatorWindow">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="200" y="200" width="320" height="280"/>
<rect key="contentRect" x="200" y="200" width="568" height="384"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1178"/>
<view key="contentView" id="372" customClass="EmulatorGLView">
<rect key="frame" x="0.0" y="0.0" width="320" height="280"/>
<rect key="frame" x="0.0" y="-1" width="568" height="384"/>
<autoresizingMask key="autoresizingMask"/>
</view>
<point key="canvasLocation" x="-200" y="-887"/>
</window>
<customObject id="494" userLabel="EmulatorGLView" customClass="EmulatorGLView"/>
<customObject id="M8b-ga-iOS" customClass="EmulatorWindowController" colorLabel="IBBuiltInLabel-Blue">
@ -125,21 +135,22 @@ CA
<outlet property="diskInA" destination="cb9-Pc-Ggd" id="kP3-qf-vci"/>
<outlet property="diskInB" destination="5oU-oN-vUH" id="lNx-Lm-0FA"/>
<outlet property="disksWindow" destination="RAk-at-ZT4" id="64k-qW-zF5"/>
<outlet property="prefsWindow" destination="Mzv-VG-jce" id="dQt-pf-qdi"/>
<outlet property="view" destination="372" id="pRG-Kn-92X"/>
<outlet property="window" destination="371" id="z3B-S9-PsV"/>
</connections>
</customObject>
<window title="Insert Disks" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="RAk-at-ZT4">
<window title="Insert Disks" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="RAk-at-ZT4" userLabel="Window - Insert Disks">
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="109" y="132" width="480" height="237"/>
<rect key="contentRect" x="109" y="132" width="522" height="302"/>
<rect key="screenRect" x="0.0" y="0.0" width="1280" height="778"/>
<view key="contentView" id="rBl-rx-7uF">
<rect key="frame" x="0.0" y="0.0" width="480" height="237"/>
<rect key="frame" x="0.0" y="-5" width="522" height="302"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="laF-n4-ciZ">
<rect key="frame" x="18" y="200" width="225" height="17"/>
<rect key="frame" x="38" y="262" width="225" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Slot 6 Drive A" id="Vea-pb-q49">
<font key="font" metaFont="systemBold"/>
@ -148,7 +159,7 @@ CA
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="Wzz-Yt-xlT">
<rect key="frame" x="237" y="200" width="225" height="17"/>
<rect key="frame" x="257" y="262" width="225" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Slot 6 Drive B" id="pUB-KI-7ef">
<font key="font" metaFont="systemBold"/>
@ -156,15 +167,8 @@ CA
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<box autoresizesSubviews="NO" horizontalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="6cp-Ig-hvh">
<rect key="frame" x="238" y="61" width="5" height="164"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
<color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<font key="titleFont" metaFont="system"/>
</box>
<button verticalHuggingPriority="750" id="j1W-BP-P7S">
<rect key="frame" x="81" y="85" width="99" height="32"/>
<rect key="frame" x="101" y="98" width="99" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Choose..." bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="nVq-kA-8RS">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
@ -175,7 +179,7 @@ CA
</connections>
</button>
<button verticalHuggingPriority="750" id="lI0-3f-IsR">
<rect key="frame" x="300" y="85" width="99" height="32"/>
<rect key="frame" x="320" y="98" width="99" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Choose..." bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="nmE-5R-fEx">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
@ -186,7 +190,7 @@ CA
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="cb9-Pc-Ggd">
<rect key="frame" x="18" y="175" width="216" height="17"/>
<rect key="frame" x="38" y="217" width="216" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="U5Boot.do" id="UOE-Fx-vng">
<font key="font" metaFont="system"/>
@ -195,7 +199,7 @@ CA
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="e89-G9-nNt">
<rect key="frame" x="18" y="124" width="216" height="17"/>
<rect key="frame" x="38" y="153" width="216" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title=".dsk 143360 bytes" id="rQi-K1-5Cu">
<font key="font" metaFont="system"/>
@ -204,7 +208,7 @@ CA
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="AOj-bZ-LXp">
<rect key="frame" x="249" y="124" width="216" height="17"/>
<rect key="frame" x="269" y="153" width="216" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title=".dsk 143360 bytes" id="POW-zB-gIf">
<font key="font" metaFont="system"/>
@ -213,7 +217,7 @@ CA
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="5oU-oN-vUH">
<rect key="frame" x="249" y="175" width="213" height="17"/>
<rect key="frame" x="269" y="217" width="213" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="U5Brit.do" id="KvS-JR-AdI">
<font key="font" metaFont="system"/>
@ -222,7 +226,7 @@ CA
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" id="uLZ-yk-ywF">
<rect key="frame" x="198" y="13" width="85" height="32"/>
<rect key="frame" x="423" y="13" width="85" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Reboot" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="6er-wF-Uql">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
@ -233,7 +237,7 @@ CA
</connections>
</button>
<matrix verticalHuggingPriority="750" allowsEmptySelection="NO" autorecalculatesCellSize="YES" id="0vx-rm-Mio">
<rect key="frame" x="20" y="149" width="212" height="18"/>
<rect key="frame" x="40" y="184" width="212" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
<size key="cellSize" width="91" height="18"/>
@ -261,7 +265,7 @@ CA
</connections>
</matrix>
<matrix verticalHuggingPriority="750" allowsEmptySelection="NO" autorecalculatesCellSize="YES" id="Alr-gf-yTN">
<rect key="frame" x="249" y="149" width="212" height="18"/>
<rect key="frame" x="271" y="184" width="212" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
<size key="cellSize" width="91" height="18"/>
@ -288,9 +292,34 @@ CA
<action selector="diskBProtectionChanged:" target="FHO-g2-V3A" id="kmz-zd-Zal"/>
</connections>
</matrix>
<button id="Ur3-rW-YJG">
<rect key="frame" x="149" y="59" width="355" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Startup with these disks" bezelStyle="regularSquare" imagePosition="right" alignment="right" inset="2" id="Jxo-4D-2c5">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="startupDiskChoiceChanged:" target="FHO-g2-V3A" id="eHE-yK-gIr"/>
</connections>
</button>
<box autoresizesSubviews="NO" verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="7ZU-H6-jQn">
<rect key="frame" x="12" y="85" width="498" height="5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
<color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<font key="titleFont" metaFont="system"/>
</box>
<box autoresizesSubviews="NO" horizontalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="864-Ov-2tE">
<rect key="frame" x="248" y="96" width="5" height="194"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
<color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<font key="titleFont" metaFont="system"/>
</box>
</subviews>
</view>
<point key="canvasLocation" x="260" y="-361.5"/>
<point key="canvasLocation" x="-139" y="-901"/>
</window>
<customObject id="FHO-g2-V3A" customClass="EmulatorDiskController">
<connections>
@ -303,6 +332,365 @@ CA
<outlet property="diskInA" destination="cb9-Pc-Ggd" id="chv-2S-Y2R"/>
<outlet property="diskInB" destination="5oU-oN-vUH" id="8fb-s5-EKa"/>
<outlet property="disksWindow" destination="RAk-at-ZT4" id="4wu-vw-EhL"/>
<outlet property="startupDisksChoice" destination="Ur3-rW-YJG" id="gv4-SX-8jH"/>
</connections>
</customObject>
<window title="Apple2Mac Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="Mzv-VG-jce" userLabel="Window - Prefs">
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="109" y="132" width="522" height="302"/>
<rect key="screenRect" x="0.0" y="0.0" width="1280" height="778"/>
<view key="contentView" id="bfK-7M-z1X">
<rect key="frame" x="0.0" y="0.0" width="522" height="302"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<tabView id="xvZ-VK-VbM">
<rect key="frame" x="13" y="10" width="496" height="286"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<font key="font" metaFont="system"/>
<tabViewItems>
<tabViewItem label="General" identifier="1" id="9QL-dh-vnO">
<view key="view" id="NHh-74-iPh">
<rect key="frame" x="10" y="33" width="476" height="240"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" id="RMd-Jf-hgi">
<rect key="frame" x="196" y="220" width="84" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="CPU Speed" id="cbb-4q-VuM">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" id="hHW-BV-aWU">
<rect key="frame" x="196" y="102" width="84" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="Alt Speed" id="aPu-QU-jtF">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="BIH-lT-BN3">
<rect key="frame" x="365" y="180" width="44" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="100%" id="mKS-Ef-da9">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="v8u-UP-OWx">
<rect key="frame" x="365" y="62" width="44" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="400%" id="LVf-iB-pGv">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<slider verticalHuggingPriority="750" id="HBI-oW-CEl">
<rect key="frame" x="15" y="175" width="346" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<sliderCell key="cell" continuous="YES" alignment="left" minValue="0.25" maxValue="4" doubleValue="1" tickMarkPosition="below" numberOfTickMarks="16" sliderType="linear" id="FcD-OP-Q8S"/>
<connections>
<action selector="sliderDidMove:" target="mUW-Rh-bL1" id="OS1-pq-YYB"/>
</connections>
</slider>
<button id="cZP-xV-zs3">
<rect key="frame" x="413" y="179" width="48" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Max" bezelStyle="regularSquare" imagePosition="left" inset="2" id="YOA-Uz-RHo">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="peggedChoiceChanged:" target="mUW-Rh-bL1" id="CiQ-8c-AlP"/>
</connections>
</button>
<button id="Sjk-sn-E28">
<rect key="frame" x="413" y="61" width="48" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Max" bezelStyle="regularSquare" imagePosition="left" inset="2" id="JEt-BY-gNF">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="peggedChoiceChanged:" target="mUW-Rh-bL1" id="K2H-Vc-15h"/>
</connections>
</button>
<box autoresizesSubviews="NO" verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="9U0-v9-wTm">
<rect key="frame" x="17" y="125" width="450" height="5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
<color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<font key="titleFont" metaFont="system"/>
</box>
<slider verticalHuggingPriority="750" id="y10-Rm-oDB">
<rect key="frame" x="15" y="57" width="346" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<sliderCell key="cell" continuous="YES" state="on" alignment="left" minValue="0.25" maxValue="4" doubleValue="4" tickMarkPosition="below" numberOfTickMarks="16" sliderType="linear" id="Moc-Ll-CEH"/>
<connections>
<action selector="sliderDidMove:" target="mUW-Rh-bL1" id="JWb-jF-Yi8"/>
</connections>
</slider>
</subviews>
</view>
</tabViewItem>
<tabViewItem label="Audio" identifier="1" id="sJk-7J-qt2" userLabel="Audio">
<view key="view" id="ct0-V1-eFp">
<rect key="frame" x="10" y="33" width="476" height="240"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<matrix verticalHuggingPriority="750" allowsEmptySelection="NO" autorecalculatesCellSize="YES" id="3d5-Z5-xDN">
<rect key="frame" x="17" y="179" width="442" height="58"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
<size key="cellSize" width="442" height="18"/>
<size key="intercellSpacing" width="4" height="2"/>
<buttonCell key="prototype" type="radio" title="Radio" imagePosition="left" alignment="left" enabled="NO" state="on" inset="2" id="fXT-Uh-8o7">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<cells>
<column>
<buttonCell type="radio" title="No soundcard" imagePosition="left" alignment="left" enabled="NO" tag="1" inset="2" id="QsT-B1-n2t">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<buttonCell type="radio" title="Mockingboard Revision &quot;C&quot; in Slot 4/5" imagePosition="left" alignment="left" enabled="NO" state="on" inset="2" id="dqc-yy-ATU">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<buttonCell type="radio" title="Mockingboard Revision &quot;C&quot; in Slot 4, Phasor in Slot 5" imagePosition="left" alignment="left" enabled="NO" inset="2" id="oY0-fc-5pv">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</column>
</cells>
<connections>
<action selector="soundCardChoiceChanged:" target="mUW-Rh-bL1" id="Hba-MC-DJO"/>
</connections>
</matrix>
</subviews>
</view>
</tabViewItem>
<tabViewItem label="Video" identifier="1" id="Hoz-MQ-lVE">
<view key="view" id="gXd-lK-Huk">
<rect key="frame" x="10" y="33" width="476" height="240"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="dak-eg-hHn">
<rect key="frame" x="15" y="220" width="96" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Color :" id="eHo-1T-edz">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" id="1sF-py-jCs">
<rect key="frame" x="115" y="213" width="158" height="26"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" title="Black/white" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="PX0-X3-MxY" id="eVj-ax-48A">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="gbp-xU-CmX">
<items>
<menuItem title="Black/white" state="on" id="PX0-X3-MxY">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="Color" id="TRN-Jh-rFc">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="Interpolated" state="on" id="RgR-Oe-oo5">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="colorChoiceChanged:" target="mUW-Rh-bL1" id="M58-28-Lmr"/>
</connections>
</popUpButton>
<slider verticalHuggingPriority="750" id="9FG-IJ-hYc">
<rect key="frame" x="115" y="171" width="346" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<sliderCell key="cell" enabled="NO" state="on" alignment="left" maxValue="100" doubleValue="50" tickMarkPosition="below" numberOfTickMarks="5" sliderType="linear" id="Cma-o2-8gh"/>
</slider>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="RsU-77-Dkx">
<rect key="frame" x="15" y="183" width="96" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Graphic Effects :" id="foK-d1-Lrb">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
</view>
</tabViewItem>
<tabViewItem label="Joystick" identifier="2" id="Zc6-NX-eT8">
<view key="view" id="g6Z-G2-RwC">
<rect key="frame" x="10" y="33" width="476" height="240"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<box autoresizesSubviews="NO" horizontalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="Fkg-X3-0XG">
<rect key="frame" x="236" y="9" width="5" height="236"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
<color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<font key="titleFont" metaFont="system"/>
</box>
<customView id="OWJ-x7-P0q">
<rect key="frame" x="259" y="37" width="200" height="200"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<button verticalHuggingPriority="750" id="qrP-3M-EgH">
<rect key="frame" x="46" y="83" width="109" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Calibrate..." bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Zhp-bX-Quw">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="calibrateJoystick:" target="mUW-Rh-bL1" id="zBh-I8-o6E"/>
</connections>
</button>
</subviews>
</customView>
<popUpButton verticalHuggingPriority="750" id="gBd-cR-p7O">
<rect key="frame" x="15" y="213" width="218" height="26"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="tK3-cL-Zwi">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="hWa-Gt-x3s">
<items>
<menuItem title="Joystick Off" id="T86-gP-P52">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="Keypad Emulation" id="fm9-GS-v01">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="Mac Joystick/Gamepad" state="on" id="rYd-Zm-Btm"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="joystickChoiceChanged:" target="mUW-Rh-bL1" id="0V1-oQ-2ed"/>
</connections>
</popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="Zt8-bA-2cM">
<rect key="frame" x="245" y="12" width="75" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Button 1 :" id="5aE-WW-hxS">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="ea3-X4-r6a">
<rect key="frame" x="15" y="162" width="29" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" enabled="NO" sendsActionOnEndEditing="YES" alignment="left" title="100" id="XJf-vx-Msv">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="pGe-nD-Lac">
<rect key="frame" x="324" y="12" width="18" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="✓" id="ubH-gJ-97X">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="XFG-kU-Ioe">
<rect key="frame" x="443" y="12" width="18" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="✓" id="heq-gj-6Z1">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="gWY-LF-DGr">
<rect key="frame" x="364" y="12" width="75" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Button 2 :" id="t0J-m7-pfW">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button id="MbK-fn-sy2">
<rect key="frame" x="15" y="187" width="217" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Keypad Auto-Recenter" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="swI-VW-5rZ">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="autoRecenterChoiceChanged:" target="mUW-Rh-bL1" id="Ehf-jm-Exs"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="e2h-SS-aex">
<rect key="frame" x="69" y="162" width="163" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" enabled="NO" sendsActionOnEndEditing="YES" alignment="left" title="Keypad Sensitivity" id="Gx0-zf-TeB">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" id="BrH-bm-tx3">
<rect key="frame" x="47" y="156" width="19" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<stepperCell key="cell" continuous="YES" alignment="left" minValue="1" maxValue="255" doubleValue="4" id="Qxz-h1-hQt"/>
<connections>
<action selector="stepValueChanged:" target="mUW-Rh-bL1" id="2lw-7T-NTu"/>
</connections>
</stepper>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" id="PLJ-iK-Nsf">
<rect key="frame" x="15" y="17" width="217" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Left Alt and right Alt keys are Joystick buttons 1 and 2" id="Kgw-5H-ygQ">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
</view>
</tabViewItem>
</tabViewItems>
</tabView>
</subviews>
</view>
<point key="canvasLocation" x="-349" y="-891"/>
</window>
<customObject id="mUW-Rh-bL1" customClass="EmulatorPrefsController">
<connections>
<outlet property="altMaxChoice" destination="Sjk-sn-E28" id="JHD-Ko-iXi"/>
<outlet property="altSlider" destination="y10-Rm-oDB" id="1N0-fA-UNu"/>
<outlet property="altSliderLabel" destination="v8u-UP-OWx" id="lF9-Wy-OcU"/>
<outlet property="button0Pressed" destination="pGe-nD-Lac" id="E53-NC-AgR"/>
<outlet property="button1Pressed" destination="XFG-kU-Ioe" id="ttU-0h-U2c"/>
<outlet property="colorChoice" destination="1sF-py-jCs" id="2in-fp-XTK"/>
<outlet property="cpuMaxChoice" destination="cZP-xV-zs3" id="FQf-hE-FC6"/>
<outlet property="cpuSlider" destination="HBI-oW-CEl" id="xW6-qf-8dt"/>
<outlet property="cpuSliderLabel" destination="BIH-lT-BN3" id="DQN-Z9-0pa"/>
<outlet property="joystickCalibrationView" destination="OWJ-x7-P0q" id="g08-0g-YOg"/>
<outlet property="joystickChoice" destination="gBd-cR-p7O" id="3os-mX-1E4"/>
<outlet property="joystickRecenter" destination="MbK-fn-sy2" id="nEJ-ZU-arF"/>
<outlet property="joystickStepLabel" destination="ea3-X4-r6a" id="JKX-kB-tcM"/>
<outlet property="joystickStepper" destination="BrH-bm-tx3" id="PmM-yE-XNH"/>
<outlet property="prefsWindow" destination="Mzv-VG-jce" id="4MA-Wb-bdU"/>
<outlet property="soundCardChoice" destination="3d5-Z5-xDN" id="uHI-Ip-s2E"/>
</connections>
</customObject>
</objects>

View File

@ -8,6 +8,12 @@
#import <Cocoa/Cocoa.h>
typedef void (^DiskCompletionHandler)(NSOpenPanel *openPanel, NSInteger result);
@interface EmulatorDiskController : NSWindowController
+ (NSSet *)emulatorFileTypes;
+ (NSString *)extensionForPath:(NSString *)path;
+ (void)chooseDiskForWindow:(NSWindow *)window completionHandler:(DiskCompletionHandler)handler;
@end

View File

@ -7,6 +7,8 @@
//
#import "EmulatorDiskController.h"
#import "EmulatorPrefsController.h"
#import "common.h"
#define READONLY_CHOICE_INDEX 0
#define NO_DISK_INSERTED @"(No Disk Inserted)"
@ -27,6 +29,7 @@
@property (assign) IBOutlet NSMatrix *diskBProtection;
@property (assign) IBOutlet NSButton *chooseDiskA;
@property (assign) IBOutlet NSButton *chooseDiskB;
@property (assign) IBOutlet NSButton *startupDisksChoice;
@property (nonatomic, copy) NSString *diskAPath;
@property (nonatomic, copy) NSString *diskBPath;
@ -46,11 +49,47 @@
[self.diskBProperties setStringValue:@""];
[self.chooseDiskA setKeyEquivalent:@"\r"];
[self.chooseDiskA setBezelStyle:NSRoundedBezelStyle];
[self.startupDisksChoice setState:NSOffState];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *startupDiskA = [defaults stringForKey:kApple2PrefStartupDiskA];
BOOL startupDiskAProtection = [defaults boolForKey:kApple2PrefStartupDiskAProtected];
if (startupDiskA)
{
const char *err = c_new_diskette_6(0, [startupDiskA UTF8String], startupDiskAProtection);
if (err)
{
NSString *diskA = [NSString stringWithFormat:@"%@.gz", startupDiskA];
err = c_new_diskette_6(0, [diskA UTF8String], startupDiskAProtection);
}
if (!err)
{
[self.diskInA setStringValue:[[startupDiskA pathComponents] lastObject]];
[self.startupDisksChoice setState:NSOnState];
}
}
NSString *startupDiskB = [defaults stringForKey:kApple2PrefStartupDiskB];
BOOL startupDiskBProtection = [defaults boolForKey:kApple2PrefStartupDiskBProtected];
if (startupDiskB)
{
const char *err = c_new_diskette_6(1, [startupDiskB UTF8String], startupDiskBProtection);
if (err)
{
NSString *diskB = [NSString stringWithFormat:@"%@.gz", startupDiskB];
err = c_new_diskette_6(0, [diskB UTF8String], startupDiskBProtection);
}
if (!err)
{
[self.diskInB setStringValue:[[startupDiskB pathComponents] lastObject]];
[self.startupDisksChoice setState:NSOnState];
}
}
}
- (void)dealloc
{
#warning TODO FIXME ... probably should exit emulator if this gets invoked ...
self.diskAPath = nil;
self.diskBPath = nil;
[super dealloc];
@ -66,7 +105,7 @@
dispatch_async(dispatch_get_main_queue(), ^{
NSButtonCell *readOnlyChoice = [[[self diskAProtection] cells] firstObject];
NSString *path = [self diskAPath];
[self _insertDisketteInDrive:0 path:path type:[self _extensionForPath:path] readOnly:([readOnlyChoice state] == NSOnState)];
[self _insertDisketteInDrive:0 path:path type:[EmulatorDiskController extensionForPath:path] readOnly:([readOnlyChoice state] == NSOnState)];
});
}
@ -80,7 +119,7 @@
dispatch_async(dispatch_get_main_queue(), ^{
NSButtonCell *readOnlyChoice = [[[self diskBProtection] cells] firstObject];
NSString *path = [self diskBPath];
[self _insertDisketteInDrive:1 path:path type:[self _extensionForPath:path] readOnly:([readOnlyChoice state] == NSOnState)];
[self _insertDisketteInDrive:1 path:path type:[EmulatorDiskController extensionForPath:path] readOnly:([readOnlyChoice state] == NSOnState)];
});
}
@ -146,7 +185,17 @@
return YES;
}
- (NSString *)_extensionForPath:(NSString *)path
+ (NSSet *)emulatorFileTypes
{
static NSSet *set = nil;
static dispatch_once_t onceToken = 0L;
dispatch_once(&onceToken, ^{
set = [[NSSet alloc] initWithObjects:@"dsk", @"nib", @"do", @"po", GZ_EXTENSION, nil];
});
return [[set retain] autorelease];
}
+ (NSString *)extensionForPath:(NSString *)path
{
NSString *extension0 = [path pathExtension];
NSString *extension1 = [[path stringByDeletingPathExtension] pathExtension];
@ -157,9 +206,9 @@
return extension0;
}
- (void)_chooseDisk:(int)drive readOnly:(BOOL)readOnly
+ (void)chooseDiskForWindow:(NSWindow *)window completionHandler:(DiskCompletionHandler)handler
{
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
NSOpenPanel *openPanel = [[NSOpenPanel openPanel] retain];
[openPanel setTitle:@"Choose a disk image"];
NSURL *url = [[NSUserDefaults standardUserDefaults] URLForKey:kApple2DisksURL];
if (!url)
@ -167,7 +216,6 @@
url = [[NSBundle mainBundle] URLForResource:@"blank" withExtension:@"dsk.gz"];
url = [url URLByDeletingLastPathComponent];
}
[[NSUserDefaults standardUserDefaults] setURL:url forKey:kApple2DisksURL];
[openPanel setDirectoryURL:url];
[openPanel setShowsResizeIndicator:YES];
[openPanel setShowsHiddenFiles:NO];
@ -177,23 +225,39 @@
[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 = [NSSet setWithObjects:@"dsk", @"nib", @"do", @"po", GZ_EXTENSION, nil];
NSSet *fileTypes = [EmulatorDiskController emulatorFileTypes];
[openPanel setAllowedFileTypes:[fileTypes allObjects]];
[openPanel beginSheetModalForWindow:[self disksWindow] completionHandler:^(NSInteger result) {
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 = [self _extensionForPath:path];
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;
}
[self _insertDisketteInDrive:drive path:path type:extension readOnly:readOnly];
[self startupDiskChoiceChanged:nil];
}
}];
}
@ -210,4 +274,31 @@
[self _chooseDisk:1 readOnly:([readOnlyChoice state] == NSOnState)];
}
- (IBAction)startupDiskChoiceChanged:(id)sender
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:kApple2PrefStartupDiskA];
[defaults removeObjectForKey:kApple2PrefStartupDiskB];
[defaults removeObjectForKey:kApple2PrefStartupDiskAProtected];
[defaults removeObjectForKey:kApple2PrefStartupDiskBProtected];
if ([self.startupDisksChoice state] == NSOnState)
{
if (disk6.disk[0].fp)
{
NSString *diskA = [NSString stringWithUTF8String:disk6.disk[0].file_name];
[defaults setObject:diskA forKey:kApple2PrefStartupDiskA];
NSButtonCell *readOnlyChoice = [[[self diskAProtection] cells] firstObject];
[defaults setBool:([readOnlyChoice state] == NSOnState) forKey:kApple2PrefStartupDiskAProtected];
}
if (disk6.disk[1].fp)
{
NSString *diskB = [NSString stringWithUTF8String:disk6.disk[1].file_name];
[defaults setObject:diskB forKey:kApple2PrefStartupDiskB];
NSButtonCell *readOnlyChoice = [[[self diskBProtection] cells] firstObject];
[defaults setBool:([readOnlyChoice state] == NSOnState) forKey:kApple2PrefStartupDiskBProtected];
}
}
}
@end

View File

@ -0,0 +1,18 @@
//
// EmulatorPrefsController.h
// Apple2Mac
//
// Created by Aaron Culliney on 10/18/14.
// Copyright (c) 2014 deadc0de.org. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#define kApple2PrefStartupDiskA @"kApple2PrefStartupDiskA"
#define kApple2PrefStartupDiskAProtected @"kApple2PrefStartupDiskAProtected"
#define kApple2PrefStartupDiskB @"kApple2PrefStartupDiskB"
#define kApple2PrefStartupDiskBProtected @"kApple2PrefStartupDiskBProtected"
@interface EmulatorPrefsController : NSWindowController
@end

View File

@ -0,0 +1,232 @@
//
// EmulatorPrefsController.m
// Apple2Mac
//
// Created by Aaron Culliney on 10/18/14.
// Copyright (c) 2014 deadc0de.org. All rights reserved.
//
#import "EmulatorPrefsController.h"
#import "EmulatorDiskController.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 kApple2JoystickStep @"kApple2JoystickStep"
@interface EmulatorPrefsController ()
@property (assign) IBOutlet NSWindow *prefsWindow;
@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 NSTextField *joystickStepLabel;
@property (assign) IBOutlet NSStepper *joystickStepper;
@property (assign) IBOutlet NSTextField *button0Pressed;
@property (assign) IBOutlet NSTextField *button1Pressed;
@property (assign) IBOutlet NSView *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_OFF) && (mode < NUM_JOYOPTS)) )
{
mode = JOY_OFF;
}
joy_mode = (joystick_mode_t)mode;
[self.joystickChoice selectItemAtIndex:mode];
joy_auto_recenter = [defaults integerForKey:kApple2JoystickAutoRecenter];
[self.joystickRecenter setState:joy_auto_recenter ? NSOnState : NSOffState];
joy_step = [defaults integerForKey:kApple2JoystickStep];
[self.joystickStepLabel setIntegerValue:joy_step];
[self.joystickStepper setIntegerValue:joy_step];
}
- (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 setBool:joy_auto_recenter forKey:kApple2JoystickAutoRecenter];
}
- (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]];
}
#warning HACK TODO FIXME ... refactor timing stuff
timing_toggle_cpu_speed();
timing_toggle_cpu_speed();
[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];
}
#warning HACK TODO FIXME ... refactor timing stuff
timing_toggle_cpu_speed();
timing_toggle_cpu_speed();
[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_set(0);
video_setpage(!!(softswitches & SS_SCREEN));
video_redraw();
}
- (IBAction)soundCardChoiceChanged:(id)sender
{
#warning TODO : make soundcard configurable at runtime
}
- (IBAction)joystickChoiceChanged:(id)sender
{
NSInteger mode = [self.joystickChoice indexOfSelectedItem];
if (! ((mode >= JOY_OFF) && (mode < NUM_JOYOPTS)) )
{
mode = JOY_OFF;
}
joy_mode = (joystick_mode_t)mode;
[self _savePrefs];
}
- (IBAction)autoRecenterChoiceChanged:(id)sender
{
joy_auto_recenter = ([self.joystickRecenter state] == NSOnState);
[self _savePrefs];
}
- (IBAction)stepValueChanged:(id)sender
{
joy_step = [self.joystickStepper intValue];
[self.joystickStepLabel setIntegerValue:joy_step];
[self _savePrefs];
}
- (IBAction)calibrateJoystick:(id)sender
{
}
@end

View File

@ -24,6 +24,7 @@
@property (assign) IBOutlet EmulatorGLView *view;
@property (assign) IBOutlet NSWindow *disksWindow;
@property (assign) IBOutlet NSWindow *prefsWindow;
@property (nonatomic, retain) EmulatorFullscreenWindow *fullscreenWindow;
@property (nonatomic, retain) NSWindow *standardWindow;
@ -74,6 +75,11 @@
}
}
- (IBAction)toggleCPUSpeed:(id)sender
{
timing_toggle_cpu_speed();
}
- (void)goFullscreen
{
// If app is already fullscreen...