From 94f148e2126e1926e0287f307d9b86e0f7875aa2 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 18 Apr 2016 08:21:00 -0400 Subject: [PATCH] Wired in options, at least getting as far as the Objective-C bridge. Then fast loading makes it to the emulated machine, display output type doesn't. --- Machines/Electron/Electron.cpp | 2 +- .../Base.lproj/ElectronDocument.xib | 20 +++++++---- .../Documents/ElectronDocument.swift | 36 ++++++++++++++++++- .../Documents/MachineDocument.swift | 2 +- .../Mac/Clock Signal/Wrappers/CSElectron.h | 1 + .../Mac/Clock Signal/Wrappers/CSElectron.mm | 16 ++++----- 6 files changed, 60 insertions(+), 17 deletions(-) diff --git a/Machines/Electron/Electron.cpp b/Machines/Electron/Electron.cpp index 9005bc3da..81226b084 100644 --- a/Machines/Electron/Electron.cpp +++ b/Machines/Electron/Electron.cpp @@ -32,7 +32,7 @@ namespace { static const unsigned int real_time_clock_interrupt_1 = 16704; static const unsigned int real_time_clock_interrupt_2 = 56704; - static const unsigned int clock_rate_audio_divider = 1; + static const unsigned int clock_rate_audio_divider = 8; } #define graphics_line(v) ((((v) >> 7) - first_graphics_line + field_divider_line) % field_divider_line) diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/ElectronDocument.xib b/OSBindings/Mac/Clock Signal/Base.lproj/ElectronDocument.xib index 8dc82d624..36a52be09 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/ElectronDocument.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/ElectronDocument.xib @@ -4,8 +4,10 @@ - + + + @@ -28,8 +30,8 @@ - - + + @@ -45,19 +47,25 @@ + + + - + - + - + + + + diff --git a/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift b/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift index 31ba148cb..02f9a37b6 100644 --- a/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift @@ -27,6 +27,7 @@ class ElectronDocument: MachineDocument { self.electron.setView(self.openGLView, aspectRatio: 11.0 / 10.0) self.electron.audioQueue = self.audioQueue }) + establishStoredOptions() } override var windowNibName: String? { @@ -41,7 +42,6 @@ class ElectronDocument: MachineDocument { switch pathExtension.lowercaseString { case "uef": electron.openUEFAtURL(url) - electron.useFastLoadingHack = true return default: break; } @@ -71,6 +71,40 @@ class ElectronDocument: MachineDocument { super.close() } + // MARK: IBActions + @IBOutlet var displayTypeButton: NSPopUpButton! + @IBAction func setDisplayType(sender: NSPopUpButton!) { + switch sender.indexOfSelectedItem { + case 1: electron.useTelevisionOutput = false + default: electron.useTelevisionOutput = true + } + NSUserDefaults.standardUserDefaults().setInteger(sender.indexOfSelectedItem, forKey: self.displayTypeUserDefaultsKey) + } + + @IBOutlet var fastLoadingButton: NSButton! + @IBAction func setFastLoading(sender: NSButton!) { + electron.useFastLoadingHack = sender.state == NSOnState + NSUserDefaults.standardUserDefaults().setBool(electron.useFastLoadingHack, forKey: self.fastLoadingUserDefaultsKey) + } + + private let displayTypeUserDefaultsKey = "electron.displayType" + private let fastLoadingUserDefaultsKey = "electron.fastLoading" + private func establishStoredOptions() { + let standardUserDefaults = NSUserDefaults.standardUserDefaults() + standardUserDefaults.registerDefaults([ + displayTypeUserDefaultsKey: 0, + fastLoadingUserDefaultsKey: true + ]) + + let useFastLoadingHack = standardUserDefaults.boolForKey(self.fastLoadingUserDefaultsKey) + electron.useFastLoadingHack = useFastLoadingHack + self.fastLoadingButton.state = useFastLoadingHack ? NSOnState : NSOffState + + let displayType = standardUserDefaults.integerForKey(self.displayTypeUserDefaultsKey) + electron.useTelevisionOutput = (displayType == 1) + self.displayTypeButton.selectItemAtIndex(displayType) + } + // MARK: CSOpenGLViewDelegate override func runForNumberOfCycles(numberOfCycles: Int32) { if actionLock.tryLock() { diff --git a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift index 1b55f1f26..f35970b48 100644 --- a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift @@ -19,7 +19,7 @@ class MachineDocument: NSDocument, CSOpenGLViewDelegate, CSOpenGLViewResponderDe } @IBOutlet weak var optionsPanel: NSPanel! - @IBAction func showOptions(sender: AnyObject?) { + @IBAction func showOptions(sender: AnyObject!) { optionsPanel?.setIsVisible(true) } diff --git a/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.h b/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.h index e3ab2f8c5..8e9f5530f 100644 --- a/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.h +++ b/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.h @@ -21,5 +21,6 @@ - (void)drawViewForPixelSize:(CGSize)pixelSize onlyIfDirty:(BOOL)onlyIfDirty; @property (nonatomic, assign) BOOL useFastLoadingHack; +@property (nonatomic, assign) BOOL useTelevisionOutput; @end diff --git a/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.mm b/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.mm index f4a93d26d..b31d919d6 100644 --- a/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.mm +++ b/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.mm @@ -112,25 +112,25 @@ case VK_ANSI_Grave: case VK_ANSI_Backslash: _electron.set_key_state(Electron::Key::KeyCopy, isPressed); break; - case VK_Return: _electron.set_key_state(Electron::Key::KeyReturn, isPressed); break; - case VK_ANSI_Minus: _electron.set_key_state(Electron::Key::KeyMinus, isPressed); break; + case VK_Return: _electron.set_key_state(Electron::Key::KeyReturn, isPressed); break; + case VK_ANSI_Minus: _electron.set_key_state(Electron::Key::KeyMinus, isPressed); break; - case VK_RightArrow: _electron.set_key_state(Electron::Key::KeyRight, isPressed); break; + case VK_RightArrow: _electron.set_key_state(Electron::Key::KeyRight, isPressed); break; case VK_LeftArrow: _electron.set_key_state(Electron::Key::KeyLeft, isPressed); break; case VK_DownArrow: _electron.set_key_state(Electron::Key::KeyDown, isPressed); break; case VK_UpArrow: _electron.set_key_state(Electron::Key::KeyUp, isPressed); break; - case VK_Delete: _electron.set_key_state(Electron::Key::KeyDelete, isPressed); break; - case VK_Escape: _electron.set_key_state(Electron::Key::KeyEscape, isPressed); break; + case VK_Delete: _electron.set_key_state(Electron::Key::KeyDelete, isPressed); break; + case VK_Escape: _electron.set_key_state(Electron::Key::KeyEscape, isPressed); break; - case VK_ANSI_Comma: _electron.set_key_state(Electron::Key::KeyComma, isPressed); break; + case VK_ANSI_Comma: _electron.set_key_state(Electron::Key::KeyComma, isPressed); break; case VK_ANSI_Period: _electron.set_key_state(Electron::Key::KeyFullStop, isPressed); break; case VK_ANSI_Semicolon: _electron.set_key_state(Electron::Key::KeySemiColon, isPressed); break; - case VK_ANSI_Quote: _electron.set_key_state(Electron::Key::KeyColon, isPressed); break; + case VK_ANSI_Quote: _electron.set_key_state(Electron::Key::KeyColon, isPressed); break; - case VK_ANSI_Slash: _electron.set_key_state(Electron::Key::KeySlash, isPressed); break; + case VK_ANSI_Slash: _electron.set_key_state(Electron::Key::KeySlash, isPressed); break; case VK_Shift: _electron.set_key_state(Electron::Key::KeyShift, isPressed); break; case VK_Control: _electron.set_key_state(Electron::Key::KeyControl, isPressed); break;