From b1c84f5402d5daf8cc454b80790fd10e9e42bfda Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sat, 21 May 2016 12:54:39 -0400 Subject: [PATCH] Counters run every scan line regardless of blank and sync. Also played further with timing. --- Machines/Atari2600/Atari2600.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/Machines/Atari2600/Atari2600.cpp b/Machines/Atari2600/Atari2600.cpp index 3f3cc223b..ff2aeb1b8 100644 --- a/Machines/Atari2600/Atari2600.cpp +++ b/Machines/Atari2600/Atari2600.cpp @@ -79,6 +79,9 @@ Machine::~Machine() void Machine::update_timers(int mask) { + unsigned int upcomingEventsPointerPlus1 = (_upcomingEventsPointer + 1)%number_of_upcoming_events; + unsigned int upcomingEventsPointerPlus2 = (_upcomingEventsPointer + 2)%number_of_upcoming_events; + unsigned int upcomingEventsPointerPlus3 = (_upcomingEventsPointer + 3)%number_of_upcoming_events; unsigned int upcomingEventsPointerPlus4 = (_upcomingEventsPointer + 4)%number_of_upcoming_events; unsigned int upcomingEventsPointerPlus5 = (_upcomingEventsPointer + 5)%number_of_upcoming_events; unsigned int upcomingEventsPointerPlus6 = (_upcomingEventsPointer + 6)%number_of_upcoming_events; @@ -91,8 +94,8 @@ void Machine::update_timers(int mask) if(!(_horizontalTimer&3)) { unsigned int offset = 4 + _horizontalTimer - (horizontalTimerPeriod - 160); - _upcomingEvents[upcomingEventsPointerPlus4].updates |= Event::Action::Playfield; - _upcomingEvents[upcomingEventsPointerPlus4].playfieldOutput = _playfield[(offset >> 2)%40]; + _upcomingEvents[upcomingEventsPointerPlus2].updates |= Event::Action::Playfield; + _upcomingEvents[upcomingEventsPointerPlus2].playfieldOutput = _playfield[(offset >> 2)%40]; } } @@ -102,8 +105,8 @@ void Machine::update_timers(int mask) { if(!_objectCounter[4]) { - _upcomingEvents[upcomingEventsPointerPlus4].updates |= Event::Action::ResetPixelCounter; - _upcomingEvents[upcomingEventsPointerPlus4].pixelCounterMask |= (1 << 4); + _upcomingEvents[upcomingEventsPointerPlus2].updates |= Event::Action::ResetPixelCounter; + _upcomingEvents[upcomingEventsPointerPlus2].pixelCounterMask |= (1 << 4); } _objectCounter[4] = (_objectCounter[4] + 1)%160; _pixelCounter[4] ++; @@ -118,7 +121,8 @@ void Machine::update_timers(int mask) // 5/6 clocks ahead from 159 if(_objectCounter[c] == 159) { - unsigned int actionSlot = (c < 2) ? upcomingEventsPointerPlus6 : upcomingEventsPointerPlus5; + unsigned int actionSlot = (c < 2) ? upcomingEventsPointerPlus4 : upcomingEventsPointerPlus3; +// unsigned int actionSlot = (c < 2) ? upcomingEventsPointerPlus6 : upcomingEventsPointerPlus5; _upcomingEvents[actionSlot].updates |= Event::Action::ResetPixelCounter; _upcomingEvents[actionSlot].pixelCounterMask |= (1 << c); } @@ -133,7 +137,8 @@ void Machine::update_timers(int mask) ( _objectCounter[c] == 64 && ((repeatMask == 4) || (repeatMask == 6)) ) ) { - unsigned int actionSlot = (c < 2) ? upcomingEventsPointerPlus5 : upcomingEventsPointerPlus4; + unsigned int actionSlot = (c < 2) ? upcomingEventsPointerPlus3 : upcomingEventsPointerPlus2; +// unsigned int actionSlot = (c < 2) ? upcomingEventsPointerPlus5 : upcomingEventsPointerPlus4; _upcomingEvents[actionSlot].updates |= Event::Action::ResetPixelCounter; _upcomingEvents[actionSlot].pixelCounterMask |= (1 << c); } @@ -257,6 +262,10 @@ void Machine::output_pixels(unsigned int count) default: state = OutputState::Pixel; break; } + // grab background colour and schedule pixel counter resets + if(state == OutputState::Pixel) + update_timers(~0); + // if vsync is enabled, output the opposite of the automatic hsync output if(_vSyncEnabled) { state = (state = OutputState::Sync) ? OutputState::Blank : OutputState::Sync; @@ -265,10 +274,6 @@ void Machine::output_pixels(unsigned int count) // write that state as the one that will become effective in four clocks _upcomingEvents[(_upcomingEventsPointer+4)%number_of_upcoming_events].state = state; - // grab background colour and schedule pixel counter resets - if(state == OutputState::Pixel) - update_timers(~0); - // apply any queued changes and flush the record if(_upcomingEvents[_upcomingEventsPointer].updates & Event::Action::Playfield) _playfieldOutput = _upcomingEvents[_upcomingEventsPointer].playfieldOutput;