From: Toni Wilen Date: Sat, 7 Jan 2023 13:46:42 +0000 (+0200) Subject: Handle back to back events with same cycle count in FIFO order X-Git-Tag: 41010~21 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=a539fa57dc750528d3abdc82cc940289c757d7c5;p=francis%2Fwinuae.git Handle back to back events with same cycle count in FIFO order --- diff --git a/events.cpp b/events.cpp index 20d661a3..d8f2d855 100644 --- a/events.cpp +++ b/events.cpp @@ -35,7 +35,6 @@ bool event_wait; frame_time_t vsyncmintime, vsyncmintimepre; frame_time_t vsyncmaxtime, vsyncwaittime; frame_time_t vsynctimebase; -int event2_count; static void events_fast(void) { @@ -303,6 +302,9 @@ void do_cycles_slow(int cycles_to_add) currcycle += cycles_to_add; } +static ev2 *last_event2; +static ev2 dummy_event; + void MISC_handler(void) { static bool dorecheck; @@ -323,17 +325,25 @@ void MISC_handler(void) recheck = false; mintime = EVT_MAX; for (i = 0; i < ev2_max; i++) { - if (eventtab2[i].active) { - if (eventtab2[i].evtime == ct) { - eventtab2[i].active = false; - event2_count--; - eventtab2[i].handler(eventtab2[i].data); - if (dorecheck || eventtab2[i].active) { + ev2 *e = &eventtab2[i]; + if (e->active) { + if (e->evtime == ct) { + e->active = false; + e->handler(e->data); + ev2 *e2 = e->next; + if (e2) { + e->next = NULL; + if (e2->active && e2->evtime == e->evtime + 1) { + e2->active = false; + e2->handler(e2->data); + } + } + if (dorecheck || e->active) { recheck = true; dorecheck = false; } } else { - evt_t eventtime = eventtab2[i].evtime - ct; + evt_t eventtime = e->evtime - ct; if (eventtime < mintime) mintime = eventtime; } @@ -341,15 +351,15 @@ void MISC_handler(void) } } if (mintime < EVT_MAX) { - eventtab[ev_misc].active = true; - eventtab[ev_misc].oldcycles = ct; - eventtab[ev_misc].evtime = ct + mintime; + ev *e = &eventtab[ev_misc]; + e->active = true; + e->oldcycles = ct; + e->evtime = ct + mintime; events_schedule(); } recursive--; } - void event2_newevent_xx (int no, evt_t t, uae_u32 data, evfunc2 func) { evt_t et; @@ -360,7 +370,6 @@ void event2_newevent_xx (int no, evt_t t, uae_u32 data, evfunc2 func) no = next; for (;;) { if (!eventtab2[no].active) { - event2_count++; break; } if (eventtab2[no].evtime == et && eventtab2[no].handler == func && eventtab2[no].data == data) @@ -392,10 +401,17 @@ void event2_newevent_xx (int no, evt_t t, uae_u32 data, evfunc2 func) } next = no; } - eventtab2[no].active = true; - eventtab2[no].evtime = et; - eventtab2[no].handler = func; - eventtab2[no].data = data; + ev2 *e = &eventtab2[no]; + // if previous event has same expiry time, make sure it gets executed first. + if (last_event2->active && last_event2 != e && et == last_event2->evtime) { + last_event2->next = e; + et++; + } + e->active = true; + e->evtime = et; + e->handler = func; + e->data = data; + last_event2 = e; MISC_handler(); } @@ -429,6 +445,10 @@ void event2_newevent_x_replace(evt_t t, uae_u32 data, evfunc2 func) event2_newevent_xx(-1, t * CYCLE_UNIT, data, func); } +void event_init(void) +{ + last_event2 = &dummy_event; +} int current_hpos(void) { diff --git a/include/events.h b/include/events.h index 13394224..9ea1e010 100644 --- a/include/events.h +++ b/include/events.h @@ -26,9 +26,9 @@ extern frame_time_t vsynctimebase, syncbase; extern void reset_frame_rate_hack(void); extern evt_t vsync_cycles; extern evt_t start_cycles; -extern int event2_count; extern bool event_wait; +extern void event_init(void); extern void compute_vsynctime(void); extern void init_eventtab(void); extern void do_cycles_ce(int cycles); @@ -48,27 +48,28 @@ typedef void (*evfunc2)(uae_u32); struct ev { - bool active; + bool active; evt_t evtime, oldcycles; - evfunc handler; + evfunc handler; }; struct ev2 { - bool active; + bool active; evt_t evtime; - uae_u32 data; - evfunc2 handler; + uae_u32 data; + evfunc2 handler; + ev2 *next; }; enum { - ev_cia, ev_audio, ev_misc, ev_hsync, ev_hsynch, - ev_max + ev_cia, ev_audio, ev_misc, ev_hsync, ev_hsynch, + ev_max }; enum { - ev2_blitter, ev2_disk, ev2_misc, - ev2_max = 12 + ev2_blitter, ev2_disk, ev2_misc, + ev2_max = 12 }; extern int pissoff_value; diff --git a/main.cpp b/main.cpp index 7f24a4ab..b7206554 100644 --- a/main.cpp +++ b/main.cpp @@ -42,6 +42,7 @@ #include "uae/ppc.h" #include "devices.h" #include "jit/compemu.h" +#include "disasm.h" #ifdef RETROPLATFORM #include "rp.h" #endif @@ -1083,9 +1084,7 @@ static int real_main2 (int argc, TCHAR **argv) exit (1); } -#ifdef NATMEM_OFFSET - //preinit_shm (); -#endif + event_init(); if (restart_config[0]) parse_cmdline_and_init_file (argc, argv);