void REGPARAM2 call_calltrap (int func) { uae_u32 retval = 0; int has_retval = (trapmode[func] & TRAPFLAG_NO_RETVAL) == 0; int implicit_rts = (trapmode[func] & TRAPFLAG_DORET) != 0; if (trapstr[func] && *trapstr[func] != 0 && trace_traps) write_log ("TRAP: %s\n", trapstr[func]); /* For monitoring only? */ if (traps[func] == NULL) { m68k_setpc (trapoldfunc[func]); fill_prefetch_slow (); return; } if (func < max_trap) { #ifdef CAN_DO_STACK_MAGIC if (trapmode[func] & TRAPFLAG_EXTRA_STACK) { execute_fn_on_extra_stack(traps[func], has_retval); return; } #endif retval = (*traps[func])(); } else write_log ("illegal emulator trap\n"); if (has_retval) m68k_dreg (regs, 0) = retval; if (implicit_rts) { m68k_do_rts (); fill_prefetch_slow (); } }
void REGPARAM2 call_calltrap(int func) { uae_u32 retval = 0; int has_retval = (trapmode[func] & TRAPFLAG_NO_RETVAL) == 0; int implicit_rts = (trapmode[func] & TRAPFLAG_DORET) != 0; if (*trapstr[func] != 0 && trace_traps) write_log ("TRAP: %s\n", trapstr[func]); /* For monitoring only? */ if (traps[func] == NULL) { _68k_setpc(trapoldfunc[func]); fill_prefetch_0 (); return; } if (func < max_trap) { if (trapmode[func] & TRAPFLAG_EXTRA_STACK) { execute_fn_on_extra_stack(traps[func], has_retval); return; } retval = (*traps[func])(); } else write_log ("illegal emulator trap\n"); if (has_retval) _68k_dreg(0) = retval; if (implicit_rts) { #ifndef USE_FAME_CORE m68k_do_rts (); #else /* WinUAE code - m68k_do_rts() */ _68k_setpc(get_long(_68k_areg(7))); _68k_areg(7) += 4; /*******************************/ #endif fill_prefetch_0 (); } }