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

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

unix.superglobalmegacorp.com

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