From 64465f97b6a0283a1f07a89612c67a40a334c361 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Wed, 28 Nov 2018 17:53:33 -0800 Subject: [PATCH] Starts towards reintroducing the proper mechanisms for selecting a display type at runtime. --- Components/6560/6560.hpp | 2 +- Components/9918/9918.cpp | 4 +-- Configurable/StandardOptions.cpp | 22 ++++++++----- Configurable/StandardOptions.hpp | 10 +++--- Machines/AmstradCPC/AmstradCPC.cpp | 2 +- Machines/AppleII/Video.cpp | 2 +- Machines/CRTMachine.hpp | 23 ++++++------- Machines/Commodore/Vic-20/Vic20.cpp | 4 +-- Machines/Electron/Electron.cpp | 4 +-- Machines/MSX/MSX.cpp | 4 +-- Machines/MasterSystem/MasterSystem.cpp | 4 +-- Machines/Oric/Oric.cpp | 22 ++++++------- Machines/Oric/Video.cpp | 32 +++++++++---------- Machines/Oric/Video.hpp | 4 +-- Machines/ZX8081/Video.cpp | 2 +- .../Mac/Clock Signal/Machine/CSMachine.mm | 12 +++---- Outputs/CRT/CRT.cpp | 5 +++ Outputs/CRT/CRT.hpp | 3 ++ Outputs/ScanTarget.hpp | 6 ---- 19 files changed, 87 insertions(+), 80 deletions(-) diff --git a/Components/6560/6560.hpp b/Components/6560/6560.hpp index f2503bd1f..4099659ca 100644 --- a/Components/6560/6560.hpp +++ b/Components/6560/6560.hpp @@ -69,7 +69,7 @@ template class MOS6560 { speaker_(audio_generator_) { // default to s-video output -// crt_.set_video_signal(Outputs::Display::VideoSignal::SVideo); + crt_.set_display_type(Outputs::Display::DisplayType::SVideo); // default to NTSC set_output_mode(OutputMode::NTSC); diff --git a/Components/9918/9918.cpp b/Components/9918/9918.cpp index 103de4c50..b5e63a1c6 100644 --- a/Components/9918/9918.cpp +++ b/Components/9918/9918.cpp @@ -86,8 +86,8 @@ Base::Base(Personality p) : TMS9918::TMS9918(Personality p): Base(p) { -// crt_->set_video_signal(Outputs::Display::VideoSignal::RGB); - crt_.set_visible_area(Outputs::Display::Rect(0.07f, 0.0375f, 0.875f, 0.875f)); // 0.055f, 0.025f + crt_.set_display_type(Outputs::Display::DisplayType::RGB); + crt_.set_visible_area(Outputs::Display::Rect(0.07f, 0.0375f, 0.875f, 0.875f)); // The TMS remains in-phase with the NTSC colour clock; this is an empirical measurement // intended to produce the correct relationship between the hard edges between pixels and diff --git a/Configurable/StandardOptions.cpp b/Configurable/StandardOptions.cpp index da9dcd407..2aae5b393 100644 --- a/Configurable/StandardOptions.cpp +++ b/Configurable/StandardOptions.cpp @@ -33,11 +33,12 @@ bool get_bool(const Configurable::SelectionSet &selections_by_option, const std: std::vector> Configurable::standard_options(Configurable::StandardOptions mask) { std::vector> options; if(mask & QuickLoadTape) options.emplace_back(new Configurable::BooleanOption("Load Tapes Quickly", "quickload")); - if(mask & (DisplayRGB | DisplayComposite | DisplaySVideo)) { + if(mask & (DisplayRGB | DisplayCompositeColour | DisplayCompositeMonochrome | DisplaySVideo)) { std::vector display_options; - if(mask & DisplayComposite) display_options.emplace_back("composite"); - if(mask & DisplaySVideo) display_options.emplace_back("svideo"); - if(mask & DisplayRGB) display_options.emplace_back("rgb"); + if(mask & DisplayCompositeColour) display_options.emplace_back("composite"); + if(mask & DisplayCompositeMonochrome) display_options.emplace_back("composite-mono"); + if(mask & DisplaySVideo) display_options.emplace_back("svideo"); + if(mask & DisplayRGB) display_options.emplace_back("rgb"); options.emplace_back(new Configurable::ListOption("Display", "display", display_options)); } if(mask & AutomaticTapeMotorControl) options.emplace_back(new Configurable::BooleanOption("Automatic Tape Motor Control", "autotapemotor")); @@ -57,9 +58,10 @@ void Configurable::append_display_selection(Configurable::SelectionSet &selectio std::string string_selection; switch(selection) { default: - case Display::RGB: string_selection = "rgb"; break; - case Display::SVideo: string_selection = "svideo"; break; - case Display::Composite: string_selection = "composite"; break; + case Display::RGB: string_selection = "rgb"; break; + case Display::SVideo: string_selection = "svideo"; break; + case Display::CompositeMonochrome: string_selection = "composite-mono"; break; + case Display::CompositeColour: string_selection = "composite"; break; } selection_set["display"] = std::unique_ptr(new Configurable::ListSelection(string_selection)); } @@ -85,7 +87,11 @@ bool Configurable::get_display(const Configurable::SelectionSet &selections_by_o return true; } if(display->value == "composite") { - result = Configurable::Display::Composite; + result = Configurable::Display::CompositeColour; + return true; + } + if(display->value == "composite-mono") { + result = Configurable::Display::CompositeMonochrome; return true; } } diff --git a/Configurable/StandardOptions.hpp b/Configurable/StandardOptions.hpp index 8aac4a443..a6a4a915d 100644 --- a/Configurable/StandardOptions.hpp +++ b/Configurable/StandardOptions.hpp @@ -16,15 +16,17 @@ namespace Configurable { enum StandardOptions { DisplayRGB = (1 << 0), DisplaySVideo = (1 << 1), - DisplayComposite = (1 << 2), - QuickLoadTape = (1 << 3), - AutomaticTapeMotorControl = (1 << 4) + DisplayCompositeColour = (1 << 2), + DisplayCompositeMonochrome = (1 << 3), + QuickLoadTape = (1 << 4), + AutomaticTapeMotorControl = (1 << 5) }; enum class Display { RGB, SVideo, - Composite + CompositeColour, + CompositeMonochrome }; /*! diff --git a/Machines/AmstradCPC/AmstradCPC.cpp b/Machines/AmstradCPC/AmstradCPC.cpp index 83f4080e4..d3d833c05 100644 --- a/Machines/AmstradCPC/AmstradCPC.cpp +++ b/Machines/AmstradCPC/AmstradCPC.cpp @@ -41,7 +41,7 @@ namespace AmstradCPC { std::vector> get_options() { return Configurable::standard_options( - static_cast(Configurable::DisplayRGB | Configurable::DisplayComposite) + static_cast(Configurable::DisplayRGB | Configurable::DisplayCompositeColour) ); } diff --git a/Machines/AppleII/Video.cpp b/Machines/AppleII/Video.cpp index f54b6a77e..18875ef74 100644 --- a/Machines/AppleII/Video.cpp +++ b/Machines/AppleII/Video.cpp @@ -16,7 +16,7 @@ VideoBase::VideoBase(bool is_iie, std::function &&target) : deferrer_(std::move(target)) { // Show only the centre 75% of the TV frame. -// crt_->set_video_signal(Outputs::Display::VideoSignal::Composite); + crt_.set_display_type(Outputs::Display::DisplayType::CompositeColour); crt_.set_visible_area(Outputs::Display::Rect(0.118f, 0.122f, 0.77f, 0.77f)); crt_.set_immediate_default_phase(0.0f); diff --git a/Machines/CRTMachine.hpp b/Machines/CRTMachine.hpp index c1ad324c6..413032bbe 100644 --- a/Machines/CRTMachine.hpp +++ b/Machines/CRTMachine.hpp @@ -63,31 +63,32 @@ class Machine { /*! Maps from Configurable::Display to Outputs::Display::VideoSignal and calls - @c set_video_signal with the result. + @c set_display_type with the result. */ void set_video_signal_configurable(Configurable::Display type) { - Outputs::Display::VideoSignal signal; + Outputs::Display::DisplayType display_type; switch(type) { default: case Configurable::Display::RGB: - signal = Outputs::Display::VideoSignal::RGB; + display_type = Outputs::Display::DisplayType::RGB; break; case Configurable::Display::SVideo: - signal = Outputs::Display::VideoSignal::SVideo; + display_type = Outputs::Display::DisplayType::SVideo; break; - case Configurable::Display::Composite: - signal = Outputs::Display::VideoSignal::Composite; + case Configurable::Display::CompositeColour: + display_type = Outputs::Display::DisplayType::CompositeColour; + break; + case Configurable::Display::CompositeMonochrome: + display_type = Outputs::Display::DisplayType::CompositeMonochrome; break; } - set_video_signal(signal); + set_display_type(display_type); } /*! - Forwards the video signal to the CRT returned by get_crt(). + Forwards the video signal to the target returned by get_crt(). */ - virtual void set_video_signal(Outputs::Display::VideoSignal video_signal) { -// get_crt()->set_video_signal(video_signal); - } + virtual void set_display_type(Outputs::Display::DisplayType display_type) {} private: double clock_rate_ = 1.0; diff --git a/Machines/Commodore/Vic-20/Vic20.cpp b/Machines/Commodore/Vic-20/Vic20.cpp index 302f9f9e0..ba26047a5 100644 --- a/Machines/Commodore/Vic-20/Vic20.cpp +++ b/Machines/Commodore/Vic-20/Vic20.cpp @@ -50,7 +50,7 @@ enum ROMSlot { std::vector> get_options() { return Configurable::standard_options( - static_cast(Configurable::DisplaySVideo | Configurable::DisplayComposite | Configurable::QuickLoadTape) + static_cast(Configurable::DisplaySVideo | Configurable::DisplayCompositeColour | Configurable::QuickLoadTape) ); } @@ -671,7 +671,7 @@ class ConcreteMachine: Configurable::SelectionSet get_accurate_selections() override { Configurable::SelectionSet selection_set; Configurable::append_quick_load_tape_selection(selection_set, false); - Configurable::append_display_selection(selection_set, Configurable::Display::Composite); + Configurable::append_display_selection(selection_set, Configurable::Display::CompositeColour); return selection_set; } diff --git a/Machines/Electron/Electron.cpp b/Machines/Electron/Electron.cpp index 1301b5569..440726d65 100644 --- a/Machines/Electron/Electron.cpp +++ b/Machines/Electron/Electron.cpp @@ -34,7 +34,7 @@ namespace Electron { std::vector> get_options() { return Configurable::standard_options( - static_cast(Configurable::DisplayRGB | Configurable::DisplayComposite | Configurable::QuickLoadTape) + static_cast(Configurable::DisplayRGB | Configurable::DisplayCompositeColour | Configurable::QuickLoadTape) ); } @@ -429,7 +429,7 @@ class ConcreteMachine: Configurable::SelectionSet get_accurate_selections() override { Configurable::SelectionSet selection_set; Configurable::append_quick_load_tape_selection(selection_set, false); - Configurable::append_display_selection(selection_set, Configurable::Display::Composite); + Configurable::append_display_selection(selection_set, Configurable::Display::CompositeColour); return selection_set; } diff --git a/Machines/MSX/MSX.cpp b/Machines/MSX/MSX.cpp index 19e93b78e..2bc9deadd 100644 --- a/Machines/MSX/MSX.cpp +++ b/Machines/MSX/MSX.cpp @@ -51,7 +51,7 @@ namespace MSX { std::vector> get_options() { return Configurable::standard_options( - static_cast(Configurable::DisplayRGB | Configurable::DisplaySVideo | Configurable::DisplayComposite | Configurable::QuickLoadTape) + static_cast(Configurable::DisplayRGB | Configurable::DisplaySVideo | Configurable::DisplayCompositeColour | Configurable::QuickLoadTape) ); } @@ -596,7 +596,7 @@ class ConcreteMachine: Configurable::SelectionSet get_accurate_selections() override { Configurable::SelectionSet selection_set; Configurable::append_quick_load_tape_selection(selection_set, false); - Configurable::append_display_selection(selection_set, Configurable::Display::Composite); + Configurable::append_display_selection(selection_set, Configurable::Display::CompositeColour); return selection_set; } diff --git a/Machines/MasterSystem/MasterSystem.cpp b/Machines/MasterSystem/MasterSystem.cpp index 689d224c6..9243c8c45 100644 --- a/Machines/MasterSystem/MasterSystem.cpp +++ b/Machines/MasterSystem/MasterSystem.cpp @@ -36,7 +36,7 @@ namespace MasterSystem { std::vector> get_options() { return Configurable::standard_options( - static_cast(Configurable::DisplayRGB | Configurable::DisplayComposite) + static_cast(Configurable::DisplayRGB | Configurable::DisplayCompositeColour) ); } @@ -370,7 +370,7 @@ class ConcreteMachine: Configurable::SelectionSet get_accurate_selections() override { Configurable::SelectionSet selection_set; - Configurable::append_display_selection(selection_set, Configurable::Display::Composite); + Configurable::append_display_selection(selection_set, Configurable::Display::CompositeColour); return selection_set; } diff --git a/Machines/Oric/Oric.cpp b/Machines/Oric/Oric.cpp index 0a8af14bc..dc8d0c011 100644 --- a/Machines/Oric/Oric.cpp +++ b/Machines/Oric/Oric.cpp @@ -46,7 +46,11 @@ enum ROM { std::vector> get_options() { return Configurable::standard_options( - static_cast(Configurable::DisplayRGB | Configurable::DisplayComposite | Configurable::QuickLoadTape) + static_cast( + Configurable::DisplayRGB | + Configurable::DisplayCompositeColour | + Configurable::DisplayCompositeMonochrome | + Configurable::QuickLoadTape) ); } @@ -461,17 +465,9 @@ template class Co video_output_.reset(new VideoOutput(ram_)); if(!colour_rom_.empty()) video_output_->set_colour_rom(colour_rom_); - set_video_signal(Outputs::Display::VideoSignal::RGB); + set_display_type(Outputs::Display::DisplayType::RGB); } -// void close_output() override final { -// video_output_.reset(); -// } -// -// Outputs::CRT::CRT *get_crt() override final { -// return video_output_->get_crt(); -// } - Outputs::Speaker::Speaker *get_speaker() override final { return &speaker_; } @@ -537,14 +533,14 @@ template class Co } } - void set_video_signal(Outputs::Display::VideoSignal video_signal) override { - video_output_->set_video_signal(video_signal); + void set_display_type(Outputs::Display::DisplayType display_type) override { +// video_output_->set_video_signal(video_signal); } Configurable::SelectionSet get_accurate_selections() override { Configurable::SelectionSet selection_set; Configurable::append_quick_load_tape_selection(selection_set, false); - Configurable::append_display_selection(selection_set, Configurable::Display::Composite); + Configurable::append_display_selection(selection_set, Configurable::Display::CompositeColour); return selection_set; } diff --git a/Machines/Oric/Video.cpp b/Machines/Oric/Video.cpp index 256a18d2f..0df8a7534 100644 --- a/Machines/Oric/Video.cpp +++ b/Machines/Oric/Video.cpp @@ -43,12 +43,12 @@ VideoOutput::VideoOutput(uint8_t *memory) : // ); crt_->set_composite_function_type(Outputs::CRT::CRT::CompositeSourceType::DiscreteFourSamplesPerCycle, 0.0f); - set_video_signal(Outputs::Display::VideoSignal::Composite); + set_display_type(Outputs::Display::DisplayType::CompositeColour); crt_->set_visible_area(crt_->get_rect_for_area(54, 224, 16 * 6, 40 * 6, 4.0f / 3.0f)); } -void VideoOutput::set_video_signal(Outputs::Display::VideoSignal video_signal) { - video_signal_ = video_signal; +void VideoOutput::set_display_type(Outputs::Display::DisplayType display_type) { +// video_signal_ = video_signal; // crt_->set_video_signal(video_signal); } @@ -131,13 +131,13 @@ void VideoOutput::run_for(const Cycles cycles) { if(control_byte & 0x60) { if(pixel_target_) { uint16_t colours[2]; - if(video_signal_ == Outputs::Display::VideoSignal::RGB) { - colours[0] = static_cast(paper_ ^ inverse_mask); - colours[1] = static_cast(ink_ ^ inverse_mask); - } else { - colours[0] = colour_forms_[paper_ ^ inverse_mask]; - colours[1] = colour_forms_[ink_ ^ inverse_mask]; - } +// if(video_signal_ == Outputs::Display::VideoSignal::RGB) { +// colours[0] = static_cast(paper_ ^ inverse_mask); +// colours[1] = static_cast(ink_ ^ inverse_mask); +// } else { +// colours[0] = colour_forms_[paper_ ^ inverse_mask]; +// colours[1] = colour_forms_[ink_ ^ inverse_mask]; +// } pixel_target_[0] = colours[(pixels >> 5)&1]; pixel_target_[1] = colours[(pixels >> 4)&1]; pixel_target_[2] = colours[(pixels >> 3)&1]; @@ -181,12 +181,12 @@ void VideoOutput::run_for(const Cycles cycles) { default: break; } - if(pixel_target_) { - pixel_target_[0] = pixel_target_[1] = - pixel_target_[2] = pixel_target_[3] = - pixel_target_[4] = pixel_target_[5] = - (video_signal_ == Outputs::Display::VideoSignal::RGB) ? paper_ ^ inverse_mask : colour_forms_[paper_ ^ inverse_mask]; - } +// if(pixel_target_) { +// pixel_target_[0] = pixel_target_[1] = +// pixel_target_[2] = pixel_target_[3] = +// pixel_target_[4] = pixel_target_[5] = +// (video_signal_ == Outputs::Display::VideoSignal::RGB) ? paper_ ^ inverse_mask : colour_forms_[paper_ ^ inverse_mask]; +// } } if(pixel_target_) pixel_target_ += 6; h_counter++; diff --git a/Machines/Oric/Video.hpp b/Machines/Oric/Video.hpp index 4eb937f0f..2bf579a88 100644 --- a/Machines/Oric/Video.hpp +++ b/Machines/Oric/Video.hpp @@ -24,7 +24,7 @@ class VideoOutput { Outputs::CRT::CRT *get_crt(); void run_for(const Cycles cycles); void set_colour_rom(const std::vector &rom); - void set_video_signal(Outputs::Display::VideoSignal output_device); + void set_display_type(Outputs::Display::DisplayType display_type); private: uint8_t *ram_; @@ -37,7 +37,7 @@ class VideoOutput { // Output target and device uint16_t *pixel_target_; uint16_t colour_forms_[8]; - Outputs::Display::VideoSignal video_signal_; + Outputs::Display::DisplayType display_type_; // Registers uint8_t ink_, paper_; diff --git a/Machines/ZX8081/Video.cpp b/Machines/ZX8081/Video.cpp index 6989f7d1d..9fe5ba77c 100644 --- a/Machines/ZX8081/Video.cpp +++ b/Machines/ZX8081/Video.cpp @@ -26,7 +26,7 @@ Video::Video() : crt_(207 * 2, 1, Outputs::Display::Type::PAL50, Outputs::Display::InputDataType::Luminance1) { // Show only the centre 80% of the TV frame. -// crt_.set_video_signal(Outputs::Display::VideoSignal::Composite); + crt_.set_display_type(Outputs::Display::DisplayType::CompositeMonochrome); crt_.set_visible_area(Outputs::Display::Rect(0.1f, 0.1f, 0.8f, 0.8f)); } diff --git a/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm b/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm index a069e705b..0551caca5 100644 --- a/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm +++ b/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm @@ -466,9 +466,9 @@ struct ActivityObserver: public Activity::Observer { Configurable::SelectionSet selection_set; Configurable::Display display; switch(videoSignal) { - case CSMachineVideoSignalRGB: display = Configurable::Display::RGB; break; - case CSMachineVideoSignalSVideo: display = Configurable::Display::SVideo; break; - case CSMachineVideoSignalComposite: display = Configurable::Display::Composite; break; + case CSMachineVideoSignalRGB: display = Configurable::Display::RGB; break; + case CSMachineVideoSignalSVideo: display = Configurable::Display::SVideo; break; + case CSMachineVideoSignalComposite: display = Configurable::Display::CompositeColour; break; } append_display_selection(selection_set, display); configurable_device->set_selections(selection_set); @@ -488,9 +488,9 @@ struct ActivityObserver: public Activity::Observer { // Get the standard option for this video signal. Configurable::StandardOptions option; switch(videoSignal) { - case CSMachineVideoSignalRGB: option = Configurable::DisplayRGB; break; - case CSMachineVideoSignalSVideo: option = Configurable::DisplaySVideo; break; - case CSMachineVideoSignalComposite: option = Configurable::DisplayComposite; break; + case CSMachineVideoSignalRGB: option = Configurable::DisplayRGB; break; + case CSMachineVideoSignalSVideo: option = Configurable::DisplaySVideo; break; + case CSMachineVideoSignalComposite: option = Configurable::DisplayCompositeColour; break; } std::unique_ptr display_option = std::move(standard_options(option).front()); Configurable::ListOption *display_list_option = dynamic_cast(display_option.get()); diff --git a/Outputs/CRT/CRT.cpp b/Outputs/CRT/CRT.cpp index 5baaed22e..1cdb67ed2 100644 --- a/Outputs/CRT/CRT.cpp +++ b/Outputs/CRT/CRT.cpp @@ -83,6 +83,11 @@ void CRT::set_visible_area(Outputs::Display::Rect visible_area) { scan_target_->set_modals(scan_target_modals_); } +void CRT::set_display_type(Outputs::Display::DisplayType display_type) { + scan_target_modals_.display_type = display_type; + scan_target_->set_modals(scan_target_modals_); +} + void CRT::set_new_display_type(int cycles_per_line, Outputs::Display::Type displayType) { switch(displayType) { case Outputs::Display::Type::PAL50: diff --git a/Outputs/CRT/CRT.hpp b/Outputs/CRT/CRT.hpp index 5fff3117f..1dcbc55f1 100644 --- a/Outputs/CRT/CRT.hpp +++ b/Outputs/CRT/CRT.hpp @@ -262,6 +262,9 @@ class CRT { /*! Sets the scan target for CRT output. */ void set_scan_target(Outputs::Display::ScanTarget *); + + /*! Sets the display type that will be nominated to the scan target. */ + void set_display_type(Outputs::Display::DisplayType); }; } diff --git a/Outputs/ScanTarget.hpp b/Outputs/ScanTarget.hpp index 8da3c97b5..215bd1819 100644 --- a/Outputs/ScanTarget.hpp +++ b/Outputs/ScanTarget.hpp @@ -20,12 +20,6 @@ enum class Type { NTSC60 }; -enum class VideoSignal { - RGB, - SVideo, - Composite -}; - struct Rect { struct Point { float x, y;