static int set_relative_speed(int val, void *param) { relative_speed = val; sound_set_relative_speed(relative_speed); set_timer_speed(relative_speed); return 0; }
static int set_warp_mode(int val, void *param) { warp_mode_enabled = val; sound_set_warp_mode(warp_mode_enabled); set_timer_speed(relative_speed); return 0; }
int vsync_do_vsync(struct video_canvas_s *c, int been_skipped) { static long skip_counter = 0; static int num_skipped_frames = 0; static int frame_counter = 0; int skip_next_frame = 0; vsync_hook(); set_timer_speed(); if (been_skipped) { num_skipped_frames++; } if (timer_patch > 0) { timer_patch--; asm volatile ("cli"); elapsed_frames++; asm volatile ("sti"); }
void vsync_set_machine_parameter(double refresh_rate, long cycles) { refresh_frequency = refresh_rate; cycles_per_sec = cycles; set_timer_speed(relative_speed); }
/* This is called at the end of each screen frame. It flushes the audio buffer and keeps control of the emulation speed. */ int vsync_do_vsync(int been_skipped) { static unsigned short frame_counter = USHRT_MAX; static unsigned short num_skipped_frames; static int skip_counter; int skip_next_frame = 0; vsync_hook(); if (been_skipped) num_skipped_frames++; if (timer_speed != relative_speed) { frame_counter = USHRT_MAX; if (set_timer_speed(relative_speed) < 0) { log_error(LOG_DEFAULT, "Trouble setting timers... giving up."); /* FIXME: Hm, maybe we should be smarter. But this is should never happen.*/ exit(-1); } } if (warp_mode_enabled) { /* "Warp Mode". Just skip as many frames as possible and do not limit the maximum speed at all. */ if (skip_counter < MAX_SKIPPED_FRAMES) { skip_next_frame = 1; skip_counter++; } else skip_counter = elapsed_frames = 0; sound_flush(0); } else if (refresh_rate != 0) { update_elapsed_frames(0); /* Fixed refresh rate. */ if (timer_speed && skip_counter >= elapsed_frames) timer_sleep(); if (skip_counter < refresh_rate - 1) { skip_next_frame = 1; skip_counter++; } else skip_counter = elapsed_frames = 0; patch_timer(sound_flush(relative_speed)); } else { /* Dynamically adjusted refresh rate. */ update_elapsed_frames(0); if (skip_counter >= elapsed_frames) { elapsed_frames = -1; timer_sleep(); skip_counter = 0; } else if (skip_counter < MAX_SKIPPED_FRAMES) { skip_next_frame = 1; skip_counter++; } else skip_counter = elapsed_frames = 0; patch_timer(sound_flush(relative_speed)); } if (frame_counter >= refresh_frequency * 2) { display_speed(frame_counter + 1 - num_skipped_frames); num_skipped_frames = 0; frame_counter = 0; } else frame_counter++; kbdbuf_flush(); #ifdef HAS_JOYSTICK joystick_update(); #endif return skip_next_frame; }
int vsync_disable_timer(void) { if (!timer_disabled) return set_timer_speed(0); else return 0; }