diff --git a/FruitMachine/AppleII/AppleIIBase.swift b/FruitMachine/AppleII/AppleIIBase.swift index bd1f5f9..18bb97f 100644 --- a/FruitMachine/AppleII/AppleIIBase.swift +++ b/FruitMachine/AppleII/AppleIIBase.swift @@ -114,6 +114,10 @@ class AppleIIBase: NSObject, EmulatedSystem { func doColdReset() { CPU.sharedInstance.coldReset() + + //Reinitialize peripherals in case they changed. + setupPeripherals() + doReset() } diff --git a/FruitMachine/AppleII/Video/Modes/HiresMode.swift b/FruitMachine/AppleII/Video/Modes/HiresMode.swift index c0473b5..62864dd 100644 --- a/FruitMachine/AppleII/Video/Modes/HiresMode.swift +++ b/FruitMachine/AppleII/Video/Modes/HiresMode.swift @@ -62,8 +62,6 @@ extension AppleIIBase { } rowNumber += Int((offset / 0x80) * 8) - //if(pixel & 0x80) - let dot0 = (pixel & 0x01) == 0x01 let dot1 = (pixel & 0x02) == 0x02 let dot2 = (pixel & 0x04) == 0x04 @@ -80,48 +78,68 @@ extension AppleIIBase { } if(dot0) { - buffer![pixelRowOffset + 0 + pixelColumnOffset] = AppleII.LoresColors.White + buffer![pixelRowOffset + 0 + pixelColumnOffset] = AppleIIBase.HiresMode.Colors.White } else { - buffer![pixelRowOffset + 0 + pixelColumnOffset] = AppleII.LoresColors.Black + buffer![pixelRowOffset + 0 + pixelColumnOffset] = AppleIIBase.HiresMode.Colors.Black } if(dot1) { - buffer![pixelRowOffset + 1 + pixelColumnOffset] = AppleII.LoresColors.White + buffer![pixelRowOffset + 1 + pixelColumnOffset] = AppleIIBase.HiresMode.Colors.White } else { - buffer![pixelRowOffset + 1 + pixelColumnOffset] = AppleII.LoresColors.Black + buffer![pixelRowOffset + 1 + pixelColumnOffset] = AppleIIBase.HiresMode.Colors.Black } if(dot2) { - buffer![pixelRowOffset + 2 + pixelColumnOffset] = AppleII.LoresColors.White + buffer![pixelRowOffset + 2 + pixelColumnOffset] = AppleIIBase.HiresMode.Colors.White } else { - buffer![pixelRowOffset + 2 + pixelColumnOffset] = AppleII.LoresColors.Black + buffer![pixelRowOffset + 2 + pixelColumnOffset] = AppleIIBase.HiresMode.Colors.Black } if(dot3) { - buffer![pixelRowOffset + 3 + pixelColumnOffset] = AppleII.LoresColors.White + buffer![pixelRowOffset + 3 + pixelColumnOffset] = AppleIIBase.HiresMode.Colors.White } else { - buffer![pixelRowOffset + 3 + pixelColumnOffset] = AppleII.LoresColors.Black + buffer![pixelRowOffset + 3 + pixelColumnOffset] = AppleIIBase.HiresMode.Colors.Black } if(dot4) { - buffer![pixelRowOffset + 4 + pixelColumnOffset] = AppleII.LoresColors.White + buffer![pixelRowOffset + 4 + pixelColumnOffset] = AppleIIBase.HiresMode.Colors.White } else { - buffer![pixelRowOffset + 4 + pixelColumnOffset] = AppleII.LoresColors.Black + buffer![pixelRowOffset + 4 + pixelColumnOffset] = AppleIIBase.HiresMode.Colors.Black } if(dot5) { - buffer![pixelRowOffset + 5 + pixelColumnOffset] = AppleII.LoresColors.White + buffer![pixelRowOffset + 5 + pixelColumnOffset] = AppleIIBase.HiresMode.Colors.White } else { - buffer![pixelRowOffset + 5 + pixelColumnOffset] = AppleII.LoresColors.Black + buffer![pixelRowOffset + 5 + pixelColumnOffset] = AppleIIBase.HiresMode.Colors.Black } if(dot6) { - buffer![pixelRowOffset + 6 + pixelColumnOffset] = AppleII.LoresColors.White + buffer![pixelRowOffset + 6 + pixelColumnOffset] = AppleIIBase.HiresMode.Colors.White } else { - buffer![pixelRowOffset + 6 + pixelColumnOffset] = AppleII.LoresColors.Black + buffer![pixelRowOffset + 6 + pixelColumnOffset] = AppleIIBase.HiresMode.Colors.Black } } + + struct Colors { + static let Black = BitmapPixelsLE555.RGB32toLE555(r: 0, g: 0, b: 0) + static let White = BitmapPixelsLE555.RGB32toLE555(r: 255, g: 255, b: 255) + + static func getColor(index: UInt8) -> BitmapPixelsLE555.PixelData { + switch index { + case 0: return AppleIIBase.HiresMode.Colors.Black + case 1: return AppleIIBase.HiresMode.Colors.White + case 2: return AppleIIBase.HiresMode.Colors.White + case 3: return AppleIIBase.HiresMode.Colors.White + case 4: return AppleIIBase.HiresMode.Colors.White + case 5: return AppleIIBase.HiresMode.Colors.White + case 6: return AppleIIBase.HiresMode.Colors.White + case 7: return AppleIIBase.HiresMode.Colors.White + default: + print("tried to get color > 15") + return AppleIIBase.HiresMode.Colors.Black + } + } + } } - } diff --git a/FruitMachine/AppleII/Video/Modes/LoresMode.swift b/FruitMachine/AppleII/Video/Modes/LoresMode.swift index d074f9e..0a127ab 100644 --- a/FruitMachine/AppleII/Video/Modes/LoresMode.swift +++ b/FruitMachine/AppleII/Video/Modes/LoresMode.swift @@ -22,8 +22,8 @@ extension AppleIIBase { let pixelNybbleHi = pixel & 0x0F let pixelNybbleLo = (pixel & 0xF0) >> 4 - let colorHi = AppleII.LoresColors.getColor(index: pixelNybbleHi) - let colorLo = LoresColors.getColor(index: pixelNybbleLo) + let colorHi = AppleIIBase.LoresMode.Colors.getColor(index: pixelNybbleHi) + let colorLo = AppleIIBase.LoresMode.Colors.getColor(index: pixelNybbleLo) //One lores pixel is 7px wide and 4px tall for a resolution of 40x48. let baseOffset = EmulatedSystemInstance!.emulatorViewDelegate.scanlineOffsets[Int(pixelPosition.y)] + Int(pixelPosition.x) @@ -44,6 +44,50 @@ extension AppleIIBase { } } + + struct Colors { + static let Black = BitmapPixelsLE555.RGB32toLE555(r: 0, g: 0, b: 0) + static let Magenta = BitmapPixelsLE555.RGB32toLE555(r: 227, g: 30, b: 96) + static let DarkBlue = BitmapPixelsLE555.RGB32toLE555(r: 96, g: 78, b: 189) + static let Purple = BitmapPixelsLE555.RGB32toLE555(r: 255, g: 68, b: 253) + static let DarkGreen = BitmapPixelsLE555.RGB32toLE555(r: 0, g: 163, b: 96) + static let Gray1 = BitmapPixelsLE555.RGB32toLE555(r: 156, g: 156, b: 156) + static let MediumBlue = BitmapPixelsLE555.RGB32toLE555(r: 20, g: 207, b: 253) + static let LightBlue = BitmapPixelsLE555.RGB32toLE555(r: 208, g: 195, b: 255) + static let Brown = BitmapPixelsLE555.RGB32toLE555(r: 96, g: 114, b: 3) + static let Orange = BitmapPixelsLE555.RGB32toLE555(r: 255, g: 106, b: 60) + static let Gray2 = BitmapPixelsLE555.RGB32toLE555(r: 156, g: 156, b: 156) + static let Pink = BitmapPixelsLE555.RGB32toLE555(r: 255, g: 160, b: 208) + static let LightGreen = BitmapPixelsLE555.RGB32toLE555(r: 20, g: 245, b: 60) + static let Yellow = BitmapPixelsLE555.RGB32toLE555(r: 208, g: 221, b: 141) + static let Aquamarine = BitmapPixelsLE555.RGB32toLE555(r: 114, g: 255, b: 208) + static let White = BitmapPixelsLE555.RGB32toLE555(r: 255, g: 255, b: 255) + + static func getColor(index: UInt8) -> BitmapPixelsLE555.PixelData { + switch index { + case 0: return AppleIIBase.LoresMode.Colors.Black + case 1: return AppleIIBase.LoresMode.Colors.Magenta + case 2: return AppleIIBase.LoresMode.Colors.DarkBlue + case 3: return AppleIIBase.LoresMode.Colors.Purple + case 4: return AppleIIBase.LoresMode.Colors.DarkGreen + case 5: return AppleIIBase.LoresMode.Colors.Gray1 + case 6: return AppleIIBase.LoresMode.Colors.MediumBlue + case 7: return AppleIIBase.LoresMode.Colors.LightBlue + case 8: return AppleIIBase.LoresMode.Colors.Brown + case 9: return AppleIIBase.LoresMode.Colors.Orange + case 10: return AppleIIBase.LoresMode.Colors.Gray2 + case 11: return AppleIIBase.LoresMode.Colors.Pink + case 12: return AppleIIBase.LoresMode.Colors.LightGreen + case 13: return AppleIIBase.LoresMode.Colors.Yellow + case 14: return AppleIIBase.LoresMode.Colors.Aquamarine + case 15: return AppleIIBase.LoresMode.Colors.White + default: + print("tried to get color > 15") + return AppleIIBase.LoresMode.Colors.Black + } + + } + } } } diff --git a/FruitMachine/AppleII/Video/Modes/VideoModes.swift b/FruitMachine/AppleII/Video/Modes/VideoModes.swift index b452b17..da91b70 100644 --- a/FruitMachine/AppleII/Video/Modes/VideoModes.swift +++ b/FruitMachine/AppleII/Video/Modes/VideoModes.swift @@ -37,50 +37,6 @@ extension AppleIIBase { case MixedHires } - struct LoresColors { - static let Black = BitmapPixelsLE555.RGB32toLE555(r: 0, g: 0, b: 0) - static let Magenta = BitmapPixelsLE555.RGB32toLE555(r: 227, g: 30, b: 96) - static let DarkBlue = BitmapPixelsLE555.RGB32toLE555(r: 96, g: 78, b: 189) - static let Purple = BitmapPixelsLE555.RGB32toLE555(r: 255, g: 68, b: 253) - static let DarkGreen = BitmapPixelsLE555.RGB32toLE555(r: 0, g: 163, b: 96) - static let Gray1 = BitmapPixelsLE555.RGB32toLE555(r: 156, g: 156, b: 156) - static let MediumBlue = BitmapPixelsLE555.RGB32toLE555(r: 20, g: 207, b: 253) - static let LightBlue = BitmapPixelsLE555.RGB32toLE555(r: 208, g: 195, b: 255) - static let Brown = BitmapPixelsLE555.RGB32toLE555(r: 96, g: 114, b: 3) - static let Orange = BitmapPixelsLE555.RGB32toLE555(r: 255, g: 106, b: 60) - static let Gray2 = BitmapPixelsLE555.RGB32toLE555(r: 156, g: 156, b: 156) - static let Pink = BitmapPixelsLE555.RGB32toLE555(r: 255, g: 160, b: 208) - static let LightGreen = BitmapPixelsLE555.RGB32toLE555(r: 20, g: 245, b: 60) - static let Yellow = BitmapPixelsLE555.RGB32toLE555(r: 208, g: 221, b: 141) - static let Aquamarine = BitmapPixelsLE555.RGB32toLE555(r: 114, g: 255, b: 208) - static let White = BitmapPixelsLE555.RGB32toLE555(r: 255, g: 255, b: 255) - - static func getColor(index: UInt8) -> BitmapPixelsLE555.PixelData { - switch index { - case 0: return AppleII.LoresColors.Black - case 1: return AppleII.LoresColors.Magenta - case 2: return AppleII.LoresColors.DarkBlue - case 3: return AppleII.LoresColors.Purple - case 4: return AppleII.LoresColors.DarkGreen - case 5: return AppleII.LoresColors.Gray1 - case 6: return AppleII.LoresColors.MediumBlue - case 7: return AppleII.LoresColors.LightBlue - case 8: return AppleII.LoresColors.Brown - case 9: return AppleII.LoresColors.Orange - case 10: return AppleII.LoresColors.Gray2 - case 11: return AppleII.LoresColors.Pink - case 12: return AppleII.LoresColors.LightGreen - case 13: return AppleII.LoresColors.Yellow - case 14: return AppleII.LoresColors.Aquamarine - case 15: return AppleII.LoresColors.White - default: - print("tried to get color > 15") - return AppleII.LoresColors.Black - } - - } - } - func getCurrentVideoMode(switches: VideoSoftswitches) -> VideoMode { if(switches.TEXT_MODE == true) { diff --git a/FruitMachine/AppleIIViewController.swift b/FruitMachine/AppleIIViewController.swift index 7ba9b19..958b649 100644 --- a/FruitMachine/AppleIIViewController.swift +++ b/FruitMachine/AppleIIViewController.swift @@ -8,6 +8,11 @@ import Cocoa +class EmulationNotifications { + static let StartEmulation = Notification.Name("StartEmulation") + static let StopEmulation = Notification.Name("StopEmulation") +} + class AppleIIViewController: NSViewController { @IBOutlet weak var lbl_Drive1: NSTextField! @IBOutlet weak var lbl_Drive2: NSTextField! @@ -21,20 +26,34 @@ class AppleIIViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() // Do view setup here. - EmulatedSystemInstance = AppleIIPlus.sharedInstance - preferencesWindowController = PreferencesWindowController() + setModel() + self.view.addSubview(EmulatedSystemInstance!.emulatorView) preferencesWindowController.setupDefaultsIfRequired() setupDriveNotifications() - NotificationCenter.default.addObserver(self, selector: #selector(self.debuggerBreak), name: DebuggerNotifications.Break, object: nil) - - self.frameTimer = Timer.scheduledTimer(timeInterval: 1.0/60.0, - target: self, - selector: #selector(runEmulation), - userInfo: nil, - repeats: true) + NotificationCenter.default.addObserver(self, selector: #selector(self.stopFrameTimer), name: EmulationNotifications.StopEmulation, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(self.startFrameTimer), name: EmulationNotifications.StartEmulation, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(self.breakpointHit), name: CPUNotifications.BreakpointHit, object: nil) + startFrameTimer() + } + + func setModel() { + let model = UserDefaults.standard.string(forKey: "a2_Model") + if (model == "Apple ][ (Original") { + EmulatedSystemInstance = AppleII.sharedInstance + } else if(model == "Apple ][+") { + EmulatedSystemInstance = AppleIIPlus.sharedInstance + } else { + /* ??? */ + EmulatedSystemInstance = AppleII.sharedInstance + } + } + + @objc func breakpointHit() { + stopFrameTimer() + showDebugger(self) } @objc func runEmulation() { @@ -44,20 +63,30 @@ class AppleIIViewController: NSViewController { } } - @objc func debuggerBreak() { - frameTimer?.invalidate() - CPU.sharedInstance.isRunning = false + @objc func stopFrameTimer() { + self.frameTimer?.invalidate() } - @IBAction func showDebugger(_ sender: Any) { + @objc func startFrameTimer() { + self.frameTimer = Timer.scheduledTimer(timeInterval: 1.0/60.0, + target: self, + selector: #selector(runEmulation), + userInfo: nil, + repeats: true) + } + + @IBAction func showDebugger(_ sender: Any) { + stopFrameTimer() let debuggerStoryboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Debugger"), bundle: nil) debuggerWindowController = debuggerStoryboard.instantiateInitialController() as! DebuggerWindowController debuggerWindowController.showWindow(self) } @IBAction func showPreferences(_ sender: Any) { + stopFrameTimer() preferencesWindowController.loadWindow() preferencesWindowController.showWindow(self) + preferencesWindowController.setupPreferences() } @IBAction func doReset(_ sender: Any) { @@ -65,6 +94,7 @@ class AppleIIViewController: NSViewController { } @IBAction func doColdReset(_ sender: Any) { + setModel() //In case it changed EmulatedSystemInstance!.doColdReset() } diff --git a/FruitMachine/M6502/CPU.swift b/FruitMachine/M6502/CPU.swift index 9aa87c1..9d33238 100644 --- a/FruitMachine/M6502/CPU.swift +++ b/FruitMachine/M6502/CPU.swift @@ -17,6 +17,10 @@ enum CPUModel { case M65C02 } +class CPUNotifications { + static let BreakpointHit = Notification.Name("BreakpointHit") +} + struct StatusRegister { var negative: Bool //N - 0x80 var overflow: Bool //V - 0x40 @@ -253,6 +257,7 @@ final class CPU: NSObject { } final func executeNextInstruction() throws { + instruction_register = memoryInterface.readByte(offset: program_counter) let operation = InstructionTable[instruction_register] if(operation == nil) { @@ -301,6 +306,11 @@ final class CPU: NSObject { /* Running */ final func cpuStep() { do { + if(breakpoints.contains(program_counter)) { + isRunning = false + NotificationCenter.default.post(name: CPUNotifications.BreakpointHit, object: nil) + return + } try executeNextInstruction() } catch CPUExceptions.invalidInstruction { print("Invalid instruction at \(program_counter.asHexString())") @@ -313,13 +323,8 @@ final class CPU: NSObject { func runCyclesBatch() { isRunning = true - while(!outOfCycles()) { + while(!outOfCycles() && isRunning) { cpuStep() - - if (breakpoints.contains(program_counter)) { - isRunning = false - } - } } diff --git a/FruitMachine/M6502/Debugger/Base.lproj/Debugger.storyboard b/FruitMachine/M6502/Debugger/Base.lproj/Debugger.storyboard index 442362c..c69b1d8 100644 --- a/FruitMachine/M6502/Debugger/Base.lproj/Debugger.storyboard +++ b/FruitMachine/M6502/Debugger/Base.lproj/Debugger.storyboard @@ -360,6 +360,9 @@ + + + diff --git a/FruitMachine/M6502/Debugger/DebuggerViewController.swift b/FruitMachine/M6502/Debugger/DebuggerViewController.swift index d6c3206..6fabcc8 100644 --- a/FruitMachine/M6502/Debugger/DebuggerViewController.swift +++ b/FruitMachine/M6502/Debugger/DebuggerViewController.swift @@ -25,6 +25,10 @@ class DebuggerViewController: NSViewController { @IBOutlet weak var debuggerTableView: NSTableView! + @IBOutlet weak var btn_Break: NSButton! + @IBOutlet weak var btn_Step: NSButton! + @IBOutlet weak var btn_Run: NSButton! + var cpuInstance = CPU.sharedInstance var isRunning = false @@ -74,24 +78,6 @@ class DebuggerViewController: NSViewController { } } - func debugRun() { - isRunning = true - - cpuInstance.cycles = 0 - cpuInstance.cyclesInBatch = 10000 - - while(!cpuInstance.outOfCycles() && isRunning) { - cpuInstance.cpuStep() - - if (cpuInstance.breakpoints.contains(cpuInstance.program_counter)) { - isRunning = false - updateCPUStatusFields() - debugConsolePrint(str: "Breakpoint reached at $\(cpuInstance.program_counter.asHexString())", newline: true) - } - } - - } - func queueCPUStep(queue: DispatchQueue) { queue.async { self.cpuInstance.cpuStep() @@ -105,17 +91,18 @@ class DebuggerViewController: NSViewController { } @IBAction func btn_Break(_ sender: Any) { - isRunning = false - _ = 0 + NotificationCenter.default.post(name: EmulationNotifications.StopEmulation, object: nil) + btn_Step.isEnabled = true } @IBAction func btn_CPURun(_ sender: Any) { - debugRun() + NotificationCenter.default.post(name: EmulationNotifications.StartEmulation, object: nil) + btn_Step.isEnabled = false } @IBAction func btn_CPU_Restart(_ sender: Any) { cpuInstance.performReset() - cpuInstance.program_counter = 0x400 + cpuInstance.program_counter = CPU.sharedInstance.memoryInterface.readWord(offset: 0xFFFC) debugConsolePrint(str: "CPU restarted from \(cpuInstance.program_counter)", newline: true) } diff --git a/FruitMachine/PreferencesWindow.xib b/FruitMachine/PreferencesWindow.xib index 6c49214..6d7758a 100644 --- a/FruitMachine/PreferencesWindow.xib +++ b/FruitMachine/PreferencesWindow.xib @@ -1,13 +1,14 @@ - + - + + @@ -39,7 +40,7 @@ - + @@ -140,12 +141,12 @@ - + - + @@ -154,7 +155,7 @@ - + @@ -163,7 +164,7 @@ - + @@ -178,7 +179,7 @@ - + @@ -193,7 +194,7 @@ - + @@ -202,7 +203,7 @@ - + @@ -217,7 +218,7 @@ - + @@ -230,8 +231,22 @@ + + + + + + + + + + + + + + - + @@ -240,7 +255,7 @@ - + @@ -249,7 +264,7 @@ - + @@ -264,7 +279,7 @@ - + @@ -273,7 +288,7 @@ - + @@ -287,7 +302,7 @@ - + @@ -296,7 +311,7 @@ - + @@ -311,7 +326,7 @@ - + @@ -326,7 +341,7 @@ - + @@ -334,6 +349,15 @@ + + + + + + + + + diff --git a/FruitMachine/PreferencesWindowController.swift b/FruitMachine/PreferencesWindowController.swift index 4ebc5f2..185adf9 100644 --- a/FruitMachine/PreferencesWindowController.swift +++ b/FruitMachine/PreferencesWindowController.swift @@ -15,6 +15,7 @@ class PreferencesWindowController: NSWindowController { @IBOutlet weak var path_ROMBasic: NSTextField! /* Apple II ROM paths */ + @IBOutlet weak var a2_Model: NSPopUpButton! /* Apple II Peripherals */ @IBOutlet weak var a2_Peripherals_Slot0: NSPopUpButton! @@ -22,63 +23,59 @@ class PreferencesWindowController: NSWindowController { let defaults = UserDefaults.standard - override func windowDidLoad() { + override func windowDidLoad() { NotificationCenter.default.addObserver( self, selector: #selector(windowWillClose), name: NSWindow.willCloseNotification, object: nil) - setupPreferences() super.windowDidLoad() } func setupDefaultsIfRequired() { -// UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!) -// UserDefaults.standard.synchronize() + var model = defaults.string(forKey: "a2_Model") + if(model == nil) { model = "Apple ][+" } + defaults.set(model, forKey: "a2_Model") 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") + + var slot6 = defaults.string(forKey: "a2_Peripherals_Slot6") + if(slot6 == nil) { slot6 = "Disk II" } defaults.set(slot6, forKey: "a2_Peripherals_Slot6") } func setupPreferences() { setupA1RomPaths() setupA2Peripherals() + + setPreference(dropdown: a2_Model, key: "a2_Model") } func setupA1RomPaths() { - let monitorPath = defaults.string(forKey: "path_ROMMonitor") - let characterPath = defaults.string(forKey: "path_ROMCharacter") - let basicPath = defaults.string(forKey: "path_ROMBasic") - - if (monitorPath != nil) { - path_ROMMonitor.stringValue = monitorPath! - } - - if (characterPath != nil) { - path_ROMCharacter.stringValue = characterPath! - } - - if (basicPath != nil) { - path_ROMBasic.stringValue = basicPath! - } + setPreference(textfield: path_ROMMonitor, key: "path_ROMMonitor") + setPreference(textfield: path_ROMCharacter, key: "path_ROMCharacter") + setPreference(textfield: path_ROMBasic, key: "path_ROMBasic") } func setupA2Peripherals() { - let slot0 = defaults.string(forKey: "a2_Peripherals_Slot0") - if(slot0 != nil) { - a2_Peripherals_Slot6.selectItem(withTitle: slot0!) + setPreference(dropdown: a2_Peripherals_Slot0, key: "a2_Peripherals_Slot0") + setPreference(dropdown: a2_Peripherals_Slot6, key: "a2_Peripherals_Slot6") + } + + func setPreference(dropdown: NSPopUpButton, key: String) { + let pref = defaults.string(forKey: key) + if(pref != nil) { + dropdown.selectItem(withTitle: pref!) } - - let slot6 = defaults.string(forKey: "a2_Peripherals_Slot6") - if(slot6 != nil) { - a2_Peripherals_Slot6.selectItem(withTitle: slot6!) + } + + func setPreference(textfield: NSTextField, key: String) { + let pref = defaults.string(forKey: key) + if(pref != nil) { + textfield.stringValue = pref! } } @@ -91,6 +88,8 @@ class PreferencesWindowController: NSWindowController { defaults.set(a2_Peripherals_Slot6.selectedItem?.title, forKey: "a2_Peripherals_Slot6") defaults.synchronize() + + NotificationCenter.default.post(name: EmulationNotifications.StartEmulation, object: nil) } override var windowNibName : NSNib.Name? { @@ -115,7 +114,7 @@ class PreferencesWindowController: NSWindowController { @IBAction func btn_click_Character(_ sender: NSButton) { let picker = NSOpenPanel() - picker.title = "Select your Monitor ROM (apple1.vid)" + picker.title = "Select your Character ROM (apple1.vid)" picker.showsHiddenFiles = false picker.canChooseFiles = true picker.canChooseDirectories = false @@ -130,7 +129,7 @@ class PreferencesWindowController: NSWindowController { @IBAction func btn_click_BASIC(_ sender: NSButton) { let picker = NSOpenPanel() - picker.title = "Select your Monitor ROM (basic.bin)" + picker.title = "Select your BASIC ROM (basic.bin)" picker.showsHiddenFiles = false picker.canChooseFiles = true picker.canChooseDirectories = false