|
|
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,
30: ev_blitter, ev_diskblk, ev_diskindex,
31: ev_max
32: };
33:
34: extern struct ev eventtab[ev_max];
35:
1.1.1.4 ! 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.4 ! 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.4 ! 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.