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

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

unix.superglobalmegacorp.com

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