|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * Event stuff ! 5: * ! 6: * Copyright 1995-2002 Bernd Schmidt ! 7: * Copyright 1995 Alessandro Bissacco ! 8: * Copyright 2000-2012 Toni Wilen ! 9: */ ! 10: ! 11: #include "main.h" ! 12: ! 13: #include "sysconfig.h" ! 14: #include "sysdeps.h" ! 15: ! 16: #include "options_cpu.h" ! 17: #include "events.h" ! 18: #include "memory.h" ! 19: #include "newcpu.h" ! 20: //#include "uae/ppc.h" ! 21: ! 22: static const int pissoff_nojit_value = 256 * CYCLE_UNIT; ! 23: ! 24: #ifndef WINUAE_FOR_HATARI ! 25: unsigned long int event_cycles, nextevent, currcycle; ! 26: int is_syncline, is_syncline_end; ! 27: long cycles_to_next_event; ! 28: long max_cycles_to_next_event; ! 29: long cycles_to_hsync_event; ! 30: unsigned long start_cycles; ! 31: bool event_wait; ! 32: ! 33: frame_time_t vsyncmintime, vsyncmaxtime, vsyncwaittime; ! 34: int vsynctimebase; ! 35: int event2_count; ! 36: ! 37: void events_schedule (void) ! 38: { ! 39: int i; ! 40: ! 41: unsigned long int mintime = ~0L; ! 42: for (i = 0; i < ev_max; i++) { ! 43: if (eventtab[i].active) { ! 44: unsigned long int eventtime = eventtab[i].evtime - currcycle; ! 45: if (eventtime < mintime) ! 46: mintime = eventtime; ! 47: } ! 48: } ! 49: nextevent = currcycle + mintime; ! 50: } ! 51: #endif ! 52: ! 53: void do_cycles_slow (unsigned long cycles_to_add) ! 54: { ! 55: #ifndef WINUAE_FOR_HATARI ! 56: if ((pissoff -= cycles_to_add) >= 0) ! 57: return; ! 58: ! 59: cycles_to_add = -pissoff; ! 60: pissoff = 0; ! 61: ! 62: while ((nextevent - currcycle) <= cycles_to_add) { ! 63: int i; ! 64: ! 65: /* Keep only CPU emulation running while waiting for sync point. */ ! 66: if (is_syncline) { ! 67: if (!vblank_found_chipset) { ! 68: if (is_syncline > 0) { ! 69: int rpt = read_processor_time (); ! 70: int v = rpt - vsyncmintime; ! 71: int v2 = rpt - is_syncline_end; ! 72: if (v > vsynctimebase || v < -vsynctimebase) { ! 73: v = 0; ! 74: } ! 75: if (v < 0 && v2 < 0 && event_wait) { ! 76: ! 77: #ifdef WITH_PPC ! 78: if (ppc_state) { ! 79: if (is_syncline == 1) { ! 80: uae_ppc_execute_check(); ! 81: } else { ! 82: uae_ppc_execute_quick(); ! 83: } ! 84: } ! 85: #endif ! 86: if (currprefs.cachesize) ! 87: pissoff = pissoff_value; ! 88: else ! 89: pissoff = pissoff_nojit_value; ! 90: return; ! 91: } ! 92: } else if (is_syncline < 0) { ! 93: int rpt = read_processor_time (); ! 94: int v = rpt - is_syncline_end; ! 95: if (v < 0 && event_wait) { ! 96: ! 97: #ifdef WITH_PPC ! 98: if (ppc_state) { ! 99: uae_ppc_execute_check(); ! 100: } ! 101: #endif ! 102: if (currprefs.cachesize) ! 103: pissoff = pissoff_value; ! 104: else ! 105: pissoff = pissoff_nojit_value; ! 106: return; ! 107: } ! 108: } ! 109: } ! 110: is_syncline = 0; ! 111: } ! 112: ! 113: cycles_to_add -= nextevent - currcycle; ! 114: currcycle = nextevent; ! 115: ! 116: for (i = 0; i < ev_max; i++) { ! 117: if (eventtab[i].active && eventtab[i].evtime == currcycle) { ! 118: if (eventtab[i].handler == NULL) { ! 119: gui_message(_T("eventtab[%d].handler is null!\n"), i); ! 120: eventtab[i].active = 0; ! 121: } else { ! 122: (*eventtab[i].handler)(); ! 123: } ! 124: } ! 125: } ! 126: events_schedule (); ! 127: ! 128: ! 129: } ! 130: #endif ! 131: currcycle += cycles_to_add; ! 132: } ! 133: ! 134: #ifndef WINUAE_FOR_HATARI ! 135: void MISC_handler (void) ! 136: { ! 137: static bool dorecheck; ! 138: bool recheck; ! 139: int i; ! 140: evt mintime; ! 141: evt ct = get_cycles (); ! 142: static int recursive; ! 143: ! 144: if (recursive) { ! 145: dorecheck = true; ! 146: return; ! 147: } ! 148: recursive++; ! 149: eventtab[ev_misc].active = 0; ! 150: recheck = true; ! 151: while (recheck) { ! 152: recheck = false; ! 153: mintime = ~0L; ! 154: for (i = 0; i < ev2_max; i++) { ! 155: if (eventtab2[i].active) { ! 156: if (eventtab2[i].evtime == ct) { ! 157: eventtab2[i].active = false; ! 158: event2_count--; ! 159: eventtab2[i].handler (eventtab2[i].data); ! 160: if (dorecheck || eventtab2[i].active) { ! 161: recheck = true; ! 162: dorecheck = false; ! 163: } ! 164: } else { ! 165: evt eventtime = eventtab2[i].evtime - ct; ! 166: if (eventtime < mintime) ! 167: mintime = eventtime; ! 168: } ! 169: } ! 170: } ! 171: } ! 172: if (mintime != ~0UL) { ! 173: eventtab[ev_misc].active = true; ! 174: eventtab[ev_misc].oldcycles = ct; ! 175: eventtab[ev_misc].evtime = ct + mintime; ! 176: events_schedule (); ! 177: } ! 178: recursive--; ! 179: } ! 180: ! 181: ! 182: void event2_newevent_xx (int no, evt t, uae_u32 data, evfunc2 func) ! 183: { ! 184: evt et; ! 185: static int next = ev2_misc; ! 186: ! 187: et = t + get_cycles (); ! 188: if (no < 0) { ! 189: no = next; ! 190: for (;;) { ! 191: if (!eventtab2[no].active) { ! 192: event2_count++; ! 193: break; ! 194: } ! 195: if (eventtab2[no].evtime == et && eventtab2[no].handler == func && eventtab2[no].data == data) ! 196: break; ! 197: no++; ! 198: if (no == ev2_max) ! 199: no = ev2_misc; ! 200: if (no == next) { ! 201: write_log (_T("out of event2's!\n")); ! 202: return; ! 203: } ! 204: } ! 205: next = no; ! 206: } ! 207: eventtab2[no].active = true; ! 208: eventtab2[no].evtime = et; ! 209: eventtab2[no].handler = func; ! 210: eventtab2[no].data = data; ! 211: MISC_handler (); ! 212: } ! 213: ! 214: int current_hpos (void) ! 215: { ! 216: int hp = current_hpos_safe (); ! 217: if (hp < 0 || hp > 256) { ! 218: gui_message(_T("hpos = %d!?\n"), hp); ! 219: hp = 0; ! 220: } ! 221: return hp; ! 222: } ! 223: #endif ! 224: ! 225:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.