Compare commits

..

173 Commits

Author SHA1 Message Date
5f3c346562 new mame archive.org link and components date 2021-04-28 23:54:09 -04:00
d992b6960d bump version, change numbering to match embedded MAME 2021-04-28 23:23:51 -04:00
bc9e156af0 mame 0.231 update 2021-04-28 23:18:41 -04:00
9be960bb8e project fix for archiving. 2021-03-30 22:20:45 -04:00
f3680e0309 version bump 2021-03-30 22:12:27 -04:00
2465b38916 commentary. 2021-03-30 21:21:30 -04:00
cafecda333 switch the default mac II from mac lc to mac iix 2021-03-30 21:21:12 -04:00
2e6edaba1b add back the software list. 2021-03-28 18:50:55 -04:00
94dfbc6e3e mac2fdhd needed as parent of se/30, etc. 2021-03-26 22:21:56 -04:00
821a84923f add new machine definitions 2021-03-26 22:13:59 -04:00
311a3461f6 add some more macintosh models
also change the default compact model from mac128 to macse30
2021-03-26 22:06:39 -04:00
88c12a4832 add pty_shell command.
note that c modules had to be disabled in the build settings due to #define TTYDEFCHARS.
2021-03-26 21:16:18 -04:00
6ca897739a add support for mac 128k family 2021-03-19 17:24:38 -04:00
2a0462cc41 sort slots by name in the plist files. 2021-03-19 17:23:41 -04:00
fe0d690f87 improved submachine loading and more slot options for cards 2021-03-19 16:46:32 -04:00
ffb76a31f9 caution image - not yet used. 2021-03-18 23:12:50 -04:00
123a51d52f transparent scroller 2021-03-15 16:43:12 -04:00
f89c932b77 disk drive slot
3.5" and 5.25" floppy drives that are configurable via a slot now have a UI in Ample.

<device> media (//c+, a2diskii, mac*, cassettes, etc) are not adjustable.
2021-03-14 16:02:53 -04:00
0d13fa7167 add tk3000 2021-03-14 13:23:43 -04:00
e1eecac557 add lcd-grid filter 2021-03-13 15:44:52 -05:00
f8b3a1d882 integer x 2021-03-13 11:26:17 -05:00
9e5b8d45ca source list highlighting on the rom list 2021-03-13 11:23:46 -05:00
e975980a3a tweak the disk images colors a little bit 2021-03-13 11:16:49 -05:00
6177001a4c -nosample support to eliminate disk sound effects. 2021-03-12 20:09:59 -05:00
b2907eda08 update rom list. 2021-03-12 19:58:44 -05:00
48cdd702be pop up for child slots. 2021-03-12 19:58:12 -05:00
2f514a1db3 stat working on a pop up for card slots 2021-03-10 18:37:59 -05:00
d37fb49781 display slot submenus. i don't particularly like the UI so it will probably change soon. 2021-03-09 22:58:01 -05:00
34970cb476 move slots (and ram) into a slots bucket in the machine description. devices with media are also includes (in the device bucket).
In preparation for a UI to edit the subslots.
2021-03-09 22:22:24 -05:00
9626a6588f base the export shell script default name on the machine name. 2021-03-08 21:15:15 -05:00
dc7adde938 auto set the rpath in mame64.
I would prefer to do it after copying but the copy also codesigns.
2021-03-08 19:42:12 -05:00
328ab815fb Squashed commit of the following:
commit a91a858d68c845f74db106dd21a800c4d09e6e38
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun Mar 7 22:49:42 2021 -0500

    listxml utility.

commit e52576797da2609e700a12d1ffd7c78e8f1c2b23
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun Mar 7 22:34:00 2021 -0500

    update media to use a structure instead of passing around dictionaries.

commit 9277a0f720091c386812ac5f84d96080fe6e14f3
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun Mar 7 20:13:27 2021 -0500

    media is working again.

commit 7c0ac9a973df85fdcdaa978f80905cb9e8532ea5
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun Mar 7 18:46:38 2021 -0500

    use new slot objects [WIP]

commit 005e2f14d37e7b83ac4ab3e60e7fb794ac8ed651
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun Mar 7 17:33:59 2021 -0500

    new slot code to make sub options easier.

commit d7f3d9ef75367fad15081789a33212b7cf928fb3
Author: Kelvin Sherlock <ksherlock@gmail.com>
Date:   Sun Mar 7 17:33:13 2021 -0500

    String Interning...
2021-03-08 18:59:02 -05:00
d433920740 version bump 2021-02-24 17:38:16 -05:00
5d5c477bee disable developer menu for mame cheat sheet 2021-02-24 17:38:05 -05:00
4676c7c1ba add webkit framework so the mame cheat sheet will work. 2021-02-24 17:37:29 -05:00
760f9e6693 Add a cache for the machine description. 2021-02-23 22:47:43 -05:00
5f8b00f021 updated machine descriptions (radio shack printer, software list) 2021-02-23 22:47:22 -05:00
750df30533 .229 iigs floppy disk changes 2021-02-23 22:47:15 -05:00
9a7b5e6af0 add the software list to the machine description 2021-02-23 22:47:07 -05:00
521d33ba55 script to auto-generate rom list.
Found a few missing in the process.
2021-01-29 20:12:26 -05:00
4c1541a7da export shell script support. 2021-01-29 20:07:44 -05:00
29cfb6c2a0 unify path functions 2021-01-29 20:07:11 -05:00
f74f5aaf11 version bump to 10 2021-01-27 22:30:35 -05:00
e3edc368fe include signal number when killed by a signal 2021-01-27 18:23:25 -05:00
9323151102 Create xcodebuild.yml 2021-01-20 13:15:50 -05:00
6acbadb195 add macintosh warning from David Ryskalczyk 2021-01-18 16:01:36 -05:00
3a03b2180a MAX_SLOTS -> SLOT_COUNT 2021-01-18 15:46:07 -05:00
52d140d07d macs - add pseudo disk images, remove cd roms (since not usable) 2021-01-18 15:32:59 -05:00
0c7c9e9d1b support for nubus mac pseudo disk images 2021-01-18 15:32:22 -05:00
dc5ab08d4b add maclc2, maclc3, and maciici (plus nubus roms)
which are reportedly also usable.
2021-01-18 14:47:00 -05:00
c51ae648d9 add nubus slots (in case they're ever needed.) 2021-01-17 01:19:11 -05:00
74c67be366 move slot size to a macro. 2021-01-17 01:05:02 -05:00
bfa371ec0c macintosh lc support 2021-01-17 00:56:42 -05:00
2046eed6f4 add mame cheat sheet. implemented in html :/ 2021-01-17 00:47:05 -05:00
28b1074da2 version bump 2021-01-06 21:25:57 -05:00
40336585b3 add Apricon Super Serial Imager card 2021-01-06 21:25:48 -05:00
07d0e78d04 use mame 224 internet archive rom set
since it's currently the newest available and seems less likely to
spontaneously disappear.
2021-01-06 21:24:01 -05:00
c88fe397f7 fix log window to work better in dark mode. 2021-01-02 11:43:07 -05:00
e86b5c3236 version bump 2020-12-31 17:36:19 -05:00
6f8e2d806b add new 0.227 rom files 2020-12-31 17:36:00 -05:00
7286ae4f5a update machines for 227 2020-12-29 19:21:49 -05:00
7587f8c5ef add wiki menu link 2020-12-29 18:04:02 -05:00
93b9995260 release 8 2020-10-28 16:55:40 -04:00
dd1263a31c 226 rom url live 2020-10-28 16:55:23 -04:00
ed88a87b69 new roms for 226 2020-10-28 00:12:28 -04:00
6e4a516610 (better late than never) 225 rom URL 2020-10-28 00:12:03 -04:00
6ca8ae2dc9 mame 226 slot updates. 2020-10-25 18:49:31 -04:00
c40f1e621d Update README.md 2020-10-05 15:40:39 -04:00
b089220d81 add a2sider roms (mame 225). 2020-10-04 14:59:03 -04:00
c92ab50079 MAME documentation menu item. 2020-10-04 14:53:20 -04:00
a3f96076f5 Dark mode - replace redColor w/ systemRedColor
also replaced blackColor w/ nil.
2020-10-04 11:47:50 -04:00
d06bf9b1d6 download manager improvements
- better dark mode support
- open roms button
- refresh button
- UI to specify file location and file extension
- check for 404, etc errors which aren't auto converted to an NSError.
2020-10-04 00:16:32 -04:00
f9d4489e48 add download url / extension fields. 2020-10-03 14:34:21 -04:00
cabffd23ea move italic menu item to public function. 2020-10-03 14:33:51 -04:00
170a3864fe Add Ample Support Directory... menu 2020-10-03 12:46:19 -04:00
3c81d4d2ce tweak rom url, log download errors. 2020-10-01 13:11:13 -04:00
1022ebcbba -skip_gameinfo for vgmplay. 2020-09-30 23:06:44 -04:00
32d6cdf004 futz with project so archive works correctly w/ vmnet embedded. 2020-09-30 23:02:53 -04:00
f72bed14a5 version bump 2020-09-30 22:09:35 -04:00
57a7e24d21 added working directory option for custom mame config.
also log path/working directory to the log window.
2020-09-30 21:49:06 -04:00
f3137585c1 silly tweaks for the auth commands.
When stepping in the debugger, it works fine.
When running normally, the second command has a tendency not to run.
adding a file pointer AND reading from it seems to allow the second
command to run more consistently.
2020-09-30 19:19:03 -04:00
6e7acb88e2 add drag-drop dock support for launching vgm files
via mame vgmplay
2020-09-30 19:15:37 -04:00
5840c4ae0c add roms for vgmplay driver. 2020-09-29 23:29:23 -04:00
0c8587beb5 add .raw as supported extension. 2020-09-28 22:59:27 -04:00
9f6870585f replace mame command line NSTextField with NSTextView
this adds overflow scrolling.
2020-09-27 23:19:50 -04:00
4425fe33f8 bind the media eject button.
contentTintColor is not exposed in interface builder, otherwise it could
all be handled there.
2020-09-27 22:06:03 -04:00
68136487ff a2sider1/a2sider2 roms
these files are not readily available yet the cards are
disabled since they're not normal disk images.
2020-09-26 15:21:28 -04:00
5745a99ea2 commentary 2020-09-26 14:51:52 -04:00
484dd39b67 update machine list.
- cffa2000 renamed to cffa 2.0
- sider1/sider2 added (but disabled)
2020-09-26 14:51:46 -04:00
ad12d40052 slot 3 mis-interpreted as slot 2 2020-09-26 11:51:39 -04:00
e1a3d39021 add button to set owner and +s permissions on the vmnet_helper app.
this relies on deprecated functionality yet it's the easiest way to do it.

At some point, should try to move vmnet_helper to be a launchd service
which is the preferred way to do rooty things.
2020-09-25 23:38:36 -04:00
0befba12a5 xcode project update. 2020-09-25 21:10:36 -04:00
13d78a94ed Merge images-window into master 2020-09-25 20:50:35 -04:00
4bfc4c027f xebec/sider slots are non-standard disk images. 2020-09-25 20:50:14 -04:00
f90f5a6bf3 window restoration support.
only applies if you option quit (quit and save windows) or quit unexpectedly.
2020-09-25 20:46:25 -04:00
ecfd5fb7a8 adjust window positions, add frame auto-save 2020-09-18 13:35:04 -04:00
7a085301cf drag-and-drop - export urls to other applications. 2020-09-18 00:33:02 -04:00
bf619da42d eject / show in finder menu for disk images. 2020-09-15 23:44:24 -04:00
d5d869a407 check filetypes when drag-n-dropping to the recent window.
alt skips filetype check.
2020-09-15 23:11:20 -04:00
59ce93bbc0 add some duplicate filtering when adding a disk image to the recent list. 2020-09-15 21:56:10 -04:00
0d88e3e93a put all recent disk image logic in the recent disk image window controller. 2020-09-15 21:39:14 -04:00
4ca9d2caaf fix casette spelling 2020-09-15 18:03:05 -04:00
531c3096e9 drag-n-drop files to the recent disk images list. 2020-09-14 21:03:09 -04:00
376f808d29 disk images window [WIP].
uses bound nsarray controller.
2020-09-14 21:03:09 -04:00
97c27328d0 Add 3x window size option. 2020-09-14 19:09:10 -04:00
0dfd7c0605 new screenshot. 2020-09-14 18:38:14 -04:00
afa29a9e91 bump version. 2020-09-14 18:24:21 -04:00
65a1a9e6c6 move agat 7/9 to their own category since they are
very different.  adjusted clone category list a little bit,
2020-09-14 18:24:21 -04:00
7ef1edfe81 Add some pretty icons... 2020-09-13 14:30:40 -04:00
2ab55c0454 minor fixes
1. remove old and unused properties
2. add mouse capture checkbox
3. disable square pixels checkbox in full screen mode
2020-09-13 12:04:54 -04:00
8362692523 use some pretty animations when drag/dropping media. 2020-09-12 19:24:32 -04:00
416310fe69 adjust media constraints since they were acting stupid at times. 2020-09-12 18:41:00 -04:00
9d8f645c69 new slot view - tweak cell size and remove menu auto enable. 2020-09-12 18:35:06 -04:00
9946d341a7 eliminate the format menu, move rom management to the window menu. 2020-09-12 18:34:26 -04:00
b2bfb6ea11 media view nib - remove focus ring 2020-09-12 18:02:01 -04:00
c6bd70f9ef download window - show missing ROMs in red. 2020-09-12 18:01:32 -04:00
d8f0794679 change laser order. 2020-09-12 18:01:08 -04:00
09b9830840 add agat_fdc to rom list. 2020-09-12 18:00:50 -04:00
6452cf5e0a switch to new slot view. 2020-09-12 18:00:34 -04:00
d7ffdd841a build fixes for New Slot View 2020-09-12 18:00:09 -04:00
9905ddf96e switch ram options to be more consistent with slots. 2020-09-12 17:58:49 -04:00
95c7a77982 new slot controller [wip] 2020-09-10 22:06:41 -04:00
8b901fc415 tweak -nounevenstretch 2020-09-07 22:20:26 -04:00
2ba85fc3f8 move the tabs around a bit. 2020-09-07 22:10:37 -04:00
49e2462b28 adjusted launch window window size settings. 2020-09-07 22:00:10 -04:00
a829b4feea tweak eject button tracking instantiation 2020-09-07 17:08:42 -04:00
0a78177485 Eject button - fix image when enabled status changes and mouseover active. 2020-09-07 15:01:36 -04:00
5d54bbd636 re-order tabs. 2020-09-07 14:30:44 -04:00
531cee122b Eject Button class. switches to the alt image when hovering. 2020-09-07 14:30:31 -04:00
e9fff9aa08 added some artwork for the drag indicator and the eject buttons. 2020-09-06 20:12:21 -04:00
ee02dee982 I figured out bgx enough to add some options. 2020-09-06 15:26:20 -04:00
9a64879336 bold the media category title. 2020-09-06 11:29:17 -04:00
f45db5383d only show the media drag handle when moused over. 2020-09-06 11:25:59 -04:00
4b34ff977d Update README.md 2020-09-06 01:12:44 -04:00
2fa6a90374 Update README.md 2020-09-06 01:10:02 -04:00
7b41e5bf46 updated screenshot 2020-09-06 01:05:57 -04:00
f2b08c45a3 clean up item moves a bit.
also switch media to be a mutable array (which it secretly was) and
modify in-place to be cleaner.
2020-09-06 00:31:09 -04:00
498fd337eb version bump. 2020-09-06 00:02:27 -04:00
3cdae0e386 finish up drag-n-drop 2020-09-05 23:58:03 -04:00
9eb3727e1e drag-n-drop disk image re-ordering. WIP. 2020-09-05 23:29:30 -04:00
af3ad78b94 update machines for current mame.
tweaks description of mockingboard, adds gizmo, uthernet, cms scsi
2020-09-05 17:35:19 -04:00
8906d7825f more launch window tweaks. 2020-09-05 11:00:29 -04:00
be04b5a00b apple2c was missing 5.25" drives. 2020-09-05 10:59:38 -04:00
8e7e6fa396 update the built-in media list. previous logic was incorrect and
excluded apple 3 floppies (which are actually in slots 0,1,2, and 3)
and included and extra cassette for the Apple 1.
2020-09-05 01:20:28 -04:00
ad33f06f98 download window - decrease size of status text. 2020-09-04 23:40:06 -04:00
3c77f0a309 media view - only enable eject button when there's something to eject. 2020-09-04 23:39:10 -04:00
69023c4af3 tweak layout sizes a bit. 2020-09-04 19:22:18 -04:00
c1d9a03175 bump version. 2020-09-03 23:35:04 -04:00
8b2f4c762b Clean up the ROM manager a little bit more. 2020-09-03 23:34:03 -04:00
ebdf8b9395 improved download manager
a few rough edges left but it displays the list of ROMs and allows
downloading individual items and viewing them in Finder.
2020-09-03 22:37:27 -04:00
26dbdae365 Add chinese clones 2020-09-03 17:12:02 -04:00
fef59d29cf remove empty string from the ROM list. 2020-09-03 00:16:08 -04:00
152197cae7 first pass at the ROM downloader. 2020-09-03 00:15:50 -04:00
e73ff01c00 add roms.plist of romfiles to download. 2020-09-02 22:17:52 -04:00
b262c8bf2f move python code into it's own directory. 2020-09-02 22:06:41 -04:00
fe7c71e7c7 center the launch window. 2020-09-02 19:12:32 -04:00
8264aa1515 untar mame-data.tgz to the application support directory.
This just uses NSTask to launch tar in the background.
2020-09-02 19:12:17 -04:00
cfe0e950c4 set the current directory to the Application Support directory when
launching mame.

Eventually, application support directory will include bgfx, roms, etc.
2020-09-01 23:52:58 -04:00
e512fb982a use constants for default keys. 2020-09-01 23:52:11 -04:00
90be56f96d remove unused headers. 2020-08-31 23:25:46 -04:00
076af87f91 adjust log window title. 2020-08-31 23:25:37 -04:00
13529d130c cleanup minor build warnings. 2020-08-31 22:48:51 -04:00
b0ff495fd3 tweak travis 2020-08-31 22:29:02 -04:00
8c282596d6 add .travis.yml 2020-08-31 22:20:43 -04:00
fde5b664b4 Add "Ample Lite" target (for use with CI).
Target does not embed the SDL2 framework or mame64.

xcodebuild -project Ample.xcodeproj -target "Ample Lite"
2020-08-31 22:07:16 -04:00
a653ca575b Bump version, add credits. 2020-08-31 19:09:21 -04:00
48513422f5 add some mame build notes so I don't forget. 2020-08-31 18:33:58 -04:00
598e95a6ca embed mame and sdl2 framework.
components will NOT be included in the repository.
2020-08-31 18:24:41 -04:00
348353199f Change wording on system mame preference.
disable path when using standard mame
new functions to calculate mame executable path.
2020-08-31 18:23:48 -04:00
1f47c7be88 git ignore. 2020-08-31 18:20:52 -04:00
931488ac4c move log window to proper location. 2020-08-31 18:20:42 -04:00
337b3eb1f2 Preferences Window Controller
validate the Mame executable path
option for system mame (doesn't do anything yet...)
2020-08-31 17:14:05 -04:00
3cbc69bf38 improved error logging if mame can't be launched. 2020-08-31 16:39:48 -04:00
167 changed files with 333188 additions and 118722 deletions

15
.github/workflows/xcodebuild.yml vendored Normal file
View File

@ -0,0 +1,15 @@
name: xcodebuild
on: [push, pull_request]
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- name: build
run: xcodebuild -project "Ample.xcodeproj" -target "Ample Lite" | xcpretty

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
dist
embedded/mame64
embedded/SDL2.framework
build
embedded/mame-data.tgz
__pycache__

12
.travis.yml Normal file
View File

@ -0,0 +1,12 @@
language: objective-c
osx_image:
- xcode12
- xcode11.3
- xcode10.1
xcode_project: Ample.xcodeproj
xcode_scheme: Ample Lite
script:
- set -o pipefail
- xcodebuild -project "${TRAVIS_XCODE_PROJECT}" -target "Ample Lite" | xcpretty

File diff suppressed because it is too large Load Diff

View File

@ -4,6 +4,18 @@
<dict>
<key>SchemeUserState</key>
<dict>
<key>Ample Lite.xcscheme_^#shared#^_</key>
<dict>
<key>isShown</key>
<true/>
<key>orderHint</key>
<integer>1</integer>
</dict>
<key>Ample copy.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
</dict>
<key>Ample.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
@ -14,6 +26,36 @@
<key>orderHint</key>
<integer>0</integer>
</dict>
<key>pty_shell.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>3</integer>
</dict>
<key>vmnet_helper.xcscheme_^#shared#^_</key>
<dict>
<key>isShown</key>
<true/>
<key>orderHint</key>
<integer>2</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>B6841BCF251EC913006A5C39</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>B6BA257A24E99BE9005FB8FF</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>B6E4B5AE24FDE2670094A35C</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>

43
Ample/Ample.h Normal file
View File

@ -0,0 +1,43 @@
//
// Ample.h
// Ample
//
// Created by Kelvin Sherlock on 9/1/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#ifndef Ample_h
#define Ample_h
#import <Cocoa/Cocoa.h>
/* ~/Library/ApplicationSupport/Ample/ */
NSURL *SupportDirectory(void);
NSString *SupportDirectoryPath(void);
/* mame executable URL */
NSURL *MameURL(void);
NSString *MamePath(void);
/* mame working directory */
NSURL *MameWorkingDirectory(void);
NSString *MameWorkingDirectoryPath(void);
NSString *InternString(NSString *key);
NSDictionary *MameMachine(NSString *machine);
/* NSUserDefaults keys */
extern NSString *kUseCustomMame;
extern NSString *kMamePath;
extern NSString *kMameWorkingDirectory;
extern NSString *kAutoCloseLogWindow;
extern NSString *kMameComponentsDate;
extern NSString *kDownloadURL;
extern NSString *kDownloadExtension;
extern NSString *kDefaultDownloadURL;
extern NSString *kDefaultDownloadExtension;
#endif /* Ample_h */

137
Ample/Ample.m Normal file
View File

@ -0,0 +1,137 @@
//
// Ample.m
// Ample
//
// Created by Kelvin Sherlock on 9/1/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#include "Ample.h"
NSURL *SupportDirectory(void) {
static NSURL *cached = nil;
if (!cached) {
NSFileManager *fm = [NSFileManager defaultManager];
NSError *error = nil;
NSURL *url = [fm URLForDirectory: NSApplicationSupportDirectory inDomain: NSUserDomainMask appropriateForURL: nil create: YES error: &error];
cached = [url URLByAppendingPathComponent: @"Ample"];
[fm createDirectoryAtURL: cached withIntermediateDirectories: YES attributes: nil error: &error];
}
return cached;
}
NSString *SupportDirectoryPath(void) {
static NSString *cached = nil;
if (!cached) {
NSURL *url = SupportDirectory();
cached = [NSString stringWithCString: [url fileSystemRepresentation] encoding: NSUTF8StringEncoding];
}
return cached;
}
NSURL *MameURL(void) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSBundle *bundle = [NSBundle mainBundle];
if ([defaults boolForKey: kUseCustomMame]) {
NSString *path = [defaults stringForKey: kMamePath];
if (![path length]) return [NSURL fileURLWithPath: path];
}
return [bundle URLForAuxiliaryExecutable: @"mame64"];
}
NSString *MamePath(void) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSBundle *bundle = [NSBundle mainBundle];
NSString *path;
if ([defaults boolForKey: kUseCustomMame]) {
path = [defaults stringForKey: kMamePath];
if ([path length]) return path;
}
path = [bundle pathForAuxiliaryExecutable: @"mame64"];
if ([path length]) return path;
return nil;
}
NSURL *MameWorkingDirectory(void) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults boolForKey: kUseCustomMame]) {
NSString *path = [defaults stringForKey: kMameWorkingDirectory];
if (![path length]) return [NSURL fileURLWithPath: path];
}
return SupportDirectory();
}
NSString *MameWorkingDirectoryPath(void) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults boolForKey: kUseCustomMame]) {
NSString *path = [defaults stringForKey: kMameWorkingDirectory];
if (![path length]) return path;
}
return SupportDirectoryPath();
}
NSDictionary *MameMachine(NSString *machine) {
static NSMutableDictionary *cache;
if (!cache) cache = [NSMutableDictionary new];
NSDictionary *d;
if (!machine) return nil;
d = [cache objectForKey: machine];
if (d) return d;
NSBundle *bundle = [NSBundle mainBundle];
NSURL *url= [bundle URLForResource: machine withExtension: @"plist"];
d = [NSDictionary dictionaryWithContentsOfURL: url];
if (d) [cache setObject: d forKey: machine];
return d;
}
/* NSCache doesn't retain it's key. This essentially interns it. */
/* could just abuse NSSelectorFromString() */
NSString *InternString(NSString *key) {
static NSMutableSet *storage = nil;
if (!storage) {
storage = [NSMutableSet new];
}
NSString *copy = [storage member: key];
if (!copy) {
copy = [key copy];
[storage addObject: copy];
}
return copy;
}
NSString *kUseCustomMame = @"UseCustomMame";
NSString *kMamePath = @"MamePath";
NSString *kMameWorkingDirectory = @"MameWorkingDirectory";
NSString *kAutoCloseLogWindow = @"AutoCloseLogWindow";
NSString *kMameComponentsDate = @"MameComponentsDate";
NSString *kDefaultDownloadURL = @"DefaultDownloadURL";
NSString *kDefaultDownloadExtension = @"DefaultDownloadExtension";
NSString *kDownloadURL = @"DownloadURL";
NSString *kDownloadExtension = @"DownloadExtension";

View File

@ -5,19 +5,28 @@
// Created by Kelvin Sherlock on 8/16/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import "Ample.h"
#import "AppDelegate.h"
#import "SlotViewController.h"
#import "MediaViewController.h"
#import "LaunchWindowController.h"
#import "PreferencesWindowController.h"
#import "DownloadWindowController.h"
#import "DiskImagesWindowController.h"
#import "CheatSheetWindowController.h"
#import "Transformers.h"
#import "LogWindowController.h"
@interface AppDelegate ()
@property (weak) IBOutlet NSWindow *installWindow;
@end
@implementation AppDelegate {
NSWindowController *_prefs;
NSWindowController *_launcher;
NSWindowController *_downloader;
NSWindowController *_diskImages;
NSWindowController *_cheatSheet;
}
@ -29,6 +38,8 @@
NSDictionary *dict;
RegisterTransformers();
path = [bundle pathForResource: @"Defaults" ofType: @"plist"];
dict = [NSDictionary dictionaryWithContentsOfFile: path];
@ -37,10 +48,91 @@
[[NSUserDefaults standardUserDefaults] registerDefaults: dict];
}
_launcher = [LaunchWindowController new];
_diskImages = [DiskImagesWindowController sharedInstance]; //[DiskImagesWindowController new];
if ([self installMameComponents]) {
[self displayLaunchWindow];
}
}
-(void)displayLaunchWindow {
if (!_launcher) {
_launcher = [LaunchWindowController new];
}
[_launcher showWindow: nil];
}
-(BOOL)installMameComponents {
/* install the mame data components. */
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSBundle *bundle = [NSBundle mainBundle];
NSURL *sd = SupportDirectory();
NSURL *ample_url = [sd URLByAppendingPathComponent: @"Ample.plist"];
NSMutableDictionary *d = [NSMutableDictionary dictionaryWithContentsOfURL: ample_url];
NSDate *oldDate = [d objectForKey: kMameComponentsDate];
NSDate *newDate = [defaults objectForKey: kMameComponentsDate];
if (![newDate isKindOfClass: [NSDate class]])
newDate = nil;
if (!newDate) return YES; //????
if (oldDate && [oldDate compare: newDate] >= 0) return YES;
NSString *path = [bundle pathForResource: @"mame-data" ofType: @"tgz"];
if (!path) return YES; // Ample Lite?
NSWindow *win = _installWindow;
[win makeKeyAndOrderFront: nil];
NSTask *task = [NSTask new];
NSArray *argv = @[
@"xfz",
path
];
[task setExecutableURL: [NSURL fileURLWithPath: @"/usr/bin/tar"]];
[task setArguments: argv];
[task setCurrentDirectoryURL: sd];
dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC));
[task setTerminationHandler: ^(NSTask *task){
dispatch_after(when, dispatch_get_main_queue(), ^{
int st = [task terminationStatus];
if (st) {
NSAlert *alert = [NSAlert new];
[alert setMessageText: @"An error occurred extracting MAME components"];
[alert runModal];
[win close];
return;
}
if (d) {
[d setObject: newDate forKey: kMameComponentsDate];
[d writeToURL: ample_url atomically: YES];
} else {
[@{ kMameComponentsDate: newDate } writeToURL: ample_url atomically: YES];
}
[win close];
[self displayLaunchWindow];
[self displayROMS: nil];
});
}];
[task launch];
return NO;
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
// Insert code here to tear down your application
@ -51,6 +143,18 @@
}
-(BOOL)application:(NSApplication *)sender openFile:(NSString *)filename {
NSString *ext = [[filename pathExtension] lowercaseString];
if ([ext isEqualToString: @"vgm"] || [ext isEqualToString: @"vgz"]) {
// run mame...
NSArray *args = @[ @"vgmplay", @"-window", @"-nomax", @"-skip_gameinfo", @"-quik", filename ];
[LogWindowController controllerForArgs: args];
}
return NO;
}
#pragma mark - IBActions
@ -58,10 +162,51 @@
- (IBAction)displayPreferences:(id)sender {
if (!_prefs) {
_prefs = [[NSWindowController alloc] initWithWindowNibName: @"Preferences"];
_prefs = [PreferencesWindowController new];
}
[_prefs showWindow: sender];
}
- (IBAction)displayROMS:(id)sender {
if (!_downloader) {
_downloader = [DownloadWindowController sharedInstance];
}
[_downloader showWindow: sender];
}
- (IBAction)displayRecentDiskImages:(id)sender {
if (!_diskImages) {
_diskImages = [DiskImagesWindowController sharedInstance];
}
[_diskImages showWindow: sender];
}
- (IBAction)displayCheatSheet:(id)sender {
if (!_cheatSheet) {
_cheatSheet = [CheatSheetWindowController new];
}
[_cheatSheet showWindow: sender];
}
- (IBAction)displaySupportDirectory:(id)sender {
NSURL *url = SupportDirectory();
NSWorkspace *ws = [NSWorkspace sharedWorkspace];
[ws openURL: url];
}
- (IBAction)mameDocumentation:(id)sender {
NSWorkspace *ws = [NSWorkspace sharedWorkspace];
NSURL *url = [NSURL URLWithString: @"https://docs.mamedev.org"];
[ws openURL: url];
}
- (IBAction)mameAppleWiki:(id)sender {
NSWorkspace *ws = [NSWorkspace sharedWorkspace];
NSURL *url = [NSURL URLWithString: @"https://wiki.mamedev.org/index.php/Driver:Apple_II"];
[ws openURL: url];
}
@end

View File

