diff --git a/src/emu/cpu/m68000/m68kcpu.h b/src/emu/cpu/m68000/m68kcpu.h index ad73de70891..294d5ed3060 100644 --- a/src/emu/cpu/m68000/m68kcpu.h +++ b/src/emu/cpu/m68000/m68kcpu.h @@ -258,6 +258,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) \ { \ @@ -269,6 +292,7 @@ typedef struct _m68ki_cpu_core m68ki_cpu_core; return m68k->initial_cycles; \ } \ } +#endif #define m68ki_check_address_error(m68k, ADDR, WRITE_MODE, FC) \ if((ADDR)&1) \ @@ -569,7 +593,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;