Annotation of uae/src/include/events.h, revision 1.1.1.5

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.