diff --git a/src/emu/cpu/m68000/m68kcpu.h b/src/emu/cpu/m68000/m68kcpu.h index fa3d543c95e..7adc89af871 100644 --- a/src/emu/cpu/m68000/m68kcpu.h +++ b/src/emu/cpu/m68000/m68kcpu.h @@ -256,6 +256,29 @@ typedef struct _m68ki_cpu_core m68ki_cpu_core; /* Address error */ +/* sigjmp() on Mac OS X and *BSD in general saves signal contexts and is super-slow, use sigsetjmp() to tell it not to */ +#ifdef _BSD_SETJMP_H +#define m68ki_set_address_error_trap(m68k) \ + if(sigsetjmp(m68k->aerr_trap, 0) != 0) \ + { \ + m68ki_exception_address_error(m68k); \ + if(m68k->stopped) \ + { \ + if (m68k->remaining_cycles > 0) \ + m68k->remaining_cycles = 0; \ + return m68k->initial_cycles; \ + } \ + } + +#define m68ki_check_address_error(m68k, ADDR, WRITE_MODE, FC) \ + if((ADDR)&1) \ + { \ + m68k->aerr_address = ADDR; \ + m68k->aerr_write_mode = WRITE_MODE; \ + m68k->aerr_fc = FC; \ + siglongjmp(m68k->aerr_trap, 1); \ + } +#else #define m68ki_set_address_error_trap(m68k) \ if(setjmp(m68k->aerr_trap) != 0) \ { \ @@ -276,7 +299,7 @@ typedef struct _m68ki_cpu_core m68ki_cpu_core; m68k->aerr_fc = FC; \ longjmp(m68k->aerr_trap, 1); \ } - +#endif /* -------------------------- EA / Operand Access ------------------------- */ @@ -567,7 +590,11 @@ struct _m68ki_cpu_core int reset_cycles; UINT32 tracing; +#ifdef _BSD_SETJMP_H + sigjmp_buf aerr_trap; +#else jmp_buf aerr_trap; +#endif UINT32 aerr_address; UINT32 aerr_write_mode; UINT32 aerr_fc;