@ -1,53 +1,63 @@
{
"images" : [
{
"idiom" : "mac",
"size" : "16x16",
"idiom" : "mac",
"filename" : "icon-16.png",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "16x16",
"idiom" : "mac",
"filename" : "icon-32.png",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "32x32",
"idiom" : "mac",
"filename" : "icon-32.png",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "32x32",
"idiom" : "mac",
"filename" : "icon-64.png",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "128x128",
"idiom" : "mac",
"filename" : "icon-128.png",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "128x128",
"idiom" : "mac",
"filename" : "icon-256.png",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "256x256",
"idiom" : "mac",
"filename" : "icon-256.png",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "256x256",
"idiom" : "mac",
"filename" : "icon-512.png",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "512x512",
"idiom" : "mac",
"filename" : "icon-512.png",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "512x512",
"idiom" : "mac",
"filename" : "icon-1024.png",
"scale" : "2x"
}
],

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 447 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15705" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15705"/>
<plugIn identifier="com.apple.WebKit2IBPlugin" version="15705"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="CheatSheetWindowController">
<connections>
<outlet property="_webView" destination="Yc9-xA-jWX" id="rsd-1e-HPk"/>
<outlet property="webView" destination="Yc9-xA-jWX" id="EE3-gk-f71"/>
<outlet property="window" destination="QvC-M9-y7g" id="U2v-sN-OzH"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Keyboard Cheat Sheet" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<rect key="contentRect" x="196" y="240" width="640" height="640"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
<rect key="frame" x="0.0" y="0.0" width="640" height="640"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<wkWebView hidden="YES" wantsLayer="YES" fixedFrame="YES" allowsLinkPreview="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Yc9-xA-jWX">
<rect key="frame" x="0.0" y="0.0" width="640" height="640"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<wkWebViewConfiguration key="configuration">
<audiovisualMediaTypes key="mediaTypesRequiringUserActionForPlayback" none="YES"/>
<wkPreferences key="preferences" javaScriptCanOpenWindowsAutomatically="NO"/>
</wkWebViewConfiguration>
<connections>
<outlet property="navigationDelegate" destination="-2" id="1WW-1B-FdZ"/>
</connections>
</wkWebView>
</subviews>
</view>
<connections>
<outlet property="delegate" destination="-2" id="u4H-aq-RE2"/>
</connections>
<point key="canvasLocation" x="42" y="198"/>
</window>
</objects>
</document>

View File

@ -0,0 +1,47 @@
{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf600
{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;\red0\green0\blue0;\red255\green255\blue255;\red38\green38\blue38;
}
{\*\expandedcolortbl;;\cssrgb\c0\c0\c0;\cssrgb\c100000\c100000\c100000;\cssrgb\c20000\c20000\c20000;
}
\margl1440\margr1440\vieww9000\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0
\f0\b\fs36 \cf2 Ample\cf0
\f1\b0\fs28 would like to thank\'85\
\
\pard\pardeftab720\qc\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://www.mamedev.org"}}{\fldrslt
\f0\b\fs36 \cf0 \cb3 \expnd0\expndtw0\kerning0
MAME}}\cb3 \expnd0\expndtw0\kerning0
\
\pard\pardeftab720\partightenfactor0
\cf0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qj\partightenfactor0
\cf0 \cb1 \kerning1\expnd0\expndtw0 The MAME project as a whole is distributed under the terms of the {\field{\*\fldinst{HYPERLINK "https://opensource.org/licenses/GPL-2.0"}}{\fldrslt GNU General Public License, 2}} (GPL-2.0), since it contains code made available under multiple GPL-compatible licenses. A great majority of files (over 90% including core files) are under the {\field{\*\fldinst{HYPERLINK "https://opensource.org/licenses/BSD-3-Clause"}}{\fldrslt BSD-3-Clause License}} and we would encourage new contributors to distribute files under this license.\
\
Please note that MAME is a registered trademark of Gregory Ember, and permission is required to use the "MAME" name, logo or wordmark.\cb3 \expnd0\expndtw0\kerning0
\
\pard\pardeftab720\partightenfactor0
\cf0 \
\pard\pardeftab720\qc\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://libsdl.org"}}{\fldrslt
\f0\b\fs36 \cf0 SDL}}\
\pard\pardeftab720\partightenfactor0
\cf0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qj\partightenfactor0
\cf0 \cb1 \kerning1\expnd0\expndtw0 SDL 2.0 is distributed under the {\field{\*\fldinst{HYPERLINK "https://libsdl.org/license.php"}}{\fldrslt zlib license}}. This license allows you to use SDL freely in any software.\
\
\pard\pardeftab720\qc\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://usdawatercolors.nal.usda.gov/pom/catalog.xhtml?id=POM00001916"}}{\fldrslt
\f0\b\fs36 \cf0 \cb3 \expnd0\expndtw0\kerning0
Icon}}
\f0\b\fs36 \cb3 \expnd0\expndtw0\kerning0
\
\pard\pardeftab720\qj\partightenfactor0
\f1\b0\fs28 \cf0 \
\pard\pardeftab720\qj\partightenfactor0
\cf4 \cb3 R.C. Steadman, 6-1-\'9221.\
\
U.S. Department of Agriculture Pomological Watercolor Collection. Rare and Special Collections, National Agricultural Library, Beltsville, MD 20705}

View File

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15705" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15705"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="DiskImagesWindowController">
<connections>
<outlet property="arrayController" destination="vmp-9h-Z5R" id="WYF-Xq-BnN"/>
<outlet property="tableView" destination="J5l-1d-030" id="3hU-ho-1ag"/>
<outlet property="window" destination="R7r-B9-Bw0" id="hDE-Qa-m4g"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Recent Disk Images" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" frameAutosaveName="RecentDiskImagesWindow" animationBehavior="default" titlebarAppearsTransparent="YES" id="R7r-B9-Bw0" customClass="NSPanel">
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
<windowPositionMask key="initialPositionMask" rightStrut="YES"/>
<rect key="contentRect" x="200" y="172" width="300" height="400"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<view key="contentView" focusRingType="none" id="Kkg-Tp-4m1">
<rect key="frame" x="0.0" y="0.0" width="300" height="400"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView focusRingType="none" fixedFrame="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="24" horizontalPageScroll="10" verticalLineScroll="24" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" findBarPosition="belowContent" translatesAutoresizingMaskIntoConstraints="NO" id="ivr-XT-BPS">
<rect key="frame" x="-1" y="-1" width="302" height="402"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<clipView key="contentView" ambiguous="YES" copiesOnScroll="NO" id="1jn-uc-06s">
<rect key="frame" x="0.0" y="0.0" width="302" height="402"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView focusRingType="none" verticalHuggingPriority="750" ambiguous="YES" allowsExpansionToolTips="YES" columnAutoresizingStyle="none" selectionHighlightStyle="none" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="22" rowSizeStyle="automatic" viewBased="YES" id="J5l-1d-030">
<rect key="frame" x="0.0" y="0.0" width="302" height="402"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="282" minWidth="40" maxWidth="1000" id="1rF-M3-pYV">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="erY-fh-OHK">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView id="AJH-gH-E8G">
<rect key="frame" x="1" y="1" width="282" height="22"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="esO-OR-AcY">
<rect key="frame" x="6" y="5" width="196" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="Image Name.2mg" id="xgc-u7-sFX">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="AJH-gH-E8G" name="value" keyPath="objectValue.path" id="S0h-hl-OPM">
<dictionary key="options">
<string key="NSValueTransformerName">FilePathTransformer</string>
</dictionary>
</binding>
<binding destination="AJH-gH-E8G" name="toolTip" keyPath="objectValue.path" id="gXq-2p-MpM"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wzl-mV-Pmp">
<rect key="frame" x="206" y="3" width="75" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" alignment="right" title="32MB" id="QYB-us-igD">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="AJH-gH-E8G" name="value" keyPath="objectValue.size" id="omG-8X-flx">
<dictionary key="options">
<string key="NSValueTransformerName">FileSizeTransformer</string>
</dictionary>
</binding>
</connections>
</textField>
</subviews>
<connections>
<outlet property="textField" destination="esO-OR-AcY" id="9mX-Yt-vpg"/>
</connections>
</tableCellView>
</prototypeCellViews>
<connections>
<binding destination="vmp-9h-Z5R" name="value" keyPath="arrangedObjects.selection" id="32X-Ez-K7S"/>
</connections>
</tableColumn>
</tableColumns>
<connections>
<binding destination="vmp-9h-Z5R" name="content" keyPath="arrangedObjects" id="GHn-tz-ash"/>
<outlet property="dataSource" destination="-2" id="PRV-Rt-UuC"/>
<outlet property="delegate" destination="-2" id="WuV-c9-o5I"/>
<outlet property="menu" destination="bCS-1z-UOZ" id="UCb-2v-WrM"/>
</connections>
</tableView>
</subviews>
<color key="backgroundColor" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="ynD-Kb-eb3">
<rect key="frame" x="-100" y="-100" width="223" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="Dbq-yF-MKx" customClass="TransparentScroller">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="color" keyPath="backgroundColor">
<color key="value" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</scroller>
</scrollView>
</subviews>
</view>
<connections>
<outlet property="delegate" destination="-2" id="1Hn-2t-Vzj"/>
</connections>
<point key="canvasLocation" x="-188" y="143"/>
</window>
<arrayController id="vmp-9h-Z5R">
<connections>
<binding destination="-2" name="contentArray" keyPath="self.content" id="UTv-za-ry7"/>
</connections>
</arrayController>
<menu id="bCS-1z-UOZ">
<items>
<menuItem title="Show in Finder" tag="1" id="roc-SG-geJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="showInFinder:" target="-2" id="ViY-7R-MNV"/>
</connections>
</menuItem>
<menuItem title="Eject" tag="2" id="eJ1-Kd-hnR">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="eject:" target="-2" id="c6U-xB-EnM"/>
</connections>
</menuItem>
</items>
<connections>
<outlet property="delegate" destination="-2" id="22a-3e-eaK"/>
</connections>
<point key="canvasLocation" x="-667" y="170"/>
</menu>
</objects>
</document>

View File

@ -0,0 +1,278 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15705" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15705"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="DownloadWindowController">
<connections>
<outlet property="downloadField" destination="sJz-So-jbA" id="WjK-48-FcE"/>
<outlet property="formatButton" destination="2Rg-eX-DUq" id="oYo-MG-Sc6"/>
<outlet property="tableView" destination="FLX-Wt-y53" id="a4O-pk-EAt"/>
<outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="ROMs" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" frameAutosaveName="DownloadManagerWindow" animationBehavior="default" id="F0z-JX-Cv5">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<rect key="contentRect" x="196" y="240" width="400" height="575"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<value key="minSize" type="size" width="300" height="300"/>
<view key="contentView" id="se5-gp-TjO">
<rect key="frame" x="0.0" y="0.0" width="400" height="575"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="rg5-Qf-4Mw">
<rect key="frame" x="324" y="19" width="56" height="23"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="roundTextured" title="Cancel" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="i6Z-OM-lqE">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent">.</string>
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
<connections>
<binding destination="-2" name="enabled" keyPath="self.active" id="mBP-8S-yGB"/>
</connections>
</buttonCell>
<connections>
<action selector="cancelAll:" target="-2" id="ycl-eJ-ByB"/>
</connections>
</button>
<scrollView fixedFrame="YES" autohidesScrollers="YES" horizontalLineScroll="51" horizontalPageScroll="10" verticalLineScroll="51" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CMD-nT-mEa">
<rect key="frame" x="0.0" y="130" width="402" height="446"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<clipView key="contentView" ambiguous="YES" drawsBackground="NO" id="Igp-aH-flp">
<rect key="frame" x="1" y="1" width="400" height="444"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" ambiguous="YES" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="49" rowSizeStyle="automatic" viewBased="YES" id="FLX-Wt-y53">
<rect key="frame" x="0.0" y="0.0" width="400" height="444"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<tableViewGridLines key="gridStyleMask" dashed="YES"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="397" minWidth="40" maxWidth="1000" id="5jP-bY-fhI">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="VZP-ti-Ti8">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews>
<tableCellView identifier="Cell" focusRingType="none" id="aBv-F5-XWo">
<rect key="frame" x="1" y="1" width="397" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="pWm-hb-BXB">
<rect key="frame" x="0.0" y="0.0" width="397" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="p71-gJ-vFV">
<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>
<connections>
<outlet property="textField" destination="pWm-hb-BXB" id="NNG-rj-AAQ"/>
</connections>
</tableCellView>
<tableCellView identifier="DownloadCell" focusRingType="none" id="onK-6l-2iV" customClass="DownloadTableCellView">
<rect key="frame" x="1" y="20" width="397" height="49"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="A44-us-TEl">
<rect key="frame" x="25" y="28" width="371" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="NSU-6I-nsG">
<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>
<progressIndicator wantsLayer="YES" fixedFrame="YES" maxValue="100" displayedWhenStopped="NO" indeterminate="YES" controlSize="small" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="jBN-UJ-tWi">
<rect key="frame" x="3" y="29" width="16" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</progressIndicator>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hfu-hP-QAH">
<rect key="frame" x="25" y="3" width="371" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="1cQ-Zh-q0o">
<font key="font" metaFont="system" size="10"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<connections>
<outlet property="activity" destination="jBN-UJ-tWi" id="ZwD-yU-Vne"/>
<outlet property="statusTextField" destination="hfu-hP-QAH" id="8Hv-BB-kYA"/>
<outlet property="textField" destination="A44-us-TEl" id="Ta5-nd-ed1"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="-2" id="Ghf-k9-bRK"/>
<outlet property="delegate" destination="-2" id="rpR-0W-4Nu"/>
<outlet property="menu" destination="RJM-21-hjO" id="xpL-0n-1jm"/>
</connections>
</tableView>
</subviews>
<nil key="backgroundColor"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="pcd-MD-gho">
<rect key="frame" x="1" y="314" width="480" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="jGc-PE-vaF">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<textField verticalHuggingPriority="750" fixedFrame="YES" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sJz-So-jbA">
<rect key="frame" x="51" y="101" width="329" height="21"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" id="HKe-di-YSs">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<action selector="downloadURLChanged:" target="-2" id="ah1-QS-G27"/>
</connections>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Fhd-vr-Q2G">
<rect key="frame" x="192" y="18" width="124" height="23"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="roundTextured" title="Download Missing" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="AKx-eg-iLS">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="downloadMissing:" target="-2" id="azE-F0-5wx"/>
<binding destination="-2" name="enabled" keyPath="self.active" id="NOL-Db-hgp">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="d2z-4T-Wh1">
<rect key="frame" x="10" y="104" width="30" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="URL" id="lcZ-R4-WsS">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZXO-bJ-btp">
<rect key="frame" x="10" y="66" width="34" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Type" id="KGI-t9-OMF">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<box verticalHuggingPriority="750" fixedFrame="YES" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="AuM-pD-Gul">
<rect key="frame" x="12" y="52" width="368" height="5"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
</box>
<button verticalHuggingPriority="750" fixedFrame="YES" imageHugsTitle="YES" translatesAutoresizingMaskIntoConstraints="NO" id="dpY-qZ-2Nk">
<rect key="frame" x="90" y="13" width="100" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="ROMs" bezelStyle="rounded" image="NSFolder" imagePosition="leading" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="E0t-sX-rgE">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="showRomFolder:" target="-2" id="bys-Vs-b4m"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Lnv-mh-zAr">
<rect key="frame" x="6" y="13" width="87" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Refresh" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="mYS-h7-GUa">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent">r</string>
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</buttonCell>
<connections>
<action selector="refreshROMs:" target="-2" id="E7j-Fa-IN1"/>
</connections>
</button>
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2Rg-eX-DUq">
<rect key="frame" x="49" y="60" width="98" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<popUpButtonCell key="cell" type="push" title="zip" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" tag="1" imageScaling="proportionallyDown" inset="2" autoenablesItems="NO" selectedItem="7Cq-Lh-dgg" id="uum-dC-XD0">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" autoenablesItems="NO" id="kcg-aZ-mD9">
<items>
<menuItem title="zip" state="on" tag="1" id="7Cq-Lh-dgg"/>
<menuItem title="7z" tag="2" id="s5r-gg-Ma9"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="downloadExtensionChanged:" target="-2" id="tp2-tg-bms"/>
<binding destination="-2" name="selectedTag" keyPath="self.downloadExtension" id="uck-nA-UPg">
<dictionary key="options">
<string key="NSValueTransformerName">DownloadExtensionTransformer</string>
</dictionary>
</binding>
</connections>
</popUpButton>
</subviews>
</view>
<connections>
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
</connections>
<point key="canvasLocation" x="32" y="119.5"/>
</window>
<menu id="RJM-21-hjO">
<items>
<menuItem title="Show in Finder" tag="1" id="hDp-fh-9nU">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="showInFinder:" target="-2" id="ltL-yL-7EP"/>
</connections>
</menuItem>
<menuItem title="Download" tag="2" id="ree-Zg-jYB">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="download:" target="-2" id="2ua-nq-Zy1"/>
</connections>
</menuItem>
<menuItem title="Cancel" tag="3" id="7fY-83-Ads">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="cancel:" target="-2" id="cHE-Wq-jwc"/>
</connections>
</menuItem>
</items>
<connections>
<outlet property="delegate" destination="-2" id="fC3-h6-xe2"/>
</connections>
<point key="canvasLocation" x="-348" y="164"/>
</menu>
<userDefaultsController representsSharedInstance="YES" id="721-9N-Bma"/>
</objects>
<resources>
<image name="NSFolder" width="32" height="32"/>
</resources>
</document>

View File

@ -19,55 +19,20 @@
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Ample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="Vze-YF-m6e">
<window title="Ample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" frameAutosaveName="LaunchWindow" animationBehavior="default" id="Vze-YF-m6e">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="335" y="390" width="718" height="763"/>
<rect key="contentRect" x="335" y="390" width="718" height="795"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<view key="contentView" id="Ssv-Jw-EE0">
<rect key="frame" x="0.0" y="0.0" width="718" height="763"/>
<rect key="frame" x="0.0" y="0.0" width="718" height="795"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="oVt-eD-aaj">
<rect key="frame" x="0.0" y="563" width="718" height="200"/>
<rect key="frame" x="0.0" y="615" width="718" height="180"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
</customView>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zVI-uU-muo">
<rect key="frame" x="18" y="102" width="71" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="check" title="Window" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="vx1-I7-8kN">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="-2" name="value" keyPath="self.mameWindow" id="uS7-cg-wqb"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZUp-ni-Rr6">
<rect key="frame" x="18" y="82" width="62" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="check" title="Debug" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="6is-QN-JEc">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="-2" name="value" keyPath="self.mameDebug" id="vkc-sR-KnB"/>
</connections>
</button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pKK-yY-vnY">
<rect key="frame" x="0.0" y="0.0" width="718" height="52"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<textFieldCell key="cell" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="bk2-0p-jUj">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="-2" name="value" keyPath="self.commandLine" id="9gW-Y2-kvp"/>
</connections>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="nKp-px-nHg">
<rect key="frame" x="587" y="58" width="111" height="23"/>
<rect key="frame" x="588.5" y="58" width="111" height="23"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="roundTextured" title="Launch" bezelStyle="texturedRounded" image="NSAppleMenuImage" imagePosition="left" alignment="center" borderStyle="border" inset="2" id="Ct1-Rb-7uI">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
@ -81,41 +46,8 @@ DQ
<action selector="launchAction:" target="-2" id="a4d-zv-1CU"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="rLP-n2-0eY">
<rect key="frame" x="18" y="62" width="91" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="check" title="No Throttle" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="NyE-jT-WqC">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="-2" name="value" keyPath="self.mameNoThrottle" id="tUN-EX-7PF"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="D5h-dm-fuZ">
<rect key="frame" x="131" y="102" width="104" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="check" title="Square Pixels" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="yWK-BP-7Z9">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="-2" name="value" keyPath="self.mameSquarePixels" id="BiP-wC-Hpn"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zoQ-mU-ARl">
<rect key="frame" x="261" y="102" width="67" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="check" title="No Blur" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="r3s-5h-Xv5">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="-2" name="value" keyPath="self.mameNoBlur" id="Pvn-zw-OsQ"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="nNO-3T-OAy">
<rect key="frame" x="470" y="58" width="109" height="23"/>
<rect key="frame" x="470.5" y="58" width="109" height="23"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="roundTextured" title="Reset Slots" bezelStyle="texturedRounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Uii-5h-2R2">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
@ -128,22 +60,364 @@ DQ
</connections>
</button>
<customView id="P9d-sS-qEb" customClass="FlippedView">
<rect key="frame" x="20" y="155" width="306" height="400"/>
<rect key="frame" x="20" y="92" width="316" height="363"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<tabView initialItem="zUN-Qs-haG" id="l8R-bg-6Zm">
<rect key="frame" x="13" y="453" width="692" height="160"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<font key="font" metaFont="system"/>
<tabViewItems>
<tabViewItem label="Video" identifier="" id="zUN-Qs-haG">
<view key="view" id="QQT-HS-xjI">
<rect key="frame" x="10" y="33" width="672" height="114"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="pD8-dV-ijg">
<rect key="frame" x="143" y="87" width="172" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" title="Default" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="g0W-Ka-7bb" id="ceP-aK-me8">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="ajo-1k-sbD">
<items>
<menuItem title="Default" state="on" id="g0W-Ka-7bb"/>
<menuItem title="Metal" tag="1" id="93g-cb-opl"/>
<menuItem title="OpenGL" tag="2" id="B1R-9E-dMw"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<binding destination="-2" name="enabled" keyPath="self.mameBGFX" id="ZuQ-OY-TrP"/>
<binding destination="-2" name="selectedIndex" keyPath="self.mameBackend" id="oE1-Ho-H22"/>
</connections>
</popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qGO-Pm-SD1">
<rect key="frame" x="79" y="92" width="60" height="16"/>
<autoresizingMask key="autoresizingMask"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Backend:" id="WDr-Pl-lV1">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ctE-fX-twN">
<rect key="frame" x="318" y="92" width="51" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Effects:" id="Sqk-7k-PxQ">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="826-p8-in8">
<rect key="frame" x="15" y="91" width="57" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="BGFX" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Ubs-KZ-mpu">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="-2" name="value" keyPath="self.mameBGFX" id="9Ua-MZ-qbe"/>
</connections>
</button>
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hM8-FM-Agh">
<rect key="frame" x="382" y="87" width="172" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" title="Default" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="Dsm-bi-Txy" id="mBS-h4-BWC">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="WdF-Hw-YI9">
<items>
<menuItem title="Default" state="on" id="Dsm-bi-Txy">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="Unfiltered" tag="1" id="xgz-We-TFg">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="HLSL" tag="2" id="1UE-ea-V9a">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="CRT Geometry" tag="3" id="Dsx-wI-m3r">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="CRT Geometry Deluxe" tag="4" id="Ylw-Of-TM5">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="LCD Grid" tag="5" id="A6k-ku-z2M">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
</items>
</menu>
</popUpButtonCell>
<connections>
<binding destination="-2" name="enabled" keyPath="self.mameBGFX" id="DVB-Ex-VYF"/>
<binding destination="-2" name="selectedIndex" keyPath="self.mameEffects" id="rCg-d6-OR6"/>
</connections>
</popUpButton>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="D5h-dm-fuZ">
<rect key="frame" x="318" y="60" width="104" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Square Pixels" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="yWK-BP-7Z9">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="-2" name="value" keyPath="self.mameSquarePixels" id="BiP-wC-Hpn"/>
<binding destination="-2" name="enabled" keyPath="self.mameWindowMode" id="X80-2K-kTO"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6gd-45-eLr">
<rect key="frame" x="15" y="60" width="94" height="16"/>
<autoresizingMask key="autoresizingMask"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Window Mode:" id="l8n-CI-o4t">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="sei-LG-VM6">
<rect key="frame" x="143" y="55" width="172" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" title="Full Screen" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="0zZ-Ib-Fne" id="lsw-Vk-WcZ">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="m4N-Qw-mem">
<items>
<menuItem title="Full Screen" state="on" id="0zZ-Ib-Fne"/>
<menuItem title="Window 1x" id="3bZ-rq-fCt"/>
<menuItem title="Window 2x" id="KA4-Rs-yyK"/>
<menuItem title="Window 3x" id="Dbh-Js-pMx" userLabel="Window 3x"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<binding destination="-2" name="selectedIndex" keyPath="self.mameWindowMode" id="B9e-SK-3RY"/>
</connections>
</popUpButton>
<button verticalHuggingPriority="750" id="9Db-wA-FP9">
<rect key="frame" x="15" y="29" width="115" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Capture Mouse" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="3xh-Q7-WFl">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="-2" name="value" keyPath="self.mameMouse" id="vWu-od-2d6"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="XNa-8k-X89">
<rect key="frame" x="143" y="29" width="137" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Disk Sound Effects" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="MBT-Uv-Lev">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="-2" name="value" keyPath="self.mameSamples" id="77G-8C-HgT"/>
</connections>
</button>
</subviews>
</view>
</tabViewItem>
<tabViewItem label="CPU" identifier="" id="nr5-4o-DyG">
<view key="view" id="ElY-YI-LLI">
<rect key="frame" x="10" y="33" width="672" height="114"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZUp-ni-Rr6">
<rect key="frame" x="15" y="60" width="62" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Debug" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="6is-QN-JEc">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="-2" name="value" keyPath="self.mameDebug" id="vkc-sR-KnB"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="PGK-yK-2ZK">
<rect key="frame" x="15" y="91" width="43" height="16"/>
<autoresizingMask key="autoresizingMask"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Speed" id="D9w-Mz-PXs">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="FE4-gG-fPb">
<rect key="frame" x="62" y="86" width="107" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" title="100%" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" tag="1" imageScaling="proportionallyDown" inset="2" selectedItem="yoI-Ra-evu" id="M40-f0-awc">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="8Tv-0j-JhQ">
<items>
<menuItem title="100%" state="on" tag="1" id="yoI-Ra-evu"/>
<menuItem title="200%" tag="2" id="UqT-yd-8o3"/>
<menuItem title="300%" tag="3" id="awG-S1-uM4"/>
<menuItem title="400%" tag="4" id="qJ5-Ed-W5U"/>
<menuItem title="500%" tag="5" id="Phc-uW-Qog"/>
<menuItem title="No Throttle" tag="-1" id="gAc-ME-eim"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<binding destination="-2" name="selectedTag" keyPath="self.mameSpeed" id="nFG-yA-KC1"/>
</connections>
</popUpButton>
</subviews>
</view>
</tabViewItem>
<tabViewItem label="A/V" identifier="" id="0T5-BN-lxE">
<view key="view" id="knw-WE-UU3">
<rect key="frame" x="10" y="33" width="672" height="114"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="vWt-Dx-OGG">
<rect key="frame" x="15" y="91" width="102" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Generate AVI" bezelStyle="regularSquare" imagePosition="left" inset="2" id="hRp-Lh-Ebr">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
<connections>
<binding destination="-2" name="value" keyPath="self.mameAVI" id="G1O-YP-DXa"/>
</connections>
</buttonCell>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Ejn-wC-UXH">
<rect key="frame" x="15" y="60" width="110" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Generate WAV" bezelStyle="regularSquare" imagePosition="left" inset="2" id="7Aa-N2-MHn">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="-2" name="value" keyPath="self.mameWAV" id="4r0-ZQ-nNC"/>
</connections>
</button>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="5Yf-ZJ-8kx">
<rect key="frame" x="132" y="59" width="523" height="21"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="/path/to/file.wav" drawsBackground="YES" id="Xqc-zw-28b">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="-2" name="enabled" keyPath="self.mameWAV" id="lZM-6n-jAS"/>
<binding destination="-2" name="value" keyPath="self.mameWAVPath" id="475-s3-0e4">
<dictionary key="options">
<string key="NSNullPlaceholder">/path/to/file.wav</string>
</dictionary>
</binding>
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ne8-5I-D1H">
<rect key="frame" x="132" y="28" width="523" height="21"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="/path/to/file.vgm" drawsBackground="YES" id="xGs-Mi-wzj">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<connections>
<binding destination="-2" name="enabled" keyPath="self.mameVGM" id="TJV-4j-uVi"/>
<binding destination="-2" name="value" keyPath="self.mameVGMPath" id="aK1-2A-QWB">
<dictionary key="options">
<string key="NSNoSelectionPlaceholder">/path/to/file.vgm</string>
</dictionary>
</binding>
</connections>
</textFieldCell>
<connections>
<binding destination="-2" name="enabled" keyPath="self.mameVGM" id="JZX-dA-3Bn"/>
<binding destination="-2" name="value" keyPath="self.mameVGMPath" id="m7G-a0-QDZ">
<dictionary key="options">
<string key="NSNullPlaceholder">/path/to/file.vgm</string>
</dictionary>
</binding>
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Xht-PS-Hw8">
<rect key="frame" x="132" y="90" width="523" height="21"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="/path/to/file.avi" drawsBackground="YES" id="iY4-FF-x2e">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="-2" name="enabled" keyPath="self.mameAVI" id="o4R-KR-zVV"/>
<binding destination="-2" name="value" keyPath="self.mameAVIPath" id="dSK-1u-lh6">
<dictionary key="options">
<string key="NSNullPlaceholder">/path/to/file.avi</string>
</dictionary>
</binding>
</connections>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="YVz-a3-9Pj">
<rect key="frame" x="15" y="29" width="111" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Generate VGM" bezelStyle="regularSquare" imagePosition="left" inset="2" id="F9b-kg-ZMV">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="-2" name="value" keyPath="self.mameVGM" id="Oyp-Pc-Uad"/>
</connections>
</button>
</subviews>
</view>
</tabViewItem>
</tabViewItems>
</tabView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="J9O-xI-P5J" customClass="FlippedView">
<rect key="frame" x="392" y="155" width="306" height="400"/>
<rect key="frame" x="382" y="92" width="316" height="363"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
</customView>
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" horizontalScrollElasticity="none" id="2ue-XT-byh">
<rect key="frame" x="0.0" y="0.0" width="718" height="51"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="eSY-AU-tvi">
<rect key="frame" x="0.0" y="0.0" width="718" height="51"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textView focusRingType="none" editable="NO" importsGraphics="NO" richText="NO" verticallyResizable="YES" allowsCharacterPickerTouchBarItem="NO" textCompletion="NO" id="c0R-8x-RL2">
<rect key="frame" x="0.0" y="0.0" width="718" height="51"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<size key="minSize" width="718" height="51"/>
<size key="maxSize" width="718" height="10000000"/>
<color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/>
<connections>
<binding destination="-2" name="value" keyPath="self.commandLine" id="deQ-gK-fgu">
<dictionary key="options">
<bool key="NSConditionallySetsEditable" value="NO"/>
</dictionary>
</binding>
</connections>
</textView>
</subviews>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="qto-12-JOq">
<rect key="frame" x="-100" y="-100" width="225" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="FPs-uz-0v2">
<rect key="frame" x="703" y="0.0" width="15" height="51"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</subviews>
</view>
<point key="canvasLocation" x="769" y="104.5"/>
<point key="canvasLocation" x="769" y="120.5"/>
</window>
<viewController title="Media View" nibName="MediaView" id="t7c-zy-czN" customClass="MediaViewController"/>
<viewController title="Slot View" nibName="SlotView" id="lyS-mc-3Tf" customClass="SlotViewController"/>
<viewController title="Slot View" nibName="NewSlotView" id="lyS-mc-3Tf" customClass="NewSlotViewController"/>
<customObject id="RgH-d9-xl8" customClass="MachineViewController"/>
</objects>
<resources>
<image name="NSAppleMenuImage" width="128" height="128"/>
<image name="NSAppleMenuImage" width="11" height="14"/>
</resources>
</document>

View File

@ -14,7 +14,7 @@
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
<window title="Ample Log" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
<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="196" y="240" width="800" height="270"/>
@ -36,7 +36,7 @@
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<size key="minSize" width="785" height="270"/>
<size key="maxSize" width="788" height="10000000"/>
<size key="maxSize" width="800" height="10000000"/>
<color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/>
</textView>
</subviews>

View File

