From 6027cba95f0bf75943335e7fcd77908c8195f28d Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 27 Jun 2016 21:38:14 -0400 Subject: [PATCH] Factored out the stuff of pushing a fast-loading option onwards and storing it within the user defaults. --- Machines/Vic-20/Vic20.cpp | 13 ++++++- Machines/Vic-20/Vic20.hpp | 5 +++ .../Clock Signal.xcodeproj/project.pbxproj | 2 ++ .../Clock Signal/Base.lproj/Vic20Document.xib | 12 ++++--- .../ClockSignal-Bridging-Header.h | 1 + .../Documents/Atari2600Document.swift | 5 +++ .../Documents/ElectronDocument.swift | 22 ++++-------- .../Documents/MachineDocument.swift | 35 +++++++++++++++++++ .../Documents/Vic20Document.swift | 5 +++ .../Machine/Wrappers/CSElectron.h | 3 +- .../Clock Signal/Machine/Wrappers/CSVic20.h | 5 ++- .../Clock Signal/Machine/Wrappers/CSVic20.mm | 7 ++++ 12 files changed, 93 insertions(+), 22 deletions(-) diff --git a/Machines/Vic-20/Vic20.cpp b/Machines/Vic-20/Vic20.cpp index d21644edf..440994230 100644 --- a/Machines/Vic-20/Vic20.cpp +++ b/Machines/Vic-20/Vic20.cpp @@ -30,6 +30,18 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin { set_reset_line(false); + // test for PC at F92F + if(_use_fast_tape_hack && address == 0xf92f && operation == CPU6502::BusOperation::ReadOpcode) + { + // advance time on the tape and the VIAs until an interrupt is signalled + while(!_userPortVIA.get_interrupt_line() && !_keyboardVIA.get_interrupt_line()) + { + _userPortVIA.run_for_half_cycles(2); + _keyboardVIA.run_for_half_cycles(2); + _tape.run_for_cycles(1); + } + } + // run the phase-1 part of this cycle, in which the VIC accesses memory uint16_t video_address = _mos6560->get_address(); uint8_t video_value = 0xff; // TODO @@ -92,7 +104,6 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin void Machine::mos6522_did_change_interrupt_status(void *mos6522) { -// bool irq = _userPortVIA.get_interrupt_line() || _keyboardVIA.get_interrupt_line(); set_nmi_line(_userPortVIA.get_interrupt_line()); set_irq_line(_keyboardVIA.get_interrupt_line()); } diff --git a/Machines/Vic-20/Vic20.hpp b/Machines/Vic-20/Vic20.hpp index bf81a4dba..b73ea198b 100644 --- a/Machines/Vic-20/Vic20.hpp +++ b/Machines/Vic-20/Vic20.hpp @@ -143,6 +143,8 @@ class Machine: void set_key_state(Key key, bool isPressed) { _keyboardVIA.set_key_state(key, isPressed); } void clear_all_keys() { _keyboardVIA.clear_all_keys(); } + inline void set_use_fast_tape_hack(bool activate) { _use_fast_tape_hack = activate; } + // to satisfy CPU6502::Processor unsigned int perform_bus_operation(CPU6502::BusOperation operation, uint16_t address, uint8_t *value); void synchronise() { _mos6560->synchronise(); } @@ -199,7 +201,10 @@ class Machine: std::unique_ptr _mos6560; UserPortVIA _userPortVIA; KeyboardVIA _keyboardVIA; + + // Tape Tape _tape; + bool _use_fast_tape_hack; }; } diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 4f4669761..79da25841 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -683,6 +683,7 @@ 4BB73ECF1B587A6700552FC2 /* Clock Signal.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "Clock Signal.entitlements"; sourceTree = ""; }; 4BBB142F1CD2CECE00BDB55C /* IntermediateShader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IntermediateShader.cpp; sourceTree = ""; }; 4BBB14301CD2CECE00BDB55C /* IntermediateShader.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = IntermediateShader.hpp; sourceTree = ""; }; + 4BBC34241D2208B100FFC9DF /* CSCommonOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSCommonOptions.h; sourceTree = ""; }; 4BBF99081C8FBA6F0075DAFB /* CRTInputBufferBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CRTInputBufferBuilder.cpp; sourceTree = ""; }; 4BBF99091C8FBA6F0075DAFB /* CRTInputBufferBuilder.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CRTInputBufferBuilder.hpp; sourceTree = ""; }; 4BBF990A1C8FBA6F0075DAFB /* CRTOpenGL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CRTOpenGL.cpp; sourceTree = ""; }; @@ -803,6 +804,7 @@ 4B2A53921D117D36003C6002 /* Machine */ = { isa = PBXGroup; children = ( + 4BBC34241D2208B100FFC9DF /* CSCommonOptions.h */, 4B2A53931D117D36003C6002 /* CSKeyboardMachine.h */, 4B2A53941D117D36003C6002 /* CSMachine+Subclassing.h */, 4B2A53951D117D36003C6002 /* CSMachine.h */, diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/Vic20Document.xib b/OSBindings/Mac/Clock Signal/Base.lproj/Vic20Document.xib index 6aefff340..570460d9d 100644 --- a/OSBindings/Mac/Clock Signal/Base.lproj/Vic20Document.xib +++ b/OSBindings/Mac/Clock Signal/Base.lproj/Vic20Document.xib @@ -4,8 +4,9 @@ - + + @@ -48,7 +49,7 @@ - + - + @@ -83,7 +87,7 @@ - + diff --git a/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h b/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h index 8ab3cb4a6..20dce5f51 100644 --- a/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h +++ b/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h @@ -4,6 +4,7 @@ #import "CSMachine.h" #import "CSKeyboardMachine.h" +#import "CSCommonOptions.h" #import "CSAtari2600.h" #import "CSElectron.h" diff --git a/OSBindings/Mac/Clock Signal/Documents/Atari2600Document.swift b/OSBindings/Mac/Clock Signal/Documents/Atari2600Document.swift index 9b91f4890..be4448411 100644 --- a/OSBindings/Mac/Clock Signal/Documents/Atari2600Document.swift +++ b/OSBindings/Mac/Clock Signal/Documents/Atari2600Document.swift @@ -16,6 +16,11 @@ class Atari2600Document: MachineDocument { return atari2600 } } + override var name: String! { + get { + return "atari2600" + } + } // MARK: NSDocument overrides override class func autosavesInPlace() -> Bool { diff --git a/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift b/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift index 492b05ef1..2790a44e4 100644 --- a/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift @@ -17,6 +17,11 @@ class ElectronDocument: MachineDocument { return electron } } + override var name: String! { + get { + return "electron" + } + } override func aspectRatio() -> NSSize { return NSSize(width: 11.0, height: 10.0) @@ -33,8 +38,6 @@ class ElectronDocument: MachineDocument { self.electron.setOSROM(os) self.electron.setBASICROM(basic) } - - establishStoredOptions() } override var windowNibName: String? { @@ -69,25 +72,14 @@ class ElectronDocument: MachineDocument { 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() { + override func establishStoredOptions() { + super.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) diff --git a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift index 3f534d486..2098b9f62 100644 --- a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift @@ -25,6 +25,11 @@ class MachineDocument: return nil } } + var name: String! { + get { + return nil + } + } func aspectRatio() -> NSSize { return NSSize(width: 4.0, height: 3.0) @@ -61,6 +66,7 @@ class MachineDocument: setupClockRate() self.machine.delegate = self + establishStoredOptions() } func machineDidChangeClockRate(machine: CSMachine!) { @@ -168,4 +174,33 @@ class MachineDocument: $0.setKey(VK_Option, isPressed: newModifiers.modifierFlags.contains(.AlternateKeyMask)) } } + + // MARK: IBActions + var fastLoadingUserDefaultsKey: String { + get { + return "\(self.name).fastLoading" + } + } + + @IBOutlet var fastLoadingButton: NSButton! + @IBAction func setFastLoading(sender: NSButton!) { + if let commonOptionsMachine = machine as? CSCommonOptions { + let useFastLoadingHack = sender.state == NSOnState + commonOptionsMachine.useFastLoadingHack = useFastLoadingHack + NSUserDefaults.standardUserDefaults().setBool(useFastLoadingHack, forKey: fastLoadingUserDefaultsKey) + } + } + + func establishStoredOptions() { + let standardUserDefaults = NSUserDefaults.standardUserDefaults() + standardUserDefaults.registerDefaults([ + fastLoadingUserDefaultsKey: true + ]) + + if let commonOptionsMachine = machine as? CSCommonOptions { + let useFastLoadingHack = standardUserDefaults.boolForKey(self.fastLoadingUserDefaultsKey) + commonOptionsMachine.useFastLoadingHack = useFastLoadingHack + self.fastLoadingButton.state = useFastLoadingHack ? NSOnState : NSOffState + } + } } diff --git a/OSBindings/Mac/Clock Signal/Documents/Vic20Document.swift b/OSBindings/Mac/Clock Signal/Documents/Vic20Document.swift index 32e4390fb..f4b647b09 100644 --- a/OSBindings/Mac/Clock Signal/Documents/Vic20Document.swift +++ b/OSBindings/Mac/Clock Signal/Documents/Vic20Document.swift @@ -16,6 +16,11 @@ class Vic20Document: MachineDocument { return vic20 } } + override var name: String! { + get { + return "vic20" + } + } // MARK: NSDocument overrides override init() { diff --git a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSElectron.h b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSElectron.h index 1de8ac9e0..0d911dccb 100644 --- a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSElectron.h +++ b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSElectron.h @@ -8,8 +8,9 @@ #import "CSMachine.h" #import "CSKeyboardMachine.h" +#import "CSCommonOptions.h" -@interface CSElectron : CSMachine +@interface CSElectron : CSMachine - (void)setOSROM:(nonnull NSData *)rom; - (void)setBASICROM:(nonnull NSData *)rom; diff --git a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.h b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.h index 5a181e9a9..9aa0a638a 100644 --- a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.h +++ b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.h @@ -8,8 +8,9 @@ #import "CSMachine.h" #import "CSKeyboardMachine.h" +#import "CSCommonOptions.h" -@interface CSVic20 : CSMachine +@interface CSVic20 : CSMachine - (void)setKernelROM:(nonnull NSData *)rom; - (void)setBASICROM:(nonnull NSData *)rom; @@ -18,4 +19,6 @@ - (void)setPRG:(nonnull NSData *)prg; - (BOOL)openTAPAtURL:(nonnull NSURL *)URL; +@property (nonatomic, assign) BOOL useFastLoadingHack; + @end diff --git a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.mm b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.mm index 2ad687707..3dbf8f626 100644 --- a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.mm +++ b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.mm @@ -137,4 +137,11 @@ } } +- (void)setUseFastLoadingHack:(BOOL)useFastLoadingHack { + @synchronized(self) { + _useFastLoadingHack = useFastLoadingHack; + _vic20.set_use_fast_tape_hack(useFastLoadingHack ? true : false); + } +} + @end