1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-06-01 22:41:32 +00:00

Starts towards reintroducing the proper mechanisms for selecting a display type at runtime.

This commit is contained in:
Thomas Harte 2018-11-28 17:53:33 -08:00
parent aa22af6f05
commit 64465f97b6
19 changed files with 87 additions and 80 deletions

View File

@ -69,7 +69,7 @@ template <class BusHandler> 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);

View File

@ -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

View File

@ -33,11 +33,12 @@ bool get_bool(const Configurable::SelectionSet &selections_by_option, const std:
std::vector<std::unique_ptr<Configurable::Option>> Configurable::standard_options(Configurable::StandardOptions mask) {
std::vector<std::unique_ptr<Configurable::Option>> 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<std::string> 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<Configurable::Selection>(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;
}
}

View File

@ -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
};
/*!

View File

@ -41,7 +41,7 @@ namespace AmstradCPC {
std::vector<std::unique_ptr<Configurable::Option>> get_options() {
return Configurable::standard_options(
static_cast<Configurable::StandardOptions>(Configurable::DisplayRGB | Configurable::DisplayComposite)
static_cast<Configurable::StandardOptions>(Configurable::DisplayRGB | Configurable::DisplayCompositeColour)
);
}

View File

@ -16,7 +16,7 @@ VideoBase::VideoBase(bool is_iie, std::function<void(Cycles)> &&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);

View File

@ -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;

View File

@ -50,7 +50,7 @@ enum ROMSlot {
std::vector<std::unique_ptr<Configurable::Option>> get_options() {
return Configurable::standard_options(
static_cast<Configurable::StandardOptions>(Configurable::DisplaySVideo | Configurable::DisplayComposite | Configurable::QuickLoadTape)
static_cast<Configurable::StandardOptions>(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;
}

View File

@ -34,7 +34,7 @@ namespace Electron {
std::vector<std::unique_ptr<Configurable::Option>> get_options() {
return Configurable::standard_options(
static_cast<Configurable::StandardOptions>(Configurable::DisplayRGB | Configurable::DisplayComposite | Configurable::QuickLoadTape)
static_cast<Configurable::StandardOptions>(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;
}

View File

@ -51,7 +51,7 @@ namespace MSX {
std::vector<std::unique_ptr<Configurable::Option>> get_options() {
return Configurable::standard_options(
static_cast<Configurable::StandardOptions>(Configurable::DisplayRGB | Configurable::DisplaySVideo | Configurable::DisplayComposite | Configurable::QuickLoadTape)
static_cast<Configurable::StandardOptions>(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;
}

View File

@ -36,7 +36,7 @@ namespace MasterSystem {
std::vector<std::unique_ptr<Configurable::Option>> get_options() {
return Configurable::standard_options(
static_cast<Configurable::StandardOptions>(Configurable::DisplayRGB | Configurable::DisplayComposite)
static_cast<Configurable::StandardOptions>(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;
}

View File

@ -46,7 +46,11 @@ enum ROM {
std::vector<std::unique_ptr<Configurable::Option>> get_options() {
return Configurable::standard_options(
static_cast<Configurable::StandardOptions>(Configurable::DisplayRGB | Configurable::DisplayComposite | Configurable::QuickLoadTape)
static_cast<Configurable::StandardOptions>(
Configurable::DisplayRGB |
Configurable::DisplayCompositeColour |
Configurable::DisplayCompositeMonochrome |
Configurable::QuickLoadTape)
);
}
@ -461,17 +465,9 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface> 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 <Analyser::Static::Oric::Target::DiskInterface disk_interface> 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;
}

View File

@ -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<uint8_t>(paper_ ^ inverse_mask);
colours[1] = static_cast<uint8_t>(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<uint8_t>(paper_ ^ inverse_mask);
// colours[1] = static_cast<uint8_t>(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++;

View File

@ -24,7 +24,7 @@ class VideoOutput {
Outputs::CRT::CRT *get_crt();
void run_for(const Cycles cycles);
void set_colour_rom(const std::vector<uint8_t> &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_;

View File

@ -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));
}

View File

@ -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<Configurable::Option> display_option = std::move(standard_options(option).front());
Configurable::ListOption *display_list_option = dynamic_cast<Configurable::ListOption *>(display_option.get());

View File

@ -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:

View File

@ -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);
};
}

View File

@ -20,12 +20,6 @@ enum class Type {
NTSC60
};
enum class VideoSignal {
RGB,
SVideo,
Composite
};
struct Rect {
struct Point {
float x, y;