--- uae/src/include/events.h 2018/04/24 16:39:32 1.1.1.2 +++ uae/src/include/events.h 2018/04/24 16:42:36 1.1.1.4 @@ -2,11 +2,20 @@ * UAE - The Un*x Amiga Emulator * * Events - * - * (c) 1995 Bernd Schmidt + * 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. + * + * Copyright 1995-1998 Bernd Schmidt */ -extern unsigned long int cycles, nextevent; +#include "machdep/rpt.h" +extern frame_time_t vsynctime, vsyncmintime; +extern void reset_frame_rate_hack (void); +extern int rpt_available; + +extern unsigned long int cycles, nextevent, is_lastline; +extern unsigned long int sample_evtime; typedef void (*evfunc)(void); struct ev @@ -16,42 +25,41 @@ struct ev evfunc handler; }; -enum { +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_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++) { - if (eventtab[i].active) { + if (eventtab[i].active) { unsigned long int eventtime = eventtab[i].evtime - cycles; if (eventtime < mintime) - mintime = eventtime; + mintime = eventtime; } } nextevent = cycles + mintime; } -static __inline__ void do_cycles_slow(void) +static __inline__ void do_cycles_slow (unsigned long cycles_to_add) { - if ((nextevent - cycles) <= M68K_SPEED) { - int j; - for(j = 0; j < M68K_SPEED; j++) { + if (is_lastline && eventtab[ev_hsync].evtime-cycles <= cycles_to_add + && (long int)(read_processor_time () - vsyncmintime) < 0) + return; + + 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++) { + + for (i = 0; i < ev_max; i++) { if (eventtab[i].active && eventtab[i].evtime == cycles) { (*eventtab[i].handler)(); } @@ -59,20 +67,23 @@ static __inline__ void do_cycles_slow(vo events_schedule(); } } - } else { - cycles += M68K_SPEED; } + cycles += cycles_to_add; } -static __inline__ void do_cycles_fast(void) +static __inline__ void do_cycles_fast (void) { + if (is_lastline && eventtab[ev_hsync].evtime-cycles <= 1 + && (long int)(read_processor_time () - vsyncmintime) < 0) + return; + cycles++; if (nextevent == cycles) { int i; - - for(i = 0; i < ev_max; i++) { + + for (i = 0; i < ev_max; i++) { if (eventtab[i].active && eventtab[i].evtime == cycles) { - (*eventtab[i].handler)(); + (*eventtab[i].handler) (); } } events_schedule(); @@ -80,7 +91,7 @@ static __inline__ void do_cycles_fast(vo } -#if M68K_SPEED == 1 +#if /* M68K_SPEED == 1 */ 0 #define do_cycles do_cycles_fast #else #define do_cycles do_cycles_slow