|
|
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 root 29: ev_hsync, ev_copper, ev_cia,
1.1.1.5 ! root 30: ev_blitter, ev_diskblk, ev_diskindex, ev_disksync,
1.1 root 31: ev_max
32: };
33:
34: extern struct ev eventtab[ev_max];
35:
1.1.1.5 ! root 36: STATIC_INLINE void events_schedule (void)
1.1 root 37: {
38: int i;
1.1.1.3 root 39:
1.1 root 40: unsigned long int mintime = ~0L;
41: for(i = 0; i < ev_max; i++) {
1.1.1.3 root 42: if (eventtab[i].active) {
1.1 root 43: unsigned long int eventtime = eventtab[i].evtime - cycles;
44: if (eventtime < mintime)
1.1.1.3 root 45: mintime = eventtime;
1.1 root 46: }
47: }
48: nextevent = cycles + mintime;
49: }
50:
1.1.1.5 ! root 51: STATIC_INLINE void do_cycles_slow (unsigned long cycles_to_add)
1.1 root 52: {
1.1.1.3 root 53: if (is_lastline && eventtab[ev_hsync].evtime-cycles <= cycles_to_add
54: && (long int)(read_processor_time () - vsyncmintime) < 0)
55: return;
1.1.1.4 root 56:
1.1.1.3 root 57: if ((nextevent - cycles) <= cycles_to_add) {
58: for (; cycles_to_add != 0; cycles_to_add--) {
1.1 root 59: if (++cycles == nextevent) {
60: int i;
1.1.1.3 root 61:
1.1.1.4 root 62: for (i = 0; i < ev_max; i++) {
1.1 root 63: if (eventtab[i].active && eventtab[i].evtime == cycles) {
64: (*eventtab[i].handler)();
65: }
66: }
67: events_schedule();
68: }
69: }
70: }
1.1.1.3 root 71: cycles += cycles_to_add;
1.1 root 72: }
73:
1.1.1.5 ! root 74: STATIC_INLINE void do_cycles_fast (void)
1.1 root 75: {
1.1.1.3 root 76: if (is_lastline && eventtab[ev_hsync].evtime-cycles <= 1
77: && (long int)(read_processor_time () - vsyncmintime) < 0)
78: return;
1.1.1.4 root 79:
1.1 root 80: cycles++;
81: if (nextevent == cycles) {
82: int i;
1.1.1.3 root 83:
1.1.1.4 root 84: for (i = 0; i < ev_max; i++) {
1.1 root 85: if (eventtab[i].active && eventtab[i].evtime == cycles) {
1.1.1.4 root 86: (*eventtab[i].handler) ();
1.1 root 87: }
88: }
89: events_schedule();
90: }
91:
92: }
93:
1.1.1.3 root 94: #if /* M68K_SPEED == 1 */ 0
1.1 root 95: #define do_cycles do_cycles_fast
96: #else
97: #define do_cycles do_cycles_slow
98: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.