@ -3,6 +3,7 @@
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15705"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
@ -12,7 +13,11 @@
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate"/>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate">
<connections>
<outlet property="installWindow" destination="jWX-pY-Zpb" id="xAj-Vj-Vxn"/>
</connections>
</customObject>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
@ -112,6 +117,12 @@
<action selector="revertDocumentToSaved:" target="-1" id="iJ3-Pv-kwq"/>
</connections>
</menuItem>
<menuItem title="Export Shell Script…" id="LmB-h2-UBZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="exportShellScript:" target="-1" id="9eU-do-ffz"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
@ -346,268 +357,6 @@
</items>
</menu>
</menuItem>
<menuItem title="Format" id="jxT-CU-nIS">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Format" id="GEO-Iw-cKr">
<items>
<menuItem title="Font" id="Gi5-1S-RQB">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq">
<items>
<menuItem title="Show Fonts" keyEquivalent="t" id="Q5e-8K-NDq">
<connections>
<action selector="orderFrontFontPanel:" target="YLy-65-1bz" id="WHr-nq-2xA"/>
</connections>
</menuItem>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="GB9-OM-e27">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="hqk-hr-sYV"/>
</connections>
</menuItem>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="Vjx-xi-njq">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="IHV-OB-c03"/>
</connections>
</menuItem>
<menuItem title="Underline" keyEquivalent="u" id="WRG-CD-K1S">
<connections>
<action selector="underline:" target="-1" id="FYS-2b-JAY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="5gT-KC-WSO"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="Ptp-SP-VEL">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="Uc7-di-UnL"/>
</connections>
</menuItem>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="i1d-Er-qST">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="HcX-Lf-eNd"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kx3-Dk-x3B"/>
<menuItem title="Kern" id="jBQ-r6-VK2">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Kern" id="tlD-Oa-oAM">
<items>
<menuItem title="Use Default" id="GUa-eO-cwY">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="-1" id="6dk-9l-Ckg"/>
</connections>
</menuItem>
<menuItem title="Use None" id="cDB-IK-hbR">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="-1" id="U8a-gz-Maa"/>
</connections>
</menuItem>
<menuItem title="Tighten" id="46P-cB-AYj">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="-1" id="hr7-Nz-8ro"/>
</connections>
</menuItem>
<menuItem title="Loosen" id="ogc-rX-tC1">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="-1" id="8i4-f9-FKE"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Ligatures" id="o6e-r0-MWq">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Ligatures" id="w0m-vy-SC9">
<items>
<menuItem title="Use Default" id="agt-UL-0e3">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="-1" id="7uR-wd-Dx6"/>
</connections>
</menuItem>
<menuItem title="Use None" id="J7y-lM-qPV">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="-1" id="iX2-gA-Ilz"/>
</connections>
</menuItem>
<menuItem title="Use All" id="xQD-1f-W4t">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="-1" id="KcB-kA-TuK"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Baseline" id="OaQ-X3-Vso">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Baseline" id="ijk-EB-dga">
<items>
<menuItem title="Use Default" id="3Om-Ey-2VK">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="-1" id="0vZ-95-Ywn"/>
</connections>
</menuItem>
<menuItem title="Superscript" id="Rqc-34-cIF">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="-1" id="3qV-fo-wpU"/>
</connections>
</menuItem>
<menuItem title="Subscript" id="I0S-gh-46l">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="-1" id="Q6W-4W-IGz"/>
</connections>
</menuItem>
<menuItem title="Raise" id="2h7-ER-AoG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="-1" id="4sk-31-7Q9"/>
</connections>
</menuItem>
<menuItem title="Lower" id="1tx-W0-xDw">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="-1" id="OF1-bc-KW4"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="Ndw-q3-faq"/>
<menuItem title="Show Colors" keyEquivalent="C" id="bgn-CT-cEk">
<connections>
<action selector="orderFrontColorPanel:" target="-1" id="mSX-Xz-DV3"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="iMs-zA-UFJ"/>
<menuItem title="Copy Style" keyEquivalent="c" id="5Vv-lz-BsD">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="-1" id="GJO-xA-L4q"/>
</connections>
</menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="vKC-jM-MkH">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="-1" id="JfD-CL-leO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Text" id="Fal-I4-PZk">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="d9c-me-L2H">
<items>
<menuItem title="Align Left" keyEquivalent="{" id="ZM1-6Q-yy1">
<connections>
<action selector="alignLeft:" target="-1" id="zUv-R1-uAa"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="VIY-Ag-zcb">
<connections>
<action selector="alignCenter:" target="-1" id="spX-mk-kcS"/>
</connections>
</menuItem>
<menuItem title="Justify" id="J5U-5w-g23">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="-1" id="ljL-7U-jND"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="wb2-vD-lq4">
<connections>
<action selector="alignRight:" target="-1" id="r48-bG-YeY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="4s2-GY-VfK"/>
<menuItem title="Writing Direction" id="H1b-Si-o9J">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Writing Direction" id="8mr-sm-Yjd">
<items>
<menuItem title="Paragraph" enabled="NO" id="ZvO-Gk-QUH">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="YGs-j5-SAR">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="-1" id="qtV-5e-UBP"/>
</connections>
</menuItem>
<menuItem id="Lbh-J2-qVU">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="S0X-9S-QSf"/>
</connections>
</menuItem>
<menuItem id="jFq-tB-4Kx">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="5fk-qB-AqJ"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="swp-gr-a21"/>
<menuItem title="Selection" enabled="NO" id="cqv-fj-IhA">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="Nop-cj-93Q">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="-1" id="lPI-Se-ZHp"/>
</connections>
</menuItem>
<menuItem id="BgM-ve-c93">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="caW-Bv-w94"/>
</connections>
</menuItem>
<menuItem id="RB4-Sm-HuC">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="EXD-6r-ZUu"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="fKy-g9-1gm"/>
<menuItem title="Show Ruler" id="vLm-3I-IUL">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="-1" id="FOx-HJ-KwY"/>
</connections>
</menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="MkV-Pr-PK5">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="-1" id="71i-fW-3W2"/>
</connections>
</menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="LVM-kO-fVI">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="-1" id="cSh-wd-qM2"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="View" id="H8h-7b-M4v">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="View" id="HyV-fh-RgO">
@ -655,6 +404,25 @@
<action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kE9-em-OHN"/>
<menuItem title="Ample Support Directory…" id="egj-hU-EtE">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="displaySupportDirectory:" target="Voe-Tx-rLC" id="XDA-Bv-9BJ"/>
</connections>
</menuItem>
<menuItem title="Manage ROMs…" id="St3-qR-2Y8">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="displayROMS:" target="Voe-Tx-rLC" id="jFm-nv-kRC"/>
</connections>
</menuItem>
<menuItem title="Recent Disk Images…" id="QY9-lF-kDy">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="displayRecentDiskImages:" target="Voe-Tx-rLC" id="9W1-nJ-8eJ"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
<modifierMask key="keyEquivalentModifierMask"/>
@ -674,11 +442,49 @@
<action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
</connections>
</menuItem>
<menuItem title="MAME Keyboard Cheat Sheet" id="vcW-Dz-2Nx">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="displayCheatSheet:" target="Voe-Tx-rLC" id="HvD-mQ-4pe"/>
</connections>
</menuItem>
<menuItem title="MAME Apple II Wiki" id="GLh-Cc-5uU">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="mameAppleWiki:" target="Voe-Tx-rLC" id="KEg-0U-KdU"/>
</connections>
</menuItem>
<menuItem title="MAME Documentation" id="1IW-V0-UWA">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="mameDocumentation:" target="Voe-Tx-rLC" id="K8T-nZ-c5J"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
<point key="canvasLocation" x="132" y="154"/>
</menu>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="jWX-pY-Zpb">
<rect key="contentRect" x="283" y="305" width="226" height="56"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<view key="contentView" id="L7W-DF-UXe">
<rect key="frame" x="0.0" y="0.0" width="226" height="56"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="iC1-A6-a6T">
<rect key="frame" x="18" y="20" width="190" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Installing MAME components…" id="ura-rh-zmZ">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
</view>
<point key="canvasLocation" x="13" y="-182"/>
</window>
</objects>
</document>

View File

@ -14,21 +14,20 @@
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="20" horizontalPageScroll="10" verticalLineScroll="20" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" id="nVT-kT-bWl">
<rect key="frame" x="0.0" y="0.0" width="306" height="400"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="IBD-wb-pch">
<rect key="frame" x="0.0" y="0.0" width="306" height="400"/>
<scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="25" horizontalPageScroll="10" verticalLineScroll="25" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="nVT-kT-bWl">
<rect key="frame" x="0.0" y="0.0" width="316" height="363"/>
<clipView key="contentView" autoresizesSubviews="NO" focusRingType="none" ambiguous="YES" copiesOnScroll="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IBD-wb-pch">
<rect key="frame" x="0.0" y="0.0" width="316" height="363"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<outlineView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="none" selectionHighlightStyle="none" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" outlineTableColumn="pBj-py-R6a" id="sIz-DD-PZQ">
<rect key="frame" x="0.0" y="0.0" width="306" height="400"/>
<outlineView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" selectionHighlightStyle="none" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="22" rowSizeStyle="automatic" viewBased="YES" outlineTableColumn="pBj-py-R6a" id="sIz-DD-PZQ">
<rect key="frame" x="0.0" y="0.0" width="316" height="363"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="2" height="3"/>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn editable="NO" width="304" minWidth="40" maxWidth="1000" id="pBj-py-R6a">
<tableColumn editable="NO" width="296" minWidth="40" maxWidth="1000" id="pBj-py-R6a">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
@ -39,35 +38,17 @@
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews>
<tableCellView id="e4I-r0-vWM">
<rect key="frame" x="1" y="1" width="304" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Mig-Wj-m5e">
<rect key="frame" x="0.0" y="0.0" width="304" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="ZcN-bl-2D8">
<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>
<connections>
<outlet property="textField" destination="Mig-Wj-m5e" id="FYh-hX-PTU"/>
</connections>
</tableCellView>
<tableCellView identifier="CategoryView" focusRingType="none" id="33q-UT-ur5">
<rect key="frame" x="1" y="21" width="304" height="17"/>
<rect key="frame" x="1" y="1" width="296" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Pep-mX-LHY">
<rect key="frame" x="0.0" y="0.0" width="304" height="17"/>
<rect key="frame" x="0.0" y="0.0" width="296" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="Rrg-wr-8eL">
<font key="font" metaFont="system"/>
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
@ -77,13 +58,13 @@
<outlet property="textField" destination="Pep-mX-LHY" id="hUe-cf-6vq"/>
</connections>
</tableCellView>
<tableCellView identifier="ItemView" id="yGq-lc-RCM" customClass="TablePathView">
<rect key="frame" x="1" y="41" width="304" height="27"/>
<tableCellView identifier="ItemView" translatesAutoresizingMaskIntoConstraints="NO" id="yGq-lc-RCM" customClass="TablePathView">
<rect key="frame" x="1" y="21" width="296" height="22"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<pathControl focusRingType="none" verticalHuggingPriority="750" fixedFrame="YES" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="f7R-TO-fmF">
<rect key="frame" x="0.0" y="1" width="251" height="22"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<rect key="frame" x="20" y="0.0" width="244" height="22"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<pathCell key="cell" controlSize="small" selectable="YES" editable="YES" focusRingType="none" alignment="left" pathStyle="popUp" id="dcz-8y-tKb">
<font key="font" metaFont="smallSystem"/>
</pathCell>
@ -91,20 +72,26 @@
<action selector="pathAction:" target="-2" id="4oX-bW-ANp"/>
</connections>
</pathControl>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zNo-ij-mUl">
<rect key="frame" x="256" y="5" width="23" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="bevel" bezelStyle="rounded" image="NSNavEjectButton.normalSelected" imagePosition="overlaps" alignment="center" controlSize="small" imageScaling="proportionallyDown" inset="2" id="IZA-Tu-olu">
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" id="6g1-NT-J1w">
<rect key="frame" x="0.0" y="1" width="20" height="20"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageAlignment="left" image="drag-handle-4x10" id="x7F-qD-5y9"/>
</imageView>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zNo-ij-mUl" customClass="EjectButton">
<rect key="frame" x="277" y="3" width="16" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="eject-16x16" imagePosition="only" alignment="center" alternateImage="eject-hover-16x16" imageScaling="proportionallyDown" inset="2" id="IZA-Tu-olu">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="smallSystem"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="deleteAction:" target="-2" id="XAl-eQ-nUj"/>
<action selector="ejectAction:" target="-2" id="XAl-eQ-nUj"/>
</connections>
</button>
</subviews>
<connections>
<outlet property="deleteButton" destination="zNo-ij-mUl" id="9br-3c-ddI"/>
<outlet property="dragHandle" destination="6g1-NT-J1w" id="odc-Sw-3WS"/>
<outlet property="ejectButton" destination="zNo-ij-mUl" id="uzY-tA-5Wf"/>
<outlet property="pathControl" destination="f7R-TO-fmF" id="oH7-N3-JC7"/>
</connections>
</tableCellView>
@ -117,20 +104,27 @@
</connections>
</outlineView>
</subviews>
<nil key="backgroundColor"/>
<color key="backgroundColor" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="9Vz-lW-4GG">
<rect key="frame" x="-100" y="-100" width="306" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="f8l-nC-KhG">
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="f8l-nC-KhG" customClass="TransparentScroller">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="color" keyPath="backgroundColor">
<color key="value" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</scroller>
<point key="canvasLocation" x="-161" y="55"/>
<point key="canvasLocation" x="-161" y="54.5"/>
</scrollView>
</objects>
<resources>
<image name="NSNavEjectButton.normalSelected" width="16" height="16"/>
<image name="drag-handle-4x10" width="4" height="10"/>
<image name="eject-16x16" width="8" height="9"/>
<image name="eject-hover-16x16" width="16" height="16"/>
</resources>
</document>

View File

@ -0,0 +1,236 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15705" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15705"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NewSlotViewController">
<connections>
<outlet property="_popover" destination="QIT-2T-wdy" id="WUB-OS-kem"/>
<outlet property="childOutlineView" destination="uM0-Gk-crn" id="aL5-uC-O28"/>
<outlet property="outlineView" destination="Xj3-Qf-yek" id="AWE-Rg-XUM"/>
<outlet property="view" destination="D45-lv-6Fv" id="av3-OE-ph2"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="27" horizontalPageScroll="10" verticalLineScroll="27" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" id="D45-lv-6Fv">
<rect key="frame" x="0.0" y="0.0" width="316" height="386"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<clipView key="contentView" autoresizesSubviews="NO" focusRingType="none" copiesOnScroll="NO" id="8x1-xN-a7c">
<rect key="frame" x="0.0" y="0.0" width="316" height="386"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<outlineView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" selectionHighlightStyle="none" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="25" rowSizeStyle="automatic" viewBased="YES" indentationPerLevel="2" autoresizesOutlineColumn="YES" outlineTableColumn="u7T-p8-F2Z" id="Xj3-Qf-yek">
<rect key="frame" x="0.0" y="0.0" width="316" height="386"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn editable="NO" width="296" minWidth="40" maxWidth="1000" id="u7T-p8-F2Z">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="FM7-eO-FE4">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews>
<tableCellView identifier="MenuCell" id="1RI-9K-5qj" customClass="SlotTableCellView">
<rect key="frame" x="1" y="1" width="296" height="25"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qIF-d4-kOf">
<rect key="frame" x="0.0" y="5" width="90" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="RAM:" id="tIz-xZ-ZJH">
<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" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zQ8-o3-yBB">
<rect key="frame" x="82" y="0.0" width="199" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" autoenablesItems="NO" selectedItem="tGi-yg-GFr" id="gt4-HK-pd1">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" autoenablesItems="NO" id="KWV-nn-eiB">
<items>
<menuItem title="Item 1" state="on" id="tGi-yg-GFr"/>
<menuItem title="Item 2" id="XJr-Gb-4D4"/>
<menuItem title="Item 3" id="JeB-Fb-DeQ"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="9MH-mu-u5V"/>
</connections>
</popUpButton>
<button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xCe-sY-sGe">
<rect key="frame" x="282" y="8" width="14" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="NSListViewTemplate" imagePosition="only" alignment="center" imageScaling="proportionallyUpOrDown" inset="2" id="0qU-ID-kJ8">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="hamburger:" target="-2" id="5Xa-j7-Aod"/>
<binding destination="1RI-9K-5qj" name="hidden" keyPath="objectValue.selectedItem.children" id="rY2-0l-0N8">
<dictionary key="options">
<string key="NSValueTransformerName">NSIsNil</string>
</dictionary>
</binding>
</connections>
</button>
</subviews>
<connections>
<outlet property="hamburgerButton" destination="xCe-sY-sGe" id="5Da-If-Bt4"/>
<outlet property="menuButton" destination="zQ8-o3-yBB" id="zZf-nm-tCI"/>
<outlet property="textField" destination="qIF-d4-kOf" id="zIF-4n-v1e"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="-2" id="OV9-yE-OFp"/>
<outlet property="delegate" destination="-2" id="kXs-TN-3VL"/>
</connections>
</outlineView>
</subviews>
<color key="backgroundColor" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="rYF-ld-adB">
<rect key="frame" x="-100" y="-100" width="223" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="4pL-Dn-e75" customClass="TransparentScroller">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="color" keyPath="backgroundColor">
<color key="value" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</scroller>
<point key="canvasLocation" x="-100" y="154"/>
</scrollView>
<viewController id="ziL-Zf-s1k" userLabel="Popover View Controller">
<connections>
<outlet property="view" destination="uew-UQ-Q25" id="qjB-ya-gFf"/>
</connections>
</viewController>
<popover behavior="t" id="QIT-2T-wdy">
<connections>
<outlet property="contentViewController" destination="ziL-Zf-s1k" id="rj8-2U-9t0"/>
</connections>
</popover>
<customView id="uew-UQ-Q25">
<rect key="frame" x="0.0" y="0.0" width="250" height="400"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<button id="2jh-iq-DV6">
<rect key="frame" x="232" y="382" width="14" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="NSStopProgressFreestandingTemplate" imagePosition="only" alignment="center" imageScaling="proportionallyUpOrDown" inset="2" id="Wp7-Km-kYI">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
Gw
</string>
</buttonCell>
<connections>
<action selector="performClose:" target="QIT-2T-wdy" id="Q04-24-ZOK"/>
</connections>
</button>
<scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="27" horizontalPageScroll="10" verticalLineScroll="27" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" id="5gB-oE-Gza">
<rect key="frame" x="0.0" y="20" width="250" height="360"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<clipView key="contentView" focusRingType="none" drawsBackground="NO" copiesOnScroll="NO" id="X5e-Ka-JLr">
<rect key="frame" x="0.0" y="0.0" width="250" height="360"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<outlineView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" selectionHighlightStyle="none" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="25" rowSizeStyle="automatic" viewBased="YES" indentationPerLevel="16" autoresizesOutlineColumn="YES" outlineTableColumn="o1K-z1-KVi" id="uM0-Gk-crn">
<rect key="frame" x="0.0" y="0.0" width="250" height="360"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="230" minWidth="40" maxWidth="1000" id="o1K-z1-KVi">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="A12-NQ-gW3">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews>
<tableCellView identifier="MenuCell" id="Mgb-8H-DmI" customClass="SlotTableCellView">
<rect key="frame" x="1" y="1" width="230" height="25"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ThL-Yz-7Kd">
<rect key="frame" x="1" y="0.0" width="229" height="25"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" autoenablesItems="NO" selectedItem="djR-rV-wzX" id="SkW-fW-gwL">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" autoenablesItems="NO" id="7Ib-TL-f6U">
<items>
<menuItem title="Item 1" state="on" id="djR-rV-wzX"/>
<menuItem title="Item 2" id="qbC-4D-6t6"/>
<menuItem title="Item 3" id="qPv-x5-zpj"/>
</items>
</menu>
</popUpButtonCell>
<connections>
<action selector="menuChanged:" target="-2" id="ytA-nD-fIS"/>
</connections>
</popUpButton>
</subviews>
<connections>
<outlet property="menuButton" destination="ThL-Yz-7Kd" id="3Oc-hx-qKl"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="-2" id="HXP-pH-3Lc"/>
<outlet property="delegate" destination="-2" id="nwb-IL-MsP"/>
</connections>
</outlineView>
</subviews>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="Keh-oo-CPO">
<rect key="frame" x="-100" y="-100" width="223" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="wtc-gL-alh" customClass="TransparentScroller">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</subviews>
<point key="canvasLocation" x="-451" y="61"/>
</customView>
</objects>
<resources>
<image name="NSListViewTemplate" width="14" height="10"/>
<image name="NSStopProgressFreestandingTemplate" width="14" height="14"/>
</resources>
</document>

View File

@ -6,9 +6,12 @@
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSWindowController">
<customObject id="-2" userLabel="File's Owner" customClass="PreferencesWindowController">
<connections>
<outlet property="window" destination="QvC-M9-y7g" id="SHw-b5-d6g"/>
<outlet property="fixButton" destination="kt8-xs-My0" id="GeF-Kj-q2l"/>
<outlet property="pathField" destination="Oz5-Xb-btk" id="EnV-kr-0XI"/>
<outlet property="wdField" destination="l8V-pC-gml" id="exX-bU-pbh"/>
<outlet property="window" destination="QvC-M9-y7g" id="xJa-tx-X62"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
@ -23,7 +26,7 @@
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Oz5-Xb-btk">
<rect key="frame" x="98" y="229" width="362" height="21"/>
<rect key="frame" x="138" y="181" width="322" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" id="vDR-2V-qxd">
<font key="font" usesAppearanceFont="YES"/>
@ -31,20 +34,36 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<action selector="pathChanged:" target="-2" id="RRj-dC-q2y"/>
<binding destination="yvB-HG-64y" name="value" keyPath="values.MamePath" id="H3O-1l-peo"/>
<binding destination="yvB-HG-64y" name="enabled" keyPath="values.UseCustomMame" id="iex-A9-Db6"/>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Qmb-Ag-Xyr">
<rect key="frame" x="18" y="232" width="74" height="16"/>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="l8V-pC-gml">
<rect key="frame" x="138" y="150" width="322" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" id="wfj-GY-Qu2">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<action selector="wdChanged:" target="-2" id="g1P-8l-ZXi"/>
<binding destination="yvB-HG-64y" name="enabled" keyPath="values.UseCustomMame" id="DeG-OW-Gd2"/>
<binding destination="yvB-HG-64y" name="value" keyPath="values.MameWorkingDirectory" id="Kc9-Pc-XGU"/>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="vTJ-Ez-c1R">
<rect key="frame" x="18" y="153" width="114" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="MAME Path" id="Xcq-4g-Wlw">
<textFieldCell key="cell" lineBreakMode="clipping" title="Working Directory" id="UHt-0s-zxA">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="KAN-P2-ydI">
<rect key="frame" x="96" y="205" width="217" height="18"/>
<rect key="frame" x="136" y="234" width="217" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Close log window on normal exit" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="QMz-O0-06U">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
@ -54,6 +73,37 @@
<binding destination="yvB-HG-64y" name="value" keyPath="values.AutoCloseLogWindow" id="q0L-GA-wM2"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="j7D-jC-17Q">
<rect key="frame" x="136" y="208" width="139" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Use Custom MAME" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="V61-mz-QFo">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="yvB-HG-64y" name="value" keyPath="values.UseCustomMame" id="lH4-dm-kQC"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="kt8-xs-My0">
<rect key="frame" x="287" y="13" width="179" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="push" title="Fix VMNet Permissions" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="ifc-ID-wbu">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="fixPerms:" target="-2" id="0e2-yf-UgY"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Qmb-Ag-Xyr">
<rect key="frame" x="58" y="184" width="74" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="MAME Path" id="Xcq-4g-Wlw">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
</view>
<point key="canvasLocation" x="140" y="147"/>

View File

@ -28,10 +28,10 @@
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<gridView autoresizesSubviews="NO" xPlacement="leading" yPlacement="bottom" rowAlignment="none" translatesAutoresizingMaskIntoConstraints="NO" id="OM3-7F-wiN">
<rect key="frame" x="0.0" y="0.0" width="306" height="534"/>
<gridView autoresizesSubviews="NO" misplaced="YES" xPlacement="leading" yPlacement="bottom" rowAlignment="none" translatesAutoresizingMaskIntoConstraints="NO" id="OM3-7F-wiN">
<rect key="frame" x="0.0" y="0.0" width="306" height="459"/>
<rows>
<gridRow yPlacement="center" height="30" id="tHD-ui-hIL">
<gridRow yPlacement="center" height="25" id="tHD-ui-hIL">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.ram" id="ze9-jx-lv0">
<dictionary key="options">
@ -40,7 +40,7 @@
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="30" id="Ccd-U2-Gx5">
<gridRow yPlacement="center" height="25" id="Ccd-U2-Gx5">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl0" id="YsR-kI-yrh">
<dictionary key="options">
@ -49,7 +49,7 @@
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="30" id="JGU-aq-3uw">
<gridRow yPlacement="center" height="25" id="JGU-aq-3uw">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl1" id="1io-aZ-v2G">
<dictionary key="options">
@ -58,7 +58,7 @@
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="30" id="gVW-Ya-phU">
<gridRow yPlacement="center" height="25" id="gVW-Ya-phU">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl2" id="AgS-hm-ePr">
<dictionary key="options">
@ -67,7 +67,7 @@
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="30" id="3fP-qp-zmi">
<gridRow yPlacement="center" height="25" id="3fP-qp-zmi">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl3" id="98U-4P-iRh">
<dictionary key="options">
@ -76,7 +76,7 @@
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="30" id="86u-5p-UT6">
<gridRow yPlacement="center" height="25" id="86u-5p-UT6">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl4" id="hsy-pm-Qjk">
<dictionary key="options">
@ -85,7 +85,7 @@
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="30" id="Wdg-xb-xQx">
<gridRow yPlacement="center" height="25" id="Wdg-xb-xQx">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl5" id="0QC-RB-278">
<dictionary key="options">
@ -94,7 +94,7 @@
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="30" id="ein-Fe-vBw">
<gridRow yPlacement="center" height="25" id="ein-Fe-vBw">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl6" id="731-3P-DUy">
<dictionary key="options">
@ -103,7 +103,7 @@
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="30" id="qjB-2w-AWE">
<gridRow yPlacement="center" height="25" id="qjB-2w-AWE">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.sl7" id="sew-Ds-4I9">
<dictionary key="options">
@ -112,7 +112,7 @@
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="30" id="EEX-dh-jwn">
<gridRow yPlacement="center" height="25" id="EEX-dh-jwn">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.exp" id="EOZ-lS-QHF">
<dictionary key="options">
@ -121,7 +121,7 @@
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="30" id="OaZ-ZQ-gKK">
<gridRow yPlacement="center" height="25" id="OaZ-ZQ-gKK">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.aux" id="OlF-v7-JZx">
<dictionary key="options">
@ -130,7 +130,7 @@
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="30" id="wQi-Oz-7Ye">
<gridRow yPlacement="center" height="25" id="wQi-Oz-7Ye">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.rs232" id="AeP-bn-blv">
<dictionary key="options">
@ -139,7 +139,7 @@
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="30" id="gr2-eY-995">
<gridRow yPlacement="center" height="25" id="gr2-eY-995">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.gameio" id="x3I-Bd-9di">
<dictionary key="options">
@ -148,7 +148,7 @@
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="30" id="1xN-lm-s4l">
<gridRow yPlacement="center" height="25" id="1xN-lm-s4l">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.printer" id="T9a-lH-z5K">
<dictionary key="options">
@ -157,7 +157,7 @@
</binding>
</connections>
</gridRow>
<gridRow yPlacement="center" height="30" id="M2s-qn-SIT">
<gridRow yPlacement="center" height="25" id="M2s-qn-SIT">
<connections>
<binding destination="-2" name="hidden" keyPath="machine.modem" id="PSe-R3-S3e">
<dictionary key="options">
@ -174,7 +174,7 @@
<gridCells>
<gridCell row="tHD-ui-hIL" column="zpB-Rf-dWg" id="deJ-sv-Hb7">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nHa-QG-HjJ">
<rect key="frame" x="-2" y="511" width="104" height="16"/>
<rect key="frame" x="-2" y="439" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="RAM:" id="CvY-8m-Ni9">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -184,7 +184,7 @@
</gridCell>
<gridCell row="tHD-ui-hIL" column="6Vn-yh-FoQ" id="dak-Ha-01u">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="16" translatesAutoresizingMaskIntoConstraints="NO" id="Yks-M5-vi0">
<rect key="frame" x="104" y="506" width="205" height="25"/>
<rect key="frame" x="104" y="433" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="92u-m2-3yN" id="XFo-KF-ueS">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -206,7 +206,7 @@
</gridCell>
<gridCell row="Ccd-U2-Gx5" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="QI6-Cz-URX">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="v8c-Rp-Mnt">
<rect key="frame" x="-2" y="475" width="104" height="16"/>
<rect key="frame" x="-2" y="408" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 0:" id="EF7-NX-RMW">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -216,7 +216,7 @@
</gridCell>
<gridCell row="Ccd-U2-Gx5" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="0KQ-Qt-8KP">
<popUpButton key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Jw1-t7-YyU">
<rect key="frame" x="104" y="470" width="205" height="25"/>
<rect key="frame" x="104" y="402" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="8Iv-mH-mEI" id="47g-IO-4Xt">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -236,7 +236,7 @@
</gridCell>
<gridCell row="JGU-aq-3uw" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="Y1R-Ob-g2b">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0gP-wH-DVr">
<rect key="frame" x="-2" y="439" width="104" height="16"/>
<rect key="frame" x="-2" y="377" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 1:" id="bfg-tf-E34">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -246,7 +246,7 @@
</gridCell>
<gridCell row="JGU-aq-3uw" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="v8q-Rj-E4q">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="1" translatesAutoresizingMaskIntoConstraints="NO" id="bta-RS-JT4">
<rect key="frame" x="104" y="434" width="205" height="25"/>
<rect key="frame" x="104" y="371" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="dXO-at-nGw" id="kNn-6b-ysf">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -266,7 +266,7 @@
</gridCell>
<gridCell row="gVW-Ya-phU" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="tpv-Yc-qii">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="EHZ-ol-QVz">
<rect key="frame" x="-2" y="403" width="104" height="16"/>
<rect key="frame" x="-2" y="346" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 2:" id="FlL-pN-rn7">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -276,7 +276,7 @@
</gridCell>
<gridCell row="gVW-Ya-phU" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="OzN-rM-Pgi">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="2" translatesAutoresizingMaskIntoConstraints="NO" id="cDU-b1-x5a">
<rect key="frame" x="104" y="398" width="205" height="25"/>
<rect key="frame" x="104" y="340" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="vCY-qF-aB3" id="jvL-SH-nvG">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -296,7 +296,7 @@
</gridCell>
<gridCell row="3fP-qp-zmi" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="LbW-TT-AQ7">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zGs-8d-L0S">
<rect key="frame" x="-2" y="367" width="104" height="16"/>
<rect key="frame" x="-2" y="315" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 3:" id="KZK-h8-8cw">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -306,7 +306,7 @@
</gridCell>
<gridCell row="3fP-qp-zmi" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="h8H-TB-p2z">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="3" translatesAutoresizingMaskIntoConstraints="NO" id="aSh-cs-0Nn">
<rect key="frame" x="104" y="362" width="205" height="25"/>
<rect key="frame" x="104" y="309" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="2yS-4z-8OR" id="HaE-TD-5Wx">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -326,7 +326,7 @@
</gridCell>
<gridCell row="86u-5p-UT6" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="hJR-nJ-yYi">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zsX-jd-6ba">
<rect key="frame" x="-2" y="331" width="104" height="16"/>
<rect key="frame" x="-2" y="284" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 4:" id="WXv-RF-e7f">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -336,7 +336,7 @@
</gridCell>
<gridCell row="86u-5p-UT6" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="dHu-cL-FyO">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="4" translatesAutoresizingMaskIntoConstraints="NO" id="kU5-cR-hPZ">
<rect key="frame" x="104" y="326" width="205" height="25"/>
<rect key="frame" x="104" y="278" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="NaS-CV-XQm" id="rOP-eY-UKe">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -356,7 +356,7 @@
</gridCell>
<gridCell row="Wdg-xb-xQx" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="dsM-t5-8ng">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ANg-c1-hGf">
<rect key="frame" x="-2" y="295" width="104" height="16"/>
<rect key="frame" x="-2" y="253" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 5:" id="EhN-EV-65V">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -366,7 +366,7 @@
</gridCell>
<gridCell row="Wdg-xb-xQx" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="ffm-pA-jjo">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="5" translatesAutoresizingMaskIntoConstraints="NO" id="8z4-8f-kLU">
<rect key="frame" x="104" y="290" width="205" height="25"/>
<rect key="frame" x="104" y="247" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="gH7-4J-xsg" id="cmc-Gf-Slp">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -386,7 +386,7 @@
</gridCell>
<gridCell row="ein-Fe-vBw" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="PSw-Jx-eS2">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Cr1-RK-Z7V">
<rect key="frame" x="-2" y="259" width="104" height="16"/>
<rect key="frame" x="-2" y="222" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 6:" id="uzy-th-5Yc">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -396,7 +396,7 @@
</gridCell>
<gridCell row="ein-Fe-vBw" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="FsV-vO-KAs">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="6" translatesAutoresizingMaskIntoConstraints="NO" id="GLb-F4-PWe">
<rect key="frame" x="104" y="254" width="205" height="25"/>
<rect key="frame" x="104" y="216" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="VaX-M9-Op0" id="CjU-rC-HUT">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -416,7 +416,7 @@
</gridCell>
<gridCell row="qjB-2w-AWE" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="1WE-Mm-0O3">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3Ia-XB-C6D">
<rect key="frame" x="-2" y="223" width="104" height="16"/>
<rect key="frame" x="-2" y="191" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Slot 7:" id="32J-6e-nRV">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -426,7 +426,7 @@
</gridCell>
<gridCell row="qjB-2w-AWE" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="Yvr-uR-Hr5">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="7" translatesAutoresizingMaskIntoConstraints="NO" id="IV2-3M-qfw">
<rect key="frame" x="104" y="218" width="205" height="25"/>
<rect key="frame" x="104" y="185" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="8nb-Bq-4R4" id="nKb-Ar-bCb">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -446,7 +446,7 @@
</gridCell>
<gridCell row="EEX-dh-jwn" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="iRl-IX-FSD">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Avf-lX-f2Q">
<rect key="frame" x="-2" y="187" width="104" height="16"/>
<rect key="frame" x="-2" y="160" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Expansion:" id="PEU-OV-910">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -456,7 +456,7 @@
</gridCell>
<gridCell row="EEX-dh-jwn" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="Ehv-aA-Llc">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="8" translatesAutoresizingMaskIntoConstraints="NO" id="San-wP-1ez">
<rect key="frame" x="104" y="182" width="205" height="25"/>
<rect key="frame" x="104" y="154" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="jtv-Qx-oVD" id="42u-b4-3kx">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -476,7 +476,7 @@
</gridCell>
<gridCell row="OaZ-ZQ-gKK" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="wRB-Wh-7kG">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="EMz-7i-H38">
<rect key="frame" x="-2" y="151" width="104" height="16"/>
<rect key="frame" x="-2" y="129" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Auxiliary:" id="SoV-Qy-h2g">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -486,7 +486,7 @@
</gridCell>
<gridCell row="OaZ-ZQ-gKK" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="bx6-Rc-x2V">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="9" translatesAutoresizingMaskIntoConstraints="NO" id="3kq-qn-7YR">
<rect key="frame" x="104" y="146" width="205" height="25"/>
<rect key="frame" x="104" y="123" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="vWX-Cb-ldP" id="NqP-Uq-Knv">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -506,7 +506,7 @@
</gridCell>
<gridCell row="wQi-Oz-7Ye" column="zpB-Rf-dWg" xPlacement="fill" yPlacement="center" id="KoQ-xV-fQu">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="JAG-sJ-u2B">
<rect key="frame" x="-2" y="115" width="104" height="16"/>
<rect key="frame" x="-2" y="98" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="RS 232:" id="iG2-rY-VDv">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -516,7 +516,7 @@
</gridCell>
<gridCell row="wQi-Oz-7Ye" column="6Vn-yh-FoQ" xPlacement="fill" yPlacement="center" id="zWk-jd-i0V">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="10" translatesAutoresizingMaskIntoConstraints="NO" id="6ln-U2-0Pi">
<rect key="frame" x="104" y="110" width="205" height="25"/>
<rect key="frame" x="104" y="92" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="uu3-rr-iD8" id="daT-eX-4Vu">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -536,7 +536,7 @@
</gridCell>
<gridCell row="gr2-eY-995" column="zpB-Rf-dWg" id="xIE-bJ-mzr">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Svb-pu-WPf">
<rect key="frame" x="-2" y="79" width="104" height="16"/>
<rect key="frame" x="-2" y="67" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Game I/O:" id="2Gc-mV-zCZ">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -546,7 +546,7 @@
</gridCell>
<gridCell row="gr2-eY-995" column="6Vn-yh-FoQ" id="nhy-Gp-GLL">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="11" translatesAutoresizingMaskIntoConstraints="NO" id="K8G-bZ-6mZ">
<rect key="frame" x="104" y="74" width="205" height="25"/>
<rect key="frame" x="104" y="61" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="GOm-Tf-6qc" id="Mig-Nu-gZB">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -566,7 +566,7 @@
</gridCell>
<gridCell row="1xN-lm-s4l" column="zpB-Rf-dWg" id="vPV-KN-NNp">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="31K-iE-RCe">
<rect key="frame" x="-2" y="43" width="104" height="16"/>
<rect key="frame" x="-2" y="36" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Printer:" id="QZI-H7-i8m">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -576,7 +576,7 @@
</gridCell>
<gridCell row="1xN-lm-s4l" column="6Vn-yh-FoQ" id="KRc-Z8-drK">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="12" translatesAutoresizingMaskIntoConstraints="NO" id="sTp-en-8Wd">
<rect key="frame" x="104" y="38" width="205" height="25"/>
<rect key="frame" x="104" y="30" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="TU9-ed-ofw" id="1OL-aw-xNL">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@ -596,7 +596,7 @@
</gridCell>
<gridCell row="M2s-qn-SIT" column="zpB-Rf-dWg" id="8R2-aA-mLq">
<textField key="contentView" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="MH0-Nk-5Py">
<rect key="frame" x="-2" y="7" width="104" height="16"/>
<rect key="frame" x="-2" y="5" width="104" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Modem:" id="HQq-VN-Ju9">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -606,7 +606,7 @@
</gridCell>
<gridCell row="M2s-qn-SIT" column="6Vn-yh-FoQ" id="idI-pW-e7v">
<popUpButton key="contentView" verticalHuggingPriority="750" tag="13" translatesAutoresizingMaskIntoConstraints="NO" id="KHf-kC-BpZ">
<rect key="frame" x="104" y="2" width="205" height="25"/>
<rect key="frame" x="104" y="-1" width="205" height="25"/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="CxO-3g-va1" id="jDr-6p-C7y">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>

