From 8463e9ed94e72c2ab2e2faa2d8bb340575b26f99 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 7 Jan 2025 17:41:43 -0500 Subject: [PATCH] Add selectable display type. --- Machines/Commodore/Plus4/Plus4.cpp | 29 +++++++++++++++++++ Machines/Commodore/Plus4/Plus4.hpp | 28 ++++++++++++++++++ Machines/Commodore/Plus4/Video.hpp | 8 +++++ Machines/Utility/MachineForTarget.cpp | 2 +- .../StaticAnalyser/CSStaticAnalyser.mm | 1 + 5 files changed, 67 insertions(+), 1 deletion(-) diff --git a/Machines/Commodore/Plus4/Plus4.cpp b/Machines/Commodore/Plus4/Plus4.cpp index 931625f72..6467c70f8 100644 --- a/Machines/Commodore/Plus4/Plus4.cpp +++ b/Machines/Commodore/Plus4/Plus4.cpp @@ -19,6 +19,7 @@ #include "../../../Processors/6502/6502.hpp" #include "../../../Analyser/Static/Commodore/Target.hpp" #include "../../../Outputs/Speaker/Implementation/LowpassSpeaker.hpp" +#include "../../../Configurable/StandardOptions.hpp" #include "../../../Storage/Tape/Tape.hpp" #include "../SerialBus.hpp" @@ -124,6 +125,7 @@ private: class ConcreteMachine: public Activity::Source, public BusController, + public Configurable::Device, public CPU::MOS6502::BusHandler, public MachineTypes::AudioProducer, public MachineTypes::MappedKeyboardMachine, @@ -467,6 +469,14 @@ private: return video_.get_scaled_scan_status(); } + void set_display_type(const Outputs::Display::DisplayType display_type) final { + video_.set_display_type(display_type); + } + + Outputs::Display::DisplayType get_display_type() const final { + return video_.get_display_type(); + } + void run_for(const Cycles cycles) final { m6502_.run_for(cycles); @@ -549,7 +559,26 @@ private: SerialPort serial_port_; std::unique_ptr tape_player_; + bool allow_fast_tape_hack_ = false; // TODO: implement fast-tape hack. + void set_use_fast_tape() {} + uint8_t io_direction_ = 0x00, io_output_ = 0x00; + + // MARK: - Configuration options. + std::unique_ptr get_options() const final { + auto options = std::make_unique(Configurable::OptionsType::UserFriendly); + options->output = get_video_signal_configurable(); + options->quickload = allow_fast_tape_hack_; + return options; + } + + void set_options(const std::unique_ptr &str) final { + const auto options = dynamic_cast(str.get()); + + set_video_signal_configurable(options->output); + allow_fast_tape_hack_ = options->quickload; + set_use_fast_tape(); + } }; } diff --git a/Machines/Commodore/Plus4/Plus4.hpp b/Machines/Commodore/Plus4/Plus4.hpp index 3e10c6904..c3e90bcaf 100644 --- a/Machines/Commodore/Plus4/Plus4.hpp +++ b/Machines/Commodore/Plus4/Plus4.hpp @@ -8,6 +8,8 @@ #pragma once +#include "../../../Configurable/Configurable.hpp" +#include "../../../Configurable/StandardOptions.hpp" #include "../../../Analyser/Static/StaticAnalyser.hpp" #include "../../ROMMachine.hpp" @@ -15,10 +17,36 @@ namespace Commodore::Plus4 { +std::unique_ptr get_options(); + struct Machine { virtual ~Machine() = default; static std::unique_ptr Plus4(const Analyser::Static::Target *, const ROMMachine::ROMFetcher &); + + class Options: + public Reflection::StructImpl, + public Configurable::DisplayOption, + public Configurable::QuickloadOption + { + friend Configurable::DisplayOption; + friend Configurable::QuickloadOption; + public: + Options(Configurable::OptionsType type) : + Configurable::DisplayOption(type == Configurable::OptionsType::UserFriendly ? + Configurable::Display::SVideo : Configurable::Display::CompositeColour), + Configurable::QuickloadOption(type == Configurable::OptionsType::UserFriendly) { + } + private: + Options() : Options(Configurable::OptionsType::UserFriendly) {} + + friend Reflection::StructImpl; + void declare_fields() { + declare_display_option(); + declare_quickload_option(); + limit_enum(&output, Configurable::Display::SVideo, Configurable::Display::CompositeColour, -1); + } + }; }; } diff --git a/Machines/Commodore/Plus4/Video.hpp b/Machines/Commodore/Plus4/Video.hpp index 9db25c799..7a6aec0c8 100644 --- a/Machines/Commodore/Plus4/Video.hpp +++ b/Machines/Commodore/Plus4/Video.hpp @@ -570,6 +570,14 @@ public: return crt_.get_scaled_scan_status(); } + void set_display_type(const Outputs::Display::DisplayType display_type) { + crt_.set_display_type(display_type); + } + + Outputs::Display::DisplayType get_display_type() const { + return crt_.get_display_type(); + } + private: Outputs::CRT::CRT crt_; Cycles subcycles_; diff --git a/Machines/Utility/MachineForTarget.cpp b/Machines/Utility/MachineForTarget.cpp index 493fffd73..228390f69 100644 --- a/Machines/Utility/MachineForTarget.cpp +++ b/Machines/Utility/MachineForTarget.cpp @@ -235,7 +235,7 @@ std::map> Machine::AllOptionsBy Emplace(MasterSystem, Sega::MasterSystem::Machine); Emplace(MSX, MSX::Machine); Emplace(Oric, Oric::Machine); -// Emplace(Plus4, Commodore::Plus4::Machine); // There are no options yet. + Emplace(Plus4, Commodore::Plus4::Machine); Emplace(PCCompatible, PCCompatible::Machine); Emplace(Vic20, Commodore::Vic20::Machine); Emplace(ZX8081, Sinclair::ZX8081::Machine); diff --git a/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm b/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm index e56033c84..3dd503957 100644 --- a/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm +++ b/OSBindings/Mac/Clock Signal/Machine/StaticAnalyser/CSStaticAnalyser.mm @@ -402,6 +402,7 @@ static Analyser::Static::ZX8081::Target::MemoryModel ZX8081MemoryModelFromSize(K case Analyser::Machine::MasterSystem: return @"CompositeOptions"; case Analyser::Machine::MSX: return @"QuickLoadCompositeOptions"; case Analyser::Machine::Oric: return @"OricOptions"; + case Analyser::Machine::Plus4: return @"QuickLoadCompositeOptions"; case Analyser::Machine::PCCompatible: return @"CompositeOptions"; case Analyser::Machine::Vic20: return @"QuickLoadCompositeOptions"; case Analyser::Machine::ZX8081: return @"ZX8081Options";