From 0242924fb4701f55893bf81d631543f11e944b46 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 22 May 2016 14:26:02 -0400 Subject: [PATCH] Various bits of caveman debugging appearing and disappearing, switched to latching ball behaviour. --- Machines/Atari2600/Atari2600.cpp | 81 +++++++++++++++++++++++--------- Machines/Atari2600/Atari2600.hpp | 14 +++--- Processors/6502/CPU6502.hpp | 1 + 3 files changed, 68 insertions(+), 28 deletions(-) diff --git a/Machines/Atari2600/Atari2600.cpp b/Machines/Atari2600/Atari2600.cpp index 5767be297..62ea63a34 100644 --- a/Machines/Atari2600/Atari2600.cpp +++ b/Machines/Atari2600/Atari2600.cpp @@ -79,6 +79,8 @@ Machine::~Machine() void Machine::update_timers(int mask) { +// if(_vBlankExtend) printf("."); + // unsigned int upcomingEventsPointerPlus1 = (_upcomingEventsPointer + 1)%number_of_upcoming_events; unsigned int upcomingEventsPointerPlus2 = (_upcomingEventsPointer + 4)%number_of_upcoming_events; unsigned int upcomingEventsPointerPlus3 = (_upcomingEventsPointer + 5)%number_of_upcoming_events; @@ -153,15 +155,9 @@ void Machine::update_timers(int mask) uint8_t repeatMask = _playerAndMissileSize[c] & 7; switch(repeatMask) { - default: - _pixelCounter[c] += 4; - break; - case 5: - _pixelCounter[c] += 2; - break; - case 7: - _pixelCounter[c] += 1; - break; + default: _pixelCounter[c] += 4; break; + case 5: _pixelCounter[c] += 2; break; + case 7: _pixelCounter[c] += 1; break; } _objectCounter[c] = (_objectCounter[c] + 1)%160; } @@ -183,7 +179,7 @@ uint8_t Machine::get_output_pixel() // get the ball proposed state uint8_t ballPixel = 0; - if(_ballGraphicsEnable&2) { + if(_ballGraphicsEnable[_ballGraphicsSelector]&2) { int ballSize = 1 << ((_playfieldControl >> 4)&3); ballPixel = (_pixelCounter[4] < ballSize) ? 1 : 0; } @@ -231,10 +227,10 @@ uint8_t Machine::get_output_pixel() uint8_t outputColour = playfieldPixel ? playfieldColour : _backgroundColour; if(!(_playfieldControl&0x04) || !playfieldPixel) { - if(missilePixels[1]) outputColour = _playerColour[1]; - if(missilePixels[0]) outputColour = _playerColour[0]; -// if(playerPixels[1] || missilePixels[1]) outputColour = _playerColour[1]; -// if(playerPixels[0] || missilePixels[0]) outputColour = _playerColour[0]; +// if(missilePixels[1]) outputColour = _playerColour[1]; +// if(missilePixels[0]) outputColour = _playerColour[0]; + if(playerPixels[1] || missilePixels[1]) outputColour = _playerColour[1]; + if(playerPixels[0] || missilePixels[0]) outputColour = _playerColour[0]; } // return colour @@ -263,6 +259,10 @@ void Machine::output_pixels(unsigned int count) case 16: case 17: state = _vBlankExtend ? OutputState::Blank : OutputState::Pixel; break; default: state = OutputState::Pixel; break; } +// if(!(_horizontalTimer&3) && _vBlankExtend) +// { +// printf("%c", 'a' + state); +// } // grab background colour and schedule pixel counter resets if(state == OutputState::Pixel) @@ -305,11 +305,20 @@ void Machine::output_pixels(unsigned int count) _upcomingEvents[(_upcomingEventsPointer+4)%number_of_upcoming_events].updates |= Event::Action::HMoveCompare; _upcomingEvents[(_upcomingEventsPointer+2)%number_of_upcoming_events].updates |= Event::Action::HMoveDecrement; } +// else +// { +// _vBlankExtend = false; +// } } if(_upcomingEvents[_upcomingEventsPointer].updates & Event::Action::HMoveDecrement) { update_timers(_hMoveFlags); +// for(int c = 0; c < 5; c++) +// { +// printf("%c", _hMoveFlags & (1 << c) ? 'X' : '-'); +// } +// printf(" "); } _upcomingEvents[_upcomingEventsPointer].updates = 0; @@ -383,6 +392,8 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin output_pixels(cycles_run_for * 3); +// printf("/%d/", _horizontalTimer); + if(operation != CPU6502::BusOperation::Ready) { // check for a paging access @@ -458,10 +469,12 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin case 0x02: // printf("%d\n", _horizontalTimer); +// printf("W"); if(_horizontalTimer) set_ready_line(true); break; case 0x03: - _horizontalTimer = 0; + _horizontalTimer = 0; // TODO: this should be delayed by four cycles, affecting phase; + // need to fix wait logic. break; case 0x04: @@ -539,7 +552,7 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin break; case 0x1c: - _ballGraphicsEnable = _ballGraphicsEnableLatch; + _ballGraphicsEnable[1] = _ballGraphicsEnable[0]; case 0x1b: { int index = decodedAddress - 0x1b; _playerGraphics[0][index] = *value; @@ -548,9 +561,7 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin case 0x1d: _missileGraphicsEnable[0] = *value; break; case 0x1e: _missileGraphicsEnable[1] = *value; break; case 0x1f: - _ballGraphicsEnableLatch = *value; - if(!(_ballGraphicsEnableDelay&1)) - _ballGraphicsEnable = _ballGraphicsEnableLatch; + _ballGraphicsEnable[0] = *value; break; case 0x20: @@ -561,9 +572,9 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin _objectMotion[decodedAddress - 0x20] = *value; break; - case 0x25: _playerGraphicsSelector[0] = (*value)&1; break; - case 0x26: _playerGraphicsSelector[1] = (*value)&1; break; - case 0x27: _ballGraphicsEnableDelay = *value; break; + case 0x25: _playerGraphicsSelector[0] = (*value)&1; break; + case 0x26: _playerGraphicsSelector[1] = (*value)&1; break; + case 0x27: _ballGraphicsSelector = (*value)&1; break; case 0x28: case 0x29: @@ -588,6 +599,31 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin _hMoveFlags = 0x1f; _hMoveCounter = 15; +// static int lc = 0; +// lc++; +// if(lc == 2813) +// printf("{%d}", lc); + +// printf("/%d/", _horizontalTimer); +// printf("%d [", _horizontalTimer); +// for(int c = 0; c < 5; c++) +// { +// printf("%d ", _objectMotion[c] >> 4); +// } +// printf("]"); +// printf("["); +// for(int c = 0; c < 5; c++) +// { +// printf("%d ", _objectCounter[c]); +// } +// printf("]\n"); + +// for(int c = 0; c < 5; c++) +// { +// if(_objectMotion[c] >> 4) +// printf("!"); +// } + // justification for +5: "we need to wait at least 71 [clocks] before the HMOVE operation is complete"; // which will take 16*4 + 2 = 66 cycles from the first compare, implying the first compare must be // in five cycles from now @@ -622,6 +658,7 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin case 0x01: case 0x03: // TODO: port DDR + printf("!!!DDR!!!"); break; case 0x04: returnValue &= _piaTimerValue >> _piaTimerShift; diff --git a/Machines/Atari2600/Atari2600.hpp b/Machines/Atari2600/Atari2600.hpp index e65cb3218..5854f78b2 100644 --- a/Machines/Atari2600/Atari2600.hpp +++ b/Machines/Atari2600/Atari2600.hpp @@ -61,14 +61,16 @@ class Machine: public CPU6502::Processor { struct Event { enum Action { Playfield = 1 << 0, - ResetPixelCounter = 1 << 1, - HMoveCompare = 1 << 2, - HMoveDecrement = 1 << 3, + + ResetPixelCounter = 1 << 3, + + HMoveCompare = 1 << 4, + HMoveDecrement = 1 << 5, }; int updates; int pixelCounterMask; - uint8_t playfieldOutput; + uint8_t playfieldOutput, player0Output, player1Output; OutputState state; Event() : updates(0), pixelCounterMask(0) {} @@ -91,8 +93,8 @@ class Machine: public CPU6502::Processor { uint8_t _missileGraphicsEnable[2], _missileGraphicsReset[2]; // ball registers - uint8_t _ballGraphicsEnable, _ballGraphicsEnableLatch; - uint8_t _ballGraphicsEnableDelay; + uint8_t _ballGraphicsEnable[2]; + uint8_t _ballGraphicsSelector; // graphics output unsigned int _horizontalTimer; diff --git a/Processors/6502/CPU6502.hpp b/Processors/6502/CPU6502.hpp index f5d731daa..fc3fc5633 100644 --- a/Processors/6502/CPU6502.hpp +++ b/Processors/6502/CPU6502.hpp @@ -597,6 +597,7 @@ template class Processor { case CycleFetchOperation: { _lastOperationPC = _pc; +// printf("%04x\n", _pc.full); _pc.full++; read_op(_operation, _lastOperationPC.full);