Minix1.5/kernel/sconst.h

/* Miscellaneous constants used in assembler code. */
#define HCHIGH_MASK	0x0F	/* h/w click mask for low byte of hi word */
#define HCLOW_MASK	0xF0	/* h/w click mask for low byte of low word */
#define TEST1PATTERN	0x55	/* memory test pattern 1 */
#define TEST2PATTERN	0xAA	/* memory test pattern 2 */

/* Magic numbers for color status port. */
#define COLOR_STATUS_PORT	0x3DA
#	define VERTICAL_RETRACE_MASK	0x08

/* 8259 mask bits. */
#define AT_WINI_MASK	0x40	/* (1 << (AT_WINI_IRQ & 0x07)), etc */
#define CLOCK_MASK	0x01
#define ETHER_MASK	0x08
#define FLOPPY_MASK	0x40
#define KEYBOARD_MASK	0x02
#define PRINTER_MASK	0x80
#define RS232_MASK	0x10
#define SECONDARY_MASK	0x08
#define XT_WINI_MASK	0x20

/* Device interrupt acknowledge ports and bits. */
#define CLOCK_ACK_BIT	0x80
#define CLOCK_ACK_PORT	PORT_B

/* Offsets in struct proc. They MUST match proc.h. */
#define P_STACKBASE	0
#define ESREG		0
#define DSREG		2
#define DIREG		4
#define SIREG		6
#define BPREG		8
#define STREG		10	/* hole for another SP */
#define BXREG		12
#define DXREG		14
#define CXREG		16
#define AXREG		18
#define RETADR		20	/* return address for save() call */
#define PCREG		22
#define CSREG		24
#define PSWREG		26
#define SPREG		28
#define SSREG		30
#define P_STACKTOP	32

#if INTEL_32BITS
/* The registers are twice as wide. There are 2 extra segment regs, but
 * these are packed in the double-width es and ds slots.
 */
EAXREG		=	2 * AXREG	/* use "=" to avoid parentheses */
ERETADR		=	2 * RETADR
EPCREG		=	2 * PCREG
ECSREG		=	2 * CSREG
EPSWREG		=	2 * PSWREG
P3_STACKTOP	=	2 * P_STACKTOP
#define P_LDT_SEL	P3_STACKTOP
#define Msize		18
#define SIZEOF_INT	4
#else
#define P_LDT_SEL	P_STACKTOP
#define Msize		12	/* size of a message in 16-bit words */
#define SIZEOF_INT	2
#endif

P_LDT		=	P_LDT_SEL + SIZEOF_INT
P_SPLIMIT	=	P_LDT_SEL + 16	/* 16 is from 2 8-byte descriptors */

/* Macros to handle bitwise complementation cleanly. */
#if ASLD
#define notop(n)	[-[n]-1]
#else
#define notop(n)	(!(n))
#endif /* ASLD */

/* Macros to handle some 286 instructions with asld. */
#if ASLD
#define ESC2		.byte	0x0F	/* escape for some 286 instructions */
#define deflgdt(adr)	ESC2;	add	adr,dx	/* may not be general */
#define deflidt(adr)	ESC2;	add	adr,bx	/* may not be general */
#define deflldt(adr)	ESC2;	addb	adr,dl	/* may not be general */
#define defltrax	ESC2;	.byte	0x00,0xD8
#define defsgdt(adr)	ESC2;	add	adr,ax	/* may not be general */
#define defsidt(adr)	ESC2;	add	adr,cx	/* may not be general */
#define defsldt(adr)	ESC2;	addb	adr,al	/* may not be general */
#define insw		.byte	0x6D
#define outsw		.byte	0x6F
#define popa		.byte	0x61
#define pusha		.byte	0x60
#define pushi8(n)	.byte	0x6A;	.byte	n
#define pushi16(n)	.byte	0x68;	.word	n
#else
#define deflgdt(adr)	lgdt	adr
#define deflidt(adr)	lidt	adr
#define deflldt(adr)	lldt	adr
#define defltrax	ltr	ax
#define defsgdt(adr)	sgdt	adr
#define defsidt(adr)	sidt	adr
#define defsldt(adr)	sldt	adr
#define pushi8(n)	push	#n
#define pushi16(n)	push	#n
#endif /* ASLD */