1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-19 08:31:11 +00:00

Ensures proper accumulation and reporting of colour phase across lines.

This commit is contained in:
Thomas Harte 2018-11-04 21:44:22 -05:00
parent 014da41471
commit eb28095041
2 changed files with 14 additions and 12 deletions

View File

@ -29,9 +29,9 @@ void CRT::set_new_timing(int cycles_per_line, int height_of_display, Outputs::Di
// in NTSC and PAL TV." // in NTSC and PAL TV."
time_multiplier_ = 65535 / cycles_per_line; time_multiplier_ = 65535 / cycles_per_line;
phase_denominator_ = cycles_per_line * colour_cycle_denominator * time_multiplier_; phase_denominator_ = int64_t(cycles_per_line) * int64_t(colour_cycle_denominator) * int64_t(time_multiplier_);
phase_numerator_ = 0; phase_numerator_ = 0;
colour_cycle_numerator_ = colour_cycle_numerator; colour_cycle_numerator_ = int64_t(colour_cycle_numerator);
phase_alternates_ = should_alternate; phase_alternates_ = should_alternate;
is_alernate_line_ &= phase_alternates_; is_alernate_line_ &= phase_alternates_;
cycles_per_line_ = cycles_per_line; cycles_per_line_ = cycles_per_line;
@ -157,16 +157,15 @@ void CRT::advance_cycles(int number_of_cycles, bool hsync_requested, bool vsync_
// If outputting, store the start location and // If outputting, store the start location and
if(next_scan) { if(next_scan) {
next_scan->end_points[0].x = static_cast<uint16_t>(horizontal_flywheel_->get_current_output_position()); next_scan->end_points[0].x = uint16_t(horizontal_flywheel_->get_current_output_position());
next_scan->end_points[0].y = static_cast<uint16_t>(vertical_flywheel_->get_current_output_position() / vertical_flywheel_output_divider_); next_scan->end_points[0].y = uint16_t(vertical_flywheel_->get_current_output_position() / vertical_flywheel_output_divider_);
next_scan->end_points[0].composite_angle = colour_burst_angle_; // TODO. next_scan->end_points[0].composite_angle = int16_t((phase_numerator_ << 6) / phase_denominator_) * (is_alernate_line_ ? -1 : 1);
next_scan->end_points[0].data_offset = static_cast<uint16_t>((total_cycles - number_of_cycles) * number_of_samples / total_cycles); next_scan->end_points[0].data_offset = uint16_t((total_cycles - number_of_cycles) * number_of_samples / total_cycles);
next_scan->composite_amplitude = colour_burst_amplitude_; next_scan->composite_amplitude = colour_burst_amplitude_;
} }
// Advance time: that'll affect both the colour subcarrier position and the number of cycles left to run. // Advance time: that'll affect both the colour subcarrier position and the number of cycles left to run.
phase_numerator_ += next_run_length * colour_cycle_numerator_; phase_numerator_ += next_run_length * colour_cycle_numerator_;
phase_numerator_ %= phase_denominator_;
number_of_cycles -= next_run_length; number_of_cycles -= next_run_length;
// React to the incoming event. // React to the incoming event.
@ -175,10 +174,10 @@ void CRT::advance_cycles(int number_of_cycles, bool hsync_requested, bool vsync_
// Store an endpoint if necessary. // Store an endpoint if necessary.
if(next_scan) { if(next_scan) {
next_scan->end_points[1].x = static_cast<uint16_t>(horizontal_flywheel_->get_current_output_position()); next_scan->end_points[1].x = uint16_t(horizontal_flywheel_->get_current_output_position());
next_scan->end_points[1].y = static_cast<uint16_t>(vertical_flywheel_->get_current_output_position() / vertical_flywheel_output_divider_); next_scan->end_points[1].y = uint16_t(vertical_flywheel_->get_current_output_position() / vertical_flywheel_output_divider_);
next_scan->end_points[1].composite_angle = colour_burst_angle_; // TODO. next_scan->end_points[1].composite_angle = int16_t((phase_numerator_ << 6) / phase_denominator_) * (is_alernate_line_ ? -1 : 1);
next_scan->end_points[1].data_offset = static_cast<uint16_t>((total_cycles - number_of_cycles) * number_of_samples / total_cycles); next_scan->end_points[1].data_offset = uint16_t((total_cycles - number_of_cycles) * number_of_samples / total_cycles);
} }
// If this is horizontal retrace then announce as such, and prepare for the next line. // If this is horizontal retrace then announce as such, and prepare for the next line.
@ -186,6 +185,7 @@ void CRT::advance_cycles(int number_of_cycles, bool hsync_requested, bool vsync_
scan_target_->announce(Outputs::Display::ScanTarget::Event::HorizontalRetrace); scan_target_->announce(Outputs::Display::ScanTarget::Event::HorizontalRetrace);
is_alernate_line_ ^= phase_alternates_; is_alernate_line_ ^= phase_alternates_;
colour_burst_amplitude_ = 0; colour_burst_amplitude_ = 0;
phase_numerator_ = 0;
} }
// Also announce if this is vertical retrace. // Also announce if this is vertical retrace.

View File

@ -53,7 +53,9 @@ class CRT {
int colour_burst_phase_adjustment_ = 0; int colour_burst_phase_adjustment_ = 0;
bool is_writing_composite_run_ = false; bool is_writing_composite_run_ = false;
int phase_denominator_ = 1, phase_numerator_ = 1, colour_cycle_numerator_ = 1; int64_t phase_denominator_ = 1;
int64_t phase_numerator_ = 0;
int64_t colour_cycle_numerator_ = 1;
bool is_alernate_line_ = false, phase_alternates_ = false; bool is_alernate_line_ = false, phase_alternates_ = false;
// the outer entry point for dispatching output_sync, output_blank, output_level and output_data // the outer entry point for dispatching output_sync, output_blank, output_level and output_data