From a3432120f375cfcd851971ec5c6f1fe1435ce65f Mon Sep 17 00:00:00 2001
From: Thomas Harte <thomas.harte@gmail.com>
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<Machine>, Tape::Delegate {
 
 		// CRT output
 		unsigned int _currentOutputDivider;
+		bool _isOutputting40Columns;
 		uint8_t *_currentLine, *_writePointer;
 
 		// Tape.