mirror of
https://github.com/TomHarte/CLK.git
synced 2025-08-08 14:25:05 +00:00
Adds a use-square-pixels option for the Apple II.
This commit is contained in:
@@ -787,12 +787,14 @@ template <Analyser::Static::AppleII::Target::Model model> class ConcreteMachine:
|
|||||||
std::unique_ptr<Reflection::Struct> get_options() final {
|
std::unique_ptr<Reflection::Struct> get_options() final {
|
||||||
auto options = std::make_unique<Options>(Configurable::OptionsType::UserFriendly);
|
auto options = std::make_unique<Options>(Configurable::OptionsType::UserFriendly);
|
||||||
options->output = get_video_signal_configurable();
|
options->output = get_video_signal_configurable();
|
||||||
|
options->use_square_pixels = video_.get_use_square_pixels();
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_options(const std::unique_ptr<Reflection::Struct> &str) {
|
void set_options(const std::unique_ptr<Reflection::Struct> &str) {
|
||||||
const auto options = dynamic_cast<Options *>(str.get());
|
const auto options = dynamic_cast<Options *>(str.get());
|
||||||
set_video_signal_configurable(options->output);
|
set_video_signal_configurable(options->output);
|
||||||
|
video_.set_use_square_pixels(options->use_square_pixels);
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: MediaTarget
|
// MARK: MediaTarget
|
||||||
|
@@ -30,10 +30,16 @@ class Machine {
|
|||||||
class Options: public Reflection::StructImpl<Options>, public Configurable::DisplayOption<Options> {
|
class Options: public Reflection::StructImpl<Options>, public Configurable::DisplayOption<Options> {
|
||||||
friend Configurable::DisplayOption<Options>;
|
friend Configurable::DisplayOption<Options>;
|
||||||
public:
|
public:
|
||||||
Options(Configurable::OptionsType) : Configurable::DisplayOption<Options>(Configurable::Display::CompositeColour) {
|
bool use_square_pixels = false;
|
||||||
|
|
||||||
|
Options(Configurable::OptionsType) : Configurable::DisplayOption<Options>(Configurable::Display::CompositeColour) {
|
||||||
if(needs_declare()) {
|
if(needs_declare()) {
|
||||||
declare_display_option();
|
declare_display_option();
|
||||||
limit_enum(&output, Configurable::Display::CompositeMonochrome, Configurable::Display::CompositeColour, -1);
|
limit_enum(&output, Configurable::Display::CompositeMonochrome, Configurable::Display::CompositeColour, -1);
|
||||||
|
|
||||||
|
if(needs_declare()) {
|
||||||
|
DeclareField(use_square_pixels);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@@ -26,6 +26,30 @@ VideoBase::VideoBase(bool is_iie, std::function<void(Cycles)> &&target) :
|
|||||||
// crt_.set_immediate_default_phase(0.5f);
|
// crt_.set_immediate_default_phase(0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VideoBase::set_use_square_pixels(bool use_square_pixels) {
|
||||||
|
use_square_pixels_ = use_square_pixels;
|
||||||
|
|
||||||
|
if(use_square_pixels) {
|
||||||
|
// From what I can make out, many contemporary Apple II monitors were
|
||||||
|
// calibrated slightly to stretch the Apple II's display slightly wider
|
||||||
|
// than it should be per the NTSC standards, for approximately square
|
||||||
|
// pixels. This reproduces that.
|
||||||
|
|
||||||
|
// 243 lines and 52µs are visible.
|
||||||
|
// i.e. to be square, 1 pixel should be: (1/243 * 52) * (3/4) = 156/972 = 39/243 µs
|
||||||
|
// On an Apple II each pixel is actually 1/7µs.
|
||||||
|
// Therefore the adjusted aspect ratio should be (4/3) * (39/243)/(1/7) = (4/3) * 273/243 = 1092/729 = 343/243 ~= 1.412
|
||||||
|
crt_.set_aspect_ratio(343.0f / 243.0f);
|
||||||
|
} else {
|
||||||
|
// Standard NTSC aspect ratio.
|
||||||
|
crt_.set_aspect_ratio(4.0f / 3.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool VideoBase::get_use_square_pixels() {
|
||||||
|
return use_square_pixels_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void VideoBase::set_scan_target(Outputs::Display::ScanTarget *scan_target) {
|
void VideoBase::set_scan_target(Outputs::Display::ScanTarget *scan_target) {
|
||||||
crt_.set_scan_target(scan_target);
|
crt_.set_scan_target(scan_target);
|
||||||
}
|
}
|
||||||
|
@@ -51,8 +51,14 @@ class VideoBase: public VideoSwitches<Cycles> {
|
|||||||
/// Gets the type of output.
|
/// Gets the type of output.
|
||||||
Outputs::Display::DisplayType get_display_type() const;
|
Outputs::Display::DisplayType get_display_type() const;
|
||||||
|
|
||||||
|
/// Sets whether the current CRT should be recalibrated away from normative NTSC
|
||||||
|
/// to produce square pixels in 40-column text mode.
|
||||||
|
void set_use_square_pixels(bool);
|
||||||
|
bool get_use_square_pixels();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Outputs::CRT::CRT crt_;
|
Outputs::CRT::CRT crt_;
|
||||||
|
bool use_square_pixels_ = false;
|
||||||
|
|
||||||
// State affecting output video stream generation.
|
// State affecting output video stream generation.
|
||||||
uint8_t *pixel_pointer_ = nullptr;
|
uint8_t *pixel_pointer_ = nullptr;
|
||||||
|
Reference in New Issue
Block a user