View File

@ -0,0 +1,17 @@
//
// CheatSheetWindowController.h
// Ample
//
// Created by Kelvin Sherlock on 1/14/2021.
// Copyright © 2021 Kelvin Sherlock. All rights reserved.
//
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@interface CheatSheetWindowController : NSWindowController
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,47 @@
//
// CheatSheetWindowController.m
// Ample
//
// Created by Kelvin Sherlock on 1/14/2021.
// Copyright © 2021 Kelvin Sherlock. All rights reserved.
//
#import "CheatSheetWindowController.h"
#import <WebKit/WebKit.h>
@interface CheatSheetWindowController ()
@property (weak) IBOutlet WKWebView *webView;
@end
@interface CheatSheetWindowController (NavigationDelegate) <WKNavigationDelegate>
@end
@implementation CheatSheetWindowController
-(NSString *)windowNibName {
return @"CheatSheet";
}
- (void)windowDidLoad {
[super windowDidLoad];
[_webView setHidden: YES];
NSBundle *bundle = [NSBundle mainBundle];
NSURL *url = [bundle URLForResource: @"CheatSheet" withExtension: @"html"];
//[[[_webView configuration] preferences] setValue: @YES forKey: @"developerExtrasEnabled"];
[_webView loadFileURL: url allowingReadAccessToURL: url];
}
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
// delay to prevent flash in dark mode.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0/8 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[webView setHidden: NO];
});
}
@end

View File

@ -2,9 +2,21 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>MameComponentsDate</key>
<date>2021-04-28T16:00:00Z</date>
<key>UseCustomMame</key>
<false/>
<key>AutoCloseLogWindow</key>
<true/>
<key>MamePath</key>
<string>/usr/local/bin/mame</string>
<key>MameWorkingDirectory</key>
<string>/usr/local/share/mame/</string>
<key>NSQuitAlwaysKeepsWindows</key>
<true/>
<key>DefaultDownloadURL</key>
<string>https://archive.org/download/mame.0229</string>
<key>DefaultDownloadExtension</key>
<string>zip</string>
</dict>
</plist>

View File

@ -0,0 +1,28 @@
//
// DiskImagesWindowController.h
// Ample
//
// Created by Kelvin Sherlock on 9/13/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@interface DiskImagesWindowController : NSWindowController <NSWindowRestoration>
+(instancetype)sharedInstance;
@end
@interface DiskImagesWindowController (TableView) <NSTableViewDelegate, NSTableViewDataSource>
@end
@interface DiskImagesWindowController (Menu) <NSMenuDelegate>
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,319 @@
//
// DiskImagesWindowController.m
// Ample
//
// Created by Kelvin Sherlock on 9/13/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import "DiskImagesWindowController.h"
#import "TableCellView.h"
#import "Ample.h"
@interface DiskImagesWindowController ()
@property (weak) IBOutlet NSTableView *tableView;
@property (strong) IBOutlet NSArrayController *arrayController;
@property (strong) NSMutableArray *content;
@end
@implementation DiskImagesWindowController {
BOOL _dirty;
NSSet *_extensions;
NSTimer *_timer;
}
+(instancetype)sharedInstance {
static DiskImagesWindowController *me;
if (!me) {
me = [self new];
}
return me;
}
+ (void)restoreWindowWithIdentifier:(NSUserInterfaceItemIdentifier)identifier state:(NSCoder *)state completionHandler:(void (^)(NSWindow *, NSError *))completionHandler {
NSLog(@"restore disk images window");
NSWindowController *controller = [self sharedInstance];
NSWindow *w = [controller window];
[w restoreStateWithCoder: state];
completionHandler(w, nil);
}
-(instancetype)init {
if ((self = [super init])) {
[self loadRecentDiskImages];
_extensions = [NSSet setWithObjects:
@"2img", @"2mg", @"chd", @"dc", @"do", @"dsk", @"hd", @"hdv", @"image", @"nib", @"po", @"wav", @"woz", @"iso", @"raw", nil
];
}
return self;
}
-(NSString *)windowNibName {
return @"DiskImages";
}
- (void)windowDidLoad {
if (!_content)
[self setContent: [NSMutableArray new]];
[super windowDidLoad];
NSWindow *window = [self window];
[window setRestorable: YES];
[window setRestorationClass: [self class]];
[_tableView registerForDraggedTypes: @[NSPasteboardTypeFileURL]];
[_tableView setDraggingSourceOperationMask: NSDragOperationCopy forLocal: NO]; // enable drag/drop to othr apps.
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
}
-(void)loadRecentDiskImages {
// NSError *error;
NSURL *sd = SupportDirectory();
NSURL *url = [sd URLByAppendingPathComponent: @"RecentDiskImages.plist"];
NSData *data = [NSData dataWithContentsOfURL: url];
if (data) {
_content = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainers format:nil error: nil];
}
if (!_content)
_content = [NSMutableArray new];
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver: self selector: @selector(diskImageAdded:) name: @"DiskImageAdded" object: nil];
[nc addObserver: self selector: @selector(willTerminate:) name: NSApplicationWillTerminateNotification object: nil];
}
-(void)diskImageAdded: (NSNotification *)notification {
NSURL *url = [notification object];
if (!url) return;
[self addFile: url];
}
-(void)markDirty {
_dirty = YES;
if (_timer) [_timer invalidate];
_timer = [NSTimer scheduledTimerWithTimeInterval: 5 * 60 repeats: NO block: ^(NSTimer *t) {
self->_timer = nil;
[self saveFile];
}];
}
-(void)saveFile {
[_timer invalidate];
_timer = nil;
NSURL *sd = SupportDirectory();
NSURL *url = [sd URLByAppendingPathComponent: @"RecentDiskImages.plist"];
if (_content && url) {
[_content writeToURL: url atomically: YES];
}
_dirty = NO;
}
-(void)willTerminate: (NSNotification *)notification {
// if dirty, write data....
if (!_dirty) return;
[self saveFile];
}
-(BOOL)addFile: (NSObject *)pathOrURL {
NSString *path = nil;
NSURL *url = nil;
if ([pathOrURL isKindOfClass: [NSString class]]) {
path = (NSString *)pathOrURL;
} else if ([pathOrURL isKindOfClass: [NSURL class]]){
url = (NSURL *)pathOrURL;
path = [NSString stringWithCString: [url fileSystemRepresentation] encoding: NSUTF8StringEncoding];
}
if (!path) return NO;
// todo -- check if file is in the list already...
BOOL found = NO;
// should really compare the volume id / ino I suppose.
for (NSMutableDictionary *d in _content) {
NSString *s = [d objectForKey: @"path"];
if ([path compare: s] == NSOrderedSame) {
found = YES;
[d setObject: [NSDate new] forKey: @"date"];
[self markDirty];
break;
}
}
if (found) return NO;
NSFileManager *fm = [NSFileManager defaultManager];
NSError *error;
NSDictionary *attr = [fm attributesOfItemAtPath: path error: &error];
if (error) {
NSLog(@"%@ : %@", path, error);
return NO;
}
NSNumber *size = [attr objectForKey: NSFileSize];
NSMutableDictionary *d = [NSMutableDictionary dictionaryWithObjectsAndKeys:
path, @"path",
size, @"size",
[NSDate new], @"date",
nil];
@synchronized (self) {
if (_arrayController)
[_arrayController addObject: d];
else
[_content addObject: d];
}
[self markDirty];
return YES;
}
-(NSMutableDictionary *)clickedItem {
NSInteger row = [_tableView clickedRow];
if (row < 0) return nil;
NSTableCellView *v = [_tableView viewAtColumn: 0 row: row makeIfNecessary: NO];
return [v objectValue];
}
#pragma mark - IBActions
- (IBAction)showInFinder:(id)sender {
NSMutableDictionary *item = [self clickedItem];
if (!item) return;
NSString *path = [item objectForKey: @"path"];
NSURL *url = [NSURL fileURLWithPath: path];
if (!url) return;
NSWorkspace *ws = [NSWorkspace sharedWorkspace];
[ws activateFileViewerSelectingURLs: @[url]];
}
- (IBAction)eject:(id)sender {
NSMutableDictionary *item = [self clickedItem];
if (!item) return;
@synchronized (self) {
if (_arrayController) {
[_arrayController removeObject: item];
} else {
[_content removeObject: item];
}
[self markDirty];
}
}
@end
@implementation DiskImagesWindowController (TableView)
#if 0
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return 5; //[_data count];
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
NSTableCellView *v = [tableView makeViewWithIdentifier: @"PathCell" owner: self];
return v;
}
#endif
-(id<NSPasteboardWriting>)tableView:(NSTableView *)tableView pasteboardWriterForRow:(NSInteger)row {
id objects = [_arrayController arrangedObjects];
NSDictionary *d = [objects objectAtIndex: row];
NSString *path = [d objectForKey: @"path"];
NSURL *url = [NSURL fileURLWithPath: path];
return url;
#if 0
NSPasteboardItem *item = [NSPasteboardItem new];
[item setString: [url absoluteString] forType: NSPasteboardTypeFileURL]; // FileURL
[item setString: path forType: NSPasteboardTypeString]; // for Terminal.app
return item;
#endif
}
-(NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id<NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)dropOperation {
if ([info draggingSource] == _tableView) return NSDragOperationNone;
// option key will ignore all filetype restrictions.
if ([NSEvent modifierFlags] & NSEventModifierFlagOption) return NSDragOperationCopy;
// this only checks the first dragged item...
NSPasteboard * pb = [info draggingPasteboard];
NSURL *url = [NSURL URLFromPasteboard: pb];
NSString *ext = [url pathExtension];
ext = [ext lowercaseString];
if ([_extensions containsObject: ext])
return NSDragOperationCopy;
return NSDragOperationNone;
}
-(BOOL)tableView:(NSTableView *)tableView acceptDrop:(id<NSDraggingInfo>)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation {
if ([info draggingSource] == _tableView) return NO;
NSPasteboard * pb = [info draggingPasteboard];
BOOL ok = NO;
for (NSPasteboardItem *item in [pb pasteboardItems]) {
// need to convert from a string to a url back to a file in case it's a file id url?
NSString *s = [item stringForType: NSPasteboardTypeFileURL];
if (!s) continue;
NSURL *url = [NSURL URLWithString: s];
if (!url) continue;
ok |= [self addFile: url];
}
return ok;
}
@end

View File

@ -0,0 +1,42 @@
//
// DownloadWindowController.h
// Ample
//
// Created by Kelvin Sherlock on 9/2/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@interface DownloadWindowController : NSWindowController <NSWindowRestoration>
@property NSString *currentROM;
@property NSInteger currentCount;
@property NSInteger totalCount;
@property NSInteger errorCount;
@property BOOL active;
+(instancetype)sharedInstance;
@end
@interface DownloadWindowController (URL) <NSURLSessionTaskDelegate, NSURLSessionDownloadDelegate>
@end
@interface DownloadWindowController (Table) <NSTableViewDelegate, NSTableViewDataSource>
@end
@interface DownloadWindowController (Menu) <NSMenuDelegate, NSMenuItemValidation>
@end
@interface DownloadTableCellView : NSTableCellView
@property (weak) IBOutlet NSTextField *statusTextField;
@property (weak) IBOutlet NSProgressIndicator *activity;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,677 @@
//
// DownloadWindowController.m
// Ample
//
// Created by Kelvin Sherlock on 9/2/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import "Ample.h"
#import "DownloadWindowController.h"
#import "Menu.h"
enum {
kTagZip = 1,
kTag7z = 2,
};
@interface DownloadExtensionTransformer: NSValueTransformer
@end
@implementation DownloadExtensionTransformer
+(void)load {
[NSValueTransformer setValueTransformer: [DownloadExtensionTransformer new] forName: @"FormatTransformer"];
}
+ (Class)transformedValueClass {
return [NSString class];
}
+ (BOOL)allowsReverseTransformation {
return YES;
}
-(id)transformedValue:(id)value {
// string to number.
if ([@"zip" isEqualToString: value])
return @(kTagZip);
if ([@"7z" isEqualToString: value])
return @(kTag7z);
return @0;
}
-(id)reverseTransformedValue:(id)value {
// number back to string.
switch ([value intValue]) {
case kTagZip: return @"zip";
case kTag7z: return @"7z";
default: return @"";
}
}
+(unsigned)stringToNumber: (NSString *)string {
if ([@"zip" isEqualToString: string])
return kTagZip;
if ([@"7z" isEqualToString: string])
return kTag7z;
return 0;
}
+(NSString *)numberToString: (unsigned)number {
switch (number) {
case kTagZip: return @"zip";
case kTag7z: return @"7z";
default: return @"";
}
}
@end
enum {
ItemMissing = 0,
ItemFound,
ItemDownloading,
ItemDownloaded,
ItemCanceled,
ItemError
};
@interface DownloadItem : NSObject
@property NSString *name;
@property NSError *error;
@property NSString *pathName;
@property NSURLSessionDownloadTask *task;
@property NSURL *localURL;
@property NSUInteger status;
@property NSUInteger index;
-(void)cancelDownload;
-(void)beginDownloadWithTask:(NSURLSessionDownloadTask *)task;
-(void)completeWithError: (NSError *)error;
-(NSString *)statusDescription;
@end
@interface DownloadWindowController ()
@property (weak) IBOutlet NSTableView *tableView;
@property (weak) IBOutlet NSPopUpButton *formatButton;
@property (weak) IBOutlet NSTextField *downloadField;
@property NSString *downloadExtension;
@end
@implementation DownloadWindowController {
NSArray *_items;
NSURL *_romFolder;
NSURL *_defaultDownloadURL;
NSURL *_downloadURL;
NSURLSession *_session;
NSMutableDictionary *_taskIndex;
NSUserDefaults *_defaults;
}
+(instancetype)sharedInstance {
static DownloadWindowController *me = nil;
if (!me) {
me = [self new];
}
return me;
}
+ (void)restoreWindowWithIdentifier:(nonnull NSUserInterfaceItemIdentifier)identifier state:(nonnull NSCoder *)state completionHandler:(nonnull void (^)(NSWindow * _Nullable, NSError * _Nullable))completionHandler {
NSLog(@"restore rom manager window");
NSWindowController *controller = [DownloadWindowController sharedInstance];
NSWindow *w = [controller window];
[w restoreStateWithCoder: state];
completionHandler(w, nil);
}
#if 0
- (void)encodeWithCoder:(nonnull NSCoder *)coder {
}
#endif
-(NSString *)windowNibName {
return @"DownloadWindow";
}
-(void)windowWillLoad {
_defaults = [NSUserDefaults standardUserDefaults];
// set here so binding works.
NSString *s = [_defaults stringForKey: kDownloadExtension];
if (![s length]) s = [_defaults stringForKey: kDefaultDownloadExtension];
_downloadExtension = s;
}
- (void)windowDidLoad {
[super windowDidLoad];
#if 0
NSWindow *window = [self window];
// disabled for now ... restoration happens before defaults are loaded.
[window setRestorable: YES];
[window setRestorationClass: [self class]];
#endif
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
NSError *error = nil;
NSBundle *bundle = [NSBundle mainBundle];
NSFileManager *fm = [NSFileManager defaultManager];
NSURL *url = [bundle URLForResource: @"roms" withExtension: @"plist"];
NSDictionary *d = [NSDictionary dictionaryWithContentsOfURL: url];
NSURL *sd = SupportDirectory();
_romFolder = [sd URLByAppendingPathComponent: @"roms"];
[fm createDirectoryAtURL: _romFolder withIntermediateDirectories: YES attributes: nil error: &error];
// so blank URL isn't overwritten.
NSString *s = [_defaults stringForKey: kDefaultDownloadURL];
_defaultDownloadURL = [NSURL URLWithString: s];
[_downloadField setPlaceholderString: s];
s = [_defaults stringForKey: kDownloadURL];
if ([s length]) {
[_downloadField setStringValue: s];
_downloadURL = [NSURL URLWithString: s];
} else {
_downloadURL = _defaultDownloadURL;
}
[self initializeExtensionMenu];
NSArray *roms = [d objectForKey: @"roms"];
[self setCurrentROM: @""];
[self setCurrentCount: 0];
[self setTotalCount: [roms count]];
[self setErrorCount: 0];
NSMutableArray *tmp = [NSMutableArray arrayWithCapacity: [roms count]];
unsigned ix = 0;
for (NSString *name in roms) {
DownloadItem *item = [DownloadItem new];
[item setName: name];
[item setIndex: ix++];
[tmp addObject: item];
}
_items = tmp;
[self refreshROMs: nil];
//[_tableView reloadData];
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
_session = [NSURLSession sessionWithConfiguration: config delegate: self delegateQueue: nil];
_taskIndex = [NSMutableDictionary dictionaryWithCapacity: [_items count]];
//[self download];
}
#if 0
-(void)validateURL: (NSString *)url {
NSURL *v;
if (![url length]) {
_effectiveURL = [NSURL URLWithString: _downloadURL];
[_downloadField setTextColor: nil];
return;
}
v = [NSURL URLWithString: url];
if (v) {
_effectiveURL = v;
[_downloadField setTextColor: nil];
} else {
_effectiveURL = [NSURL URLWithString: _downloadURL];
[_downloadField setTextColor: [NSColor systemRedColor]];
}
}
#endif
-(void)downloadItem: (DownloadItem *)item {
if (!_session) {
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
_session = [NSURLSession sessionWithConfiguration: config delegate: self delegateQueue: nil];
}
NSURLSessionDownloadTask *task;
NSString *s = [item name];
NSString *path = [s stringByAppendingPathExtension: _downloadExtension];
NSURL *url = [_downloadURL URLByAppendingPathComponent: path];
task = [_session downloadTaskWithURL: url];
[item beginDownloadWithTask: task];
[_taskIndex setObject: item forKey: task];
[task resume];
}
-(void)download {
// run in thread?
//unsigned count = 0;
for (DownloadItem *item in _items) {
NSURLSessionDownloadTask *task;
NSString *s = [item name];
NSString *path = [s stringByAppendingPathExtension: _downloadExtension];
NSURL *url = [_downloadURL URLByAppendingPathComponent: path];
task = [_session downloadTaskWithURL: url];
[_taskIndex setObject: item forKey: task];
[item setTask: task];
[task resume];
//++count;
//if (count >= 2) break;
}
[self setActive: YES];
}
-(DownloadItem *)clickedItem {
NSInteger row = [_tableView clickedRow];
if (row < 0 || row >= [_items count]) return nil;
return [_items objectAtIndex: row];
}
-(void)redrawRow: (NSUInteger)row {
//NSRect r = [_tableView rectOfRow: row];
//[_tableView setNeedsDisplayInRect: r];
NSIndexSet *rIx = [NSIndexSet indexSetWithIndex: row];
NSIndexSet *cIx = [NSIndexSet indexSetWithIndex: 0];
[_tableView reloadDataForRowIndexes: rIx columnIndexes: cIx];
}
-(void)initializeExtensionMenu {
unsigned tag;
// mark default download extension.
NSString *defaultExt = [_defaults stringForKey: kDefaultDownloadExtension];
tag = [DownloadExtensionTransformer stringToNumber: defaultExt];
NSMenuItem *item = [[_formatButton menu] itemWithTag: tag];
if (item) {
[item setAttributedTitle: ItalicMenuString([item title])];
}
#if 0
// handled via binding.
NSString *ext = [_defaults stringForKey: kDownloadExtension];
if ([ext length]) {
ix = [DownloadExtensionTransformer stringToNumber: ext];
}
[_formatButton selectItemWithTag: tag];
#endif
}
#pragma mark - IBActions
-(IBAction)cancelAll:(id)sender {
for (DownloadItem *item in _items) {
[item cancelDownload];
}
[_session invalidateAndCancel];
_session = nil;
[_taskIndex removeAllObjects];
[self setCurrentCount: 0];
[self setActive: NO];
[_tableView reloadData];
//[_tableView setNeedsDisplay: YES]; // doesn't work...
}
- (IBAction)downloadMissing:(id)sender {
BOOL delta = NO;
for (DownloadItem *item in _items) {
NSURL *url = [item localURL];
id task = [item task];
if (!url && !task) {
[self downloadItem: item];
delta = YES;
}
}
if (delta) {
[self setActive: YES];
[_tableView reloadData];
}
}
- (IBAction)showRomFolder:(id)sender {
NSWorkspace *ws = [NSWorkspace sharedWorkspace];
[ws openURL: _romFolder];
}
-(IBAction)refreshROMs: (id)sender {
NSString *romdir = [SupportDirectoryPath() stringByAppendingPathComponent: @"roms"];
NSFileManager *fm = [NSFileManager defaultManager];
for (DownloadItem *item in _items) {
NSString *name = [item name];
NSString *s = [romdir stringByAppendingPathComponent: name];
NSString *path;
path = [s stringByAppendingPathExtension: @"zip"];
if ([fm fileExistsAtPath: path]) {
[item setStatus: ItemFound];
[item setLocalURL: [NSURL fileURLWithPath: path]];
continue;
}
path = [s stringByAppendingPathExtension: @"7z"];
if ([fm fileExistsAtPath: path]) {
[item setStatus: ItemFound];
[item setLocalURL: [NSURL fileURLWithPath: path]];
continue;
}
}
// only needed if items aren't bound.
[_tableView reloadData];
}
- (IBAction)showInFinder:(id)sender {
DownloadItem *item = [self clickedItem];
if (!item) return;
NSURL *url = [item localURL];
if (!url) return;
NSWorkspace *ws = [NSWorkspace sharedWorkspace];
[ws activateFileViewerSelectingURLs: @[url]];
}
- (IBAction)download:(id)sender {
DownloadItem *item = [self clickedItem];
if (!item) return;
[self downloadItem: item];
[self setActive: YES];
[self redrawRow: [item index]];
}
- (IBAction)cancel:(id)sender {
DownloadItem *item = [self clickedItem];
if (!item) return;
[item cancelDownload];
[self redrawRow: [item index]];
}
// binding screws up with placeholder.
-(IBAction)downloadURLChanged: (NSTextField *)sender {
NSString *value;
value = [sender stringValue];
if (![value length]) {
[_defaults removeObjectForKey: kDownloadURL];
_downloadURL = _defaultDownloadURL;
return;
}
// [self validateURL: value];
[_defaults setValue: value forKey: kDownloadURL];
_downloadURL = [NSURL URLWithString: value];
}
- (IBAction)downloadExtensionChanged:(id)sender {
[_defaults setValue: _downloadExtension forKey: kDownloadExtension];
}
#pragma mark - NSURLSessionDelegate
static NSInteger TaskStatusCode(NSURLSessionTask *task) {
NSURLResponse *response = [task response];
if ([response isKindOfClass: [NSHTTPURLResponse class]]) {
return [(NSHTTPURLResponse *)response statusCode];
}
return -1;
}
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
if (error) NSLog(@"Download error: %@", error);
NSInteger statusCode = TaskStatusCode(task);
if (!error && statusCode != 200) {
// treat as an error.
NSDictionary *info = @{
NSURLErrorKey: [[task originalRequest] URL],
NSLocalizedDescriptionKey: [NSHTTPURLResponse localizedStringForStatusCode: statusCode],
};
error = [NSError errorWithDomain: NSURLErrorDomain code: NSURLErrorFileDoesNotExist userInfo: info];
}
// not sure if strictly necessary but this happens in a background thread
// and these are used in KVO binding. Also, main thread only
// means no race conditions.
dispatch_async(dispatch_get_main_queue(), ^(void){
if (error) {
[self setErrorCount: self->_errorCount + 1];
} else {
[self setCurrentCount: self->_currentCount + 1];
}
NSMutableDictionary *taskIndex = self->_taskIndex;
DownloadItem *item = [taskIndex objectForKey: task];
[taskIndex removeObjectForKey: task];
if ([taskIndex count] == 0) {
[self setActive: NO];
}
if (item) {
[item completeWithError: error];
NSUInteger row = [item index];
[self redrawRow: row];
}
});
}
- (void)URLSession:(NSURLSession *)session downloadTask:(nonnull NSURLSessionDownloadTask *)task didFinishDownloadingToURL:(nonnull NSURL *)location {
// NSLog(@"%@", task);
// NSLog(@"%@", [task response]);
if (TaskStatusCode(task) != 200) return;
// need to move to the destination directory...
// file deleted after this function returns, so can't move asynchronously.
NSFileManager *fm = [NSFileManager defaultManager];
NSURL *src = [[task originalRequest] URL];
NSURL *dest = [_romFolder URLByAppendingPathComponent: [src lastPathComponent]];
NSError *error = nil;
[fm moveItemAtURL: location toURL: dest error: &error];
DownloadItem *item = [_taskIndex objectForKey: task];
[item setLocalURL: dest];
/*
dispatch_async(dispatch_get_main_queue(), ^(void){
[item setLocalURL: dest];
}
*/
NSLog(@"%@", src);
}
@end
@implementation DownloadWindowController (Table)
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return [_items count];
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
return [_items objectAtIndex: row];
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
DownloadItem *item = [_items objectAtIndex: row];
DownloadTableCellView *v = [tableView makeViewWithIdentifier: @"DownloadCell" owner: self];
NSTextField *tf;
NSColor *redColor = [NSColor systemRedColor];
tf = [v textField];
[[v textField] setObjectValue: [item name]];
if ([item localURL]) {
[tf setTextColor: nil];
} else {
[tf setTextColor: redColor];
}
tf = [v statusTextField];
[tf setObjectValue: [item statusDescription]];
if ([item error]) {
[tf setTextColor: redColor];
} else {
[tf setTextColor: nil];
//if ([tableView isRowSelected: row]){
//[tf setTextColor: [NSColor whiteColor]];
//}
}
if ([item task]) {
[[v activity] startAnimation: nil];
} else {
[[v activity] stopAnimation: nil];
}
return v;
}
@end
@implementation DownloadTableCellView
@end
@implementation DownloadItem
-(void)beginDownloadWithTask:(NSURLSessionDownloadTask *)task {
_task = task;
_error = nil;
if (task) _status = ItemDownloading;
}
-(void)cancelDownload {
if (!_task) return;
[_task cancel];
_task = nil;
_status = ItemCanceled;
}
-(void)completeWithError: (NSError *)error {
_task = nil;
if (error) {
_error = error;
_status = ItemError;
} else {
// what if there was an error moving it?
_error = nil;
_status = ItemDownloaded;
}
}
-(NSString *)statusDescription {
static NSString *Names[] = {
@"ROM missing",
@"ROM found",
@"Downloading…",
@"Downloaded",
@"Canceled",
@"Error"
};
if (_error) return [_error localizedDescription];
if (_status > sizeof(Names)/sizeof(Names[0])) return @"Unknown";
return Names[_status];
}
@end
@implementation DownloadWindowController (Menu)
enum {
kOpenInFinder = 1,
kDownload,
kCancel,
};
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
if ([menuItem action] == @selector(downloadExtensionChanged:)) return YES;
NSInteger row = [_tableView clickedRow];
if (row < 0) return NO;
DownloadItem *item = [_items objectAtIndex: row];
NSUInteger status = [item status];
switch([menuItem tag]) {
case kOpenInFinder:
return status == ItemFound || status == ItemDownloaded;
break;
case kDownload:
return YES;
//return status == ItemMissing || status == ItemError || status == ItemCanceled;
break;
case kCancel:
return status == ItemDownloading;
break;
}
return NO;
}
@end

17
Ample/EjectButton.h Normal file
View File

@ -0,0 +1,17 @@
//
// EjectButton.h
// Ample
//
// Created by Kelvin Sherlock on 9/7/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@interface EjectButton : NSButton
@end
NS_ASSUME_NONNULL_END

60
Ample/EjectButton.m Normal file
View File

@ -0,0 +1,60 @@
//
// EjectButton.m
// Ample
//
// Created by Kelvin Sherlock on 9/7/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import "EjectButton.h"
static NSImage *ejectImage = nil;
static NSImage *ejectHoverImage = nil;
@implementation EjectButton {
NSTrackingRectTag _tracking;
BOOL _mouse;
}
+(void)initialize {
// content tint only works with template images.
ejectImage = [NSImage imageNamed: @"eject-16x16"];
ejectHoverImage = [NSImage imageNamed: @"eject-hover-16x16"];
[ejectImage setTemplate: YES];
[ejectHoverImage setTemplate: YES];
}
-(void)awakeFromNib {
[super awakeFromNib];
[self setButtonType: NSButtonTypeMomentaryPushIn];
[self setImage: ejectImage];
[self setAlternateImage: ejectHoverImage];
// _tracking = [self addTrackingRect: [self bounds] owner: self userData: nil assumeInside: NO];
}
-(void)viewDidMoveToWindow {
if (!_tracking)
_tracking = [self addTrackingRect: [self bounds] owner: self userData: nil assumeInside: NO];
}
-(void)mouseEntered:(NSEvent *)event {
_mouse = YES;
if ([self isEnabled])
[self setImage: ejectHoverImage];
}
-(void)mouseExited:(NSEvent *)event {
_mouse = NO;
if ([self isEnabled])
[self setImage: ejectImage];
}
-(void)setEnabled:(BOOL)enabled {
[super setEnabled: enabled];
if (_mouse) {
[self setImage: enabled ? ejectHoverImage : ejectImage];
}
}
@end

View File

@ -4,6 +4,33 @@
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>vgm</string>
</array>
<key>CFBundleTypeName</key>
<string>Video Game Music</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSTypeIsPackage</key>
<integer>0</integer>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>vgz</string>
</array>
<key>CFBundleTypeName</key>
<string>Video Game Music</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSTypeIsPackage</key>
<integer>0</integer>
</dict>
</array>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
@ -17,9 +44,9 @@
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>release 2</string>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>2</string>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSHumanReadableCopyright</key>

View File

