diff --git a/Components/9918/Implementation/9918.cpp b/Components/9918/Implementation/9918.cpp index d87c584a4..7e7cfdb31 100644 --- a/Components/9918/Implementation/9918.cpp +++ b/Components/9918/Implementation/9918.cpp @@ -31,6 +31,8 @@ Base::Base() : // into whether there's a more natural form. It feels unlikely given the diversity of chips modelled. if constexpr (is_sega_vdp(personality)) { + // TODO: all these relate to the old line timing; resource and review. + mode_timing_.line_interrupt_position = 64; mode_timing_.end_of_frame_interrupt_position.column = 63; @@ -39,13 +41,13 @@ Base::Base() : if constexpr (is_yamaha_vdp(personality)) { // TODO: start of sync, or end of sync? - mode_timing_.line_interrupt_position = Timing::StartOfSync; + mode_timing_.line_interrupt_position = 0;//Timing::StartOfSync; } // Establish that output is delayed after reading by `output_lag` cycles, // i.e. the fetch pointer is currently _ahead_ of the output pointer. // - // Start at a random position. + // TODO: Start at a random position. output_pointer_.row = output_pointer_.column = 0; // output_pointer_.row = rand() % 262; // output_pointer_.column = rand() % (Timing::CyclesPerLine - output_lag); @@ -508,43 +510,40 @@ void TMS9918::run_for(const HalfCycles cycles) { output_sync(Timing::CyclesPerLine); } } else { - // Right border. - border(0, Timing::EndOfRightBorder); - // Blanking region: output the entire sequence when the cursor // crosses the start-of-border point. if( - this->output_pointer_.column < Timing::StartOfLeftBorder && - end_column >= Timing::StartOfLeftBorder + this->output_pointer_.column < LineLayout::EndOfLeftErase && + end_column >= LineLayout::EndOfLeftErase ) { - output_blank(Timing::StartOfSync - Timing::EndOfRightBorder); - output_sync(Timing::EndOfSync - Timing::StartOfSync); - output_blank(Timing::StartOfColourBurst - Timing::EndOfSync); - output_default_colour_burst(Timing::EndOfColourBurst - Timing::StartOfColourBurst); - output_blank(Timing::StartOfLeftBorder - Timing::EndOfColourBurst); + output_sync(LineLayout::EndOfSync); + output_blank(LineLayout::StartOfColourBurst - LineLayout::EndOfSync); + output_default_colour_burst(LineLayout::EndOfColourBurst - LineLayout::StartOfColourBurst); + output_blank(LineLayout::EndOfLeftErase - LineLayout::EndOfColourBurst); } - // Border colour for the rest of the line. - border(Timing::StartOfLeftBorder, Timing::CyclesPerLine); + // Border colour until beginning of right erase. + border(LineLayout::EndOfLeftErase, LineLayout::EndOfRightBorder); + + // Right erase. + if(this->output_pointer_.column == Timing::CyclesPerLine) { + output_blank(Timing::CyclesPerLine - LineLayout::EndOfRightBorder); + } } } else { - // Right border. - border(0, Timing::EndOfRightBorder); - // Blanking region. if( - this->output_pointer_.column < Timing::StartOfLeftBorder && - end_column >= Timing::StartOfLeftBorder + this->output_pointer_.column < LineLayout::EndOfLeftErase && + end_column >= LineLayout::EndOfLeftErase ) { - output_blank(Timing::StartOfSync - Timing::EndOfRightBorder); - output_sync(Timing::EndOfSync - Timing::StartOfSync); - output_blank(Timing::StartOfColourBurst - Timing::EndOfSync); - output_default_colour_burst(Timing::EndOfColourBurst - Timing::StartOfColourBurst); - output_blank(Timing::StartOfLeftBorder - Timing::EndOfColourBurst); + output_sync(LineLayout::EndOfSync); + output_blank(LineLayout::StartOfColourBurst - LineLayout::EndOfSync); + output_default_colour_burst(LineLayout::EndOfColourBurst - LineLayout::StartOfColourBurst); + output_blank(LineLayout::EndOfLeftErase - LineLayout::EndOfColourBurst); } // Left border. - border(Timing::StartOfLeftBorder, this->draw_line_buffer_->first_pixel_output_column); + border(LineLayout::EndOfLeftErase, this->draw_line_buffer_->first_pixel_output_column); #define draw(function, clock) { \ const int relative_start = from_internal(start - this->draw_line_buffer_->first_pixel_output_column); \ @@ -588,9 +587,12 @@ void TMS9918::run_for(const HalfCycles cycles) { #undef draw - // Additional right border, if called for. - if(this->draw_line_buffer_->next_border_column != Timing::CyclesPerLine) { - border(this->draw_line_buffer_->next_border_column, Timing::CyclesPerLine); + // Right border. + border(this->draw_line_buffer_->next_border_column, LineLayout::EndOfRightBorder); + + // Right erase. + if(this->output_pointer_.column == Timing::CyclesPerLine) { + output_blank(Timing::CyclesPerLine - LineLayout::EndOfRightBorder); } } diff --git a/Components/9918/Implementation/ClockConverter.hpp b/Components/9918/Implementation/ClockConverter.hpp index 89427c439..0eece395d 100644 --- a/Components/9918/Implementation/ClockConverter.hpp +++ b/Components/9918/Implementation/ClockConverter.hpp @@ -70,25 +70,6 @@ template struct StandardTiming { /// The final internal cycle at which pixels will be output text mode. constexpr static int LastTextCycle = 334 * CyclesPerLine / 342; - - // For the below, the fixed portion of line layout is: - // - // [0, EndOfRightBorder): right border colour - // [EndOfRightBorder, StartOfSync): blank - // [StartOfSync, EndOfSync): sync - // [EndOfSync, StartOfColourBurst): blank - // [StartOfColourBurst, EndOfColourBurst): the colour burst - // [EndOfColourBurst, StartOfLeftBorder): blank - // - // The region from StartOfLeftBorder until the end is then filled with - // some combination of pixels and more border, depending on the vertical - // position of this line and the current screen mode. - constexpr static int EndOfRightBorder = 15 * CyclesPerLine / 342; - constexpr static int StartOfSync = 23 * CyclesPerLine / 342; - constexpr static int EndOfSync = 49 * CyclesPerLine / 342; - constexpr static int StartOfColourBurst = 51 * CyclesPerLine / 342; - constexpr static int EndOfColourBurst = 65 * CyclesPerLine / 342; - constexpr static int StartOfLeftBorder = 73 * CyclesPerLine / 342; }; /// Provides concrete, specific timing for the nominated personality.