From 723ee88043bbef72f47ef8129294e781040fcc22 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Thu, 3 May 2018 19:37:32 -0400 Subject: [PATCH] Introduces configuration options for the Apple II. Specifically: II or II+? Disk II 13- or 16-sector? Or not at all? --- Analyser/Static/AppleII/StaticAnalyser.cpp | 3 +- Analyser/Static/AppleII/Target.hpp | 13 +- Machines/AppleII/AppleII.cpp | 29 +-- .../xcschemes/Clock Signal.xcscheme | 2 +- .../Machine/StaticAnalyser/CSStaticAnalyser.h | 13 +- .../StaticAnalyser/CSStaticAnalyser.mm | 9 +- .../New Group/Base.lproj/MachinePicker.xib | 174 ++++++++++++------ .../New Group/MachinePicker.swift | 29 ++- 8 files changed, 198 insertions(+), 74 deletions(-) diff --git a/Analyser/Static/AppleII/StaticAnalyser.cpp b/Analyser/Static/AppleII/StaticAnalyser.cpp index b3825d960..03bf6871d 100644 --- a/Analyser/Static/AppleII/StaticAnalyser.cpp +++ b/Analyser/Static/AppleII/StaticAnalyser.cpp @@ -14,7 +14,8 @@ Analyser::Static::TargetList Analyser::Static::AppleII::GetTargets(const Media & target->machine = Machine::AppleII; target->media = media; - target->has_disk = !target->media.disks.empty(); + if(!target->media.disks.empty()) + target->disk_controller = Target::DiskController::SixteenSector; TargetList targets; targets.push_back(std::move(target)); diff --git a/Analyser/Static/AppleII/Target.hpp b/Analyser/Static/AppleII/Target.hpp index 9d058ac75..d3f70b8a5 100644 --- a/Analyser/Static/AppleII/Target.hpp +++ b/Analyser/Static/AppleII/Target.hpp @@ -16,7 +16,18 @@ namespace Static { namespace AppleII { struct Target: public ::Analyser::Static::Target { - bool has_disk; // TODO: Disk II versus IWM? + enum class Model { + II, + IIplus + }; + enum class DiskController { + None, + SixteenSector, + ThirteenSector + }; + + Model model = Model::IIplus; + DiskController disk_controller = DiskController::None; }; } diff --git a/Machines/AppleII/AppleII.cpp b/Machines/AppleII/AppleII.cpp index 5b4041f7d..c5b3462da 100644 --- a/Machines/AppleII/AppleII.cpp +++ b/Machines/AppleII/AppleII.cpp @@ -70,7 +70,7 @@ class ConcreteMachine: } uint8_t ram_[48*1024]; - std::vector rom_; + std::vector apple2_rom_, apple2plus_rom_, rom_; std::vector character_rom_; uint16_t rom_start_address_; uint8_t keyboard_input_ = 0x00; @@ -225,17 +225,16 @@ class ConcreteMachine: "AppleII", { "apple2o.rom", + "apple2.rom", "apple2-character.rom" }); - if(!roms[0] || !roms[1]) return false; - rom_ = std::move(*roms[0]); - if(rom_.size() > 12*1024) { - rom_.erase(rom_.begin(), rom_.begin() + static_cast(rom_.size()) - 12*1024); - } - rom_start_address_ = 0xd000;//static_cast(0x10000 - rom_.size()); + if(!roms[0] || !roms[1] || !roms[2]) return false; - character_rom_ = std::move(*roms[1]); + apple2_rom_ = std::move(*roms[0]); + apple2plus_rom_ = std::move(*roms[1]); + + character_rom_ = std::move(*roms[2]); rom_fetcher_ = roms_with_names; @@ -273,11 +272,19 @@ class ConcreteMachine: // MARK: ConfigurationTarget void configure_as_target(const Analyser::Static::Target *target) override { - auto *const apple_target = dynamic_cast(target); - if(apple_target->has_disk) { - cards_[5].reset(new AppleII::DiskIICard(rom_fetcher_, true)); + using Target = Analyser::Static::AppleII::Target; + auto *const apple_target = dynamic_cast(target); + + if(apple_target->disk_controller != Target::DiskController::None) { + cards_[5].reset(new AppleII::DiskIICard(rom_fetcher_, apple_target->disk_controller == Target::DiskController::SixteenSector)); } + rom_ = (apple_target->model == Target::Model::II) ? apple2_rom_ : apple2plus_rom_; + if(rom_.size() > 12*1024) { + rom_.erase(rom_.begin(), rom_.begin() + static_cast(rom_.size()) - 12*1024); + } + rom_start_address_ = 0xd000;//static_cast(0x10000 - rom_.size()); + insert_media(apple_target->media); } diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal.xcscheme b/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal.xcscheme index f9049689f..782b17c09 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal.xcscheme +++ b/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal.xcscheme @@ -68,7 +68,7 @@ target(new Target); target->machine = Analyser::Machine::AppleII; + target->model = (model == CSMachineAppleIIModelAppleII) ? Target::Model::II : Target::Model::IIplus; + switch(diskController) { + default: + case CSMachineAppleIIDiskControllerNone: target->disk_controller = Target::DiskController::None; break; + case CSMachineAppleIIDiskControllerSixteenSector: target->disk_controller = Target::DiskController::SixteenSector; break; + case CSMachineAppleIIDiskControllerThirteenSector: target->disk_controller = Target::DiskController::ThirteenSector; break; + } _targets.push_back(std::move(target)); } return self; diff --git a/OSBindings/Mac/Clock Signal/New Group/Base.lproj/MachinePicker.xib b/OSBindings/Mac/Clock Signal/New Group/Base.lproj/MachinePicker.xib index ca730f5ea..02df433c3 100644 --- a/OSBindings/Mac/Clock Signal/New Group/Base.lproj/MachinePicker.xib +++ b/OSBindings/Mac/Clock Signal/New Group/Base.lproj/MachinePicker.xib @@ -17,29 +17,122 @@ - + - + + + + + + + + If you use File -> Open... to select a disk, tape or cartridge directly, the emulator will select and configure a machine for you. + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -53,7 +146,7 @@ - + @@ -73,18 +166,18 @@ - + - + @@ -144,7 +237,7 @@ - + @@ -171,8 +264,8 @@ - - + + @@ -248,12 +341,12 @@ - - + + - + @@ -267,7 +360,7 @@ - + @@ -275,7 +368,7 @@ - - - - - - If you use File -> Open... to select a disk, tape or cartridge directly, the emulator will select and configure a machine for you. - - - - @@ -390,6 +448,8 @@ Gw + + diff --git a/OSBindings/Mac/Clock Signal/New Group/MachinePicker.swift b/OSBindings/Mac/Clock Signal/New Group/MachinePicker.swift index 69009c495..57a54b4a4 100644 --- a/OSBindings/Mac/Clock Signal/New Group/MachinePicker.swift +++ b/OSBindings/Mac/Clock Signal/New Group/MachinePicker.swift @@ -11,6 +11,10 @@ import Cocoa class MachinePicker: NSObject { @IBOutlet var machineSelector: NSTabView? + // MARK: - Apple II properties + @IBOutlet var appleIIModelButton: NSPopUpButton? + @IBOutlet var appleIIDiskControllerButton: NSPopUpButton? + // MARK: - Electron properties @IBOutlet var electronDFSButton: NSButton? @IBOutlet var electronADFSButton: NSButton? @@ -46,6 +50,10 @@ class MachinePicker: NSObject { machineSelector?.selectTabViewItem(withIdentifier: machineIdentifier as Any) } + // Apple II settings + appleIIModelButton?.selectItem(withTag: standardUserDefaults.integer(forKey: "new.appleIIModel")) + appleIIDiskControllerButton?.selectItem(withTag: standardUserDefaults.integer(forKey: "new.appleIIDiskController")) + // Electron settings electronDFSButton?.state = standardUserDefaults.bool(forKey: "new.electronDFS") ? .on : .off electronADFSButton?.state = standardUserDefaults.bool(forKey: "new.electronADFS") ? .on : .off @@ -79,6 +87,10 @@ class MachinePicker: NSObject { // Machine type standardUserDefaults.set(machineSelector!.selectedTabViewItem!.identifier as! String, forKey: "new.machine") + // Apple II settings + standardUserDefaults.set(appleIIModelButton!.selectedTag(), forKey: "new.appleIIModel") + standardUserDefaults.set(appleIIDiskControllerButton!.selectedTag(), forKey: "new.appleIIDiskController") + // Electron settings standardUserDefaults.set(electronDFSButton!.state == .on, forKey: "new.electronDFS") standardUserDefaults.set(electronADFSButton!.state == .on, forKey: "new.electronADFS") @@ -115,7 +127,22 @@ class MachinePicker: NSObject { return CSStaticAnalyser(electronDFS: electronDFSButton!.state == .on, adfs: electronADFSButton!.state == .on)! case "appleii": - return CSStaticAnalyser(appleII: ()) + var model: CSMachineAppleIIModel = .appleII + switch appleIIModelButton!.selectedTag() { + case 1: model = .appleIIPlus + case 0: fallthrough + default: model = .appleII + } + + var diskController: CSMachineAppleIIDiskController = .none + switch appleIIDiskControllerButton!.selectedTag() { + case 13: diskController = .thirteenSector + case 16: diskController = .sixteenSector + case 0: fallthrough + default: diskController = .none + } + + return CSStaticAnalyser(appleIIModel: model, diskController: diskController) case "cpc": switch cpcModelTypeButton!.selectedItem!.tag {