1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-26 23:52:26 +00:00

Generalised slightly, to allow events to be queued up to eight cycles in advance; most importantly each event gets to pick its own delay.

This commit is contained in:
Thomas Harte 2016-05-17 07:09:18 -04:00
parent 3d003070b3
commit 7d3cf76576
2 changed files with 21 additions and 11 deletions

View File

@ -80,14 +80,21 @@ Machine::~Machine()
void Machine::update_upcoming_event() void Machine::update_upcoming_event()
{ {
_upcomingEvents[_upcomingEventsPointer].updates = 0; // grab the background now, for display in four clocks
if(!(_horizontalTimer&3))
unsigned int offset = 4 + _horizontalTimer - (horizontalTimerPeriod - 160);
if(!(offset&3))
{ {
_upcomingEvents[_upcomingEventsPointer].updates |= Event::Action::Playfield; unsigned int offset = 4 + _horizontalTimer - (horizontalTimerPeriod - 160);
_upcomingEvents[_upcomingEventsPointer].playfieldOutput = _playfield[(offset >> 2)%40]; _upcomingEvents[(_upcomingEventsPointer + 4)%number_of_upcoming_events].updates |= Event::Action::Playfield;
_upcomingEvents[(_upcomingEventsPointer + 4)%number_of_upcoming_events].playfieldOutput = _playfield[(offset >> 2)%40];
} }
// the ball becomes visible whenever it hits zero, regardless of whether its status
// is the result of a counter rollover or a programmatic reset
if(!_objectCounter[4] && _ballGraphicsEnable&2)
{
}
// the players and missles become visible only upon overflow to zero
} }
uint8_t Machine::get_output_pixel() uint8_t Machine::get_output_pixel()
@ -227,14 +234,12 @@ void Machine::output_pixels(unsigned int count)
update_upcoming_event(); update_upcoming_event();
} }
// advance, hitting the state that will become active now // apply any queued changes and flush the record
_upcomingEventsPointer = (_upcomingEventsPointer + 1)&3;
// apply any queued changes
if(_upcomingEvents[_upcomingEventsPointer].updates & Event::Action::Playfield) if(_upcomingEvents[_upcomingEventsPointer].updates & Event::Action::Playfield)
{ {
_playfieldOutput = _upcomingEvents[_upcomingEventsPointer].playfieldOutput; _playfieldOutput = _upcomingEvents[_upcomingEventsPointer].playfieldOutput;
} }
_upcomingEvents[_upcomingEventsPointer].updates = 0;
// read that state // read that state
state = _upcomingEvents[_upcomingEventsPointer].state; state = _upcomingEvents[_upcomingEventsPointer].state;
@ -269,6 +274,9 @@ void Machine::output_pixels(unsigned int count)
} }
} }
// advance
_upcomingEventsPointer = (_upcomingEventsPointer + 1)%number_of_upcoming_events;
// update hmove // update hmove
// if(!(_horizontalTimer&3)) { // if(!(_horizontalTimer&3)) {
// //

View File

@ -16,6 +16,8 @@
namespace Atari2600 { namespace Atari2600 {
const unsigned int number_of_upcoming_events = 8;
class Machine: public CPU6502::Processor<Machine> { class Machine: public CPU6502::Processor<Machine> {
public: public:
@ -64,7 +66,7 @@ class Machine: public CPU6502::Processor<Machine> {
unsigned int updates; unsigned int updates;
uint8_t playfieldOutput; uint8_t playfieldOutput;
OutputState state; OutputState state;
} _upcomingEvents[4]; } _upcomingEvents[number_of_upcoming_events];
unsigned int _upcomingEventsPointer; unsigned int _upcomingEventsPointer;
uint8_t _playfieldOutput; uint8_t _playfieldOutput;