diff --git a/Configurable/StandardOptions.cpp b/Configurable/StandardOptions.cpp index 4b57ce6ae..7f140557f 100644 --- a/Configurable/StandardOptions.cpp +++ b/Configurable/StandardOptions.cpp @@ -21,9 +21,9 @@ void append_bool(Configurable::SelectionSet &selection_set, const std::string &n Enquires for a Boolean selection for option @c name from @c selections_by_option, storing it to @c result if found. */ bool get_bool(const Configurable::SelectionSet &selections_by_option, const std::string &name, bool &result) { - auto quickload = Configurable::selection(selections_by_option, "quickload"); - if(!quickload) return false; - result = quickload->value; + auto selection = Configurable::selection(selections_by_option, name); + if(!selection) return false; + result = selection->value; return true; } diff --git a/Machines/Apple/Macintosh/Macintosh.cpp b/Machines/Apple/Macintosh/Macintosh.cpp index 20ef4ae80..0915abed9 100644 --- a/Machines/Apple/Macintosh/Macintosh.cpp +++ b/Machines/Apple/Macintosh/Macintosh.cpp @@ -522,6 +522,12 @@ template class ConcreteMachin void set_selections(const Configurable::SelectionSet &selections_by_option) override { bool quick_boot; if(Configurable::get_quick_boot(selections_by_option, quick_boot)) { + if(quick_boot) { + // Cf. Big Mess o' Wires' disassembly of the Mac Plus ROM, and the + // test at $E00. TODO: adapt as(/if?) necessary for other Macs. + ram_[0x02ae >> 1] = 0x40; + ram_[0x02b0 >> 1] = 0x00; + } } } diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 2e10c1604..7103f99c8 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -186,6 +186,7 @@ 4B4518A31F75FD1C00926311 /* HFE.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4518951F75FD1B00926311 /* HFE.cpp */; }; 4B4518A41F75FD1C00926311 /* OricMFMDSK.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4518971F75FD1B00926311 /* OricMFMDSK.cpp */; }; 4B4518A51F75FD1C00926311 /* SSD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4518991F75FD1B00926311 /* SSD.cpp */; }; + 4B49F0A923346F7A0045E6A6 /* MacintoshOptions.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4B49F0A723346F7A0045E6A6 /* MacintoshOptions.xib */; }; 4B4A76301DB1A3FA007AAE2E /* AY38910.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4A762E1DB1A3FA007AAE2E /* AY38910.cpp */; }; 4B4B1A3C200198CA00A0F866 /* KonamiSCC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4B1A3A200198C900A0F866 /* KonamiSCC.cpp */; }; 4B4B1A3D200198CA00A0F866 /* KonamiSCC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4B1A3A200198C900A0F866 /* KonamiSCC.cpp */; }; @@ -912,6 +913,7 @@ 4B45189A1F75FD1B00926311 /* SSD.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = SSD.hpp; sourceTree = ""; }; 4B4518A71F76004200926311 /* TapeParser.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = TapeParser.hpp; path = Parsers/TapeParser.hpp; sourceTree = ""; }; 4B4518A81F76022000926311 /* DiskImageImplementation.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = DiskImageImplementation.hpp; sourceTree = ""; }; + 4B49F0A823346F7A0045E6A6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Clock Signal/Base.lproj/MacintoshOptions.xib"; sourceTree = SOURCE_ROOT; }; 4B4A762E1DB1A3FA007AAE2E /* AY38910.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AY38910.cpp; path = AY38910/AY38910.cpp; sourceTree = ""; }; 4B4A762F1DB1A3FA007AAE2E /* AY38910.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = AY38910.hpp; path = AY38910/AY38910.hpp; sourceTree = ""; }; 4B4B1A3A200198C900A0F866 /* KonamiSCC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KonamiSCC.cpp; sourceTree = ""; }; @@ -2134,6 +2136,7 @@ 4B8FE2131DA19D5F0090D3CE /* Atari2600Options.xib */, 4BEEE6BB20DC72EA003723BF /* CompositeOptions.xib */, 4B8FE2151DA19D5F0090D3CE /* MachineDocument.xib */, + 4B49F0A723346F7A0045E6A6 /* MacintoshOptions.xib */, 4B2A332B1DB86821002876E3 /* OricOptions.xib */, 4B8FE2171DA19D5F0090D3CE /* QuickLoadCompositeOptions.xib */, 4BD61662206B2AC700236112 /* QuickLoadOptions.xib */, @@ -2266,12 +2269,12 @@ 4B6AAEA1230E3E1D0078E864 /* MassStorage */ = { isa = PBXGroup; children = ( + 4B74CF83231370BC00500CE8 /* MacintoshVolume.cpp */, 4B6AAEA2230E3E1D0078E864 /* MassStorageDevice.cpp */, + 4B74CF84231370BC00500CE8 /* MacintoshVolume.hpp */, 4B6AAEA3230E3E1D0078E864 /* MassStorageDevice.hpp */, 4B74CF7E2312FA9C00500CE8 /* Formats */, 4B6AAEA5230E40250078E864 /* SCSI */, - 4B74CF83231370BC00500CE8 /* MacintoshVolume.cpp */, - 4B74CF84231370BC00500CE8 /* MacintoshVolume.hpp */, ); path = MassStorage; sourceTree = ""; @@ -3651,6 +3654,7 @@ 4B79E4441E3AF38600141F11 /* cassette.png in Resources */, 4BB73EAC1B587A5100552FC2 /* MainMenu.xib in Resources */, 4B8FE21D1DA19D5F0090D3CE /* QuickLoadCompositeOptions.xib in Resources */, + 4B49F0A923346F7A0045E6A6 /* MacintoshOptions.xib in Resources */, 4BA3189422E7A4CA00D18CFA /* ROMImages in Resources */, 4B79E4461E3AF38600141F11 /* floppy525.png in Resources */, 4BEEE6BD20DC72EB003723BF /* CompositeOptions.xib in Resources */, @@ -4426,6 +4430,14 @@ name = OricOptions.xib; sourceTree = ""; }; + 4B49F0A723346F7A0045E6A6 /* MacintoshOptions.xib */ = { + isa = PBXVariantGroup; + children = ( + 4B49F0A823346F7A0045E6A6 /* Base */, + ); + name = MacintoshOptions.xib; + sourceTree = ""; + }; 4B55DD8120DF06680043F2E5 /* MachinePicker.xib */ = { isa = PBXVariantGroup; children = ( diff --git a/OSBindings/Mac/Clock Signal/Base.lproj/MacintoshOptions.xib b/OSBindings/Mac/Clock Signal/Base.lproj/MacintoshOptions.xib new file mode 100644 index 000000000..94d298078 --- /dev/null +++ b/OSBindings/Mac/Clock Signal/Base.lproj/MacintoshOptions.xib @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSBindings/Mac/Clock Signal/Documents/MachinePanel.swift b/OSBindings/Mac/Clock Signal/Documents/MachinePanel.swift index 19630c625..0b748a9cb 100644 --- a/OSBindings/Mac/Clock Signal/Documents/MachinePanel.swift +++ b/OSBindings/Mac/Clock Signal/Documents/MachinePanel.swift @@ -16,6 +16,7 @@ class MachinePanel: NSPanel { return "\(self.machine.userDefaultsPrefix).\(key)" } + // MARK: Fast Loading var fastLoadingUserDefaultsKey: String { return prefixedUserDefaultsKey("fastLoading") } @@ -28,6 +29,20 @@ class MachinePanel: NSPanel { } } + // MARK: Quick Boot + var bootQuicklyUserDefaultsKey: String { + return prefixedUserDefaultsKey("bootQuickly") + } + @IBOutlet var fastBootingButton: NSButton? + @IBAction func setFastBooting(_ sender: NSButton!) { +// if let fastLoadingMachine = machine as? CSFastLoading { +// let useFastLoadingHack = sender.state == .on +// fastLoadingMachine.useFastLoadingHack = useFastLoadingHack +// UserDefaults.standard.set(useFastLoadingHack, forKey: fastLoadingUserDefaultsKey) +// } + } + + // MARK: Display-Type Selection fileprivate func signalForTag(tag: Int) -> CSMachineVideoSignal { switch tag { case 1: return .composite @@ -49,6 +64,7 @@ class MachinePanel: NSPanel { } } + // MARK: Restoring user defaults func establishStoredOptions() { let standardUserDefaults = UserDefaults.standard standardUserDefaults.register(defaults: [ @@ -62,6 +78,7 @@ class MachinePanel: NSPanel { self.fastLoadingButton?.state = useFastLoadingHack ? .on : .off } + if let displayTypeButton = self.displayTypeButton { // Enable or disable options as per machine support. var titlesToRemove: [String] = [] diff --git a/OSBindings/Mac/Clock Signal/Machine/CSMachine.h b/OSBindings/Mac/Clock Signal/Machine/CSMachine.h index 7a14bf721..0417e843a 100644 --- a/OSBindings/Mac/Clock Signal/Machine/CSMachine.h +++ b/OSBindings/Mac/Clock Signal/Machine/CSMachine.h @@ -86,6 +86,7 @@ typedef NS_ENUM(NSInteger, CSMachineKeyboardInputMode) { @property (nonatomic, assign) BOOL useFastLoadingHack; @property (nonatomic, assign) CSMachineVideoSignal videoSignal; @property (nonatomic, assign) BOOL useAutomaticTapeMotorControl; +@property (nonatomic, assign) BOOL useQuickBootingHack; @property (nonatomic, readonly) BOOL canInsertMedia; diff --git a/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm b/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm index 87ac39456..1b16c4a77 100644 --- a/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm +++ b/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm @@ -624,6 +624,19 @@ struct ActivityObserver: public Activity::Observer { } } +- (void)setUseQuickBootingHack:(BOOL)useQuickBootingHack { + Configurable::Device *configurable_device = _machine->configurable_device(); + if(!configurable_device) return; + + @synchronized(self) { + _useQuickBootingHack = useQuickBootingHack; + + Configurable::SelectionSet selection_set; + append_quick_boot_selection(selection_set, useQuickBootingHack ? true : false); + configurable_device->set_selections(selection_set); + } +} + - (NSString *)userDefaultsPrefix { // Assumes that the first machine in the targets list is the source of user defaults. std::string name = Machine::ShortNameForTargetMachine(_analyser.targets.front()->machine); diff --git a/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm b/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm index ee187bfbf..7310ea9e9 100644 --- a/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm +++ b/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm @@ -219,6 +219,7 @@ static Analyser::Static::ZX8081::Target::MemoryModel ZX8081MemoryModelFromSize(K case Analyser::Machine::Atari2600: return @"Atari2600Options"; case Analyser::Machine::ColecoVision: return @"CompositeOptions"; case Analyser::Machine::Electron: return @"QuickLoadCompositeOptions"; + case Analyser::Machine::Macintosh: return @"MacintoshOptions"; case Analyser::Machine::MasterSystem: return @"CompositeOptions"; case Analyser::Machine::MSX: return @"QuickLoadCompositeOptions"; case Analyser::Machine::Oric: return @"OricOptions";