--- uae/src/include/events.h 2018/04/24 16:40:27 1.1.1.3 +++ uae/src/include/events.h 2018/04/24 16:58:54 1.1.1.9 @@ -2,15 +2,21 @@ * UAE - The Un*x Amiga Emulator * * Events + * These are best for low-frequency events. Having too many of them, + * or using them for events that occur too frequently, can cause massive + * slowdown. * - * Note that this file must be included after sound.h and sounddep/sound.h, - * since DONT_WANT_SOUND can get overridden in those. - * - * Copyright 1995, 1996, 1997 Bernd Schmidt + * Copyright 1995-1998 Bernd Schmidt */ -extern unsigned long int cycles, nextevent, is_lastline; -extern unsigned long int sample_evtime; +#include "machdep/rpt.h" + +extern frame_time_t vsynctime, vsyncmintime; +extern void reset_frame_rate_hack (void); +extern int rpt_available; + +extern unsigned long currcycle, nextevent, is_lastline; +extern unsigned long sample_evtime; typedef void (*evfunc)(void); struct ev @@ -21,72 +27,61 @@ struct ev }; enum { - ev_hsync, ev_copper, ev_cia, - ev_blitter, ev_diskblk, ev_diskindex, -#ifndef DONT_WANT_SOUND - ev_aud0, ev_aud1, ev_aud2, ev_aud3, - ev_sample, -#endif + ev_hsync, ev_copper, ev_audio, ev_cia, ev_blitter, ev_disk, ev_max }; extern struct ev eventtab[ev_max]; -static __inline__ void events_schedule(void) +STATIC_INLINE void events_schedule (void) { int i; unsigned long int mintime = ~0L; - for(i = 0; i < ev_max; i++) { + for (i = 0; i < ev_max; i++) { if (eventtab[i].active) { - unsigned long int eventtime = eventtab[i].evtime - cycles; + unsigned long int eventtime = eventtab[i].evtime - currcycle; if (eventtime < mintime) mintime = eventtime; } } - nextevent = cycles + mintime; + nextevent = currcycle + mintime; } -static __inline__ void do_cycles_slow(void) +STATIC_INLINE void do_cycles_slow (unsigned long cycles_to_add) { - unsigned long cycles_to_add = currprefs.m68k_speed; - -#ifdef FRAME_RATE_HACK - if (is_lastline && eventtab[ev_hsync].evtime-cycles <= cycles_to_add + if (is_lastline && eventtab[ev_hsync].evtime - currcycle <= cycles_to_add && (long int)(read_processor_time () - vsyncmintime) < 0) return; -#endif - if ((nextevent - cycles) <= cycles_to_add) { - for (; cycles_to_add != 0; cycles_to_add--) { - if (++cycles == nextevent) { - int i; - - for(i = 0; i < ev_max; i++) { - if (eventtab[i].active && eventtab[i].evtime == cycles) { - (*eventtab[i].handler)(); - } - } - events_schedule(); + + while ((nextevent - currcycle) <= cycles_to_add) { + int i; + cycles_to_add -= (nextevent - currcycle); + currcycle = nextevent; + + for (i = 0; i < ev_max; i++) { + if (eventtab[i].active && eventtab[i].evtime == currcycle) { + (*eventtab[i].handler)(); } } + events_schedule(); } - cycles += cycles_to_add; + currcycle += cycles_to_add; } -static __inline__ void do_cycles_fast(void) +STATIC_INLINE void do_cycles_fast (void) { -#ifdef FRAME_RATE_HACK - if (is_lastline && eventtab[ev_hsync].evtime-cycles <= 1 + if (is_lastline && eventtab[ev_hsync].evtime - currcycle <= 1 && (long int)(read_processor_time () - vsyncmintime) < 0) return; -#endif - cycles++; - if (nextevent == cycles) { + + currcycle++; + if (nextevent == currcycle) { int i; - for(i = 0; i < ev_max; i++) { - if (eventtab[i].active && eventtab[i].evtime == cycles) { - (*eventtab[i].handler)(); + for (i = 0; i < ev_max; i++) { + if (eventtab[i].active && eventtab[i].evtime == currcycle) { + (*eventtab[i].handler) (); } } events_schedule(); @@ -94,6 +89,11 @@ static __inline__ void do_cycles_fast(vo } +STATIC_INLINE unsigned long get_cycles (void) +{ + return currcycle; +} + #if /* M68K_SPEED == 1 */ 0 #define do_cycles do_cycles_fast #else