1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-10-01 13:58:20 +00:00

Made a first attempt at switching a little closer to TIA's real internal counter setup.

This commit is contained in:
Thomas Harte 2015-08-09 22:47:11 +01:00
parent 987be65a59
commit cd67e31e64
2 changed files with 28 additions and 16 deletions

View File

@ -71,7 +71,7 @@ void Machine::get_output_pixel(uint8_t *pixel, int offset)
// figure out player colour
int flipMask = (_playerReflection[c]&0x8) ? 0 : 7;
int relativeTimer = _playerPosition[c] - _horizontalTimer;
int relativeTimer = _playerCounter[c] - 5;//_playerPosition[c] - _horizontalTimer;
switch (_playerAndMissileSize[c]&7)
{
case 0: break;
@ -106,14 +106,14 @@ void Machine::get_output_pixel(uint8_t *pixel, int offset)
playerPixels[c] = 0;
// figure out missile colour
int missileIndex = _missilePosition[c] - _horizontalTimer;
int missileIndex = _missileCounter[c] - 4;
int missileSize = 1 << ((_playerAndMissileSize[c] >> 4)&3);
missilePixels[c] = (missileIndex >= 0 && missileIndex < missileSize && (_missileGraphicsEnable[c]&2)) ? 1 : 0;
}
// get the ball proposed colour
uint8_t ballPixel;
int ballIndex = _ballPosition - _horizontalTimer;
int ballIndex = _ballCounter - 4;
int ballSize = 1 << ((_playfieldControl >> 4)&3);
ballPixel = (ballIndex >= 0 && ballIndex < ballSize && (_ballGraphicsEnable&2)) ? 1 : 0;
@ -190,13 +190,24 @@ void Machine::output_pixels(int count)
}
if(state == OutputState::Pixel && _outputBuffer)
{
get_output_pixel(&_outputBuffer[_lastOutputStateDuration * 4], 159 - _horizontalTimer);
// incrmeent all graphics counters
_playerCounter[0] = (_playerCounter[0]+1)%160;
_playerCounter[1] = (_playerCounter[1]+1)%160;
_missileCounter[0] = (_missileCounter[0]+1)%160;
_missileCounter[1] = (_missileCounter[1]+1)%160;
_ballCounter = (_ballCounter+1)%160;
}
// assumption here: signed shifts right; otherwise it's just
// an attempt to avoid both the % operator and a conditional
_horizontalTimer--;
const int32_t sign_extension = _horizontalTimer >> 31;
_horizontalTimer = (_horizontalTimer&~sign_extension) | (sign_extension&horizontalTimerReload);
}
}
@ -272,11 +283,11 @@ int Machine::perform_bus_operation(CPU6502::BusOperation operation, uint16_t add
case 0x0e: _playfield[1] = *value; break;
case 0x0f: _playfield[2] = *value; break;
case 0x10: _playerPosition[0] = _horizontalTimer - 5; break;
case 0x11: _playerPosition[1] = _horizontalTimer - 5; break;
case 0x12: _missilePosition[0] = _horizontalTimer - 4; break;
case 0x13: _missilePosition[1] = _horizontalTimer - 4; break;
case 0x14: _ballPosition = _horizontalTimer - 4; break;
case 0x10: _playerCounter[0] = 0; break;
case 0x11: _playerCounter[1] = 0; break;
case 0x12: _missileCounter[0] = 0; break;
case 0x13: _missileCounter[1] = 0; break;
case 0x14: _ballCounter = 0; break;
case 0x1c:
_ballGraphicsEnable = _ballGraphicsEnableLatch;
@ -308,11 +319,11 @@ int Machine::perform_bus_operation(CPU6502::BusOperation operation, uint16_t add
// case 0x28: _missilePosition[0] = _playerPosition[0]; break;
case 0x2a:
_playerPosition[0] += (int8_t)_playerMotion[0] >> 4;
_playerPosition[1] += (int8_t)_playerMotion[1] >> 4;
_missilePosition[0] += (int8_t)_missileMotion[0] >> 4;
_missilePosition[1] += (int8_t)_missileMotion[1] >> 4;
_ballPosition += (int8_t)_ballMotion >> 4;
_playerCounter[0] = (_playerCounter[0] + 160 + ((int8_t)_playerMotion[0] >> 4))%160;
_playerCounter[1] = (_playerCounter[1] + 160 + ((int8_t)_playerMotion[1] >> 4))%160;
_missileCounter[0] = (_missileCounter[0] + 160 + ((int8_t)_missileMotion[0] >> 4))%160;
_missileCounter[1] = (_missileCounter[1] + 160 + ((int8_t)_missileMotion[1] >> 4))%160;
_ballCounter = (_ballCounter + 160 + ((int8_t)_ballMotion >> 4))%160;
break;
case 0x2b: _playerMotion[0] = _playerMotion[1] = _missileMotion[0] = _missileMotion[1] = _ballMotion = 0; break;
}

View File

@ -49,21 +49,22 @@ class Machine: public CPU6502::Processor<Machine> {
uint8_t _playerColour[2];
uint8_t _playerReflection[2];
uint8_t _playerGraphicsLatch[2], _playerGraphics[2];
uint8_t _playerPosition[2];
uint8_t _playerCounter[2];
uint8_t _playerMotion[2];
uint8_t _playerGraphicsLatchEnable[2];
bool _playerStart[2];
// player + missile registers
uint8_t _playerAndMissileSize[2];
// missile registers
uint8_t _missileGraphicsEnable[2];
uint8_t _missilePosition[2];
uint8_t _missileCounter[2];
uint8_t _missileMotion[2];
// ball registers
uint8_t _ballGraphicsEnable, _ballGraphicsEnableLatch;
uint8_t _ballPosition;
uint8_t _ballCounter;
uint8_t _ballMotion;
uint8_t _ballGraphicsEnableDelay;