uae-wii/src/events.c
2009-05-05 15:36:48 +00:00

97 lines
2.0 KiB
C

/*
* 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.
*
* Copyright 1995-1998 Bernd Schmidt
* Copyright 2004-2005 Richard Drummond
*/
#include "sysconfig.h"
#include "sysdeps.h"
#include "options.h"
#include "events.h"
#include "custom.h"
#include "cia.h"
#include "blitter.h"
#include "disk.h"
#include "audio.h"
#include "hrtimer.h"
/* Current time in cycles */
unsigned long currcycle;
/* Cycles to next event pending */
unsigned long nextevent;
#ifdef JIT
/* For faster cycles handling */
signed long pissoff = 0;
#endif
struct ev eventtab[ev_max];
void init_eventtab (void)
{
int i;
nextevent = 0;
set_cycles (0);
for (i = 0; i < ev_max; i++) {
eventtab[i].active = 0;
eventtab[i].oldcycles = 0;
}
eventtab[ev_cia].handler = CIA_handler;
eventtab[ev_hsync].handler = hsync_handler;
eventtab[ev_hsync].evtime = get_cycles () + HSYNCTIME;
eventtab[ev_hsync].active = 1;
eventtab[ev_copper].handler = copper_handler;
eventtab[ev_copper].active = 0;
eventtab[ev_blitter].handler = blitter_handler;
eventtab[ev_blitter].active = 0;
eventtab[ev_disk].handler = DISK_handler;
eventtab[ev_disk].active = 0;
eventtab[ev_audio].handler = audio_evhandler;
eventtab[ev_audio].active = 0;
events_schedule ();
}
/*
* Determine next event pending
*/
void events_schedule (void)
{
int i;
unsigned long int mintime = ~0L;
for (i = 0; i < ev_max; i++) {
if (eventtab[i].active) {
unsigned long int eventtime = eventtab[i].evtime - currcycle;
if (eventtime < mintime)
mintime = eventtime;
}
}
nextevent = currcycle + mintime;
}
/*
* Handle all events due at current time
*/
void handle_active_events (void)
{
int i;
for (i = 0; i < ev_max; i++) {
if (eventtab[i].active && eventtab[i].evtime == currcycle) {
(*eventtab[i].handler)();
}
}
}