|
|
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.14! root 12: typedef unsigned long frame_time_t;
1.1.1.13 root 13:
1.1.1.4 root 14: extern frame_time_t vsynctime, vsyncmintime;
1.1.1.13 root 15: extern frame_time_t gtod_resolution;
16: extern int vsyncmintime_valid;
17:
18: extern frame_time_t first_measured_gtod;
19: extern unsigned long gtod_secs;
20: extern unsigned long nr_gtod_to_skip;
21: extern unsigned long nr_gtod_done, gtod_counter;
22:
1.1.1.14! root 23: extern int sync_with_sound;
! 24: extern int use_gtod;
1.1.1.13 root 25:
26: extern unsigned long currcycle, nextevent;
27:
28: extern int is_lastline;
1.1.1.14! root 29: extern volatile int delaying_for_sound;
! 30: extern int active_fs_packets;
1.1.1.11 root 31:
1.1 root 32: typedef void (*evfunc)(void);
33:
34: struct ev
35: {
36: int active;
37: unsigned long int evtime, oldcycles;
38: evfunc handler;
39: };
40:
1.1.1.3 root 41: enum {
1.1.1.9 root 42: ev_hsync, ev_copper, ev_audio, ev_cia, ev_blitter, ev_disk,
1.1 root 43: ev_max
44: };
45:
46: extern struct ev eventtab[ev_max];
47:
1.1.1.14! root 48: extern void reset_frame_rate_hack (void);
! 49: extern void compute_vsynctime (void);
! 50: extern void time_vsync (void);
! 51:
! 52: extern void init_gtod (void);
! 53:
1.1.1.13 root 54: STATIC_INLINE frame_time_t get_current_time (int redo_secs)
55: {
1.1.1.14! root 56: struct timeval tv;
! 57: gettimeofday (&tv, NULL);
! 58: if (redo_secs)
! 59: gtod_secs = tv.tv_sec;
! 60: return tv.tv_usec + (tv.tv_sec - gtod_secs) * 1000000;
1.1.1.13 root 61: }
62:
1.1.1.5 root 63: STATIC_INLINE void events_schedule (void)
1.1 root 64: {
65: int i;
1.1.1.3 root 66:
1.1 root 67: unsigned long int mintime = ~0L;
1.1.1.9 root 68: for (i = 0; i < ev_max; i++) {
1.1.1.3 root 69: if (eventtab[i].active) {
1.1.1.9 root 70: unsigned long int eventtime = eventtab[i].evtime - currcycle;
1.1 root 71: if (eventtime < mintime)
1.1.1.3 root 72: mintime = eventtime;
1.1 root 73: }
74: }
1.1.1.9 root 75: nextevent = currcycle + mintime;
1.1 root 76: }
77:
1.1.1.5 root 78: STATIC_INLINE void do_cycles_slow (unsigned long cycles_to_add)
1.1 root 79: {
1.1.1.14! root 80: if (delaying_for_sound)
1.1.1.3 root 81: return;
1.1.1.4 root 82:
1.1.1.13 root 83: if (is_lastline
84: && eventtab[ev_hsync].evtime - currcycle <= cycles_to_add)
85: {
86: static int n_skipped = 0;
87: frame_time_t curr;
88:
89: if (gtod_counter++ < nr_gtod_to_skip)
90: return;
91: gtod_counter = 0;
92: curr = get_current_time (0);
93:
94: if ((long int)(curr - vsyncmintime) < 0) {
95: nr_gtod_done++;
96: return;
97: }
98: #if 0
99: printf ("skipped %d times\n", nr_gtod_done);
100: #endif
101: }
102:
1.1.1.9 root 103: while ((nextevent - currcycle) <= cycles_to_add) {
1.1.1.12 root 104: int i;
105: cycles_to_add -= (nextevent - currcycle);
106: currcycle = nextevent;
1.1.1.9 root 107:
1.1.1.12 root 108: for (i = 0; i < ev_max; i++) {
1.1.1.9 root 109: if (eventtab[i].active && eventtab[i].evtime == currcycle) {
110: (*eventtab[i].handler)();
1.1 root 111: }
112: }
1.1.1.12 root 113: events_schedule();
1.1 root 114: }
1.1.1.9 root 115: currcycle += cycles_to_add;
1.1 root 116: }
117:
1.1.1.10 root 118: /* This is a special-case function. Normally, all events should lie in the
119: future; they should only ever be active at the current cycle during
120: do_cycles. However, a snapshot is saved during do_cycles, and so when
121: restoring it, we may have other events pending. */
122: STATIC_INLINE void handle_active_events (void)
123: {
124: int i;
125: for (i = 0; i < ev_max; i++) {
126: if (eventtab[i].active && eventtab[i].evtime == currcycle) {
127: (*eventtab[i].handler)();
128: }
129: }
130: }
131:
1.1.1.9 root 132: STATIC_INLINE unsigned long get_cycles (void)
133: {
134: return currcycle;
135: }
136:
1.1.1.10 root 137: extern void init_eventtab (void);
138:
1.1 root 139: #define do_cycles do_cycles_slow
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.