@ -6,19 +6,23 @@
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import "Ample.h"
#import "LaunchWindowController.h"
#import "MediaViewController.h"
#import "SlotViewController.h"
#import "NewSlotViewController.h"
#import "MachineViewController.h"
#import "LogWindowController.h"
#include <sys/stat.h>
static NSString *kMyContext = @"kMyContext";
static NSString *kContextMachine = @"kContextMachine";
@interface LaunchWindowController ()
@property (strong) IBOutlet MediaViewController *mediaController;
@property (strong) IBOutlet SlotViewController *slotController;
@property (strong) IBOutlet NewSlotViewController *slotController;
@property (strong) IBOutlet MachineViewController *machineViewController;
@property (weak) IBOutlet NSView *machineView;
@ -30,13 +34,27 @@ static NSString *kContextMachine = @"kContextMachine";
@property NSArray *args;
@property NSString *mameMachine;
@property BOOL mameWindow;
@property BOOL mameNoThrottle;
@property BOOL mameDebug;
@property BOOL mameSquarePixels;
@property BOOL mameNoBlur;
@property BOOL mameMouse;
@property BOOL mameSamples;
@property BOOL mameAVI;
@property BOOL mameWAV;
@property BOOL mameVGM;
@property NSString *mameAVIPath;
@property NSString *mameWAVPath;
@property NSString *mameVGMPath;
@property NSInteger mameSpeed;
@property BOOL mameBGFX;
@property NSInteger mameBackend;
@property NSInteger mameEffects;
@property NSInteger mameWindowMode;
@end
@ -47,6 +65,13 @@ static NSString *kContextMachine = @"kContextMachine";
return @"LaunchWindow";
}
-(void)windowWillLoad {
[self setMameSpeed: 1];
[self setMameBGFX: YES];
[self setMameMouse: NO];
[self setMameSamples: YES];
}
- (void)windowDidLoad {
[super windowDidLoad];
@ -57,23 +82,31 @@ static NSString *kContextMachine = @"kContextMachine";
[_mediaView addSubview: [_mediaController view]];
[_machineView addSubview: [_machineViewController view]];
[self addObserver: self forKeyPath: @"mameMachine" options:0 context: (__bridge void * _Nullable)(kMyContext)];
[self addObserver: self forKeyPath: @"mameWindow" options:0 context: (__bridge void * _Nullable)(kMyContext)];
[self addObserver: self forKeyPath: @"mameSquarePixels" options:0 context: (__bridge void * _Nullable)(kMyContext)];
[self addObserver: self forKeyPath: @"mameDebug" options:0 context: (__bridge void * _Nullable)(kMyContext)];
[self addObserver: self forKeyPath: @"mameNoThrottle" options:0 context: (__bridge void * _Nullable)(kMyContext)];
[self addObserver: self forKeyPath: @"mameNoBlur" options:0 context: (__bridge void * _Nullable)(kMyContext)];
NSArray *keys = @[
@"mameMachine", @"mameSquarePixels", @"mameWindowMode",
@"mameMouse", @"mameSamples",
@"mameDebug",
@"mameSpeed",
@"mameAVI", @"mameAVIPath",
@"mameWAV", @"mameWAVPath",
@"mameVGM", @"mameVGMPath",
@"mameBGFX", @"mameBackend", @"mameEffects",
];
for (NSString *key in keys) {
[self addObserver: self forKeyPath: key options:0 context: (__bridge void * _Nullable)(kMyContext)];
}
[_slotController addObserver: self forKeyPath: @"args" options: 0 context: (__bridge void * _Nullable)(kMyContext)];
[_mediaController addObserver: self forKeyPath: @"args" options: 0 context: (__bridge void * _Nullable)(kMyContext)];
[_mediaController bind: @"media" toObject: _slotController withKeyPath: @"media" options: 0];
[self buildCommandLine];
[_machineViewController addObserver: self forKeyPath: @"machine" options: 0 context: (__bridge void * _Nullable)kContextMachine];
[self buildCommandLine];
}
@ -84,14 +117,17 @@ static NSString *kContextMachine = @"kContextMachine";
} else if (context == (__bridge void *)kContextMachine) {
NSString *machine = [_machineViewController machine];
[self setMameMachine: machine];
[_slotController setModel: machine];
[_slotController setMachine: machine];
[self buildCommandLine];
} else {
[super observeValueForKeyPath: keyPath ofObject: object change: change context: context];
}
}
static NSString * JoinArguments(NSArray *argv) {
static NSString * JoinArguments(NSArray *argv, NSString *argv0) {
static NSCharacterSet *safe = nil;
static NSCharacterSet *unsafe = nil;
@ -110,7 +146,14 @@ static NSString * JoinArguments(NSArray *argv) {
//unsigned ix = 0;
[rv appendString: @"mame"];
//[rv appendString: @"mame"];
if (argv0) {
[rv appendString: argv0];
} else {
NSString *path = MamePath();
path = path ? [path lastPathComponent] : @"mame";
[rv appendString: path];
}
for (NSString *s in argv) {
[rv appendString: @" "];
NSUInteger l = [s length];
@ -159,8 +202,70 @@ static NSString * JoinArguments(NSArray *argv) {
return rv;
}
static NSString *ShellQuote(NSString *s) {
static NSCharacterSet *safe = nil;
static NSCharacterSet *unsafe = nil;
if (!safe) {
NSString *str =
@"%+-./:=_"
@"0123456789"
@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
;
safe = [NSCharacterSet characterSetWithCharactersInString: str];
unsafe = [safe invertedSet];
}
NSUInteger l = [s length];
if (!l) {
return @"''";
}
if (!CFStringFindCharacterFromSet((CFStringRef)s, (CFCharacterSetRef)unsafe, CFRangeMake(0, l), 0, NULL)) {
return s;
}
NSMutableString *rv = [NSMutableString new];
unichar *buffer = malloc(sizeof(unichar) * l);
[s getCharacters: buffer range: NSMakeRange(0, l)];
[rv appendString: @"'"];
for (NSUInteger i = 0; i < l; ++i) {
unichar c = buffer[i];
switch (c) {
case '\'':
[rv appendString: @"\\'"];
break;
case '\\':
[rv appendString: @"\\\\"];
break;
case 0x7f:
[rv appendString: @"\\177"];
break;
default: {
NSString *cc;
if (c < 0x20) {
cc = [NSString stringWithFormat: @"\\%o", c];
} else {
cc = [NSString stringWithCharacters: &c length: 1];
}
[rv appendString: cc];
break;
}
}
}
[rv appendString: @"'"];
free(buffer);
return rv;
}
-(void)buildCommandLine {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (!_mameMachine) {
[self setCommandLine: @""];
@ -171,34 +276,94 @@ static NSString * JoinArguments(NSArray *argv) {
//[argv addObject: @"mame"];
[argv addObject: _mameMachine];
if (_mameDebug) [argv addObject: @"-debug"];
if (_mameWindow) {
[argv addObject: @"-window"];
[argv addObject: @"-nomax"];
}
// -confirm_quit?
[argv addObject: @"-skip_gameinfo"];
if (_mameWindow && _mameSquarePixels) {
NSSize screen = [_slotController resolution];
NSString *res = [NSString stringWithFormat: @"%ux%u", (unsigned)screen.width, (unsigned)screen.height];
NSString *aspect = [NSString stringWithFormat: @"%u:%u", (unsigned)screen.width, (unsigned)screen.height];
[argv addObject: @"-nounevenstretch"];
if (_mameMouse)
[argv addObject: @"-mouse"]; // capture the mouse cursor when over the window.
[argv addObject: @"-resolution"];
[argv addObject: res];
if (!_mameSamples)
[argv addObject: @"-nosamples"];
if (_mameDebug) [argv addObject: @"-debug"];
[argv addObject: @"-aspect"];
[argv addObject: aspect];
if (_mameNoBlur) {
[argv addObject: @"-video"];
[argv addObject: @"soft"];
}
/*
* -window -nomax uses a 4:3 aspect ratio - ie, height = width * 3 / 4 (since height is always the limiting factor)
* for square pixels, should pass the true size and true aspect ratio.
*/
NSSize screen = [_slotController resolution];
switch(_mameWindowMode) {
case 0: // full screen;
// no uneven stretch doesn't do anything in full-screen mode.
break;
case 1: // 1x
// make the command-line a bit shorter and more pleasant.
if (!_mameSquarePixels) {
[argv addObject: @"-window"];
[argv addObject: @"-nomax"];
break;
}
// drop through.
case 2: // 2x
case 3: // 3x
if (_mameSquarePixels) {
// NSString *aspect = [NSString stringWithFormat: @"%u:%u", (unsigned)screen.width, (unsigned)screen.height];
// [argv addObject: @"-aspect"];
// [argv addObject: aspect];
[argv addObject: @"-nounevenstretch"];
} else {
screen.height = round(screen.width * 3 / 4);
}
[argv addObject: @"-window"];
NSString *res = [NSString stringWithFormat: @"%ux%u",
(unsigned)(_mameWindowMode * screen.width),
(unsigned)(_mameWindowMode * screen.height)
];
[argv addObject: @"-resolution"];
[argv addObject: res];
break;
}
if (_mameBGFX) {
if (_mameBackend) {
static NSString *Names[] = {
@"-",
@"metal",
@"opengl",
};
[argv addObject: @"-bgfx_backend"];
[argv addObject: Names[_mameBackend]];
}
if (_mameEffects) {
static NSString *Names[] = {
@"-",
@"unfiltered",
@"hlsl",
@"crt-geom",
@"crt-geom-deluxe",
@"lcd-grid",
};
[argv addObject: @"-bgfx_screen_chains"];
[argv addObject: Names[_mameEffects]];
}
} else {
[argv addObject: @"-video"];
[argv addObject: @"soft"];
}
// -speed n
// -scale n
@ -213,40 +378,100 @@ static NSString * JoinArguments(NSArray *argv) {
[argv addObjectsFromArray: tmp];
}
if (_mameNoThrottle) [argv addObject: @"-nothrottle"];
if (_mameSpeed < 0) {
[argv addObject: @"-nothrottle"];
} else if (_mameSpeed > 1) {
[argv addObject: @"-speed"];
[argv addObject: [NSString stringWithFormat: @"%d", (int)_mameSpeed]];
}
// audio video.
if (_mameAVI && [_mameAVIPath length]) {
[argv addObject: @"-aviwrite"];
[argv addObject: _mameAVIPath];
}
if (_mameWAV && [_mameWAVPath length]) {
[argv addObject: @"-wavwrite"];
[argv addObject: _mameWAVPath];
}
// vgm only valid for custom mame.
if (![defaults boolForKey: kUseCustomMame]) {
if (_mameVGM && [_mameVGMPath length]) {
[argv addObject: @"-vgmwrite"];
[argv addObject: _mameVGMPath];
}
}
[self setCommandLine: JoinArguments(argv)]; //[argv componentsJoinedByString:@" "]];
[self setCommandLine: JoinArguments(argv, nil)];
[self setArgs: argv];
}
-(BOOL)validateMenuItem:(NSMenuItem *)menuItem {
SEL cmd = [menuItem action];
if (cmd == @selector(exportShellScript:)) {
return [_args count] ? YES : NO;
}
return [super validateMenuItem: menuItem];
}
# pragma mark - IBActions
- (IBAction)launchAction:(id)sender {
if (![_args count]) return;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *path = [defaults stringForKey: @"MamePath"];
if (![path length]) path = @"/usr/local/bin/mame";
NSURL *url = [NSURL fileURLWithPath: path];
NSTask *task = [NSTask new];
[task setExecutableURL: url];
[task setArguments: _args];
#if 0
// interferes w/ termination notification.
[task setTerminationHandler: ^(NSTask *t){
}];
#endif
[LogWindowController controllerForTask: task];
[LogWindowController controllerForArgs: _args];
}
-(IBAction)exportShellScript: (id)sender {
NSSavePanel *p = [NSSavePanel savePanel];
NSString *defaultName = [_mameMachine stringByAppendingString: @".sh"];
[p setTitle: @"Export Shell Script"];
[p setExtensionHidden: NO];
[p setNameFieldStringValue: defaultName];
//[p setDelegate: self];
NSWindow *w = [self window];
NSMutableString *data = [NSMutableString new];
[data appendString: @"#!/bin/sh\n\n"];
[data appendFormat: @"MAME=%@\n", ShellQuote(MamePath())];
[data appendFormat: @"cd %@\n", ShellQuote(MameWorkingDirectoryPath())];
[data appendString: JoinArguments(_args, @"$MAME")];
[data appendString: @"\n\n"];
[p beginSheetModalForWindow: w completionHandler: ^(NSModalResponse r) {
if (r != NSModalResponseOK) return;
NSURL *url = [p URL];
NSError *error = nil;
[data writeToURL: url atomically: YES encoding: NSUTF8StringEncoding error: &error];
[p orderOut: nil];
if (error) {
[self presentError: error];
return;
}
// chmod 755...
int ok = chmod([url fileSystemRepresentation], 0755);
if (ok < 0) {
// ...
}
}];
}
@end

View File

@ -13,7 +13,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface LogWindowController : NSWindowController <NSWindowDelegate>
+(id)controllerForTask: (NSTask *)task;
+(id)controllerForArgs: (NSArray *)args;
@end
NS_ASSUME_NONNULL_END

View File

@ -6,6 +6,7 @@
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import "Ample.h"
#import "LogWindowController.h"
static NSMutableSet *LogWindows;
@ -35,6 +36,30 @@ static NSMutableSet *LogWindows;
return controller;
}
+(id)controllerForArgs: (NSArray *)args {
// NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSURL *url = MameURL();
if (!url) {
NSAlert *alert = [NSAlert new];
[alert setMessageText: @"Unable to find MAME executable path"];
[alert runModal];
return nil;
}
NSTask *task = [NSTask new];
[task setExecutableURL: url];
[task setArguments: args];
[task setCurrentDirectoryURL: MameWorkingDirectory()];
return [LogWindowController controllerForTask: task];
}
- (void)windowDidLoad {
[super windowDidLoad];
@ -47,7 +72,10 @@ static NSMutableSet *LogWindows;
{
if ([string length])
{
[[[_textView textStorage] mutableString] appendString: string];
// needs explicit color attribute for proper dark mode support.
NSDictionary *attr = @{ NSForegroundColorAttributeName: [NSColor textColor] };
NSAttributedString *astr = [[NSAttributedString alloc] initWithString: string attributes: attr];
[[_textView textStorage] appendAttributedString: astr];
}
}
@ -58,22 +86,33 @@ static NSMutableSet *LogWindows;
NSError *error = nil;
NSPipe *pipe = [NSPipe pipe];
// window not yet loaded until [self window] called.
const char *path = [[task executableURL] fileSystemRepresentation];
// if (cp) [self appendString: [NSString stringWithFormat: @"MAME path: %s", cp]];
const char *wd = [[task currentDirectoryURL] fileSystemRepresentation];
// if (cp) [self appendString: [NSString stringWithFormat: @"Working Directory: %s", cp]];
[task setStandardError: pipe];
[task setStandardOutput: pipe];
[task launchAndReturnError: &error];
if (error) {
NSLog(@"launchAction: %@", error);
[self appendString: [error description]];
// NSURL *url = [task executableURL];
// NSString *path = [NSString stringWithCString: [url fileSystemRepresentation] encoding: NSUTF8StringEncoding];
NSLog(@"NSTask error. Path = %s error = %@", path, error);
// [self appendString: path];
// [self appendString: [error description]];
return error;
}
_task = task;
NSString *title = [NSString stringWithFormat: @"Log Window - %u", [task processIdentifier]];
NSString *title = [NSString stringWithFormat: @"Ample Log - %u", [task processIdentifier]];
[[self window] setTitle: title];
_handle = [pipe fileHandleForReading];
if (path) [self appendString: [NSString stringWithFormat: @"MAME path: %s\n", path]];
if (wd) [self appendString: [NSString stringWithFormat: @"Working Directory: %s\n", wd]];
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
@ -134,8 +173,7 @@ static NSMutableSet *LogWindows;
}
else
{
string = @"\n\n[Caught signal]\n\n";
string = [NSString stringWithFormat: @"\n\n[Caught signal %d (%s)]\n\n", status, strsignal(status)];
}
[self appendString: string];
@ -145,7 +183,7 @@ static NSMutableSet *LogWindows;
[[self window] setDocumentEdited: NO];
if (ok && [[NSUserDefaults standardUserDefaults] boolForKey: @"AutoCloseLogWindow"]) {
if (ok && [[NSUserDefaults standardUserDefaults] boolForKey: kAutoCloseLogWindow]) {
[[self window] close];
//[LogWindows removeObject: self]; // close sends WindowWillClose notification.

View File

@ -24,7 +24,7 @@
_data = [NSArray arrayWithContentsOfFile: path];
/* My Copy of XCode/Interface Builder barfs on NSBrowser. */
/* XCode/Interface Builder 11.3 barfs on NSBrowser. */
NSBrowser *browser;
NSRect frame = NSMakeRect(0, 0, 718, 200);

30
Ample/Media.h Normal file
View File

@ -0,0 +1,30 @@
//
// Media.h
// Ample
//
// Created by Kelvin Sherlock on 3/7/2021.
// Copyright © 2021 Kelvin Sherlock. All rights reserved.
//
#ifndef Media_h
#define Media_h
typedef struct Media {
unsigned cass;
unsigned cdrom;
unsigned hard;
unsigned floppy_5_25;
unsigned floppy_3_5;
unsigned pseudo_disk;
} Media;
struct Media MediaFromDictionary(NSDictionary *);
void MediaAdd(Media *dest, const Media *src);
BOOL MediaEqual(const Media *lhs, const Media *rhs);
extern const Media EmptyMedia;
#endif /* Media_h */

58
Ample/Media.m Normal file
View File

@ -0,0 +1,58 @@
//
// Media.m
// Ample
//
// Created by Kelvin Sherlock on 3/7/2021.
// Copyright © 2021 Kelvin Sherlock. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Media.h"
const Media EmptyMedia = { 0 };
struct Media MediaFromDictionary(NSDictionary *dict) {
Media m = { 0 };
#define _(name) m.name = [[dict objectForKey: @ # name] unsignedIntValue]
_(cass);
_(cdrom);
_(hard);
_(floppy_3_5);
_(floppy_5_25);
_(pseudo_disk);
return m;
#undef _
}
void MediaAdd(Media *dest, const Media *src) {
if (!src || !dest) return;
#define _(name) dest->name += src->name;
_(cass);
_(cdrom);
_(hard);
_(floppy_3_5);
_(floppy_5_25);
_(pseudo_disk);
#undef _
}
BOOL MediaEqual(const Media *lhs, const Media *rhs) {
if (lhs == rhs) return YES;
if (!lhs || !rhs) return NO;
#define _(name) if (lhs->name != rhs->name) return NO;
_(cass);
_(cdrom);
_(hard);
_(floppy_3_5);
_(floppy_5_25);
_(pseudo_disk);
return YES;
#undef _
}

View File

@ -7,16 +7,17 @@
//
#import <Cocoa/Cocoa.h>
#import "Media.h"
NS_ASSUME_NONNULL_BEGIN
@interface MediaViewController : NSViewController <NSOutlineViewDelegate, NSOutlineViewDataSource>
@property (weak) IBOutlet NSOutlineView *outlineView;
@property (nonatomic) NSDictionary *media;
@property (nonatomic) Media media;
@property NSArray *args;
- (IBAction)deleteAction:(id)sender;
- (IBAction)ejectAction:(id)sender;
- (IBAction)pathAction:(id)sender;
@ -26,10 +27,4 @@ NS_ASSUME_NONNULL_BEGIN
@interface TablePathView : NSTableCellView
@property (weak) IBOutlet NSPathControl *pathControl;
@property (weak) IBOutlet NSButton *deleteButton;
@end
NS_ASSUME_NONNULL_END

View File

@ -7,11 +7,7 @@
//
#import "MediaViewController.h"
@implementation TablePathView
@end
#import "TableCellView.h"
@protocol MediaNode
@ -22,14 +18,16 @@
-(NSString *)viewIdentifier;
-(void)prepareView: (NSTableCellView *)view;
-(CGFloat)height;
-(NSInteger)index;
@end
@interface MediaCategory : NSObject <MediaNode> {
}
@property NSInteger validCount;
@property NSArray *children; // URLs?
@property NSMutableArray *children; // URLs?
@property NSString *title;
@property NSInteger index;
-(NSInteger)count;
-(id)objectAtIndex:(NSInteger)index;
@ -40,6 +38,7 @@
@property NSURL *url;
@property BOOL valid;
@property NSInteger index;
-(NSInteger)count;
-(id)objectAtIndex:(NSInteger)index;
@ -52,6 +51,10 @@
@implementation MediaCategory
+(instancetype)categoryWithTitle: (NSString *)title {
return [[self alloc] initWithTitle: title];
}
-(instancetype)initWithTitle: (NSString *)title {
[self setTitle: title];
return self;
@ -77,6 +80,8 @@
}
-(void)prepareView: (NSTableCellView *)view {
[view setObjectValue: self];
[[view textField] setStringValue: _title];
}
@ -92,53 +97,88 @@
}
unsigned count = (unsigned)[_children count];
NSMutableArray *tmp = [NSMutableArray arrayWithArray: _children];
_validCount = newCount;
if (!_children) _children = [NSMutableArray new];
for (unsigned i = count; i < newCount; ++i) {
[tmp addObject: [MediaItem new]];
MediaItem *item = [MediaItem new];
[item setIndex: i];
[_children addObject: item];
}
// delete excess items, if blank. otherwise, mark invalid.
unsigned ix = 0;
for(MediaItem *item in tmp) {
for(MediaItem *item in _children) {
[item setValid: ix++ < newCount];
}
for (unsigned i = newCount; i < count; ++i) {
MediaItem *item = [tmp lastObject];
MediaItem *item = [_children lastObject];
if ([item url]) break;
[tmp removeLastObject];
[_children removeLastObject];
}
[self setChildren: tmp];
return YES;
}
-(BOOL)pruneChildren {
-(BOOL)pruneChildrenWithOutlineView: (NSOutlineView *)view {
NSUInteger count = [_children count];
BOOL delta = NO;
if (_validCount == count) return NO;
NSMutableIndexSet *set = [NSMutableIndexSet new];
NSMutableArray *tmp = [NSMutableArray arrayWithArray: _children];
for (NSInteger i = _validCount; i < count; ++i) {
MediaItem *item = [tmp lastObject];
MediaItem *item = [_children lastObject];
if ([item url]) break;
[tmp removeLastObject];
[_children removeLastObject];
[set addIndex: [_children count]];
delta = YES;
}
if (delta) {
[self setChildren: tmp];
if (view)
[view removeItemsAtIndexes: set inParent: self withAnimation: NSTableViewAnimationEffectFade];
return YES;
}
return NO;
}
-(BOOL)moveItemFrom: (NSInteger)oldIndex to: (NSInteger)newIndex outlineView: (NSOutlineView *)view {
if (newIndex == oldIndex) return NO;
NSUInteger count = [_children count];
if (oldIndex >= count) return NO;
MediaItem *item = [_children objectAtIndex: oldIndex];
[_children removeObjectAtIndex: oldIndex];
if (newIndex > oldIndex) newIndex--;
if (newIndex >= count) {
[_children addObject: item];
} else {
[_children insertObject: item atIndex: newIndex];
}
if (view) [view moveItemAtIndex: oldIndex inParent: self toIndex: newIndex inParent: self];
// re-index and re-validate.
unsigned ix = 0;
for (MediaItem *item in _children) {
[item setIndex: ix];
[item setValid: ix < _validCount];
// [view reloadItem: item];
++ix;
}
[self pruneChildrenWithOutlineView: view];
//[view reloadItem: self reloadChildren: YES];
return YES;
}
@end
@implementation MediaItem
-(instancetype)initWithURL: (NSURL *)url {
@ -167,15 +207,35 @@
}
-(void)prepareView: (TablePathView *)view {
NSPathControl *pc = [view pathControl];
[pc setURL: _url]; //??? will binding take care of it?
[pc unbind: @"value"];
[pc bind: @"value" toObject: self withKeyPath: @"url" options: nil];
NSValueTransformer *t;
NSDictionary *options;
[view setObjectValue: self];
NSPathControl *pc = [view pathControl];
NSButton *button = [view ejectButton];
[pc unbind: @"value"];
[pc unbind: @"enabled"];
[pc bind: @"value" toObject: self withKeyPath: @"url" options: nil];
[pc bind: @"enabled" toObject: self withKeyPath: @"valid" options: options];
[button unbind: @"enabled"];
[button unbind: @"contentTintColor"];
t = [NSValueTransformer valueTransformerForName: NSIsNotNilTransformerName];
options = @{ NSValueTransformerBindingOption: t};
[button bind: @"enabled" toObject: self withKeyPath: @"url" options: options];
t = [NSValueTransformer valueTransformerForName: @"ValidColorTransformer"];
options = @{ NSValueTransformerBindingOption: t};
[button bind: @"contentTintColor" toObject: self withKeyPath: @"valid" options: options];
#if 0
NSColor *tintColor = nil;
if (!_valid) tintColor = [NSColor redColor];
[[view deleteButton] setContentTintColor: tintColor];
if (!_valid) tintColor = [NSColor systemRedColor];
[button setContentTintColor: tintColor];
#endif
}
-(CGFloat)height {
@ -183,21 +243,36 @@
}
-(void)invalidate {
_valid = NO;
if (!_valid) return;
[self setValid: NO];
}
@end
#define CATEGORY_COUNT 6
#define SIZEOF(x) (sizeof(x) / sizeof(x[0]))
@interface MediaViewController () {
MediaCategory *_data[5];
MediaCategory *_data[CATEGORY_COUNT];
NSArray *_root;
NSDictionary *_media;
Media _media;
}
@end
@implementation MediaViewController
enum {
kIndexFloppy525 = 0,
kIndexFloppy35,
kIndexHardDrive,
kIndexCDROM,
kIndexCassette,
kIndexDiskImage,
};
-(void)awakeFromNib {
static unsigned first = 0;
@ -205,44 +280,30 @@
if (first) return;
first++;
MediaCategory *a, *b, *c, *d, *e;
a = [[MediaCategory alloc] initWithTitle: @"5.25\" Floppies"];
b = [[MediaCategory alloc] initWithTitle: @"3.5\" Floppies"];
c = [[MediaCategory alloc] initWithTitle: @"Hard Drives"];
d = [[MediaCategory alloc] initWithTitle: @"CD-ROMs"];
e = [[MediaCategory alloc] initWithTitle: @"Casettes"];
_data[0] = a;
_data[1] = b;
_data[2] = c;
_data[3] = d;
_data[4] = e;
_data[kIndexFloppy525] = [MediaCategory categoryWithTitle: @"5.25\" Floppies"];
_data[kIndexFloppy35] = [MediaCategory categoryWithTitle: @"3.5\" Floppies"];
_data[kIndexHardDrive] = [MediaCategory categoryWithTitle: @"Hard Drives"];
_data[kIndexCDROM] = [MediaCategory categoryWithTitle: @"CD-ROMs"];
_data[kIndexCassette] = [MediaCategory categoryWithTitle: @"Cassettes"];
_data[kIndexDiskImage] = [MediaCategory categoryWithTitle: @"Hard Disk Images"]; // Mac Nubus psuedo image device
_root = @[];
}
enum {
kIndexFloppy_5_25 = 0,
kIndexFloppy_3_5,
kIndex_HardDrive,
kIndexCDROM,
kIndexCassette
};
-(void)rebuildArgs {
static char* prefix[] = {
"flop", "flop", "hard", "cdrm", "cass"
"flop", "flop", "hard", "cdrm", "cass", "disk"
};
static_assert(SIZEOF(prefix) == CATEGORY_COUNT, "Missing item");
NSMutableArray *args = [NSMutableArray new];
unsigned counts[5] = { 0, 0, 0, 0, 0 };
unsigned counts[CATEGORY_COUNT] = { 0 };
for (unsigned j = 0; j < 5; ++j) {
for (unsigned j = 0; j < CATEGORY_COUNT; ++j) {
MediaCategory *cat = _data[j];
NSInteger valid = [cat validCount];
@ -265,51 +326,52 @@ enum {
-(void)rebuildRoot {
NSMutableArray *tmp = [NSMutableArray new];
for (unsigned j = 0 ; j < 5; ++j) {
int ix = 0;
for (unsigned j = 0 ; j < CATEGORY_COUNT; ++j) {
MediaCategory *cat = _data[j];
if ([cat count]) [tmp addObject: cat];
[cat setIndex: -1];
if ([cat count]) {
[cat setIndex: ix++];
[tmp addObject: cat];
}
}
_root = tmp;
//[_outlineView reloadItem: nil reloadChildren: YES];
// todo - switch this to use removeItemsAtIndexes:inParent:withAnimation:
// and insertItemsAtIndexes:inParent:withAnimation:
[_outlineView reloadData];
[_outlineView expandItem: nil expandChildren: YES];
}
-(void)setMedia: (NSDictionary *)media {
-(void)setMedia: (Media)media {
static NSString *Keys[] = {
@"flop_5_25",
@"flop_3_5",
@"hard",
@"cdrm",
@"cass"
};
NSNumber *o;
MediaCategory *cat;
unsigned i;
BOOL delta = NO;
if (_media == media) return;
unsigned x;
if (MediaEqual(&_media, &media)) return;
_media = media;
for (unsigned j = 0; j < 5; ++j) {
o = [media objectForKey: Keys[j]];
i = [o unsignedIntValue];
cat = _data[j];
delta |= [cat setItemCount: i];
}
#undef _
#define _(name, index) \
x = media.name; cat = _data[index]; delta |= [cat setItemCount: x]
_(cass, kIndexCassette);
_(cdrom, kIndexCDROM);
_(hard, kIndexHardDrive);
_(floppy_3_5, kIndexFloppy35);
_(floppy_5_25, kIndexFloppy525);
_(pseudo_disk, kIndexDiskImage);
if (delta) {
[self rebuildRoot];
[self rebuildArgs];
}
}
static NSString *kDragType = @"private.ample.media";
- (void)viewDidLoad {
[super viewDidLoad];
@ -317,8 +379,11 @@ enum {
//NSOutlineView *view = [self view];
//[view expandItem: nil expandChildren: YES];
// Do view setup here.
[_outlineView reloadData];
[_outlineView expandItem: nil expandChildren: YES];
[_outlineView registerForDraggedTypes: @[kDragType]];
}
#pragma mark - NSOutlineViewDelegate
@ -340,6 +405,7 @@ enum {
if (!ident) return nil;
NSTableCellView *v = [outlineView makeViewWithIdentifier: ident owner: self];
[(id<MediaNode>)item prepareView: v];
[v setObjectValue: item];
return v;
}
@ -402,9 +468,139 @@ enum {
return [item height];
}
#if 0
- (id<NSPasteboardWriting>)outlineView:(NSOutlineView *)outlineView pasteboardWriterForItem:(id<MediaNode>)item {
if ([item isGroupItem]) return nil;
NSPasteboardItem *pb = [NSPasteboardItem new];
return pb;
}
#endif
- (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pasteboard {
if ([items count] > 1) return NO;
//NSLog(@"%s", sel_getName(_cmd));
MediaItem *item = [items firstObject];
if (![item isKindOfClass: [MediaItem class]]) return NO;
// find the category. only allow if more than 1 item in the category.
MediaCategory *cat = nil;
for (MediaCategory *c in _root) {
NSUInteger ix = [[c children] indexOfObject: item];
if (ix != NSNotFound){
cat = c;
break;
}
}
if (!cat) return NO;
if ([cat count] < 2) return NO;
NSInteger indexes[2] = { 0, 0 };
indexes[0] = [cat index];
indexes[1] = [item index];
NSData *data = [NSData dataWithBytes: indexes length: sizeof(indexes)];
[pasteboard setData: data forType: kDragType];
return YES;
}
/*
* IF item is present, it's a MediaCategory and index is the index of the MediaItem it would be inserted as.
* IF item is nil, index is the MediaCategory index, which should be converted to moving to the end.
* IF index < 0, dragging far beyond the category list, so NOPE it.
*
*/
- (NSDragOperation)outlineView:(NSOutlineView *)outlineView validateDrop:(id<NSDraggingInfo>)info proposedItem:(id)item proposedChildIndex:(NSInteger)index {
if (index < 0) return NSDragOperationNone;
NSPasteboard *pb = [info draggingPasteboard];
NSData *data = [pb dataForType: kDragType];
if (!data) return NSDragOperationNone;
NSInteger indexes[2];
if ([data length] != sizeof(indexes)) return NSDragOperationNone;
[data getBytes: &indexes length: sizeof(indexes)];
//NSLog(@"%d - %d", (int)indexes[0], (int)indexes[1]);
MediaCategory *cat = item;
if (!item) {
// move to the END of the previous category.
if (index == 0) return NSDragOperationNone;
cat = [_root objectAtIndex: index - 1];
index = [cat count]; // -1; - interferes w/ -1 logic below.
}
//NSLog(@"%d - %d", (int)[(MediaCategory *)item index], (int)index);
if ([cat index] != indexes[0]) return NSDragOperationNone;
if (indexes[1] == index) return NSDragOperationNone;
if (indexes[1] == index-1) return NSDragOperationNone;
return NSDragOperationMove;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id<NSDraggingInfo>)info item:(id)item childIndex:(NSInteger)index {
if (index < 0) return NO;
NSPasteboard *pb = [info draggingPasteboard];
NSData *data = [pb dataForType: kDragType];
if (!data) return NSDragOperationNone;
NSInteger indexes[2];
if ([data length] != sizeof(indexes)) return NO;
[data getBytes: &indexes length: sizeof(indexes)];
//NSLog(@"%d - %d", (int)indexes[0], (int)indexes[1]);
MediaCategory *cat = item;
if (!item) {
// move to the END of the previous category.
if (index == 0) return NO;
cat = [_root objectAtIndex: index - 1];
index = [cat count]; // -1; - interferes w/ -1 logic below.
}
//NSLog(@"%d - %d", (int)[(MediaCategory *)item index], (int)index);
if ([cat index] != indexes[0]) return NO;
if (indexes[1] == index) return NO;
if (indexes[1] == index-1) return NO;
NSInteger oldIndex = indexes[1];
[_outlineView beginUpdates];
[cat moveItemFrom: oldIndex to: index outlineView: _outlineView];
[_outlineView endUpdates];
[self rebuildArgs];
//[_outlineView reloadItem: cat reloadChildren: YES];
return YES;
}
#pragma mark - IBActions
- (IBAction)deleteAction:(id)sender {
- (IBAction)ejectAction:(id)sender {
NSInteger row = [_outlineView rowForView: sender];
if (row < 0) return;
@ -417,12 +613,27 @@ enum {
// if item is invalid, should attempt to remove...
if (![item valid]) {
MediaCategory *cat = [_outlineView parentForItem: item];
if ([cat pruneChildren]) [self rebuildRoot];
[_outlineView beginUpdates];
[cat pruneChildrenWithOutlineView: _outlineView];
[_outlineView endUpdates];
}
// todo -- if this eliminates a category completely, it will still be included
// since we're now using animaations instead of reloading.
[self rebuildArgs];
}
- (IBAction)pathAction:(id)sender {
// need to update the eject button...
NSURL *url = [(NSPathControl *)sender URL];
if (url) {
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc postNotificationName: @"DiskImageAdded" object: url];
}
[self rebuildArgs];
}
@end

15
Ample/Menu.h Normal file
View File

@ -0,0 +1,15 @@
//
// Menu.h
// Ample
//
// Created by Kelvin Sherlock on 10/3/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#ifndef Menu_h
#define Menu_h
NSFont *ItalicMenuFont(void);
NSAttributedString *ItalicMenuString(NSString *s);
#endif /* Menu_h */

27
Ample/Menu.m Normal file
View File

@ -0,0 +1,27 @@
//
// Menu.m
// Ample
//
// Created by Kelvin Sherlock on 10/3/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
NSFont *ItalicMenuFont(void) {
NSFont *font = [NSFont menuFontOfSize: 0];
NSFontDescriptor *fd = [font fontDescriptor];
NSFontDescriptor *fd2 = [fd fontDescriptorWithSymbolicTraits: NSFontDescriptorTraitItalic];
return [NSFont fontWithDescriptor: fd2 size: [font pointSize]];
}
NSAttributedString *ItalicMenuString(NSString *s) {
static NSDictionary *attr = nil;
if (!attr) {
attr = @{
NSFontAttributeName: ItalicMenuFont()
};
}
return [[NSAttributedString alloc] initWithString: s attributes: attr];
}

View File

@ -0,0 +1,29 @@
//
// NewSlotViewController.h
// Ample
//
// Created by Kelvin Sherlock on 9/9/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "Media.h"
NS_ASSUME_NONNULL_BEGIN
@interface NewSlotViewController : NSViewController
@property NSArray *args;
@property Media media;
@property NSSize resolution;
@property (nonatomic) NSString *machine;
@end
@interface NewSlotViewController (OutlineView) <NSOutlineViewDelegate, NSOutlineViewDataSource>
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,342 @@
//
// NewSlotViewController.m
// Ample
//
// Created by Kelvin Sherlock on 9/9/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import "Ample.h"
#import "NewSlotViewController.h"
#import "Menu.h"
#import "Slot.h"
#import "Media.h"
#import <objc/runtime.h>
/* number of slot types. bitmask used so should be < sizeof(unsigned *8) */
#define SLOT_COUNT 22
static_assert(SLOT_COUNT <= sizeof(unsigned) * 8, "too many slot types");
#define SIZEOF(x) (sizeof(x) / sizeof(x[0]))
static unsigned RootKey = 0;
@interface NewSlotViewController ()
@property (weak) IBOutlet NSOutlineView *outlineView;
@property (weak) IBOutlet NSOutlineView *childOutlineView;
@end
@implementation NewSlotViewController {
NSArray *_root;
unsigned _slots_explicit;
unsigned _slots_valid;
unsigned _slots_default;
Slot *_slot_object[SLOT_COUNT];
NSString *_slot_value[SLOT_COUNT]; // when explicitely set.
Media _slot_media[SLOT_COUNT];
Media _machine_media;
NSDictionary *_machine_data;
IBOutlet NSPopover *_popover;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do view setup here.
_root = @[];
objc_setAssociatedObject(_outlineView, &RootKey, _root, OBJC_ASSOCIATION_RETAIN);
//[_outlineView setIndentationPerLevel: 2.0];
}
-(void)resetMachine {
_root = @[];
objc_setAssociatedObject(_outlineView, &RootKey, _root, OBJC_ASSOCIATION_RETAIN);
[_outlineView reloadData];
_slots_valid = 0;
_slots_explicit = 0;
_slots_default = 0;
_machine_media = EmptyMedia;
_machine_data = nil;
for (unsigned i = 0; i < SLOT_COUNT; ++i) {
_slot_media[i] = EmptyMedia;
_slot_object[i] = nil;
_slot_value[i] = nil;
}
[self setResolution: NSMakeSize(0, 0)];
[self setArgs: @[]];
[self setMedia: EmptyMedia];
}
-(void)loadMachine {
NSDictionary *d = MameMachine(_machine);
if (!d) {
[self resetMachine];
return;
}
NSArray *r = [d objectForKey: @"resolution"];
NSSize res = NSMakeSize(0, 0);
if (r) {
res.width = [(NSNumber *)[r objectAtIndex: 0 /*@"width"*/] doubleValue];
res.height = [(NSNumber *)[r objectAtIndex: 1 /*@"height"*/] doubleValue];
}
[self setResolution: res];
_slots_valid = 0;
//_slots_explicit = 0;
_slots_default = 0;
_machine_media = MediaFromDictionary([d objectForKey: @"media"]);
_machine_data = d;
for (unsigned i = 0; i < SLOT_COUNT; ++i) {
_slot_media[i] = EmptyMedia;
_slot_object[i] = nil;
}
extern NSArray *BuildSlots(NSString *name, NSDictionary *data);
_root = BuildSlots(_machine, d);
objc_setAssociatedObject(_outlineView, &RootKey, _root, OBJC_ASSOCIATION_RETAIN);
for (Slot *item in _root) {
NSInteger index = [item index];
if (index < 0) continue;
unsigned mask = 1 << index;
_slots_valid |= mask;
if ([item defaultIndex] >= 0)
_slots_default |= mask;
if (_slot_value[index])
[item selectValue: _slot_value[index]];
_slot_media[index] = [item selectedMedia];
_slot_object[index] = item;
}
[_outlineView reloadData];
[self rebuildMedia];
[self rebuildArgs];
}
-(void)setMachine: (NSString *)machine {
if (_machine == machine) return;
if (_machine && machine && [machine compare: _machine] == NSOrderedSame) return;
_machine = machine;
if (!machine) {
[self resetMachine];
return;
}
[self loadMachine];
}
-(void)rebuildMedia {
Media media = _machine_media;
unsigned mask = 1;
for (unsigned i = 0; i < SLOT_COUNT; ++i, mask <<= 1) {
if (_slots_valid & mask) {
MediaAdd(&media, &_slot_media[i]);
}
}
[self setMedia: media];
}
-(void)rebuildArgs {
NSMutableArray *args = [NSMutableArray new];
for (Slot *item in _root) {
NSArray *x = [item args];
if (x) [args addObjectsFromArray: x];
}
[self setArgs: args];
}
- (IBAction)menuChanged:(NSPopUpButton *)sender {
BOOL direct = YES;
NSInteger index = [sender tag];
if (index < 0) return; //
if (index >= 0 && index < SLOT_COUNT) {
direct = YES;
} else {
direct = NO;
index &= ~0x10000;
}
if (index >= SLOT_COUNT) return; //
unsigned mask = 1 << index;
// index 0 = ram = special case...
SlotOption *o = [[sender selectedItem] representedObject];
Slot *item = _slot_object[index];
if (direct) {
_slots_explicit |= mask;
_slot_value[index] = [o value];
//_slots_default &= ~mask;
}
Media media = [item selectedMedia];
if (!MediaEqual(&media, &_slot_media[index])) {
_slot_media[index] = media;
[self rebuildMedia];
}
// needs to reload children if expanded.
#ifdef SLOT_TREE
if (direct) {
BOOL rc = ([_outlineView isItemExpanded: item]);
[_outlineView reloadItem: item reloadChildren: rc];
}
#endif
[self rebuildArgs];
}
- (IBAction)hamburger:(id)sender {
#if 0
if ([_popover isShown]) {
[_popover close];
}
#endif
NSInteger index = [sender tag];
if (index < 0 || index >= SLOT_COUNT) return;
Slot *item = _slot_object[index];
NSArray *children = [item selectedChildren];
objc_setAssociatedObject(_childOutlineView, &RootKey, children, OBJC_ASSOCIATION_RETAIN);
if (!children) return;
[_childOutlineView reloadData];
NSSize size = [_popover contentSize];
if (size.width < 200) size.width = 250;
size = [_childOutlineView sizeThatFits: size];
size.height += 40;
[_popover setContentSize: size];
[_popover showRelativeToRect: [sender bounds]
ofView: sender
preferredEdge: NSRectEdgeMaxY];
}
-(IBAction)resetSlots:(id)sender {
_slots_explicit = 0;
for (unsigned i = 0; i < SLOT_COUNT; ++i) {
_slot_media[i] = EmptyMedia;
_slot_value[i] = nil;
}
for (Slot *item in _root) {
[item reset];
// if children, reset them too...
NSInteger index = [item index];
if (index < 0) continue;
_slot_media[index] = [item selectedMedia];
}
#ifdef SLOT_TREE
[_outlineView reloadData];
#endif
[self rebuildMedia];
[self rebuildArgs];
}
@end
@implementation NewSlotViewController (OutlineView)
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
NSArray *root = objc_getAssociatedObject(outlineView, &RootKey);
if (!item) return [root count];
#ifdef SLOT_TREE
NSArray *tmp = [(Slot *)item selectedChildren];
return [tmp count];
#endif
return 0;
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
NSArray *root = objc_getAssociatedObject(outlineView, &RootKey);
if (!item) return [root objectAtIndex: index];
#ifdef SLOT_TREE
NSArray *tmp = [(Slot *)item selectedChildren];
return [tmp objectAtIndex: index];
#endif
return nil;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
#ifdef SLOT_TREE
if (!item) return NO;
NSArray *tmp = [(Slot *)item selectedChildren];
return [tmp count] > 0;
#else
return NO;
#endif
}
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(Slot *)item {
SlotTableCellView *v = [outlineView makeViewWithIdentifier: @"MenuCell" owner: self];
[item prepareView: v];
return v;
}
@end

View File

@ -0,0 +1,17 @@
//
// PreferencesWindowController.h
// Ample
//
// Created by Kelvin Sherlock on 8/31/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@interface PreferencesWindowController : NSWindowController
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,199 @@
//
// PreferencesWindowController.m
// Ample
//
// Created by Kelvin Sherlock on 8/31/2020.
// Copyright © 2020 Kelvin Sherlock. All rights reserved.
//
#import "Ample.h"
#import "PreferencesWindowController.h"
#import <Security/Security.h>
@interface PreferencesWindowController ()
@property (weak) IBOutlet NSTextField *pathField;
@property (weak) IBOutlet NSTextField *wdField;
@property (weak) IBOutlet NSButton *fixButton;
@end
@implementation PreferencesWindowController
-(NSString *)windowNibName {
return @"Preferences";
}
- (void)windowDidLoad {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[super windowDidLoad];
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
[self validateMamePath: [defaults stringForKey: kMamePath]];
[self validateMameWD: [defaults stringForKey: kMameWorkingDirectory]];
/* check vmnet_helper permissions */
int needs_fixin = [self checkHelperPermissions: nil];
[_fixButton setEnabled: needs_fixin > 0];
}
-(void)validateMamePath: (NSString *)path {
NSFileManager * fm = [NSFileManager defaultManager];
if ([path length] == 0 || [fm isExecutableFileAtPath: path]) {
[_pathField setTextColor: nil];
} else {
[_pathField setTextColor: [NSColor systemRedColor]];
}
}
-(void)validateMameWD: (NSString *)path {
NSFileManager * fm = [NSFileManager defaultManager];
BOOL directory = YES;
if ([path length] == 0) {
[_wdField setTextColor: nil];
return;
}
if ([fm fileExistsAtPath: path isDirectory: &directory] && directory) {
[_wdField setTextColor: nil];
return;
}
[_wdField setTextColor: [NSColor systemRedColor]];
}
- (IBAction)pathChanged:(id)sender {
NSString *path = [sender stringValue];
[self validateMamePath: path];
}
- (IBAction)wdChanged:(id)sender {
NSString *path = [sender stringValue];
[self validateMameWD: path];
}
// -1 - error
// 1 - needs help
// 0 - a-ok
-(int)checkHelperPermissions: (NSString *)path {
static const unsigned Mask = S_ISUID | S_ISGID;
if (!path) {
NSBundle *bundle = [NSBundle mainBundle];
path = [bundle pathForAuxiliaryExecutable: @"vmnet_helper"];
}
if (!path) return -1;
NSFileManager *fm = [NSFileManager defaultManager];
NSError *error = nil;
NSDictionary *attr = [fm attributesOfItemAtPath: path error: &error];
if (error) return -1;
NSNumber *owner = [attr objectForKey: NSFileOwnerAccountID];
NSNumber *perm = [attr objectForKey: NSFilePosixPermissions];
if ([owner longValue] == 0 && ([perm unsignedIntValue] & Mask) == Mask) return 0;
return 1;
}
- (IBAction)fixPerms:(id)sender {
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForAuxiliaryExecutable: @"vmnet_helper"];
if (!path) return;
#if 0
// this requires an entitlement and sanboxing and Apple's permission.
NSWorkspace *ws = [NSWorkspace sharedWorkspace];
[ws requestAuthorizationOfType:NSWorkspaceAuthorizationTypeSetAttributes
completionHandler: ^(NSWorkspaceAuthorization *a, NSError *e){
if (e || !a) return;
NSError *error = nil;
NSDictionary *attr = @{
NSFileOwnerAccountID: @0, /* root */
NSFileGroupOwnerAccountID: @20, /* staff */
// NSFilePosixPermissions: @0106755 /* 755 + setuid + setgid */
};
NSFileManager *fm = [NSFileManager fileManagerWithAuthorization: a];
[fm setAttributes: attr ofItemAtPath: path error: &error];
if (error) {
NSLog(@"%@", error);
// NSAlert *a = [NSAlert alertWithError: error];
// [a runModal];
}
else {
[self->_fixButton setEnabled: NO];
}
}];
#endif
// AuthorizationExecuteWithPrivileges - deprecated in 10.7
// https://github.com/sveinbjornt/STPrivilegedTask
// XMJobBless + launchd stuff - the preferred way to do it...
// https://developer.apple.com/library/archive/samplecode/BetterAuthorizationSample/Introduction/Intro.html
// https://developer.apple.com/library/archive/samplecode/SMJobBless/Listings/ReadMe_txt.html#//apple_ref/doc/uid/DTS40010071-ReadMe_txt-DontLinkElementID_3
//
// really should be a launchd service but that's for another time...
AuthorizationRef myAuthorizationRef = 0;
OSStatus myStatus = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &myAuthorizationRef);
if (myStatus) return;
AuthorizationItem myItems[1] = {{0}};
myItems[0].name = kAuthorizationRightExecute;
myItems[0].valueLength = 0;
myItems[0].value = NULL;
myItems[0].flags = 0;
AuthorizationRights myRights = {0};
myRights.count = sizeof(myItems) / sizeof(myItems[0]);
myRights.items = myItems;
AuthorizationFlags myFlags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed |
kAuthorizationFlagExtendRights | kAuthorizationFlagPreAuthorize;
myStatus = AuthorizationCopyRights(myAuthorizationRef, &myRights,
kAuthorizationEmptyEnvironment, myFlags, NULL);
if (!myStatus) {
FILE *fp = NULL;
static char buffer[4096];
const char *cp = [path fileSystemRepresentation];
const char* args_chown[] = {"root", cp , NULL};
const char* args_chmod[] = {"+s", cp, NULL};
// well ... the second command executes a lot more consistently when the (optional) fp is provided and the we fgets the buffer.
// textmate does a wait() to wait for a child to exit. Using the fp (which is popened()?) and reading until EOF
// accomplishes the same thing.
myStatus = AuthorizationExecuteWithPrivileges(myAuthorizationRef, "/usr/sbin/chown", kAuthorizationFlagDefaults, (char**)args_chown, &fp);
while (fgets(buffer, sizeof(buffer), fp));
fclose(fp);
// fprintf(stderr, "myStatus = %d\ndata: %s\n", myStatus, buffer);
myStatus = AuthorizationExecuteWithPrivileges(myAuthorizationRef, "/bin/chmod", kAuthorizationFlagDefaults, (char**)args_chmod, &fp);
while (fgets(buffer, sizeof(buffer), fp));
fclose(fp);
// fprintf(stderr, "myStatus = %d\ndata: %s\n", myStatus, buffer);
}
AuthorizationFree(myAuthorizationRef, kAuthorizationFlagDestroyRights);
int needs_fixin = [self checkHelperPermissions: path];
[_fixButton setEnabled: needs_fixin > 0];
}
@end

View File

@ -0,0 +1,222 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Keyboard Cheat Sheet</title>
<style type="text/css">
:root {
color-scheme: light dark;
font-family: -apple-system, 'HelveticaNeue' ;
font: -apple-system-body;
}
body {
user-select: none;
background-color: rgb(236, 236, 236);
color: rgb(38, 38, 38);
}
h1, h2 {
text-align: center;
font-size: 150%;
}
table {
width: 100%;
}
kbd {
display: inline-block;
border-radius: 3px;
padding-left: .5em;
padding-right: .5em;
padding-top: 4px;
padding-bottom: 2px;
margin-bottom: 5px;
margin-right: 5px;
margin-left: 4px;
border: solid 1px black;
box-shadow: 1px 1px 2px 0px rgba(0,0,0,0.75), inset 1px 1px 2px 0px white;
text-shadow: 0px 1px 0px rgb(255, 255, 255);
background-color: rgb(225, 225, 225);
}
@media (prefers-color-scheme: dark) {
body {
background-color: rgb(50, 50, 50);
color: rgb(225, 225, 225);
}
kbd {
border: solid 1px black;
text-shadow: 0px 1px 0px black;
box-shadow: 1px 1px 2px 0px rgba(0,0,0,0.75);
background-color: rgb(101, 101, 101);
}
}
</style>
<script type="text/javascript">
function macbook(onoff) {
var nodes = document.querySelectorAll("[data-macbook]");
nodes.forEach( (e) => {
var m = (e.dataset.macbook == "true");
e.hidden = m ^ onoff;
});
}
window.addEventListener('load', (event)=> {
macbook(false);
var e = document.getElementById('macbook');
if (e) {
e.checked = false;
e.addEventListener('click', (event) => {
macbook(e.checked);
});
}
})
</script>
</head>
<body>
<div>
MacBook: <input type="checkbox" id="macbook" />
</div>
<h1>Full UI Mode</h1>
<table>
<colgroup>
<col style="width: 14em;" />
<col />
</colgroup>
<tbody>
<tr>
<td>
<span data-macbook=false><kbd>Delete</kbd></span>
<span data-macbook=true><kbd>Fn</kbd>+<kbd>Delete</kbd></span>
</td>
<td>Toggle partial UI mode</td>
</tr>
<tr>
<td><kbd>Option</kbd>+<kbd>Enter</kbd></td>
<td>Toggle full screen mode</td>
</tr>
<tr>
<td><kbd>F12</kbd></td>
<td>Reset Key</td>
</tr>
</tbody>
</table>
<h1>Partial UI Mode</h1>
<table>
<colgroup>
<col style="width: 14em;" />
<col />
</colgroup>
<tbody>
<tr>
<td>
<span data-macbook=false><kbd>Delete</kbd></span>
<span data-macbook=true><kbd>Fn</kbd>+<kbd>Delete</kbd></span>
</td>
<td>Toggle full UI mode</td>
</tr>
<tr>
<td><kbd>Option</kbd>+<kbd>Enter</kbd></td>
<td>Toggle full screen mode</td>
</tr>
<tr>
<td><kbd>Tab</kbd></td>
<td>Config menu</td>
</tr>
<tr>
<td><kbd>Esc</kbd></td>
<td>Quit</td>
</tr>
<tr>
<td><kbd>P</kbd></td>
<td>Pause</td>
</tr>
<tr>
<td><kbd>~</kbd></td>
<td>Debugger break (when active)</td>
</tr>
<tr>
<td>
<span data-macbook=false><kbd>Page Down</kbd></span>
<span data-macbook=true><kbd>Fn</kbd>+<kbd>Down Arrow</kbd></span>
</td>
<td>Fast forward (while pressed)</td>
</tr>
<tr>
<td><kbd>F3</kbd></td>
<td>Soft reset</td>
</tr>
<tr>
<td><kbd>Shift</kbd>+<kbd>F3</kbd></td>
<td>Hard reset</td>
</tr>
<tr>
<td><kbd>F5</kbd></td>
<td>Toggle debugger</td>
</tr>
<tr>
<td><kbd>Shift</kbd>+<kbd>F5</kbd></td>
<td>Toggle graphic filters</td>
</tr>
<tr>
<td><kbd>F7</kbd></td>
<td>Load state</td>
</tr>
<tr>
<td><kbd>Shift</kbd>+<kbd>F7</kbd></td>
<td>Save state</td>
</tr>
<tr>
<td><kbd>F10</kbd></td>
<td>Toggle throttle</td>
</tr>
<tr>
<td><kbd>F11</kbd></td>
<td>Show FPS</td>
</tr>
<tr>
<td><kbd>Shift</kbd>+<kbd>F11</kbd></td>
<td>Show profiler</td>
</tr>
<tr>
<td><kbd>F12</kbd></td>
<td>Save snapshot</td>
</tr>
<tr>
<td><kbd>Shift</kbd>+<kbd>F12</kbd></td>
<td>Record MNG video</td>
</tr>
<tr>
<td><kbd>Control</kbd>+<kbd>Shift</kbd>+<kbd>F12</kbd></td>
<td>Record AVI video</td>
</tr>
<tr>
<td><kbd>Option</kbd>+<kbd>Shift</kbd>+<kbd>F12</kbd></td>
<td>Record rendered AVI video</td>
</tr>
</tbody>
</table>
<h2>Note</h2>
<ul class="note">
<li><kbd>F</kbd> keys may require <kbd>Fn</kbd> key depending on keyboard and system settings.</li>
<li><kbd>Shift</kbd>, <kbd>Control</kbd>, and <kbd>Option</kbd> assume left-key unless otherwise specified.</li>
</ul>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -6,21 +6,8 @@
<string>agat7</string>
<key>description</key>
<string>Agat-7</string>
<key>ram</key>
<array>
<dict>
<key>value</key>
<integer>32768</integer>
<key>description</key>
<string>32K</string>
<key>default</key>
<true/>
</dict>
</array>
<key>media</key>
<dict>
<key>flop_5_25</key>
<integer>2</integer>
<key>cass</key>
<integer>1</integer>
</dict>
@ -29,325 +16,562 @@
<integer>512</integer>
<integer>512</integer>
</array>
<key>sl2</key>
<key>slots</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>name</key>
<string>ramsize</string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
<string>RAM</string>
<key>options</key>
<array>
<dict>
<key>intValue</key>
<integer>32768</integer>
<key>description</key>
<string>32K</string>
<key>value</key>
<string>32K</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>a9fdchle</string>
<key>name</key>
<string>sl2</string>
<key>description</key>
<string>Agat 840K floppy card</string>
<key>default</key>
<false/>
<string>Slot 2</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a9fdchle</string>
<key>description</key>
<string>Agat 840K floppy card</string>
<key>devname</key>
<string>agat840k_hle</string>
</dict>
<dict>
<key>value</key>
<string>a9fdc</string>
<key>description</key>
<string>Agat 840K floppy controller card</string>
<key>devname</key>
<string>agat_fdc</string>
</dict>
<dict>
<key>value</key>
<string>a7fdc</string>
<key>description</key>
<string>Agat-7 140K floppy card</string>
<key>devname</key>
<string>agat7_flop</string>
<key>media</key>
<dict>
<key>floppy_5_25</key>
<integer>2</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>a7lang</string>
<key>description</key>
<string>Agat-7 32K Language Card</string>
<key>default</key>
<true/>
<key>devname</key>
<string>a7lang</string>
</dict>
<dict>
<key>value</key>
<string>a7ram</string>
<key>description</key>
<string>Agat-7 32K RAM Card</string>
<key>devname</key>
<string>a7ram</string>
</dict>
<dict>
<key>value</key>
<string>a7ports</string>
<key>description</key>
<string>Agat-7 Ports Card</string>
<key>devname</key>
<string>a7ports</string>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>a9fdc</string>
<key>name</key>
<string>sl3</string>
<key>description</key>
<string>Agat 840K floppy controller card</string>
<key>default</key>
<false/>
<string>Slot 3</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a9fdchle</string>
<key>description</key>
<string>Agat 840K floppy card</string>
<key>devname</key>
<string>agat840k_hle</string>
</dict>
<dict>
<key>value</key>
<string>a9fdc</string>
<key>description</key>
<string>Agat 840K floppy controller card</string>
<key>devname</key>
<string>agat_fdc</string>
</dict>
<dict>
<key>value</key>
<string>a7fdc</string>
<key>description</key>
<string>Agat-7 140K floppy card</string>
<key>default</key>
<true/>
<key>devname</key>
<string>agat7_flop</string>
<key>media</key>
<dict>
<key>floppy_5_25</key>
<integer>2</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>a7lang</string>
<key>description</key>
<string>Agat-7 32K Language Card</string>
<key>devname</key>
<string>a7lang</string>
</dict>
<dict>
<key>value</key>
<string>a7ram</string>
<key>description</key>
<string>Agat-7 32K RAM Card</string>
<key>devname</key>
<string>a7ram</string>
</dict>
<dict>
<key>value</key>
<string>a7ports</string>
<key>description</key>
<string>Agat-7 Ports Card</string>
<key>devname</key>
<string>a7ports</string>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>a7fdc</string>
<key>name</key>
<string>sl4</string>
<key>description</key>
<string>Agat-7 140K floppy card</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>flop_5_25</key>
<integer>2</integer>
</dict>
<string>Slot 4</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a9fdchle</string>
<key>description</key>
<string>Agat 840K floppy card</string>
<key>devname</key>
<string>agat840k_hle</string>
</dict>
<dict>
<key>value</key>
<string>a9fdc</string>
<key>description</key>
<string>Agat 840K floppy controller card</string>
<key>devname</key>
<string>agat_fdc</string>
</dict>
<dict>
<key>value</key>
<string>a7fdc</string>
<key>description</key>
<string>Agat-7 140K floppy card</string>
<key>devname</key>
<string>agat7_flop</string>
<key>media</key>
<dict>
<key>floppy_5_25</key>
<integer>2</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>a7lang</string>
<key>description</key>
<string>Agat-7 32K Language Card</string>
<key>devname</key>
<string>a7lang</string>
</dict>
<dict>
<key>value</key>
<string>a7ram</string>
<key>description</key>
<string>Agat-7 32K RAM Card</string>
<key>devname</key>
<string>a7ram</string>
</dict>
<dict>
<key>value</key>
<string>a7ports</string>
<key>description</key>
<string>Agat-7 Ports Card</string>
<key>default</key>
<true/>
<key>devname</key>
<string>a7ports</string>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>a7lang</string>
<key>name</key>
<string>sl5</string>
<key>description</key>
<string>Agat-7 32K Language Card</string>
<key>default</key>
<true/>
<string>Slot 5</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>a9fdchle</string>
<key>description</key>
<string>Agat 840K floppy card</string>
<key>devname</key>
<string>agat840k_hle</string>
</dict>
<dict>
<key>value</key>
<string>a9fdc</string>
<key>description</key>
<string>Agat 840K floppy controller card</string>
<key>devname</key>
<string>agat_fdc</string>
</dict>
<dict>
<key>value</key>
<string>a7fdc</string>
<key>description</key>
<string>Agat-7 140K floppy card</string>
<key>devname</key>
<string>agat7_flop</string>
<key>media</key>
<dict>
<key>floppy_5_25</key>
<integer>2</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>a7lang</string>
<key>description</key>
<string>Agat-7 32K Language Card</string>
<key>devname</key>
<string>a7lang</string>
</dict>
<dict>
<key>value</key>
<string>a7ram</string>
<key>description</key>
<string>Agat-7 32K RAM Card</string>
<key>devname</key>
<string>a7ram</string>
</dict>
<dict>
<key>value</key>
<string>a7ports</string>
<key>description</key>
<string>Agat-7 Ports Card</string>
<key>devname</key>
<string>a7ports</string>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>a7ram</string>
<key>name</key>
<string>sl6</string>
<key>description</key>
<string>Agat-7 32K RAM Card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a7ports</string>
<key>description</key>
<string>Agat-7 Ports Card</string>
<key>default</key>
<false/>
<string>Slot 6</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a9fdchle</string>
<key>description</key>
<string>Agat 840K floppy card</string>
<key>devname</key>
<string>agat840k_hle</string>
</dict>
<dict>
<key>value</key>
<string>a9fdc</string>
<key>description</key>
<string>Agat 840K floppy controller card</string>
<key>devname</key>
<string>agat_fdc</string>
</dict>
<dict>
<key>value</key>
<string>a7fdc</string>
<key>description</key>
<string>Agat-7 140K floppy card</string>
<key>devname</key>
<string>agat7_flop</string>
<key>media</key>
<dict>
<key>floppy_5_25</key>
<integer>2</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>a7lang</string>
<key>description</key>
<string>Agat-7 32K Language Card</string>
<key>devname</key>
<string>a7lang</string>
</dict>
<dict>
<key>value</key>
<string>a7ram</string>
<key>description</key>
<string>Agat-7 32K RAM Card</string>
<key>default</key>
<true/>
<key>devname</key>
<string>a7ram</string>
</dict>
<dict>
<key>value</key>
<string>a7ports</string>
<key>description</key>
<string>Agat-7 Ports Card</string>
<key>devname</key>
<string>a7ports</string>
</dict>
</array>
</dict>
</array>
<key>sl3</key>
<key>devices</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a9fdchle</string>
<key>description</key>
<string>Agat 840K floppy card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a9fdc</string>
<key>description</key>
<string>Agat 840K floppy controller card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a7fdc</string>
<key>description</key>
<string>Agat-7 140K floppy card</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>flop_5_25</key>
<integer>2</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>a7lang</string>
<key>description</key>
<string>Agat-7 32K Language Card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a7ram</string>
<key>description</key>
<string>Agat-7 32K RAM Card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<key>name</key>
<string>a7ports</string>
<key>description</key>
<string>Agat-7 Ports Card</string>
<key>default</key>
<false/>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:centronics</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>printer</string>
<key>description</key>
<string>Centronics Printer</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>pl80</string>
<key>description</key>
<string>COMX PL-80</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>covox_stereo</string>
<key>description</key>
<string>Covox (Stereo-in-1)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>covox</string>
<key>description</key>
<string>Covox Speech Thing</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>ap2000</string>
<key>description</key>
<string>Epson ActionPrinter 2000</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>ex800</string>
<key>description</key>
<string>Epson EX-800</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>lx800</string>
<key>description</key>
<string>Epson LX-800</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>lx810l</string>
<key>description</key>
<string>Espon LX-810L</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>p72</string>
<key>description</key>
<string>NEC PinWriter P72</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>samdac</string>
<key>description</key>
<string>SAMDAC</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>chessmec</string>
<key>description</key>
<string>Tasc ChessMachine EC Interface</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>smartboard</string>
<key>description</key>
<string>Tasc SmartBoard SB30 Interface</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>agat_fdc</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:0</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>525dsqd</string>
<key>description</key>
<string>5.25" quad density floppy drive</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>:1</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>525dsqd</string>
<key>description</key>
<string>5.25" quad density floppy drive</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
</array>
</dict>
</array>
<key>sl4</key>
<key>software</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a9fdchle</string>
<key>description</key>
<string>Agat 840K floppy card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a9fdc</string>
<key>description</key>
<string>Agat 840K floppy controller card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a7fdc</string>
<key>description</key>
<string>Agat-7 140K floppy card</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>flop_5_25</key>
<integer>2</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>a7lang</string>
<key>description</key>
<string>Agat-7 32K Language Card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a7ram</string>
<key>description</key>
<string>Agat-7 32K RAM Card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a7ports</string>
<key>description</key>
<string>Agat-7 Ports Card</string>
<key>default</key>
<true/>
</dict>
</array>
<key>sl5</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>a9fdchle</string>
<key>description</key>
<string>Agat 840K floppy card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a9fdc</string>
<key>description</key>
<string>Agat 840K floppy controller card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a7fdc</string>
<key>description</key>
<string>Agat-7 140K floppy card</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>flop_5_25</key>
<integer>2</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>a7lang</string>
<key>description</key>
<string>Agat-7 32K Language Card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a7ram</string>
<key>description</key>
<string>Agat-7 32K RAM Card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a7ports</string>
<key>description</key>
<string>Agat-7 Ports Card</string>
<key>default</key>
<false/>
</dict>
</array>
<key>sl6</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a9fdchle</string>
<key>description</key>
<string>Agat 840K floppy card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a9fdc</string>
<key>description</key>
<string>Agat 840K floppy controller card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a7fdc</string>
<key>description</key>
<string>Agat-7 140K floppy card</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>flop_5_25</key>
<integer>2</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>a7lang</string>
<key>description</key>
<string>Agat-7 32K Language Card</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>a7ram</string>
<key>description</key>
<string>Agat-7 32K RAM Card</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>a7ports</string>
<key>description</key>
<string>Agat-7 Ports Card</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
</plist>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -6,151 +6,281 @@
<string>apple1</string>
<key>description</key>
<string>Apple I</string>
<key>ram</key>
<array>
<dict>
<key>value</key>
<integer>4096</integer>
<key>description</key>
<string>4K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>8192</integer>
<key>description</key>
<string>8K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>12288</integer>
<key>description</key>
<string>12K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>16384</integer>
<key>description</key>
<string>16K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>20480</integer>
<key>description</key>
<string>20K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>24576</integer>
<key>description</key>
<string>24K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>28672</integer>
<key>description</key>
<string>28K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>32768</integer>
<key>description</key>
<string>32K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>36864</integer>
<key>description</key>
<string>36K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>40960</integer>
<key>description</key>
<string>40K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>45056</integer>
<key>description</key>
<string>44K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>49152</integer>
<key>description</key>
<string>48K</string>
<key>default</key>
<true/>
</dict>
</array>
<key>media</key>
<dict>
<key>cass</key>
<integer>1</integer>
</dict>
<key>resolution</key>
<array>
<integer>560</integer>
<integer>384</integer>
</array>
<key>exp</key>
<key>slots</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>name</key>
<string>ramsize</string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
<string>RAM</string>
<key>options</key>
<array>
<dict>
<key>intValue</key>
<integer>4096</integer>
<key>description</key>
<string>4K</string>
<key>value</key>
<string>4K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>8192</integer>
<key>description</key>
<string>8K</string>
<key>value</key>
<string>8K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>12288</integer>
<key>description</key>
<string>12K</string>
<key>value</key>
<string>12K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>16384</integer>
<key>description</key>
<string>16K</string>
<key>value</key>
<string>16K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>20480</integer>
<key>description</key>
<string>20K</string>
<key>value</key>
<string>20K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>24576</integer>
<key>description</key>
<string>24K</string>
<key>value</key>
<string>24K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>28672</integer>
<key>description</key>
<string>28K</string>
<key>value</key>
<string>28K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>32768</integer>
<key>description</key>
<string>32K</string>
<key>value</key>
<string>32K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>36864</integer>
<key>description</key>
<string>36K</string>
<key>value</key>
<string>36K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>40960</integer>
<key>description</key>
<string>40K</string>
<key>value</key>
<string>40K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>45056</integer>
<key>description</key>
<string>44K</string>
<key>value</key>
<string>44K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>49152</integer>
<key>description</key>
<string>48K</string>
<key>value</key>
<string>48K</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>cassette</string>
<key>name</key>
<string>exp</string>
<key>description</key>
<string>Apple I cassette board</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>cass</key>
<integer>1</integer>
</dict>
<string>Expansion</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>cassette</string>
<key>description</key>
<string>Apple I cassette board</string>
<key>default</key>
<true/>
<key>devname</key>
<string>a1cass</string>
<key>media</key>
<dict>
<key>cass</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>cffa</string>
<key>description</key>
<string>CFFA Compact Flash for Apple I</string>
<key>devname</key>
<string>cffa1</string>
</dict>
</array>
</dict>
</array>
<key>devices</key>
<array>
<dict>
<key>value</key>
<string>cffa</string>
<key>description</key>
<string>CFFA Compact Flash for Apple I</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>hard</key>
<integer>1</integer>
</dict>
<key>name</key>
<string>cffa1</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:cffa_ata:0</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>cdrom</string>
<key>description</key>
<string>CD-ROM</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>cdrom</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>hdd</string>
<key>description</key>
<string>Hard Disk</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>hard</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>:cffa_ata:1</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>cdrom</string>
<key>description</key>
<string>CD-ROM</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>cdrom</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>hdd</string>
<key>description</key>
<string>Hard Disk</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>hard</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
</array>
</dict>
</array>
<key>software</key>
<array>
<string>apple1.xml</string>
</array>
</dict>
</plist>

File diff suppressed because it is too large Load Diff

View File

@ -6,17 +6,6 @@
<string>apple2c</string>
<key>description</key>
<string>Apple //c</string>
<key>ram</key>
<array>
<dict>
<key>value</key>
<integer>131072</integer>
<key>description</key>
<string>128K</string>
<key>default</key>
<true/>
</dict>
</array>
<key>media</key>
<dict>
</dict>
@ -25,222 +14,463 @@
<integer>560</integer>
<integer>384</integer>
</array>
<key>gameio</key>
<key>slots</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>name</key>
<string>ramsize</string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
<string>RAM</string>
<key>options</key>
<array>
<dict>
<key>intValue</key>
<integer>131072</integer>
<key>description</key>
<string>128K</string>
<key>value</key>
<string>128K</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>joy</string>
<key>name</key>
<string>smartport</string>
<key>description</key>
<string>Apple II analog joysticks</string>
<key>default</key>
<false/>
<string>Disk Drives</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string></string>
<key>devname</key>
<string>smartport</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>paddles</string>
<key>name</key>
<string>gameio</string>
<key>description</key>
<string>Apple II paddles</string>
<key>default</key>
<false/>
<string>Game I/O</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>joy</string>
<key>description</key>
<string>Apple II analog joysticks</string>
<key>devname</key>
<string>a2joy</string>
</dict>
<dict>
<key>value</key>
<string>paddles</string>
<key>description</key>
<string>Apple II paddles</string>
<key>devname</key>
<string>a2pdls</string>
</dict>
<dict>
<key>value</key>
<string>compeyes</string>
<key>description</key>
<string>Digital Vision ComputerEyes</string>
<key>devname</key>
<string>a2ceyes</string>
</dict>
<dict>
<key>value</key>
<string>gizmo</string>
<key>description</key>
<string>HAL Labs Gizmo</string>
<key>devname</key>
<string>a2gizmo</string>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>compeyes</string>
<key>description</key>
<string>Digital Vision ComputerEyes</string>
<key>default</key>
<false/>
</dict>
</array>
<key>printer</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>ie15</string>
<key>description</key>
<string>IE15 Terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>pty</string>
<key>description</key>
<string>Pseudo terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>loopback</string>
<key>description</key>
<string>RS232 Loopback</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>dec_loopback</string>
<key>description</key>
<string>RS232 Loopback (DEC 12-15336-00)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>keyboard</string>
<key>description</key>
<string>Serial Keyboard</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<key>name</key>
<string>printer</string>
<key>description</key>
<string>Serial Printer</string>
<key>default</key>
<false/>
<string>Printer</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>ie15</string>
<key>description</key>
<string>IE15 Terminal</string>
<key>devname</key>
<string>ie15_terminal</string>
</dict>
<dict>
<key>value</key>
<string>pty</string>
<key>description</key>
<string>Pseudo terminal</string>
<key>devname</key>
<string>pseudo_terminal</string>
</dict>
<dict>
<key>value</key>
<string>rs_printer</string>
<key>description</key>
<string>Radio Shack Serial Printer</string>
<key>devname</key>
<string>rs_serial_printer</string>
</dict>
<dict>
<key>value</key>
<string>loopback</string>
<key>description</key>
<string>RS232 Loopback</string>
<key>devname</key>
<string>rs232_loopback</string>
</dict>
<dict>
<key>value</key>
<string>dec_loopback</string>
<key>description</key>
<string>RS232 Loopback (DEC 12-15336-00)</string>
<key>devname</key>
<string>dec_rs232_loopback</string>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>devname</key>
<string>null_modem</string>
</dict>
<dict>
<key>value</key>
<string>rs232_sync_io</string>
<key>description</key>
<string>RS232 Synchronous I/O</string>
<key>devname</key>
<string>rs232_sync_io</string>
</dict>
<dict>
<key>value</key>
<string>keyboard</string>
<key>description</key>
<string>Serial Keyboard</string>
<key>devname</key>
<string>serial_keyboard</string>
</dict>
<dict>
<key>value</key>
<string>printer</string>
<key>description</key>
<string>Serial Printer</string>
<key>devname</key>
<string>serial_printer</string>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>devname</key>
<string>serial_terminal</string>
</dict>
<dict>
<key>value</key>
<string>sunkbd</string>
<key>description</key>
<string>Sun Keyboard Adaptor</string>
<key>devname</key>
<string>sunkbd_adaptor</string>
</dict>
<dict>
<key>value</key>
<string>swtpc8212</string>
<key>description</key>
<string>SWTPC8212 Terminal</string>
<key>devname</key>
<string>swtpc8212_terminal</string>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>name</key>
<string>modem</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>sunkbd</string>
<key>description</key>
<string>Sun Keyboard Adaptor</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>swtpc8212</string>
<key>description</key>
<string>SWTPC8212 Terminal</string>
<key>default</key>
<false/>
<string>Modem</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>ie15</string>
<key>description</key>
<string>IE15 Terminal</string>
<key>devname</key>
<string>ie15_terminal</string>
</dict>
<dict>
<key>value</key>
<string>pty</string>
<key>description</key>
<string>Pseudo terminal</string>
<key>devname</key>
<string>pseudo_terminal</string>
</dict>
<dict>
<key>value</key>
<string>rs_printer</string>
<key>description</key>
<string>Radio Shack Serial Printer</string>
<key>devname</key>
<string>rs_serial_printer</string>
</dict>
<dict>
<key>value</key>
<string>loopback</string>
<key>description</key>
<string>RS232 Loopback</string>
<key>devname</key>
<string>rs232_loopback</string>
</dict>
<dict>
<key>value</key>
<string>dec_loopback</string>
<key>description</key>
<string>RS232 Loopback (DEC 12-15336-00)</string>
<key>devname</key>
<string>dec_rs232_loopback</string>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>devname</key>
<string>null_modem</string>
</dict>
<dict>
<key>value</key>
<string>rs232_sync_io</string>
<key>description</key>
<string>RS232 Synchronous I/O</string>
<key>devname</key>
<string>rs232_sync_io</string>
</dict>
<dict>
<key>value</key>
<string>keyboard</string>
<key>description</key>
<string>Serial Keyboard</string>
<key>devname</key>
<string>serial_keyboard</string>
</dict>
<dict>
<key>value</key>
<string>printer</string>
<key>description</key>
<string>Serial Printer</string>
<key>devname</key>
<string>serial_printer</string>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>devname</key>
<string>serial_terminal</string>
</dict>
<dict>
<key>value</key>
<string>sunkbd</string>
<key>description</key>
<string>Sun Keyboard Adaptor</string>
<key>devname</key>
<string>sunkbd_adaptor</string>
</dict>
<dict>
<key>value</key>
<string>swtpc8212</string>
<key>description</key>
<string>SWTPC8212 Terminal</string>
<key>devname</key>
<string>swtpc8212_terminal</string>
</dict>
</array>
</dict>
</array>
<key>modem</key>
<key>devices</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
<key>name</key>
<string>smartport</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>sl6:0</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>525</string>
<key>description</key>
<string>5.25"</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>floppy_5_25</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>sl6:1</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>525</string>
<key>description</key>
<string>5.25"</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>floppy_5_25</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>ie15</string>
<key>description</key>
<string>IE15 Terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>pty</string>
<key>description</key>
<string>Pseudo terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>loopback</string>
<key>description</key>
<string>RS232 Loopback</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>dec_loopback</string>
<key>description</key>
<string>RS232 Loopback (DEC 12-15336-00)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>keyboard</string>
<key>description</key>
<string>Serial Keyboard</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>printer</string>
<key>description</key>
<string>Serial Printer</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>sunkbd</string>
<key>description</key>
<string>Sun Keyboard Adaptor</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>swtpc8212</string>
<key>description</key>
<string>SWTPC8212 Terminal</string>
<key>default</key>
<false/>
<key>name</key>
<string>sunkbd_adaptor</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:keyboard</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>type3hle</string>
<key>description</key>
<string>Sun Type 3 Keyboard (HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type4hle</string>
<key>description</key>
<string>Sun Type 4 Keyboard (HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type5gbhle</string>
<key>description</key>
<string>Sun Type 5 Keyboard (Great Britain - HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type5jphle</string>
<key>description</key>
<string>Sun Type 5 Keyboard (Japan - HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type5sehle</string>
<key>description</key>
<string>Sun Type 5 Keyboard (Sweden - HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type5hle</string>
<key>description</key>
<string>Sun Type 5 Keyboard (U.S.A. - HLE)</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
</array>
</dict>
</array>
<key>software</key>
<array>
<string>apple2_flop_clcracked.xml</string>
<string>apple2_flop_orig.xml</string>
<string>apple2_flop_misc.xml</string>
</array>
</dict>
</plist>

View File

@ -6,54 +6,11 @@
<string>apple2cp</string>
<key>description</key>
<string>Apple //c Plus</string>
<key>ram</key>
<array>
<dict>
<key>value</key>
<integer>131072</integer>
<key>description</key>
<string>128K</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<integer>393216</integer>
<key>description</key>
<string>384K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>655360</integer>
<key>description</key>
<string>640K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>917504</integer>
<key>description</key>
<string>896K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>1179648</integer>
<key>description</key>
<string>1152K</string>
<key>default</key>
<false/>
</dict>
</array>
<key>media</key>
<dict>
<key>flop_5_25</key>
<key>floppy_5_25</key>
<integer>2</integer>
<key>flop_3_5</key>
<key>floppy_3_5</key>
<integer>2</integer>
</dict>
<key>resolution</key>
@ -61,222 +18,421 @@
<integer>560</integer>
<integer>384</integer>
</array>
<key>gameio</key>
<key>slots</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>name</key>
<string>ramsize</string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
<string>RAM</string>
<key>options</key>
<array>
<dict>
<key>intValue</key>
<integer>131072</integer>
<key>description</key>
<string>128K</string>
<key>value</key>
<string>128K</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>intValue</key>
<integer>393216</integer>
<key>description</key>
<string>384K</string>
<key>value</key>
<string>384K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>655360</integer>
<key>description</key>
<string>640K</string>
<key>value</key>
<string>640K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>917504</integer>
<key>description</key>
<string>896K</string>
<key>value</key>
<string>896K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>1179648</integer>
<key>description</key>
<string>1152K</string>
<key>value</key>
<string>1152K</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>joy</string>
<key>name</key>
<string>gameio</string>
<key>description</key>
<string>Apple II analog joysticks</string>
<key>default</key>
<false/>
<string>Game I/O</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>joy</string>
<key>description</key>
<string>Apple II analog joysticks</string>
<key>devname</key>
<string>a2joy</string>
</dict>
<dict>
<key>value</key>
<string>paddles</string>
<key>description</key>
<string>Apple II paddles</string>
<key>devname</key>
<string>a2pdls</string>
</dict>
<dict>
<key>value</key>
<string>compeyes</string>
<key>description</key>
<string>Digital Vision ComputerEyes</string>
<key>devname</key>
<string>a2ceyes</string>
</dict>
<dict>
<key>value</key>
<string>gizmo</string>
<key>description</key>
<string>HAL Labs Gizmo</string>
<key>devname</key>
<string>a2gizmo</string>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>paddles</string>
<key>description</key>
<string>Apple II paddles</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>compeyes</string>
<key>description</key>
<string>Digital Vision ComputerEyes</string>
<key>default</key>
<false/>
</dict>
</array>
<key>printer</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>ie15</string>
<key>description</key>
<string>IE15 Terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>pty</string>
<key>description</key>
<string>Pseudo terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>loopback</string>
<key>description</key>
<string>RS232 Loopback</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>dec_loopback</string>
<key>description</key>
<string>RS232 Loopback (DEC 12-15336-00)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>keyboard</string>
<key>description</key>
<string>Serial Keyboard</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<key>name</key>
<string>printer</string>
<key>description</key>
<string>Serial Printer</string>
<key>default</key>
<false/>
<string>Printer</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>ie15</string>
<key>description</key>
<string>IE15 Terminal</string>
<key>devname</key>
<string>ie15_terminal</string>
</dict>
<dict>
<key>value</key>
<string>pty</string>
<key>description</key>
<string>Pseudo terminal</string>
<key>devname</key>
<string>pseudo_terminal</string>
</dict>
<dict>
<key>value</key>
<string>rs_printer</string>
<key>description</key>
<string>Radio Shack Serial Printer</string>
<key>devname</key>
<string>rs_serial_printer</string>
</dict>
<dict>
<key>value</key>
<string>loopback</string>
<key>description</key>
<string>RS232 Loopback</string>
<key>devname</key>
<string>rs232_loopback</string>
</dict>
<dict>
<key>value</key>
<string>dec_loopback</string>
<key>description</key>
<string>RS232 Loopback (DEC 12-15336-00)</string>
<key>devname</key>
<string>dec_rs232_loopback</string>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>devname</key>
<string>null_modem</string>
</dict>
<dict>
<key>value</key>
<string>rs232_sync_io</string>
<key>description</key>
<string>RS232 Synchronous I/O</string>
<key>devname</key>
<string>rs232_sync_io</string>
</dict>
<dict>
<key>value</key>
<string>keyboard</string>
<key>description</key>
<string>Serial Keyboard</string>
<key>devname</key>
<string>serial_keyboard</string>
</dict>
<dict>
<key>value</key>
<string>printer</string>
<key>description</key>
<string>Serial Printer</string>
<key>devname</key>
<string>serial_printer</string>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>devname</key>
<string>serial_terminal</string>
</dict>
<dict>
<key>value</key>
<string>sunkbd</string>
<key>description</key>
<string>Sun Keyboard Adaptor</string>
<key>devname</key>
<string>sunkbd_adaptor</string>
</dict>
<dict>
<key>value</key>
<string>swtpc8212</string>
<key>description</key>
<string>SWTPC8212 Terminal</string>
<key>devname</key>
<string>swtpc8212_terminal</string>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>name</key>
<string>modem</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>sunkbd</string>
<key>description</key>
<string>Sun Keyboard Adaptor</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>swtpc8212</string>
<key>description</key>
<string>SWTPC8212 Terminal</string>
<key>default</key>
<false/>
<string>Modem</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>ie15</string>
<key>description</key>
<string>IE15 Terminal</string>
<key>devname</key>
<string>ie15_terminal</string>
</dict>
<dict>
<key>value</key>
<string>pty</string>
<key>description</key>
<string>Pseudo terminal</string>
<key>devname</key>
<string>pseudo_terminal</string>
</dict>
<dict>
<key>value</key>
<string>rs_printer</string>
<key>description</key>
<string>Radio Shack Serial Printer</string>
<key>devname</key>
<string>rs_serial_printer</string>
</dict>
<dict>
<key>value</key>
<string>loopback</string>
<key>description</key>
<string>RS232 Loopback</string>
<key>devname</key>
<string>rs232_loopback</string>
</dict>
<dict>
<key>value</key>
<string>dec_loopback</string>
<key>description</key>
<string>RS232 Loopback (DEC 12-15336-00)</string>
<key>devname</key>
<string>dec_rs232_loopback</string>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>devname</key>
<string>null_modem</string>
</dict>
<dict>
<key>value</key>
<string>rs232_sync_io</string>
<key>description</key>
<string>RS232 Synchronous I/O</string>
<key>devname</key>
<string>rs232_sync_io</string>
</dict>
<dict>
<key>value</key>
<string>keyboard</string>
<key>description</key>
<string>Serial Keyboard</string>
<key>devname</key>
<string>serial_keyboard</string>
</dict>
<dict>
<key>value</key>
<string>printer</string>
<key>description</key>
<string>Serial Printer</string>
<key>devname</key>
<string>serial_printer</string>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>devname</key>
<string>serial_terminal</string>
</dict>
<dict>
<key>value</key>
<string>sunkbd</string>
<key>description</key>
<string>Sun Keyboard Adaptor</string>
<key>devname</key>
<string>sunkbd_adaptor</string>
</dict>
<dict>
<key>value</key>
<string>swtpc8212</string>
<key>description</key>
<string>SWTPC8212 Terminal</string>
<key>devname</key>
<string>swtpc8212_terminal</string>
</dict>
</array>
</dict>
</array>
<key>modem</key>
<key>devices</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>ie15</string>
<key>description</key>
<string>IE15 Terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>pty</string>
<key>description</key>
<string>Pseudo terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>loopback</string>
<key>description</key>
<string>RS232 Loopback</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>dec_loopback</string>
<key>description</key>
<string>RS232 Loopback (DEC 12-15336-00)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>keyboard</string>
<key>description</key>
<string>Serial Keyboard</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>printer</string>
<key>description</key>
<string>Serial Printer</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>sunkbd</string>
<key>description</key>
<string>Sun Keyboard Adaptor</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>swtpc8212</string>
<key>description</key>
<string>SWTPC8212 Terminal</string>
<key>default</key>
<false/>
<key>name</key>
<string>sunkbd_adaptor</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:keyboard</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>type3hle</string>
<key>description</key>
<string>Sun Type 3 Keyboard (HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type4hle</string>
<key>description</key>
<string>Sun Type 4 Keyboard (HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type5gbhle</string>
<key>description</key>
<string>Sun Type 5 Keyboard (Great Britain - HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type5jphle</string>
<key>description</key>
<string>Sun Type 5 Keyboard (Japan - HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type5sehle</string>
<key>description</key>
<string>Sun Type 5 Keyboard (Sweden - HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type5hle</string>
<key>description</key>
<string>Sun Type 5 Keyboard (U.S.A. - HLE)</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
</array>
</dict>
</array>
<key>software</key>
<array>
<string>apple2_flop_clcracked.xml</string>
<string>apple2_flop_orig.xml</string>
<string>apple2_flop_misc.xml</string>
</array>
</dict>
</plist>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

7385
Ample/Resources/cece.plist Normal file

File diff suppressed because it is too large Load Diff

7385
Ample/Resources/cecg.plist Normal file

File diff suppressed because it is too large Load Diff

7385
Ample/Resources/ceci.plist Normal file

File diff suppressed because it is too large Load Diff

7385
Ample/Resources/cecm.plist Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -6,52 +6,9 @@
<string>las128e2</string>
<key>description</key>
<string>Laser 128ex2 (version 6.1)</string>
<key>ram</key>
<array>
<dict>
<key>value</key>
<integer>131072</integer>
<key>description</key>
<string>128K</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<integer>393216</integer>
<key>description</key>
<string>384K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>655360</integer>
<key>description</key>
<string>640K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>917504</integer>
<key>description</key>
<string>896K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<integer>1179648</integer>
<key>description</key>
<string>1152K</string>
<key>default</key>
<false/>
</dict>
</array>
<key>media</key>
<dict>
<key>flop_5_25</key>
<key>floppy_5_25</key>
<integer>2</integer>
</dict>
<key>resolution</key>
@ -59,222 +16,421 @@
<integer>560</integer>
<integer>384</integer>
</array>
<key>gameio</key>
<key>slots</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>name</key>
<string>ramsize</string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
<string>RAM</string>
<key>options</key>
<array>
<dict>
<key>intValue</key>
<integer>131072</integer>
<key>description</key>
<string>128K</string>
<key>value</key>
<string>128K</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>intValue</key>
<integer>393216</integer>
<key>description</key>
<string>384K</string>
<key>value</key>
<string>384K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>655360</integer>
<key>description</key>
<string>640K</string>
<key>value</key>
<string>640K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>917504</integer>
<key>description</key>
<string>896K</string>
<key>value</key>
<string>896K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>1179648</integer>
<key>description</key>
<string>1152K</string>
<key>value</key>
<string>1152K</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>joy</string>
<key>name</key>
<string>gameio</string>
<key>description</key>
<string>Apple II analog joysticks</string>
<key>default</key>
<false/>
<string>Game I/O</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>joy</string>
<key>description</key>
<string>Apple II analog joysticks</string>
<key>devname</key>
<string>a2joy</string>
</dict>
<dict>
<key>value</key>
<string>paddles</string>
<key>description</key>
<string>Apple II paddles</string>
<key>devname</key>
<string>a2pdls</string>
</dict>
<dict>
<key>value</key>
<string>compeyes</string>
<key>description</key>
<string>Digital Vision ComputerEyes</string>
<key>devname</key>
<string>a2ceyes</string>
</dict>
<dict>
<key>value</key>
<string>gizmo</string>
<key>description</key>
<string>HAL Labs Gizmo</string>
<key>devname</key>
<string>a2gizmo</string>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>paddles</string>
<key>description</key>
<string>Apple II paddles</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>compeyes</string>
<key>description</key>
<string>Digital Vision ComputerEyes</string>
<key>default</key>
<false/>
</dict>
</array>
<key>printer</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>ie15</string>
<key>description</key>
<string>IE15 Terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>pty</string>
<key>description</key>
<string>Pseudo terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>loopback</string>
<key>description</key>
<string>RS232 Loopback</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>dec_loopback</string>
<key>description</key>
<string>RS232 Loopback (DEC 12-15336-00)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>keyboard</string>
<key>description</key>
<string>Serial Keyboard</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<key>name</key>
<string>printer</string>
<key>description</key>
<string>Serial Printer</string>
<key>default</key>
<false/>
<string>Printer</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>ie15</string>
<key>description</key>
<string>IE15 Terminal</string>
<key>devname</key>
<string>ie15_terminal</string>
</dict>
<dict>
<key>value</key>
<string>pty</string>
<key>description</key>
<string>Pseudo terminal</string>
<key>devname</key>
<string>pseudo_terminal</string>
</dict>
<dict>
<key>value</key>
<string>rs_printer</string>
<key>description</key>
<string>Radio Shack Serial Printer</string>
<key>devname</key>
<string>rs_serial_printer</string>
</dict>
<dict>
<key>value</key>
<string>loopback</string>
<key>description</key>
<string>RS232 Loopback</string>
<key>devname</key>
<string>rs232_loopback</string>
</dict>
<dict>
<key>value</key>
<string>dec_loopback</string>
<key>description</key>
<string>RS232 Loopback (DEC 12-15336-00)</string>
<key>devname</key>
<string>dec_rs232_loopback</string>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>devname</key>
<string>null_modem</string>
</dict>
<dict>
<key>value</key>
<string>rs232_sync_io</string>
<key>description</key>
<string>RS232 Synchronous I/O</string>
<key>devname</key>
<string>rs232_sync_io</string>
</dict>
<dict>
<key>value</key>
<string>keyboard</string>
<key>description</key>
<string>Serial Keyboard</string>
<key>devname</key>
<string>serial_keyboard</string>
</dict>
<dict>
<key>value</key>
<string>printer</string>
<key>description</key>
<string>Serial Printer</string>
<key>devname</key>
<string>serial_printer</string>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>devname</key>
<string>serial_terminal</string>
</dict>
<dict>
<key>value</key>
<string>sunkbd</string>
<key>description</key>
<string>Sun Keyboard Adaptor</string>
<key>devname</key>
<string>sunkbd_adaptor</string>
</dict>
<dict>
<key>value</key>
<string>swtpc8212</string>
<key>description</key>
<string>SWTPC8212 Terminal</string>
<key>devname</key>
<string>swtpc8212_terminal</string>
</dict>
</array>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>name</key>
<string>modem</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>sunkbd</string>
<key>description</key>
<string>Sun Keyboard Adaptor</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>swtpc8212</string>
<key>description</key>
<string>SWTPC8212 Terminal</string>
<key>default</key>
<false/>
<string>Modem</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>ie15</string>
<key>description</key>
<string>IE15 Terminal</string>
<key>devname</key>
<string>ie15_terminal</string>
</dict>
<dict>
<key>value</key>
<string>pty</string>
<key>description</key>
<string>Pseudo terminal</string>
<key>devname</key>
<string>pseudo_terminal</string>
</dict>
<dict>
<key>value</key>
<string>rs_printer</string>
<key>description</key>
<string>Radio Shack Serial Printer</string>
<key>devname</key>
<string>rs_serial_printer</string>
</dict>
<dict>
<key>value</key>
<string>loopback</string>
<key>description</key>
<string>RS232 Loopback</string>
<key>devname</key>
<string>rs232_loopback</string>
</dict>
<dict>
<key>value</key>
<string>dec_loopback</string>
<key>description</key>
<string>RS232 Loopback (DEC 12-15336-00)</string>
<key>devname</key>
<string>dec_rs232_loopback</string>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>devname</key>
<string>null_modem</string>
</dict>
<dict>
<key>value</key>
<string>rs232_sync_io</string>
<key>description</key>
<string>RS232 Synchronous I/O</string>
<key>devname</key>
<string>rs232_sync_io</string>
</dict>
<dict>
<key>value</key>
<string>keyboard</string>
<key>description</key>
<string>Serial Keyboard</string>
<key>devname</key>
<string>serial_keyboard</string>
</dict>
<dict>
<key>value</key>
<string>printer</string>
<key>description</key>
<string>Serial Printer</string>
<key>devname</key>
<string>serial_printer</string>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>devname</key>
<string>serial_terminal</string>
</dict>
<dict>
<key>value</key>
<string>sunkbd</string>
<key>description</key>
<string>Sun Keyboard Adaptor</string>
<key>devname</key>
<string>sunkbd_adaptor</string>
</dict>
<dict>
<key>value</key>
<string>swtpc8212</string>
<key>description</key>
<string>SWTPC8212 Terminal</string>
<key>devname</key>
<string>swtpc8212_terminal</string>
</dict>
</array>
</dict>
</array>
<key>modem</key>
<key>devices</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>ie15</string>
<key>description</key>
<string>IE15 Terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>pty</string>
<key>description</key>
<string>Pseudo terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>loopback</string>
<key>description</key>
<string>RS232 Loopback</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>dec_loopback</string>
<key>description</key>
<string>RS232 Loopback (DEC 12-15336-00)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>keyboard</string>
<key>description</key>
<string>Serial Keyboard</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>printer</string>
<key>description</key>
<string>Serial Printer</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>sunkbd</string>
<key>description</key>
<string>Sun Keyboard Adaptor</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>swtpc8212</string>
<key>description</key>
<string>SWTPC8212 Terminal</string>
<key>default</key>
<false/>
<key>name</key>
<string>sunkbd_adaptor</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:keyboard</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>type3hle</string>
<key>description</key>
<string>Sun Type 3 Keyboard (HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type4hle</string>
<key>description</key>
<string>Sun Type 4 Keyboard (HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type5gbhle</string>
<key>description</key>
<string>Sun Type 5 Keyboard (Great Britain - HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type5jphle</string>
<key>description</key>
<string>Sun Type 5 Keyboard (Japan - HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type5sehle</string>
<key>description</key>
<string>Sun Type 5 Keyboard (Sweden - HLE)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>type5hle</string>
<key>description</key>
<string>Sun Type 5 Keyboard (U.S.A. - HLE)</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
</array>
</dict>
</array>
<key>software</key>
<array>
<string>apple2_flop_clcracked.xml</string>
<string>apple2_flop_orig.xml</string>
<string>apple2_flop_misc.xml</string>
</array>
</dict>
</plist>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,370 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>value</key>
<string>mac128k</string>
<key>description</key>
<string>Macintosh 128k</string>
<key>media</key>
<dict>
</dict>
<key>resolution</key>
<array>
<integer>512</integer>
<integer>342</integer>
</array>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>ramsize</string>
<key>description</key>
<string>RAM</string>
<key>options</key>
<array>
<dict>
<key>intValue</key>
<integer>131072</integer>
<key>description</key>
<string>128K</string>
<key>value</key>
<string>128K</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>smartport</string>
<key>description</key>
<string>Disk Drives</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string></string>
<key>devname</key>
<string>smartport</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
</array>
<key>devices</key>
<array>
<dict>
<key>name</key>
<string>smartport</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>fdc:0</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>35dd</string>
<key>description</key>
<string>3.5" DD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35hd</string>
<key>description</key>
<string>3.5" HD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35sd</string>
<key>description</key>
<string>3.5" SD</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>fdc:1</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>35dd</string>
<key>description</key>
<string>3.5" DD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35hd</string>
<key>description</key>
<string>3.5" HD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35sd</string>
<key>description</key>
<string>3.5" SD</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>mackbd_m0120</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:kbd</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>gb</string>
<key>description</key>
<string>Macintosh Keyboard (British - M0110B)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>fr</string>
<key>description</key>
<string>Macintosh Keyboard (French - M0110F)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>it</string>
<key>description</key>
<string>Macintosh Keyboard (Italian - M0110T)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>us</string>
<key>description</key>
<string>Macintosh Keyboard (U.S. - M0110)</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>pad</string>
<key>description</key>
<string>Macintosh Numeric Keypad (English - M0120)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>eupad</string>
<key>description</key>
<string>Macintosh Numeric Keypad (European - M0120P)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>frp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (French - M0110A F)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>jpp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (Japanese - M0110A J)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>usp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (U.S. - M0110A)</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>mackbd_m0120p</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:kbd</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>gb</string>
<key>description</key>
<string>Macintosh Keyboard (British - M0110B)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>fr</string>
<key>description</key>
<string>Macintosh Keyboard (French - M0110F)</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>it</string>
<key>description</key>
<string>Macintosh Keyboard (Italian - M0110T)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>us</string>
<key>description</key>
<string>Macintosh Keyboard (U.S. - M0110)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>pad</string>
<key>description</key>
<string>Macintosh Numeric Keypad (English - M0120)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>eupad</string>
<key>description</key>
<string>Macintosh Numeric Keypad (European - M0120P)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>frp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (French - M0110A F)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>jpp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (Japanese - M0110A J)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>usp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (U.S. - M0110A)</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
</array>
</dict>
</array>
<key>software</key>
<array>
<string>mac_flop.xml</string>
<string>mac_hdd.xml</string>
</array>
</dict>
</plist>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,370 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>value</key>
<string>mac512k</string>
<key>description</key>
<string>Macintosh 512k</string>
<key>media</key>
<dict>
</dict>
<key>resolution</key>
<array>
<integer>512</integer>
<integer>342</integer>
</array>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>ramsize</string>
<key>description</key>
<string>RAM</string>
<key>options</key>
<array>
<dict>
<key>intValue</key>
<integer>524288</integer>
<key>description</key>
<string>512K</string>
<key>value</key>
<string>512K</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>smartport</string>
<key>description</key>
<string>Disk Drives</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string></string>
<key>devname</key>
<string>smartport</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
</array>
<key>devices</key>
<array>
<dict>
<key>name</key>
<string>smartport</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>fdc:0</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>35dd</string>
<key>description</key>
<string>3.5" DD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35hd</string>
<key>description</key>
<string>3.5" HD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35sd</string>
<key>description</key>
<string>3.5" SD</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>fdc:1</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>35dd</string>
<key>description</key>
<string>3.5" DD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35hd</string>
<key>description</key>
<string>3.5" HD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35sd</string>
<key>description</key>
<string>3.5" SD</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>mackbd_m0120</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:kbd</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>gb</string>
<key>description</key>
<string>Macintosh Keyboard (British - M0110B)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>fr</string>
<key>description</key>
<string>Macintosh Keyboard (French - M0110F)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>it</string>
<key>description</key>
<string>Macintosh Keyboard (Italian - M0110T)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>us</string>
<key>description</key>
<string>Macintosh Keyboard (U.S. - M0110)</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>pad</string>
<key>description</key>
<string>Macintosh Numeric Keypad (English - M0120)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>eupad</string>
<key>description</key>
<string>Macintosh Numeric Keypad (European - M0120P)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>frp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (French - M0110A F)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>jpp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (Japanese - M0110A J)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>usp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (U.S. - M0110A)</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>mackbd_m0120p</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:kbd</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>gb</string>
<key>description</key>
<string>Macintosh Keyboard (British - M0110B)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>fr</string>
<key>description</key>
<string>Macintosh Keyboard (French - M0110F)</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>it</string>
<key>description</key>
<string>Macintosh Keyboard (Italian - M0110T)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>us</string>
<key>description</key>
<string>Macintosh Keyboard (U.S. - M0110)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>pad</string>
<key>description</key>
<string>Macintosh Numeric Keypad (English - M0120)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>eupad</string>
<key>description</key>
<string>Macintosh Numeric Keypad (European - M0120P)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>frp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (French - M0110A F)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>jpp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (Japanese - M0110A J)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>usp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (U.S. - M0110A)</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
</array>
</dict>
</array>
<key>software</key>
<array>
<string>mac_flop.xml</string>
<string>mac_hdd.xml</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,370 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>value</key>
<string>mac512ke</string>
<key>description</key>
<string>Macintosh 512ke</string>
<key>media</key>
<dict>
</dict>
<key>resolution</key>
<array>
<integer>512</integer>
<integer>342</integer>
</array>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>ramsize</string>
<key>description</key>
<string>RAM</string>
<key>options</key>
<array>
<dict>
<key>intValue</key>
<integer>524288</integer>
<key>description</key>
<string>512K</string>
<key>value</key>
<string>512K</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>smartport</string>
<key>description</key>
<string>Disk Drives</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string></string>
<key>devname</key>
<string>smartport</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
</array>
<key>devices</key>
<array>
<dict>
<key>name</key>
<string>smartport</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>fdc:0</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>35dd</string>
<key>description</key>
<string>3.5" DD</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35hd</string>
<key>description</key>
<string>3.5" HD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35sd</string>
<key>description</key>
<string>3.5" SD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>fdc:1</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>35dd</string>
<key>description</key>
<string>3.5" DD</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35hd</string>
<key>description</key>
<string>3.5" HD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35sd</string>
<key>description</key>
<string>3.5" SD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>mackbd_m0120</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:kbd</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>gb</string>
<key>description</key>
<string>Macintosh Keyboard (British - M0110B)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>fr</string>
<key>description</key>
<string>Macintosh Keyboard (French - M0110F)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>it</string>
<key>description</key>
<string>Macintosh Keyboard (Italian - M0110T)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>us</string>
<key>description</key>
<string>Macintosh Keyboard (U.S. - M0110)</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>pad</string>
<key>description</key>
<string>Macintosh Numeric Keypad (English - M0120)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>eupad</string>
<key>description</key>
<string>Macintosh Numeric Keypad (European - M0120P)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>frp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (French - M0110A F)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>jpp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (Japanese - M0110A J)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>usp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (U.S. - M0110A)</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>mackbd_m0120p</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:kbd</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>gb</string>
<key>description</key>
<string>Macintosh Keyboard (British - M0110B)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>fr</string>
<key>description</key>
<string>Macintosh Keyboard (French - M0110F)</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>it</string>
<key>description</key>
<string>Macintosh Keyboard (Italian - M0110T)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>us</string>
<key>description</key>
<string>Macintosh Keyboard (U.S. - M0110)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>pad</string>
<key>description</key>
<string>Macintosh Numeric Keypad (English - M0120)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>eupad</string>
<key>description</key>
<string>Macintosh Numeric Keypad (European - M0120P)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>frp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (French - M0110A F)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>jpp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (Japanese - M0110A J)</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>usp</string>
<key>description</key>
<string>Macintosh Plus Keyboard (U.S. - M0110A)</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
</array>
</dict>
</array>
<key>software</key>
<array>
<string>mac_flop.xml</string>
<string>mac_hdd.xml</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,224 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>value</key>
<string>macclas2</string>
<key>description</key>
<string>Macintosh Classic II</string>
<key>media</key>
<dict>
<key>hard</key>
<integer>2</integer>
</dict>
<key>resolution</key>
<array>
<integer>512</integer>
<integer>342</integer>
</array>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>ramsize</string>
<key>description</key>
<string>RAM</string>
<key>options</key>
<array>
<dict>
<key>intValue</key>
<integer>2097152</integer>
<key>description</key>
<string>2M</string>
<key>value</key>
<string>2M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>4194304</integer>
<key>description</key>
<string>4M</string>
<key>value</key>
<string>4M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>6291456</integer>
<key>description</key>
<string>6M</string>
<key>value</key>
<string>6M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>8388608</integer>
<key>description</key>
<string>8M</string>
<key>value</key>
<string>8M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>10485760</integer>
<key>description</key>
<string>10M</string>
<key>value</key>
<string>10M</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>smartport</string>
<key>description</key>
<string>Disk Drives</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string></string>
<key>devname</key>
<string>smartport</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
</array>
<key>devices</key>
<array>
<dict>
<key>name</key>
<string>smartport</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>fdc:0</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>35dd</string>
<key>description</key>
<string>3.5" DD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35hd</string>
<key>description</key>
<string>3.5" HD</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35sd</string>
<key>description</key>
<string>3.5" SD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>fdc:1</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>35dd</string>
<key>description</key>
<string>3.5" DD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35hd</string>
<key>description</key>
<string>3.5" HD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35sd</string>
<key>description</key>
<string>3.5" SD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
</array>
</dict>
</array>
<key>software</key>
<array>
<string>mac_hdd.xml</string>
<string>mac_flop.xml</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,204 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>value</key>
<string>macclasc</string>
<key>description</key>
<string>Macintosh Classic</string>
<key>media</key>
<dict>
<key>hard</key>
<integer>2</integer>
</dict>
<key>resolution</key>
<array>
<integer>512</integer>
<integer>342</integer>
</array>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>ramsize</string>
<key>description</key>
<string>RAM</string>
<key>options</key>
<array>
<dict>
<key>intValue</key>
<integer>2097152</integer>
<key>description</key>
<string>2M</string>
<key>value</key>
<string>2M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>2621440</integer>
<key>description</key>
<string>2560K</string>
<key>value</key>
<string>2560K</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>4194304</integer>
<key>description</key>
<string>4M</string>
<key>value</key>
<string>4M</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>smartport</string>
<key>description</key>
<string>Disk Drives</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string></string>
<key>devname</key>
<string>smartport</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
</array>
<key>devices</key>
<array>
<dict>
<key>name</key>
<string>smartport</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>fdc:0</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>35dd</string>
<key>description</key>
<string>3.5" DD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35hd</string>
<key>description</key>
<string>3.5" HD</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35sd</string>
<key>description</key>
<string>3.5" SD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>fdc:1</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>35dd</string>
<key>description</key>
<string>3.5" DD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35hd</string>
<key>description</key>
<string>3.5" HD</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35sd</string>
<key>description</key>
<string>3.5" SD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
</array>
</dict>
</array>
<key>software</key>
<array>
<string>mac_flop.xml</string>
<string>mac_hdd.xml</string>
</array>
</dict>
</plist>

1305
Ample/Resources/macii.plist Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,873 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>value</key>
<string>maciici</string>
<key>description</key>
<string>Macintosh IIci</string>
<key>media</key>
<dict>
<key>hard</key>
<integer>2</integer>
</dict>
<key>resolution</key>
<array>
<integer>640</integer>
<integer>480</integer>
</array>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>ramsize</string>
<key>description</key>
<string>RAM</string>
<key>options</key>
<array>
<dict>
<key>intValue</key>
<integer>2097152</integer>
<key>description</key>
<string>2M</string>
<key>value</key>
<string>2M</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>intValue</key>
<integer>4194304</integer>
<key>description</key>
<string>4M</string>
<key>value</key>
<string>4M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>8388608</integer>
<key>description</key>
<string>8M</string>
<key>value</key>
<string>8M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>16777216</integer>
<key>description</key>
<string>16M</string>
<key>value</key>
<string>16M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>33554432</integer>
<key>description</key>
<string>32M</string>
<key>value</key>
<string>32M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>50331648</integer>
<key>description</key>
<string>48M</string>
<key>value</key>
<string>48M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>67108864</integer>
<key>description</key>
<string>64M</string>
<key>value</key>
<string>64M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>134217728</integer>
<key>description</key>
<string>128M</string>
<key>value</key>
<string>128M</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>smartport</string>
<key>description</key>
<string>Disk Drives</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string></string>
<key>devname</key>
<string>smartport</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>nbc</string>
<key>description</key>
<string>Slot C</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>48gc</string>
<key>description</key>
<string>Apple 4*8 video card</string>
<key>devname</key>
<string>nb_48gc</string>
</dict>
<dict>
<key>value</key>
<string>824gc</string>
<key>description</key>
<string>Apple 8*24 video card</string>
<key>devname</key>
<string>nb_824gc</string>
</dict>
<dict>
<key>value</key>
<string>enetnb</string>
<key>description</key>
<string>Apple NuBus Ethernet card</string>
<key>devname</key>
<string>nb_aenet</string>
</dict>
<dict>
<key>value</key>
<string>quadralink</string>
<key>description</key>
<string>Applied Engineering Quadralink serial card</string>
<key>devname</key>
<string>nb_qdlink</string>
</dict>
<dict>
<key>value</key>
<string>asmc3nb</string>
<key>description</key>
<string>Asante MC3NB Ethernet card</string>
<key>devname</key>
<string>nb_amc3b</string>
</dict>
<dict>
<key>value</key>
<string>bootbug</string>
<key>description</key>
<string>Brigent BootBug debugger card</string>
<key>devname</key>
<string>nb_btbug</string>
</dict>
<dict>
<key>value</key>
<string>m2hires</string>
<key>description</key>
<string>Macintosh II Hi-Resolution video card</string>
<key>devname</key>
<string>nb_m2hr</string>
</dict>
<dict>
<key>value</key>
<string>portrait</string>
<key>description</key>
<string>Macintosh II Portrait Video Card</string>
<key>devname</key>
<string>nb_wspt</string>
</dict>
<dict>
<key>value</key>
<string>m2video</string>
<key>description</key>
<string>Macintosh II Video Card</string>
<key>devname</key>
<string>nb_m2vc</string>
</dict>
<dict>
<key>value</key>
<string>vikbw</string>
<key>description</key>
<string>Moniterm Viking video card</string>
<key>devname</key>
<string>nb_vikbw</string>
</dict>
<dict>
<key>value</key>
<string>image</string>
<key>description</key>
<string>NuBus Disk Image Pseudo-Card</string>
<key>devname</key>
<string>nb_image</string>
<key>media</key>
<dict>
<key>pseudo_disk</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>radiustpd</string>
<key>description</key>
<string>Radius Two Page Display video card</string>
<key>devname</key>
<string>nb_rtpd</string>
</dict>
<dict>
<key>value</key>
<string>cb264</string>
<key>description</key>
<string>RasterOps ColorBoard 264 video card</string>
<key>devname</key>
<string>nb_c264</string>
</dict>
<dict>
<key>value</key>
<string>laserview</string>
<key>description</key>
<string>Sigma Designs LaserView video card</string>
<key>devname</key>
<string>nb_laserview</string>
</dict>
<dict>
<key>value</key>
<string>specpdq</string>
<key>description</key>
<string>SuperMac Spectrum PDQ video card</string>
<key>devname</key>
<string>nb_spdq</string>
</dict>
<dict>
<key>value</key>
<string>spec8s3</string>
<key>description</key>
<string>SuperMac Spectrum/8 Series III video card</string>
<key>devname</key>
<string>nb_sp8s3</string>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>nbd</string>
<key>description</key>
<string>Slot D</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>48gc</string>
<key>description</key>
<string>Apple 4*8 video card</string>
<key>devname</key>
<string>nb_48gc</string>
</dict>
<dict>
<key>value</key>
<string>824gc</string>
<key>description</key>
<string>Apple 8*24 video card</string>
<key>devname</key>
<string>nb_824gc</string>
</dict>
<dict>
<key>value</key>
<string>enetnb</string>
<key>description</key>
<string>Apple NuBus Ethernet card</string>
<key>devname</key>
<string>nb_aenet</string>
</dict>
<dict>
<key>value</key>
<string>quadralink</string>
<key>description</key>
<string>Applied Engineering Quadralink serial card</string>
<key>devname</key>
<string>nb_qdlink</string>
</dict>
<dict>
<key>value</key>
<string>asmc3nb</string>
<key>description</key>
<string>Asante MC3NB Ethernet card</string>
<key>devname</key>
<string>nb_amc3b</string>
</dict>
<dict>
<key>value</key>
<string>bootbug</string>
<key>description</key>
<string>Brigent BootBug debugger card</string>
<key>devname</key>
<string>nb_btbug</string>
</dict>
<dict>
<key>value</key>
<string>m2hires</string>
<key>description</key>
<string>Macintosh II Hi-Resolution video card</string>
<key>devname</key>
<string>nb_m2hr</string>
</dict>
<dict>
<key>value</key>
<string>portrait</string>
<key>description</key>
<string>Macintosh II Portrait Video Card</string>
<key>devname</key>
<string>nb_wspt</string>
</dict>
<dict>
<key>value</key>
<string>m2video</string>
<key>description</key>
<string>Macintosh II Video Card</string>
<key>devname</key>
<string>nb_m2vc</string>
</dict>
<dict>
<key>value</key>
<string>vikbw</string>
<key>description</key>
<string>Moniterm Viking video card</string>
<key>devname</key>
<string>nb_vikbw</string>
</dict>
<dict>
<key>value</key>
<string>image</string>
<key>description</key>
<string>NuBus Disk Image Pseudo-Card</string>
<key>devname</key>
<string>nb_image</string>
<key>media</key>
<dict>
<key>pseudo_disk</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>radiustpd</string>
<key>description</key>
<string>Radius Two Page Display video card</string>
<key>devname</key>
<string>nb_rtpd</string>
</dict>
<dict>
<key>value</key>
<string>cb264</string>
<key>description</key>
<string>RasterOps ColorBoard 264 video card</string>
<key>devname</key>
<string>nb_c264</string>
</dict>
<dict>
<key>value</key>
<string>laserview</string>
<key>description</key>
<string>Sigma Designs LaserView video card</string>
<key>devname</key>
<string>nb_laserview</string>
</dict>
<dict>
<key>value</key>
<string>specpdq</string>
<key>description</key>
<string>SuperMac Spectrum PDQ video card</string>
<key>devname</key>
<string>nb_spdq</string>
</dict>
<dict>
<key>value</key>
<string>spec8s3</string>
<key>description</key>
<string>SuperMac Spectrum/8 Series III video card</string>
<key>devname</key>
<string>nb_sp8s3</string>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>nbe</string>
<key>description</key>
<string>Slot E</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>48gc</string>
<key>description</key>
<string>Apple 4*8 video card</string>
<key>devname</key>
<string>nb_48gc</string>
</dict>
<dict>
<key>value</key>
<string>824gc</string>
<key>description</key>
<string>Apple 8*24 video card</string>
<key>devname</key>
<string>nb_824gc</string>
</dict>
<dict>
<key>value</key>
<string>enetnb</string>
<key>description</key>
<string>Apple NuBus Ethernet card</string>
<key>devname</key>
<string>nb_aenet</string>
</dict>
<dict>
<key>value</key>
<string>quadralink</string>
<key>description</key>
<string>Applied Engineering Quadralink serial card</string>
<key>devname</key>
<string>nb_qdlink</string>
</dict>
<dict>
<key>value</key>
<string>asmc3nb</string>
<key>description</key>
<string>Asante MC3NB Ethernet card</string>
<key>devname</key>
<string>nb_amc3b</string>
</dict>
<dict>
<key>value</key>
<string>bootbug</string>
<key>description</key>
<string>Brigent BootBug debugger card</string>
<key>devname</key>
<string>nb_btbug</string>
</dict>
<dict>
<key>value</key>
<string>m2hires</string>
<key>description</key>
<string>Macintosh II Hi-Resolution video card</string>
<key>devname</key>
<string>nb_m2hr</string>
</dict>
<dict>
<key>value</key>
<string>portrait</string>
<key>description</key>
<string>Macintosh II Portrait Video Card</string>
<key>devname</key>
<string>nb_wspt</string>
</dict>
<dict>
<key>value</key>
<string>m2video</string>
<key>description</key>
<string>Macintosh II Video Card</string>
<key>devname</key>
<string>nb_m2vc</string>
</dict>
<dict>
<key>value</key>
<string>vikbw</string>
<key>description</key>
<string>Moniterm Viking video card</string>
<key>devname</key>
<string>nb_vikbw</string>
</dict>
<dict>
<key>value</key>
<string>image</string>
<key>description</key>
<string>NuBus Disk Image Pseudo-Card</string>
<key>devname</key>
<string>nb_image</string>
<key>media</key>
<dict>
<key>pseudo_disk</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>radiustpd</string>
<key>description</key>
<string>Radius Two Page Display video card</string>
<key>devname</key>
<string>nb_rtpd</string>
</dict>
<dict>
<key>value</key>
<string>cb264</string>
<key>description</key>
<string>RasterOps ColorBoard 264 video card</string>
<key>devname</key>
<string>nb_c264</string>
</dict>
<dict>
<key>value</key>
<string>laserview</string>
<key>description</key>
<string>Sigma Designs LaserView video card</string>
<key>devname</key>
<string>nb_laserview</string>
</dict>
<dict>
<key>value</key>
<string>specpdq</string>
<key>description</key>
<string>SuperMac Spectrum PDQ video card</string>
<key>devname</key>
<string>nb_spdq</string>
</dict>
<dict>
<key>value</key>
<string>spec8s3</string>
<key>description</key>
<string>SuperMac Spectrum/8 Series III video card</string>
<key>devname</key>
<string>nb_sp8s3</string>
</dict>
</array>
</dict>
</array>
<key>devices</key>
<array>
<dict>
<key>name</key>
<string>smartport</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>fdc:0</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>35dd</string>
<key>description</key>
<string>3.5" DD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35hd</string>
<key>description</key>
<string>3.5" HD</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35sd</string>
<key>description</key>
<string>3.5" SD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>fdc:1</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>35dd</string>
<key>description</key>
<string>3.5" DD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35hd</string>
<key>description</key>
<string>3.5" HD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35sd</string>
<key>description</key>
<string>3.5" SD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>nb_btbug</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:serport0</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>nb_qdlink</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:serport0</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>:serport1</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>:serport2</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>:serport3</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
</array>
</dict>
</array>
<key>software</key>
<array>
<string>mac_hdd.xml</string>
<string>mac_flop.xml</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,855 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>value</key>
<string>maciicx</string>
<key>description</key>
<string>Macintosh IIcx</string>
<key>media</key>
<dict>
<key>hard</key>
<integer>2</integer>
</dict>
<key>resolution</key>
<array>
<integer>640</integer>
<integer>480</integer>
</array>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>ramsize</string>
<key>description</key>
<string>RAM</string>
<key>options</key>
<array>
<dict>
<key>intValue</key>
<integer>2097152</integer>
<key>description</key>
<string>2M</string>
<key>value</key>
<string>2M</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>intValue</key>
<integer>8388608</integer>
<key>description</key>
<string>8M</string>
<key>value</key>
<string>8M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>33554432</integer>
<key>description</key>
<string>32M</string>
<key>value</key>
<string>32M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>67108864</integer>
<key>description</key>
<string>64M</string>
<key>value</key>
<string>64M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>100663296</integer>
<key>description</key>
<string>96M</string>
<key>value</key>
<string>96M</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>intValue</key>
<integer>134217728</integer>
<key>description</key>
<string>128M</string>
<key>value</key>
<string>128M</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>smartport</string>
<key>description</key>
<string>Disk Drives</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string></string>
<key>devname</key>
<string>smartport</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>nb9</string>
<key>description</key>
<string>Slot 9</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>48gc</string>
<key>description</key>
<string>Apple 4*8 video card</string>
<key>default</key>
<true/>
<key>devname</key>
<string>nb_48gc</string>
</dict>
<dict>
<key>value</key>
<string>824gc</string>
<key>description</key>
<string>Apple 8*24 video card</string>
<key>devname</key>
<string>nb_824gc</string>
</dict>
<dict>
<key>value</key>
<string>enetnb</string>
<key>description</key>
<string>Apple NuBus Ethernet card</string>
<key>devname</key>
<string>nb_aenet</string>
</dict>
<dict>
<key>value</key>
<string>quadralink</string>
<key>description</key>
<string>Applied Engineering Quadralink serial card</string>
<key>devname</key>
<string>nb_qdlink</string>
</dict>
<dict>
<key>value</key>
<string>asmc3nb</string>
<key>description</key>
<string>Asante MC3NB Ethernet card</string>
<key>devname</key>
<string>nb_amc3b</string>
</dict>
<dict>
<key>value</key>
<string>bootbug</string>
<key>description</key>
<string>Brigent BootBug debugger card</string>
<key>devname</key>
<string>nb_btbug</string>
</dict>
<dict>
<key>value</key>
<string>m2hires</string>
<key>description</key>
<string>Macintosh II Hi-Resolution video card</string>
<key>devname</key>
<string>nb_m2hr</string>
</dict>
<dict>
<key>value</key>
<string>portrait</string>
<key>description</key>
<string>Macintosh II Portrait Video Card</string>
<key>devname</key>
<string>nb_wspt</string>
</dict>
<dict>
<key>value</key>
<string>m2video</string>
<key>description</key>
<string>Macintosh II Video Card</string>
<key>devname</key>
<string>nb_m2vc</string>
</dict>
<dict>
<key>value</key>
<string>vikbw</string>
<key>description</key>
<string>Moniterm Viking video card</string>
<key>devname</key>
<string>nb_vikbw</string>
</dict>
<dict>
<key>value</key>
<string>image</string>
<key>description</key>
<string>NuBus Disk Image Pseudo-Card</string>
<key>devname</key>
<string>nb_image</string>
<key>media</key>
<dict>
<key>pseudo_disk</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>radiustpd</string>
<key>description</key>
<string>Radius Two Page Display video card</string>
<key>devname</key>
<string>nb_rtpd</string>
</dict>
<dict>
<key>value</key>
<string>cb264</string>
<key>description</key>
<string>RasterOps ColorBoard 264 video card</string>
<key>devname</key>
<string>nb_c264</string>
</dict>
<dict>
<key>value</key>
<string>laserview</string>
<key>description</key>
<string>Sigma Designs LaserView video card</string>
<key>devname</key>
<string>nb_laserview</string>
</dict>
<dict>
<key>value</key>
<string>specpdq</string>
<key>description</key>
<string>SuperMac Spectrum PDQ video card</string>
<key>devname</key>
<string>nb_spdq</string>
</dict>
<dict>
<key>value</key>
<string>spec8s3</string>
<key>description</key>
<string>SuperMac Spectrum/8 Series III video card</string>
<key>devname</key>
<string>nb_sp8s3</string>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>nba</string>
<key>description</key>
<string>Slot A</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>48gc</string>
<key>description</key>
<string>Apple 4*8 video card</string>
<key>devname</key>
<string>nb_48gc</string>
</dict>
<dict>
<key>value</key>
<string>824gc</string>
<key>description</key>
<string>Apple 8*24 video card</string>
<key>devname</key>
<string>nb_824gc</string>
</dict>
<dict>
<key>value</key>
<string>enetnb</string>
<key>description</key>
<string>Apple NuBus Ethernet card</string>
<key>devname</key>
<string>nb_aenet</string>
</dict>
<dict>
<key>value</key>
<string>quadralink</string>
<key>description</key>
<string>Applied Engineering Quadralink serial card</string>
<key>devname</key>
<string>nb_qdlink</string>
</dict>
<dict>
<key>value</key>
<string>asmc3nb</string>
<key>description</key>
<string>Asante MC3NB Ethernet card</string>
<key>devname</key>
<string>nb_amc3b</string>
</dict>
<dict>
<key>value</key>
<string>bootbug</string>
<key>description</key>
<string>Brigent BootBug debugger card</string>
<key>devname</key>
<string>nb_btbug</string>
</dict>
<dict>
<key>value</key>
<string>m2hires</string>
<key>description</key>
<string>Macintosh II Hi-Resolution video card</string>
<key>devname</key>
<string>nb_m2hr</string>
</dict>
<dict>
<key>value</key>
<string>portrait</string>
<key>description</key>
<string>Macintosh II Portrait Video Card</string>
<key>devname</key>
<string>nb_wspt</string>
</dict>
<dict>
<key>value</key>
<string>m2video</string>
<key>description</key>
<string>Macintosh II Video Card</string>
<key>devname</key>
<string>nb_m2vc</string>
</dict>
<dict>
<key>value</key>
<string>vikbw</string>
<key>description</key>
<string>Moniterm Viking video card</string>
<key>devname</key>
<string>nb_vikbw</string>
</dict>
<dict>
<key>value</key>
<string>image</string>
<key>description</key>
<string>NuBus Disk Image Pseudo-Card</string>
<key>devname</key>
<string>nb_image</string>
<key>media</key>
<dict>
<key>pseudo_disk</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>radiustpd</string>
<key>description</key>
<string>Radius Two Page Display video card</string>
<key>devname</key>
<string>nb_rtpd</string>
</dict>
<dict>
<key>value</key>
<string>cb264</string>
<key>description</key>
<string>RasterOps ColorBoard 264 video card</string>
<key>devname</key>
<string>nb_c264</string>
</dict>
<dict>
<key>value</key>
<string>laserview</string>
<key>description</key>
<string>Sigma Designs LaserView video card</string>
<key>devname</key>
<string>nb_laserview</string>
</dict>
<dict>
<key>value</key>
<string>specpdq</string>
<key>description</key>
<string>SuperMac Spectrum PDQ video card</string>
<key>devname</key>
<string>nb_spdq</string>
</dict>
<dict>
<key>value</key>
<string>spec8s3</string>
<key>description</key>
<string>SuperMac Spectrum/8 Series III video card</string>
<key>devname</key>
<string>nb_sp8s3</string>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>nbb</string>
<key>description</key>
<string>Slot B</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>48gc</string>
<key>description</key>
<string>Apple 4*8 video card</string>
<key>devname</key>
<string>nb_48gc</string>
</dict>
<dict>
<key>value</key>
<string>824gc</string>
<key>description</key>
<string>Apple 8*24 video card</string>
<key>devname</key>
<string>nb_824gc</string>
</dict>
<dict>
<key>value</key>
<string>enetnb</string>
<key>description</key>
<string>Apple NuBus Ethernet card</string>
<key>devname</key>
<string>nb_aenet</string>
</dict>
<dict>
<key>value</key>
<string>quadralink</string>
<key>description</key>
<string>Applied Engineering Quadralink serial card</string>
<key>devname</key>
<string>nb_qdlink</string>
</dict>
<dict>
<key>value</key>
<string>asmc3nb</string>
<key>description</key>
<string>Asante MC3NB Ethernet card</string>
<key>devname</key>
<string>nb_amc3b</string>
</dict>
<dict>
<key>value</key>
<string>bootbug</string>
<key>description</key>
<string>Brigent BootBug debugger card</string>
<key>devname</key>
<string>nb_btbug</string>
</dict>
<dict>
<key>value</key>
<string>m2hires</string>
<key>description</key>
<string>Macintosh II Hi-Resolution video card</string>
<key>devname</key>
<string>nb_m2hr</string>
</dict>
<dict>
<key>value</key>
<string>portrait</string>
<key>description</key>
<string>Macintosh II Portrait Video Card</string>
<key>devname</key>
<string>nb_wspt</string>
</dict>
<dict>
<key>value</key>
<string>m2video</string>
<key>description</key>
<string>Macintosh II Video Card</string>
<key>devname</key>
<string>nb_m2vc</string>
</dict>
<dict>
<key>value</key>
<string>vikbw</string>
<key>description</key>
<string>Moniterm Viking video card</string>
<key>devname</key>
<string>nb_vikbw</string>
</dict>
<dict>
<key>value</key>
<string>image</string>
<key>description</key>
<string>NuBus Disk Image Pseudo-Card</string>
<key>devname</key>
<string>nb_image</string>
<key>media</key>
<dict>
<key>pseudo_disk</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>radiustpd</string>
<key>description</key>
<string>Radius Two Page Display video card</string>
<key>devname</key>
<string>nb_rtpd</string>
</dict>
<dict>
<key>value</key>
<string>cb264</string>
<key>description</key>
<string>RasterOps ColorBoard 264 video card</string>
<key>devname</key>
<string>nb_c264</string>
</dict>
<dict>
<key>value</key>
<string>laserview</string>
<key>description</key>
<string>Sigma Designs LaserView video card</string>
<key>devname</key>
<string>nb_laserview</string>
</dict>
<dict>
<key>value</key>
<string>specpdq</string>
<key>description</key>
<string>SuperMac Spectrum PDQ video card</string>
<key>devname</key>
<string>nb_spdq</string>
</dict>
<dict>
<key>value</key>
<string>spec8s3</string>
<key>description</key>
<string>SuperMac Spectrum/8 Series III video card</string>
<key>devname</key>
<string>nb_sp8s3</string>
</dict>
</array>
</dict>
</array>
<key>devices</key>
<array>
<dict>
<key>name</key>
<string>smartport</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>fdc:0</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>35dd</string>
<key>description</key>
<string>3.5" DD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35hd</string>
<key>description</key>
<string>3.5" HD</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35sd</string>
<key>description</key>
<string>3.5" SD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>fdc:1</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>35dd</string>
<key>description</key>
<string>3.5" DD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35hd</string>
<key>description</key>
<string>3.5" HD</string>
<key>default</key>
<true/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>value</key>
<string>35sd</string>
<key>description</key>
<string>3.5" SD</string>
<key>default</key>
<false/>
<key>media</key>
<dict>
<key>floppy_3_5</key>
<integer>1</integer>
</dict>
</dict>
</array>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>nb_btbug</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:serport0</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<true/>
</dict>
</array>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>nb_qdlink</string>
<key>slots</key>
<array>
<dict>
<key>name</key>
<string>:serport0</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>:serport1</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>:serport2</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
<dict>
<key>name</key>
<string>:serport3</string>
<key>options</key>
<array>
<dict>
<key>value</key>
<string></string>
<key>description</key>
<string>—None—</string>
<key>default</key>
<true/>
</dict>
<dict>
<key>value</key>
<string>null_modem</string>
<key>description</key>
<string>RS232 Null Modem</string>
<key>default</key>
<false/>
</dict>
<dict>
<key>value</key>
<string>terminal</string>
<key>description</key>
<string>Serial Terminal</string>
<key>default</key>
<false/>
</dict>
</array>
</dict>
</array>
</dict>
</array>
<key>software</key>
<array>
<string>mac_hdd.xml</string>
<string>mac_flop.xml</string>
</array>
</dict>
</plist>

Some files were not shown because too many files have changed in this diff Show More