|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Events
1.1.1.4 root 5: * These are best for low-frequency events. Having too many of them,
6: * or using them for events that occur too frequently, can cause massive
7: * slowdown.
1.1.1.3 root 8: *
1.1.1.4 root 9: * Copyright 1995-1998 Bernd Schmidt
1.1 root 10: */
11:
1.1.1.4 root 12: #include "machdep/rpt.h"
13: extern frame_time_t vsynctime, vsyncmintime;
14: extern void reset_frame_rate_hack (void);
15: extern int rpt_available;
16:
1.1.1.3 root 17: extern unsigned long int cycles, nextevent, is_lastline;
18: extern unsigned long int sample_evtime;
1.1 root 19: typedef void (*evfunc)(void);
20:
21: struct ev
22: {
23: int active;
24: unsigned long int evtime, oldcycles;
25: evfunc handler;
26: };
27:
1.1.1.3 root 28: enum {
1.1.1.8 ! root 29: ev_hsync, ev_copper, ev_cia, ev_blitter, ev_disk,
1.1 root 30: ev_max
31: };
32:
33: extern struct ev eventtab[ev_max];
34:
1.1.1.5 root 35: STATIC_INLINE void events_schedule (void)
1.1 root 36: {
37: int i;
1.1.1.3 root 38:
1.1 root 39: unsigned long int mintime = ~0L;
40: for(i = 0; i < ev_max; i++) {
1.1.1.3 root 41: if (eventtab[i].active) {
1.1 root 42: unsigned long int eventtime = eventtab[i].evtime - cycles;
43: if (eventtime < mintime)
1.1.1.3 root 44: mintime = eventtime;
1.1 root 45: }
46: }
47: nextevent = cycles + mintime;
48: }
49:
1.1.1.5 root 50: STATIC_INLINE void do_cycles_slow (unsigned long cycles_to_add)
1.1 root 51: {
1.1.1.3 root 52: if (is_lastline && eventtab[ev_hsync].evtime-cycles <= cycles_to_add
53: && (long int)(read_processor_time () - vsyncmintime) < 0)
54: return;
1.1.1.4 root 55:
1.1.1.3 root 56: if ((nextevent - cycles) <= cycles_to_add) {
57: for (; cycles_to_add != 0; cycles_to_add--) {
1.1 root 58: if (++cycles == nextevent) {
59: int i;
1.1.1.3 root 60:
1.1.1.4 root 61: for (i = 0; i < ev_max; i++) {
1.1 root 62: if (eventtab[i].active && eventtab[i].evtime == cycles) {
63: (*eventtab[i].handler)();
64: }
65: }
66: events_schedule();
67: }
68: }
69: }
1.1.1.3 root 70: cycles += cycles_to_add;
1.1 root 71: }
72:
1.1.1.5 root 73: STATIC_INLINE void do_cycles_fast (void)
1.1 root 74: {
1.1.1.3 root 75: if (is_lastline && eventtab[ev_hsync].evtime-cycles <= 1
76: && (long int)(read_processor_time () - vsyncmintime) < 0)
77: return;
1.1.1.4 root 78:
1.1 root 79: cycles++;
80: if (nextevent == cycles) {
81: int i;
1.1.1.3 root 82:
1.1.1.4 root 83: for (i = 0; i < ev_max; i++) {
1.1 root 84: if (eventtab[i].active && eventtab[i].evtime == cycles) {
1.1.1.4 root 85: (*eventtab[i].handler) ();
1.1 root 86: }
87: }
88: events_schedule();
89: }
90:
91: }
92:
1.1.1.3 root 93: #if /* M68K_SPEED == 1 */ 0
1.1 root 94: #define do_cycles do_cycles_fast
95: #else
96: #define do_cycles do_cycles_slow
97: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.