From 6225abd7519f9254614312febe51c734004dad13 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Wed, 7 Jul 2021 20:57:04 -0400 Subject: [PATCH 1/4] Adds 6MHz Enterprise option. --- Analyser/Static/Enterprise/Target.hpp | 4 +++ Machines/Enterprise/Enterprise.cpp | 37 +++++++++++++++++++-------- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/Analyser/Static/Enterprise/Target.hpp b/Analyser/Static/Enterprise/Target.hpp index 71805a10f..957852c5f 100644 --- a/Analyser/Static/Enterprise/Target.hpp +++ b/Analyser/Static/Enterprise/Target.hpp @@ -24,11 +24,13 @@ struct Target: public Analyser::Static::Target, public Reflection::StructImpl class ConcreteMachine: +template class ConcreteMachine: public Activity::Source, public Configurable::Device, public CPU::Z80::BusHandler, @@ -88,6 +88,12 @@ template class ConcreteMachine: return uint8_t(0x100 - ram_size / 0x4000); } + static constexpr double clock_rate = is_6mhz ? 6'000'000.0 : 4'000'000.0; + using NickType = + std::conditional_t, + JustInTimeActor>; + public: ConcreteMachine(const Analyser::Static::Enterprise::Target &target, const ROMMachine::ROMFetcher &rom_fetcher) : min_ram_slot_(min_ram_slot(target)), @@ -97,8 +103,8 @@ template class ConcreteMachine: speaker_(dave_audio_) { // Request a clock of 4Mhz; this'll be mapped upwards for Nick and downwards for Dave elsewhere. - set_clock_rate(4'000'000.0); - speaker_.set_input_rate(float(get_clock_rate()) / float(dave_divider)); + set_clock_rate(clock_rate); + speaker_.set_input_rate(float(clock_rate) / float(dave_divider)); ROM::Request request; using Target = Analyser::Static::Enterprise::Target; @@ -275,7 +281,7 @@ template class ConcreteMachine: penalty = dave_delay_; } break; - case PartialMachineCycle::ReadOpcodeStart: + case PartialMachineCycle::ReadOpcodeStart: { if(is_video_[address >> 14]) { // Query Nick for the amount of delay that would occur with one cycle left // in this read opcode. @@ -285,7 +291,7 @@ template class ConcreteMachine: } else if(wait_mode_ != WaitMode::None) { penalty = dave_delay_; } - break; + } break; // Video pauses: insert right at the end of the bus cycle. case PartialMachineCycle::Write: @@ -596,7 +602,7 @@ template class ConcreteMachine: None, OnM1, OnAllAccesses - } wait_mode_ = WaitMode::None; + } wait_mode_ = WaitMode::OnAllAccesses; bool is_video_[4]{}; // MARK: - ScanProducer @@ -691,7 +697,7 @@ template class ConcreteMachine: // MARK: - Chips. CPU::Z80::Processor z80_; - JustInTimeActor nick_; + NickType nick_; bool previous_nick_interrupt_line_ = false; // Cf. timing guesses above. @@ -741,10 +747,19 @@ Machine *Machine::Enterprise(const Analyser::Static::Target *target, const ROMMa using Target = Analyser::Static::Enterprise::Target; const Target *const enterprise_target = dynamic_cast(target); - if(enterprise_target->dos == Target::DOS::None) - return new Enterprise::ConcreteMachine(*enterprise_target, rom_fetcher); - else - return new Enterprise::ConcreteMachine(*enterprise_target, rom_fetcher); +#define BuildMachine(exdos, sixmhz) \ + if((enterprise_target->dos == Target::DOS::None) != exdos && (enterprise_target->speed == Target::Speed::SixMHz) == sixmhz) { \ + return new Enterprise::ConcreteMachine(*enterprise_target, rom_fetcher); \ + } + + BuildMachine(false, false); + BuildMachine(false, true); + BuildMachine(true, false); + BuildMachine(true, true); + +#undef BuildMachine + + return nullptr; } Machine::~Machine() {} From 53c3c1f5ab543fb2f4797ddeb5d6a6e7de880045 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Thu, 8 Jul 2021 18:50:37 -0400 Subject: [PATCH 2/4] Allows macOS users to select the 6MHz Enterprise. --- .../Machine/StaticAnalyser/CSStaticAnalyser.h | 7 ++- .../StaticAnalyser/CSStaticAnalyser.mm | 8 +++- .../Base.lproj/MachinePicker.xib | 46 +++++++++++++++---- .../MachinePicker/MachinePicker.swift | 12 ++++- 4 files changed, 60 insertions(+), 13 deletions(-) diff --git a/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.h b/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.h index 988fd9075..c9f89e5ab 100644 --- a/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.h +++ b/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.h @@ -47,6 +47,11 @@ typedef NS_ENUM(NSInteger, CSMachineEnterpriseModel) { CSMachineEnterpriseModel256, }; +typedef NS_ENUM(NSInteger, CSMachineEnterpriseSpeed) { + CSMachineEnterpriseSpeed4MHz, + CSMachineEnterpriseSpeed6MHz +}; + typedef NS_ENUM(NSInteger, CSMachineEnterpriseEXOS) { CSMachineEnterpriseEXOSVersion21, CSMachineEnterpriseEXOSVersion20, @@ -120,7 +125,7 @@ typedef int Kilobytes; - (instancetype)initWithAppleIIgsModel:(CSMachineAppleIIgsModel)model memorySize:(Kilobytes)memorySize; - (instancetype)initWithAtariSTModel:(CSMachineAtariSTModel)model; - (instancetype)initWithElectronDFS:(BOOL)dfs adfs:(BOOL)adfs ap6:(BOOL)ap6 sidewaysRAM:(BOOL)sidewaysRAM; -- (instancetype)initWithEnterpriseModel:(CSMachineEnterpriseModel)model exosVersion:(CSMachineEnterpriseEXOS)exosVersion basicVersion:(CSMachineEnterpriseBASIC)basicVersion dos:(CSMachineEnterpriseDOS)dos; +- (instancetype)initWithEnterpriseModel:(CSMachineEnterpriseModel)model speed:(CSMachineEnterpriseSpeed)speed exosVersion:(CSMachineEnterpriseEXOS)exosVersion basicVersion:(CSMachineEnterpriseBASIC)basicVersion dos:(CSMachineEnterpriseDOS)dos; - (instancetype)initWithMacintoshModel:(CSMachineMacintoshModel)model; - (instancetype)initWithMSXRegion:(CSMachineMSXRegion)region hasDiskDrive:(BOOL)hasDiskDrive; - (instancetype)initWithOricModel:(CSMachineOricModel)model diskInterface:(CSMachineOricDiskInterface)diskInterface; diff --git a/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm b/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm index e50217f91..653b94b0e 100644 --- a/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm +++ b/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm @@ -131,7 +131,7 @@ return self; } -- (instancetype)initWithEnterpriseModel:(CSMachineEnterpriseModel)model exosVersion:(CSMachineEnterpriseEXOS)exosVersion basicVersion:(CSMachineEnterpriseBASIC)basicVersion dos:(CSMachineEnterpriseDOS)dos { +- (instancetype)initWithEnterpriseModel:(CSMachineEnterpriseModel)model speed:(CSMachineEnterpriseSpeed)speed exosVersion:(CSMachineEnterpriseEXOS)exosVersion basicVersion:(CSMachineEnterpriseBASIC)basicVersion dos:(CSMachineEnterpriseDOS)dos { self = [super init]; if(self) { using Target = Analyser::Static::Enterprise::Target; @@ -144,6 +144,12 @@ case CSMachineEnterpriseModel256: target->model = Target::Model::Enterprise256; break; } + switch(speed) { + case CSMachineEnterpriseSpeed6MHz: target->speed = Target::Speed::SixMHz; break; + default: + case CSMachineEnterpriseSpeed4MHz: target->speed = Target::Speed::FourMHz; break; + } + switch(exosVersion) { case CSMachineEnterpriseEXOSVersion21: target->exos_version = Target::EXOSVersion::v21; break; default: diff --git a/OSBindings/Mac/Clock Signal/MachinePicker/Base.lproj/MachinePicker.xib b/OSBindings/Mac/Clock Signal/MachinePicker/Base.lproj/MachinePicker.xib index 494e5dcdc..ab57d994b 100644 --- a/OSBindings/Mac/Clock Signal/MachinePicker/Base.lproj/MachinePicker.xib +++ b/OSBindings/Mac/Clock Signal/MachinePicker/Base.lproj/MachinePicker.xib @@ -322,8 +322,21 @@ Gw + + + + + + + + + + + + + - + @@ -337,7 +350,7 @@ Gw - + @@ -352,20 +365,20 @@ Gw - - + + - - + + - + @@ -381,7 +394,7 @@ Gw - + @@ -389,13 +402,21 @@ Gw - + + + + + + + + + @@ -403,11 +424,13 @@ Gw + + @@ -415,11 +438,13 @@ Gw - + + + @@ -874,6 +899,7 @@ Gw + diff --git a/OSBindings/Mac/Clock Signal/MachinePicker/MachinePicker.swift b/OSBindings/Mac/Clock Signal/MachinePicker/MachinePicker.swift index 970200e2a..5927ef1c6 100644 --- a/OSBindings/Mac/Clock Signal/MachinePicker/MachinePicker.swift +++ b/OSBindings/Mac/Clock Signal/MachinePicker/MachinePicker.swift @@ -38,6 +38,7 @@ class MachinePicker: NSObject, NSTableViewDataSource, NSTableViewDelegate { // MARK: - Enterprise properties @IBOutlet var enterpriseModelButton: NSPopUpButton! + @IBOutlet var enterpriseSpeedButton: NSPopUpButton! @IBOutlet var enterpriseEXOSButton: NSPopUpButton! @IBOutlet var enterpriseBASICButton: NSPopUpButton! @IBOutlet var enterpriseDOSButton: NSPopUpButton! @@ -110,6 +111,7 @@ class MachinePicker: NSObject, NSTableViewDataSource, NSTableViewDelegate { // Enterprise settings enterpriseModelButton.selectItem(withTag: standardUserDefaults.integer(forKey: "new.enterpriseModel")) + enterpriseSpeedButton.selectItem(withTag: standardUserDefaults.integer(forKey: "new.enterpriseSpeed")) enterpriseEXOSButton.selectItem(withTag: standardUserDefaults.integer(forKey: "new.enterpriseEXOSVersion")) enterpriseBASICButton.selectItem(withTag: standardUserDefaults.integer(forKey: "new.enterpriseBASICVersion")) enterpriseDOSButton.selectItem(withTag: standardUserDefaults.integer(forKey: "new.enterpriseDOS")) @@ -166,6 +168,7 @@ class MachinePicker: NSObject, NSTableViewDataSource, NSTableViewDelegate { // Enterprise settings standardUserDefaults.set(enterpriseModelButton.selectedTag(), forKey: "new.enterpriseModel") + standardUserDefaults.set(enterpriseSpeedButton.selectedTag(), forKey: "new.enterpriseSpeed") standardUserDefaults.set(enterpriseEXOSButton.selectedTag(), forKey: "new.enterpriseEXOSVersion") standardUserDefaults.set(enterpriseBASICButton.selectedTag(), forKey: "new.enterpriseBASICVersion") standardUserDefaults.set(enterpriseDOSButton.selectedTag(), forKey: "new.enterpriseDOS") @@ -283,6 +286,13 @@ class MachinePicker: NSObject, NSTableViewDataSource, NSTableViewDelegate { default: model = .model128 } + var speed: CSMachineEnterpriseSpeed = .speed4MHz + switch enterpriseModelButton.selectedItem!.tag { + case 6: speed = .speed6MHz + case 4: fallthrough + default: speed = .speed4MHz + } + var exos: CSMachineEnterpriseEXOS = .version21 switch enterpriseEXOSButton.selectedItem!.tag { case 10: exos = .version10 @@ -307,7 +317,7 @@ class MachinePicker: NSObject, NSTableViewDataSource, NSTableViewDelegate { default: dos = .dosNone } - return CSStaticAnalyser(enterpriseModel: model, exosVersion: exos, basicVersion: basic, dos: dos) + return CSStaticAnalyser(enterpriseModel: model, speed: speed, exosVersion: exos, basicVersion: basic, dos: dos) case "mac": switch macintoshModelTypeButton.selectedItem!.tag { From 1b29cc34c418ff5043e101c492b2e3775fecd457 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Thu, 8 Jul 2021 22:22:48 -0400 Subject: [PATCH 3/4] Correct input list. --- OSBindings/Mac/Clock Signal/MachinePicker/MachinePicker.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OSBindings/Mac/Clock Signal/MachinePicker/MachinePicker.swift b/OSBindings/Mac/Clock Signal/MachinePicker/MachinePicker.swift index 5927ef1c6..a28fc65c4 100644 --- a/OSBindings/Mac/Clock Signal/MachinePicker/MachinePicker.swift +++ b/OSBindings/Mac/Clock Signal/MachinePicker/MachinePicker.swift @@ -287,7 +287,7 @@ class MachinePicker: NSObject, NSTableViewDataSource, NSTableViewDelegate { } var speed: CSMachineEnterpriseSpeed = .speed4MHz - switch enterpriseModelButton.selectedItem!.tag { + switch enterpriseSpeedButton.selectedItem!.tag { case 6: speed = .speed6MHz case 4: fallthrough default: speed = .speed4MHz From 4dd7f2cc0980a565db063d8444be534ebb667a76 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Thu, 8 Jul 2021 22:30:35 -0400 Subject: [PATCH 4/4] Add 6Mhz option to Qt UI. --- OSBindings/Qt/mainwindow.cpp | 6 ++++++ OSBindings/Qt/mainwindow.ui | 33 +++++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/OSBindings/Qt/mainwindow.cpp b/OSBindings/Qt/mainwindow.cpp index 7851dcfde..ac6f6115f 100644 --- a/OSBindings/Qt/mainwindow.cpp +++ b/OSBindings/Qt/mainwindow.cpp @@ -1073,6 +1073,11 @@ void MainWindow::start_enterprise() { case 2: target->model = Target::Model::Enterprise256; break; } + switch(ui->enterpriseSpeedComboBox->currentIndex()) { + default: target->speed = Target::Speed::FourMHz; break; + case 1: target->speed = Target::Speed::SixMHz; break; + } + switch(ui->enterpriseEXOSComboBox->currentIndex()) { default: target->exos_version = Target::EXOSVersion::v10; break; case 1: target->exos_version = Target::EXOSVersion::v20; break; @@ -1252,6 +1257,7 @@ void MainWindow::launchTarget(std::unique_ptr &&target \ /* Enterprise. */ \ ComboBox(enterpriseModelComboBox, "enterprise.model"); \ + ComboBox(enterpriseSpeedComboBox, "enterprise.speed"); \ ComboBox(enterpriseEXOSComboBox, "enterprise.exos"); \ ComboBox(enterpriseBASICComboBox, "enterprise.basic"); \ ComboBox(enterpriseDOSComboBox, "enterprise.dos"); \ diff --git a/OSBindings/Qt/mainwindow.ui b/OSBindings/Qt/mainwindow.ui index 8929705fe..d46bb68f6 100644 --- a/OSBindings/Qt/mainwindow.ui +++ b/OSBindings/Qt/mainwindow.ui @@ -27,7 +27,7 @@ - 1 + 5 @@ -346,13 +346,34 @@ + + + Speed: + + + + + + + + 4 MHz + + + + + 6 MHz + + + + + EXOS: - + @@ -371,14 +392,14 @@ - + BASIC: - + @@ -402,14 +423,14 @@ - + DOS: - +