/* This hook is called at the end of every frame. */ static void machine_vsync_hook(void) { CLOCK sub; network_hook(); drive_vsync_hook(); autostart_advance(); screenshot_record(); sub = clk_guard_prevent_overflow(maincpu_clk_guard); /* The drive has to deal both with our overflowing and its own one, so it is called even when there is no overflowing in the main CPU. */ drivecpu_prevent_clk_overflow_all(sub); }
/* Make sure the drive clock counters never overflow; return nonzero if they have been decremented to prevent overflow. */ CLOCK drivecpu_prevent_clk_overflow(drive_context_t *drv, CLOCK sub) { if (sub != 0) { /* First, get in sync with what the main CPU has done. Notice that `clk' has already been decremented at this point. */ if (drv->drive->enable) { if (drv->cpu->last_clk < sub) { /* Hm, this is kludgy. :-( */ drive_cpu_execute_all(maincpu_clk + sub); } drv->cpu->last_clk -= sub; } else { drv->cpu->last_clk = maincpu_clk; } } /* Then, check our own clock counters. */ return clk_guard_prevent_overflow(drv->cpu->clk_guard); }