]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Handle back to back events with same cycle count in FIFO order
authorToni Wilen <twilen@winuae.net>
Sat, 7 Jan 2023 13:46:42 +0000 (15:46 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 7 Jan 2023 13:46:42 +0000 (15:46 +0200)
events.cpp
include/events.h
main.cpp

index 20d661a3c33793ef56f15256485e720856bedf7e..d8f2d8556ddbb76a12988334f8370cab630ecdd9 100644 (file)
@@ -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)
 {
index 133942242deb3054c68885fff16286cf9893429f..9ea1e010b133964e60277ea9991e890618f0c9d0 100644 (file)
@@ -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;
index 7f24a4abb4a1de6b06d27fb9a5218b74ae628e23..b7206554c590cf2dbdaeebdd007d7f433eb7de14 100644 (file)
--- 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);