mirror of
https://github.com/Luigi30/FruitMachine-Swift.git
synced 2024-11-26 21:52:45 +00:00
more disk fixes
adding language card
This commit is contained in:
parent
e501990af3
commit
26549c7737
@ -7,6 +7,7 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
2A044E2C1F37D65A000E8085 /* LanguageCard16K.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A044E2B1F37D65A000E8085 /* LanguageCard16K.swift */; };
|
||||
2A16ADBB1F33C341004A0333 /* DiskImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A16ADBA1F33C341004A0333 /* DiskImage.swift */; };
|
||||
2A2126841F2A9FA300E43DC1 /* DebuggerWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A2126831F2A9FA300E43DC1 /* DebuggerWindowController.swift */; };
|
||||
2A22EBFB1F21A7A700A36A61 /* IntegerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A22EBFA1F21A7A700A36A61 /* IntegerExtensions.swift */; };
|
||||
@ -56,6 +57,7 @@
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
2A044E2B1F37D65A000E8085 /* LanguageCard16K.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LanguageCard16K.swift; sourceTree = "<group>"; };
|
||||
2A16ADBA1F33C341004A0333 /* DiskImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiskImage.swift; sourceTree = "<group>"; };
|
||||
2A2126831F2A9FA300E43DC1 /* DebuggerWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebuggerWindowController.swift; sourceTree = "<group>"; };
|
||||
2A22EBFA1F21A7A700A36A61 /* IntegerExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntegerExtensions.swift; sourceTree = "<group>"; };
|
||||
@ -150,6 +152,7 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
2A16ADB91F33C2ED004A0333 /* DiskII */,
|
||||
2A044E2B1F37D65A000E8085 /* LanguageCard16K.swift */,
|
||||
2A63C23B1F32CD4800D4F4F8 /* Peripheral.swift */,
|
||||
);
|
||||
path = Peripherals;
|
||||
@ -430,6 +433,7 @@
|
||||
2AE5BA061F2469EB00FAA343 /* AddressConversions.swift in Sources */,
|
||||
2AE42E0A1F28521E00C4900E /* WriteOverride.swift in Sources */,
|
||||
2A6DC7ED1F30492C0066FE0D /* ScreenDelegate.swift in Sources */,
|
||||
2A044E2C1F37D65A000E8085 /* LanguageCard16K.swift in Sources */,
|
||||
2A5BC5191F29A28D008C03BE /* AppleIScreenView.swift in Sources */,
|
||||
2A63C2371F32C55100D4F4F8 /* VideoHelpers.swift in Sources */,
|
||||
2A63C23A1F32CCE900D4F4F8 /* DiskII.swift in Sources */,
|
||||
@ -510,6 +514,7 @@
|
||||
SDKROOT = macosx;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
SWIFT_VERSION = 4.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
@ -559,6 +564,7 @@
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
SWIFT_VERSION = 4.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
|
@ -36,15 +36,15 @@ final class AppleII: NSObject, EmulatedSystem {
|
||||
|
||||
videoMode = .Text
|
||||
|
||||
for i in 1...7 {
|
||||
for i in 0...7 {
|
||||
backplane[i] = nil
|
||||
}
|
||||
backplane[6] = DiskII(slot: 6, romPath: "/Users/luigi/apple2/341-0027-a.p5")
|
||||
|
||||
super.init()
|
||||
|
||||
loadROMs()
|
||||
setupMemory(ramConfig: .fortyeightK)
|
||||
setupPeripherals()
|
||||
loadROMs()
|
||||
|
||||
emuScreenLayer.shouldRasterize = true
|
||||
emuScreenLayer.delegate = emulatorViewDelegate
|
||||
@ -52,7 +52,7 @@ final class AppleII: NSObject, EmulatedSystem {
|
||||
|
||||
emulatorView.wantsLayer = true
|
||||
|
||||
emuScreenLayer.setNeedsDisplay()
|
||||
//emuScreenLayer.setNeedsDisplay()
|
||||
emulatorView.layer?.addSublayer(emuScreenLayer)
|
||||
|
||||
installOverrides()
|
||||
@ -70,11 +70,19 @@ final class AppleII: NSObject, EmulatedSystem {
|
||||
CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/apple2/341-0001-00.e0", offset: 0xE000, length: 0x800)
|
||||
CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/apple2/341-0002-00.e8", offset: 0xE800, length: 0x800)
|
||||
CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/apple2/341-0003-00.f0", offset: 0xF000, length: 0x800)
|
||||
CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/apple2/341-0004-00.f8", offset: 0xF800, length: 0x800)
|
||||
|
||||
//Hardware handles this, really.
|
||||
if(backplane[0] is LanguageCard16K) {
|
||||
//Language Card ROM
|
||||
CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/apple2/341-0020-00.f8", offset: 0xF800, length: 0x800)
|
||||
} else {
|
||||
//Integer BASIC ROM
|
||||
CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/apple2/341-0004-00.f8", offset: 0xF800, length: 0x800)
|
||||
}
|
||||
}
|
||||
|
||||
func installOverrides() {
|
||||
for (slotNum, peripheral) in backplane {
|
||||
for (_, peripheral) in backplane {
|
||||
if(peripheral != nil) {
|
||||
peripheral!.installOverrides()
|
||||
}
|
||||
@ -203,6 +211,24 @@ final class AppleII: NSObject, EmulatedSystem {
|
||||
}
|
||||
}
|
||||
|
||||
func setupPeripherals() {
|
||||
let defaults = UserDefaults.standard
|
||||
|
||||
let slot0 = defaults.string(forKey: "a2_Peripherals_Slot0")
|
||||
if(slot0 == "Language Card (16K)") {
|
||||
backplane[0] = LanguageCard16K(slot: 0, romPath: "/Users/luigi/apple2/341-0020-00.f8")
|
||||
}
|
||||
|
||||
let slot6 = defaults.string(forKey: "a2_Peripherals_Slot6")
|
||||
if(slot6 == "Disk II") {
|
||||
backplane[6] = DiskII(slot: 6, romPath: "/Users/luigi/apple2/341-0027-a.p5")
|
||||
|
||||
let drive = backplane[6]! as! DiskII
|
||||
drive.attachDiskImage(imagePath: "/Users/luigi/apple2/Apex II - Apple II Diagnostic (v4.7-1986).DSK")
|
||||
//drive.attachDiskImage(imagePath: "/Users/luigi/apple2/clean332sysmas.do")
|
||||
}
|
||||
}
|
||||
|
||||
@objc func debuggerBreak() {
|
||||
|
||||
}
|
||||
|
@ -34,7 +34,9 @@ import Cocoa
|
||||
H H WRITE LOAD
|
||||
*/
|
||||
|
||||
class DiskII: NSObject, Peripheral {
|
||||
class DiskII: NSObject, Peripheral, HasROM {
|
||||
let debug = false
|
||||
|
||||
enum MotorPhase {
|
||||
case Phase0
|
||||
case Phase1
|
||||
@ -77,6 +79,8 @@ class DiskII: NSObject, Peripheral {
|
||||
var mediaPosition: Int = 0
|
||||
var motorPhase: MotorPhase = .Phase0
|
||||
|
||||
var preloadedByte: UInt8 = 0x00
|
||||
|
||||
var diskImage: DiskImage?
|
||||
|
||||
init(slot: Int, romPath: String) {
|
||||
@ -106,10 +110,11 @@ class DiskII: NSObject, Peripheral {
|
||||
}
|
||||
|
||||
//http://ftp.twaren.net/NetBSD/misc/wrstuden/Apple_PDFs/Software%20control%20of%20IWM.pdf
|
||||
private func actionDispatchOperation(something: AnyObject, address: UInt16, byte: UInt8?) -> UInt8? {
|
||||
private func actionDispatchOperation(something: AnyObject, address: UInt16, byte: UInt8?) -> UInt8?
|
||||
{
|
||||
let operationNumber = UInt8(address & 0xFF) - UInt8(0x80 & 0xFF) - UInt8(0x10 * slotNumber)
|
||||
|
||||
print("Disk II command: \(operationNumber)")
|
||||
if(debug) { print("Disk II command: \(operationNumber)") }
|
||||
|
||||
//Update the softswitches.
|
||||
switch(operationNumber) {
|
||||
@ -123,15 +128,15 @@ class DiskII: NSObject, Peripheral {
|
||||
{
|
||||
currentTrack -= 1
|
||||
}
|
||||
print("Drive now on track \(currentTrack)")
|
||||
updateCurrentTrackDisplay(drive: softswitches.DriveSelect)
|
||||
if(debug) { print("Drive now on track \(currentTrack)") }
|
||||
//updateCurrentTrackDisplay(drive: softswitches.DriveSelect)
|
||||
} else if(motorPhase == .Phase3) {
|
||||
motorPhase = .Phase0
|
||||
if(currentTrack % 2 == 1 && currentTrack < 34) {
|
||||
currentTrack += 1
|
||||
}
|
||||
print("Drive now on track \(currentTrack)")
|
||||
updateCurrentTrackDisplay(drive: softswitches.DriveSelect)
|
||||
if(debug) { print("Drive now on track \(currentTrack)") }
|
||||
//updateCurrentTrackDisplay(drive: softswitches.DriveSelect)
|
||||
}
|
||||
case 2:
|
||||
softswitches.Phase1 = false
|
||||
@ -149,15 +154,15 @@ class DiskII: NSObject, Peripheral {
|
||||
if(currentTrack % 2 == 1 && currentTrack > 0) {
|
||||
currentTrack -= 1
|
||||
}
|
||||
print("Drive now on track \(currentTrack)")
|
||||
updateCurrentTrackDisplay(drive: softswitches.DriveSelect)
|
||||
if(debug) { print("Drive now on track \(currentTrack)") }
|
||||
//updateCurrentTrackDisplay(drive: softswitches.DriveSelect)
|
||||
} else if(motorPhase == .Phase1) {
|
||||
motorPhase = .Phase2
|
||||
if(currentTrack % 2 == 0 && currentTrack < 34) {
|
||||
currentTrack += 1;
|
||||
}
|
||||
print("Drive now on track \(currentTrack)")
|
||||
updateCurrentTrackDisplay(drive: softswitches.DriveSelect)
|
||||
if(debug) { print("Drive now on track \(currentTrack)") }
|
||||
//updateCurrentTrackDisplay(drive: softswitches.DriveSelect)
|
||||
}
|
||||
case 6:
|
||||
softswitches.Phase3 = false
|
||||
@ -175,7 +180,7 @@ class DiskII: NSObject, Peripheral {
|
||||
selector: #selector(disableDrive1Motor),
|
||||
userInfo: nil,
|
||||
repeats: false)
|
||||
print("Drive 1 Motor will turn off in 1 second")
|
||||
if(debug) { print("Drive 1 Motor will turn off in 1 second") }
|
||||
} else {
|
||||
NotificationCenter.default.post(name: DiskII.N_Drive2MotorOff, object: nil)
|
||||
motor2OffTimer = Timer.scheduledTimer(timeInterval: 1.0,
|
||||
@ -183,63 +188,80 @@ class DiskII: NSObject, Peripheral {
|
||||
selector: #selector(disableDrive2Motor),
|
||||
userInfo: nil,
|
||||
repeats: false)
|
||||
print("Drive 2 Motor will turn off in 1 second")
|
||||
if(debug) { print("Drive 2 Motor will turn off in 1 second") }
|
||||
}
|
||||
case 9:
|
||||
softswitches.MotorPowered = true
|
||||
if(softswitches.DriveSelect == false) {
|
||||
NotificationCenter.default.post(name: DiskII.N_Drive1MotorOn, object: nil)
|
||||
motor1OffTimer?.invalidate()
|
||||
print("Drive 1 Motor is on")
|
||||
if(debug) { print("Drive 1 Motor is on") }
|
||||
} else {
|
||||
NotificationCenter.default.post(name: DiskII.N_Drive2MotorOn, object: nil)
|
||||
motor1OffTimer?.invalidate()
|
||||
print("Drive 2 Motor is on")
|
||||
if(debug) { print("Drive 2 Motor is on") }
|
||||
}
|
||||
case 10:
|
||||
softswitches.DriveSelect = false
|
||||
print("Drive 1 selected")
|
||||
if(debug) { print("Drive 1 selected") }
|
||||
case 11:
|
||||
softswitches.DriveSelect = true
|
||||
print("Drive 2 selected")
|
||||
if(debug) { print("Drive 2 selected") }
|
||||
case 12:
|
||||
softswitches.Q6 = false
|
||||
let trk = CPU.sharedInstance.memoryInterface.readByte(offset: 0xB7EC, bypassOverrides: true)
|
||||
let sec = CPU.sharedInstance.memoryInterface.readByte(offset: 0xB7ED, bypassOverrides: true)
|
||||
let mode = CPU.sharedInstance.memoryInterface.readByte(offset: 0xB7F4, bypassOverrides: true)
|
||||
if(trk == 2 && sec == 4 && mode == 1)
|
||||
{
|
||||
_ = 1
|
||||
}
|
||||
let modeString: String
|
||||
switch (mode) {
|
||||
case 0:
|
||||
modeString = "seeking"
|
||||
case 1:
|
||||
modeString = "reading"
|
||||
case 2:
|
||||
modeString = "writing"
|
||||
case 4:
|
||||
modeString = "formatting"
|
||||
default:
|
||||
modeString = "???"
|
||||
}
|
||||
if(debug) { print("Head is at nibble \(mediaPosition) of track \(currentTrack). DOS is \(modeString) T\(trk) S\(sec).") }
|
||||
updateCurrentTrackSectorDisplay(drive: softswitches.DriveSelect, track: currentTrack, sector: Int(sec))
|
||||
|
||||
if(softswitches.Q7 == false && byte == nil) {
|
||||
//in read mode and a read was requested. get the next byte
|
||||
let trk = CPU.sharedInstance.memoryInterface.readByte(offset: 0xB7EC, bypassOverrides: true)
|
||||
let sec = CPU.sharedInstance.memoryInterface.readByte(offset: 0xB7ED, bypassOverrides: true)
|
||||
let mode = CPU.sharedInstance.memoryInterface.readByte(offset: 0xB7F4, bypassOverrides: true)
|
||||
if(trk == 2 && sec == 4 && mode == 1)
|
||||
{
|
||||
_ = 1
|
||||
}
|
||||
let modeString: String
|
||||
switch (mode) {
|
||||
case 0:
|
||||
modeString = "seeking"
|
||||
case 1:
|
||||
modeString = "reading"
|
||||
case 2:
|
||||
modeString = "writing"
|
||||
case 4:
|
||||
modeString = "formatting"
|
||||
default:
|
||||
modeString = "???"
|
||||
}
|
||||
|
||||
print("Head is at nibble \(mediaPosition) of track \(currentTrack). DOS is \(modeString) T\(trk) S\(sec).")
|
||||
//in read mode and a read was requested. get the next nibble
|
||||
return readByteOfTrack(track: currentTrack, advance: softswitches.MotorPowered ? 1 : 0)
|
||||
}
|
||||
if(softswitches.Q7 == true && byte == nil) {
|
||||
//in write mode
|
||||
writeNibbleOfTrack(track: currentTrack, advance: softswitches.MotorPowered ? 1 : 0, nibble: preloadedByte)
|
||||
return 0x00
|
||||
}
|
||||
|
||||
if(debug) { print("Disk II: Operation failed!") }
|
||||
|
||||
case 13:
|
||||
//WRITE PROTECT SENSE MODE
|
||||
softswitches.Q6 = true
|
||||
case 14:
|
||||
//READ MODE
|
||||
if(debug) { print("Disk II: READ STATUS REGISTER") }
|
||||
softswitches.Q7 = false
|
||||
return 0x00 | (diskImage!.writeProtect ? 0x80 : 0x00) | (softswitches.MotorPowered ? 0x20 : 0x00)
|
||||
case 15:
|
||||
softswitches.Q7 = true
|
||||
|
||||
//STA $C
|
||||
if(softswitches.Q6 == true && byte != nil) {
|
||||
preloadedByte = byte!
|
||||
if(debug) { print("WRITE LOAD: shift register contains \(preloadedByte.asHexString())") }
|
||||
}
|
||||
|
||||
default:
|
||||
print("Unknown command? This can't happen.")
|
||||
if(debug) { print("Unknown command? This can't happen.") }
|
||||
}
|
||||
|
||||
return 0x00
|
||||
@ -258,12 +280,25 @@ class DiskII: NSObject, Peripheral {
|
||||
return result
|
||||
}
|
||||
|
||||
func updateCurrentTrackDisplay(drive: Bool) {
|
||||
func writeNibbleOfTrack(track: Int, advance: Int, nibble: UInt8) {
|
||||
if(diskImage == nil) { return} //No disk inserted, fail.
|
||||
|
||||
let trackData = diskImage?.encodedTracks[track]
|
||||
if(trackData == nil) { return } //No disk inserted, fail.
|
||||
|
||||
if(debug) { print("wrote \(nibble.asHexString()) to disk") }
|
||||
|
||||
diskImage!.encodedTracks[track][mediaPosition] = nibble
|
||||
mediaPosition = (mediaPosition + advance) % trackData!.count
|
||||
}
|
||||
|
||||
|
||||
func updateCurrentTrackSectorDisplay(drive: Bool, track: Int, sector: Int) {
|
||||
if(drive == false) {
|
||||
NotificationCenter.default.post(name: DiskII.N_Drive1TrackChanged, object: currentTrack)
|
||||
NotificationCenter.default.post(name: DiskII.N_Drive1TrackChanged, object: (currentTrack, sector))
|
||||
}
|
||||
else {
|
||||
NotificationCenter.default.post(name: DiskII.N_Drive2TrackChanged, object: currentTrack)
|
||||
NotificationCenter.default.post(name: DiskII.N_Drive2TrackChanged, object: (currentTrack, sector))
|
||||
}
|
||||
}
|
||||
|
||||
@ -288,11 +323,11 @@ class DiskII: NSObject, Peripheral {
|
||||
|
||||
@objc func disableDrive1Motor() {
|
||||
softswitches.MotorPowered = false
|
||||
print("Drive 1 Motor is now off")
|
||||
if(debug) { print("Drive 1 Motor is now off") }
|
||||
}
|
||||
|
||||
@objc func disableDrive2Motor() {
|
||||
softswitches.MotorPowered = false
|
||||
print("Drive 2 Motor is now off")
|
||||
if(debug) { print("Drive 2 Motor is now off") }
|
||||
}
|
||||
}
|
||||
|
@ -83,6 +83,7 @@ class DiskImage: NSObject {
|
||||
var encodedTracks = [[UInt8]]()
|
||||
var fileSize: UInt64 = 0
|
||||
var image: DiskImageFormat?
|
||||
var writeProtect = false
|
||||
|
||||
init(diskPath: String) {
|
||||
do {
|
||||
|
60
FruitMachine/AppleII/Peripherals/LanguageCard16K.swift
Normal file
60
FruitMachine/AppleII/Peripherals/LanguageCard16K.swift
Normal file
@ -0,0 +1,60 @@
|
||||
//
|
||||
// LanguageCard16K.swift
|
||||
// FruitMachine
|
||||
//
|
||||
// Created by Christopher Rohl on 8/6/17.
|
||||
// Copyright © 2017 Christopher Rohl. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
|
||||
class LanguageCard16K: NSObject, Peripheral, HasROM {
|
||||
var slotNumber: Int
|
||||
var romManager: ROMManager
|
||||
|
||||
//16KB of RAM on the Language Card.
|
||||
var ram = [UInt8](repeating: 0xCC, count: 16384)
|
||||
|
||||
var readIOOverride: ReadOverride? = nil
|
||||
var writeIOOverride: WriteOverride? = nil
|
||||
|
||||
func installOverrides() {
|
||||
func installOverrides() {
|
||||
CPU.sharedInstance.memoryInterface.read_overrides.append(readIOOverride!)
|
||||
CPU.sharedInstance.memoryInterface.write_overrides.append(writeIOOverride!)
|
||||
}
|
||||
}
|
||||
|
||||
init(slot: Int, romPath: String) {
|
||||
slotNumber = slot
|
||||
romManager = ROMManager(path: romPath, atAddress: 0x0, size: 2048)
|
||||
|
||||
super.init()
|
||||
|
||||
readIOOverride = ReadOverride(start: UInt16(0xC080 + (0x10 * slotNumber)),
|
||||
end: UInt16(0xC08F + (0x10 * slotNumber)),
|
||||
readAnyway: false,
|
||||
action: actionDispatchOperation)
|
||||
|
||||
writeIOOverride = WriteOverride(start: UInt16(0xC080 + (0x10 * slotNumber)),
|
||||
end: UInt16(0xC08F + (0x10 * slotNumber)),
|
||||
writeAnyway: false,
|
||||
action: actionDispatchOperation)
|
||||
}
|
||||
|
||||
private func actionDispatchOperation(something: AnyObject, address: UInt16, byte: UInt8?) -> UInt8?
|
||||
{
|
||||
let operationNumber = UInt8(address & 0xFF) - UInt8(0x80 & 0xFF) - UInt8(0x10 * slotNumber)
|
||||
var isRead = false
|
||||
if(byte == nil) {
|
||||
isRead = true
|
||||
}
|
||||
|
||||
print("Language Card command: \(isRead == false ? "Read" : "Write") $\(operationNumber.asHexString())")
|
||||
|
||||
return 0x00
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -26,10 +26,8 @@ extension AppleII {
|
||||
|
||||
override func draw(_ dirtyRect: NSRect) {
|
||||
super.draw(dirtyRect)
|
||||
// Drawing code here.
|
||||
|
||||
|
||||
layer?.sublayers![0].setNeedsDisplay()
|
||||
layer?.sublayers![0].display()
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -27,12 +27,10 @@ class AppleIIViewController: NSViewController {
|
||||
preferencesWindowController = PreferencesWindowController()
|
||||
self.view.addSubview(computer.emulatorView)
|
||||
|
||||
preferencesWindowController.setupDefaultsIfRequired()
|
||||
setupDriveNotifications()
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(self.debuggerBreak), name: DebuggerNotifications.Break, object: nil)
|
||||
|
||||
let drive = computer.backplane[6]! as! DiskII
|
||||
drive.attachDiskImage(imagePath: "/Users/luigi/apple2/clean332sysmas.do")
|
||||
|
||||
|
||||
self.frameTimer = Timer.scheduledTimer(timeInterval: 1.0/60.0,
|
||||
target: self,
|
||||
selector: #selector(runEmulation),
|
||||
@ -60,6 +58,7 @@ class AppleIIViewController: NSViewController {
|
||||
|
||||
@IBAction func showPreferences(_ sender: Any) {
|
||||
preferencesWindowController.loadWindow()
|
||||
preferencesWindowController.showWindow(self)
|
||||
}
|
||||
|
||||
@IBAction func doReset(_ sender: Any) {
|
||||
@ -107,12 +106,12 @@ class AppleIIViewController: NSViewController {
|
||||
|
||||
/* drive lights */
|
||||
@objc func drive1TrackChanged(notification: NSNotification) {
|
||||
let num = notification.object as? Int
|
||||
lbl_Drive1.stringValue = "D1 \(num!)"
|
||||
let num = notification.object as? (Int, Int)
|
||||
lbl_Drive1.stringValue = "D1 T\(num!.0) S\(num!.1)"
|
||||
}
|
||||
@objc func drive2TrackChanged(notification: NSNotification) {
|
||||
let num = notification.object as? Int
|
||||
lbl_Drive2.stringValue = "D2 \(num!)"
|
||||
let num = notification.object as? (Int, Int)
|
||||
lbl_Drive2.stringValue = "D1 T\(num!.0) S\(num!.1)"
|
||||
}
|
||||
|
||||
@objc func drive1MotorOff(notification: NSNotification) {
|
||||
|
@ -187,19 +187,19 @@
|
||||
<rect key="frame" x="0.0" y="0.0" width="560" height="400"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jaO-yO-mV1">
|
||||
<rect key="frame" x="446" y="0.0" width="46" height="17"/>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Xl9-rO-Y9T">
|
||||
<rect key="frame" x="478" y="0.0" width="64" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Drive 1" id="Yaa-0g-KnI">
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Drive 2" id="Kaf-uu-AhW">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Xl9-rO-Y9T">
|
||||
<rect key="frame" x="496" y="0.0" width="46" height="17"/>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jaO-yO-mV1">
|
||||
<rect key="frame" x="410" y="0.0" width="64" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Drive 2" id="Kaf-uu-AhW">
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Drive 1" id="Yaa-0g-KnI">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -8,6 +8,8 @@
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="PreferencesWindowController" customModule="FruitMachine" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="a2_Peripherals_Slot0" destination="vWt-St-7kp" id="4VF-4b-kcd"/>
|
||||
<outlet property="a2_Peripherals_Slot6" destination="1CB-yF-5GW" id="zcX-Ts-Jd4"/>
|
||||
<outlet property="path_ROMBasic" destination="ilU-dc-qbI" id="HXt-ut-QQs"/>
|
||||
<outlet property="path_ROMCharacter" destination="RaY-CW-boq" id="Ksl-Va-CNF"/>
|
||||
<outlet property="path_ROMMonitor" destination="baZ-pZ-s9k" id="Pfr-1I-YVU"/>
|
||||
@ -19,30 +21,30 @@
|
||||
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
|
||||
<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="600" height="270"/>
|
||||
<rect key="contentRect" x="196" y="240" width="600" height="400"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="1916" height="936"/>
|
||||
<view key="contentView" wantsLayer="YES" id="se5-gp-TjO">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="270"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="400"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<tabView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="QBQ-oL-aRV">
|
||||
<rect key="frame" x="13" y="2" width="574" height="254"/>
|
||||
<rect key="frame" x="13" y="2" width="574" height="384"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
<tabViewItems>
|
||||
<tabViewItem label="General" identifier="1" id="nQU-pA-pvF">
|
||||
<view key="view" id="iK8-x4-ay0">
|
||||
<rect key="frame" x="10" y="33" width="554" height="208"/>
|
||||
<rect key="frame" x="10" y="33" width="554" height="338"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
</view>
|
||||
</tabViewItem>
|
||||
<tabViewItem label="Paths" identifier="2" id="zXY-01-Th8">
|
||||
<view key="view" id="tiQ-eh-pdD">
|
||||
<rect key="frame" x="10" y="33" width="554" height="208"/>
|
||||
<rect key="frame" x="10" y="33" width="554" height="338"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="0tt-yx-hQq">
|
||||
<rect key="frame" x="15" y="158" width="98" height="17"/>
|
||||
<rect key="frame" x="15" y="288" width="98" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Character ROM" id="DYu-44-QXW">
|
||||
<font key="font" metaFont="system"/>
|
||||
@ -51,7 +53,7 @@
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ahs-aw-sgj">
|
||||
<rect key="frame" x="15" y="126" width="98" height="17"/>
|
||||
<rect key="frame" x="15" y="256" width="98" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="BASIC" id="hqe-Cz-qLg">
|
||||
<font key="font" metaFont="system"/>
|
||||
@ -60,7 +62,7 @@
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="baZ-pZ-s9k">
|
||||
<rect key="frame" x="119" y="185" width="300" height="22"/>
|
||||
<rect key="frame" x="119" y="315" width="300" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="apple1.rom" drawsBackground="YES" id="Gpc-0E-NSa">
|
||||
<font key="font" metaFont="system"/>
|
||||
@ -69,7 +71,7 @@
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="RaY-CW-boq">
|
||||
<rect key="frame" x="119" y="155" width="300" height="22"/>
|
||||
<rect key="frame" x="119" y="285" width="300" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="apple1.vid" drawsBackground="YES" id="pOl-Qk-r52">
|
||||
<font key="font" metaFont="system"/>
|
||||
@ -78,7 +80,7 @@
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ilU-dc-qbI">
|
||||
<rect key="frame" x="119" y="123" width="300" height="22"/>
|
||||
<rect key="frame" x="119" y="253" width="300" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="basic.bin" drawsBackground="YES" id="MeQ-50-cJX">
|
||||
<font key="font" metaFont="system"/>
|
||||
@ -87,7 +89,7 @@
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="7mx-PW-Mqu">
|
||||
<rect key="frame" x="15" y="188" width="98" height="17"/>
|
||||
<rect key="frame" x="15" y="318" width="98" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Monitor ROM" id="Yjm-OO-WWk">
|
||||
<font key="font" metaFont="system"/>
|
||||
@ -96,7 +98,7 @@
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="K1L-jr-UMJ">
|
||||
<rect key="frame" x="421" y="179" width="81" height="32"/>
|
||||
<rect key="frame" x="421" y="309" width="81" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="push" title="Browse" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="C7v-Nv-q0t">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
@ -107,7 +109,7 @@
|
||||
</connections>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="NzD-Hf-wKo">
|
||||
<rect key="frame" x="421" y="149" width="81" height="32"/>
|
||||
<rect key="frame" x="421" y="279" width="81" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="push" title="Browse" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Umn-qd-Iog">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
@ -118,7 +120,7 @@
|
||||
</connections>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cWc-WS-hPu">
|
||||
<rect key="frame" x="421" y="117" width="81" height="32"/>
|
||||
<rect key="frame" x="421" y="247" width="81" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="push" title="Browse" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="e8M-Tb-dKP">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
@ -133,14 +135,206 @@
|
||||
</tabViewItem>
|
||||
<tabViewItem label="Apple I" identifier="" id="0ak-CP-2BL">
|
||||
<view key="view" id="BGQ-27-4EP">
|
||||
<rect key="frame" x="10" y="33" width="554" height="208"/>
|
||||
<rect key="frame" x="10" y="33" width="554" height="338"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
</view>
|
||||
</tabViewItem>
|
||||
<tabViewItem label="Apple II" identifier="" id="aVa-m9-VEl">
|
||||
<view key="view" ambiguous="YES" id="mjS-Jn-KXO">
|
||||
<rect key="frame" x="10" y="33" width="554" height="208"/>
|
||||
<rect key="frame" x="10" y="33" width="554" height="338"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Vav-pa-mvK">
|
||||
<rect key="frame" x="15" y="318" width="40" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Slot 0" id="WlR-dZ-W72">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Rlr-ba-8ra">
|
||||
<rect key="frame" x="15" y="292" width="40" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Slot 1" id="9CT-bF-2b1">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Lvh-92-Ob0">
|
||||
<rect key="frame" x="59" y="286" width="200" height="26"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<popUpButtonCell key="cell" type="push" title="Nothing" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="D6o-nP-s6d" id="RLd-bf-oyA">
|
||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="menu"/>
|
||||
<menu key="menu" id="ehC-Uf-YRv">
|
||||
<items>
|
||||
<menuItem title="Nothing" state="on" id="D6o-nP-s6d"/>
|
||||
<menuItem title="Item 2" id="3Aa-TF-wxE"/>
|
||||
<menuItem title="Item 3" id="8zg-2V-4TE"/>
|
||||
</items>
|
||||
</menu>
|
||||
</popUpButtonCell>
|
||||
</popUpButton>
|
||||
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="tQA-LM-0T1">
|
||||
<rect key="frame" x="59" y="260" width="200" height="26"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<popUpButtonCell key="cell" type="push" title="Nothing" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="RXL-80-c5U" id="M1v-yb-ebb">
|
||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="menu"/>
|
||||
<menu key="menu" id="BVF-4V-WR3">
|
||||
<items>
|
||||
<menuItem title="Nothing" state="on" id="RXL-80-c5U"/>
|
||||
<menuItem title="Item 2" id="zhp-yU-tJQ"/>
|
||||
<menuItem title="Item 3" id="FgR-sg-Ycb"/>
|
||||
</items>
|
||||
</menu>
|
||||
</popUpButtonCell>
|
||||
</popUpButton>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="oeY-9x-3x1">
|
||||
<rect key="frame" x="15" y="239" width="40" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Slot 3" id="qwP-Fk-pIB">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Ron-Jc-5NS">
|
||||
<rect key="frame" x="59" y="233" width="200" height="26"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<popUpButtonCell key="cell" type="push" title="Nothing" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="khL-Nw-Yyb" id="5Uy-Yz-oHu">
|
||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="menu"/>
|
||||
<menu key="menu" id="ABc-nU-K8e">
|
||||
<items>
|
||||
<menuItem title="Nothing" state="on" id="khL-Nw-Yyb"/>
|
||||
<menuItem title="Item 2" id="vhM-Mc-BdY"/>
|
||||
<menuItem title="Item 3" id="dvz-rg-5hC"/>
|
||||
</items>
|
||||
</menu>
|
||||
</popUpButtonCell>
|
||||
</popUpButton>
|
||||
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="vWt-St-7kp">
|
||||
<rect key="frame" x="59" y="313" width="200" height="26"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<popUpButtonCell key="cell" type="push" title="Nothing" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="hE4-yk-CCz" id="SSf-AV-4XO">
|
||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="menu"/>
|
||||
<menu key="menu" id="8JB-yG-5ex">
|
||||
<items>
|
||||
<menuItem title="Nothing" state="on" id="hE4-yk-CCz"/>
|
||||
<menuItem title="Language Card (16K)" id="rIC-xs-0nk"/>
|
||||
</items>
|
||||
</menu>
|
||||
</popUpButtonCell>
|
||||
</popUpButton>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wql-7f-Cmb">
|
||||
<rect key="frame" x="15" y="212" width="40" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Slot 4" id="uVy-Wv-hRJ">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZVS-Jk-MpZ">
|
||||
<rect key="frame" x="15" y="186" width="40" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Slot 5" id="ua9-zw-Mzd">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="sjp-qD-NrB">
|
||||
<rect key="frame" x="59" y="180" width="200" height="26"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<popUpButtonCell key="cell" type="push" title="Nothing" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="LS7-45-B1l" id="6hp-fp-PHh">
|
||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="menu"/>
|
||||
<menu key="menu" id="MGk-a2-Wiw">
|
||||
<items>
|
||||
<menuItem title="Nothing" state="on" id="LS7-45-B1l"/>
|
||||
<menuItem title="Item 2" id="QUc-2y-bgV"/>
|
||||
<menuItem title="Item 3" id="hOL-mV-ObJ"/>
|
||||
</items>
|
||||
</menu>
|
||||
</popUpButtonCell>
|
||||
</popUpButton>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="nm9-Zu-F6e">
|
||||
<rect key="frame" x="15" y="160" width="40" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Slot 6" id="SWC-La-cqL">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1CB-yF-5GW">
|
||||
<rect key="frame" x="59" y="154" width="200" height="26"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<popUpButtonCell key="cell" type="push" title="Disk II" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="2jc-dw-NSC" id="bnz-0t-Peo">
|
||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="menu"/>
|
||||
<menu key="menu" id="Gmy-bt-yLT">
|
||||
<items>
|
||||
<menuItem title="Nothing" id="Fgn-3I-HS8"/>
|
||||
<menuItem title="Disk II" state="on" id="2jc-dw-NSC"/>
|
||||
</items>
|
||||
</menu>
|
||||
</popUpButtonCell>
|
||||
</popUpButton>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="rtE-66-3Uw">
|
||||
<rect key="frame" x="15" y="133" width="40" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Slot 7" id="9oV-LI-9Pq">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="al0-aZ-uIH">
|
||||
<rect key="frame" x="59" y="127" width="200" height="26"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<popUpButtonCell key="cell" type="push" title="Nothing" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="Nxx-1S-5RB" id="eNb-sq-3kP">
|
||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="menu"/>
|
||||
<menu key="menu" id="sm6-od-VnN">
|
||||
<items>
|
||||
<menuItem title="Nothing" state="on" id="Nxx-1S-5RB"/>
|
||||
<menuItem title="Item 2" id="nhv-rv-a60"/>
|
||||
<menuItem title="Item 3" id="M78-5p-KlG"/>
|
||||
</items>
|
||||
</menu>
|
||||
</popUpButtonCell>
|
||||
</popUpButton>
|
||||
<popUpButton verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cyH-8e-Kfo">
|
||||
<rect key="frame" x="59" y="207" width="200" height="26"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<popUpButtonCell key="cell" type="push" title="Nothing" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="F24-4g-S0w" id="UNW-s2-DPf">
|
||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="menu"/>
|
||||
<menu key="menu" id="HDF-3A-IYh">
|
||||
<items>
|
||||
<menuItem title="Nothing" state="on" id="F24-4g-S0w"/>
|
||||
<menuItem title="Item 2" id="qAk-8l-I2H"/>
|
||||
<menuItem title="Item 3" id="KF9-yU-sWA"/>
|
||||
</items>
|
||||
</menu>
|
||||
</popUpButtonCell>
|
||||
</popUpButton>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xvm-ee-hrf">
|
||||
<rect key="frame" x="15" y="266" width="40" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Slot 2" id="IDk-eE-egh">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
</subviews>
|
||||
</view>
|
||||
</tabViewItem>
|
||||
</tabViewItems>
|
||||
|
@ -9,16 +9,50 @@
|
||||
import Cocoa
|
||||
|
||||
class PreferencesWindowController: NSWindowController {
|
||||
/* Apple I ROM paths */
|
||||
@IBOutlet weak var path_ROMMonitor: NSTextField!
|
||||
@IBOutlet weak var path_ROMCharacter: NSTextField!
|
||||
@IBOutlet weak var path_ROMBasic: NSTextField!
|
||||
|
||||
/* Apple II ROM paths */
|
||||
|
||||
/* Apple II Peripherals */
|
||||
@IBOutlet weak var a2_Peripherals_Slot0: NSPopUpButton!
|
||||
@IBOutlet weak var a2_Peripherals_Slot6: NSPopUpButton!
|
||||
|
||||
let defaults = UserDefaults.standard
|
||||
|
||||
override func windowDidLoad() {
|
||||
NotificationCenter.default.addObserver(
|
||||
self,
|
||||
selector: #selector(windowWillClose),
|
||||
name: NSWindow.willCloseNotification,
|
||||
object: nil)
|
||||
|
||||
setupPreferences()
|
||||
super.windowDidLoad()
|
||||
|
||||
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
|
||||
}
|
||||
|
||||
func setupDefaultsIfRequired() {
|
||||
// UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
|
||||
// UserDefaults.standard.synchronize()
|
||||
|
||||
var slot0 = defaults.string(forKey: "a2_Peripherals_Slot0")
|
||||
var slot6 = defaults.string(forKey: "a2_Peripherals_Slot6")
|
||||
|
||||
if(slot0 == nil) { slot0 = "Language Card (16K)" }
|
||||
if(slot6 == nil) { slot6 = "Disk II" }
|
||||
|
||||
defaults.set(slot0, forKey: "a2_Peripherals_Slot0")
|
||||
defaults.set(slot6, forKey: "a2_Peripherals_Slot6")
|
||||
}
|
||||
|
||||
func setupPreferences() {
|
||||
setupA1RomPaths()
|
||||
setupA2Peripherals()
|
||||
}
|
||||
|
||||
func setupA1RomPaths() {
|
||||
let monitorPath = defaults.string(forKey: "path_ROMMonitor")
|
||||
let characterPath = defaults.string(forKey: "path_ROMCharacter")
|
||||
let basicPath = defaults.string(forKey: "path_ROMBasic")
|
||||
@ -36,11 +70,26 @@ class PreferencesWindowController: NSWindowController {
|
||||
}
|
||||
}
|
||||
|
||||
func windowWillClose(_ notification: Notification) {
|
||||
func setupA2Peripherals() {
|
||||
let slot0 = defaults.string(forKey: "a2_Peripherals_Slot0")
|
||||
if(slot0 != nil) {
|
||||
a2_Peripherals_Slot6.selectItem(withTitle: slot0!)
|
||||
}
|
||||
|
||||
let slot6 = defaults.string(forKey: "a2_Peripherals_Slot6")
|
||||
if(slot6 != nil) {
|
||||
a2_Peripherals_Slot6.selectItem(withTitle: slot6!)
|
||||
}
|
||||
}
|
||||
|
||||
@objc func windowWillClose(_ notification: Notification) {
|
||||
defaults.set(path_ROMMonitor.stringValue, forKey: "path_ROMMonitor")
|
||||
defaults.set(path_ROMCharacter.stringValue, forKey: "path_ROMCharacter")
|
||||
defaults.set(path_ROMBasic.stringValue, forKey: "path_ROMBasic")
|
||||
|
||||
defaults.set(a2_Peripherals_Slot0.selectedItem?.title, forKey: "a2_Peripherals_Slot0")
|
||||
defaults.set(a2_Peripherals_Slot6.selectedItem?.title, forKey: "a2_Peripherals_Slot6")
|
||||
|
||||
defaults.synchronize()
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user