@soapbox.pub/wasmboy
Version:
Soapbox fork of Wasmboy.
90 lines (75 loc) • 2.52 kB
text/typescript
// Syncing and Tracking executed cycles
import { Config } from './config';
import { Cpu } from './cpu/index';
import { Graphics, updateGraphics, batchProcessGraphics } from './graphics/index';
import { Memory } from './memory/index';
import { Timers, updateTimers, batchProcessTimers } from './timers/index';
import { Sound, updateSound, batchProcessAudio } from './sound/index';
import { updateSerial } from './serial/serial';
export class Cycles {
// An even number below the max 32 bit integer
static cyclesPerCycleSet: i32 = 2000000000;
static cycleSets: i32 = 0;
static cycles: i32 = 0;
}
export function getCyclesPerCycleSet(): i32 {
return Cycles.cyclesPerCycleSet;
}
export function getCycleSets(): i32 {
return Cycles.cycleSets;
}
export function getCycles(): i32 {
return Cycles.cycles;
}
// Inlined because closure compiler inlines
function trackCyclesRan(numberOfCycles: i32): void {
let cycles = Cycles.cycles;
cycles += numberOfCycles;
if (cycles >= Cycles.cyclesPerCycleSet) {
Cycles.cycleSets += 1;
cycles -= Cycles.cyclesPerCycleSet;
}
Cycles.cycles = cycles;
}
// Inlined because closure compiler inlines
export function resetCycles(): void {
Cycles.cyclesPerCycleSet = 2000000000;
Cycles.cycleSets = 0;
Cycles.cycles = 0;
}
// Sync other GB Components with the number of cycles
export function syncCycles(numberOfCycles: i32): void {
// Check if we did a DMA TRansfer, if we did add the cycles
if (Memory.DMACycles > 0) {
numberOfCycles += Memory.DMACycles;
Memory.DMACycles = 0;
}
// Finally, Add our number of cycles to the CPU Cycles
Cpu.currentCycles += numberOfCycles;
// Check other Gameboy components
if (!Cpu.isStopped) {
if (Config.graphicsBatchProcessing) {
// Need to do this, since a lot of things depend on the scanline
// Batch processing will simply return if the number of cycles is too low
Graphics.currentCycles += numberOfCycles;
batchProcessGraphics();
} else {
updateGraphics(numberOfCycles);
}
if (Config.audioBatchProcessing) {
Sound.currentCycles += numberOfCycles;
batchProcessAudio();
} else {
updateSound(numberOfCycles);
}
updateSerial(numberOfCycles);
}
if (Config.timersBatchProcessing) {
// Batch processing will simply return if the number of cycles is too low
Timers.currentCycles += numberOfCycles;
batchProcessTimers();
} else {
updateTimers(numberOfCycles);
}
trackCyclesRan(numberOfCycles);
}