From a3432120f375cfcd851971ec5c6f1fe1435ce65f Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Fri, 19 Feb 2016 23:57:57 -0500 Subject: [PATCH] =?UTF-8?q?Fixed=20synchronisation=20=E2=80=94=20my=20two?= =?UTF-8?q?=20fields=20weren't=20of=20equal=20length,=20I=20wasn't=20break?= =?UTF-8?q?ing=20calls=20to=20the=20CRT=20upon=2040/80=20transitions,=20I?= =?UTF-8?q?=20had=20the=20wrong=20maximum=20run=20length.=20Now=20I=20just?= =?UTF-8?q?=20need=20to=20put=20real=20pixels=20back=20in.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Machines/Electron/Electron.cpp | 19 ++++++++++++++----- Machines/Electron/Electron.hpp | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Machines/Electron/Electron.cpp b/Machines/Electron/Electron.cpp index 17d094518..57bcd4fa0 100644 --- a/Machines/Electron/Electron.cpp +++ b/Machines/Electron/Electron.cpp @@ -20,6 +20,7 @@ static const unsigned int crt_cycles_per_line = crt_cycles_multiplier * cycles_p static const int first_graphics_line = 38; static const int first_graphics_cycle = 33; +static const int last_graphics_cycle = 80 + first_graphics_cycle; Machine::Machine() : _interrupt_control(0), @@ -401,10 +402,11 @@ inline void Machine::output_pixels(int start_x, int number_of_pixels) } bool is40Column = (_screen_mode > 3); - if(!_writePointer || newDivider != _currentOutputDivider) + if(!_writePointer || newDivider != _currentOutputDivider || _isOutputting40Columns != is40Column) { - _currentOutputDivider = newDivider; end_pixel_output(); + _currentOutputDivider = newDivider; + _isOutputting40Columns = is40Column; _crt->allocate_write_area(640 / newDivider); _currentLine = _writePointer = _crt->get_write_target_for_buffer(0); } @@ -453,6 +455,7 @@ inline void Machine::end_pixel_output() inline void Machine::update_pixels_to_position(int x, int y) { + static unsigned int end; while((display_x < x) || (display_y < y)) { if(display_x < first_graphics_cycle) @@ -463,19 +466,25 @@ inline void Machine::update_pixels_to_position(int x, int y) { _crt->output_sync(9 * crt_cycles_multiplier); _crt->output_blank((first_graphics_cycle - 9) * crt_cycles_multiplier); + end = _crt->get_field_cycle(); } continue; } - if(display_x < first_graphics_cycle+80) + if(display_x < last_graphics_cycle) { - int cycles_to_output = (display_y < y) ? 80 + first_graphics_cycle - display_x : std::min(80, x - display_x); + int cycles_to_output = (display_y < y) ? last_graphics_cycle - display_x : std::min(last_graphics_cycle - display_x, x - display_x); output_pixels(display_x, cycles_to_output); display_x += cycles_to_output; - if(display_x == first_graphics_cycle+80) + if(display_x == last_graphics_cycle) { end_pixel_output(); + + if(_crt->get_field_cycle() - end != 640) + { + printf("!!!\n"); + } } continue; } diff --git a/Machines/Electron/Electron.hpp b/Machines/Electron/Electron.hpp index 58054b3b7..e7f13857d 100644 --- a/Machines/Electron/Electron.hpp +++ b/Machines/Electron/Electron.hpp @@ -193,6 +193,7 @@ class Machine: public CPU6502::Processor, Tape::Delegate { // CRT output unsigned int _currentOutputDivider; + bool _isOutputting40Columns; uint8_t *_currentLine, *_writePointer; // Tape.