/* * This function is called by the 68k interpreter to handle an emulator trap. * * trap_num = number of trap to invoke * regs = current 68k state */ void REGPARAM2 m68k_handle_trap (unsigned int trap_num) { struct Trap *trap = &traps[trap_num]; uae_u32 retval = 0; int has_retval = (trap->flags & TRAPFLAG_NO_RETVAL) == 0; int implicit_rts = (trap->flags & TRAPFLAG_DORET) != 0; if (trap->name && trap->name[0] != 0 && trace_traps) write_log (_T("TRAP: %s\n"), trap->name); if (trap_num < trap_count) { if (trap->flags & TRAPFLAG_EXTRA_STACK) { /* Handle an extended trap. * Note: the return value of this trap is passed back to 68k * space via a separate, dedicated simple trap which the trap * handler causes to be invoked when it is done. */ trap_HandleExtendedTrap (trap->handler, has_retval); } else { /* Handle simple trap */ retval = (trap->handler) (NULL); if (has_retval) m68k_dreg (regs, 0) = retval; if (implicit_rts) { m68k_do_rts (); fill_prefetch (); } } } else write_log (_T("Illegal emulator trap %d\n"), trap_num); }
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 (); } }