103 lines
2.5 KiB
C
103 lines
2.5 KiB
C
/*
|
|
Shadowbyte macros
|
|
*/
|
|
|
|
/* $Id$ */
|
|
|
|
#include "logging.h"
|
|
|
|
#ifdef LOGGING
|
|
|
|
extern char *data_sh; /* shadowbytes of data space */
|
|
extern char *stack_sh; /* shadowbytes of stack space */
|
|
extern char *stackML_sh; /* stack_sh + ML (to speed up stack access) */
|
|
|
|
/* Bit 0, 1, 2 and 3: datatype/pointertype. */
|
|
|
|
#define SH_INT (0x01)
|
|
#define SH_FLOAT (0x02)
|
|
#define SH_DATAP (0x04)
|
|
#define SH_INSP (0x08)
|
|
|
|
/* Bit 7: protection bit */
|
|
|
|
#define SH_PROT (0x80)
|
|
|
|
/******** Shadowbytes, general ********/
|
|
|
|
#define dt_sh(a) (*(data_sh + (p2i(a))))
|
|
#define st_sh(a) (*(stackML_sh - (a)))
|
|
#define mem_sh(a) (in_stack(a) ? st_sh(a) : dt_sh(a))
|
|
|
|
/******** Shadowbytes settings for data ********/
|
|
|
|
#define dt_undef(a) (dt_sh(a) = UNDEFINED)
|
|
|
|
#define dt_int(a) (dt_sh(a) = SH_INT)
|
|
#define dt_fl(a) (dt_sh(a) = SH_FLOAT)
|
|
#define dt_ip(a) (dt_sh(a) = SH_INSP)
|
|
#define dt_dp(a) (dt_sh(a) = SH_DATAP)
|
|
|
|
#define dt_prot2b(a) { dt_sh(a) |= SH_PROT; dt_sh(a+1) |= SH_PROT; }
|
|
#define dt_unpr2b(a) { dt_sh(a) &= ~SH_PROT; dt_sh(a+1) &= ~SH_PROT; }
|
|
#define dt_prot(a,n) { dt_prot2b(a); \
|
|
if ((n) == 4) { dt_prot2b(a+2); } }
|
|
#define dt_unprot(a,n) { dt_unpr2b(a); \
|
|
if ((n) == 4) { dt_unpr2b(a+2); } }
|
|
|
|
/******** Shadowbytes settings for stack ********/
|
|
|
|
#define st_undef(a) (st_sh(a) = UNDEFINED)
|
|
|
|
#define st_int(a) (st_sh(a) = SH_INT)
|
|
#define st_fl(a) (st_sh(a) = SH_FLOAT)
|
|
#define st_ip(a) (st_sh(a) = SH_INSP)
|
|
#define st_dp(a) (st_sh(a) = SH_DATAP)
|
|
|
|
#define st_prot2b(a) { st_sh(a) |= SH_PROT; st_sh(a+1) |= SH_PROT; }
|
|
#define st_unpr2b(a) { st_sh(a) &= ~SH_PROT; st_sh(a+1) &= ~SH_PROT; }
|
|
#define st_prot(a,n) { st_prot2b(a); \
|
|
if ((n) == 4) { st_prot2b(a+2); } }
|
|
#define st_unprot(a,n) { st_unpr2b(a); \
|
|
if ((n) == 4) { st_unpr2b(a+2); } }
|
|
|
|
/******** Shadowbytes checking for data ********/
|
|
|
|
#define is_dt_set(a,n,s) ((dt_sh(a) & s) && (dt_sh(a+(n-1)) & s))
|
|
#define is_dt_prot(a) (dt_sh(a) & SH_PROT)
|
|
#define ch_dt_prot(a) { if (is_dt_prot(a)) warning(WDESROM); }
|
|
|
|
/******** Shadowbytes checking for stack ********/
|
|
|
|
#define is_st_set(a,n,s) ((st_sh(a) & s) && (st_sh(a+(n-1)) & s))
|
|
#define is_st_prot(a) (st_sh(a) & SH_PROT)
|
|
#define ch_st_prot(a) { if (is_st_prot(a)) warning(WDESRSB); }
|
|
|
|
#else
|
|
|
|
#define dt_undef(a)
|
|
|
|
#define dt_int(a)
|
|
#define dt_fl(a)
|
|
#define dt_ip(a)
|
|
#define dt_dp(a)
|
|
|
|
#define dt_prot(a,n)
|
|
#define dt_unprot(a,b)
|
|
|
|
#define st_undef(a)
|
|
|
|
#define st_int(a)
|
|
#define st_fl(a)
|
|
#define st_ip(a)
|
|
#define st_dp(a)
|
|
|
|
#define st_prot(a,n)
|
|
#define st_unprot(a,b)
|
|
|
|
#define ch_dt_prot(a)
|
|
#define ch_st_prot(a)
|
|
|
|
#endif /* LOGGING */
|
|
|