INT32 BurnTimerUpdateYM3812(INT32 nCycles) { INT32 nIRQStatus = 0; nTicksTotal = MAKE_TIMER_TICKS(nCycles, nCPUClockspeed); // bprintf(PRINT_NORMAL, _T(" -- Ticks: %08X, cycles %i\n"), nTicksTotal, nCycles); while (nTicksDone < nTicksTotal) { INT32 nTimer, nCyclesSegment, nTicksSegment; // Determine which timer fires first if (nTimerCount[0] <= nTimerCount[1]) { nTicksSegment = nTimerCount[0]; } else { nTicksSegment = nTimerCount[1]; } if (nTicksSegment > nTicksTotal) { nTicksSegment = nTicksTotal; } nCyclesSegment = MAKE_CPU_CYLES(nTicksSegment + nTicksExtra, nCPUClockspeed); // bprintf(PRINT_NORMAL, _T(" - Timer: %08X, %08X, %08X, cycles %i, %i\n"), nTicksDone, nTicksSegment, nTicksTotal, nCyclesSegment, pCPUTotalCycles()); pCPURun(nCyclesSegment - pCPUTotalCycles()); nTicksDone = MAKE_TIMER_TICKS(pCPUTotalCycles() + 1, nCPUClockspeed) - 1; // bprintf(PRINT_NORMAL, _T(" - ticks done -> %08X cycles -> %i\n"), nTicksDone, pCPUTotalCycles()); nTimer = 0; if (nTicksDone >= nTimerCount[0]) { if (nTimerStart[0] == MAX_TIMER_VALUE) { nTimerCount[0] = MAX_TIMER_VALUE; } else { nTimerCount[0] += nTimerStart[0]; } // bprintf(PRINT_NORMAL, _T(" - timer 0 fired\n")); nTimer |= 1; } if (nTicksDone >= nTimerCount[1]) { if (nTimerStart[1] == MAX_TIMER_VALUE) { nTimerCount[1] = MAX_TIMER_VALUE; } else { nTimerCount[1] += nTimerStart[1]; } // bprintf(PRINT_NORMAL, _T(" - timer 1 fired\n")); nTimer |= 2; } if (nTimer & 1) { nIRQStatus |= pTimerOverCallback(0, 0); } if (nTimer & 2) { nIRQStatus |= pTimerOverCallback(0, 1); } } return nIRQStatus; }
INT32 BurnTimerUpdate(INT32 nCycles) { INT32 nIRQStatus = 0; nTicksTotal = MAKE_TIMER_TICKS(nCycles, nCPUClockspeed); while (nTicksDone < nTicksTotal) { INT32 nTimer, nCyclesSegment, nTicksSegment; // Determine which timer fires first if (nTimerCount[0] <= nTimerCount[1]) { nTicksSegment = nTimerCount[0]; } else { nTicksSegment = nTimerCount[1]; } if (nTicksSegment > nTicksTotal) { nTicksSegment = nTicksTotal; } nCyclesSegment = MAKE_CPU_CYLES(nTicksSegment + nTicksExtra, nCPUClockspeed); pCPURun(nCyclesSegment - pCPUTotalCycles()); nTicksDone = MAKE_TIMER_TICKS(pCPUTotalCycles() + 1, nCPUClockspeed) - 1; nTimer = 0; if (nTicksDone >= nTimerCount[0]) { if (nTimerStart[0] == MAX_TIMER_VALUE) { nTimerCount[0] = MAX_TIMER_VALUE; } else { nTimerCount[0] += nTimerStart[0]; } nTimer |= 1; } if (nTicksDone >= nTimerCount[1]) { if (nTimerStart[1] == MAX_TIMER_VALUE) { nTimerCount[1] = MAX_TIMER_VALUE; } else { nTimerCount[1] += nTimerStart[1]; } nTimer |= 2; } if (nTimer & 1) { nIRQStatus |= pTimerOverCallback(0, 0); } if (nTimer & 2) { nIRQStatus |= pTimerOverCallback(0, 1); } } return nIRQStatus; }
void BurnOPMTimerCallback(int c, double period) { pCPURunEnd(); if (period == 0.0) { nTimerCount[c] = MAX_TIMER_VALUE; return; } nTimerCount[c] = (int)(period * (double)TIMER_TICKS_PER_SECOND); nTimerCount[c] += MAKE_TIMER_TICKS(pCPUTotalCycles(), nCPUClockspeed); }
INT32 BurnTimerAttachH6280YM3812(INT32 nClockspeed) { nCPUClockspeed = nClockspeed; pCPUTotalCycles = h6280TotalCycles; pCPURun = h6280Run; pCPURunEnd = h6280RunEnd; nTicksExtra = MAKE_TIMER_TICKS(1, nCPUClockspeed) - 1; // bprintf(PRINT_NORMAL, _T("--- timer cpu speed %iHz, one cycle = %i ticks.\n"), nClockspeed, MAKE_TIMER_TICKS(1, nCPUClockspeed)); return 0; }
INT32 BurnTimerAttachM6502YM3812(INT32 nClockspeed) { nCPUClockspeed = nClockspeed; pCPUTotalCycles = M6502TotalCycles; pCPURun = M6502Run; pCPURunEnd = M6502RunEnd; // doesn't do anything... nTicksExtra = MAKE_TIMER_TICKS(1, nCPUClockspeed) - 1; // bprintf(PRINT_NORMAL, _T("--- timer cpu speed %iHz, one cycle = %i ticks.\n"), nClockspeed, MAKE_TIMER_TICKS(1, nCPUClockspeed)); return 0; }
int BurnTimerAttachZet(int nClockspeed) { nCPUClockspeed = nClockspeed; pCPUTotalCycles = ZetTotalCycles; pCPURun = ZetRun; pCPURunEnd = ZetRunEnd; nTicksExtra = MAKE_TIMER_TICKS(1, nCPUClockspeed) - 1; // bprintf(PRINT_NORMAL, _T("--- timer cpu speed %iHz, one cycle = %i ticks.\n"), nClockspeed, MAKE_TIMER_TICKS(1, nCPUClockspeed)); return 0; }
void BurnOPLTimerCallbackYM3812(INT32 c, double period) { pCPURunEnd(); if (period == 0.0) { nTimerCount[c] = MAX_TIMER_VALUE; // bprintf(PRINT_NORMAL, _T(" - timer %i stopped\n"), c); return; } nTimerCount[c] = (INT32)(period * (double)TIMER_TICKS_PER_SECOND); nTimerCount[c] += MAKE_TIMER_TICKS(pCPUTotalCycles(), nCPUClockspeed); // bprintf(PRINT_NORMAL, _T(" - timer %i started, %08X ticks (fires in %lf seconds)\n"), c, nTimerCount[c], period); }
void BurnOPNTimerCallback(int /*n */, int c, int cnt, double stepTime) { pCPURunEnd(); if (cnt == 0) { nTimerCount[c] = MAX_TIMER_VALUE; // bprintf(PRINT_NORMAL, _T(" - timer %i stopped\n"), c); return; } nTimerCount[c] = (int)(stepTime * cnt * (double)TIMER_TICKS_PER_SECOND); nTimerCount[c] += MAKE_TIMER_TICKS(pCPUTotalCycles(), nCPUClockspeed); // bprintf(PRINT_NORMAL, _T(" - timer %i started, %08X ticks (fires in %lf seconds)\n"), c, nTimerCount[c], stepTime * cnt); }
void BurnTimerSetOneshot(int c, double period) { pCPURunEnd(); if (period == 0.0) { nTimerStart[c] = nTimerCount[c] = MAX_TIMER_VALUE; // bprintf(PRINT_NORMAL, _T(" - timer %i stopped\n"), c); return; } nTimerCount[c] = (int)(period * (double)(TIMER_TICKS_PER_SECOND)); nTimerCount[c] += MAKE_TIMER_TICKS(pCPUTotalCycles(), nCPUClockspeed); // bprintf(PRINT_NORMAL, _T(" - timer %i started, %08X ticks (fires in %lf seconds)\n"), c, nTimerCount[c], period / 1000000.0); }
void BurnTimerEndFrame(int nCycles) { int nTicks = MAKE_TIMER_TICKS(nCycles, nCPUClockspeed); BurnTimerUpdate(nCycles); if (nTimerCount[0] < MAX_TIMER_VALUE) nTimerCount[0] -= nTicks; if (nTimerCount[1] < MAX_TIMER_VALUE) nTimerCount[1] -= nTicks; nTicksDone -= nTicks; if (nTicksDone < 0) { // bprintf(PRINT_ERROR, _T(" -- ticks done -> %08X\n"), nTicksDone); nTicksDone = 0; } }