Skip to content

Commit

Permalink
Added VIC_cycles.cpp
Browse files Browse the repository at this point in the history
  • Loading branch information
Dirk Hoffmann authored and Dirk Hoffmann committed Jul 11, 2018
1 parent 4ac4d80 commit 4ab3293
Show file tree
Hide file tree
Showing 6 changed files with 333 additions and 220 deletions.
86 changes: 52 additions & 34 deletions C64/C64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,40 +147,6 @@ C64::C64()
// Initialize mach timer info
mach_timebase_info(&timebase);

// Initialize VIC function table
vicfunc[0] = NULL;
vicfunc[1] = &VIC::cycle1;
vicfunc[2] = &VIC::cycle2;
vicfunc[3] = &VIC::cycle3;
vicfunc[4] = &VIC::cycle4;
vicfunc[5] = &VIC::cycle5;
vicfunc[6] = &VIC::cycle6;
vicfunc[7] = &VIC::cycle7;
vicfunc[8] = &VIC::cycle8;
vicfunc[9] = &VIC::cycle9;
vicfunc[10] = &VIC::cycle10;
vicfunc[11] = &VIC::cycle11;
vicfunc[12] = &VIC::cycle12;
vicfunc[13] = &VIC::cycle13;
vicfunc[14] = &VIC::cycle14;
vicfunc[15] = &VIC::cycle15;
vicfunc[16] = &VIC::cycle16;
vicfunc[17] = &VIC::cycle17;
vicfunc[18] = &VIC::cycle18;
for (unsigned cycle = 19; cycle <= 54; cycle++)
vicfunc[cycle] = &VIC::cycle19to54;
vicfunc[55] = &VIC::cycle55;
vicfunc[56] = &VIC::cycle56;
vicfunc[57] = &VIC::cycle57;
vicfunc[58] = &VIC::cycle58;
vicfunc[59] = &VIC::cycle59;
vicfunc[60] = &VIC::cycle60;
vicfunc[61] = &VIC::cycle61;
vicfunc[62] = &VIC::cycle62;
vicfunc[63] = &VIC::cycle63; // Last PAL cycle
vicfunc[64] = &VIC::cycle64; // NTSC only
vicfunc[65] = &VIC::cycle65; // NTSC only

// Initialize snapshot ringbuffers
for (unsigned i = 0; i < MAX_AUTO_SAVED_SNAPSHOTS; i++) {
autoSavedSnapshots[i] = new Snapshot();
Expand Down Expand Up @@ -281,6 +247,58 @@ C64::setNTSC()
resume();
}

void
C64::updateVicFunctionTable()
{
// Initialize VIC function table
vicfunc[0] = NULL;

vicfunc[5] = &VIC::cycle5;
vicfunc[6] = &VIC::cycle6;
vicfunc[7] = &VIC::cycle7;
vicfunc[8] = &VIC::cycle8;
vicfunc[9] = &VIC::cycle9;
vicfunc[10] = &VIC::cycle10;
vicfunc[11] = &VIC::cycle11;
vicfunc[12] = &VIC::cycle12;
vicfunc[13] = &VIC::cycle13;
vicfunc[14] = &VIC::cycle14;
vicfunc[15] = &VIC::cycle15;
vicfunc[16] = &VIC::cycle16;
vicfunc[17] = &VIC::cycle17;
vicfunc[18] = &VIC::cycle18;
for (unsigned cycle = 19; cycle <= 54; cycle++)
vicfunc[cycle] = &VIC::cycle19to54;
vicfunc[55] = &VIC::cycle55;
vicfunc[56] = &VIC::cycle56;
vicfunc[57] = &VIC::cycle57;
vicfunc[58] = &VIC::cycle58;
vicfunc[59] = &VIC::cycle59;
vicfunc[60] = &VIC::cycle60;
vicfunc[61] = &VIC::cycle61;
vicfunc[62] = &VIC::cycle62;
vicfunc[63] = &VIC::cycle63;

if (isPAL()) {

vicfunc[1] = &VIC::cycle1pal;
vicfunc[2] = &VIC::cycle2pal;
vicfunc[3] = &VIC::cycle3pal;
vicfunc[4] = &VIC::cycle4pal;
vicfunc[64] = NULL;
vicfunc[65] = NULL;

} else {

vicfunc[1] = &VIC::cycle1ntsc;
vicfunc[2] = &VIC::cycle2ntsc;
vicfunc[3] = &VIC::cycle3ntsc;
vicfunc[4] = &VIC::cycle4ntsc;
vicfunc[64] = &VIC::cycle64;
vicfunc[65] = &VIC::cycle65;
}
}

