frame_time_t vsyncmintime, vsyncmintimepre;
frame_time_t vsyncmaxtime, vsyncwaittime;
frame_time_t vsynctimebase;
-int event2_count;
static void events_fast(void)
{
currcycle += cycles_to_add;
}
+static ev2 *last_event2;
+static ev2 dummy_event;
+
void MISC_handler(void)
{
static bool dorecheck;
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;
}
}
}
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;
no = next;
for (;;) {
if (!eventtab2[no].active) {
- event2_count++;
break;
}
if (eventtab2[no].evtime == et && eventtab2[no].handler == func && eventtab2[no].data == data)
}
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();
}
event2_newevent_xx(-1, t * CYCLE_UNIT, data, func);
}
+void event_init(void)
+{
+ last_event2 = &dummy_event;
+}
int current_hpos(void)
{
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);
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;