syn68k/runtime/include/trap.h

62 lines
1.9 KiB
C

#ifndef _trap_h_
#define _trap_h_
#include "syn68k_private.h"
extern syn68k_addr_t trap_direct (uint32 trap_number,
syn68k_addr_t exception_pc,
syn68k_addr_t exception_address);
extern uint32 trap_forwarded (syn68k_addr_t m68k_address, void *arg);
extern void trap_init (void);
extern void trap_install_handler (unsigned trap_number,
callback_handler_t func,
void *arbitrary_argument);
extern void trap_remove_handler (unsigned trap_number);
extern uint32 *trap_vector_array;
#define SR_SUPERVISOR_BIT 0x2000
#define SR_MASTER_BIT 0x1000
#define USE_USP(sr) (!((sr) & SR_SUPERVISOR_BIT))
#define USE_MSP(sr) (((sr) & (SR_SUPERVISOR_BIT | SR_MASTER_BIT)) \
== (SR_SUPERVISOR_BIT | SR_MASTER_BIT))
#define USE_ISP(sr) (((sr) & (SR_SUPERVISOR_BIT | SR_MASTER_BIT)) \
== SR_SUPERVISOR_BIT)
#define FETCH_USP() (USE_USP (cpu_state.sr) ? EM_A7 : cpu_state.usp)
#define FETCH_MSP() (USE_MSP (cpu_state.sr) ? EM_A7 : cpu_state.msp)
#define FETCH_ISP() (USE_ISP (cpu_state.sr) ? EM_A7 : cpu_state.isp)
#define SET_USP(n) \
(USE_USP (cpu_state.sr) ? (EM_A7 = (n)) : (cpu_state.usp = (n)))
#define SET_MSP(n) \
(USE_MSP (cpu_state.sr) ? (EM_A7 = (n)) : (cpu_state.msp = (n)))
#define SET_ISP(n) \
(USE_ISP (cpu_state.sr) ? (EM_A7 = (n)) : (cpu_state.isp = (n)))
#define SWITCH_A7(old_sr, new_sr) \
do \
{ \
if (((old_sr) ^ (new_sr)) & (SR_SUPERVISOR_BIT | SR_MASTER_BIT)) \
{ \
/* Save away the old a7. */ \
if (USE_USP (old_sr)) \
cpu_state.usp = EM_A7; \
else if (USE_MSP (old_sr)) \
cpu_state.msp = EM_A7; \
else \
cpu_state.isp = EM_A7; \
\
/* Load up the new value. */ \
if (USE_USP (new_sr)) \
EM_A7 = cpu_state.usp; \
else if (USE_MSP (new_sr)) \
EM_A7 = cpu_state.msp; \
else \
EM_A7 = cpu_state.isp; \
} \
} while (0)
#endif /* Not _trap_h_ */