void
C64::setMouseModel(MouseModel value)
{
Expand Down
6 changes: 6 additions & 0 deletions C64/C64.h
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,13 @@ class C64 : public VirtualComponent {
*/
void setNTSC();

//! @brief Updates the VIC function table
/*! @details The function pointers need to be changed when switching from
* PAL to NTSC and vice versa.
*/
void updateVicFunctionTable();


//
//! @functiongroup Handling mice
//
Expand Down
201 changes: 16 additions & 185 deletions C64/VIC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,8 @@ VIC::setChipModel(VICChipModel model)

chipModel = model;
pixelEngine.resetScreenBuffers();

c64->updateVicFunctionTable();

if (model == MOS6569_PAL) {
c64->setClockFrequency(PAL_CLOCK_FREQUENCY);
c64->putMessage(MSG_PAL);
Expand Down Expand Up @@ -1049,22 +1050,6 @@ VIC::checkFrameFlipflopsRight(uint16_t comparisonValue)
}
}

// -----------------------------------------------------------------------------------------------
// Execution functions
//
// All cycles are processed in this order:
//
// Phi1.1 Frame logic
// Phi1.2 Draw
// Phi1.3 Fetch
// Phi2.1 Rasterline interrupt
// Phi2.2 Sprite logic
// Phi2.3 VC/RC logic
// Phi2.4 BA logic
// Phi2.5 Fetch
// -----------------------------------------------------------------------------------------------


void
VIC::beginFrame()
{
Expand Down Expand Up @@ -1159,176 +1144,22 @@ VIC::yCounterOverflow()
return c64->getRasterline() == (c64->isPAL() ? 0 : 238);
}

void
VIC::cycle1()
{
debug_cycle(1);

// Phi1.1 Frame logic
checkVerticalFrameFF();
if (verticalFrameFFsetCond) {
p.verticalFrameFF = true;
}

// Phi1.2 Draw
// Phi1.3 Fetch
if (isPAL()) {
sFinalize(2);
pixelEngine.loadShiftRegister(2);
pAccess(3);
} else {
sSecondAccess(3);
}

// Phi2.1 Rasterline interrupt (edge triggered)
bool edgeOnYCounter = (c64->getRasterline() != 0);
bool edgeOnIrqCond = (yCounter == rasterInterruptLine() && !yCounterEqualsIrqRasterline);
if (edgeOnYCounter && edgeOnIrqCond)
triggerIRQ(1);
yCounterEqualsIrqRasterline = (yCounter == rasterInterruptLine());

// Phi2.2 Sprite logic
// Phi2.3 VC/RC logic
// Phi2.4 BA logic
if (isPAL())
setBAlow(spriteDmaOnOff & (SPR3 | SPR4));
else
setBAlow(spriteDmaOnOff & (SPR3 | SPR4 | SPR5));

// Phi2.5 Fetch
if (isPAL()) {
sFirstAccess(3);
} else {
sThirdAccess(3);
}
// Finalize
updateDisplayState();
countX();
}

void
VIC::cycle2()
{
debug_cycle(2);

// Check for yCounter overflows
if (yCounterOverflow())
yCounter = 0;

// Phi1.1 Frame logic
checkVerticalFrameFF();

// Phi1.2 Draw
// Phi1.3 Fetch
if (isPAL()) {
sSecondAccess(3);
} else {
sFinalize(3);
pixelEngine.loadShiftRegister(3);
pAccess(4);
}

// Phi2.2 Sprite logic
// Phi2.1 Rasterline interrupt (edge triggered)
bool edgeOnYCounter = (yCounter == 0);
bool edgeOnIrqCond = (yCounter == rasterInterruptLine() && !yCounterEqualsIrqRasterline);
if (edgeOnYCounter && edgeOnIrqCond)
triggerIRQ(1);

// Phi2.3 VC/RC logic
// Phi2.4 BA logic
if (isPAL())
setBAlow(spriteDmaOnOff & (SPR3 | SPR4 | SPR5));
else
setBAlow(spriteDmaOnOff & (SPR4 | SPR5));

// Phi2.5 Fetch
if (isPAL())
sThirdAccess(3);
else
sFirstAccess(4);

// Finalize
updateDisplayState();
countX();
}

void
VIC::cycle3()
{
debug_cycle(3);

// Phi1.1 Frame logic
checkVerticalFrameFF();

// Phi1.2 Draw
// Phi1.3 Fetch
if (isPAL()) {
sFinalize(3);
pixelEngine.loadShiftRegister(3);
pAccess(4);
} else {
sSecondAccess(4);
}

// Phi2.1 Rasterline interrupt
// Phi2.2 Sprite logic
// Phi2.3 VC/RC logic
// Phi2.4 BA logic
if (isPAL())
setBAlow(spriteDmaOnOff & (SPR4 | SPR5));
else
setBAlow(spriteDmaOnOff & (SPR4 | SPR5 | SPR6));

// Phi2.5 Fetch
if (isPAL())
sFirstAccess(4);
else
sThirdAccess(4);

// Finalize
updateDisplayState();
countX();
}

void
VIC::cycle4()
{
debug_cycle(4);

// Phi1.1 Frame logic
checkVerticalFrameFF();

// Phi1.2 Draw
// Phi1.3 Fetch
if (isPAL()) {
sSecondAccess(4);
} else {
sFinalize(4);
pixelEngine.loadShiftRegister(4);
pAccess(5);
}

// Phi2.1 Rasterline interrupt
// Phi2.2 Sprite logic
// Phi2.3 VC/RC logic
// Phi2.4 BA logic
if (isPAL()) {
setBAlow(spriteDmaOnOff & (SPR4 | SPR5 | SPR6));
} else {
setBAlow(spriteDmaOnOff & (SPR5 | SPR6));
}
//
// Execution functions
//

// Phi2.5 Fetch
if (isPAL())
sThirdAccess(4);
else
sFirstAccess(5);

// Finalize
updateDisplayState();
countX();
}
/* All cycles are processed in this order:
*
* Phi1.1 Frame logic
* Phi1.2 Draw
* Phi1.3 Fetch
* Phi2.1 Rasterline interrupt
* Phi2.2 Sprite logic
* Phi2.3 VC/RC logic
* Phi2.4 BA logic
* Phi2.5 Fetch
*/

void
VIC::cycle5()
Expand Down
4 changes: 3 additions & 1 deletion C64/VIC.h
Original file line number Diff line number Diff line change
Expand Up @@ -936,7 +936,9 @@ class VIC : public VirtualComponent {
}

//! @brief Executes a specific rasterline cycle
void cycle1(); void cycle2(); void cycle3(); void cycle4();
//! @todo Move all implementation to VIC_cycles.cpp
void cycle1pal(); void cycle1ntsc(); void cycle2pal(); void cycle2ntsc();
void cycle3pal(); void cycle3ntsc(); void cycle4pal(); void cycle4ntsc();
void cycle5(); void cycle6(); void cycle7(); void cycle8();
void cycle9(); void cycle10(); void cycle11(); void cycle12();
void cycle13(); void cycle14(); void cycle15(); void cycle16();
Expand Down
Loading

0 comments on commit 4ab3293

Please sign in to comment.