mirror of
https://github.com/ksherlock/ample.git
synced 2024-06-01 16:41:35 +00:00
Compare commits
143 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
60586a9e1b | ||
|
fb7b2f3973 | ||
|
4a6ba96803 | ||
|
73ab4e0e41 | ||
|
828c938e52 | ||
|
d1a2dcba21 | ||
|
5de27856ed | ||
|
8da2ff4a20 | ||
|
e89536c932 | ||
|
d2b592c7e5 | ||
|
0afa433151 | ||
|
c2323ac998 | ||
|
45fe32893f | ||
|
308b15277c | ||
|
bdd9df44ed | ||
|
c58ff589dd | ||
|
e3985856f3 | ||
|
a28c42a2b6 | ||
|
78bcc88694 | ||
|
7e1e2fb8c5 | ||
|
7e64d6720d | ||
|
ef8a4412f8 | ||
|
68429262c0 | ||
|
c2baf07256 | ||
|
cac8c1c054 | ||
|
0718aa5944 | ||
|
8b37b5e840 | ||
|
565e1109ff | ||
|
b7149a0b0d | ||
|
8283a3beec | ||
|
17945e68ba | ||
|
49e3e397d2 | ||
|
5efa2b2cbf | ||
|
c536b8edb5 | ||
|
a6747e4f57 | ||
|
7dbaf4e12d | ||
|
24e3b01803 | ||
|
d6a3e1e347 | ||
|
0244fbcc0b | ||
|
ee1da060a3 | ||
|
6ce2fbc2d8 | ||
|
56b34a4099 | ||
|
9f7c49e3e0 | ||
|
70fc811b0d | ||
|
377e6bc04e | ||
|
6ef3911da7 | ||
|
9b3223478c | ||
|
2198467def | ||
|
63a60ed8b7 | ||
|
9005cfe0ec | ||
|
2e62b33fb1 | ||
|
e04d441cc5 | ||
|
f116c9ff1f | ||
|
92cf747d65 | ||
|
743fa57a44 | ||
|
970cbd6cdc | ||
|
3ce9df6650 | ||
|
d84c5d7be3 | ||
|
79617329e8 | ||
|
dc67db2ce6 | ||
|
9031b481ce | ||
|
f38ab3288d | ||
|
0aea4006cc | ||
|
06233137a9 | ||
|
8bc7e26279 | ||
|
aea14d8dd4 | ||
|
23946962ad | ||
|
d0987932a8 | ||
|
c03f888032 | ||
|
2b127ac5a8 | ||
|
c6edfe91f2 | ||
|
11ba25588b | ||
|
695ed00552 | ||
|
c8e3c95240 | ||
|
4acd3d51a7 | ||
|
93cb6c5276 | ||
|
52e9f00b92 | ||
|
453e2bd497 | ||
|
c722b28ef3 | ||
|
7a077e5ec8 | ||
|
436694a0b6 | ||
|
01e36939aa | ||
|
20c767021c | ||
|
b64ca73346 | ||
|
62767971ee | ||
|
6b2c4c408a | ||
|
bbcc41cc10 | ||
|
f651ca6b26 | ||
|
16036d9df0 | ||
|
41653fcae1 | ||
|
87b4cc9494 | ||
|
9b349e699f | ||
|
03c8306718 | ||
|
41ad1f0d7a | ||
|
d5ed5f74a2 | ||
|
2409ad55a1 | ||
|
601e56ccaa | ||
|
d5d90ba6be | ||
|
4a0caa2e78 | ||
|
23a05d5414 | ||
|
4ffd8d1f44 | ||
|
f52470eb2e | ||
|
65aedba94b | ||
|
8707b4a246 | ||
|
5a0fdd5a7e | ||
|
4e05ff7e8c | ||
|
781d8ada60 | ||
|
d258fd2a48 | ||
|
2b2f3a2fd8 | ||
|
9bb0cc468a | ||
|
79c3eba93e | ||
|
e09a151c91 | ||
|
ce35015218 | ||
|
1dd3664a2b | ||
|
0616991a1b | ||
|
7633887391 | ||
|
c49c4df9bf | ||
|
eda219faa2 | ||
|
5382447dc9 | ||
|
8f989c0d3f | ||
|
1141e3da0d | ||
|
c5eeec9b6d | ||
|
2122f0707b | ||
|
809e344a2d | ||
|
405e802176 | ||
|
d352e7c45d | ||
|
5af5e2e300 | ||
|
afc3ac608a | ||
|
c200672650 | ||
|
345d4f3d74 | ||
|
b795d60995 | ||
|
09b4972084 | ||
|
49c191bf5f | ||
|
7f5efc1479 | ||
|
c7fa95c918 | ||
|
7178118ea9 | ||
|
e9654f01c0 | ||
|
098b8cb7da | ||
|
35b60b1358 | ||
|
0c56be79f3 | ||
|
e66502ea42 | ||
|
70f4738264 | ||
|
026a9e7704 |
6
.github/workflows/xcodebuild.yml
vendored
6
.github/workflows/xcodebuild.yml
vendored
|
@ -8,8 +8,12 @@ jobs:
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: build
|
- name: build
|
||||||
run: xcodebuild -project "Ample.xcodeproj" -target "Ample Lite" | xcpretty
|
run: xcodebuild -project "Ample.xcodeproj" -target "Ample Lite" | xcpretty
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: Ample Lite
|
||||||
|
path: build/Release/
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -33,6 +33,7 @@ extern NSString *kMamePath;
|
||||||
extern NSString *kMameWorkingDirectory;
|
extern NSString *kMameWorkingDirectory;
|
||||||
extern NSString *kAutoCloseLogWindow;
|
extern NSString *kAutoCloseLogWindow;
|
||||||
extern NSString *kMameComponentsDate;
|
extern NSString *kMameComponentsDate;
|
||||||
|
extern NSString *kUseLogWindow;
|
||||||
|
|
||||||
extern NSString *kDownloadURL;
|
extern NSString *kDownloadURL;
|
||||||
extern NSString *kDownloadExtension;
|
extern NSString *kDownloadExtension;
|
||||||
|
@ -42,6 +43,7 @@ extern NSString *kDefaultDownloadExtension;
|
||||||
|
|
||||||
extern NSString *kNotificationDiskImageAdded;
|
extern NSString *kNotificationDiskImageAdded;
|
||||||
extern NSString *kNotificationDiskImageMagicRoute;
|
extern NSString *kNotificationDiskImageMagicRoute;
|
||||||
|
extern NSString *kNotificationBookmarkMagicRoute;
|
||||||
|
|
||||||
@protocol Bookmark <NSObject>
|
@protocol Bookmark <NSObject>
|
||||||
-(BOOL)loadBookmark: (NSDictionary *)bookmark;
|
-(BOOL)loadBookmark: (NSDictionary *)bookmark;
|
||||||
|
|
|
@ -129,6 +129,7 @@ NSString *kUseCustomMame = @"UseCustomMame";
|
||||||
NSString *kMamePath = @"MamePath";
|
NSString *kMamePath = @"MamePath";
|
||||||
NSString *kMameWorkingDirectory = @"MameWorkingDirectory";
|
NSString *kMameWorkingDirectory = @"MameWorkingDirectory";
|
||||||
NSString *kAutoCloseLogWindow = @"AutoCloseLogWindow";
|
NSString *kAutoCloseLogWindow = @"AutoCloseLogWindow";
|
||||||
|
NSString *kUseLogWindow = @"UseLogWindow";
|
||||||
NSString *kMameComponentsDate = @"MameComponentsDate";
|
NSString *kMameComponentsDate = @"MameComponentsDate";
|
||||||
NSString *kDefaultDownloadURL = @"DefaultDownloadURL";
|
NSString *kDefaultDownloadURL = @"DefaultDownloadURL";
|
||||||
NSString *kDefaultDownloadExtension = @"DefaultDownloadExtension";
|
NSString *kDefaultDownloadExtension = @"DefaultDownloadExtension";
|
||||||
|
@ -138,3 +139,4 @@ NSString *kDownloadExtension = @"DownloadExtension";
|
||||||
|
|
||||||
NSString *kNotificationDiskImageAdded = @"Disk Image Added";
|
NSString *kNotificationDiskImageAdded = @"Disk Image Added";
|
||||||
NSString *kNotificationDiskImageMagicRoute = @"Disk Image Magic Route";
|
NSString *kNotificationDiskImageMagicRoute = @"Disk Image Magic Route";
|
||||||
|
NSString *kNotificationBookmarkMagicRoute = @"Bookmark Magic Route";
|
||||||
|
|
|
@ -11,6 +11,6 @@
|
||||||
@interface AppDelegate : NSObject <NSApplicationDelegate>
|
@interface AppDelegate : NSObject <NSApplicationDelegate>
|
||||||
|
|
||||||
- (IBAction)displayPreferences:(id)sender;
|
- (IBAction)displayPreferences:(id)sender;
|
||||||
|
- (IBAction)manageBookmarks: (id)sender;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
#import "DownloadWindowController.h"
|
#import "DownloadWindowController.h"
|
||||||
#import "DiskImagesWindowController.h"
|
#import "DiskImagesWindowController.h"
|
||||||
#import "CheatSheetWindowController.h"
|
#import "CheatSheetWindowController.h"
|
||||||
|
#import "BookmarkWindowController.h"
|
||||||
|
|
||||||
#import "Transformers.h"
|
#import "Transformers.h"
|
||||||
#import "BookmarkManager.h"
|
#import "BookmarkManager.h"
|
||||||
|
|
||||||
|
@ -28,6 +30,8 @@
|
||||||
NSWindowController *_downloader;
|
NSWindowController *_downloader;
|
||||||
NSWindowController *_diskImages;
|
NSWindowController *_diskImages;
|
||||||
NSWindowController *_cheatSheet;
|
NSWindowController *_cheatSheet;
|
||||||
|
NSWindowController *_bookmarks;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -41,9 +45,7 @@
|
||||||
|
|
||||||
RegisterTransformers();
|
RegisterTransformers();
|
||||||
|
|
||||||
BookmarkManager *bm = [BookmarkManager sharedManager];
|
//BookmarkManager *bm = [BookmarkManager sharedManager];
|
||||||
[bm loadBookmarks];
|
|
||||||
[bm updateMenu];
|
|
||||||
|
|
||||||
path = [bundle pathForResource: @"Defaults" ofType: @"plist"];
|
path = [bundle pathForResource: @"Defaults" ofType: @"plist"];
|
||||||
dict = [NSDictionary dictionaryWithContentsOfFile: path];
|
dict = [NSDictionary dictionaryWithContentsOfFile: path];
|
||||||
|
@ -53,17 +55,17 @@
|
||||||
[[NSUserDefaults standardUserDefaults] registerDefaults: dict];
|
[[NSUserDefaults standardUserDefaults] registerDefaults: dict];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_diskImages = [DiskImagesWindowController sharedInstance]; //[DiskImagesWindowController new];
|
_diskImages = [DiskImagesWindowController sharedInstance]; //[DiskImagesWindowController new];
|
||||||
|
|
||||||
if ([self installMameComponents]) {
|
if ([self installMameComponents]) {
|
||||||
|
|
||||||
[self displayLaunchWindow];
|
[self displayLaunchWindow];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-(void)displayLaunchWindow {
|
-(void)displayLaunchWindow {
|
||||||
|
|
||||||
if (!_launcher) {
|
if (!_launcher) {
|
||||||
|
@ -86,12 +88,21 @@
|
||||||
NSDate *newDate = [defaults objectForKey: kMameComponentsDate];
|
NSDate *newDate = [defaults objectForKey: kMameComponentsDate];
|
||||||
if (![newDate isKindOfClass: [NSDate class]])
|
if (![newDate isKindOfClass: [NSDate class]])
|
||||||
newDate = nil;
|
newDate = nil;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (!newDate) return YES; //????
|
if (!newDate) return YES; //????
|
||||||
if (oldDate && [oldDate compare: newDate] >= 0) return YES;
|
if (oldDate && [oldDate compare: newDate] >= 0) return YES;
|
||||||
|
|
||||||
|
#if 0
|
||||||
NSString *path = [bundle pathForResource: @"mame-data" ofType: @"tgz"];
|
NSString *path = [bundle pathForResource: @"mame-data" ofType: @"tgz"];
|
||||||
if (!path) return YES; // Ample Lite?
|
if (!path) return YES; // Ample Lite?
|
||||||
|
#endif
|
||||||
|
|
||||||
|
NSString *ssp = [bundle sharedSupportPath];
|
||||||
|
NSString *path = [ssp stringByAppendingPathComponent: @"mame-data.tgz"];
|
||||||
|
if (![[NSFileManager defaultManager] fileExistsAtPath: path])
|
||||||
|
return YES; // Ample Lite?
|
||||||
|
|
||||||
|
|
||||||
NSWindow *win = _installWindow;
|
NSWindow *win = _installWindow;
|
||||||
|
@ -113,11 +124,11 @@
|
||||||
|
|
||||||
dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC));
|
dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC));
|
||||||
[task setTerminationHandler: ^(NSTask *task){
|
[task setTerminationHandler: ^(NSTask *task){
|
||||||
|
|
||||||
|
int st = [task terminationStatus];
|
||||||
|
// delay so the install window is visible, I think
|
||||||
dispatch_after(when, dispatch_get_main_queue(), ^{
|
dispatch_after(when, dispatch_get_main_queue(), ^{
|
||||||
|
|
||||||
int st = [task terminationStatus];
|
|
||||||
|
|
||||||
if (st) {
|
if (st) {
|
||||||
NSAlert *alert = [NSAlert new];
|
NSAlert *alert = [NSAlert new];
|
||||||
[alert setMessageText: @"An error occurred extracting MAME components"];
|
[alert setMessageText: @"An error occurred extracting MAME components"];
|
||||||
|
@ -146,6 +157,7 @@
|
||||||
|
|
||||||
- (void)applicationWillTerminate:(NSNotification *)aNotification {
|
- (void)applicationWillTerminate:(NSNotification *)aNotification {
|
||||||
// Insert code here to tear down your application
|
// Insert code here to tear down your application
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
|
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
|
||||||
|
@ -226,6 +238,79 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (IBAction)manageBookmarks: (id)sender {
|
||||||
|
|
||||||
|
if (!_bookmarks) {
|
||||||
|
_bookmarks = [BookmarkWindowController new];
|
||||||
|
}
|
||||||
|
[_bookmarks showWindow: sender];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-(IBAction)installMameComponents:(id)sender {
|
||||||
|
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
|
||||||
|
NSString *path = [bundle pathForResource: @"mame-data" ofType: @"tgz"];
|
||||||
|
if (!path) return; // Ample Lite?
|
||||||
|
|
||||||
|
|
||||||
|
NSWindow *win = _installWindow;
|
||||||
|
[win makeKeyAndOrderFront: nil];
|
||||||
|
NSTask *task = [NSTask new];
|
||||||
|
NSArray *argv = @[
|
||||||
|
@"xfz",
|
||||||
|
path
|
||||||
|
];
|
||||||
|
if (@available(macOS 10.13, *)) {
|
||||||
|
[task setExecutableURL: [NSURL fileURLWithPath: @"/usr/bin/tar"]];
|
||||||
|
[task setCurrentDirectoryURL: sd];
|
||||||
|
} else {
|
||||||
|
[task setLaunchPath: @"/usr/bin/tar"];
|
||||||
|
[task setCurrentDirectoryPath: SupportDirectoryPath()];
|
||||||
|
}
|
||||||
|
[task setArguments: argv];
|
||||||
|
|
||||||
|
|
||||||
|
//dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC));
|
||||||
|
[task setTerminationHandler: ^(NSTask *task){
|
||||||
|
|
||||||
|
int st = [task terminationStatus];
|
||||||
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
|
|
||||||
|
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];
|
||||||
|
// need to reload the software list data.
|
||||||
|
});
|
||||||
|
|
||||||
|
}];
|
||||||
|
[task launch];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
223
Ample/Base.lproj/BookmarkWindow.xib
Normal file
223
Ample/Base.lproj/BookmarkWindow.xib
Normal file
|
@ -0,0 +1,223 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="macosx"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<objects>
|
||||||
|
<customObject id="-2" userLabel="File's Owner" customClass="BookmarkWindowController">
|
||||||
|
<connections>
|
||||||
|
<outlet property="arrayController" destination="7gA-MI-adT" id="XJ0-qj-ho5"/>
|
||||||
|
<outlet property="bookmarkManager" destination="Ryd-Nr-sPf" id="LM4-IP-ehb"/>
|
||||||
|
<outlet property="tableView" destination="mkQ-pQ-kXu" id="jqC-GF-vrE"/>
|
||||||
|
<outlet property="window" destination="QvC-M9-y7g" id="ovK-qY-XrZ"/>
|
||||||
|
</connections>
|
||||||
|
</customObject>
|
||||||
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
|
<window title="Bookmarks" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g">
|
||||||
|
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
|
||||||
|
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||||
|
<rect key="contentRect" x="196" y="240" width="400" height="450"/>
|
||||||
|
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
|
||||||
|
<view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="400" height="450"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<scrollView fixedFrame="YES" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cgh-jG-i97">
|
||||||
|
<rect key="frame" x="-1" y="-1" width="402" height="452"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<clipView key="contentView" id="xDr-v4-sVR">
|
||||||
|
<rect key="frame" x="1" y="1" width="400" height="450"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="firstColumnOnly" columnReordering="NO" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" headerView="hmS-CB-Huq" viewBased="YES" id="mkQ-pQ-kXu">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="400" height="425"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<size key="intercellSpacing" width="3" height="2"/>
|
||||||
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<tableColumns>
|
||||||
|
<tableColumn width="232" minWidth="40" maxWidth="1000" id="U9x-dw-Kd3">
|
||||||
|
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Name">
|
||||||
|
<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="jIY-mU-1gw">
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
<sortDescriptor key="sortDescriptorPrototype" selector="caseInsensitiveCompare:" sortKey="name"/>
|
||||||
|
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||||
|
<prototypeCellViews>
|
||||||
|
<tableCellView id="R8h-Wj-cHA">
|
||||||
|
<rect key="frame" x="1" y="1" width="237" height="17"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cIh-ya-lB0">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="237" height="17"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||||
|
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" title="Table View Cell" id="a7b-vf-Kzd">
|
||||||
|
<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="R8h-Wj-cHA" name="value" keyPath="objectValue.name" id="UWc-85-Ghw">
|
||||||
|
<dictionary key="options">
|
||||||
|
<bool key="NSValidatesImmediately" value="YES"/>
|
||||||
|
</dictionary>
|
||||||
|
</binding>
|
||||||
|
</connections>
|
||||||
|
</textField>
|
||||||
|
</subviews>
|
||||||
|
<connections>
|
||||||
|
<outlet property="textField" destination="cIh-ya-lB0" id="DMK-Kc-RpK"/>
|
||||||
|
</connections>
|
||||||
|
</tableCellView>
|
||||||
|
</prototypeCellViews>
|
||||||
|
</tableColumn>
|
||||||
|
<tableColumn editable="NO" width="100" minWidth="100" maxWidth="100" id="fvh-YG-X9R">
|
||||||
|
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Machine">
|
||||||
|
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</tableHeaderCell>
|
||||||
|
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="waa-dh-M0V">
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
<sortDescriptor key="sortDescriptorPrototype" selector="compare:" sortKey="machine"/>
|
||||||
|
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||||
|
<prototypeCellViews>
|
||||||
|
<tableCellView id="LUd-BZ-Kpw">
|
||||||
|
<rect key="frame" x="241" y="1" width="100" height="17"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4Qd-Zj-XZi">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="100" height="17"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||||
|
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="ztJ-V1-N1t">
|
||||||
|
<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="LUd-BZ-Kpw" name="value" keyPath="objectValue.machine" id="IYK-LP-fHo"/>
|
||||||
|
</connections>
|
||||||
|
</textField>
|
||||||
|
</subviews>
|
||||||
|
<connections>
|
||||||
|
<outlet property="textField" destination="4Qd-Zj-XZi" id="u3u-3q-Vc2"/>
|
||||||
|
</connections>
|
||||||
|
</tableCellView>
|
||||||
|
</prototypeCellViews>
|
||||||
|
</tableColumn>
|
||||||
|
<tableColumn editable="NO" width="50" minWidth="50" maxWidth="50" id="rmr-1r-2Cb">
|
||||||
|
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Default">
|
||||||
|
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</tableHeaderCell>
|
||||||
|
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="zuw-8H-5ck">
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
<sortDescriptor key="sortDescriptorPrototype" selector="compare:" sortKey="automatic"/>
|
||||||
|
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||||
|
<prototypeCellViews>
|
||||||
|
<tableCellView id="f3C-qX-bVY">
|
||||||
|
<rect key="frame" x="344" y="1" width="54" height="17"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LzD-ps-EdD">
|
||||||
|
<rect key="frame" x="19" y="1" width="16" height="16"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||||
|
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSStatusAvailable" id="kH7-IH-D1y"/>
|
||||||
|
<connections>
|
||||||
|
<binding destination="f3C-qX-bVY" name="hidden" keyPath="objectValue.automatic" id="izX-1f-EU8">
|
||||||
|
<dictionary key="options">
|
||||||
|
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
||||||
|
</dictionary>
|
||||||
|
</binding>
|
||||||
|
</connections>
|
||||||
|
</imageView>
|
||||||
|
</subviews>
|
||||||
|
<connections>
|
||||||
|
<outlet property="imageView" destination="LzD-ps-EdD" id="hef-CI-Ly8"/>
|
||||||
|
</connections>
|
||||||
|
</tableCellView>
|
||||||
|
</prototypeCellViews>
|
||||||
|
</tableColumn>
|
||||||
|
</tableColumns>
|
||||||
|
<connections>
|
||||||
|
<action trigger="doubleAction" selector="doubleClick:" target="-2" id="VaT-3X-cCf"/>
|
||||||
|
<binding destination="7gA-MI-adT" name="content" keyPath="arrangedObjects" id="5So-FR-r94"/>
|
||||||
|
<outlet property="dataSource" destination="-2" id="kso-yU-XdI"/>
|
||||||
|
<outlet property="delegate" destination="-2" id="Lyf-Wr-8w0"/>
|
||||||
|
<outlet property="menu" destination="cH2-L7-ScC" id="3MS-Tc-P04"/>
|
||||||
|
</connections>
|
||||||
|
</tableView>
|
||||||
|
</subviews>
|
||||||
|
</clipView>
|
||||||
|
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="O1o-6N-F5z">
|
||||||
|
<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="3n8-lN-RGL">
|
||||||
|
<rect key="frame" x="224" y="17" width="15" height="102"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
</scroller>
|
||||||
|
<tableHeaderView key="headerView" wantsLayer="YES" id="hmS-CB-Huq">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="400" height="25"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
</tableHeaderView>
|
||||||
|
</scrollView>
|
||||||
|
</subviews>
|
||||||
|
</view>
|
||||||
|
<connections>
|
||||||
|
<outlet property="delegate" destination="-2" id="4OM-KB-CAh"/>
|
||||||
|
</connections>
|
||||||
|
<point key="canvasLocation" x="-72" y="91"/>
|
||||||
|
</window>
|
||||||
|
<arrayController mode="entity" entityName="Bookmark" automaticallyPreparesContent="YES" preservesSelection="NO" selectsInsertedObjects="NO" avoidsEmptySelection="NO" clearsFilterPredicateOnInsertion="NO" id="7gA-MI-adT">
|
||||||
|
<connections>
|
||||||
|
<binding destination="Ryd-Nr-sPf" name="managedObjectContext" keyPath="managedObjectContext" id="hMi-JG-LQC"/>
|
||||||
|
<binding destination="-2" name="selectionIndexes" keyPath="tableView.selectedRowIndexes" id="dyb-Wv-Duo"/>
|
||||||
|
<binding destination="-2" name="sortDescriptors" keyPath="tableView.sortDescriptors" previousBinding="dyb-Wv-Duo" id="fkc-Yv-ZLN"/>
|
||||||
|
</connections>
|
||||||
|
</arrayController>
|
||||||
|
<customObject id="Ryd-Nr-sPf" customClass="BookmarkManagerProxy"/>
|
||||||
|
<menu id="cH2-L7-ScC">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Set Default" id="JGR-HC-oCO">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="setDefault:" target="-2" id="QQK-aI-l2p"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Clear Default" id="ulz-3z-Pgl">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="clearDefault:" target="-2" id="mIc-UM-kj0"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Delete" id="B7V-fY-Cbe">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="deleteBookmark:" target="-2" id="zQl-vg-Eg4"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
<connections>
|
||||||
|
<outlet property="delegate" destination="-2" id="raV-YO-2UW"/>
|
||||||
|
</connections>
|
||||||
|
<point key="canvasLocation" x="355" y="-28"/>
|
||||||
|
</menu>
|
||||||
|
</objects>
|
||||||
|
<resources>
|
||||||
|
<image name="NSStatusAvailable" width="16" height="16"/>
|
||||||
|
</resources>
|
||||||
|
</document>
|
|
@ -51,6 +51,6 @@ Icon}}
|
||||||
|
|
||||||
\f1\b0\fs28 \cf0 \
|
\f1\b0\fs28 \cf0 \
|
||||||
\pard\pardeftab720\qj\partightenfactor0
|
\pard\pardeftab720\qj\partightenfactor0
|
||||||
\cf4 R.C. Steadman, 6-1-\'9221.\
|
\cf4 R.C. Steadman, 1921-06-01.\
|
||||||
\
|
\
|
||||||
U.S. Department of Agriculture Pomological Watercolor Collection. Rare and Special Collections, National Agricultural Library, Beltsville, MD 20705}
|
U.S. Department of Agriculture Pomological Watercolor Collection. Rare and Special Collections, National Agricultural Library, Beltsville, MD 20705}
|
|
@ -1,139 +1,24 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15705"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="DiskImagesWindowController">
|
<customObject id="-2" userLabel="File's Owner" customClass="DiskImagesWindowController">
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="arrayController" destination="vmp-9h-Z5R" id="WYF-Xq-BnN"/>
|
<outlet property="arrayController" destination="YmL-8S-msS" id="Pva-sz-XFI"/>
|
||||||
<outlet property="tableView" destination="J5l-1d-030" id="3hU-ho-1ag"/>
|
<outlet property="tableView" destination="cqO-ig-A9t" id="hbI-ho-WYj"/>
|
||||||
<outlet property="window" destination="R7r-B9-Bw0" id="hDE-Qa-m4g"/>
|
<outlet property="window" destination="AtY-lA-KIp" id="aaq-cR-kq8"/>
|
||||||
</connections>
|
</connections>
|
||||||
</customObject>
|
</customObject>
|
||||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
<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">
|
<customObject id="stE-9g-lJ2" customClass="BookmarkManagerProxy"/>
|
||||||
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
|
<arrayController mode="entity" entityName="DiskImage" automaticallyPreparesContent="YES" avoidsEmptySelection="NO" automaticallyRearrangesObjects="YES" id="YmL-8S-msS">
|
||||||
<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" drawsBackground="NO" 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" 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" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
|
||||||
<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>
|
|
||||||
<action trigger="doubleAction" selector="doubleClick:" target="-2" id="Zud-ke-iLR"/>
|
|
||||||
<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>
|
<connections>
|
||||||
<outlet property="delegate" destination="-2" id="1Hn-2t-Vzj"/>
|
<binding destination="stE-9g-lJ2" name="managedObjectContext" keyPath="managedObjectContext" id="GyD-kH-DBa"/>
|
||||||
</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>
|
</connections>
|
||||||
</arrayController>
|
</arrayController>
|
||||||
<menu id="bCS-1z-UOZ">
|
<menu id="bCS-1z-UOZ">
|
||||||
|
@ -156,5 +41,159 @@
|
||||||
</connections>
|
</connections>
|
||||||
<point key="canvasLocation" x="-667" y="170"/>
|
<point key="canvasLocation" x="-667" y="170"/>
|
||||||
</menu>
|
</menu>
|
||||||
|
<window title="Recent Disk Images" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" frameAutosaveName="RecentDiskImagesWindow" animationBehavior="default" id="AtY-lA-KIp">
|
||||||
|
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
|
||||||
|
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||||
|
<rect key="contentRect" x="283" y="305" width="408" height="270"/>
|
||||||
|
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
|
||||||
|
<view key="contentView" id="zHI-2R-bOe">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="408" height="270"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<scrollView fixedFrame="YES" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="a3G-Wf-K8I">
|
||||||
|
<rect key="frame" x="-1" y="-1" width="410" height="272"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<clipView key="contentView" id="SFr-s6-6di">
|
||||||
|
<rect key="frame" x="1" y="1" width="408" height="270"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" headerView="iwP-JL-O3g" viewBased="YES" id="cqO-ig-A9t">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="408" height="245"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<size key="intercellSpacing" width="3" height="2"/>
|
||||||
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<tableColumns>
|
||||||
|
<tableColumn width="300" minWidth="40" maxWidth="1000" id="k9E-Si-iTY">
|
||||||
|
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Name">
|
||||||
|
<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="trJ-af-d0b">
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
<sortDescriptor key="sortDescriptorPrototype" selector="caseInsensitiveCompare:" sortKey="name"/>
|
||||||
|
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||||
|
<prototypeCellViews>
|
||||||
|
<tableCellView id="2Ic-UI-Je3">
|
||||||
|
<rect key="frame" x="1" y="1" width="305" height="17"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="gkM-KB-x76">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="305" height="17"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||||
|
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="PitchDark.2mg" id="Wcg-zo-CeN">
|
||||||
|
<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="2Ic-UI-Je3" name="value" keyPath="objectValue.name" id="FAu-HR-0jF"/>
|
||||||
|
<binding destination="2Ic-UI-Je3" name="toolTip" keyPath="objectValue.path" id="0MM-sv-mET"/>
|
||||||
|
</connections>
|
||||||
|
</textField>
|
||||||
|
</subviews>
|
||||||
|
<connections>
|
||||||
|
<outlet property="textField" destination="gkM-KB-x76" id="tpG-TS-sXI"/>
|
||||||
|
</connections>
|
||||||
|
</tableCellView>
|
||||||
|
</prototypeCellViews>
|
||||||
|
</tableColumn>
|
||||||
|
<tableColumn width="93" minWidth="40" maxWidth="1000" id="0aJ-xJ-YSS">
|
||||||
|
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Size">
|
||||||
|
<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="jRd-9Y-U6W">
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
<sortDescriptor key="sortDescriptorPrototype" selector="compare:" sortKey="size"/>
|
||||||
|
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||||
|
<prototypeCellViews>
|
||||||
|
<tableCellView id="UW9-AF-U9F">
|
||||||
|
<rect key="frame" x="309" y="1" width="97" height="17"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6Ry-Zn-euh">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="97" height="17"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||||
|
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="32 MB" id="fXp-OZ-Qcu">
|
||||||
|
<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="UW9-AF-U9F" name="value" keyPath="objectValue.size" id="Hca-7L-QN7">
|
||||||
|
<dictionary key="options">
|
||||||
|
<string key="NSValueTransformerName">FileSizeTransformer</string>
|
||||||
|
</dictionary>
|
||||||
|
</binding>
|
||||||
|
</connections>
|
||||||
|
</textField>
|
||||||
|
</subviews>
|
||||||
|
<connections>
|
||||||
|
<outlet property="textField" destination="6Ry-Zn-euh" id="vUm-0h-5qV"/>
|
||||||
|
</connections>
|
||||||
|
</tableCellView>
|
||||||
|
</prototypeCellViews>
|
||||||
|
</tableColumn>
|
||||||
|
</tableColumns>
|
||||||
|
<connections>
|
||||||
|
<action trigger="doubleAction" selector="doubleClick:" target="-2" id="wdp-Ek-Olo"/>
|
||||||
|
<binding destination="YmL-8S-msS" name="content" keyPath="arrangedObjects" id="v56-YR-Qve"/>
|
||||||
|
<binding destination="YmL-8S-msS" name="sortDescriptors" keyPath="sortDescriptors" previousBinding="v56-YR-Qve" id="BGa-9c-RdD"/>
|
||||||
|
<outlet property="dataSource" destination="-2" id="gCn-sa-fuX"/>
|
||||||
|
<outlet property="delegate" destination="-2" id="VHT-aS-4iS"/>
|
||||||
|
<outlet property="menu" destination="bCS-1z-UOZ" id="a2u-hd-hPS"/>
|
||||||
|
</connections>
|
||||||
|
</tableView>
|
||||||
|
</subviews>
|
||||||
|
</clipView>
|
||||||
|
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="Z7O-AK-X5q">
|
||||||
|
<rect key="frame" x="1" y="119" width="223" height="15"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
</scroller>
|
||||||
|
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="OLa-ra-vIN">
|
||||||
|
<rect key="frame" x="224" y="17" width="15" height="102"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
</scroller>
|
||||||
|
<tableHeaderView key="headerView" id="iwP-JL-O3g">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="408" height="25"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
</tableHeaderView>
|
||||||
|
</scrollView>
|
||||||
|
</subviews>
|
||||||
|
</view>
|
||||||
|
<toolbar key="toolbar" implicitIdentifier="D9701924-6955-47B8-A2FF-DBD466AAEB92" autosavesConfiguration="NO" allowsUserCustomization="NO" displayMode="iconOnly" sizeMode="regular" id="Gp6-Kl-lr2">
|
||||||
|
<allowedToolbarItems>
|
||||||
|
<toolbarItem implicitItemIdentifier="NSToolbarFlexibleSpaceItem" id="lBE-ee-rCy"/>
|
||||||
|
<toolbarItem implicitItemIdentifier="C346E56F-4480-4D8A-8485-33A3A51D7B78" label="" paletteLabel="Filter" sizingBehavior="auto" id="DsU-uu-UmZ">
|
||||||
|
<nil key="toolTip"/>
|
||||||
|
<searchField key="view" wantsLayer="YES" verticalHuggingPriority="750" textCompletion="NO" id="qHV-IA-ysc">
|
||||||
|
<rect key="frame" x="0.0" y="14" width="96" height="22"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<searchFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" continuous="YES" borderStyle="bezel" placeholderString="Filter" usesSingleLineMode="YES" bezelStyle="round" id="BWo-eC-ahz">
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</searchFieldCell>
|
||||||
|
<connections>
|
||||||
|
<action selector="filter:" target="-2" id="KhW-DS-b8s"/>
|
||||||
|
</connections>
|
||||||
|
</searchField>
|
||||||
|
</toolbarItem>
|
||||||
|
</allowedToolbarItems>
|
||||||
|
<defaultToolbarItems>
|
||||||
|
<toolbarItem reference="lBE-ee-rCy"/>
|
||||||
|
<toolbarItem reference="lBE-ee-rCy"/>
|
||||||
|
<toolbarItem reference="DsU-uu-UmZ"/>
|
||||||
|
</defaultToolbarItems>
|
||||||
|
</toolbar>
|
||||||
|
<point key="canvasLocation" x="-196" y="513"/>
|
||||||
|
</window>
|
||||||
</objects>
|
</objects>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
@ -78,6 +78,7 @@
|
||||||
</dictionary>
|
</dictionary>
|
||||||
</binding>
|
</binding>
|
||||||
<binding destination="onK-6l-2iV" name="textColor" keyPath="objectValue.titleColor" id="0Qx-rz-DEZ"/>
|
<binding destination="onK-6l-2iV" name="textColor" keyPath="objectValue.titleColor" id="0Qx-rz-DEZ"/>
|
||||||
|
<binding destination="onK-6l-2iV" name="toolTip" keyPath="objectValue.value" id="rUb-Jb-KbT"/>
|
||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hfu-hP-QAH">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hfu-hP-QAH">
|
||||||
|
@ -116,6 +117,7 @@
|
||||||
</tableColumn>
|
</tableColumn>
|
||||||
</tableColumns>
|
</tableColumns>
|
||||||
<connections>
|
<connections>
|
||||||
|
<action trigger="doubleAction" selector="doubleClick:" target="-2" id="y2y-h7-cfD"/>
|
||||||
<binding destination="jhO-4z-Qwt" name="content" keyPath="arrangedObjects" id="2av-gV-V4K"/>
|
<binding destination="jhO-4z-Qwt" name="content" keyPath="arrangedObjects" id="2av-gV-V4K"/>
|
||||||
<outlet property="menu" destination="RJM-21-hjO" id="xpL-0n-1jm"/>
|
<outlet property="menu" destination="RJM-21-hjO" id="xpL-0n-1jm"/>
|
||||||
</connections>
|
</connections>
|
||||||
|
@ -297,6 +299,12 @@
|
||||||
<action selector="showInFinder:" target="-2" id="ltL-yL-7EP"/>
|
<action selector="showInFinder:" target="-2" id="ltL-yL-7EP"/>
|
||||||
</connections>
|
</connections>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
|
<menuItem title="Move to Trash" id="x1Q-OF-5hM">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="moveToTrash:" target="-2" id="swr-yf-hA2"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
<menuItem title="Download" tag="2" id="ree-Zg-jYB">
|
<menuItem title="Download" tag="2" id="ree-Zg-jYB">
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
<connections>
|
<connections>
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="LaunchWindowController">
|
<customObject id="-2" userLabel="File's Owner" customClass="LaunchWindowController">
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="addBookmarkWindow" destination="yIt-hP-HBq" id="Qhx-WV-cg4"/>
|
<outlet property="addBookmarkWindow" destination="yIt-hP-HBq" id="Qhx-WV-cg4"/>
|
||||||
|
<outlet property="bookmarkErrorField" destination="RiJ-Xw-sgW" id="6y5-Fo-AnM"/>
|
||||||
<outlet property="bookmarkTextField" destination="fAl-Vn-x1w" id="GNr-j6-BiQ"/>
|
<outlet property="bookmarkTextField" destination="fAl-Vn-x1w" id="GNr-j6-BiQ"/>
|
||||||
<outlet property="machineView" destination="oVt-eD-aaj" id="Q9V-Kr-6GN"/>
|
<outlet property="machineView" destination="oVt-eD-aaj" id="Q9V-Kr-6GN"/>
|
||||||
<outlet property="machineViewController" destination="FSD-3v-Wni" id="tXv-zJ-QO3"/>
|
<outlet property="machineViewController" destination="FSD-3v-Wni" id="tXv-zJ-QO3"/>
|
||||||
|
@ -118,6 +119,9 @@
|
||||||
<menuItem title="LCD Grid" tag="5" id="A6k-ku-z2M">
|
<menuItem title="LCD Grid" tag="5" id="A6k-ku-z2M">
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
|
<menuItem title="Fighters" id="1aA-ge-f8R">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
</menuItem>
|
||||||
</items>
|
</items>
|
||||||
</menu>
|
</menu>
|
||||||
</popUpButtonCell>
|
</popUpButtonCell>
|
||||||
|
@ -155,10 +159,21 @@
|
||||||
<font key="font" metaFont="menu"/>
|
<font key="font" metaFont="menu"/>
|
||||||
<menu key="menu" id="m4N-Qw-mem">
|
<menu key="menu" id="m4N-Qw-mem">
|
||||||
<items>
|
<items>
|
||||||
<menuItem title="Full Screen" state="on" id="0zZ-Ib-Fne"/>
|
<menuItem title="Full Screen" state="on" id="0zZ-Ib-Fne">
|
||||||
<menuItem title="Window 1x" id="3bZ-rq-fCt"/>
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
<menuItem title="Window 2x" id="KA4-Rs-yyK"/>
|
</menuItem>
|
||||||
<menuItem title="Window 3x" id="Dbh-Js-pMx" userLabel="Window 3x"/>
|
<menuItem title="Window 1x" id="3bZ-rq-fCt">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Window 2x" id="KA4-Rs-yyK">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Window 3x" id="Dbh-Js-pMx" userLabel="Window 3x">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Window 4x" id="GCs-En-3Jv">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
</menuItem>
|
||||||
</items>
|
</items>
|
||||||
</menu>
|
</menu>
|
||||||
</popUpButtonCell>
|
</popUpButtonCell>
|
||||||
|
@ -444,11 +459,6 @@
|
||||||
</searchFieldCell>
|
</searchFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="softwareChanged:" target="-2" id="879-da-UEc"/>
|
<action selector="softwareChanged:" target="-2" id="879-da-UEc"/>
|
||||||
<binding destination="-2" name="hidden" keyPath="machine" id="RdE-9k-oFd">
|
|
||||||
<dictionary key="options">
|
|
||||||
<string key="NSValueTransformerName">NSIsNil</string>
|
|
||||||
</dictionary>
|
|
||||||
</binding>
|
|
||||||
</connections>
|
</connections>
|
||||||
</searchField>
|
</searchField>
|
||||||
<customView id="oVt-eD-aaj" customClass="FlippedView">
|
<customView id="oVt-eD-aaj" customClass="FlippedView">
|
||||||
|
@ -570,9 +580,29 @@ Gw
|
||||||
</binding>
|
</binding>
|
||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="RiJ-Xw-sgW">
|
||||||
|
<rect key="frame" x="20" y="20" width="248" height="16"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||||
|
<textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="Ehz-4Z-Tjq">
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<color key="textColor" name="systemRedColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
</textField>
|
||||||
|
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="EFq-dZ-y90">
|
||||||
|
<rect key="frame" x="378" y="79" width="66" height="18"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
|
||||||
|
<buttonCell key="cell" type="check" title="Default" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="cOs-WH-9Dr">
|
||||||
|
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
</buttonCell>
|
||||||
|
<connections>
|
||||||
|
<binding destination="-2" name="value" keyPath="bookmarkDefault" id="Oiv-hR-5fn"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
</subviews>
|
</subviews>
|
||||||
</view>
|
</view>
|
||||||
<point key="canvasLocation" x="130" y="70"/>
|
<point key="canvasLocation" x="-62" y="95"/>
|
||||||
</window>
|
</window>
|
||||||
<viewController nibName="MachineView" id="FSD-3v-Wni" customClass="NewMachineViewController"/>
|
<viewController nibName="MachineView" id="FSD-3v-Wni" customClass="NewMachineViewController"/>
|
||||||
<menu id="Aa5-Sk-gZX">
|
<menu id="Aa5-Sk-gZX">
|
||||||
|
|
|
@ -13,17 +13,18 @@
|
||||||
</customObject>
|
</customObject>
|
||||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
|
<customObject id="rSq-qV-SGy" customClass="BookmarkManager">
|
||||||
|
<connections>
|
||||||
|
<outlet property="menu" destination="ha0-nx-PIl" id="Ozd-ID-egK"/>
|
||||||
|
<outlet property="updateMenuItem" destination="30b-vT-HIa" id="AgZ-LE-no6"/>
|
||||||
|
</connections>
|
||||||
|
</customObject>
|
||||||
<customObject id="Voe-Tx-rLC" customClass="AppDelegate">
|
<customObject id="Voe-Tx-rLC" customClass="AppDelegate">
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="installWindow" destination="jWX-pY-Zpb" id="xAj-Vj-Vxn"/>
|
<outlet property="installWindow" destination="jWX-pY-Zpb" id="xAj-Vj-Vxn"/>
|
||||||
</connections>
|
</connections>
|
||||||
</customObject>
|
</customObject>
|
||||||
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
|
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
|
||||||
<customObject id="sJn-ug-xF3" customClass="BookmarkManager">
|
|
||||||
<connections>
|
|
||||||
<outlet property="menu" destination="ha0-nx-PIl" id="vTa-TU-DS1"/>
|
|
||||||
</connections>
|
|
||||||
</customObject>
|
|
||||||
<customObject id="3aq-Tx-mno" customClass="SUUpdater"/>
|
<customObject id="3aq-Tx-mno" customClass="SUUpdater"/>
|
||||||
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
|
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
|
||||||
<items>
|
<items>
|
||||||
|
@ -44,6 +45,9 @@
|
||||||
</connections>
|
</connections>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
|
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
|
||||||
|
<menuItem title="Reinstall MAME components" hidden="YES" id="c3P-WT-eUP">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
</menuItem>
|
||||||
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW">
|
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW">
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="displayPreferences:" target="Voe-Tx-rLC" id="Hsm-pX-sUc"/>
|
<action selector="displayPreferences:" target="Voe-Tx-rLC" id="Hsm-pX-sUc"/>
|
||||||
|
@ -405,28 +409,39 @@
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
<menu key="submenu" title="Bookmarks" id="ha0-nx-PIl">
|
<menu key="submenu" title="Bookmarks" id="ha0-nx-PIl">
|
||||||
<items>
|
<items>
|
||||||
|
<menuItem title="Manage Bookmarks…" keyEquivalent="b" id="isI-q6-b1V">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="manageBookmarks:" target="-1" id="vOm-90-AoO"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
<menuItem title="Add Bookmark…" keyEquivalent="d" id="1JF-xV-zmG">
|
<menuItem title="Add Bookmark…" keyEquivalent="d" id="1JF-xV-zmG">
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="addBookmark:" target="-1" id="cqp-ko-BfQ"/>
|
<action selector="addBookmark:" target="-1" id="cqp-ko-BfQ"/>
|
||||||
</connections>
|
</connections>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
<menuItem title="Manage Bookmarks…" id="isI-q6-b1V">
|
<menuItem title="Update Bookmark" keyEquivalent="D" id="30b-vT-HIa">
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
<connections>
|
||||||
|
<action selector="updateBookmark:" target="-1" id="Au0-Sp-cUD"/>
|
||||||
|
</connections>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
<menuItem title="Set Default" id="vbR-vS-lqO">
|
<menuItem title="Set Default" hidden="YES" id="vbR-vS-lqO">
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="defaultSave:" target="-1" id="FP9-EX-OKP"/>
|
<action selector="defaultSave:" target="-1" id="FP9-EX-OKP"/>
|
||||||
</connections>
|
</connections>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
<menuItem isSeparatorItem="YES" id="gWR-Yl-mg6"/>
|
<menuItem isSeparatorItem="YES" id="gWR-Yl-mg6"/>
|
||||||
<menuItem title="Default" id="mXC-Lp-gem">
|
<menuItem title="Default" hidden="YES" id="mXC-Lp-gem">
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="defaultLoad:" target="-1" id="ErS-k6-azP"/>
|
<action selector="defaultLoad:" target="-1" id="ErS-k6-azP"/>
|
||||||
</connections>
|
</connections>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
</items>
|
</items>
|
||||||
|
<connections>
|
||||||
|
<outlet property="delegate" destination="rSq-qV-SGy" id="Z7N-CG-hU1"/>
|
||||||
|
</connections>
|
||||||
</menu>
|
</menu>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
<menuItem title="Window" id="aUF-d1-5bR">
|
<menuItem title="Window" id="aUF-d1-5bR">
|
||||||
|
@ -532,5 +547,6 @@
|
||||||
</view>
|
</view>
|
||||||
<point key="canvasLocation" x="13" y="-182"/>
|
<point key="canvasLocation" x="13" y="-182"/>
|
||||||
</window>
|
</window>
|
||||||
|
<userDefaultsController representsSharedInstance="YES" id="uGS-pc-Wsn"/>
|
||||||
</objects>
|
</objects>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
@ -61,7 +61,7 @@
|
||||||
<outlet property="textField" destination="Pep-mX-LHY" id="hUe-cf-6vq"/>
|
<outlet property="textField" destination="Pep-mX-LHY" id="hUe-cf-6vq"/>
|
||||||
</connections>
|
</connections>
|
||||||
</tableCellView>
|
</tableCellView>
|
||||||
<tableCellView identifier="ItemView" translatesAutoresizingMaskIntoConstraints="NO" id="yGq-lc-RCM" customClass="TablePathView">
|
<tableCellView identifier="ItemView" translatesAutoresizingMaskIntoConstraints="NO" id="yGq-lc-RCM" customClass="PathTableCellView">
|
||||||
<rect key="frame" x="1" y="21" width="296" height="22"/>
|
<rect key="frame" x="1" y="21" width="296" height="22"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
|
@ -101,7 +101,7 @@
|
||||||
<outlet property="pathControl" destination="f7R-TO-fmF" id="oH7-N3-JC7"/>
|
<outlet property="pathControl" destination="f7R-TO-fmF" id="oH7-N3-JC7"/>
|
||||||
</connections>
|
</connections>
|
||||||
</tableCellView>
|
</tableCellView>
|
||||||
<tableCellView identifier="BBItemView" id="2Nq-Xz-tkV" customClass="TablePathView">
|
<tableCellView identifier="BBItemView" id="2Nq-Xz-tkV" customClass="PathTableCellView">
|
||||||
<rect key="frame" x="1" y="46" width="296" height="22"/>
|
<rect key="frame" x="1" y="46" width="296" height="22"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
|
@ -146,7 +146,7 @@
|
||||||
<outlet property="ejectButton" destination="zxn-1E-o34" id="eC6-Mf-tN6"/>
|
<outlet property="ejectButton" destination="zxn-1E-o34" id="eC6-Mf-tN6"/>
|
||||||
</connections>
|
</connections>
|
||||||
</tableCellView>
|
</tableCellView>
|
||||||
<tableCellView identifier="OutputItemView" id="jQd-Ar-5uf" customClass="TablePathView">
|
<tableCellView identifier="OutputItemView" id="jQd-Ar-5uf" customClass="PathTableCellView">
|
||||||
<rect key="frame" x="1" y="71" width="296" height="22"/>
|
<rect key="frame" x="1" y="71" width="296" height="22"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
|
@ -177,12 +177,12 @@
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="textAction:" target="-2" id="N7h-6y-D8W"/>
|
<action selector="textAction:" target="-2" id="N7h-6y-D8W"/>
|
||||||
<binding destination="jQd-Ar-5uf" name="enabled" keyPath="objectValue.valid" id="1wE-NY-Vb2"/>
|
|
||||||
<binding destination="jQd-Ar-5uf" name="value" keyPath="objectValue.string" id="kXU-qJ-HKa">
|
<binding destination="jQd-Ar-5uf" name="value" keyPath="objectValue.string" id="kXU-qJ-HKa">
|
||||||
<dictionary key="options">
|
<dictionary key="options">
|
||||||
<string key="NSNullPlaceholder">/path/to/file</string>
|
<string key="NSNullPlaceholder">/path/to/file</string>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
</binding>
|
</binding>
|
||||||
|
<binding destination="jQd-Ar-5uf" name="enabled" keyPath="objectValue.valid" id="1wE-NY-Vb2"/>
|
||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
</subviews>
|
</subviews>
|
||||||
|
@ -191,6 +191,57 @@
|
||||||
<outlet property="ejectButton" destination="vG4-PP-efF" id="X2I-2N-t5r"/>
|
<outlet property="ejectButton" destination="vG4-PP-efF" id="X2I-2N-t5r"/>
|
||||||
</connections>
|
</connections>
|
||||||
</tableCellView>
|
</tableCellView>
|
||||||
|
<tableCellView identifier="MidiItemView" id="HDi-YM-iKn" customClass="MidiTableCellView">
|
||||||
|
<rect key="frame" x="1" y="96" width="296" height="22"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" id="XcO-0S-W4c">
|
||||||
|
<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="4a2-So-rxD"/>
|
||||||
|
</imageView>
|
||||||
|
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="F3v-8Z-LaF" 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="b3t-Zp-2si">
|
||||||
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
</buttonCell>
|
||||||
|
<connections>
|
||||||
|
<action selector="ejectAction:" target="-2" id="AvU-Sz-QKJ"/>
|
||||||
|
<binding destination="HDi-YM-iKn" name="enabled" keyPath="objectValue.occupied" id="ERy-Iz-T9Q"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="L2F-mj-lkr">
|
||||||
|
<rect key="frame" x="20" y="-3" width="244" height="25"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||||
|
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="CaJ-NG-vbR" id="Rac-za-bEQ">
|
||||||
|
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<menu key="menu" id="I55-5S-oM2">
|
||||||
|
<items>
|
||||||
|
<menuItem state="on" id="CaJ-NG-vbR">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
</menuItem>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</popUpButtonCell>
|
||||||
|
<connections>
|
||||||
|
<action selector="midiAction:" target="-2" id="LDL-4h-xUR"/>
|
||||||
|
<binding destination="HDi-YM-iKn" name="selectedValue" keyPath="objectValue.string" id="xjL-hx-VG3">
|
||||||
|
<dictionary key="options">
|
||||||
|
<string key="NSValueTransformerName">EmptyStringTransformer</string>
|
||||||
|
</dictionary>
|
||||||
|
</binding>
|
||||||
|
</connections>
|
||||||
|
</popUpButton>
|
||||||
|
</subviews>
|
||||||
|
<connections>
|
||||||
|
<outlet property="dragHandle" destination="XcO-0S-W4c" id="oKY-UF-LkW"/>
|
||||||
|
<outlet property="ejectButton" destination="F3v-8Z-LaF" id="ql8-4u-qCA"/>
|
||||||
|
<outlet property="popUpButton" destination="L2F-mj-lkr" id="Ktx-Yc-DIp"/>
|
||||||
|
</connections>
|
||||||
|
</tableCellView>
|
||||||
</prototypeCellViews>
|
</prototypeCellViews>
|
||||||
</tableColumn>
|
</tableColumn>
|
||||||
</tableColumns>
|
</tableColumns>
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Oz5-Xb-btk">
|
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Oz5-Xb-btk">
|
||||||
<rect key="frame" x="138" y="181" width="322" height="21"/>
|
<rect key="frame" x="138" y="159" width="322" height="21"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES"/>
|
<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">
|
<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"/>
|
<font key="font" usesAppearanceFont="YES"/>
|
||||||
|
@ -40,7 +40,7 @@
|
||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="l8V-pC-gml">
|
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="l8V-pC-gml">
|
||||||
<rect key="frame" x="138" y="150" width="322" height="21"/>
|
<rect key="frame" x="138" y="128" width="322" height="21"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES"/>
|
<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">
|
<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"/>
|
<font key="font" usesAppearanceFont="YES"/>
|
||||||
|
@ -49,12 +49,12 @@
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="wdChanged:" target="-2" id="g1P-8l-ZXi"/>
|
<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"/>
|
<binding destination="yvB-HG-64y" name="value" keyPath="values.MameWorkingDirectory" id="Kc9-Pc-XGU"/>
|
||||||
|
<binding destination="yvB-HG-64y" name="enabled" keyPath="values.UseCustomMame" id="DeG-OW-Gd2"/>
|
||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="vTJ-Ez-c1R">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="vTJ-Ez-c1R">
|
||||||
<rect key="frame" x="18" y="153" width="114" height="16"/>
|
<rect key="frame" x="18" y="131" width="114" height="16"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<textFieldCell key="cell" lineBreakMode="clipping" title="Working Directory" id="UHt-0s-zxA">
|
<textFieldCell key="cell" lineBreakMode="clipping" title="Working Directory" id="UHt-0s-zxA">
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
|
@ -63,7 +63,7 @@
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="KAN-P2-ydI">
|
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="KAN-P2-ydI">
|
||||||
<rect key="frame" x="136" y="234" width="217" height="18"/>
|
<rect key="frame" x="136" y="212" width="217" height="18"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<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">
|
<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"/>
|
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||||
|
@ -74,7 +74,7 @@
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="j7D-jC-17Q">
|
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="j7D-jC-17Q">
|
||||||
<rect key="frame" x="136" y="208" width="139" height="18"/>
|
<rect key="frame" x="136" y="186" width="139" height="18"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<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">
|
<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"/>
|
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||||
|
@ -96,7 +96,7 @@
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Qmb-Ag-Xyr">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Qmb-Ag-Xyr">
|
||||||
<rect key="frame" x="58" y="184" width="74" height="16"/>
|
<rect key="frame" x="58" y="162" width="74" height="16"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<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="MAME Path" id="Xcq-4g-Wlw">
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
|
@ -104,9 +104,20 @@
|
||||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
|
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qT7-cc-Phc">
|
||||||
|
<rect key="frame" x="136" y="234" width="118" height="18"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
|
<buttonCell key="cell" type="check" title="Use log window" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Adv-KH-abG">
|
||||||
|
<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.UseLogWindow" id="meK-Jb-s8b"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
</subviews>
|
</subviews>
|
||||||
</view>
|
</view>
|
||||||
<point key="canvasLocation" x="140" y="147"/>
|
<point key="canvasLocation" x="80" y="144"/>
|
||||||
</window>
|
</window>
|
||||||
<userDefaultsController id="KVS-Ag-1un"/>
|
<userDefaultsController id="KVS-Ag-1un"/>
|
||||||
<userDefaultsController representsSharedInstance="YES" id="yvB-HG-64y"/>
|
<userDefaultsController representsSharedInstance="YES" id="yvB-HG-64y"/>
|
||||||
|
|
14
Ample/Bookmark.h
Normal file
14
Ample/Bookmark.h
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
//
|
||||||
|
// Bookmark.h
|
||||||
|
// Ample
|
||||||
|
//
|
||||||
|
// Created by Kelvin Sherlock on 2/7/2022.
|
||||||
|
// Copyright © 2022 Kelvin Sherlock. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef Bookmark_h
|
||||||
|
#define Bookmark_h
|
||||||
|
|
||||||
|
#import "Bookmark+CoreDataClass.h"
|
||||||
|
|
||||||
|
#endif /* Bookmark_h */
|
|
@ -7,28 +7,39 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <CoreData/CoreData.h>
|
||||||
|
|
||||||
@class NSMenu;
|
@class NSMenu;
|
||||||
|
@class NSMenuItem;
|
||||||
|
@class Bookmark;
|
||||||
|
@class DiskImage;
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
@interface BookmarkManager : NSObject
|
@interface BookmarkManager : NSObject
|
||||||
|
|
||||||
@property (weak) IBOutlet NSMenu *menu;
|
@property (weak) IBOutlet NSMenu *menu;
|
||||||
|
@property (weak) IBOutlet NSMenuItem *updateMenuItem;
|
||||||
|
@property (readonly) NSManagedObjectContext *managedObjectContext;
|
||||||
|
|
||||||
|
@property (nullable) Bookmark *currentBookmark;
|
||||||
|
|
||||||
+(instancetype)sharedManager;
|
+(instancetype)sharedManager;
|
||||||
|
|
||||||
-(void)loadBookmarks;
|
-(NSString *)uniqueBookmarkName: (NSString *)name;
|
||||||
-(void)updateMenu;
|
|
||||||
|
|
||||||
-(BOOL)validateName: (NSString *)name;
|
-(NSError *)saveBookmark: (NSDictionary *)bookmark name: (NSString *)name automatic: (BOOL)automatic;
|
||||||
|
|
||||||
-(BOOL)saveBookmark: (NSDictionary *)bookmark name: (NSString *)name;
|
//-(NSError *)saveDefault: (NSDictionary *)bookmark;
|
||||||
-(NSDictionary *)loadBookmarkFromURL: (NSURL *)url;
|
|
||||||
|
|
||||||
-(BOOL)saveDefault: (NSDictionary *)bookmark;
|
-(Bookmark *)defaultBookmark;
|
||||||
-(NSDictionary *)loadDefault;
|
-(NSDictionary *)loadDefault;
|
||||||
|
|
||||||
|
-(NSError *)setAutomatic: (Bookmark *)bookmark;
|
||||||
|
|
||||||
|
-(BOOL)addDiskImage: (NSObject *)pathOrURL;
|
||||||
|
|
||||||
|
//-(void)convertLegacyBookmarks;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
NS_ASSUME_NONNULL_END
|
||||||
|
|
|
@ -9,19 +9,43 @@
|
||||||
#import "BookmarkManager.h"
|
#import "BookmarkManager.h"
|
||||||
#import "Ample.h"
|
#import "Ample.h"
|
||||||
|
|
||||||
|
#import "Bookmark.h"
|
||||||
|
#import "DiskImage.h"
|
||||||
|
#import "Menu.h"
|
||||||
|
|
||||||
|
|
||||||
@interface BookmarkManager () {
|
@interface BookmarkManager () {
|
||||||
NSArray<NSURL *> *_urls;
|
|
||||||
|
NSPersistentStoreCoordinator *_psc;
|
||||||
|
NSManagedObjectContext *_moc;
|
||||||
|
NSManagedObjectModel *_mom;
|
||||||
|
NSPersistentStore *_store;
|
||||||
|
|
||||||
|
NSFetchRequest *_defaultRequest;
|
||||||
|
|
||||||
|
|
||||||
NSURL *_bookmarkDirectory;
|
NSURL *_bookmarkDirectory;
|
||||||
|
NSArrayController *_items;
|
||||||
|
NSUInteger _newMenuGeneration;
|
||||||
|
NSUInteger _currentMenuGeneration;
|
||||||
|
|
||||||
|
Bookmark *_currentBookmark;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface BookmarkManager (MenuDelegate) <NSMenuDelegate>
|
||||||
|
@end
|
||||||
|
|
||||||
@implementation BookmarkManager
|
@implementation BookmarkManager
|
||||||
|
|
||||||
static BookmarkManager *singleton = nil;
|
static BookmarkManager *singleton = nil;
|
||||||
|
|
||||||
-(void)awakeFromNib {
|
-(void)awakeFromNib {
|
||||||
if (!singleton) singleton = self;
|
if (!singleton) {
|
||||||
|
singleton = self;
|
||||||
|
if (!_items) [self initMenus];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+(instancetype)sharedManager {
|
+(instancetype)sharedManager {
|
||||||
|
@ -31,7 +55,171 @@ static BookmarkManager *singleton = nil;
|
||||||
|
|
||||||
-(instancetype)init {
|
-(instancetype)init {
|
||||||
if (singleton) return singleton;
|
if (singleton) return singleton;
|
||||||
return [super init];
|
|
||||||
|
|
||||||
|
if ((self = [super init])) {
|
||||||
|
[self initCoreData];
|
||||||
|
|
||||||
|
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
||||||
|
|
||||||
|
[nc addObserver: self selector: @selector(willTerminate:) name: NSApplicationWillTerminateNotification object: nil];
|
||||||
|
[nc addObserver: self selector: @selector(diskImageAdded:) name: kNotificationDiskImageAdded object: nil];
|
||||||
|
|
||||||
|
|
||||||
|
_newMenuGeneration = 1;
|
||||||
|
_currentMenuGeneration = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//singleton = self;
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSManagedObjectContext *)managedObjectContext {
|
||||||
|
return _moc;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)initCoreData {
|
||||||
|
|
||||||
|
NSError *error;
|
||||||
|
BOOL new = NO;
|
||||||
|
|
||||||
|
NSBundle *bundle = [NSBundle mainBundle];
|
||||||
|
NSURL *url = [bundle URLForResource: @"Ample" withExtension: @"momd"];
|
||||||
|
_mom = [[NSManagedObjectModel alloc] initWithContentsOfURL: url];
|
||||||
|
|
||||||
|
_psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: _mom];
|
||||||
|
|
||||||
|
_moc = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSMainQueueConcurrencyType];
|
||||||
|
[_moc setPersistentStoreCoordinator: _psc];
|
||||||
|
|
||||||
|
//[_moc setMergePolicy: [NSMergePolicy rollbackMergePolicy]];
|
||||||
|
|
||||||
|
url = SupportDirectory();
|
||||||
|
#if 0
|
||||||
|
url = [url URLByAppendingPathComponent: @"Ample.db"];
|
||||||
|
|
||||||
|
if (![url checkResourceIsReachableAndReturnError: &error])
|
||||||
|
new = YES;
|
||||||
|
|
||||||
|
|
||||||
|
_store = [_psc addPersistentStoreWithType: NSSQLiteStoreType
|
||||||
|
configuration: nil
|
||||||
|
URL: url
|
||||||
|
options: nil
|
||||||
|
error: &error];
|
||||||
|
#else
|
||||||
|
|
||||||
|
url = [url URLByAppendingPathComponent: @"Ample.xml"];
|
||||||
|
|
||||||
|
if (![url checkResourceIsReachableAndReturnError: &error])
|
||||||
|
new = YES;
|
||||||
|
|
||||||
|
|
||||||
|
_store = [_psc addPersistentStoreWithType: NSXMLStoreType
|
||||||
|
configuration: nil
|
||||||
|
URL: url
|
||||||
|
options: nil
|
||||||
|
error: &error];
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
_defaultRequest = [Bookmark fetchRequest];
|
||||||
|
[_defaultRequest setPredicate: [NSPredicate predicateWithFormat: @"automatic == TRUE"]];
|
||||||
|
|
||||||
|
if (new) {
|
||||||
|
[self convertLegacyBookmarks];
|
||||||
|
[self convertLegacyDiskImages];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)willTerminate: (NSNotification *)notification {
|
||||||
|
|
||||||
|
NSError *error;
|
||||||
|
|
||||||
|
if (![_moc save: &error]) {
|
||||||
|
NSLog(@"%@", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-(void)convertLegacyBookmarks {
|
||||||
|
|
||||||
|
//NSEntityDescription *e;
|
||||||
|
|
||||||
|
//e = [NSEntityDescription entityForName: @"Bookmark" inManagedObjectContext: moc];
|
||||||
|
|
||||||
|
NSURL *url = [self bookmarkDirectory];
|
||||||
|
NSFileManager *fm = [NSFileManager defaultManager];
|
||||||
|
NSError *error = nil;
|
||||||
|
|
||||||
|
NSArray *files = [fm contentsOfDirectoryAtURL: url
|
||||||
|
includingPropertiesForKeys: nil
|
||||||
|
options: NSDirectoryEnumerationSkipsHiddenFiles
|
||||||
|
error: &error];
|
||||||
|
|
||||||
|
NSDate *now = [NSDate date];
|
||||||
|
for (NSURL *url in files) {
|
||||||
|
|
||||||
|
|
||||||
|
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfURL: url];
|
||||||
|
//NSData *data = [NSPropertyListSerialization dataWithPropertyList: dict format: NSPropertyListBinaryFormat_v1_0 options: 0 error: &error];
|
||||||
|
|
||||||
|
Bookmark *b = (Bookmark *)[NSEntityDescription insertNewObjectForEntityForName: @"Bookmark" inManagedObjectContext: _moc];
|
||||||
|
|
||||||
|
[b setName: [url lastPathComponent]];
|
||||||
|
[b setDictionary: dict];
|
||||||
|
//[b setData: data];
|
||||||
|
[b setMachine: [dict objectForKey: @"machine"]];
|
||||||
|
[b setCreated: now];
|
||||||
|
}
|
||||||
|
|
||||||
|
// default...
|
||||||
|
|
||||||
|
url = [url URLByAppendingPathComponent: @".Default"];
|
||||||
|
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfURL: url];
|
||||||
|
if (dict) {
|
||||||
|
//NSData *data = [NSPropertyListSerialization dataWithPropertyList: dict format: NSPropertyListBinaryFormat_v1_0 options: 0 error: &error];
|
||||||
|
|
||||||
|
NSString *name = [self uniqueBookmarkName: @"Default"];
|
||||||
|
Bookmark *b = (Bookmark *)[NSEntityDescription insertNewObjectForEntityForName: @"Bookmark" inManagedObjectContext: _moc];
|
||||||
|
|
||||||
|
[b setName: name];
|
||||||
|
[b setAutomatic: YES];
|
||||||
|
[b setDictionary: dict];
|
||||||
|
//[b setData: data];
|
||||||
|
[b setMachine: [dict objectForKey: @"machine"]];
|
||||||
|
[b setCreated: now];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (![_moc save: &error]) {
|
||||||
|
NSLog(@"%@", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)convertLegacyDiskImages {
|
||||||
|
|
||||||
|
NSError *error;
|
||||||
|
NSURL *sd = SupportDirectory();
|
||||||
|
NSURL *url = [sd URLByAppendingPathComponent: @"RecentDiskImages.plist"];
|
||||||
|
|
||||||
|
NSArray *array = [NSArray arrayWithContentsOfURL: url];
|
||||||
|
if (!array) return;
|
||||||
|
|
||||||
|
for (NSDictionary *d in array) {
|
||||||
|
|
||||||
|
NSManagedObject *o = [NSEntityDescription insertNewObjectForEntityForName: @"DiskImage" inManagedObjectContext: _moc];
|
||||||
|
[o setValue: [d objectForKey: @"date"] forKey: @"added"];
|
||||||
|
[o setValue: [d objectForKey: @"date"] forKey: @"accessed"];
|
||||||
|
[o setValue: [d objectForKey: @"path"] forKey: @"path"];
|
||||||
|
[o setValue: [d objectForKey: @"size"] forKey: @"size"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (![_moc save: &error]) {
|
||||||
|
NSLog(@"%@", error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
-(NSURL *)bookmarkDirectory {
|
-(NSURL *)bookmarkDirectory {
|
||||||
|
@ -48,45 +236,61 @@ static BookmarkManager *singleton = nil;
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* disallow leading .
|
|
||||||
* disallow : or / characters.
|
-(Bookmark *)defaultBookmark {
|
||||||
*/
|
|
||||||
-(BOOL)validateName: (NSString *)name {
|
NSFetchRequest *req;
|
||||||
|
NSError *error;
|
||||||
enum { kMaxLength = 128 };
|
NSArray *array;
|
||||||
unichar buffer[kMaxLength];
|
|
||||||
NSUInteger length = [name length];
|
req = [Bookmark fetchRequest];
|
||||||
if (length == 0 || length > kMaxLength) return NO;
|
[req setPredicate: [NSPredicate predicateWithFormat: @"automatic == TRUE"]];
|
||||||
[name getCharacters: buffer range: NSMakeRange(0, length)];
|
array = [_moc executeFetchRequest: req error: &error];
|
||||||
if (buffer[0] == '.') return NO;
|
|
||||||
for (unsigned i = 0; i < length; ++i) {
|
return [array firstObject];
|
||||||
unichar c = buffer[i];
|
|
||||||
if (c == ':' || c == '/') return NO;
|
|
||||||
}
|
|
||||||
return YES;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
-(NSDictionary *)loadDefault {
|
-(NSDictionary *)loadDefault {
|
||||||
NSURL *url = [self bookmarkDirectory];
|
Bookmark *b = [self defaultBookmark];
|
||||||
url = [url URLByAppendingPathComponent: @".Default"];
|
return [b dictionary];
|
||||||
|
|
||||||
NSDictionary *d;
|
|
||||||
|
|
||||||
if (@available(macOS 10.13, *)) {
|
|
||||||
NSError *error = nil;
|
|
||||||
d = [NSDictionary dictionaryWithContentsOfURL: url error: &error];
|
|
||||||
if (!d) NSLog(@"Error loading %@: %@", url, error);
|
|
||||||
} else {
|
|
||||||
d = [NSDictionary dictionaryWithContentsOfURL: url];
|
|
||||||
if (!d) NSLog(@"Error loading %@", url);
|
|
||||||
}
|
|
||||||
return d;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* save as .Default */
|
/* save as .Default */
|
||||||
-(BOOL)saveDefault: (NSDictionary *)bookmark {
|
-(NSError *)saveDefault: (NSDictionary *)bookmark {
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* check if it already exists */
|
||||||
|
|
||||||
|
NSFetchRequest *req;
|
||||||
|
NSError *error;
|
||||||
|
NSArray *array;
|
||||||
|
Bookmark *b;
|
||||||
|
NSDate *now = [NSDate date];
|
||||||
|
BOOL ok;
|
||||||
|
|
||||||
|
req = [[NSFetchRequest alloc] initWithEntityName: @"Default"];
|
||||||
|
array = [_moc executeFetchRequest: req error: &error];
|
||||||
|
|
||||||
|
|
||||||
|
b = [array firstObject];
|
||||||
|
if (b) {
|
||||||
|
[b setModified: now];
|
||||||
|
} else {
|
||||||
|
b = (Bookmark *)[NSEntityDescription insertNewObjectForEntityForName: @"Default" inManagedObjectContext: _moc];
|
||||||
|
|
||||||
|
[b setName: @"Default"];
|
||||||
|
[b setCreated: now];
|
||||||
|
}
|
||||||
|
[b setDictionary: bookmark];
|
||||||
|
[b setMachine: [bookmark objectForKey: @"machine"]];
|
||||||
|
|
||||||
|
ok = [_moc save: &error];
|
||||||
|
if (!ok) NSLog(@"%@", error);
|
||||||
|
return error;
|
||||||
|
|
||||||
|
#if 0
|
||||||
NSURL *url = [self bookmarkDirectory];
|
NSURL *url = [self bookmarkDirectory];
|
||||||
url = [url URLByAppendingPathComponent: @".Default"];
|
url = [url URLByAppendingPathComponent: @".Default"];
|
||||||
|
|
||||||
|
@ -99,116 +303,349 @@ static BookmarkManager *singleton = nil;
|
||||||
ok = [bookmark writeToURL: url atomically: YES];
|
ok = [bookmark writeToURL: url atomically: YES];
|
||||||
}
|
}
|
||||||
return ok;
|
return ok;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
-(BOOL)saveBookmark: (NSDictionary *)bookmark name: (NSString *)name {
|
|
||||||
|
-(NSError *)setAutomatic: (Bookmark *)bookmark {
|
||||||
|
|
||||||
|
NSError *error = nil;
|
||||||
|
NSFetchRequest *req = [Bookmark fetchRequest];
|
||||||
|
[req setPredicate: [NSPredicate predicateWithFormat: @"automatic == TRUE"]];
|
||||||
|
|
||||||
|
NSArray *array = [_moc executeFetchRequest: req error: &error];
|
||||||
|
for (Bookmark *b in array) {
|
||||||
|
if (b != bookmark) [b setAutomatic: NO];
|
||||||
|
}
|
||||||
|
[bookmark setAutomatic: YES];
|
||||||
|
if (error) return error;
|
||||||
|
[_moc save: &error];
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSError *)saveBookmark: (NSDictionary *)bookmark name: (NSString *)name automatic: (BOOL)automatic {
|
||||||
|
|
||||||
|
NSDate *now = [NSDate date];
|
||||||
NSError *error;
|
NSError *error;
|
||||||
NSData *data = [NSPropertyListSerialization dataWithPropertyList: bookmark
|
BOOL ok;
|
||||||
format: NSPropertyListXMLFormat_v1_0
|
|
||||||
options: 0
|
|
||||||
error: &error];
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NSURL *base = [self bookmarkDirectory];
|
|
||||||
|
|
||||||
NSURL *url = [base URLByAppendingPathComponent: name];
|
|
||||||
|
|
||||||
BOOL ok = [data writeToURL: url options: NSDataWritingWithoutOverwriting error: &error];
|
|
||||||
|
|
||||||
|
Bookmark *b = (Bookmark *)[NSEntityDescription insertNewObjectForEntityForName: @"Bookmark" inManagedObjectContext: _moc];
|
||||||
|
|
||||||
|
[b setName: name];
|
||||||
|
[b setDictionary: bookmark];
|
||||||
|
[b setMachine: [bookmark objectForKey: @"machine"]];
|
||||||
|
[b setCreated: now];
|
||||||
|
[b setAutomatic: automatic];
|
||||||
|
|
||||||
|
ok = [b validateForInsert: &error];
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
for (unsigned i = 1 ; i < 100; ++i) {
|
// will be useful, eg "name is too long"
|
||||||
NSString *tmp = [name stringByAppendingFormat: @" (%d)", i];
|
// keys: NSValidationErrorObject, NSLocalizedDescription, NSValidationErrorKey, NSValidationErrorValue
|
||||||
url = [base URLByAppendingPathComponent: tmp];
|
//NSLog(@"%@", error);
|
||||||
|
[_moc deleteObject: b];
|
||||||
ok = [data writeToURL: url options: NSDataWritingWithoutOverwriting error: &error];
|
return error;
|
||||||
if (ok) {
|
|
||||||
name = tmp;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (!ok) return NO;
|
|
||||||
|
|
||||||
if (!_menu) return YES; // ?
|
|
||||||
|
|
||||||
NSUInteger ix = [_urls indexOfObjectPassingTest: ^BOOL(NSURL *object, NSUInteger index, BOOL *stop){
|
ok = [_moc save: &error];
|
||||||
NSString *path = [object lastPathComponent];
|
if (!ok) {
|
||||||
return [name caseInsensitiveCompare: path] == NSOrderedAscending;
|
//NSLog(@"%@", error);
|
||||||
}];
|
[_moc deleteObject: b];
|
||||||
|
error = [NSError errorWithDomain: @"Ample" code: 0 userInfo: @{ NSLocalizedDescriptionKey: @"Duplicate name" }];
|
||||||
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle: name action: @selector(bookmarkMenu:) keyEquivalent: @""];
|
return error;
|
||||||
[item setRepresentedObject: url];
|
|
||||||
|
|
||||||
if (ix == NSNotFound) {
|
|
||||||
_urls = [_urls arrayByAddingObject: url];
|
|
||||||
[_menu addItem: item];
|
|
||||||
} else {
|
|
||||||
|
|
||||||
NSInteger n = [_menu numberOfItems];
|
|
||||||
[_menu insertItem: item atIndex: n - [_urls count] + ix];
|
|
||||||
NSMutableArray *tmp = [_urls mutableCopy];
|
|
||||||
|
|
||||||
[tmp insertObject: url atIndex: ix];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return YES;
|
if (automatic) {
|
||||||
|
[self setAutomatic: b];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
-(NSDictionary *)loadBookmarkFromURL: (NSURL *)url {
|
|
||||||
|
|
||||||
NSDictionary *d;
|
|
||||||
|
|
||||||
if (@available(macOS 10.13, *)) {
|
|
||||||
NSError *error = nil;
|
|
||||||
d = [NSDictionary dictionaryWithContentsOfURL: url error: &error];
|
|
||||||
if (!d) NSLog(@"Error loading %@: %@", url, error);
|
|
||||||
} else {
|
|
||||||
d = [NSDictionary dictionaryWithContentsOfURL: url];
|
|
||||||
if (!d) NSLog(@"Error loading %@", url);
|
|
||||||
}
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
-(void)loadBookmarks {
|
-(void)loadBookmarks {
|
||||||
|
|
||||||
NSURL *url = [self bookmarkDirectory];
|
NSSortDescriptor *s = [NSSortDescriptor sortDescriptorWithKey: @"name" ascending: YES selector: @selector(caseInsensitiveCompare:)];
|
||||||
|
|
||||||
NSFileManager *fm = [NSFileManager defaultManager];
|
|
||||||
|
|
||||||
NSError *error = nil;
|
|
||||||
|
|
||||||
NSArray *files = [fm contentsOfDirectoryAtURL: url
|
|
||||||
includingPropertiesForKeys: nil
|
|
||||||
options: NSDirectoryEnumerationSkipsHiddenFiles
|
|
||||||
error: &error];
|
|
||||||
|
|
||||||
// bleh, has to create 2 new NSStrings for every comparison
|
_items = [NSArrayController new];
|
||||||
files = [files sortedArrayUsingComparator: ^(NSURL *a, NSURL *b){
|
[_items setManagedObjectContext: _moc];
|
||||||
NSString *aa = [a lastPathComponent];
|
[_items setAvoidsEmptySelection: NO];
|
||||||
NSString *bb = [b lastPathComponent];
|
[_items setAutomaticallyPreparesContent: YES];
|
||||||
return [aa caseInsensitiveCompare: bb];
|
[_items setAutomaticallyRearrangesObjects: YES];
|
||||||
}];
|
[_items setEntityName: @"Bookmark"];
|
||||||
|
[_items setSortDescriptors: @[ s ]];
|
||||||
|
|
||||||
_urls = files;
|
[_items fetch: nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
-(void)updateMenu {
|
|
||||||
|
/* extract the number from a trailing " (%d)" */
|
||||||
|
static int extract_number(NSString *s, NSInteger offset) {
|
||||||
|
|
||||||
NSArray *menus = [_menu itemArray];
|
unichar buffer[32];
|
||||||
|
NSInteger len = [s length] - offset;
|
||||||
|
unichar c;
|
||||||
|
int i;
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
if (len < 4) return -1; /* " (1)"*/
|
||||||
|
if (len > 8) return -1; /* " (99999)" */
|
||||||
|
|
||||||
|
NSRange r = NSMakeRange(offset, len);
|
||||||
|
[s getCharacters: buffer range: r];
|
||||||
|
|
||||||
|
buffer[len] = 0;
|
||||||
|
i = 0;
|
||||||
|
if (buffer[i++] != ' ') return -1;
|
||||||
|
if (buffer[i++] != '(') return -1;
|
||||||
|
|
||||||
|
c = buffer[i++];
|
||||||
|
if (c < '1' || c > '9') return -1;
|
||||||
|
n = c - '0';
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
c = buffer[i];
|
||||||
|
if (c < '0' || c > '9') break;
|
||||||
|
n = n * 10 + (c - '0');
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buffer[i++] != ')') return -1;
|
||||||
|
if (buffer[i++] != 0) return -1;
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-(NSString *)uniqueBookmarkName: (NSString *)name {
|
||||||
|
|
||||||
|
NSInteger length = [name length];
|
||||||
|
|
||||||
|
NSError *error = nil;
|
||||||
|
NSPredicate *p = [NSPredicate predicateWithFormat: @"name BEGINSWITH %@", name];
|
||||||
|
NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName: @"Bookmark"];
|
||||||
|
[req setPredicate: p];
|
||||||
|
|
||||||
|
NSArray *array = [_moc executeFetchRequest: req error: &error];
|
||||||
|
if (![array count]) return name;
|
||||||
|
|
||||||
|
uint64_t bits = 1; /* mark 0 as unavailable */
|
||||||
|
NSInteger max = 0;
|
||||||
|
BOOL exact = NO;
|
||||||
|
for (Bookmark *b in array) {
|
||||||
|
NSString *s = [b name];
|
||||||
|
if ([name isEqualToString: s]) {
|
||||||
|
exact = YES;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int n = extract_number(s, length);
|
||||||
|
if (n < 1) continue;
|
||||||
|
if (n > max) max = n;
|
||||||
|
if (n < 64)
|
||||||
|
bits |= (1 << n);
|
||||||
|
}
|
||||||
|
if (!exact) return name;
|
||||||
|
|
||||||
|
if (bits == (uint64_t)-1) {
|
||||||
|
return [name stringByAppendingFormat: @" (%u)", (int)(max + 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
int ix = 0;
|
||||||
|
while (bits & 0x01) {
|
||||||
|
++ix;
|
||||||
|
bits >>= 1;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// this doesn't work correctly.
|
||||||
|
int ix = __builtin_ffsll(~bits);
|
||||||
|
#endif
|
||||||
|
return [name stringByAppendingFormat: @" (%u)", ix];
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-(BOOL)addDiskImage: (NSObject *)pathOrURL {
|
||||||
|
|
||||||
|
NSError *error;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
NSFileManager *fm = [NSFileManager defaultManager];
|
||||||
|
|
||||||
|
|
||||||
|
NSDictionary *attr = [fm attributesOfItemAtPath: path error: &error];
|
||||||
|
if (error) {
|
||||||
|
NSLog(@"%@ : %@", path, error);
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSNumber *size = [attr objectForKey: NSFileSize];
|
||||||
|
|
||||||
|
NSDate *now = [NSDate date];
|
||||||
|
|
||||||
|
NSPredicate *p = [NSPredicate predicateWithFormat: @"path = %@", path];
|
||||||
|
NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName: @"DiskImage"];
|
||||||
|
[req setPredicate: p];
|
||||||
|
|
||||||
|
|
||||||
|
NSArray *array = [_moc executeFetchRequest: req error: &error];
|
||||||
|
BOOL found = 0;
|
||||||
|
for (NSManagedObject *o in array) {
|
||||||
|
found = YES;
|
||||||
|
[o setValue: now forKey: @"accessed"];
|
||||||
|
}
|
||||||
|
if (found) return NO;
|
||||||
|
|
||||||
|
DiskImage *o = [NSEntityDescription insertNewObjectForEntityForName: @"DiskImage" inManagedObjectContext: _moc];
|
||||||
|
|
||||||
|
|
||||||
|
[o setPath: path];
|
||||||
|
[o setAdded: now];
|
||||||
|
[o setAccessed: now];
|
||||||
|
[o setSize: [size longLongValue]];
|
||||||
|
[o updatePath];
|
||||||
|
|
||||||
|
if (![_moc save: &error]) {
|
||||||
|
NSLog(@"%@", error);
|
||||||
|
[_moc deleteObject: o];
|
||||||
|
}
|
||||||
|
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)diskImageAdded: (NSNotification *)notification {
|
||||||
|
|
||||||
|
NSURL *url = [notification object];
|
||||||
|
if (url) [self addDiskImage: url];
|
||||||
|
}
|
||||||
|
|
||||||
|
static NSString *kMenuContext = @"";
|
||||||
|
|
||||||
|
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
|
||||||
|
if (context == (__bridge void * _Nullable)(kMenuContext)) {
|
||||||
|
|
||||||
|
//NSLog(@"observeValueForKeyPath %@", keyPath);
|
||||||
|
|
||||||
|
_newMenuGeneration++;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
[super observeValueForKeyPath: keyPath ofObject: object change: change context: context];
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)initMenus {
|
||||||
|
|
||||||
|
if (!_items) {
|
||||||
|
[self loadBookmarks];
|
||||||
|
[_items addObserver: self forKeyPath: @"arrangedObjects.name" options: 0 context: (__bridge void * _Nullable)(kMenuContext)];
|
||||||
|
[_items addObserver: self forKeyPath: @"arrangedObjects.automatic" options: 0 context: (__bridge void * _Nullable)(kMenuContext)];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
-(IBAction)bookmarkMenu:(id)sender
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
-(Bookmark *)currentBookmark {
|
||||||
|
return _currentBookmark;
|
||||||
|
}
|
||||||
|
-(void)setCurrentBookmark:(Bookmark *)currentBookmark {
|
||||||
|
if (currentBookmark == _currentBookmark) return;
|
||||||
|
_currentBookmark = currentBookmark;
|
||||||
|
_newMenuGeneration++;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)menuNeedsUpdate:(NSMenu *)menu {
|
||||||
|
|
||||||
|
if (_currentMenuGeneration == _newMenuGeneration) return;
|
||||||
|
_currentMenuGeneration = _newMenuGeneration;
|
||||||
|
|
||||||
|
if (_currentBookmark && _updateMenuItem) {
|
||||||
|
NSString *title = [NSString stringWithFormat: @"Update “%@”", [_currentBookmark name]];
|
||||||
|
[_updateMenuItem setHidden: NO];
|
||||||
|
[_updateMenuItem setTitle: title];
|
||||||
|
[_updateMenuItem setRepresentedObject: _currentBookmark];
|
||||||
|
} else {
|
||||||
|
[_updateMenuItem setHidden: YES];
|
||||||
|
[_updateMenuItem setRepresentedObject: nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
NSArray *menus = [menu itemArray];
|
||||||
for (NSMenuItem *item in [menus reverseObjectEnumerator]) {
|
for (NSMenuItem *item in [menus reverseObjectEnumerator]) {
|
||||||
if ([item tag] == 0xdeadbeef) [_menu removeItem: item];
|
if ([item tag] == 0xdeadbeef) [_menu removeItem: item];
|
||||||
}
|
}
|
||||||
for (NSURL *url in _urls) {
|
|
||||||
NSString *title = [url lastPathComponent]; // [[url lastPathComponent] stringByDeletingPathExtension];
|
|
||||||
|
|
||||||
NSMenuItem *item = [_menu addItemWithTitle: title action: @selector(bookmarkMenu:) keyEquivalent: @""];
|
NSArray *array = [_items arrangedObjects];
|
||||||
[item setRepresentedObject: url];
|
for (Bookmark *b in array) {
|
||||||
|
|
||||||
|
NSString *title = [b name];
|
||||||
|
NSMenuItem *item = [menu addItemWithTitle: title action: @selector(bookmarkMenu:) keyEquivalent: @""];
|
||||||
|
[item setRepresentedObject: b];
|
||||||
[item setTag: 0xdeadbeef];
|
[item setTag: 0xdeadbeef];
|
||||||
|
if ([b automatic]) {
|
||||||
|
|
||||||
|
[item setOnStateImage: [NSImage imageNamed: NSImageNameStatusAvailable]];
|
||||||
|
[item setState: NSOnState];
|
||||||
|
}
|
||||||
|
//if ([b automatic]) [item setAttributedTitle: ItalicMenuString([b name])];
|
||||||
|
//[item setState: [b automatic] ? NSMixedState : NSOffState];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
/* MacOS 12.1+ doesn't like class clusters in nibs -
|
||||||
|
|
||||||
|
[General] This coder is expecting the replaced object 0x600000938f60 to be returned from
|
||||||
|
NSClassSwapper.initWithCoder instead of <BookmarkManager: 0x600000905da0>
|
||||||
|
|
||||||
|
*/
|
||||||
|
@interface BookmarkManagerProxy : NSProxy {
|
||||||
|
BookmarkManager *_target;
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation BookmarkManagerProxy
|
||||||
|
|
||||||
|
-(id)init {
|
||||||
|
_target = [BookmarkManager sharedManager];
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
|
||||||
|
return [_target methodSignatureForSelector: sel];
|
||||||
|
}
|
||||||
|
|
||||||
|
+(BOOL)respondsToSelector:(SEL)aSelector {
|
||||||
|
return [BookmarkManager respondsToSelector: aSelector];
|
||||||
|
}
|
||||||
|
-(void)forwardInvocation:(NSInvocation *)invocation {
|
||||||
|
if ([_target respondsToSelector: [invocation selector]]) {
|
||||||
|
[invocation invokeWithTarget: _target];
|
||||||
|
} else {
|
||||||
|
[super forwardInvocation: invocation];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
19
Ample/BookmarkWindowController.h
Normal file
19
Ample/BookmarkWindowController.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
//
|
||||||
|
// BookmarkWindowController.h
|
||||||
|
// Ample
|
||||||
|
//
|
||||||
|
// Created by Kelvin Sherlock on 2/6/2022.
|
||||||
|
// Copyright © 2022 Kelvin Sherlock. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface BookmarkWindowController : NSWindowController
|
||||||
|
|
||||||
|
+(instancetype)sharedInstance;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
170
Ample/BookmarkWindowController.m
Normal file
170
Ample/BookmarkWindowController.m
Normal file
|
@ -0,0 +1,170 @@
|
||||||
|
//
|
||||||
|
// BookmarkWindowController.m
|
||||||
|
// Ample
|
||||||
|
//
|
||||||
|
// Created by Kelvin Sherlock on 2/6/2022.
|
||||||
|
// Copyright © 2022 Kelvin Sherlock. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "BookmarkWindowController.h"
|
||||||
|
#import "BookmarkManager.h"
|
||||||
|
#import "Bookmark.h"
|
||||||
|
#import "Ample.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@interface BookmarkWindowController ()
|
||||||
|
@property (strong) IBOutlet NSArrayController *arrayController;
|
||||||
|
@property (strong) IBOutlet BookmarkManager *bookmarkManager;
|
||||||
|
|
||||||
|
@property (weak) IBOutlet NSTableView *tableView;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation BookmarkWindowController
|
||||||
|
|
||||||
|
|
||||||
|
+(instancetype)sharedInstance {
|
||||||
|
static BookmarkWindowController *me = nil;
|
||||||
|
if (!me) {
|
||||||
|
me = [self new];
|
||||||
|
}
|
||||||
|
return me;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSString *)windowNibName {
|
||||||
|
return @"BookmarkWindow";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (void)windowDidLoad {
|
||||||
|
[super windowDidLoad];
|
||||||
|
|
||||||
|
NSSortDescriptor *s = [NSSortDescriptor sortDescriptorWithKey: @"name" ascending: YES selector: @selector(caseInsensitiveCompare:)];
|
||||||
|
|
||||||
|
[_arrayController setSortDescriptors: @[s]];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
-(BOOL)windowShouldClose: (NSWindow *)sender {
|
||||||
|
|
||||||
|
NSManagedObjectContext *moc = [_arrayController managedObjectContext];
|
||||||
|
NSError *error;
|
||||||
|
|
||||||
|
if (![_arrayController commitEditing]) return NO;
|
||||||
|
|
||||||
|
if ([moc save: &error]) return YES;
|
||||||
|
NSLog(@"%@", error);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
NSDictionary *dict = [error userInfo];
|
||||||
|
NSArray *array = [dict objectForKey: @"conflictList"];
|
||||||
|
for (NSConstraintConflict *c in array) {
|
||||||
|
|
||||||
|
NSArray * arr = [c conflictingObjects];
|
||||||
|
for (NSManagedObject *o in arr) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return YES;
|
||||||
|
|
||||||
|
//[self presentError: error];
|
||||||
|
//return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)keyDown:(NSEvent *)event {
|
||||||
|
/* Carbon/Events.h */
|
||||||
|
enum {
|
||||||
|
kVK_Delete = 0x33,
|
||||||
|
kVK_ForwardDelete = 0x75,
|
||||||
|
|
||||||
|
};
|
||||||
|
unsigned short keyCode = [event keyCode];
|
||||||
|
|
||||||
|
if (keyCode == kVK_Delete || keyCode == kVK_ForwardDelete) {
|
||||||
|
|
||||||
|
// arraycontroller selected object / selected index doesn't work right.
|
||||||
|
|
||||||
|
NSInteger row = [_tableView selectedRow];
|
||||||
|
if (row >= 0)
|
||||||
|
[_arrayController removeObjectAtArrangedObjectIndex: row];
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-(Bookmark *)clickedItem {
|
||||||
|
|
||||||
|
NSArray *array = [_arrayController arrangedObjects];
|
||||||
|
NSInteger row = [_tableView clickedRow];
|
||||||
|
if (row < 0 || row >= [array count]) return nil;
|
||||||
|
return [array objectAtIndex: row];
|
||||||
|
}
|
||||||
|
|
||||||
|
-(IBAction)doubleClick:(id)sender {
|
||||||
|
|
||||||
|
Bookmark *b = [self clickedItem];
|
||||||
|
if (!b) return;
|
||||||
|
|
||||||
|
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
||||||
|
|
||||||
|
[nc postNotificationName: kNotificationBookmarkMagicRoute object: b];
|
||||||
|
}
|
||||||
|
|
||||||
|
-(IBAction)toggleDefault:(id)sender {
|
||||||
|
NSLog(@"%@", sender);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
-(IBAction)setDefault:(id)sender {
|
||||||
|
|
||||||
|
Bookmark *b = [self clickedItem];
|
||||||
|
if (!b) return;
|
||||||
|
|
||||||
|
[_bookmarkManager setAutomatic: b];
|
||||||
|
}
|
||||||
|
|
||||||
|
-(IBAction)clearDefault:(id)sender {
|
||||||
|
|
||||||
|
Bookmark *b = [self clickedItem];
|
||||||
|
if (!b) return;
|
||||||
|
|
||||||
|
[b setAutomatic: NO];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-(IBAction)deleteBookmark:(id)sender {
|
||||||
|
|
||||||
|
//Bookmark *b = [self clickedItem];
|
||||||
|
//if (!b) return;
|
||||||
|
|
||||||
|
NSInteger row = [_tableView clickedRow];
|
||||||
|
if (row >= 0)
|
||||||
|
[_arrayController removeObjectAtArrangedObjectIndex: row];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation BookmarkWindowController (Menu)
|
||||||
|
|
||||||
|
-(BOOL)validateMenuItem:(NSMenuItem *)menuItem {
|
||||||
|
|
||||||
|
Bookmark *b = [self clickedItem];
|
||||||
|
|
||||||
|
if (!b) return NO;
|
||||||
|
SEL action = [menuItem action];
|
||||||
|
|
||||||
|
if (action == @selector(clearDefault:)) {
|
||||||
|
return [b automatic];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (action == @selector(setDefault:)) {
|
||||||
|
return ![b automatic];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -0,0 +1,29 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="15702" systemVersion="18G9323" minimumToolsVersion="Automatic" sourceLanguage="Objective-C" userDefinedModelVersionIdentifier="0">
|
||||||
|
<entity name="Bookmark" representedClassName="Bookmark" syncable="YES">
|
||||||
|
<attribute name="automatic" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
|
<attribute name="comment" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="created" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="data" attributeType="Binary"/>
|
||||||
|
<attribute name="machine" optional="YES" attributeType="String"/>
|
||||||
|
<attribute name="modified" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="name" attributeType="String" minValueString="1" maxValueString="32"/>
|
||||||
|
<fetchIndex name="Bookmark_name">
|
||||||
|
<fetchIndexElement property="name" type="Binary" order="ascending"/>
|
||||||
|
</fetchIndex>
|
||||||
|
</entity>
|
||||||
|
<entity name="DiskImage" representedClassName="DiskImage" syncable="YES">
|
||||||
|
<attribute name="accessed" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="added" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="name" optional="YES" transient="YES" attributeType="String"/>
|
||||||
|
<attribute name="path" attributeType="String"/>
|
||||||
|
<attribute name="size" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/>
|
||||||
|
<fetchIndex name="DiskImage_path">
|
||||||
|
<fetchIndexElement property="path" type="Binary" order="ascending"/>
|
||||||
|
</fetchIndex>
|
||||||
|
</entity>
|
||||||
|
<elements>
|
||||||
|
<element name="Bookmark" positionX="994.5546875" positionY="-404.046875" width="128" height="148"/>
|
||||||
|
<element name="DiskImage" positionX="1242" positionY="-333" width="128" height="118"/>
|
||||||
|
</elements>
|
||||||
|
</model>
|
25
Ample/Core Data/Bookmark+CoreDataClass.h
Normal file
25
Ample/Core Data/Bookmark+CoreDataClass.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
//
|
||||||
|
// Bookmark+CoreDataClass.h
|
||||||
|
// Ample
|
||||||
|
//
|
||||||
|
// Created by Kelvin Sherlock on 2/6/2022.
|
||||||
|
// Copyright © 2022 Kelvin Sherlock. All rights reserved.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <CoreData/CoreData.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface Bookmark : NSManagedObject
|
||||||
|
|
||||||
|
@property NSDictionary *dictionary;
|
||||||
|
|
||||||
|
+(NSString *)uniqueName: (NSString *)name inContext: (NSManagedObjectContext *)context;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
||||||
|
|
||||||
|
#import "Bookmark+CoreDataProperties.h"
|
175
Ample/Core Data/Bookmark+CoreDataClass.m
Normal file
175
Ample/Core Data/Bookmark+CoreDataClass.m
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
//
|
||||||
|
// Bookmark+CoreDataClass.m
|
||||||
|
// Ample
|
||||||
|
//
|
||||||
|
// Created by Kelvin Sherlock on 2/6/2022.
|
||||||
|
// Copyright © 2022 Kelvin Sherlock. All rights reserved.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "Bookmark+CoreDataClass.h"
|
||||||
|
|
||||||
|
@implementation Bookmark
|
||||||
|
|
||||||
|
/* extract the number from a trailing " (%d)" */
|
||||||
|
static int extract_number(NSString *s, NSInteger offset) {
|
||||||
|
|
||||||
|
unichar buffer[32];
|
||||||
|
NSInteger len = [s length] - offset;
|
||||||
|
unichar c;
|
||||||
|
int i;
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
if (len < 4) return -1; /* " (1)"*/
|
||||||
|
if (len > 6) return -1; /* " (999)" */
|
||||||
|
|
||||||
|
NSRange r = NSMakeRange(offset, len);
|
||||||
|
[s getCharacters: buffer range: r];
|
||||||
|
|
||||||
|
buffer[len] = 0;
|
||||||
|
i = 0;
|
||||||
|
if (buffer[i++] != ' ') return -1;
|
||||||
|
if (buffer[i++] != '(') return -1;
|
||||||
|
|
||||||
|
c = buffer[i++];
|
||||||
|
if (c < '1' || c > '9') return -1;
|
||||||
|
n = c - '0';
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
c = buffer[i];
|
||||||
|
if (c < '0' || c > '9') break;
|
||||||
|
n = n * 10 + (c - '0');
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buffer[i++] != ')') return -1;
|
||||||
|
if (buffer[i++] != 0) return -1;
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
+(NSString *)uniqueName: (NSString *)name inContext: (NSManagedObjectContext *)context {
|
||||||
|
|
||||||
|
NSInteger length = [name length];
|
||||||
|
|
||||||
|
NSError *error = nil;
|
||||||
|
NSPredicate *p = [NSPredicate predicateWithFormat: @"name BEGINSWITH %@", name];
|
||||||
|
NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName: @"Bookmark"];
|
||||||
|
[req setPredicate: p];
|
||||||
|
|
||||||
|
NSArray *array = [context executeFetchRequest: req error: &error];
|
||||||
|
if (![array count]) return name;
|
||||||
|
|
||||||
|
uint64_t bits = 1; /* mark 0 as unavailable */
|
||||||
|
NSInteger max = 0;
|
||||||
|
BOOL exact = NO;
|
||||||
|
for (Bookmark *b in array) {
|
||||||
|
NSString *s = [b name];
|
||||||
|
if ([name isEqualToString: s]) {
|
||||||
|
exact = YES;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int n = extract_number(s, length);
|
||||||
|
if (n < 1) continue;
|
||||||
|
if (n > max) max = n;
|
||||||
|
if (n < 64)
|
||||||
|
bits |= (1 << n);
|
||||||
|
}
|
||||||
|
if (!exact) return name;
|
||||||
|
|
||||||
|
if (bits == (uint64_t)-1) {
|
||||||
|
if (max == 999) return nil;
|
||||||
|
return [name stringByAppendingFormat: @" (%u)", (int)(max + 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
int ix = 0;
|
||||||
|
while (bits) {
|
||||||
|
++ix;
|
||||||
|
bits >>= 1;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// this doesn't work correctly.
|
||||||
|
int ix = __builtin_ffsll(~bits);
|
||||||
|
#endif
|
||||||
|
return [name stringByAppendingFormat: @" (%u)", ix];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)setDictionary:(NSDictionary *)dictionary {
|
||||||
|
|
||||||
|
NSData *data;
|
||||||
|
NSError *error = nil;
|
||||||
|
|
||||||
|
data = [NSPropertyListSerialization dataWithPropertyList: dictionary
|
||||||
|
format: NSPropertyListBinaryFormat_v1_0
|
||||||
|
options: 0
|
||||||
|
error: &error];
|
||||||
|
|
||||||
|
[self setData: data];
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSDictionary *)dictionary {
|
||||||
|
|
||||||
|
// NSDictionary *dict;
|
||||||
|
NSData *data = [self data];
|
||||||
|
NSError *error = nil;
|
||||||
|
|
||||||
|
return [NSPropertyListSerialization propertyListWithData: data
|
||||||
|
options: 0
|
||||||
|
format: nil
|
||||||
|
error: &error];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (NSError *)errorFromOriginalError:(NSError *)originalError error:(NSError*)secondError
|
||||||
|
{
|
||||||
|
NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
|
||||||
|
NSMutableArray *errors = [NSMutableArray arrayWithObject:secondError];
|
||||||
|
if ([originalError code] == NSValidationMultipleErrorsError) {
|
||||||
|
[userInfo addEntriesFromDictionary:[originalError userInfo]];
|
||||||
|
[errors addObjectsFromArray:[userInfo objectForKey:NSDetailedErrorsKey]];
|
||||||
|
} else {
|
||||||
|
[errors addObject:originalError];
|
||||||
|
}
|
||||||
|
[userInfo setObject:errors forKey:NSDetailedErrorsKey];
|
||||||
|
return [NSError errorWithDomain:NSCocoaErrorDomain code:NSValidationMultipleErrorsError userInfo:userInfo];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)validateName:(id*)ioValue error:(NSError**)outError {
|
||||||
|
|
||||||
|
if (!ioValue || !*ioValue) return YES;
|
||||||
|
NSString *name = *ioValue;
|
||||||
|
|
||||||
|
NSFetchRequest *frq = [NSFetchRequest fetchRequestWithEntityName: @"Bookmark"];
|
||||||
|
|
||||||
|
NSPredicate *p = [NSPredicate predicateWithFormat: @"name = %@", name];
|
||||||
|
[frq setPredicate: p];
|
||||||
|
|
||||||
|
NSArray * arr = [[self managedObjectContext] executeFetchRequest: frq error: nil];
|
||||||
|
BOOL dupe = NO;
|
||||||
|
for (Bookmark *b in arr) {
|
||||||
|
if (b == self) continue;
|
||||||
|
dupe = YES;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (dupe && outError) {
|
||||||
|
NSDictionary *dict = @{ NSLocalizedFailureReasonErrorKey: @"duplicate name",
|
||||||
|
NSLocalizedDescriptionKey: @"duplicate name",
|
||||||
|
NSValidationKeyErrorKey: @"name",
|
||||||
|
NSValidationValueErrorKey: name,
|
||||||
|
NSValidationObjectErrorKey: self
|
||||||
|
};
|
||||||
|
NSError *e = [NSError errorWithDomain: @"Ample" code: 1 userInfo: dict];
|
||||||
|
|
||||||
|
if (*outError) {
|
||||||
|
*outError = [self errorFromOriginalError: *outError error: e];
|
||||||
|
} else {
|
||||||
|
*outError = e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return !dupe;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
28
Ample/Core Data/Bookmark+CoreDataProperties.h
Normal file
28
Ample/Core Data/Bookmark+CoreDataProperties.h
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
//
|
||||||
|
// Bookmark+CoreDataProperties.h
|
||||||
|
// Ample
|
||||||
|
//
|
||||||
|
// Created by Kelvin Sherlock on 2/6/2022.
|
||||||
|
// Copyright © 2022 Kelvin Sherlock. All rights reserved.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "Bookmark+CoreDataClass.h"
|
||||||
|
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface Bookmark (CoreDataProperties)
|
||||||
|
|
||||||
|
+ (NSFetchRequest<Bookmark *> *)fetchRequest;
|
||||||
|
|
||||||
|
@property (nullable, nonatomic, copy) NSString *name;
|
||||||
|
@property (nullable, nonatomic, copy) NSString *machine;
|
||||||
|
@property (nullable, nonatomic, retain) NSData *data;
|
||||||
|
@property (nullable, nonatomic, copy) NSDate *created;
|
||||||
|
@property (nullable, nonatomic, copy) NSDate *modified;
|
||||||
|
@property (nullable, nonatomic, copy) NSString *comment;
|
||||||
|
@property (nonatomic) BOOL automatic;
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
26
Ample/Core Data/Bookmark+CoreDataProperties.m
Normal file
26
Ample/Core Data/Bookmark+CoreDataProperties.m
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
//
|
||||||
|
// Bookmark+CoreDataProperties.m
|
||||||
|
// Ample
|
||||||
|
//
|
||||||
|
// Created by Kelvin Sherlock on 2/6/2022.
|
||||||
|
// Copyright © 2022 Kelvin Sherlock. All rights reserved.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "Bookmark+CoreDataProperties.h"
|
||||||
|
|
||||||
|
@implementation Bookmark (CoreDataProperties)
|
||||||
|
|
||||||
|
+ (NSFetchRequest<Bookmark *> *)fetchRequest {
|
||||||
|
return [NSFetchRequest fetchRequestWithEntityName:@"Bookmark"];
|
||||||
|
}
|
||||||
|
|
||||||
|
@dynamic name;
|
||||||
|
@dynamic machine;
|
||||||
|
@dynamic data;
|
||||||
|
@dynamic created;
|
||||||
|
@dynamic modified;
|
||||||
|
@dynamic comment;
|
||||||
|
@dynamic automatic;
|
||||||
|
|
||||||
|
@end
|
21
Ample/Core Data/DiskImage+CoreDataClass.h
Normal file
21
Ample/Core Data/DiskImage+CoreDataClass.h
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
//
|
||||||
|
// DiskImage+CoreDataClass.h
|
||||||
|
// Ample
|
||||||
|
//
|
||||||
|
// Created by Kelvin Sherlock on 2/7/2022.
|
||||||
|
// Copyright © 2022 Kelvin Sherlock. All rights reserved.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <CoreData/CoreData.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface DiskImage : NSManagedObject
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
||||||
|
|
||||||
|
#import "DiskImage+CoreDataProperties.h"
|
14
Ample/Core Data/DiskImage+CoreDataClass.m
Normal file
14
Ample/Core Data/DiskImage+CoreDataClass.m
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
//
|
||||||
|
// DiskImage+CoreDataClass.m
|
||||||
|
// Ample
|
||||||
|
//
|
||||||
|
// Created by Kelvin Sherlock on 2/7/2022.
|
||||||
|
// Copyright © 2022 Kelvin Sherlock. All rights reserved.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "DiskImage+CoreDataClass.h"
|
||||||
|
|
||||||
|
@implementation DiskImage
|
||||||
|
|
||||||
|
@end
|
29
Ample/Core Data/DiskImage+CoreDataProperties.h
Normal file
29
Ample/Core Data/DiskImage+CoreDataProperties.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
//
|
||||||
|
// DiskImage+CoreDataProperties.h
|
||||||
|
// Ample
|
||||||
|
//
|
||||||
|
// Created by Kelvin Sherlock on 2/7/2022.
|
||||||
|
// Copyright © 2022 Kelvin Sherlock. All rights reserved.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "DiskImage+CoreDataClass.h"
|
||||||
|
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface DiskImage (CoreDataProperties)
|
||||||
|
|
||||||
|
+ (NSFetchRequest<DiskImage *> *)fetchRequest;
|
||||||
|
|
||||||
|
@property (nullable, nonatomic, copy) NSString *path;
|
||||||
|
@property (nullable, nonatomic, copy) NSDate *added;
|
||||||
|
@property (nonatomic) int64_t size;
|
||||||
|
@property (nullable, nonatomic, copy) NSDate *accessed;
|
||||||
|
@property (nullable, nonatomic, copy) NSString *name;
|
||||||
|
|
||||||
|
-(void)updatePath;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
52
Ample/Core Data/DiskImage+CoreDataProperties.m
Normal file
52
Ample/Core Data/DiskImage+CoreDataProperties.m
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
//
|
||||||
|
// DiskImage+CoreDataProperties.m
|
||||||
|
// Ample
|
||||||
|
//
|
||||||
|
// Created by Kelvin Sherlock on 2/7/2022.
|
||||||
|
// Copyright © 2022 Kelvin Sherlock. All rights reserved.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "DiskImage+CoreDataProperties.h"
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
@interface DiskImage () {
|
||||||
|
NSString *_name;
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@implementation DiskImage (CoreDataProperties)
|
||||||
|
|
||||||
|
+ (NSFetchRequest<DiskImage *> *)fetchRequest {
|
||||||
|
return [NSFetchRequest fetchRequestWithEntityName:@"DiskImage"];
|
||||||
|
}
|
||||||
|
|
||||||
|
@dynamic path;
|
||||||
|
@dynamic added;
|
||||||
|
@dynamic size;
|
||||||
|
@dynamic accessed;
|
||||||
|
@dynamic name;
|
||||||
|
|
||||||
|
-(void)updatePath {
|
||||||
|
|
||||||
|
NSString *path = [self primitiveValueForKey: @"path"];
|
||||||
|
[self setName: [path lastPathComponent]];
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)awakeFromFetch {
|
||||||
|
[super awakeFromFetch];
|
||||||
|
|
||||||
|
[self updatePath];
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
-(void)awakeFromInsert {
|
||||||
|
[super awakeFromInsert];
|
||||||
|
|
||||||
|
NSString *path = [self primitiveValueForKey: @"path"];
|
||||||
|
[self setName: [path lastPathComponent]];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@end
|
|
@ -3,7 +3,7 @@
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>MameComponentsDate</key>
|
<key>MameComponentsDate</key>
|
||||||
<date>2021-07-28T16:00:00Z</date>
|
<date>2024-04-25T12:00:00Z</date>
|
||||||
<key>UseCustomMame</key>
|
<key>UseCustomMame</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>AutoCloseLogWindow</key>
|
<key>AutoCloseLogWindow</key>
|
||||||
|
@ -15,7 +15,9 @@
|
||||||
<key>NSQuitAlwaysKeepsWindows</key>
|
<key>NSQuitAlwaysKeepsWindows</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>DefaultDownloadURL</key>
|
<key>DefaultDownloadURL</key>
|
||||||
<string>https://archive.org/download/mame0232repo</string>
|
<string>https://archive.org/download/mame-merged/mame-merged</string>
|
||||||
|
<key>UseLogWindow</key>
|
||||||
|
<true/>
|
||||||
<key>DefaultDownloadExtension</key>
|
<key>DefaultDownloadExtension</key>
|
||||||
<string>zip</string>
|
<string>zip</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
|
14
Ample/DiskImage.h
Normal file
14
Ample/DiskImage.h
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
//
|
||||||
|
// DiskImage.h
|
||||||
|
// Ample
|
||||||
|
//
|
||||||
|
// Created by Kelvin Sherlock on 2/7/2022.
|
||||||
|
// Copyright © 2022 Kelvin Sherlock. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef DiskImage_h
|
||||||
|
#define DiskImage_h
|
||||||
|
|
||||||
|
#import "DiskImage+CoreDataClass.h"
|
||||||
|
|
||||||
|
#endif /* DiskImage_h */
|
|
@ -9,19 +9,18 @@
|
||||||
#import "DiskImagesWindowController.h"
|
#import "DiskImagesWindowController.h"
|
||||||
#import "TableCellView.h"
|
#import "TableCellView.h"
|
||||||
#import "Ample.h"
|
#import "Ample.h"
|
||||||
|
#import "DiskImage.h"
|
||||||
|
|
||||||
|
#import "BookmarkManager.h"
|
||||||
|
|
||||||
@interface DiskImagesWindowController ()
|
@interface DiskImagesWindowController ()
|
||||||
@property (weak) IBOutlet NSTableView *tableView;
|
@property (weak) IBOutlet NSTableView *tableView;
|
||||||
@property (strong) IBOutlet NSArrayController *arrayController;
|
@property (strong) IBOutlet NSArrayController *arrayController;
|
||||||
@property (strong) NSMutableArray *content;
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation DiskImagesWindowController {
|
@implementation DiskImagesWindowController {
|
||||||
BOOL _dirty;
|
|
||||||
NSSet *_extensions;
|
NSSet *_extensions;
|
||||||
NSTimer *_timer;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
+(instancetype)sharedInstance {
|
+(instancetype)sharedInstance {
|
||||||
|
@ -44,10 +43,17 @@
|
||||||
|
|
||||||
if ((self = [super init])) {
|
if ((self = [super init])) {
|
||||||
|
|
||||||
[self loadRecentDiskImages];
|
//[self loadRecentDiskImages];
|
||||||
|
|
||||||
_extensions = [NSSet setWithObjects:
|
_extensions = [NSSet setWithObjects:
|
||||||
@"2img", @"2mg", @"chd", @"dc", @"do", @"dsk", @"hd", @"hdv", @"image", @"nib", @"po", @"wav", @"woz", @"iso", @"raw", nil
|
@"2img", @"2mg", @"chd", @"dc", @"do", @"dsk", @"hd", @"hdv", @"image", @"nib", @"po", @"wav", @"woz", @"iso", @"raw",
|
||||||
|
// st, etc.
|
||||||
|
@"mfm", @"st", @"msa", @"stx", @"ipf",
|
||||||
|
//
|
||||||
|
@"rom", @"bin",
|
||||||
|
// not supported/relevant.
|
||||||
|
// @"mfi", @"dfi", @"hfe", @"d77" @"d88", @"1dd", @"cqm", @"cqi", @"td0", @"imd",
|
||||||
|
nil
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
|
@ -59,9 +65,6 @@
|
||||||
|
|
||||||
- (void)windowDidLoad {
|
- (void)windowDidLoad {
|
||||||
|
|
||||||
if (!_content)
|
|
||||||
[self setContent: [NSMutableArray new]];
|
|
||||||
|
|
||||||
[super windowDidLoad];
|
[super windowDidLoad];
|
||||||
NSWindow *window = [self window];
|
NSWindow *window = [self window];
|
||||||
[window setRestorable: YES];
|
[window setRestorable: YES];
|
||||||
|
@ -75,8 +78,12 @@
|
||||||
[_tableView setDraggingSourceOperationMask: NSDragOperationCopy forLocal: NO]; // enable drag/drop to othr apps.
|
[_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.
|
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
|
||||||
|
|
||||||
|
NSSortDescriptor *s = [NSSortDescriptor sortDescriptorWithKey: @"name" ascending: YES selector: @selector(caseInsensitiveCompare:)];
|
||||||
|
[_arrayController setSortDescriptors: @[ s ]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
-(void)loadRecentDiskImages {
|
-(void)loadRecentDiskImages {
|
||||||
// NSError *error;
|
// NSError *error;
|
||||||
|
|
||||||
|
@ -102,14 +109,16 @@
|
||||||
_timer = nil;
|
_timer = nil;
|
||||||
[self saveFile];
|
[self saveFile];
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
-(void)diskImageAdded: (NSNotification *)notification {
|
-(void)diskImageAdded: (NSNotification *)notification {
|
||||||
|
|
||||||
NSURL *url = [notification object];
|
NSURL *url = [notification object];
|
||||||
if (!url) return;
|
if (!url) return;
|
||||||
|
|
||||||
[self addFile: url];
|
//[self addFile: url];
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
-(void)markDirty {
|
-(void)markDirty {
|
||||||
_dirty = YES;
|
_dirty = YES;
|
||||||
if (_timer) [_timer invalidate];
|
if (_timer) [_timer invalidate];
|
||||||
|
@ -124,6 +133,7 @@
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
-(void)saveFile {
|
-(void)saveFile {
|
||||||
|
|
||||||
[_timer invalidate];
|
[_timer invalidate];
|
||||||
|
@ -147,10 +157,11 @@
|
||||||
[self saveFile];
|
[self saveFile];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
-(BOOL)addFile: (NSObject *)pathOrURL {
|
-(BOOL)addFile: (NSObject *)pathOrURL {
|
||||||
|
|
||||||
NSString *path = nil;
|
NSString *path = nil;
|
||||||
|
@ -198,18 +209,20 @@
|
||||||
[NSDate new], @"date",
|
[NSDate new], @"date",
|
||||||
nil];
|
nil];
|
||||||
|
|
||||||
|
#if 0
|
||||||
@synchronized (self) {
|
@synchronized (self) {
|
||||||
if (_arrayController)
|
if (_arrayController)
|
||||||
[_arrayController addObject: d];
|
[_arrayController addObject: d];
|
||||||
else
|
else
|
||||||
[_content addObject: d];
|
[_content addObject: d];
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
[self markDirty];
|
[self markDirty];
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
-(NSMutableDictionary *)clickedItem {
|
-(DiskImage *)clickedItem {
|
||||||
|
|
||||||
NSArray *array = [_arrayController arrangedObjects];
|
NSArray *array = [_arrayController arrangedObjects];
|
||||||
NSInteger row = [_tableView clickedRow];
|
NSInteger row = [_tableView clickedRow];
|
||||||
|
@ -218,11 +231,21 @@
|
||||||
}
|
}
|
||||||
#pragma mark - IBActions
|
#pragma mark - IBActions
|
||||||
|
|
||||||
|
- (IBAction)filter:(id)sender {
|
||||||
|
NSString *text = [sender stringValue];
|
||||||
|
NSPredicate *p = nil;
|
||||||
|
if ([text length]) {
|
||||||
|
p = [NSPredicate predicateWithFormat: @"name CONTAINS[cd] %@",text];
|
||||||
|
}
|
||||||
|
|
||||||
|
[_arrayController setFilterPredicate: p];
|
||||||
|
}
|
||||||
|
|
||||||
- (IBAction)showInFinder:(id)sender {
|
- (IBAction)showInFinder:(id)sender {
|
||||||
|
|
||||||
NSMutableDictionary *item = [self clickedItem];
|
DiskImage *item = [self clickedItem];
|
||||||
if (!item) return;
|
if (!item) return;
|
||||||
NSString *path = [item objectForKey: @"path"];
|
NSString *path = [item path];
|
||||||
|
|
||||||
NSURL *url = [NSURL fileURLWithPath: path];
|
NSURL *url = [NSURL fileURLWithPath: path];
|
||||||
if (!url) return;
|
if (!url) return;
|
||||||
|
@ -233,27 +256,19 @@
|
||||||
|
|
||||||
- (IBAction)eject:(id)sender {
|
- (IBAction)eject:(id)sender {
|
||||||
|
|
||||||
NSMutableDictionary *item = [self clickedItem];
|
DiskImage *item = [self clickedItem];
|
||||||
if (!item) return;
|
if (!item) return;
|
||||||
|
|
||||||
@synchronized (self) {
|
[_arrayController removeObject: item];
|
||||||
|
|
||||||
if (_arrayController) {
|
|
||||||
[_arrayController removeObject: item];
|
|
||||||
} else {
|
|
||||||
[_content removeObject: item];
|
|
||||||
}
|
|
||||||
[self markDirty];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
-(IBAction)doubleClick: (id)sender {
|
-(IBAction)doubleClick: (id)sender {
|
||||||
NSDictionary *d = [self clickedItem];
|
DiskImage *d = [self clickedItem];
|
||||||
|
|
||||||
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
||||||
|
|
||||||
[nc postNotificationName: kNotificationDiskImageMagicRoute object: nil userInfo: d];
|
NSDictionary *userInfo = @{ @"path": [d path] };
|
||||||
|
[nc postNotificationName: kNotificationDiskImageMagicRoute object: nil userInfo: userInfo];
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -265,9 +280,9 @@
|
||||||
|
|
||||||
id objects = [_arrayController arrangedObjects];
|
id objects = [_arrayController arrangedObjects];
|
||||||
|
|
||||||
NSDictionary *d = [objects objectAtIndex: row];
|
DiskImage *d = [objects objectAtIndex: row];
|
||||||
|
if (!d) return nil;
|
||||||
NSString *path = [d objectForKey: @"path"];
|
NSString *path = [d path];
|
||||||
|
|
||||||
NSURL *url = [NSURL fileURLWithPath: path];
|
NSURL *url = [NSURL fileURLWithPath: path];
|
||||||
return url;
|
return url;
|
||||||
|
@ -304,6 +319,8 @@
|
||||||
|
|
||||||
-(BOOL)tableView:(NSTableView *)tableView acceptDrop:(id<NSDraggingInfo>)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation {
|
-(BOOL)tableView:(NSTableView *)tableView acceptDrop:(id<NSDraggingInfo>)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation {
|
||||||
|
|
||||||
|
BookmarkManager *bm = [BookmarkManager sharedManager];
|
||||||
|
|
||||||
if ([info draggingSource] == _tableView) return NO;
|
if ([info draggingSource] == _tableView) return NO;
|
||||||
|
|
||||||
NSPasteboard * pb = [info draggingPasteboard];
|
NSPasteboard * pb = [info draggingPasteboard];
|
||||||
|
@ -322,7 +339,9 @@
|
||||||
if (!s) continue;
|
if (!s) continue;
|
||||||
NSURL *url = [NSURL URLWithString: s];
|
NSURL *url = [NSURL URLWithString: s];
|
||||||
if (!url) continue;
|
if (!url) continue;
|
||||||
ok |= [self addFile: url];
|
|
||||||
|
ok |= [bm addDiskImage: url];
|
||||||
|
//ok |= [self addFile: url];
|
||||||
}
|
}
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,9 @@
|
||||||
#import "Menu.h"
|
#import "Menu.h"
|
||||||
|
|
||||||
|
|
||||||
|
static NSString *Extensions[] = { @"zip", @"7z" };
|
||||||
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
kTagZip = 1,
|
kTagZip = 1,
|
||||||
kTag7z = 2,
|
kTag7z = 2,
|
||||||
|
@ -81,6 +84,7 @@ enum {
|
||||||
|
|
||||||
@interface DownloadItem : NSObject
|
@interface DownloadItem : NSObject
|
||||||
|
|
||||||
|
@property NSString *value;
|
||||||
@property NSString *name;
|
@property NSString *name;
|
||||||
@property NSError *error;
|
@property NSError *error;
|
||||||
@property NSString *pathName;
|
@property NSString *pathName;
|
||||||
|
@ -89,6 +93,7 @@ enum {
|
||||||
|
|
||||||
@property NSUInteger status;
|
@property NSUInteger status;
|
||||||
@property NSUInteger index;
|
@property NSUInteger index;
|
||||||
|
@property NSUInteger fileSize;
|
||||||
|
|
||||||
@property (readonly) NSColor *titleColor;
|
@property (readonly) NSColor *titleColor;
|
||||||
@property (readonly) NSColor *descriptionColor;
|
@property (readonly) NSColor *descriptionColor;
|
||||||
|
@ -98,6 +103,8 @@ enum {
|
||||||
-(void)beginDownloadWithTask:(NSURLSessionDownloadTask *)task;
|
-(void)beginDownloadWithTask:(NSURLSessionDownloadTask *)task;
|
||||||
-(void)completeWithError: (NSError *)error;
|
-(void)completeWithError: (NSError *)error;
|
||||||
-(NSString *)statusDescription;
|
-(NSString *)statusDescription;
|
||||||
|
|
||||||
|
-(void)refresh: (NSURL *)localURL;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
@ -134,7 +141,7 @@ enum {
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation DownloadWindowController {
|
@implementation DownloadWindowController {
|
||||||
|
|
||||||
NSArray *_items;
|
NSArray *_items;
|
||||||
NSURL *_romFolder;
|
NSURL *_romFolder;
|
||||||
NSURL *_defaultDownloadURL;
|
NSURL *_defaultDownloadURL;
|
||||||
|
@ -143,7 +150,7 @@ enum {
|
||||||
NSURLSession *_session;
|
NSURLSession *_session;
|
||||||
NSMutableDictionary *_taskIndex;
|
NSMutableDictionary *_taskIndex;
|
||||||
NSUserDefaults *_defaults;
|
NSUserDefaults *_defaults;
|
||||||
|
|
||||||
NSArray<NSButton *> *_filterButtons;
|
NSArray<NSButton *> *_filterButtons;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,7 +174,7 @@ enum {
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
- (void)encodeWithCoder:(nonnull NSCoder *)coder {
|
- (void)encodeWithCoder:(nonnull NSCoder *)coder {
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -177,11 +184,11 @@ enum {
|
||||||
|
|
||||||
-(void)windowWillLoad {
|
-(void)windowWillLoad {
|
||||||
_defaults = [NSUserDefaults standardUserDefaults];
|
_defaults = [NSUserDefaults standardUserDefaults];
|
||||||
|
|
||||||
// set here so binding works.
|
// set here so binding works.
|
||||||
NSString *s = [_defaults stringForKey: kDownloadExtension];
|
NSString *s = [_defaults stringForKey: kDownloadExtension];
|
||||||
if (![s length]) s = [_defaults stringForKey: kDefaultDownloadExtension];
|
if (![s length]) s = [_defaults stringForKey: kDefaultDownloadExtension];
|
||||||
|
|
||||||
_downloadExtension = s;
|
_downloadExtension = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,12 +200,12 @@ enum {
|
||||||
[window setRestorable: YES];
|
[window setRestorable: YES];
|
||||||
[window setRestorationClass: [self class]];
|
[window setRestorationClass: [self class]];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_filterButtons = @[
|
_filterButtons = @[
|
||||||
_allFilterButton,
|
_allFilterButton,
|
||||||
_missingFilterButton
|
_missingFilterButton
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
|
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
|
||||||
|
|
||||||
|
@ -206,21 +213,24 @@ enum {
|
||||||
NSBundle *bundle = [NSBundle mainBundle];
|
NSBundle *bundle = [NSBundle mainBundle];
|
||||||
NSFileManager *fm = [NSFileManager defaultManager];
|
NSFileManager *fm = [NSFileManager defaultManager];
|
||||||
|
|
||||||
|
#ifdef AMPLE_LITE
|
||||||
|
NSURL *url = [bundle URLForResource: @"roms~extra" withExtension: @"plist"];
|
||||||
|
#else
|
||||||
NSURL *url = [bundle URLForResource: @"roms" withExtension: @"plist"];
|
NSURL *url = [bundle URLForResource: @"roms" withExtension: @"plist"];
|
||||||
|
#endif
|
||||||
NSDictionary *d = [NSDictionary dictionaryWithContentsOfURL: url];
|
NSArray *roms = [NSArray arrayWithContentsOfURL: url];
|
||||||
|
|
||||||
NSURL *sd = SupportDirectory();
|
NSURL *sd = SupportDirectory();
|
||||||
|
|
||||||
_romFolder = [sd URLByAppendingPathComponent: @"roms"];
|
_romFolder = [sd URLByAppendingPathComponent: @"roms"];
|
||||||
|
|
||||||
[fm createDirectoryAtURL: _romFolder withIntermediateDirectories: YES attributes: nil error: &error];
|
[fm createDirectoryAtURL: _romFolder withIntermediateDirectories: YES attributes: nil error: &error];
|
||||||
|
|
||||||
// so blank URL isn't overwritten.
|
// so blank URL isn't overwritten.
|
||||||
NSString *s = [_defaults stringForKey: kDefaultDownloadURL];
|
NSString *s = [_defaults stringForKey: kDefaultDownloadURL];
|
||||||
_defaultDownloadURL = [NSURL URLWithString: s];
|
_defaultDownloadURL = [NSURL URLWithString: s];
|
||||||
[_downloadField setPlaceholderString: s];
|
[_downloadField setPlaceholderString: s];
|
||||||
|
|
||||||
s = [_defaults stringForKey: kDownloadURL];
|
s = [_defaults stringForKey: kDownloadURL];
|
||||||
if ([s length]) {
|
if ([s length]) {
|
||||||
[_downloadField setStringValue: s];
|
[_downloadField setStringValue: s];
|
||||||
|
@ -228,23 +238,23 @@ enum {
|
||||||
} else {
|
} else {
|
||||||
_downloadURL = _defaultDownloadURL;
|
_downloadURL = _defaultDownloadURL;
|
||||||
}
|
}
|
||||||
|
|
||||||
[self initializeExtensionMenu];
|
|
||||||
|
|
||||||
|
|
||||||
NSArray *roms = [d objectForKey: @"roms"];
|
[self initializeExtensionMenu];
|
||||||
|
|
||||||
|
|
||||||
[self setCurrentROM: @""];
|
[self setCurrentROM: @""];
|
||||||
[self setCurrentCount: 0];
|
[self setCurrentCount: 0];
|
||||||
[self setTotalCount: [roms count]];
|
[self setTotalCount: [roms count]];
|
||||||
[self setErrorCount: 0];
|
[self setErrorCount: 0];
|
||||||
|
|
||||||
|
|
||||||
NSMutableArray *tmp = [NSMutableArray arrayWithCapacity: [roms count]];
|
NSMutableArray *tmp = [NSMutableArray arrayWithCapacity: [roms count]];
|
||||||
unsigned ix = 0;
|
unsigned ix = 0;
|
||||||
for (NSString *name in roms) {
|
for (NSDictionary *d in roms) {
|
||||||
|
|
||||||
DownloadItem *item = [DownloadItem new];
|
DownloadItem *item = [DownloadItem new];
|
||||||
[item setName: name];
|
[item setValue: [d objectForKey: @"value"]];
|
||||||
|
[item setName: [d objectForKey: @"description"]];
|
||||||
[item setIndex: ix++];
|
[item setIndex: ix++];
|
||||||
|
|
||||||
[tmp addObject: item];
|
[tmp addObject: item];
|
||||||
|
@ -257,7 +267,7 @@ enum {
|
||||||
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
|
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
|
||||||
_session = [NSURLSession sessionWithConfiguration: config delegate: self delegateQueue: nil];
|
_session = [NSURLSession sessionWithConfiguration: config delegate: self delegateQueue: nil];
|
||||||
_taskIndex = [NSMutableDictionary dictionaryWithCapacity: [_items count]];
|
_taskIndex = [NSMutableDictionary dictionaryWithCapacity: [_items count]];
|
||||||
|
|
||||||
//[self download];
|
//[self download];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,13 +276,13 @@ enum {
|
||||||
#if 0
|
#if 0
|
||||||
-(void)validateURL: (NSString *)url {
|
-(void)validateURL: (NSString *)url {
|
||||||
NSURL *v;
|
NSURL *v;
|
||||||
|
|
||||||
if (![url length]) {
|
if (![url length]) {
|
||||||
_effectiveURL = [NSURL URLWithString: _downloadURL];
|
_effectiveURL = [NSURL URLWithString: _downloadURL];
|
||||||
[_downloadField setTextColor: nil];
|
[_downloadField setTextColor: nil];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
v = [NSURL URLWithString: url];
|
v = [NSURL URLWithString: url];
|
||||||
if (v) {
|
if (v) {
|
||||||
_effectiveURL = v;
|
_effectiveURL = v;
|
||||||
|
@ -290,36 +300,36 @@ enum {
|
||||||
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
|
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
|
||||||
_session = [NSURLSession sessionWithConfiguration: config delegate: self delegateQueue: nil];
|
_session = [NSURLSession sessionWithConfiguration: config delegate: self delegateQueue: nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
NSURLSessionDownloadTask *task;
|
NSURLSessionDownloadTask *task;
|
||||||
NSString *s = [item name];
|
NSString *s = [item value];
|
||||||
NSString *path = [s stringByAppendingPathExtension: _downloadExtension];
|
NSString *path = [s stringByAppendingPathExtension: _downloadExtension];
|
||||||
NSURL *url = [_downloadURL URLByAppendingPathComponent: path];
|
NSURL *url = [_downloadURL URLByAppendingPathComponent: path];
|
||||||
|
|
||||||
task = [_session downloadTaskWithURL: url];
|
task = [_session downloadTaskWithURL: url];
|
||||||
|
|
||||||
[item beginDownloadWithTask: task];
|
[item beginDownloadWithTask: task];
|
||||||
[_taskIndex setObject: item forKey: task];
|
[_taskIndex setObject: item forKey: task];
|
||||||
|
|
||||||
[task resume];
|
[task resume];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
-(void)download {
|
-(void)download {
|
||||||
|
|
||||||
// run in thread?
|
// run in thread?
|
||||||
//unsigned count = 0;
|
//unsigned count = 0;
|
||||||
|
|
||||||
for (DownloadItem *item in _items) {
|
for (DownloadItem *item in _items) {
|
||||||
|
|
||||||
NSURLSessionDownloadTask *task;
|
NSURLSessionDownloadTask *task;
|
||||||
NSString *s = [item name];
|
NSString *s = [item value];
|
||||||
NSString *path = [s stringByAppendingPathExtension: _downloadExtension];
|
NSString *path = [s stringByAppendingPathExtension: _downloadExtension];
|
||||||
NSURL *url = [_downloadURL URLByAppendingPathComponent: path];
|
NSURL *url = [_downloadURL URLByAppendingPathComponent: path];
|
||||||
|
|
||||||
task = [_session downloadTaskWithURL: url];
|
task = [_session downloadTaskWithURL: url];
|
||||||
[_taskIndex setObject: item forKey: task];
|
[_taskIndex setObject: item forKey: task];
|
||||||
|
|
||||||
[item setTask: task];
|
[item setTask: task];
|
||||||
|
|
||||||
[task resume];
|
[task resume];
|
||||||
|
@ -328,7 +338,7 @@ enum {
|
||||||
//if (count >= 2) break;
|
//if (count >= 2) break;
|
||||||
}
|
}
|
||||||
[self setActive: YES];
|
[self setActive: YES];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
-(DownloadItem *)clickedItem {
|
-(DownloadItem *)clickedItem {
|
||||||
|
@ -339,24 +349,24 @@ enum {
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
-(void)redrawRow: (NSUInteger)row {
|
-(void)redrawRow: (NSUInteger)row {
|
||||||
|
|
||||||
//NSRect r = [_tableView rectOfRow: row];
|
//NSRect r = [_tableView rectOfRow: row];
|
||||||
//[_tableView setNeedsDisplayInRect: r];
|
//[_tableView setNeedsDisplayInRect: r];
|
||||||
|
|
||||||
NSIndexSet *rIx = [NSIndexSet indexSetWithIndex: row];
|
NSIndexSet *rIx = [NSIndexSet indexSetWithIndex: row];
|
||||||
NSIndexSet *cIx = [NSIndexSet indexSetWithIndex: 0];
|
NSIndexSet *cIx = [NSIndexSet indexSetWithIndex: 0];
|
||||||
|
|
||||||
[_tableView reloadDataForRowIndexes: rIx columnIndexes: cIx];
|
[_tableView reloadDataForRowIndexes: rIx columnIndexes: cIx];
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
-(void)initializeExtensionMenu {
|
-(void)initializeExtensionMenu {
|
||||||
|
|
||||||
unsigned tag;
|
unsigned tag;
|
||||||
// mark default download extension.
|
// mark default download extension.
|
||||||
NSString *defaultExt = [_defaults stringForKey: kDefaultDownloadExtension];
|
NSString *defaultExt = [_defaults stringForKey: kDefaultDownloadExtension];
|
||||||
tag = [DownloadExtensionTransformer stringToNumber: defaultExt];
|
tag = [DownloadExtensionTransformer stringToNumber: defaultExt];
|
||||||
|
|
||||||
NSMenuItem *item = [[_formatButton menu] itemWithTag: tag];
|
NSMenuItem *item = [[_formatButton menu] itemWithTag: tag];
|
||||||
if (item) {
|
if (item) {
|
||||||
[item setAttributedTitle: ItalicMenuString([item title])];
|
[item setAttributedTitle: ItalicMenuString([item title])];
|
||||||
|
@ -373,6 +383,10 @@ enum {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-(void) defocus {
|
||||||
|
[[self window] makeFirstResponder: nil];
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark - IBActions
|
#pragma mark - IBActions
|
||||||
|
|
||||||
-(IBAction)cancelAll:(id)sender {
|
-(IBAction)cancelAll:(id)sender {
|
||||||
|
@ -390,6 +404,7 @@ enum {
|
||||||
|
|
||||||
- (IBAction)downloadMissing:(id)sender {
|
- (IBAction)downloadMissing:(id)sender {
|
||||||
|
|
||||||
|
[self defocus];
|
||||||
BOOL delta = NO;
|
BOOL delta = NO;
|
||||||
for (DownloadItem *item in _items) {
|
for (DownloadItem *item in _items) {
|
||||||
NSURL *url = [item localURL];
|
NSURL *url = [item localURL];
|
||||||
|
@ -399,7 +414,7 @@ enum {
|
||||||
delta = YES;
|
delta = YES;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (delta) {
|
if (delta) {
|
||||||
[self setActive: YES];
|
[self setActive: YES];
|
||||||
}
|
}
|
||||||
|
@ -411,30 +426,31 @@ enum {
|
||||||
}
|
}
|
||||||
|
|
||||||
-(IBAction)refreshROMs: (id)sender {
|
-(IBAction)refreshROMs: (id)sender {
|
||||||
|
|
||||||
NSString *romdir = [SupportDirectoryPath() stringByAppendingPathComponent: @"roms"];
|
NSString *romdir = [SupportDirectoryPath() stringByAppendingPathComponent: @"roms"];
|
||||||
NSFileManager *fm = [NSFileManager defaultManager];
|
NSFileManager *fm = [NSFileManager defaultManager];
|
||||||
|
|
||||||
for (DownloadItem *item in _items) {
|
for (DownloadItem *item in _items) {
|
||||||
NSString *name = [item name];
|
NSDictionary *attr = nil;
|
||||||
NSString *s = [romdir stringByAppendingPathComponent: name];
|
NSString *value = [item value];
|
||||||
|
NSString *s = [romdir stringByAppendingPathComponent: value];
|
||||||
NSString *path;
|
NSString *path;
|
||||||
path = [s stringByAppendingPathExtension: @"zip"];
|
|
||||||
if ([fm fileExistsAtPath: path]) {
|
for (unsigned i = 0; i < 2; ++i) {
|
||||||
[item setStatus: ItemFound];
|
path = [s stringByAppendingPathExtension: Extensions[i]];
|
||||||
[item setLocalURL: [NSURL fileURLWithPath: path]];
|
attr = [fm attributesOfItemAtPath: path error: nil];
|
||||||
continue;
|
if (attr) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
path = [s stringByAppendingPathExtension: @"7z"];
|
if (attr) {
|
||||||
if ([fm fileExistsAtPath: path]) {
|
|
||||||
[item setStatus: ItemFound];
|
[item setStatus: ItemFound];
|
||||||
[item setLocalURL: [NSURL fileURLWithPath: path]];
|
[item setLocalURL: [NSURL fileURLWithPath: path]];
|
||||||
continue;
|
[item setFileSize: [attr fileSize]];
|
||||||
|
} else {
|
||||||
|
[item setStatus: ItemMissing];
|
||||||
|
[item setLocalURL: nil];
|
||||||
|
[item setFileSize: 0];
|
||||||
}
|
}
|
||||||
|
|
||||||
[item setStatus: ItemMissing];
|
|
||||||
[item setLocalURL: nil];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -448,10 +464,33 @@ enum {
|
||||||
[ws activateFileViewerSelectingURLs: @[url]];
|
[ws activateFileViewerSelectingURLs: @[url]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (IBAction)moveToTrash:(id)sender {
|
||||||
|
NSError *error = nil;
|
||||||
|
|
||||||
|
DownloadItem *item = [self clickedItem];
|
||||||
|
if (!item) return;
|
||||||
|
NSURL *url = [item localURL];
|
||||||
|
if (!url) return;
|
||||||
|
|
||||||
|
NSFileManager *fm = [NSFileManager defaultManager];
|
||||||
|
if ([fm trashItemAtURL: url resultingItemURL: NULL error: &error]) {
|
||||||
|
[item refresh: nil];
|
||||||
|
} else {
|
||||||
|
[self presentError: error];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
-(IBAction)doubleClick:(id)sender {
|
||||||
|
[self download: sender];
|
||||||
|
}
|
||||||
|
|
||||||
- (IBAction)download:(id)sender {
|
- (IBAction)download:(id)sender {
|
||||||
DownloadItem *item = [self clickedItem];
|
DownloadItem *item = [self clickedItem];
|
||||||
if (!item) return;
|
if (!item) return;
|
||||||
|
|
||||||
|
[self defocus];
|
||||||
|
|
||||||
[self downloadItem: item];
|
[self downloadItem: item];
|
||||||
[self setActive: YES];
|
[self setActive: YES];
|
||||||
}
|
}
|
||||||
|
@ -534,7 +573,7 @@ static NSInteger TaskStatusCode(NSURLSessionTask *task) {
|
||||||
error = [NSError errorWithDomain: NSURLErrorDomain code: NSURLErrorFileDoesNotExist userInfo: info];
|
error = [NSError errorWithDomain: NSURLErrorDomain code: NSURLErrorFileDoesNotExist userInfo: info];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// not sure if strictly necessary but this happens in a background thread
|
// not sure if strictly necessary but this happens in a background thread
|
||||||
// and these are used in KVO binding. Also, main thread only
|
// and these are used in KVO binding. Also, main thread only
|
||||||
// means no race conditions.
|
// means no race conditions.
|
||||||
|
@ -551,22 +590,22 @@ static NSInteger TaskStatusCode(NSURLSessionTask *task) {
|
||||||
if ([taskIndex count] == 0) {
|
if ([taskIndex count] == 0) {
|
||||||
[self setActive: NO];
|
[self setActive: NO];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item) {
|
if (item) {
|
||||||
[item completeWithError: error];
|
[item completeWithError: error];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)URLSession:(NSURLSession *)session downloadTask:(nonnull NSURLSessionDownloadTask *)task didFinishDownloadingToURL:(nonnull NSURL *)location {
|
- (void)URLSession:(NSURLSession *)session downloadTask:(nonnull NSURLSessionDownloadTask *)task didFinishDownloadingToURL:(nonnull NSURL *)location {
|
||||||
|
|
||||||
|
|
||||||
// NSLog(@"%@", task);
|
// NSLog(@"%@", task);
|
||||||
// NSLog(@"%@", [task response]);
|
// NSLog(@"%@", [task response]);
|
||||||
|
|
||||||
if (TaskStatusCode(task) != 200) return;
|
if (TaskStatusCode(task) != 200) return;
|
||||||
|
|
||||||
|
|
||||||
// need to move to the destination directory...
|
// need to move to the destination directory...
|
||||||
// file deleted after this function returns, so can't move asynchronously.
|
// file deleted after this function returns, so can't move asynchronously.
|
||||||
|
@ -574,18 +613,92 @@ static NSInteger TaskStatusCode(NSURLSessionTask *task) {
|
||||||
NSURL *src = [[task originalRequest] URL];
|
NSURL *src = [[task originalRequest] URL];
|
||||||
NSURL *dest = [_romFolder URLByAppendingPathComponent: [src lastPathComponent]];
|
NSURL *dest = [_romFolder URLByAppendingPathComponent: [src lastPathComponent]];
|
||||||
NSError *error = nil;
|
NSError *error = nil;
|
||||||
|
|
||||||
|
/* just in case ... */
|
||||||
|
[fm removeItemAtURL: dest error: NULL];
|
||||||
[fm moveItemAtURL: location toURL: dest error: &error];
|
[fm moveItemAtURL: location toURL: dest error: &error];
|
||||||
|
|
||||||
dispatch_async(dispatch_get_main_queue(), ^(void){
|
dispatch_async(dispatch_get_main_queue(), ^(void){
|
||||||
NSMutableDictionary *taskIndex = self->_taskIndex;
|
NSMutableDictionary *taskIndex = self->_taskIndex;
|
||||||
DownloadItem *item = [taskIndex objectForKey: task];
|
DownloadItem *item = [taskIndex objectForKey: task];
|
||||||
[item setLocalURL: dest];
|
|
||||||
|
if (error) [item completeWithError: error];
|
||||||
|
else [item refresh: dest];
|
||||||
});
|
});
|
||||||
|
|
||||||
NSLog(@"%@", src);
|
NSLog(@"%@", src);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-(NSURLCredential *)credentialForChallenge: (NSURLAuthenticationChallenge *)challenge {
|
||||||
|
|
||||||
|
|
||||||
|
//if ([challenge previousFailureCount]) return nil;
|
||||||
|
|
||||||
|
NSURLCredential *credential = nil;
|
||||||
|
NSURLProtectionSpace *space = [challenge protectionSpace];
|
||||||
|
|
||||||
|
|
||||||
|
OSStatus status;
|
||||||
|
NSDictionary *query;
|
||||||
|
CFTypeRef item = nil;
|
||||||
|
|
||||||
|
|
||||||
|
query = @{
|
||||||
|
(id)kSecClass: (id)kSecClassInternetPassword,
|
||||||
|
(id)kSecReturnData: (id)kCFBooleanTrue,
|
||||||
|
(id)kSecReturnAttributes: (id)kCFBooleanTrue,
|
||||||
|
(id)kSecAttrServer: [space host],
|
||||||
|
//(id)kSecAttrProtocol: [space protocol],
|
||||||
|
(id)kSecMatchLimit: (id)kSecMatchLimitOne,
|
||||||
|
};
|
||||||
|
|
||||||
|
status = SecItemCopyMatching((CFDictionaryRef)query, &item);
|
||||||
|
//NSLog(@"%@", query);
|
||||||
|
if (status != 0) return nil;
|
||||||
|
|
||||||
|
NSDictionary *d = (__bridge NSDictionary *)item;
|
||||||
|
//NSLog(@"%@", d);
|
||||||
|
|
||||||
|
NSString *account = [d objectForKey: (id)kSecAttrAccount];
|
||||||
|
NSData *passwordData = [d objectForKey: (id)kSecValueData];
|
||||||
|
NSString *password = [[NSString alloc] initWithData: passwordData encoding: NSUTF8StringEncoding];
|
||||||
|
|
||||||
|
|
||||||
|
credential = [NSURLCredential credentialWithUser: account password: password persistence: NSURLCredentialPersistenceForSession];
|
||||||
|
|
||||||
|
return credential;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
|
||||||
|
|
||||||
|
NSLog(@"challenge: %@", challenge);
|
||||||
|
|
||||||
|
if ([challenge previousFailureCount]) {
|
||||||
|
completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSURLProtectionSpace *space = [challenge protectionSpace];
|
||||||
|
NSString *method = [space authenticationMethod];
|
||||||
|
|
||||||
|
if ([NSURLAuthenticationMethodHTTPBasic isEqualToString: method] ||
|
||||||
|
[NSURLAuthenticationMethodNTLM isEqualToString: method] ||
|
||||||
|
[NSURLAuthenticationMethodHTTPDigest isEqualToString: method]) {
|
||||||
|
|
||||||
|
NSURLCredential *credential = [self credentialForChallenge: challenge];
|
||||||
|
|
||||||
|
if (credential) {
|
||||||
|
completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
@ -619,6 +732,42 @@ static NSInteger TaskStatusCode(NSURLSessionTask *task) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-(void)refresh: (NSURL *)localURL {
|
||||||
|
NSDictionary *attr = nil;
|
||||||
|
NSError * error = nil;
|
||||||
|
NSFileManager *fm = [NSFileManager defaultManager];
|
||||||
|
|
||||||
|
if (localURL) {
|
||||||
|
attr = [fm attributesOfItemAtPath: [localURL path] error: &error];
|
||||||
|
} else {
|
||||||
|
NSString *romdir = [SupportDirectoryPath() stringByAppendingPathComponent: @"roms"];
|
||||||
|
NSString *s = [romdir stringByAppendingPathComponent: _value];
|
||||||
|
|
||||||
|
NSString *path = nil;
|
||||||
|
for (unsigned i = 0; i < 2; ++i) {
|
||||||
|
path = [s stringByAppendingPathExtension: Extensions[i]];
|
||||||
|
attr = [fm attributesOfItemAtPath: path error: nil];
|
||||||
|
if (attr) {
|
||||||
|
localURL = [NSURL fileURLWithPath: path];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attr && localURL) {
|
||||||
|
[self setLocalURL: localURL];
|
||||||
|
[self setFileSize: [attr fileSize]];
|
||||||
|
[self setStatus: ItemFound];
|
||||||
|
} else {
|
||||||
|
[self setLocalURL: nil];
|
||||||
|
[self setFileSize: 0];
|
||||||
|
if (_status == ItemFound || _status == ItemDownloaded)
|
||||||
|
[self setStatus: ItemMissing];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
+(NSSet *)keyPathsForValuesAffectingStatusDescription {
|
+(NSSet *)keyPathsForValuesAffectingStatusDescription {
|
||||||
return [NSSet setWithObjects: @"error", @"status", nil];
|
return [NSSet setWithObjects: @"error", @"status", nil];
|
||||||
}
|
}
|
||||||
|
@ -664,27 +813,34 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
|
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
|
||||||
|
|
||||||
if ([menuItem action] == @selector(downloadExtensionChanged:)) return YES;
|
|
||||||
|
|
||||||
|
SEL action = [menuItem action];
|
||||||
|
if (action == @selector(downloadExtensionChanged:)) return YES;
|
||||||
|
|
||||||
|
DownloadItem *item = [self clickedItem];
|
||||||
|
if (!item) return NO;
|
||||||
|
#if 0
|
||||||
NSInteger row = [_tableView clickedRow];
|
NSInteger row = [_tableView clickedRow];
|
||||||
if (row < 0) return NO;
|
if (row < 0) return NO;
|
||||||
DownloadItem *item = [[_arrayController arrangedObjects] objectAtIndex: row]; //[_items objectAtIndex: row];
|
DownloadItem *item = [[_arrayController arrangedObjects] objectAtIndex: row]; //[_items objectAtIndex: row];
|
||||||
|
#endif
|
||||||
|
|
||||||
NSUInteger status = [item status];
|
NSUInteger status = [item status];
|
||||||
switch([menuItem tag]) {
|
|
||||||
case kOpenInFinder:
|
if (action == @selector(moveToTrash:)) {
|
||||||
return status == ItemFound || status == ItemDownloaded;
|
return [item localURL] != nil;
|
||||||
break;
|
|
||||||
case kDownload:
|
|
||||||
return YES;
|
|
||||||
//return status == ItemMissing || status == ItemError || status == ItemCanceled;
|
|
||||||
break;
|
|
||||||
case kCancel:
|
|
||||||
return status == ItemDownloading;
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if (action == @selector(showInFinder:)) {
|
||||||
|
return [item localURL] != nil;
|
||||||
|
}
|
||||||
|
if (action == @selector(download:)) {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
if (action == @selector(cancel:)) {
|
||||||
|
return status == ItemDownloading;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,10 +47,12 @@
|
||||||
<string>$(MARKETING_VERSION)</string>
|
<string>$(MARKETING_VERSION)</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||||
|
<key>LSApplicationCategoryType</key>
|
||||||
|
<string>public.app-category.utilities</string>
|
||||||
<key>LSMinimumSystemVersion</key>
|
<key>LSMinimumSystemVersion</key>
|
||||||
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
||||||
<key>NSHumanReadableCopyright</key>
|
<key>NSHumanReadableCopyright</key>
|
||||||
<string>Copyright © 2020-2021 Kelvin Sherlock. All rights reserved.</string>
|
<string>Copyright © 2020-2023 Kelvin Sherlock. All rights reserved.</string>
|
||||||
<key>NSMainNibFile</key>
|
<key>NSMainNibFile</key>
|
||||||
<string>MainMenu</string>
|
<string>MainMenu</string>
|
||||||
<key>NSPrincipalClass</key>
|
<key>NSPrincipalClass</key>
|
||||||
|
@ -58,7 +60,7 @@
|
||||||
<key>NSSupportsAutomaticTermination</key>
|
<key>NSSupportsAutomaticTermination</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSSupportsSuddenTermination</key>
|
<key>NSSupportsSuddenTermination</key>
|
||||||
<true/>
|
<false/>
|
||||||
<key>SUFeedURL</key>
|
<key>SUFeedURL</key>
|
||||||
<string>https://ample.ksherlock.com/updates/appcast.xml</string>
|
<string>https://ample.ksherlock.com/updates/appcast.xml</string>
|
||||||
<key>SUPublicEDKey</key>
|
<key>SUPublicEDKey</key>
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#import "AutocompleteControl.h"
|
#import "AutocompleteControl.h"
|
||||||
#import "SoftwareList.h"
|
#import "SoftwareList.h"
|
||||||
#import "BookmarkManager.h"
|
#import "BookmarkManager.h"
|
||||||
|
#import "Bookmark.h"
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <wctype.h>
|
#include <wctype.h>
|
||||||
|
@ -24,10 +25,25 @@ static NSString *kMyContext = @"kMyContext";
|
||||||
static NSString *kContextMachine = @"kContextMachine";
|
static NSString *kContextMachine = @"kContextMachine";
|
||||||
|
|
||||||
|
|
||||||
|
static NSString *NeedsAspectRatio(NSString *machine) {
|
||||||
|
static NSDictionary *dict = nil;
|
||||||
|
|
||||||
|
if (!dict) {
|
||||||
|
dict = @{
|
||||||
|
@"oric1": @"2:1",
|
||||||
|
@"orica": @"2:1",
|
||||||
|
@"prav8d": @"2:1",
|
||||||
|
@"telstrat": @"2:1",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return [dict objectForKey: machine];
|
||||||
|
}
|
||||||
|
|
||||||
@interface LaunchWindowController () {
|
@interface LaunchWindowController () {
|
||||||
BOOL _loadingBookmark;
|
BOOL _loadingBookmark;
|
||||||
NSString *_machine;
|
NSString *_machine;
|
||||||
NSDictionary *_machineDescription;
|
NSDictionary *_machineDescription;
|
||||||
|
BookmarkManager *_manager;
|
||||||
}
|
}
|
||||||
@property (strong) IBOutlet MediaViewController *mediaController;
|
@property (strong) IBOutlet MediaViewController *mediaController;
|
||||||
@property (strong) IBOutlet SlotViewController *slotController;
|
@property (strong) IBOutlet SlotViewController *slotController;
|
||||||
|
@ -79,10 +95,13 @@ static NSString *kContextMachine = @"kContextMachine";
|
||||||
|
|
||||||
@property (strong) IBOutlet NSWindow *addBookmarkWindow;
|
@property (strong) IBOutlet NSWindow *addBookmarkWindow;
|
||||||
@property (strong) NSString *bookmarkName;
|
@property (strong) NSString *bookmarkName;
|
||||||
|
@property BOOL bookmarkDefault;
|
||||||
@property (weak) IBOutlet NSTextField *bookmarkTextField;
|
@property (weak) IBOutlet NSTextField *bookmarkTextField;
|
||||||
|
@property (weak) IBOutlet NSTextField *bookmarkErrorField;
|
||||||
|
|
||||||
@property BOOL optionKey;
|
@property BOOL optionKey;
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface LaunchWindowController (SoftwareList)
|
@interface LaunchWindowController (SoftwareList)
|
||||||
|
@ -98,6 +117,8 @@ static NSString *kContextMachine = @"kContextMachine";
|
||||||
|
|
||||||
-(IBAction)defaultLoad:(id)sender;
|
-(IBAction)defaultLoad:(id)sender;
|
||||||
|
|
||||||
|
-(void)bookmarkNotification: (NSNotification *)notification;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
#define SIZEOF(x) (sizeof(x) / sizeof(x[0]))
|
#define SIZEOF(x) (sizeof(x) / sizeof(x[0]))
|
||||||
|
@ -114,6 +135,7 @@ static NSString *EffectsStrings[] = {
|
||||||
@"crt-geom",
|
@"crt-geom",
|
||||||
@"crt-geom-deluxe",
|
@"crt-geom-deluxe",
|
||||||
@"lcd-grid",
|
@"lcd-grid",
|
||||||
|
@"Fighters",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -183,6 +205,8 @@ static int EffectsIndex(NSString *str) {
|
||||||
|
|
||||||
-(void)windowWillLoad {
|
-(void)windowWillLoad {
|
||||||
|
|
||||||
|
_manager = [BookmarkManager sharedManager];
|
||||||
|
|
||||||
// if this calls [self window], it will recurse. that is bad.
|
// if this calls [self window], it will recurse. that is bad.
|
||||||
//[self defaultLoad: nil];
|
//[self defaultLoad: nil];
|
||||||
[self reset];
|
[self reset];
|
||||||
|
@ -207,9 +231,9 @@ static void AddSubview(NSView *parent, NSView *child) {
|
||||||
AddSubview(_mediaView, [_mediaController view]);
|
AddSubview(_mediaView, [_mediaController view]);
|
||||||
AddSubview(_machineView, [_machineViewController view]);
|
AddSubview(_machineView, [_machineViewController view]);
|
||||||
|
|
||||||
|
|
||||||
// can't be done until above views are set up.
|
[_softwareListControl setMinWidth: 250];
|
||||||
[self defaultLoad: nil];
|
[_softwareListControl setHidden: YES];
|
||||||
|
|
||||||
|
|
||||||
NSArray *keys = @[
|
NSArray *keys = @[
|
||||||
|
@ -240,10 +264,17 @@ static void AddSubview(NSView *parent, NSView *child) {
|
||||||
[_machineViewController addObserver: self forKeyPath: @"machine" options: 0 context: (__bridge void * _Nullable)kContextMachine];
|
[_machineViewController addObserver: self forKeyPath: @"machine" options: 0 context: (__bridge void * _Nullable)kContextMachine];
|
||||||
|
|
||||||
|
|
||||||
[_softwareListControl setMinWidth: 250];
|
|
||||||
[_softwareListControl setHidden: YES];
|
|
||||||
|
// can't be done until above views are set up.
|
||||||
|
[self defaultLoad: nil];
|
||||||
|
|
||||||
|
|
||||||
[self buildCommandLine];
|
[self buildCommandLine];
|
||||||
|
|
||||||
|
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
||||||
|
|
||||||
|
[nc addObserver: self selector: @selector(bookmarkNotification:) name: kNotificationBookmarkMagicRoute object: nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -303,7 +334,7 @@ static NSString * JoinArguments(NSArray *argv, NSString *argv0) {
|
||||||
|
|
||||||
if (!safe) {
|
if (!safe) {
|
||||||
NSString *str =
|
NSString *str =
|
||||||
@"%+-./:=_"
|
@"%+-./:=_,"
|
||||||
@"0123456789"
|
@"0123456789"
|
||||||
@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
;
|
;
|
||||||
|
@ -378,7 +409,7 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
|
|
||||||
if (!safe) {
|
if (!safe) {
|
||||||
NSString *str =
|
NSString *str =
|
||||||
@"%+-./:=_"
|
@"%+-./:=_,"
|
||||||
@"0123456789"
|
@"0123456789"
|
||||||
@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
;
|
;
|
||||||
|
@ -446,11 +477,6 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
//[argv addObject: @"mame"];
|
//[argv addObject: @"mame"];
|
||||||
[argv addObject: _machine];
|
[argv addObject: _machine];
|
||||||
|
|
||||||
if (_software) {
|
|
||||||
NSString *name = [_softwareSet nameForSoftware: _software];
|
|
||||||
if (name) [argv addObject: name];
|
|
||||||
}
|
|
||||||
|
|
||||||
// -confirm_quit?
|
// -confirm_quit?
|
||||||
[argv addObject: @"-skip_gameinfo"];
|
[argv addObject: @"-skip_gameinfo"];
|
||||||
|
|
||||||
|
@ -470,6 +496,8 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
* for square pixels, should pass the true size and true aspect ratio.
|
* for square pixels, should pass the true size and true aspect ratio.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NSSize screen = [_slotController resolution];
|
NSSize screen = [_slotController resolution];
|
||||||
switch(_mameWindowMode) {
|
switch(_mameWindowMode) {
|
||||||
case 0: // full screen;
|
case 0: // full screen;
|
||||||
|
@ -486,12 +514,18 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
// drop through.
|
// drop through.
|
||||||
case 2: // 2x
|
case 2: // 2x
|
||||||
case 3: // 3x
|
case 3: // 3x
|
||||||
|
case 4: // 4x
|
||||||
|
|
||||||
if (_mameSquarePixels) {
|
if (_mameSquarePixels) {
|
||||||
// NSString *aspect = [NSString stringWithFormat: @"%u:%u", (unsigned)screen.width, (unsigned)screen.height];
|
// NSString *aspect = [NSString stringWithFormat: @"%u:%u", (unsigned)screen.width, (unsigned)screen.height];
|
||||||
// [argv addObject: @"-aspect"];
|
// [argv addObject: @"-aspect"];
|
||||||
// [argv addObject: aspect];
|
// [argv addObject: aspect];
|
||||||
[argv addObject: @"-nounevenstretch"];
|
|
||||||
|
float hscale = round((screen.width * 3 / 4) / screen.height);
|
||||||
|
if (hscale < 1) hscale = 1;
|
||||||
|
screen.height *= hscale;
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
screen.height = round(screen.width * 3 / 4);
|
screen.height = round(screen.width * 3 / 4);
|
||||||
}
|
}
|
||||||
|
@ -504,12 +538,26 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
|
|
||||||
[argv addObject: @"-resolution"];
|
[argv addObject: @"-resolution"];
|
||||||
[argv addObject: res];
|
[argv addObject: res];
|
||||||
|
if (_mameSquarePixels) {
|
||||||
|
[argv addObject: @"-nounevenstretch"];
|
||||||
|
|
||||||
|
NSString *aspect = NeedsAspectRatio(_machine);
|
||||||
|
if (aspect) {
|
||||||
|
[argv addObject: @"-aspect"];
|
||||||
|
[argv addObject: aspect];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (_mameBGFX) {
|
if (_mameBGFX) {
|
||||||
|
[argv addObject: @"-video"];
|
||||||
|
[argv addObject: @"bgfx"];
|
||||||
|
|
||||||
if (_mameBackend) {
|
if (_mameBackend) {
|
||||||
[argv addObject: @"-bgfx_backend"];
|
[argv addObject: @"-bgfx_backend"];
|
||||||
[argv addObject: BackendStrings[_mameBackend]];
|
[argv addObject: BackendStrings[_mameBackend]];
|
||||||
|
@ -539,6 +587,12 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
[argv addObjectsFromArray: tmp];
|
[argv addObjectsFromArray: tmp];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// software *AFTER* slots so, eg, apple2ee has access to the superdrive.
|
||||||
|
if (_software) {
|
||||||
|
NSString *name = [_softwareSet nameForSoftware: _software];
|
||||||
|
if (name) [argv addObject: name];
|
||||||
|
}
|
||||||
|
|
||||||
if (_mameSpeed < 0) {
|
if (_mameSpeed < 0) {
|
||||||
[argv addObject: @"-nothrottle"];
|
[argv addObject: @"-nothrottle"];
|
||||||
} else if (_mameSpeed > 1) {
|
} else if (_mameSpeed > 1) {
|
||||||
|
@ -594,11 +648,15 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
//return [super validateMenuItem: menuItem]; // not implemented?
|
//return [super validateMenuItem: menuItem]; // not implemented?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-(void)defocus {
|
||||||
|
[[self window] makeFirstResponder: nil]; // in case text is being edited...
|
||||||
|
}
|
||||||
|
|
||||||
# pragma mark - IBActions
|
# pragma mark - IBActions
|
||||||
|
|
||||||
- (IBAction)launchAction:(id)sender {
|
- (IBAction)launchAction:(id)sender {
|
||||||
|
|
||||||
[[self window] makeFirstResponder: nil]; // in case text is being edited...
|
[self defocus];
|
||||||
if (![_args count]) return;
|
if (![_args count]) return;
|
||||||
|
|
||||||
[LogWindowController controllerForArgs: _args];
|
[LogWindowController controllerForArgs: _args];
|
||||||
|
@ -608,7 +666,7 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
|
|
||||||
- (IBAction)listMedia:(id)sender {
|
- (IBAction)listMedia:(id)sender {
|
||||||
|
|
||||||
[[self window] makeFirstResponder: nil]; // in case text is being edited...
|
[self defocus];
|
||||||
if (!_machine) return;
|
if (!_machine) return;
|
||||||
|
|
||||||
NSMutableArray *argv = [NSMutableArray new];
|
NSMutableArray *argv = [NSMutableArray new];
|
||||||
|
@ -635,7 +693,7 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
|
|
||||||
- (IBAction)listSlots:(id)sender {
|
- (IBAction)listSlots:(id)sender {
|
||||||
|
|
||||||
[[self window] makeFirstResponder: nil]; // in case text is being edited...
|
[self defocus];
|
||||||
if (!_machine) return;
|
if (!_machine) return;
|
||||||
|
|
||||||
NSMutableArray *argv = [NSMutableArray new];
|
NSMutableArray *argv = [NSMutableArray new];
|
||||||
|
@ -713,6 +771,7 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
|
|
||||||
-(IBAction)resetAll:(id)sender {
|
-(IBAction)resetAll:(id)sender {
|
||||||
|
|
||||||
|
[_manager setCurrentBookmark: nil];
|
||||||
[self reset];
|
[self reset];
|
||||||
[self resetSoftware];
|
[self resetSoftware];
|
||||||
[_slotController resetSlots: sender];
|
[_slotController resetSlots: sender];
|
||||||
|
@ -761,32 +820,40 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
|
|
||||||
-(IBAction)defaultSave:(id)sender {
|
-(IBAction)defaultSave:(id)sender {
|
||||||
|
|
||||||
BookmarkManager *bm = [BookmarkManager sharedManager];
|
#if 0
|
||||||
|
|
||||||
NSDictionary *d = [self makeBookmark];
|
NSDictionary *d = [self makeBookmark];
|
||||||
|
|
||||||
[bm saveDefault: d];
|
[_manager saveDefault: d];
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
-(IBAction)defaultLoad:(id)sender {
|
-(IBAction)defaultLoad:(id)sender {
|
||||||
|
|
||||||
BookmarkManager *bm = [BookmarkManager sharedManager];
|
Bookmark *b = [_manager defaultBookmark];
|
||||||
|
|
||||||
NSDictionary *d = [bm loadDefault];
|
if (!b) {
|
||||||
if (!d) {
|
|
||||||
[self resetAll: sender];
|
[self resetAll: sender];
|
||||||
[self setMachine: nil];
|
[self setMachine: nil];
|
||||||
[_machineViewController reset];
|
[_machineViewController reset];
|
||||||
[_slotController setMachine: nil];
|
[_slotController setMachine: nil];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
[self loadBookmark: d];
|
[self loadBookmark: b];
|
||||||
|
}
|
||||||
|
|
||||||
|
-(IBAction)updateBookmark: (id)sender {
|
||||||
|
|
||||||
|
Bookmark *b = [sender representedObject];
|
||||||
|
if (!b) return;
|
||||||
|
|
||||||
|
NSDictionary *d = [self makeBookmark];
|
||||||
|
[b setDictionary: d];
|
||||||
}
|
}
|
||||||
|
|
||||||
-(IBAction)addBookmark:(id)sender {
|
-(IBAction)addBookmark:(id)sender {
|
||||||
|
|
||||||
if (!_machine) return;
|
if (!_machine) return;
|
||||||
|
|
||||||
NSString *name = nil;
|
NSString *name = nil;
|
||||||
if (_machineDescription) name = [_machineDescription objectForKey:@"description"];
|
if (_machineDescription) name = [_machineDescription objectForKey:@"description"];
|
||||||
if (!name) name = _machine;
|
if (!name) name = _machine;
|
||||||
|
@ -795,8 +862,14 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
if (_software) {
|
if (_software) {
|
||||||
name = [name stringByAppendingFormat: @" - %@", [_software title]];
|
name = [name stringByAppendingFormat: @" - %@", [_software title]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = [_manager uniqueBookmarkName: name];
|
||||||
|
|
||||||
[self setBookmarkName: name];
|
[self setBookmarkName: name];
|
||||||
|
[self setBookmarkDefault: NO];
|
||||||
[_bookmarkTextField selectText: nil];
|
[_bookmarkTextField selectText: nil];
|
||||||
|
[_bookmarkErrorField setStringValue: @""];
|
||||||
|
|
||||||
[[self window] beginSheet: _addBookmarkWindow completionHandler: nil];
|
[[self window] beginSheet: _addBookmarkWindow completionHandler: nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -806,19 +879,26 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
-(IBAction)bookmarkSave:(id)sender {
|
-(IBAction)bookmarkSave:(id)sender {
|
||||||
|
|
||||||
|
|
||||||
BookmarkManager *bm = [BookmarkManager sharedManager];
|
|
||||||
|
|
||||||
if (![bm validateName: _bookmarkName]) {
|
#if 0
|
||||||
|
if (![_manager validateName: _bookmarkName]) {
|
||||||
[_bookmarkTextField selectText: nil];
|
[_bookmarkTextField selectText: nil];
|
||||||
NSBeep();
|
NSBeep();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
NSDictionary *d = [self makeBookmark];
|
NSDictionary *d = [self makeBookmark];
|
||||||
|
NSError *e;
|
||||||
|
|
||||||
[bm saveBookmark: d name: _bookmarkName];
|
if (( e = [_manager saveBookmark: d name: _bookmarkName automatic: _bookmarkDefault])) {
|
||||||
|
// probably a duplicate name...
|
||||||
|
[_bookmarkTextField selectText: nil];
|
||||||
|
[_bookmarkErrorField setStringValue: [e localizedDescription]];
|
||||||
|
NSBeep();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
[[self window] endSheet: _addBookmarkWindow];
|
[[self window] endSheet: _addBookmarkWindow];
|
||||||
[_addBookmarkWindow orderOut: nil];
|
[_addBookmarkWindow orderOut: nil];
|
||||||
|
@ -826,22 +906,27 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-(void)bookmarkNotification: (NSNotification *)notification {
|
||||||
|
|
||||||
|
Bookmark *b = [notification object];
|
||||||
|
[self loadBookmark: b];
|
||||||
|
}
|
||||||
|
|
||||||
-(IBAction)bookmarkMenu:(id)sender {
|
-(IBAction)bookmarkMenu:(id)sender {
|
||||||
|
|
||||||
NSURL *url = [sender representedObject];
|
// represented object is a Bookmark.
|
||||||
if (!url) return;
|
Bookmark *b = [sender representedObject];
|
||||||
|
[self loadBookmark: b];
|
||||||
NSDictionary *d = [NSDictionary dictionaryWithContentsOfURL: url];
|
|
||||||
if (!d) return; // oops...
|
|
||||||
|
|
||||||
[self loadBookmark: d];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
-(void)loadBookmark: (NSDictionary *)d {
|
-(void)loadBookmark: (Bookmark *)b {
|
||||||
Class StringClass = [NSString class];
|
Class StringClass = [NSString class];
|
||||||
Class NumberClass = [NSNumber class];
|
Class NumberClass = [NSNumber class];
|
||||||
|
|
||||||
|
NSDictionary *d = [b dictionary];
|
||||||
|
|
||||||
|
[_manager setCurrentBookmark: b];
|
||||||
|
|
||||||
NSString *machine = [d objectForKey: @"machine"];
|
NSString *machine = [d objectForKey: @"machine"];
|
||||||
if (!machine) return;
|
if (!machine) return;
|
||||||
|
@ -935,7 +1020,7 @@ static NSString *ShellQuote(NSString *s) {
|
||||||
|
|
||||||
-(NSDictionary *)makeBookmark {
|
-(NSDictionary *)makeBookmark {
|
||||||
|
|
||||||
[[self window] makeFirstResponder: nil];
|
[self defocus];
|
||||||
|
|
||||||
NSMutableDictionary *dict = [NSMutableDictionary new];
|
NSMutableDictionary *dict = [NSMutableDictionary new];
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ static NSMutableSet *LogWindows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
+(id)controllerForTask: (NSTask *)task close: (BOOL)close{
|
+(id)controllerForTask: (NSTask *)task close: (BOOL)close {
|
||||||
LogWindowController *controller = [[LogWindowController alloc] initWithWindowNibName: @"LogWindow"];
|
LogWindowController *controller = [[LogWindowController alloc] initWithWindowNibName: @"LogWindow"];
|
||||||
[controller runTask: task close: close];
|
[controller runTask: task close: close];
|
||||||
return controller;
|
return controller;
|
||||||
|
@ -43,6 +43,8 @@ static NSMutableSet *LogWindows;
|
||||||
|
|
||||||
+(id)controllerForArgs: (NSArray *)args close: (BOOL)close {
|
+(id)controllerForArgs: (NSArray *)args close: (BOOL)close {
|
||||||
|
|
||||||
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||||
|
|
||||||
NSURL *url = MameURL();
|
NSURL *url = MameURL();
|
||||||
|
|
||||||
if (!url) {
|
if (!url) {
|
||||||
|
@ -65,6 +67,30 @@ static NSMutableSet *LogWindows;
|
||||||
|
|
||||||
[task setArguments: args];
|
[task setArguments: args];
|
||||||
|
|
||||||
|
if ([defaults boolForKey: kUseLogWindow] == NO) {
|
||||||
|
|
||||||
|
NSAlert *alert = nil;
|
||||||
|
if (@available(macOS 10.13, *)) {
|
||||||
|
NSError *error = nil;
|
||||||
|
|
||||||
|
[task launchAndReturnError: &error];
|
||||||
|
if (error) {
|
||||||
|
alert = [NSAlert alertWithError: error];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
@try {
|
||||||
|
[task launch];
|
||||||
|
} @catch (NSException *exception) {
|
||||||
|
|
||||||
|
alert = [NSAlert new];
|
||||||
|
[alert setMessageText: [exception reason]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (alert) [alert runModal];
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return [LogWindowController controllerForTask: task close: close];
|
return [LogWindowController controllerForTask: task close: close];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,11 @@
|
||||||
-(void)awakeFromNib {
|
-(void)awakeFromNib {
|
||||||
|
|
||||||
NSBundle *bundle = [NSBundle mainBundle];
|
NSBundle *bundle = [NSBundle mainBundle];
|
||||||
|
#ifdef AMPLE_LITE
|
||||||
|
NSString *path = [bundle pathForResource: @"models~extra" ofType: @"plist"];
|
||||||
|
#else
|
||||||
NSString *path = [bundle pathForResource: @"models" ofType: @"plist"];
|
NSString *path = [bundle pathForResource: @"models" ofType: @"plist"];
|
||||||
|
#endif
|
||||||
_data = [NSArray arrayWithContentsOfFile: path];
|
_data = [NSArray arrayWithContentsOfFile: path];
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ typedef struct Media {
|
||||||
unsigned cass;
|
unsigned cass;
|
||||||
unsigned cdrom;
|
unsigned cdrom;
|
||||||
unsigned hard;
|
unsigned hard;
|
||||||
|
unsigned floppy_8;
|
||||||
unsigned floppy_5_25;
|
unsigned floppy_5_25;
|
||||||
unsigned floppy_3_5;
|
unsigned floppy_3_5;
|
||||||
unsigned pseudo_disk;
|
unsigned pseudo_disk;
|
||||||
|
@ -21,12 +22,17 @@ typedef struct Media {
|
||||||
unsigned midiin;
|
unsigned midiin;
|
||||||
unsigned midiout;
|
unsigned midiout;
|
||||||
unsigned picture;
|
unsigned picture;
|
||||||
|
unsigned rom;
|
||||||
|
uint64_t floppy_mask_8;
|
||||||
|
uint64_t floppy_mask_5_25;
|
||||||
|
uint64_t floppy_mask_3_5;
|
||||||
} Media;
|
} Media;
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
MediaTypeError = -1,
|
MediaTypeError = -1,
|
||||||
MediaTypeUnknown = 0,
|
MediaTypeUnknown = 0,
|
||||||
|
MediaType_8,
|
||||||
MediaType_5_25,
|
MediaType_5_25,
|
||||||
MediaType_3_5,
|
MediaType_3_5,
|
||||||
MediaType_HardDisk,
|
MediaType_HardDisk,
|
||||||
|
@ -34,6 +40,7 @@ typedef enum {
|
||||||
MediaType_Cassette,
|
MediaType_Cassette,
|
||||||
MediaType_Picture,
|
MediaType_Picture,
|
||||||
MediaType_MIDI,
|
MediaType_MIDI,
|
||||||
|
MediaType_ROM,
|
||||||
} MediaType;
|
} MediaType;
|
||||||
|
|
||||||
struct Media MediaFromDictionary(NSDictionary *);
|
struct Media MediaFromDictionary(NSDictionary *);
|
||||||
|
|
|
@ -21,11 +21,13 @@ struct Media MediaFromDictionary(NSDictionary *dict) {
|
||||||
_(hard);
|
_(hard);
|
||||||
_(floppy_3_5);
|
_(floppy_3_5);
|
||||||
_(floppy_5_25);
|
_(floppy_5_25);
|
||||||
|
_(floppy_8);
|
||||||
_(pseudo_disk);
|
_(pseudo_disk);
|
||||||
_(bitbanger);
|
_(bitbanger);
|
||||||
_(midiin);
|
_(midiin);
|
||||||
_(midiout);
|
_(midiout);
|
||||||
_(picture);
|
_(picture);
|
||||||
|
_(rom);
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
#undef _
|
#undef _
|
||||||
|
@ -35,18 +37,48 @@ void MediaAdd(Media *dest, const Media *src) {
|
||||||
|
|
||||||
if (!src || !dest) return;
|
if (!src || !dest) return;
|
||||||
|
|
||||||
|
// could merge from src media but not currently set there.
|
||||||
|
|
||||||
|
//unsigned count;
|
||||||
|
unsigned dest_flops = dest->floppy_8 + dest->floppy_5_25 + dest->floppy_3_5;
|
||||||
|
unsigned src_flops = src->floppy_8 || src->floppy_5_25 || src->floppy_3_5;
|
||||||
|
|
||||||
|
|
||||||
#define _(name) dest->name += src->name;
|
#define _(name) dest->name += src->name;
|
||||||
_(cass);
|
_(cass);
|
||||||
_(cdrom);
|
_(cdrom);
|
||||||
_(hard);
|
_(hard);
|
||||||
_(floppy_3_5);
|
_(floppy_3_5);
|
||||||
_(floppy_5_25);
|
_(floppy_5_25);
|
||||||
|
_(floppy_8);
|
||||||
_(pseudo_disk);
|
_(pseudo_disk);
|
||||||
_(bitbanger);
|
_(bitbanger);
|
||||||
_(midiin);
|
_(midiin);
|
||||||
_(midiout);
|
_(midiout);
|
||||||
_(picture);
|
_(picture);
|
||||||
|
_(rom);
|
||||||
#undef _
|
#undef _
|
||||||
|
|
||||||
|
|
||||||
|
// this assumes any device that supports more than 1 floppy size
|
||||||
|
// the order is 8" < 5.25" < 3.5"
|
||||||
|
|
||||||
|
if (src_flops) {
|
||||||
|
uint64_t bits = 1 << dest_flops;
|
||||||
|
for (unsigned i = 0; i < src->floppy_8; ++i) {
|
||||||
|
dest->floppy_mask_8 |= bits;
|
||||||
|
bits <<= 1;
|
||||||
|
}
|
||||||
|
for (unsigned i = 0; i < src->floppy_5_25; ++i) {
|
||||||
|
dest->floppy_mask_5_25 |= bits;
|
||||||
|
bits <<= 1;
|
||||||
|
}
|
||||||
|
for (unsigned i = 0; i < src->floppy_3_5; ++i) {
|
||||||
|
dest->floppy_mask_3_5 |= bits;
|
||||||
|
bits <<= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL MediaEqual(const Media *lhs, const Media *rhs) {
|
BOOL MediaEqual(const Media *lhs, const Media *rhs) {
|
||||||
|
@ -60,11 +92,17 @@ BOOL MediaEqual(const Media *lhs, const Media *rhs) {
|
||||||
_(hard);
|
_(hard);
|
||||||
_(floppy_3_5);
|
_(floppy_3_5);
|
||||||
_(floppy_5_25);
|
_(floppy_5_25);
|
||||||
|
_(floppy_8);
|
||||||
_(pseudo_disk);
|
_(pseudo_disk);
|
||||||
_(bitbanger);
|
_(bitbanger);
|
||||||
_(midiin);
|
_(midiin);
|
||||||
_(midiout);
|
_(midiout);
|
||||||
_(picture);
|
_(picture);
|
||||||
|
_(rom);
|
||||||
|
|
||||||
|
_(floppy_mask_8);
|
||||||
|
_(floppy_mask_5_25);
|
||||||
|
_(floppy_mask_3_5);
|
||||||
|
|
||||||
return YES;
|
return YES;
|
||||||
#undef _
|
#undef _
|
||||||
|
@ -133,7 +171,8 @@ static BOOL is_raw_35(size_t disk_size) {
|
||||||
if (disk_size & 511) return NO;
|
if (disk_size & 511) return NO;
|
||||||
size_t blocks = disk_size >> 9;
|
size_t blocks = disk_size >> 9;
|
||||||
|
|
||||||
return blocks == 800 || blocks == 1600 || blocks == 1440 || blocks == 2880;
|
// atari st has 360 (single sided) and 720 (double-sided) disks..
|
||||||
|
return blocks == 800 || blocks == 1600 || blocks == 1440 || blocks == 2880 || blocks == 720 || blocks == 360;
|
||||||
}
|
}
|
||||||
|
|
||||||
static MediaType is_woz(const uint8_t *buffer, size_t file_size) {
|
static MediaType is_woz(const uint8_t *buffer, size_t file_size) {
|
||||||
|
@ -198,7 +237,29 @@ static MediaType is_chd(const uint8_t *buffer, size_t file_size) {
|
||||||
return MediaTypeError;
|
return MediaTypeError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static MediaType is_ipf(const uint8_t *buffer, size_t file_size) {
|
||||||
|
// http://justsolve.archiveteam.org/wiki/IPF
|
||||||
|
if (!memcmp(buffer, "CAPS\x00\x00\x00", 7)) return MediaType_3_5;
|
||||||
|
return MediaTypeUnknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
static MediaType is_hxcf(const uint8_t *buffer, size_t file_size) {
|
||||||
|
// HxCFloppyEmulator
|
||||||
|
if (!memcmp(buffer, "HXCMFM", 6)) return MediaType_3_5;
|
||||||
|
return MediaTypeUnknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
static MediaType is_msa(const uint8_t *buffer, size_t file_size) {
|
||||||
|
// Atari MSA
|
||||||
|
if (!memcmp(buffer, "\x0x\x0f", 2)) return MediaType_3_5;
|
||||||
|
return MediaTypeUnknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
static MediaType is_pasti(const uint8_t *buffer, size_t file_size) {
|
||||||
|
// Atari STX/Pasti
|
||||||
|
if (!memcmp(buffer, "RSY\x00\x03\x00", 6)) return MediaType_3_5;
|
||||||
|
return MediaTypeUnknown;
|
||||||
|
}
|
||||||
|
|
||||||
MediaType ClassifyMediaFile(id file) {
|
MediaType ClassifyMediaFile(id file) {
|
||||||
|
|
||||||
|
@ -280,6 +341,40 @@ MediaType ClassifyMediaFile(id file) {
|
||||||
case _x3('m', 'i', 'd'):
|
case _x3('m', 'i', 'd'):
|
||||||
return MediaType_MIDI;
|
return MediaType_MIDI;
|
||||||
|
|
||||||
|
|
||||||
|
// atari st, etc, 3.5 disk?
|
||||||
|
// http://justsolve.archiveteam.org/wiki/Disk_Image_Formats
|
||||||
|
|
||||||
|
case _x3('i', 'p', 'f'):
|
||||||
|
return is_ipf(buffer, st.st_size);
|
||||||
|
|
||||||
|
case _x3('m', 'f', 'm'):
|
||||||
|
return is_hxcf(buffer, st.st_size);
|
||||||
|
|
||||||
|
case _x3('m', 's', 'a'):
|
||||||
|
return is_msa(buffer, st.st_size);
|
||||||
|
|
||||||
|
case _x2('s', 't'):
|
||||||
|
if (is_raw_35(st.st_size)) return MediaType_3_5;
|
||||||
|
return MediaTypeUnknown;
|
||||||
|
|
||||||
|
case _x3('s', 't', 'x'): // pasti
|
||||||
|
return is_pasti(buffer, st.st_size);
|
||||||
|
|
||||||
|
//case _x3('m', 'f', 'i'): // mame/mess floppy image [???]
|
||||||
|
//case _x3('d', 'f', 'i'): // disc ferret image
|
||||||
|
//case _x3('h', 'f', 'e'): // ???
|
||||||
|
//case _x3('t', 'd', '0'): // teledisk - may be split across multiple files (.td1, .td2, ...)
|
||||||
|
//case _x3('i', 'm', 'd'): // imagedisk
|
||||||
|
//case _x3('d', '7', '7'): //pc-88, may have multiple disk images
|
||||||
|
//case _x3('d', '8', '8'): //fm-77, may have multiple disk images.
|
||||||
|
//case _x3('1', 'd', 'd'): // related?
|
||||||
|
//case _x3('c', 'q', 'm'): // copyQM
|
||||||
|
//case _x3('c', 'q', 'i'): // copyQM
|
||||||
|
|
||||||
|
case _x3('r', 'o', 'm'):
|
||||||
|
case _x3('b', 'i', 'n'):
|
||||||
|
return MediaType_ROM;
|
||||||
}
|
}
|
||||||
|
|
||||||
return MediaTypeUnknown;
|
return MediaTypeUnknown;
|
||||||
|
|
|
@ -9,26 +9,8 @@
|
||||||
#import "MediaViewController.h"
|
#import "MediaViewController.h"
|
||||||
#import "TableCellView.h"
|
#import "TableCellView.h"
|
||||||
|
|
||||||
enum {
|
|
||||||
kIndexFloppy525 = 0,
|
|
||||||
kIndexFloppy35,
|
|
||||||
kIndexHardDrive,
|
|
||||||
kIndexCDROM,
|
|
||||||
kIndexCassette,
|
|
||||||
kIndexDiskImage,
|
|
||||||
kIndexBitBanger,
|
|
||||||
kIndexMidiIn,
|
|
||||||
kIndexMidiOut,
|
|
||||||
kIndexPicture, // computer eyes -pic, .png only.
|
|
||||||
// kIndexPrintout // -prin, .prn extension only?
|
|
||||||
|
|
||||||
kIndexLast
|
|
||||||
};
|
|
||||||
|
|
||||||
#define CATEGORY_COUNT 10
|
|
||||||
#define SIZEOF(x) (sizeof(x) / sizeof(x[0]))
|
#define SIZEOF(x) (sizeof(x) / sizeof(x[0]))
|
||||||
|
|
||||||
static_assert(kIndexLast == CATEGORY_COUNT, "Invalid Category Count");
|
|
||||||
|
|
||||||
@protocol MediaNode
|
@protocol MediaNode
|
||||||
-(BOOL)isGroupItem;
|
-(BOOL)isGroupItem;
|
||||||
|
@ -285,15 +267,23 @@ static_assert(kIndexLast == CATEGORY_COUNT, "Invalid Category Count");
|
||||||
|
|
||||||
-(NSString *)viewIdentifier {
|
-(NSString *)viewIdentifier {
|
||||||
if (_category == kIndexBitBanger) return @"BBItemView";
|
if (_category == kIndexBitBanger) return @"BBItemView";
|
||||||
if (_category == kIndexMidiOut) return @"OutputItemView";
|
if (_category == kIndexMidiOut) return @"MidiItemView";
|
||||||
if (_category == kIndexMidiIn) return @"OutputItemView";
|
if (_category == kIndexMidiIn) return @"MidiItemView";
|
||||||
return @"ItemView";
|
return @"ItemView";
|
||||||
}
|
}
|
||||||
|
|
||||||
-(void)prepareView: (TablePathView *)view {
|
-(void)prepareView: (MediaTableCellView *)view {
|
||||||
/* set the path tag = category. */
|
/* set the path tag = category. */
|
||||||
|
|
||||||
|
[view prepareView: _category];
|
||||||
|
#if 0
|
||||||
|
if (_category == kIndexMidiIn || _category == kIndexMidiOut || _category == kIndexBitBanger) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
NSPathControl *pc = [view pathControl];
|
NSPathControl *pc = [view pathControl];
|
||||||
[pc setTag: _category + 1]; // to differentiate 0 / no path control.
|
[pc setTag: _category + 1]; // to differentiate 0 / no path control.
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
-(CGFloat)height {
|
-(CGFloat)height {
|
||||||
|
@ -331,6 +321,7 @@ static_assert(kIndexLast == CATEGORY_COUNT, "Invalid Category Count");
|
||||||
if (first) return;
|
if (first) return;
|
||||||
first++;
|
first++;
|
||||||
|
|
||||||
|
_data[kIndexFloppy8] = [MediaCategory categoryWithTitle: @"8\" Floppies"];
|
||||||
_data[kIndexFloppy525] = [MediaCategory categoryWithTitle: @"5.25\" Floppies"];
|
_data[kIndexFloppy525] = [MediaCategory categoryWithTitle: @"5.25\" Floppies"];
|
||||||
_data[kIndexFloppy35] = [MediaCategory categoryWithTitle: @"3.5\" Floppies"];
|
_data[kIndexFloppy35] = [MediaCategory categoryWithTitle: @"3.5\" Floppies"];
|
||||||
_data[kIndexHardDrive] = [MediaCategory categoryWithTitle: @"Hard Drives"];
|
_data[kIndexHardDrive] = [MediaCategory categoryWithTitle: @"Hard Drives"];
|
||||||
|
@ -342,6 +333,7 @@ static_assert(kIndexLast == CATEGORY_COUNT, "Invalid Category Count");
|
||||||
_data[kIndexMidiIn] = [MediaCategory categoryWithTitle: @"MIDI (In)"];
|
_data[kIndexMidiIn] = [MediaCategory categoryWithTitle: @"MIDI (In)"];
|
||||||
_data[kIndexMidiOut] = [MediaCategory categoryWithTitle: @"MIDI (Out)"];
|
_data[kIndexMidiOut] = [MediaCategory categoryWithTitle: @"MIDI (Out)"];
|
||||||
_data[kIndexPicture] = [MediaCategory categoryWithTitle: @"Picture"];
|
_data[kIndexPicture] = [MediaCategory categoryWithTitle: @"Picture"];
|
||||||
|
_data[kIndexROM] = [MediaCategory categoryWithTitle: @"ROM"];
|
||||||
|
|
||||||
for (unsigned i = 0; i < CATEGORY_COUNT; ++i) {
|
for (unsigned i = 0; i < CATEGORY_COUNT; ++i) {
|
||||||
[_data[i] setCategory: i];
|
[_data[i] setCategory: i];
|
||||||
|
@ -349,7 +341,6 @@ static_assert(kIndexLast == CATEGORY_COUNT, "Invalid Category Count");
|
||||||
}
|
}
|
||||||
|
|
||||||
_root = [NSMutableArray new];
|
_root = [NSMutableArray new];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -357,29 +348,52 @@ static_assert(kIndexLast == CATEGORY_COUNT, "Invalid Category Count");
|
||||||
-(void)rebuildArgs {
|
-(void)rebuildArgs {
|
||||||
|
|
||||||
static char* prefix[] = {
|
static char* prefix[] = {
|
||||||
"flop", "flop", "hard", "cdrm", "cass", "disk", "bitb", "min", "mout", "pic"
|
"flop", "flop", "flop", "hard", "cdrm", "cass", "disk", "bitb", "min", "mout", "pic", "rom",
|
||||||
};
|
};
|
||||||
static_assert(SIZEOF(prefix) == CATEGORY_COUNT, "Missing item");
|
static_assert(SIZEOF(prefix) == CATEGORY_COUNT, "Missing item");
|
||||||
NSMutableArray *args = [NSMutableArray new];
|
NSMutableArray *args = [NSMutableArray new];
|
||||||
|
|
||||||
unsigned counts[CATEGORY_COUNT] = { 0 };
|
//unsigned counts[CATEGORY_COUNT] = { 0 };
|
||||||
|
|
||||||
|
uint64_t floppy_mask_8 = _media.floppy_mask_8;
|
||||||
|
uint64_t floppy_mask_5_25 = _media.floppy_mask_5_25;
|
||||||
|
uint64_t floppy_mask_3_5 = _media.floppy_mask_3_5;
|
||||||
|
|
||||||
for (unsigned j = 0; j < CATEGORY_COUNT; ++j) {
|
for (unsigned j = 0; j < CATEGORY_COUNT; ++j) {
|
||||||
|
|
||||||
|
//uint64_t floppy_mask = _media.floppy_mask;
|
||||||
|
unsigned index = 0;
|
||||||
|
|
||||||
MediaCategory *cat = _data[j];
|
MediaCategory *cat = _data[j];
|
||||||
NSInteger valid = [cat validCount];
|
NSInteger valid = [cat validCount];
|
||||||
|
|
||||||
for (NSInteger i = 0; i < valid; ++i) {
|
for (NSInteger i = 0; i < valid; ++i) {
|
||||||
counts[j]++;
|
|
||||||
|
|
||||||
MediaItem *item = [cat objectAtIndex: i];
|
MediaItem *item = [cat objectAtIndex: i];
|
||||||
NSString *arg = [item argument];
|
NSString *arg = [item argument];
|
||||||
|
|
||||||
if (arg) {
|
switch(j) {
|
||||||
[args addObject: [NSString stringWithFormat: @"-%s%u", prefix[j], counts[j]]];
|
case kIndexFloppy8:
|
||||||
[args addObject: arg];
|
index = ffsll(floppy_mask_8);
|
||||||
|
floppy_mask_8 &= ~(1 << (index-1));
|
||||||
|
break;
|
||||||
|
case kIndexFloppy525:
|
||||||
|
index = ffsll(floppy_mask_5_25);
|
||||||
|
floppy_mask_5_25 &= ~(1 << (index-1));
|
||||||
|
break;
|
||||||
|
case kIndexFloppy35:
|
||||||
|
index = ffsll(floppy_mask_3_5);
|
||||||
|
floppy_mask_3_5 &= ~(1 << (index-1));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
++index;
|
||||||
}
|
}
|
||||||
|
if (!arg) continue;
|
||||||
|
if (!index) continue;
|
||||||
|
|
||||||
|
[args addObject: [NSString stringWithFormat: @"-%s%u", prefix[j], index]];
|
||||||
|
[args addObject: arg];
|
||||||
}
|
}
|
||||||
if (j == 0) counts[1] = counts[0]; // 3.5/5.25
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[self setArgs: args];
|
[self setArgs: args];
|
||||||
|
@ -430,19 +444,13 @@ x = media.name; cat = _data[index]; delta |= [cat setItemCount: x]
|
||||||
_(hard, kIndexHardDrive);
|
_(hard, kIndexHardDrive);
|
||||||
_(floppy_3_5, kIndexFloppy35);
|
_(floppy_3_5, kIndexFloppy35);
|
||||||
_(floppy_5_25, kIndexFloppy525);
|
_(floppy_5_25, kIndexFloppy525);
|
||||||
|
_(floppy_8, kIndexFloppy8);
|
||||||
_(pseudo_disk, kIndexDiskImage);
|
_(pseudo_disk, kIndexDiskImage);
|
||||||
_(bitbanger, kIndexBitBanger);
|
_(bitbanger, kIndexBitBanger);
|
||||||
// disable midi for now - it's either a midi file (which auto-plays too soon to be useful)
|
|
||||||
// or a midi device ("default" for first one).
|
|
||||||
// So we should build a device list (and pre-populate the default one)
|
|
||||||
// another approach is a separate utility to act as a midi/serial input converter
|
|
||||||
// and midi file / serial converter so the modem/serial port could be used.
|
|
||||||
#if 0
|
|
||||||
_(midiin, kIndexMidiIn);
|
_(midiin, kIndexMidiIn);
|
||||||
_(midiout, kIndexMidiOut);
|
_(midiout, kIndexMidiOut);
|
||||||
#endif
|
|
||||||
_(picture, kIndexPicture);
|
_(picture, kIndexPicture);
|
||||||
|
_(rom, kIndexROM);
|
||||||
|
|
||||||
if (delta) {
|
if (delta) {
|
||||||
[self rebuildRoot];
|
[self rebuildRoot];
|
||||||
|
@ -756,6 +764,7 @@ static NSString *kDragType = @"private.ample.media";
|
||||||
|
|
||||||
switch(tag) {
|
switch(tag) {
|
||||||
|
|
||||||
|
case kIndexFloppy8:
|
||||||
case kIndexFloppy525:
|
case kIndexFloppy525:
|
||||||
case kIndexFloppy35:
|
case kIndexFloppy35:
|
||||||
case kIndexHardDrive:
|
case kIndexHardDrive:
|
||||||
|
@ -773,6 +782,7 @@ static NSString *kDragType = @"private.ample.media";
|
||||||
case kIndexMidiIn:
|
case kIndexMidiIn:
|
||||||
case kIndexMidiOut:
|
case kIndexMidiOut:
|
||||||
case kIndexBitBanger:
|
case kIndexBitBanger:
|
||||||
|
case kIndexROM:
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -782,6 +792,9 @@ static NSString *kDragType = @"private.ample.media";
|
||||||
-(IBAction)textAction: (id)sender {
|
-(IBAction)textAction: (id)sender {
|
||||||
[self rebuildArgs];
|
[self rebuildArgs];
|
||||||
}
|
}
|
||||||
|
- (IBAction)midiAction:(id)sender {
|
||||||
|
[self rebuildArgs];
|
||||||
|
}
|
||||||
|
|
||||||
-(IBAction)resetMedia:(id)sender {
|
-(IBAction)resetMedia:(id)sender {
|
||||||
[self resetDiskImages];
|
[self resetDiskImages];
|
||||||
|
@ -819,11 +832,13 @@ static NSString *kDragType = @"private.ample.media";
|
||||||
switch(mt) {
|
switch(mt) {
|
||||||
case MediaType_3_5: ix = kIndexFloppy35; break;
|
case MediaType_3_5: ix = kIndexFloppy35; break;
|
||||||
case MediaType_5_25: ix = kIndexFloppy525; break;
|
case MediaType_5_25: ix = kIndexFloppy525; break;
|
||||||
|
case MediaType_8: ix = kIndexFloppy8; break;
|
||||||
case MediaType_Cassette: ix = kIndexCassette; break;
|
case MediaType_Cassette: ix = kIndexCassette; break;
|
||||||
case MediaType_HardDisk: ix = kIndexHardDrive; break;
|
case MediaType_HardDisk: ix = kIndexHardDrive; break;
|
||||||
case MediaType_CDROM: ix = kIndexCDROM; break;
|
case MediaType_CDROM: ix = kIndexCDROM; break;
|
||||||
|
|
||||||
case MediaType_Picture: ix = kIndexPicture; break;
|
case MediaType_Picture: ix = kIndexPicture; break;
|
||||||
|
case MediaType_ROM: ix = kIndexROM; break;
|
||||||
case MediaType_MIDI: // ix = kIndexMidiIn; break;
|
case MediaType_MIDI: // ix = kIndexMidiIn; break;
|
||||||
case MediaTypeError:
|
case MediaTypeError:
|
||||||
case MediaTypeUnknown:
|
case MediaTypeUnknown:
|
||||||
|
@ -861,7 +876,7 @@ static NSString *kDragType = @"private.ample.media";
|
||||||
}
|
}
|
||||||
|
|
||||||
static NSString * BookmarkStrings[] = {
|
static NSString * BookmarkStrings[] = {
|
||||||
@"flop_525", @"flop_35", @"hard", @"cdrm", @"cass", @"disk", @"bitb", @"midiin", @"midiout", @"pic"
|
@"flop_8", @"flop_525", @"flop_35", @"hard", @"cdrm", @"cass", @"disk", @"bitb", @"midiin", @"midiout", @"pic", @"rom",
|
||||||
};
|
};
|
||||||
static_assert(SIZEOF(BookmarkStrings) == CATEGORY_COUNT, "Missing item");
|
static_assert(SIZEOF(BookmarkStrings) == CATEGORY_COUNT, "Missing item");
|
||||||
|
|
||||||
|
|
25
Ample/MidiManager.h
Normal file
25
Ample/MidiManager.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
//
|
||||||
|
// MidiManager.h
|
||||||
|
// Ample
|
||||||
|
//
|
||||||
|
// Created by Kelvin Sherlock on 8/6/2021.
|
||||||
|
// Copyright © 2021 Kelvin Sherlock. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef MidiManager_h
|
||||||
|
#define MidiManager_h
|
||||||
|
|
||||||
|
|
||||||
|
extern NSString *kMidiSourcesChangedNotification;
|
||||||
|
extern NSString *kMidiDestinationsChangedNotification;
|
||||||
|
|
||||||
|
@interface MidiManager : NSObject
|
||||||
|
|
||||||
|
@property NSArray *sources;
|
||||||
|
@property NSArray *destinations;
|
||||||
|
|
||||||
|
+(instancetype)sharedManager;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
#endif /* MidiManager_h */
|
153
Ample/MidiManager.m
Normal file
153
Ample/MidiManager.m
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
//
|
||||||
|
// Midi.m
|
||||||
|
// Ample
|
||||||
|
//
|
||||||
|
// Created by Kelvin Sherlock on 8/6/2021.
|
||||||
|
// Copyright © 2021 Kelvin Sherlock. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <CoreMIDI/CoreMIDI.h>
|
||||||
|
|
||||||
|
#import "MidiManager.h"
|
||||||
|
|
||||||
|
static NSArray *MidiSources(void) {
|
||||||
|
|
||||||
|
ItemCount count = MIDIGetNumberOfSources();
|
||||||
|
if (count <= 0) return @[];
|
||||||
|
|
||||||
|
NSMutableArray *rv = [NSMutableArray arrayWithCapacity: count + 1];
|
||||||
|
|
||||||
|
MIDIEndpointRef ep;
|
||||||
|
for(int i = 0; i < count; ++i) {
|
||||||
|
ep = MIDIGetSource(i);
|
||||||
|
if (!ep) continue;
|
||||||
|
|
||||||
|
// https://developer.apple.com/library/archive/qa/qa1374/_index.html
|
||||||
|
CFStringRef str = NULL;
|
||||||
|
MIDIObjectGetStringProperty(ep, kMIDIPropertyDisplayName, &str);
|
||||||
|
|
||||||
|
if (str) {
|
||||||
|
[rv addObject: (__bridge id _Nonnull)(str)];
|
||||||
|
CFRelease(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static NSArray *MidiDestinations(void) {
|
||||||
|
|
||||||
|
ItemCount count = MIDIGetNumberOfDestinations();
|
||||||
|
if (count <= 0) return @[];
|
||||||
|
|
||||||
|
NSMutableArray *rv = [NSMutableArray arrayWithCapacity: count + 1];
|
||||||
|
|
||||||
|
MIDIEndpointRef ep;
|
||||||
|
for(int i = 0; i < count; ++i) {
|
||||||
|
ep = MIDIGetDestination(i);
|
||||||
|
if (!ep) continue;
|
||||||
|
|
||||||
|
// https://developer.apple.com/library/archive/qa/qa1374/_index.html
|
||||||
|
CFStringRef str = NULL;
|
||||||
|
MIDIObjectGetStringProperty(ep, kMIDIPropertyDisplayName, &str);
|
||||||
|
|
||||||
|
if (str) {
|
||||||
|
[rv addObject: (__bridge id _Nonnull)(str)];
|
||||||
|
CFRelease(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSString *kMidiSourcesChangedNotification = @"Midi Sources Changed";
|
||||||
|
NSString *kMidiDestinationsChangedNotification = @"Midi Destinations Changed";
|
||||||
|
|
||||||
|
|
||||||
|
@interface MidiManager () {
|
||||||
|
MIDIClientRef _client;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)objectAddRemove: (const MIDIObjectAddRemoveNotification *)message;
|
||||||
|
-(void)objectPropertyChanged: (const MIDIObjectPropertyChangeNotification *)message;
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
static MidiManager *singleton = nil;
|
||||||
|
@implementation MidiManager
|
||||||
|
|
||||||
|
-(void)awakeFromNib {
|
||||||
|
if (!singleton) singleton = self;
|
||||||
|
}
|
||||||
|
|
||||||
|
+(instancetype)sharedManager {
|
||||||
|
if (!singleton) singleton = [MidiManager new];
|
||||||
|
return singleton;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(instancetype)init {
|
||||||
|
|
||||||
|
if (singleton) return singleton;
|
||||||
|
|
||||||
|
OSStatus status;
|
||||||
|
|
||||||
|
|
||||||
|
status = MIDIClientCreateWithBlock(
|
||||||
|
CFSTR("serial_midi"),
|
||||||
|
&_client,
|
||||||
|
^(const MIDINotification *message){
|
||||||
|
switch(message->messageID) {
|
||||||
|
case kMIDIMsgObjectAdded:
|
||||||
|
case kMIDIMsgObjectRemoved:
|
||||||
|
[self objectAddRemove: (const MIDIObjectAddRemoveNotification *)message];
|
||||||
|
break;
|
||||||
|
case kMIDIMsgPropertyChanged:
|
||||||
|
[self objectPropertyChanged: (const MIDIObjectPropertyChangeNotification *)message];
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
_sources = MidiSources();
|
||||||
|
_destinations = MidiDestinations();
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)objectAddRemove: (const MIDIObjectAddRemoveNotification *)message {
|
||||||
|
|
||||||
|
const MIDIObjectAddRemoveNotification *m = (const MIDIObjectAddRemoveNotification *)message;
|
||||||
|
|
||||||
|
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
||||||
|
|
||||||
|
if (m->childType == kMIDIObjectType_Source) {
|
||||||
|
[self setSources: MidiSources()];
|
||||||
|
[nc postNotificationName: kMidiSourcesChangedNotification object: self];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m->childType == kMIDIObjectType_Destination) {
|
||||||
|
[self setDestinations: MidiDestinations()];
|
||||||
|
[nc postNotificationName: kMidiDestinationsChangedNotification object: self];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
-(void)objectPropertyChanged: (const MIDIObjectPropertyChangeNotification *)message {
|
||||||
|
|
||||||
|
const MIDIObjectPropertyChangeNotification *m = (const MIDIObjectPropertyChangeNotification *)message;
|
||||||
|
if (m->propertyName == kMIDIPropertyDisplayName) {
|
||||||
|
[self setSources: MidiSources()];
|
||||||
|
[self setDestinations: MidiDestinations()];
|
||||||
|
|
||||||
|
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
||||||
|
[nc postNotificationName: kMidiSourcesChangedNotification object: self];
|
||||||
|
[nc postNotificationName: kMidiDestinationsChangedNotification object: self];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-(void)dealloc {
|
||||||
|
|
||||||
|
if (_client)
|
||||||
|
MIDIClientDispose(_client);
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
|
@ -27,7 +27,11 @@
|
||||||
first++;
|
first++;
|
||||||
|
|
||||||
NSBundle *bundle = [NSBundle mainBundle];
|
NSBundle *bundle = [NSBundle mainBundle];
|
||||||
|
#ifdef AMPLE_LITE
|
||||||
|
NSString *path = [bundle pathForResource: @"models~extra" ofType: @"plist"];
|
||||||
|
#else
|
||||||
NSString *path = [bundle pathForResource: @"models" ofType: @"plist"];
|
NSString *path = [bundle pathForResource: @"models" ofType: @"plist"];
|
||||||
|
#endif
|
||||||
_data = [NSArray arrayWithContentsOfFile: path];
|
_data = [NSArray arrayWithContentsOfFile: path];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,7 +104,10 @@
|
||||||
<td>Toggle full screen mode</td>
|
<td>Toggle full screen mode</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><kbd>F12</kbd></td>
|
<td>
|
||||||
|
<span data-macbook=false><kbd>F12</kbd></span>
|
||||||
|
<span data-macbook=true><kbd>Fn</kbd>+<kbd>F12</kbd></span>
|
||||||
|
</td>
|
||||||
<td>Reset Key</td>
|
<td>Reset Key</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
@ -138,7 +141,7 @@
|
||||||
<td>Quit</td>
|
<td>Quit</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><kbd>P</kbd></td>
|
<td><kbd>F5</kbd></td>
|
||||||
<td>Pause</td>
|
<td>Pause</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
|
@ -163,8 +166,7 @@
|
||||||
<td><kbd>Shift</kbd>+<kbd>F3</kbd></td>
|
<td><kbd>Shift</kbd>+<kbd>F3</kbd></td>
|
||||||
<td>Hard reset</td>
|
<td>Hard reset</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<!--
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td><kbd>F5</kbd></td>
|
<td><kbd>F5</kbd></td>
|
||||||
<td>Toggle debugger</td>
|
<td>Toggle debugger</td>
|
||||||
|
@ -173,15 +175,17 @@
|
||||||
<td><kbd>Shift</kbd>+<kbd>F5</kbd></td>
|
<td><kbd>Shift</kbd>+<kbd>F5</kbd></td>
|
||||||
<td>Toggle graphic filters</td>
|
<td>Toggle graphic filters</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
-->
|
||||||
|
<tr>
|
||||||
|
<td><kbd>Shift</kbd>+<kbd>F6</kbd></td>
|
||||||
|
<td>Create save state</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td><kbd>F7</kbd></td>
|
<td><kbd>F7</kbd></td>
|
||||||
<td>Load state</td>
|
<td>Load save state</td>
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><kbd>Shift</kbd>+<kbd>F7</kbd></td>
|
|
||||||
<td>Save state</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td><kbd>F10</kbd></td>
|
<td><kbd>F10</kbd></td>
|
||||||
|
|
875
Ample/Resources/a1000.plist
Normal file
875
Ample/Resources/a1000.plist
Normal file
|
@ -0,0 +1,875 @@
|
||||||
|
<?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>a1000</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 (PAL)</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
</dict>
|
||||||
|
<key>resolution</key>
|
||||||
|
<array>
|
||||||
|
<integer>724</integer>
|
||||||
|
<integer>567</integer>
|
||||||
|
</array>
|
||||||
|
<key>slots</key>
|
||||||
|
<array>
|
||||||
|
<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>rs232</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Serial</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>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>scorpion_ic</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>RS-232 Loopback</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_loopback</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>dec_loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 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>RS-232 Null Modem</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>null_modem</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Synchronous I/O</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</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>mockingboard</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Sweet Micro Systems Mockingboard D</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>mockingboardd</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>name</key>
|
||||||
|
<string>centronics</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Printer</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/>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>centronics_printer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>pl80</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>COMX PL-80</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>comx_pl80</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>covox_stereo</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Covox (Stereo-in-1)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>covox_stereo</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>covox</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Covox Speech Thing</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>covox</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>digiblst</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Digiblaster (DIY)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>cpcdigiblst</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>ap2000</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Epson ActionPrinter 2000</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>ap2000</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>ex800</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Epson EX-800</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>ex800</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>lx800</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Epson LX-800</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>lx800</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>lx810l</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Epson LX-810L</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>lx810l</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>p72</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>NEC PinWriter P72</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>p72</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>samdac</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SAMDAC</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>centronics_samdac</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>nlq401</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Schneider NLQ 401 Matrix Printer</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>nlq401</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>chessmec</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Tasc ChessMachine EC Interface</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>centronics_chessmec</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>smartboard</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Tasc SmartBoard SB30 Interface</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>centronics_smartboard</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>kbd</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Keyboard</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>a1000_dk</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 Keyboard (Denmark)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1000kbd_dk</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a1000_fr</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 Keyboard (France/Belgium)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1000kbd_fr</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a1000_de</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 Keyboard (Germany/Austria)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1000kbd_de</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a1000_it</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 Keyboard (Italy)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1000kbd_it</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a1000_se</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 Keyboard (Sweden/Finland)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1000kbd_se</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a1000_us</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 Keyboard (U.S./Canada)</string>
|
||||||
|
<key>default</key>
|
||||||
|
<true/>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1000kbd_us</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a1000_gb</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 Keyboard (UK)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1000kbd_gb</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a1200_us</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1200 Keyboard Rev B</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1200kbd_rb</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_g80_dk</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000 Keyboard (Cherry - Denmark)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_g80_dk</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_g80_de</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000 Keyboard (Cherry - Germany/Austria)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_g80_de</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_g80_se</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000 Keyboard (Cherry - Sweden/Finland)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_g80_se</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_g80_us</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000 Keyboard (Cherry - U.S./Canada)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_g80_us</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_g80_gb</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000 Keyboard (Cherry - UK)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_g80_gb</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_dk</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (Denmark)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_dk</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_fr</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (France/Belgium)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_fr</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_de</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (Germany/Austria)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_de</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_it</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (Italy)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_it</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_no</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (Norway)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_no</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_es</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (Spain)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_es</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_se</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (Sweden/Finland)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_se</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_ch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (Switzerland)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_ch</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_us</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (U.S./Canada)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_us</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_gb</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (UK)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_gb</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>
|
||||||
|
<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>
|
||||||
|
<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>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>fdc:2</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>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>fdc:3</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>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
<key>slots</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>:dce</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>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</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>rs_printer</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Radio Shack Serial Printer</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Loopback</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>dec_loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Loopback (DEC 12-15336-00)</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>null_modem</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Null Modem</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Synchronous I/O</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</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>mockingboard</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Sweet Micro Systems Mockingboard D</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>swtpc8212</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SWTPC8212 Terminal</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<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>amiga_workbench.xml</string>
|
||||||
|
<string>amiga_hardware.xml</string>
|
||||||
|
<string>amiga_apps.xml</string>
|
||||||
|
<string>amiga_flop.xml</string>
|
||||||
|
<string>amigaocs_flop.xml</string>
|
||||||
|
<string>amiga_demos.xml</string>
|
||||||
|
<string>amiga_a1000.xml</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
875
Ample/Resources/a1000n.plist
Normal file
875
Ample/Resources/a1000n.plist
Normal file
|
@ -0,0 +1,875 @@
|
||||||
|
<?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>a1000n</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 (NTSC)</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
</dict>
|
||||||
|
<key>resolution</key>
|
||||||
|
<array>
|
||||||
|
<integer>724</integer>
|
||||||
|
<integer>483</integer>
|
||||||
|
</array>
|
||||||
|
<key>slots</key>
|
||||||
|
<array>
|
||||||
|
<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>rs232</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Serial</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>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>scorpion_ic</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>RS-232 Loopback</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_loopback</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>dec_loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 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>RS-232 Null Modem</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>null_modem</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Synchronous I/O</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</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>mockingboard</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Sweet Micro Systems Mockingboard D</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>mockingboardd</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>name</key>
|
||||||
|
<string>centronics</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Printer</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/>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>centronics_printer</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>pl80</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>COMX PL-80</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>comx_pl80</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>covox_stereo</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Covox (Stereo-in-1)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>covox_stereo</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>covox</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Covox Speech Thing</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>covox</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>digiblst</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Digiblaster (DIY)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>cpcdigiblst</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>ap2000</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Epson ActionPrinter 2000</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>ap2000</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>ex800</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Epson EX-800</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>ex800</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>lx800</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Epson LX-800</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>lx800</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>lx810l</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Epson LX-810L</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>lx810l</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>p72</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>NEC PinWriter P72</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>p72</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>samdac</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SAMDAC</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>centronics_samdac</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>nlq401</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Schneider NLQ 401 Matrix Printer</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>nlq401</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>chessmec</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Tasc ChessMachine EC Interface</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>centronics_chessmec</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>smartboard</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Tasc SmartBoard SB30 Interface</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>centronics_smartboard</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>kbd</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Keyboard</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>a1000_dk</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 Keyboard (Denmark)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1000kbd_dk</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a1000_fr</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 Keyboard (France/Belgium)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1000kbd_fr</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a1000_de</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 Keyboard (Germany/Austria)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1000kbd_de</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a1000_it</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 Keyboard (Italy)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1000kbd_it</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a1000_se</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 Keyboard (Sweden/Finland)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1000kbd_se</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a1000_us</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 Keyboard (U.S./Canada)</string>
|
||||||
|
<key>default</key>
|
||||||
|
<true/>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1000kbd_us</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a1000_gb</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1000 Keyboard (UK)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1000kbd_gb</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a1200_us</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 1200 Keyboard Rev B</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a1200kbd_rb</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_g80_dk</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000 Keyboard (Cherry - Denmark)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_g80_dk</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_g80_de</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000 Keyboard (Cherry - Germany/Austria)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_g80_de</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_g80_se</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000 Keyboard (Cherry - Sweden/Finland)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_g80_se</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_g80_us</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000 Keyboard (Cherry - U.S./Canada)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_g80_us</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_g80_gb</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000 Keyboard (Cherry - UK)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_g80_gb</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_dk</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (Denmark)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_dk</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_fr</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (France/Belgium)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_fr</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_de</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (Germany/Austria)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_de</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_it</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (Italy)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_it</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_no</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (Norway)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_no</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_es</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (Spain)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_es</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_se</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (Sweden/Finland)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_se</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_ch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (Switzerland)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_ch</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_us</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (U.S./Canada)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_us</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>a2000_gb</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Amiga 2000/3000/4000 Keyboard (UK)</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2000kbd_gb</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>
|
||||||
|
<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>
|
||||||
|
<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>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>fdc:2</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>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>fdc:3</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>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
<key>slots</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>:dce</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>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</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>rs_printer</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Radio Shack Serial Printer</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Loopback</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>dec_loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Loopback (DEC 12-15336-00)</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>null_modem</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Null Modem</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Synchronous I/O</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</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>mockingboard</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Sweet Micro Systems Mockingboard D</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>swtpc8212</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SWTPC8212 Terminal</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<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>amiga_workbench.xml</string>
|
||||||
|
<string>amiga_hardware.xml</string>
|
||||||
|
<string>amiga_apps.xml</string>
|
||||||
|
<string>amiga_flop.xml</string>
|
||||||
|
<string>amigaocs_flop.xml</string>
|
||||||
|
<string>amiga_demos.xml</string>
|
||||||
|
<string>amiga_a1000.xml</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
3002
Ample/Resources/a2000.plist
Normal file
3002
Ample/Resources/a2000.plist
Normal file
File diff suppressed because it is too large
Load Diff
3002
Ample/Resources/a2000n.plist
Normal file
3002
Ample/Resources/a2000n.plist
Normal file
File diff suppressed because it is too large
Load Diff
1255
Ample/Resources/a500.plist
Normal file
1255
Ample/Resources/a500.plist
Normal file
File diff suppressed because it is too large
Load Diff
1255
Ample/Resources/a500n.plist
Normal file
1255
Ample/Resources/a500n.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
8141
Ample/Resources/ace2200.plist
Normal file
8141
Ample/Resources/ace2200.plist
Normal file
File diff suppressed because it is too large
Load Diff
575
Ample/Resources/ace500.plist
Normal file
575
Ample/Resources/ace500.plist
Normal file
|
@ -0,0 +1,575 @@
|
||||||
|
<?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>ace500</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Franklin ACE 500</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
</dict>
|
||||||
|
<key>resolution</key>
|
||||||
|
<array>
|
||||||
|
<integer>560</integer>
|
||||||
|
<integer>192</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>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>gameio</string>
|
||||||
|
<key>description</key>
|
||||||
|
<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>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>picture</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</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>name</key>
|
||||||
|
<string>modem</string>
|
||||||
|
<key>description</key>
|
||||||
|
<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>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>scorpion_ic</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>nss_tvi</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Novag Super System TV Interface</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>nss_tvinterface</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>RS-232 Loopback</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_loopback</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>dec_loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 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>RS-232 Null Modem</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>null_modem</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Synchronous I/O</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</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>mockingboard</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Sweet Micro Systems Mockingboard D</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>mockingboardd</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>devices</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<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>name</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
<key>slots</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>:dce</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>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>nss_tvi</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Novag Super System TV Interface</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>rs_printer</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Radio Shack Serial Printer</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Loopback</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>dec_loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Loopback (DEC 12-15336-00)</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>null_modem</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Null Modem</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Synchronous I/O</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</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>mockingboard</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Sweet Micro Systems Mockingboard D</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>swtpc8212</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SWTPC8212 Terminal</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<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>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>apple2_flop_orig.xml</string>
|
||||||
|
<key>filter</key>
|
||||||
|
<string>A2C</string>
|
||||||
|
</dict>
|
||||||
|
<string>apple2_flop_misc.xml</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
|
@ -14,7 +14,7 @@
|
||||||
<key>resolution</key>
|
<key>resolution</key>
|
||||||
<array>
|
<array>
|
||||||
<integer>512</integer>
|
<integer>512</integer>
|
||||||
<integer>512</integer>
|
<integer>256</integer>
|
||||||
</array>
|
</array>
|
||||||
<key>slots</key>
|
<key>slots</key>
|
||||||
<array>
|
<array>
|
||||||
|
@ -37,6 +37,41 @@
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>bios</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>ROM</string>
|
||||||
|
<key>options</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string></string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>—Default—</string>
|
||||||
|
<key>default</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>v1</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Version 1</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>v2</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Version 2</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>debug</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Debug</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>name</key>
|
<key>name</key>
|
||||||
<string>sl2</string>
|
<string>sl2</string>
|
||||||
|
@ -56,7 +91,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdchle</string>
|
<string>a9fdchle</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy card</string>
|
<string>Agat 840K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat840k_hle</string>
|
<string>agat840k_hle</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -64,7 +99,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc</string>
|
<string>a9fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy controller card</string>
|
<string>Agat 840K Floppy Controller Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat_fdc</string>
|
<string>agat_fdc</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -72,14 +107,9 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a7fdc</string>
|
<string>a7fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat-7 140K floppy card</string>
|
<string>Agat-7 140K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat7_flop</string>
|
<string>agat7_flop</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
|
@ -128,7 +158,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdchle</string>
|
<string>a9fdchle</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy card</string>
|
<string>Agat 840K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat840k_hle</string>
|
<string>agat840k_hle</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -136,7 +166,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc</string>
|
<string>a9fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy controller card</string>
|
<string>Agat 840K Floppy Controller Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat_fdc</string>
|
<string>agat_fdc</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -144,16 +174,11 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a7fdc</string>
|
<string>a7fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat-7 140K floppy card</string>
|
<string>Agat-7 140K Floppy Card</string>
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat7_flop</string>
|
<string>agat7_flop</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
|
@ -200,7 +225,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdchle</string>
|
<string>a9fdchle</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy card</string>
|
<string>Agat 840K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat840k_hle</string>
|
<string>agat840k_hle</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -208,7 +233,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc</string>
|
<string>a9fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy controller card</string>
|
<string>Agat 840K Floppy Controller Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat_fdc</string>
|
<string>agat_fdc</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -216,14 +241,9 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a7fdc</string>
|
<string>a7fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat-7 140K floppy card</string>
|
<string>Agat-7 140K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat7_flop</string>
|
<string>agat7_flop</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
|
@ -272,7 +292,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdchle</string>
|
<string>a9fdchle</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy card</string>
|
<string>Agat 840K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat840k_hle</string>
|
<string>agat840k_hle</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -280,7 +300,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc</string>
|
<string>a9fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy controller card</string>
|
<string>Agat 840K Floppy Controller Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat_fdc</string>
|
<string>agat_fdc</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -288,14 +308,9 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a7fdc</string>
|
<string>a7fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat-7 140K floppy card</string>
|
<string>Agat-7 140K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat7_flop</string>
|
<string>agat7_flop</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
|
@ -342,7 +357,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdchle</string>
|
<string>a9fdchle</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy card</string>
|
<string>Agat 840K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat840k_hle</string>
|
<string>agat840k_hle</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -350,7 +365,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc</string>
|
<string>a9fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy controller card</string>
|
<string>Agat 840K Floppy Controller Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat_fdc</string>
|
<string>agat_fdc</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -358,14 +373,9 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a7fdc</string>
|
<string>a7fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat-7 140K floppy card</string>
|
<string>Agat-7 140K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat7_flop</string>
|
<string>agat7_flop</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
|
@ -448,6 +458,14 @@
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<false/>
|
<false/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>digiblst</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Digiblaster (DIY)</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>ap2000</string>
|
<string>ap2000</string>
|
||||||
|
@ -476,7 +494,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>lx810l</string>
|
<string>lx810l</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Espon LX-810L</string>
|
<string>Epson LX-810L</string>
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<false/>
|
<false/>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -496,6 +514,14 @@
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<false/>
|
<false/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>nlq401</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Schneider NLQ 401 Matrix Printer</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>chessmec</string>
|
<string>chessmec</string>
|
||||||
|
@ -516,6 +542,69 @@
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>agat7_flop</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>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>: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>
|
<dict>
|
||||||
<key>name</key>
|
<key>name</key>
|
||||||
<string>agat_fdc</string>
|
<string>agat_fdc</string>
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
<key>resolution</key>
|
<key>resolution</key>
|
||||||
<array>
|
<array>
|
||||||
<integer>512</integer>
|
<integer>512</integer>
|
||||||
<integer>512</integer>
|
<integer>256</integer>
|
||||||
</array>
|
</array>
|
||||||
<key>slots</key>
|
<key>slots</key>
|
||||||
<array>
|
<array>
|
||||||
|
@ -37,6 +37,35 @@
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>bios</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>ROM</string>
|
||||||
|
<key>options</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string></string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>—Default—</string>
|
||||||
|
<key>default</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>v1</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Version 1</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>v2</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Version 2</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>name</key>
|
<key>name</key>
|
||||||
<string>sl1</string>
|
<string>sl1</string>
|
||||||
|
@ -56,7 +85,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdchle</string>
|
<string>a9fdchle</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy card</string>
|
<string>Agat 840K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat840k_hle</string>
|
<string>agat840k_hle</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -64,7 +93,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc</string>
|
<string>a9fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy controller card</string>
|
<string>Agat 840K Floppy Controller Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat_fdc</string>
|
<string>agat_fdc</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -80,27 +109,17 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc140</string>
|
<string>a9fdc140</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat-9 140K floppy card</string>
|
<string>Agat-9 140K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat9_flop</string>
|
<string>agat9_flop</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>diskii</string>
|
<string>diskiing</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Apple Disk II controller</string>
|
<string>Apple Disk II NG Controller (16-sector)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>a2diskii</string>
|
<string>a2diskiing</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
|
@ -131,7 +150,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdchle</string>
|
<string>a9fdchle</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy card</string>
|
<string>Agat 840K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat840k_hle</string>
|
<string>agat840k_hle</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -139,7 +158,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc</string>
|
<string>a9fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy controller card</string>
|
<string>Agat 840K Floppy Controller Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat_fdc</string>
|
<string>agat_fdc</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -155,27 +174,17 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc140</string>
|
<string>a9fdc140</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat-9 140K floppy card</string>
|
<string>Agat-9 140K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat9_flop</string>
|
<string>agat9_flop</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>diskii</string>
|
<string>diskiing</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Apple Disk II controller</string>
|
<string>Apple Disk II NG Controller (16-sector)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>a2diskii</string>
|
<string>a2diskiing</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
|
@ -206,7 +215,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdchle</string>
|
<string>a9fdchle</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy card</string>
|
<string>Agat 840K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat840k_hle</string>
|
<string>agat840k_hle</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -214,7 +223,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc</string>
|
<string>a9fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy controller card</string>
|
<string>Agat 840K Floppy Controller Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat_fdc</string>
|
<string>agat_fdc</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -230,27 +239,17 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc140</string>
|
<string>a9fdc140</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat-9 140K floppy card</string>
|
<string>Agat-9 140K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat9_flop</string>
|
<string>agat9_flop</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>diskii</string>
|
<string>diskiing</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Apple Disk II controller</string>
|
<string>Apple Disk II NG Controller (16-sector)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>a2diskii</string>
|
<string>a2diskiing</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
|
@ -281,7 +280,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdchle</string>
|
<string>a9fdchle</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy card</string>
|
<string>Agat 840K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat840k_hle</string>
|
<string>agat840k_hle</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -289,7 +288,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc</string>
|
<string>a9fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy controller card</string>
|
<string>Agat 840K Floppy Controller Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat_fdc</string>
|
<string>agat_fdc</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -305,27 +304,17 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc140</string>
|
<string>a9fdc140</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat-9 140K floppy card</string>
|
<string>Agat-9 140K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat9_flop</string>
|
<string>agat9_flop</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>diskii</string>
|
<string>diskiing</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Apple Disk II controller</string>
|
<string>Apple Disk II NG Controller (16-sector)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>a2diskii</string>
|
<string>a2diskiing</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
|
@ -356,7 +345,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdchle</string>
|
<string>a9fdchle</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy card</string>
|
<string>Agat 840K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat840k_hle</string>
|
<string>agat840k_hle</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -364,7 +353,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc</string>
|
<string>a9fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy controller card</string>
|
<string>Agat 840K Floppy Controller Card</string>
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
|
@ -382,27 +371,17 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc140</string>
|
<string>a9fdc140</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat-9 140K floppy card</string>
|
<string>Agat-9 140K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat9_flop</string>
|
<string>agat9_flop</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>diskii</string>
|
<string>diskiing</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Apple Disk II controller</string>
|
<string>Apple Disk II NG Controller (16-sector)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>a2diskii</string>
|
<string>a2diskiing</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
|
@ -433,7 +412,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdchle</string>
|
<string>a9fdchle</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy card</string>
|
<string>Agat 840K Floppy Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat840k_hle</string>
|
<string>agat840k_hle</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -441,7 +420,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc</string>
|
<string>a9fdc</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat 840K floppy controller card</string>
|
<string>Agat 840K Floppy Controller Card</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat_fdc</string>
|
<string>agat_fdc</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -457,29 +436,19 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>a9fdc140</string>
|
<string>a9fdc140</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Agat-9 140K floppy card</string>
|
<string>Agat-9 140K Floppy Card</string>
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>agat9_flop</string>
|
<string>agat9_flop</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>diskii</string>
|
<string>diskiing</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Apple Disk II controller</string>
|
<string>Apple Disk II NG Controller (16-sector)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>a2diskii</string>
|
<string>a2diskiing</string>
|
||||||
<key>media</key>
|
|
||||||
<dict>
|
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
|
@ -494,6 +463,69 @@
|
||||||
</array>
|
</array>
|
||||||
<key>devices</key>
|
<key>devices</key>
|
||||||
<array>
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>a2diskiing</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>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>: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>
|
<dict>
|
||||||
<key>name</key>
|
<key>name</key>
|
||||||
<string>a7ports</string>
|
<string>a7ports</string>
|
||||||
|
@ -544,6 +576,14 @@
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<false/>
|
<false/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>digiblst</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Digiblaster (DIY)</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>ap2000</string>
|
<string>ap2000</string>
|
||||||
|
@ -572,7 +612,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>lx810l</string>
|
<string>lx810l</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Espon LX-810L</string>
|
<string>Epson LX-810L</string>
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<false/>
|
<false/>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -592,6 +632,14 @@
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<false/>
|
<false/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>nlq401</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Schneider NLQ 401 Matrix Printer</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>chessmec</string>
|
<string>chessmec</string>
|
||||||
|
@ -612,6 +660,69 @@
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>agat9_flop</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>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>: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>
|
<dict>
|
||||||
<key>name</key>
|
<key>name</key>
|
||||||
<string>agat_fdc</string>
|
<string>agat_fdc</string>
|
||||||
|
|
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
|
@ -12,7 +12,7 @@
|
||||||
<key>resolution</key>
|
<key>resolution</key>
|
||||||
<array>
|
<array>
|
||||||
<integer>560</integer>
|
<integer>560</integer>
|
||||||
<integer>384</integer>
|
<integer>192</integer>
|
||||||
</array>
|
</array>
|
||||||
<key>slots</key>
|
<key>slots</key>
|
||||||
<array>
|
<array>
|
||||||
|
@ -164,7 +164,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>cassette</string>
|
<string>cassette</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Apple I cassette board</string>
|
<string>Apple I Cassette Board</string>
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
|
@ -179,7 +179,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>cffa</string>
|
<string>cffa</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>CFFA Compact Flash for Apple I</string>
|
<string>CFFA Compact Flash For Apple I</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>cffa1</string>
|
<string>cffa1</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -232,6 +232,30 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>zip100</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Iomega Zip 100MB IDE Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>cr589</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Matsushita CR589 CD-ROM Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>xm3301</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Toshiba XM-3301 CD-ROM Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
|
@ -273,6 +297,30 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>zip100</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Iomega Zip 100MB IDE Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>cr589</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Matsushita CR589 CD-ROM Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>xm3301</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Toshiba XM-3301 CD-ROM Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -12,7 +12,7 @@
|
||||||
<key>resolution</key>
|
<key>resolution</key>
|
||||||
<array>
|
<array>
|
||||||
<integer>560</integer>
|
<integer>560</integer>
|
||||||
<integer>384</integer>
|
<integer>192</integer>
|
||||||
</array>
|
</array>
|
||||||
<key>slots</key>
|
<key>slots</key>
|
||||||
<array>
|
<array>
|
||||||
|
@ -73,7 +73,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>joy</string>
|
<string>joy</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Apple II analog joysticks</string>
|
<string>Apple II Analog Joysticks</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>a2joy</string>
|
<string>a2joy</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -81,7 +81,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>paddles</string>
|
<string>paddles</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Apple II paddles</string>
|
<string>Apple II Paddles</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>a2pdls</string>
|
<string>a2pdls</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -131,11 +131,27 @@
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>ie15_terminal</string>
|
<string>ie15_terminal</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>scorpion_ic</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>nss_tvi</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Novag Super System TV Interface</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>nss_tvinterface</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>pty</string>
|
<string>pty</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Pseudo terminal</string>
|
<string>Pseudo Terminal</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>pseudo_terminal</string>
|
<string>pseudo_terminal</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -151,7 +167,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>loopback</string>
|
<string>loopback</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Loopback</string>
|
<string>RS-232 Loopback</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>rs232_loopback</string>
|
<string>rs232_loopback</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -159,7 +175,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>dec_loopback</string>
|
<string>dec_loopback</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Loopback (DEC 12-15336-00)</string>
|
<string>RS-232 Loopback (DEC 12-15336-00)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>dec_rs232_loopback</string>
|
<string>dec_rs232_loopback</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -167,7 +183,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>null_modem</string>
|
<string>null_modem</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Null Modem</string>
|
<string>RS-232 Null Modem</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>null_modem</string>
|
<string>null_modem</string>
|
||||||
<key>media</key>
|
<key>media</key>
|
||||||
|
@ -176,11 +192,19 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>rs232_sync_io</string>
|
<string>rs232_sync_io</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Synchronous I/O</string>
|
<string>RS-232 Synchronous I/O</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>rs232_sync_io</string>
|
<string>rs232_sync_io</string>
|
||||||
<key>media</key>
|
<key>media</key>
|
||||||
|
@ -262,11 +286,27 @@
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>ie15_terminal</string>
|
<string>ie15_terminal</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>scorpion_ic</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>nss_tvi</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Novag Super System TV Interface</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>nss_tvinterface</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>pty</string>
|
<string>pty</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Pseudo terminal</string>
|
<string>Pseudo Terminal</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>pseudo_terminal</string>
|
<string>pseudo_terminal</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -282,7 +322,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>loopback</string>
|
<string>loopback</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Loopback</string>
|
<string>RS-232 Loopback</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>rs232_loopback</string>
|
<string>rs232_loopback</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -290,7 +330,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>dec_loopback</string>
|
<string>dec_loopback</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Loopback (DEC 12-15336-00)</string>
|
<string>RS-232 Loopback (DEC 12-15336-00)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>dec_rs232_loopback</string>
|
<string>dec_rs232_loopback</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -298,7 +338,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>null_modem</string>
|
<string>null_modem</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Null Modem</string>
|
<string>RS-232 Null Modem</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>null_modem</string>
|
<string>null_modem</string>
|
||||||
<key>media</key>
|
<key>media</key>
|
||||||
|
@ -307,11 +347,19 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>rs232_sync_io</string>
|
<string>rs232_sync_io</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Synchronous I/O</string>
|
<string>RS-232 Synchronous I/O</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>rs232_sync_io</string>
|
<string>rs232_sync_io</string>
|
||||||
<key>media</key>
|
<key>media</key>
|
||||||
|
@ -436,6 +484,166 @@
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
<key>slots</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>:dce</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>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>nss_tvi</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Novag Super System TV Interface</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>rs_printer</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Radio Shack Serial Printer</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Loopback</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>dec_loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Loopback (DEC 12-15336-00)</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>null_modem</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Null Modem</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Synchronous I/O</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</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>mockingboard</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Sweet Micro Systems Mockingboard D</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>swtpc8212</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SWTPC8212 Terminal</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>name</key>
|
<key>name</key>
|
||||||
<string>sunkbd_adaptor</string>
|
<string>sunkbd_adaptor</string>
|
||||||
|
|
|
@ -8,15 +8,11 @@
|
||||||
<string>Apple //c Plus</string>
|
<string>Apple //c Plus</string>
|
||||||
<key>media</key>
|
<key>media</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>floppy_5_25</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
<key>floppy_3_5</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
</dict>
|
||||||
<key>resolution</key>
|
<key>resolution</key>
|
||||||
<array>
|
<array>
|
||||||
<integer>560</integer>
|
<integer>560</integer>
|
||||||
<integer>384</integer>
|
<integer>192</integer>
|
||||||
</array>
|
</array>
|
||||||
<key>slots</key>
|
<key>slots</key>
|
||||||
<array>
|
<array>
|
||||||
|
@ -79,6 +75,25 @@
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</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>
|
<dict>
|
||||||
<key>name</key>
|
<key>name</key>
|
||||||
<string>gameio</string>
|
<string>gameio</string>
|
||||||
|
@ -98,7 +113,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>joy</string>
|
<string>joy</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Apple II analog joysticks</string>
|
<string>Apple II Analog Joysticks</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>a2joy</string>
|
<string>a2joy</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -106,7 +121,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>paddles</string>
|
<string>paddles</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Apple II paddles</string>
|
<string>Apple II Paddles</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>a2pdls</string>
|
<string>a2pdls</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -156,11 +171,27 @@
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>ie15_terminal</string>
|
<string>ie15_terminal</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>scorpion_ic</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>nss_tvi</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Novag Super System TV Interface</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>nss_tvinterface</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>pty</string>
|
<string>pty</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Pseudo terminal</string>
|
<string>Pseudo Terminal</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>pseudo_terminal</string>
|
<string>pseudo_terminal</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -176,7 +207,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>loopback</string>
|
<string>loopback</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Loopback</string>
|
<string>RS-232 Loopback</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>rs232_loopback</string>
|
<string>rs232_loopback</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -184,7 +215,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>dec_loopback</string>
|
<string>dec_loopback</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Loopback (DEC 12-15336-00)</string>
|
<string>RS-232 Loopback (DEC 12-15336-00)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>dec_rs232_loopback</string>
|
<string>dec_rs232_loopback</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -192,7 +223,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>null_modem</string>
|
<string>null_modem</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Null Modem</string>
|
<string>RS-232 Null Modem</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>null_modem</string>
|
<string>null_modem</string>
|
||||||
<key>media</key>
|
<key>media</key>
|
||||||
|
@ -201,11 +232,19 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>rs232_sync_io</string>
|
<string>rs232_sync_io</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Synchronous I/O</string>
|
<string>RS-232 Synchronous I/O</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>rs232_sync_io</string>
|
<string>rs232_sync_io</string>
|
||||||
<key>media</key>
|
<key>media</key>
|
||||||
|
@ -287,11 +326,27 @@
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>ie15_terminal</string>
|
<string>ie15_terminal</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>scorpion_ic</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>nss_tvi</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Novag Super System TV Interface</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>nss_tvinterface</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>pty</string>
|
<string>pty</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Pseudo terminal</string>
|
<string>Pseudo Terminal</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>pseudo_terminal</string>
|
<string>pseudo_terminal</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -307,7 +362,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>loopback</string>
|
<string>loopback</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Loopback</string>
|
<string>RS-232 Loopback</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>rs232_loopback</string>
|
<string>rs232_loopback</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -315,7 +370,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>dec_loopback</string>
|
<string>dec_loopback</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Loopback (DEC 12-15336-00)</string>
|
<string>RS-232 Loopback (DEC 12-15336-00)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>dec_rs232_loopback</string>
|
<string>dec_rs232_loopback</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -323,7 +378,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>null_modem</string>
|
<string>null_modem</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Null Modem</string>
|
<string>RS-232 Null Modem</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>null_modem</string>
|
<string>null_modem</string>
|
||||||
<key>media</key>
|
<key>media</key>
|
||||||
|
@ -332,11 +387,19 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>rs232_sync_io</string>
|
<string>rs232_sync_io</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Synchronous I/O</string>
|
<string>RS-232 Synchronous I/O</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>rs232_sync_io</string>
|
<string>rs232_sync_io</string>
|
||||||
<key>media</key>
|
<key>media</key>
|
||||||
|
@ -398,6 +461,337 @@
|
||||||
</array>
|
</array>
|
||||||
<key>devices</key>
|
<key>devices</key>
|
||||||
<array>
|
<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>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>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>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>fdc: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>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: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>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>rs232_patch_box</string>
|
||||||
|
<key>slots</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>:dce</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>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>nss_tvi</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Novag Super System TV Interface</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>rs_printer</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Radio Shack Serial Printer</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Loopback</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>dec_loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Loopback (DEC 12-15336-00)</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>null_modem</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Null Modem</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Synchronous I/O</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</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>mockingboard</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Sweet Micro Systems Mockingboard D</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>swtpc8212</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SWTPC8212 Terminal</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>name</key>
|
<key>name</key>
|
||||||
<string>sunkbd_adaptor</string>
|
<string>sunkbd_adaptor</string>
|
||||||
|
|
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
|
@ -12,7 +12,7 @@
|
||||||
<key>resolution</key>
|
<key>resolution</key>
|
||||||
<array>
|
<array>
|
||||||
<integer>560</integer>
|
<integer>560</integer>
|
||||||
<integer>384</integer>
|
<integer>192</integer>
|
||||||
</array>
|
</array>
|
||||||
<key>slots</key>
|
<key>slots</key>
|
||||||
<array>
|
<array>
|
||||||
|
@ -55,6 +55,35 @@
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>bios</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>ROM</string>
|
||||||
|
<key>options</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string></string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>—Default—</string>
|
||||||
|
<key>default</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>original</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Apple /// boot ROM</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>soshd</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Rob Justice SOSHDBOOT</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>name</key>
|
<key>name</key>
|
||||||
<string>smartport</string>
|
<string>smartport</string>
|
||||||
|
@ -101,7 +130,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>cffa2</string>
|
<string>cffa2</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>CFFA 2.0 Compact Flash (6502 firmware, www.dreher.net)</string>
|
<string>CFFA 2.0 Compact Flash (6502 Firmware)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>a2cffa02</string>
|
<string>a2cffa02</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -113,6 +142,14 @@
|
||||||
<key>disabled</key>
|
<key>disabled</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>grafex</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Grafex-32</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2grafex</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>softcard3</string>
|
<string>softcard3</string>
|
||||||
|
@ -190,7 +227,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>cffa2</string>
|
<string>cffa2</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>CFFA 2.0 Compact Flash (6502 firmware, www.dreher.net)</string>
|
<string>CFFA 2.0 Compact Flash (6502 Firmware)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>a2cffa02</string>
|
<string>a2cffa02</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -202,6 +239,14 @@
|
||||||
<key>disabled</key>
|
<key>disabled</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>grafex</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Grafex-32</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2grafex</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>softcard3</string>
|
<string>softcard3</string>
|
||||||
|
@ -279,7 +324,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>cffa2</string>
|
<string>cffa2</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>CFFA 2.0 Compact Flash (6502 firmware, www.dreher.net)</string>
|
<string>CFFA 2.0 Compact Flash (6502 Firmware)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>a2cffa02</string>
|
<string>a2cffa02</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -291,6 +336,14 @@
|
||||||
<key>disabled</key>
|
<key>disabled</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>grafex</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Grafex-32</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2grafex</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>softcard3</string>
|
<string>softcard3</string>
|
||||||
|
@ -368,7 +421,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>cffa2</string>
|
<string>cffa2</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>CFFA 2.0 Compact Flash (6502 firmware, www.dreher.net)</string>
|
<string>CFFA 2.0 Compact Flash (6502 Firmware)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>a2cffa02</string>
|
<string>a2cffa02</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -380,6 +433,14 @@
|
||||||
<key>disabled</key>
|
<key>disabled</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>grafex</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Grafex-32</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>a2grafex</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>softcard3</string>
|
<string>softcard3</string>
|
||||||
|
@ -434,7 +495,7 @@
|
||||||
<key>name</key>
|
<key>name</key>
|
||||||
<string>rs232</string>
|
<string>rs232</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232</string>
|
<string>Serial</string>
|
||||||
<key>options</key>
|
<key>options</key>
|
||||||
<array>
|
<array>
|
||||||
<dict>
|
<dict>
|
||||||
|
@ -453,11 +514,27 @@
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>ie15_terminal</string>
|
<string>ie15_terminal</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>scorpion_ic</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>nss_tvi</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Novag Super System TV Interface</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>nss_tvinterface</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>pty</string>
|
<string>pty</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>Pseudo terminal</string>
|
<string>Pseudo Terminal</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>pseudo_terminal</string>
|
<string>pseudo_terminal</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -473,7 +550,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>loopback</string>
|
<string>loopback</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Loopback</string>
|
<string>RS-232 Loopback</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>rs232_loopback</string>
|
<string>rs232_loopback</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -481,7 +558,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>dec_loopback</string>
|
<string>dec_loopback</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Loopback (DEC 12-15336-00)</string>
|
<string>RS-232 Loopback (DEC 12-15336-00)</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>dec_rs232_loopback</string>
|
<string>dec_rs232_loopback</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -489,7 +566,7 @@
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>null_modem</string>
|
<string>null_modem</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Null Modem</string>
|
<string>RS-232 Null Modem</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>null_modem</string>
|
<string>null_modem</string>
|
||||||
<key>media</key>
|
<key>media</key>
|
||||||
|
@ -498,11 +575,19 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>rs232_sync_io</string>
|
<string>rs232_sync_io</string>
|
||||||
<key>description</key>
|
<key>description</key>
|
||||||
<string>RS232 Synchronous I/O</string>
|
<string>RS-232 Synchronous I/O</string>
|
||||||
<key>devname</key>
|
<key>devname</key>
|
||||||
<string>rs232_sync_io</string>
|
<string>rs232_sync_io</string>
|
||||||
<key>media</key>
|
<key>media</key>
|
||||||
|
@ -727,6 +812,30 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>zip100</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Iomega Zip 100MB IDE Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>cr589</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Matsushita CR589 CD-ROM Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>xm3301</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Toshiba XM-3301 CD-ROM Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
|
@ -768,6 +877,30 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>zip100</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Iomega Zip 100MB IDE Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>cr589</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Matsushita CR589 CD-ROM Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>xm3301</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Toshiba XM-3301 CD-ROM Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
|
@ -816,6 +949,30 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>zip100</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Iomega Zip 100MB IDE Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>cr589</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Matsushita CR589 CD-ROM Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>xm3301</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Toshiba XM-3301 CD-ROM Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
|
@ -857,6 +1014,30 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>zip100</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Iomega Zip 100MB IDE Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>cr589</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Matsushita CR589 CD-ROM Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>xm3301</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Toshiba XM-3301 CD-ROM Drive</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
|
@ -866,6 +1047,35 @@
|
||||||
<string>cmsscsi</string>
|
<string>cmsscsi</string>
|
||||||
<key>slots</key>
|
<key>slots</key>
|
||||||
<array>
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>bios</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>ROM</string>
|
||||||
|
<key>options</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string></string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>—Default—</string>
|
||||||
|
<key>default</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>cms3190</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>CMS SCSI BIOS dated 3-1-90</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>cms871109</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>CMS SCSI BIOS dated 1987-11-09</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>name</key>
|
<key>name</key>
|
||||||
<string>:scsibus:0</string>
|
<string>:scsibus:0</string>
|
||||||
|
@ -879,6 +1089,19 @@
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>aplcdsc</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Apple SCSI CD-ROM</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>cdrom</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>cdrom</string>
|
<string>cdrom</string>
|
||||||
|
@ -905,6 +1128,14 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>tape</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SCSI tape</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
|
@ -920,6 +1151,19 @@
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>aplcdsc</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Apple SCSI CD-ROM</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>cdrom</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>cdrom</string>
|
<string>cdrom</string>
|
||||||
|
@ -946,6 +1190,14 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>tape</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SCSI tape</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
|
@ -961,6 +1213,19 @@
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>aplcdsc</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Apple SCSI CD-ROM</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>cdrom</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>cdrom</string>
|
<string>cdrom</string>
|
||||||
|
@ -987,6 +1252,14 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>tape</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SCSI tape</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
|
@ -1002,6 +1275,19 @@
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>aplcdsc</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Apple SCSI CD-ROM</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>cdrom</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>cdrom</string>
|
<string>cdrom</string>
|
||||||
|
@ -1028,6 +1314,14 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>tape</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SCSI tape</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
|
@ -1043,6 +1337,19 @@
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>aplcdsc</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Apple SCSI CD-ROM</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>cdrom</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>cdrom</string>
|
<string>cdrom</string>
|
||||||
|
@ -1069,6 +1376,14 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>tape</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SCSI tape</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
|
@ -1084,6 +1399,19 @@
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>aplcdsc</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Apple SCSI CD-ROM</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>cdrom</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>cdrom</string>
|
<string>cdrom</string>
|
||||||
|
@ -1110,6 +1438,14 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>tape</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SCSI tape</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
|
@ -1125,6 +1461,19 @@
|
||||||
<key>default</key>
|
<key>default</key>
|
||||||
<false/>
|
<false/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>aplcdsc</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Apple SCSI CD-ROM</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>cdrom</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<string>cdrom</string>
|
<string>cdrom</string>
|
||||||
|
@ -1151,6 +1500,174 @@
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>tape</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SCSI tape</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
<key>slots</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>:dce</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>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>nss_tvi</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Novag Super System TV Interface</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>rs_printer</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Radio Shack Serial Printer</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Loopback</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>dec_loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Loopback (DEC 12-15336-00)</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>null_modem</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Null Modem</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Synchronous I/O</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</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>mockingboard</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Sweet Micro Systems Mockingboard D</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>swtpc8212</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SWTPC8212 Terminal</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
482
Ample/Resources/bbca.plist
Normal file
482
Ample/Resources/bbca.plist
Normal file
|
@ -0,0 +1,482 @@
|
||||||
|
<?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>bbca</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>BBC Micro Model A</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>cass</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>rom</key>
|
||||||
|
<integer>4</integer>
|
||||||
|
</dict>
|
||||||
|
<key>resolution</key>
|
||||||
|
<array>
|
||||||
|
<integer>640</integer>
|
||||||
|
<integer>256</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>16384</integer>
|
||||||
|
<key>description</key>
|
||||||
|
<string>16K</string>
|
||||||
|
<key>value</key>
|
||||||
|
<string>16K</string>
|
||||||
|
<key>default</key>
|
||||||
|
<true/>
|
||||||
|
</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>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>bios</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>ROM</string>
|
||||||
|
<key>options</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string></string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>—Default—</string>
|
||||||
|
<key>default</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>os12</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>OS 1.20</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>os10</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>OS 1.00</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>os09</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>OS 0.92</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>os01</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>OS 0.10</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>rs423</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Serial</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>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>scorpion_ic</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>RS-232 Loopback</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_loopback</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>dec_loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 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>RS-232 Null Modem</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>null_modem</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Synchronous I/O</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</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>mockingboard</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Sweet Micro Systems Mockingboard D</string>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>mockingboardd</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>devices</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>rs232_patch_box</string>
|
||||||
|
<key>slots</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>:dce</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>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>scorpion</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Micro-Robotics Scorpion Intelligent Controller</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>rs_printer</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Radio Shack Serial Printer</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Loopback</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>dec_loopback</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Loopback (DEC 12-15336-00)</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>null_modem</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Null Modem</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>patch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Patch Box</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>rs232_sync_io</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RS-232 Synchronous I/O</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>bitbanger</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</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>mockingboard</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Sweet Micro Systems Mockingboard D</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>swtpc8212</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>SWTPC8212 Terminal</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<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>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>bbc_cass.xml</string>
|
||||||
|
<key>filter</key>
|
||||||
|
<string>A</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>bbc_rom.xml</string>
|
||||||
|
<key>filter</key>
|
||||||
|
<string>B</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
11686
Ample/Resources/bbcb.plist
Normal file
11686
Ample/Resources/bbcb.plist
Normal file
File diff suppressed because it is too large
Load Diff
8272
Ample/Resources/bbcb_de.plist
Normal file
8272
Ample/Resources/bbcb_de.plist
Normal file
File diff suppressed because it is too large
Load Diff
8272
Ample/Resources/bbcb_no.plist
Normal file
8272
Ample/Resources/bbcb_no.plist
Normal file
File diff suppressed because it is too large
Load Diff
8273
Ample/Resources/bbcb_us.plist
Normal file
8273
Ample/Resources/bbcb_us.plist
Normal file
File diff suppressed because it is too large
Load Diff
8106
Ample/Resources/bbcbp.plist
Normal file
8106
Ample/Resources/bbcbp.plist
Normal file
File diff suppressed because it is too large
Load Diff
8106
Ample/Resources/bbcbp128.plist
Normal file
8106
Ample/Resources/bbcbp128.plist
Normal file
File diff suppressed because it is too large
Load Diff
8041
Ample/Resources/bbcm.plist
Normal file
8041
Ample/Resources/bbcm.plist
Normal file
File diff suppressed because it is too large
Load Diff
7747
Ample/Resources/bbcmc.plist
Normal file
7747
Ample/Resources/bbcmc.plist
Normal file
File diff suppressed because it is too large
Load Diff
8042
Ample/Resources/bbcmt.plist
Normal file
8042
Ample/Resources/bbcmt.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
3403
Ample/Resources/coco.plist
Normal file
3403
Ample/Resources/coco.plist
Normal file
File diff suppressed because it is too large
Load Diff
3332
Ample/Resources/coco2b.plist
Normal file
3332
Ample/Resources/coco2b.plist
Normal file
File diff suppressed because it is too large
Load Diff
3332
Ample/Resources/coco2bh.plist
Normal file
3332
Ample/Resources/coco2bh.plist
Normal file
File diff suppressed because it is too large
Load Diff
3331
Ample/Resources/coco3.plist
Normal file
3331
Ample/Resources/coco3.plist
Normal file
File diff suppressed because it is too large
Load Diff
3331
Ample/Resources/coco3h.plist
Normal file
3331
Ample/Resources/coco3h.plist
Normal file
File diff suppressed because it is too large
Load Diff
3331
Ample/Resources/coco3p.plist
Normal file
3331
Ample/Resources/coco3p.plist
Normal file
File diff suppressed because it is too large
Load Diff
3403
Ample/Resources/cocoh.plist
Normal file
3403
Ample/Resources/cocoh.plist
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
129
Ample/Resources/cz101.plist
Normal file
129
Ample/Resources/cz101.plist
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
<?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>cz101</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>CZ-101</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
</dict>
|
||||||
|
<key>resolution</key>
|
||||||
|
<array>
|
||||||
|
<integer>97</integer>
|
||||||
|
<integer>38</integer>
|
||||||
|
</array>
|
||||||
|
<key>slots</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>ramsize</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>RAM</string>
|
||||||
|
<key>options</key>
|
||||||
|
<array>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>bios</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>ROM</string>
|
||||||
|
<key>options</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string></string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>—Default—</string>
|
||||||
|
<key>default</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>v2</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Version II</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>value</key>
|
||||||
|
<string>v1</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Version I</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>mdin</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>MIDI In</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>midiin</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>MIDI In port</string>
|
||||||
|
<key>default</key>
|
||||||
|
<true/>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>midiin_port</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>midiin</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>mdout</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>MIDI Out</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>midiout</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>MIDI Out port</string>
|
||||||
|
<key>default</key>
|
||||||
|
<true/>
|
||||||
|
<key>devname</key>
|
||||||
|
<string>midiout_port</string>
|
||||||
|
<key>media</key>
|
||||||
|
<dict>
|
||||||
|
<key>midiout</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>devices</key>
|
||||||
|
<array>
|
||||||
|
</array>
|
||||||
|
<key>software</key>
|
||||||
|
<array>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user