mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-23 03:29:04 +00:00
Starts towards reintroducing the proper mechanisms for selecting a display type at runtime.
This commit is contained in:
parent
aa22af6f05
commit
64465f97b6
@ -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);
|
||||
|
@ -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
|
||||
|
@ -33,9 +33,10 @@ 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 & 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));
|
||||
@ -59,7 +60,8 @@ void Configurable::append_display_selection(Configurable::SelectionSet &selectio
|
||||
default:
|
||||
case Display::RGB: string_selection = "rgb"; break;
|
||||
case Display::SVideo: string_selection = "svideo"; break;
|
||||
case Display::Composite: string_selection = "composite"; 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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
/*!
|
||||
|
@ -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)
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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++;
|
||||
|
@ -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_;
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
@ -468,7 +468,7 @@ struct ActivityObserver: public Activity::Observer {
|
||||
switch(videoSignal) {
|
||||
case CSMachineVideoSignalRGB: display = Configurable::Display::RGB; break;
|
||||
case CSMachineVideoSignalSVideo: display = Configurable::Display::SVideo; break;
|
||||
case CSMachineVideoSignalComposite: display = Configurable::Display::Composite; break;
|
||||
case CSMachineVideoSignalComposite: display = Configurable::Display::CompositeColour; break;
|
||||
}
|
||||
append_display_selection(selection_set, display);
|
||||
configurable_device->set_selections(selection_set);
|
||||
@ -490,7 +490,7 @@ struct ActivityObserver: public Activity::Observer {
|
||||
switch(videoSignal) {
|
||||
case CSMachineVideoSignalRGB: option = Configurable::DisplayRGB; break;
|
||||
case CSMachineVideoSignalSVideo: option = Configurable::DisplaySVideo; break;
|
||||
case CSMachineVideoSignalComposite: option = Configurable::DisplayComposite; 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());
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -20,12 +20,6 @@ enum class Type {
|
||||
NTSC60
|
||||
};
|
||||
|
||||
enum class VideoSignal {
|
||||
RGB,
|
||||
SVideo,
|
||||
Composite
|
||||
};
|
||||
|
||||
struct Rect {
|
||||
struct Point {
|
||||
float x, y;
|
||||
|
Loading…
x
Reference in New Issue
Block a user