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; }