From e39ecf59ef0a77e0eae682d9aeab68d257a38ab7 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Wed, 28 Nov 2018 18:40:43 -0800 Subject: [PATCH] Restores RGB mode to the Oric. More thought required for composite. --- Machines/Oric/Video.cpp | 64 +++++++++++++++++++++++++---------------- Machines/Oric/Video.hpp | 5 ++-- 2 files changed, 43 insertions(+), 26 deletions(-) diff --git a/Machines/Oric/Video.cpp b/Machines/Oric/Video.cpp index 394a9d01f..69a61d363 100644 --- a/Machines/Oric/Video.cpp +++ b/Machines/Oric/Video.cpp @@ -45,7 +45,7 @@ VideoOutput::VideoOutput(uint8_t *memory) : counter_period_(PAL50Period) { // crt_->set_composite_function_type(Outputs::CRT::CRT::CompositeSourceType::DiscreteFourSamplesPerCycle, 0.0f); - set_display_type(Outputs::Display::DisplayType::CompositeColour); + set_display_type(Outputs::Display::DisplayType::RGB); crt_.set_visible_area(crt_.get_rect_for_area(54, 224, 16 * 6, 40 * 6, 4.0f / 3.0f)); } @@ -98,7 +98,9 @@ void VideoOutput::run_for(const Cycles cycles) { paper_ = 0x0; use_alternative_character_set_ = use_double_height_characters_ = blink_text_ = false; set_character_set_base_address(); - pixel_target_ = reinterpret_cast(crt_.begin_data(240)); + + if(display_type_ == Outputs::Display::DisplayType::RGB) rgb_pixel_target_ = reinterpret_cast(crt_.begin_data(240)); + else composite_pixel_target_ = reinterpret_cast(crt_.begin_data(240)); if(!counter_) { frame_counter_++; @@ -131,21 +133,28 @@ void VideoOutput::run_for(const Cycles cycles) { pixels &= blink_mask; 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]; -// } - pixel_target_[0] = colours[(pixels >> 5)&1]; - pixel_target_[1] = colours[(pixels >> 4)&1]; - pixel_target_[2] = colours[(pixels >> 3)&1]; - pixel_target_[3] = colours[(pixels >> 2)&1]; - pixel_target_[4] = colours[(pixels >> 1)&1]; - pixel_target_[5] = colours[(pixels >> 0)&1]; + if(display_type_ == Outputs::Display::DisplayType::RGB && rgb_pixel_target_) { + const uint8_t colours[2] = { + uint8_t(paper_ ^ inverse_mask), + uint8_t(ink_ ^ inverse_mask) + }; + rgb_pixel_target_[0] = colours[(pixels >> 5)&1]; + rgb_pixel_target_[1] = colours[(pixels >> 4)&1]; + rgb_pixel_target_[2] = colours[(pixels >> 3)&1]; + rgb_pixel_target_[3] = colours[(pixels >> 2)&1]; + rgb_pixel_target_[4] = colours[(pixels >> 1)&1]; + rgb_pixel_target_[5] = colours[(pixels >> 0)&1]; + } else if(display_type_ == Outputs::Display::DisplayType::CompositeColour && composite_pixel_target_) { + const uint32_t colours[2] = { + colour_forms_[paper_ ^ inverse_mask], + colour_forms_[ink_ ^ inverse_mask] + }; + composite_pixel_target_[0] = colours[(pixels >> 5)&1]; + composite_pixel_target_[1] = colours[(pixels >> 4)&1]; + composite_pixel_target_[2] = colours[(pixels >> 3)&1]; + composite_pixel_target_[3] = colours[(pixels >> 2)&1]; + composite_pixel_target_[4] = colours[(pixels >> 1)&1]; + composite_pixel_target_[5] = colours[(pixels >> 0)&1]; } } else { switch(control_byte & 0x1f) { @@ -183,19 +192,26 @@ 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(display_type_ == Outputs::Display::DisplayType::RGB && rgb_pixel_target_) { + rgb_pixel_target_[0] = rgb_pixel_target_[1] = + rgb_pixel_target_[2] = rgb_pixel_target_[3] = + rgb_pixel_target_[4] = rgb_pixel_target_[5] = paper_ ^ inverse_mask; + } else if(display_type_ == Outputs::Display::DisplayType::CompositeColour && composite_pixel_target_) { + composite_pixel_target_[0] = composite_pixel_target_[1] = + composite_pixel_target_[2] = composite_pixel_target_[3] = + composite_pixel_target_[4] = composite_pixel_target_[5] = colour_forms_[paper_ ^ inverse_mask]; + } } - if(pixel_target_) pixel_target_ += 6; + if(rgb_pixel_target_) rgb_pixel_target_ += 6; + if(composite_pixel_target_) composite_pixel_target_ += 6; h_counter++; } if(h_counter == 40) { crt_.output_data(40 * 6); + rgb_pixel_target_ = nullptr; + composite_pixel_target_ = nullptr; } } else { // this is a blank line (or the equivalent part of a pixel line) diff --git a/Machines/Oric/Video.hpp b/Machines/Oric/Video.hpp index b96bc665e..e66cf6fcc 100644 --- a/Machines/Oric/Video.hpp +++ b/Machines/Oric/Video.hpp @@ -37,8 +37,9 @@ class VideoOutput { int v_sync_start_position_, v_sync_end_position_, counter_period_; // Output target and device - uint16_t *pixel_target_; - uint16_t colour_forms_[8]; + uint8_t *rgb_pixel_target_; + uint32_t *composite_pixel_target_; + uint32_t colour_forms_[8]; Outputs::Display::DisplayType display_type_; // Registers