1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-09-07 12:54:34 +00:00

Fixed: asserting vertical blank doesn't affect underlying timing.

This commit is contained in:
Thomas Harte 2016-05-18 18:49:40 -04:00
parent 877c55b5c5
commit 83ed6a82cf

View File

@ -129,6 +129,7 @@ void Machine::update_upcoming_events()
} }
_objectCounter[c] = (_objectCounter[c] + 1)%160; _objectCounter[c] = (_objectCounter[c] + 1)%160;
// if(c == 0) printf(".");
} }
} }
@ -243,11 +244,6 @@ void Machine::output_pixels(unsigned int count)
state = (state = OutputState::Sync) ? OutputState::Blank : OutputState::Sync; state = (state = OutputState::Sync) ? OutputState::Blank : OutputState::Sync;
} }
// honour the vertical blank flag
if(_vBlankEnabled && state == OutputState::Pixel) {
state = OutputState::Blank;
}
// write that state as the one that will become effective in four clocks // write that state as the one that will become effective in four clocks
_upcomingEvents[(_upcomingEventsPointer+4)%number_of_upcoming_events].state = state; _upcomingEvents[(_upcomingEventsPointer+4)%number_of_upcoming_events].state = state;
@ -293,7 +289,8 @@ void Machine::output_pixels(unsigned int count)
if(_hMoveFlags & (1 << c)) if(_hMoveFlags & (1 << c))
{ {
_objectCounter[c] = (_objectCounter[c] + 1)%160; _objectCounter[c] = (_objectCounter[c] + 1)%160;
_pixelCounter[c] ++; _pixelCounter[c] ++; // TODO: this isn't always a straight increment
// if(c == 0) printf("+");
} }
} }
} }
@ -301,10 +298,16 @@ void Machine::output_pixels(unsigned int count)
// read that state // read that state
state = _upcomingEvents[_upcomingEventsPointer].state; state = _upcomingEvents[_upcomingEventsPointer].state;
OutputState actingState = state;
// honour the vertical blank flag
if(_vBlankEnabled && state == OutputState::Pixel) {
actingState = OutputState::Blank;
}
// decide what that means needs to be communicated to the CRT // decide what that means needs to be communicated to the CRT
_lastOutputStateDuration++; _lastOutputStateDuration++;
if(state != _lastOutputState) { if(actingState != _lastOutputState) {
switch(_lastOutputState) { switch(_lastOutputState) {
case OutputState::Blank: _crt->output_blank(_lastOutputStateDuration); break; case OutputState::Blank: _crt->output_blank(_lastOutputStateDuration); break;
case OutputState::Sync: _crt->output_sync(_lastOutputStateDuration); break; case OutputState::Sync: _crt->output_sync(_lastOutputStateDuration); break;
@ -312,9 +315,9 @@ void Machine::output_pixels(unsigned int count)
case OutputState::Pixel: _crt->output_data(_lastOutputStateDuration, 1); break; case OutputState::Pixel: _crt->output_data(_lastOutputStateDuration, 1); break;
} }
_lastOutputStateDuration = 0; _lastOutputStateDuration = 0;
_lastOutputState = state; _lastOutputState = actingState;
if(state == OutputState::Pixel) { if(actingState == OutputState::Pixel) {
_outputBuffer = _crt->allocate_write_area(160); _outputBuffer = _crt->allocate_write_area(160);
} else { } else {
_outputBuffer = nullptr; _outputBuffer = nullptr;
@ -339,6 +342,7 @@ void Machine::output_pixels(unsigned int count)
_horizontalTimer = (_horizontalTimer + 1) % horizontalTimerPeriod; _horizontalTimer = (_horizontalTimer + 1) % horizontalTimerPeriod;
if(!_horizontalTimer) if(!_horizontalTimer)
{ {
// printf("\n");
_vBlankExtend = false; _vBlankExtend = false;
set_ready_line(false); set_ready_line(false);
} }