/* i86.h - 8086 processor specific header file * $Version: 1.9 $ * Copyright 1988, 89, 90 Intel Corporation, ALL RIGHTS RESERVED. */ #if !defined(_I86_) #define _I86_ #pragma extend #pragma _selector_("selector") /*** For manipulation of selector ***/ #pragma _builtin_("buildptr"==2) void far *buildptr( selector sel, void near *offset); #pragma _builtin_("lockset"==3) unsigned char lockset(unsigned char *lockptr, unsigned char newvalue); #pragma _builtin_("enable"==4) void enable(void); #pragma _builtin_("disable"==5) void disable(void); #pragma _builtin_("causeinterrupt"==6) void causeinterrupt(unsigned char number); #pragma _builtin_("halt"==7) void halt(void); #pragma _builtin_("getflags"==8) unsigned int getflags(void); #pragma _builtin_("setflags"==9) void setflags(unsigned int value); #define FLAG_CARRY 0x0001 #define FLAG_PARITY 0x0004 #define FLAG_AUXCARRY 0x0010 #define FLAG_ZERO 0x0040 #define FLAG_SIGN 0x0080 #define FLAG_TRAP 0x0100 #define FLAG_INTERRUPT 0x0200 #define FLAG_DIRECTION 0x0400 #define FLAG_OVERFLOW 0x0800 #pragma _builtin_("inbyte"==10) unsigned char inbyte(unsigned short port); #pragma _builtin_("inword"==11) unsigned int inword(unsigned short port); #pragma _builtin_("outbyte"==12) void outbyte(unsigned short port, unsigned char value); #pragma _builtin_("outword"==13) void outword(unsigned short port, unsigned int value); #pragma _builtin_("initrealmathunit"==14) void initrealmathunit(void); #pragma _builtin_("setrealmode"==15) void setrealmode(unsigned short mode); #pragma _builtin_("getrealstatus"==16) unsigned short getrealstatus(void); #pragma _builtin_("getrealerror"==17) unsigned short getrealerror(void); #define I87_INVALID_OPERATION 0x0001 #define I87_DENORMALIZED_OPERAND 0x0002 #define I87_ZERO_DIVIDE 0x0004 #define I87_OVERFLOW 0x0008 #define I87_UNDERFLOW 0x0010 #define I87_PRECISION 0x0020 #define I87_CONTROL_PRECISION 0x0300 #define I87_PRECISION_24_BIT 0x0000 #define I87_PRECISION_53_BIT 0x0200 #define I87_PRECISION_64_BIT 0x0300 #define I87_CONTROL_ROUNDING 0x0C00 #define I87_ROUND_NEAREST 0x0000 #define I87_ROUND_DOWN 0x0400 #define I87_ROUND_UP 0x0800 #define I87_ROUND_CHOP 0x0C00 #define I87_CONTROL_INFINITY 0x1000 #define I87_INFINITY_PROJECTIVE 0x0000 #define I87_INFINITY_AFFINE 0x1000 #define I87_STATUS_ERROR 0x0080 #define I87_STATUS_STACKTOP_MASK 0x3800 #define I87_STATUS_STACKTOP_SHIFT 11 #define I87_STATUS_STACKTOP(env) (((env).status & I87_STATUS_STACKTOP_MASK) \ >> I87_STATUS_STACKTOP_SHIFT) #define I87_STACK_TOP(env) I87_STATUS_STACKTOP(env) #define I87_STATUS_BUSY 0x8000 #define I87_STATUS_CONDITION_CODE 0x4700 #define I87_CONDITION_C0 0x0100 #define I87_CONDITION_C1 0x0200 #define I87_CONDITION_C2 0x0400 #define I87_CONDITION_C3 0x4000 #pragma ALIGN("i87_real_address") struct i87_real_address { unsigned offset : 16, : 0; unsigned opcode : 11, : 1; unsigned selector: 4, : 0; }; #define I87_REAL_ADDRESS(addr) buildptr((selector)((addr).selector & 0xF000),\ (void near *)(addr).offset) union i87_address { struct i87_real_address real; void far *protected; }; #pragma ALIGN("i87_environment") struct i87_environment { unsigned control: 16, : 0; unsigned status : 16, : 0; unsigned tag : 16, : 0; union i87_address instruction; union i87_address operand; }; #define I87_TAG_MASK 0x0003 #define I87_TAG_SHIFT 2 #define I87_TAG(x, y) (((x).tag >> (I87_TAG_SHIFT * (y))) & I87_TAG_MASK) #pragma NOALIGN("i87_tempreal") struct i87_tempreal { char significand[8]; unsigned exponent: 15; #if defined(SBITFIELD) signed sign: 1; #else unsigned sign: 1; #endif }; typedef struct i87_tempreal tempreal_t; struct i87_state { struct i87_environment environment; tempreal_t stack[8]; }; #if _ARCHITECTURE_ < 386 #pragma _builtin_("saverealstatus"==18) void saverealstatus(struct i87_state *savearea); #pragma _builtin_("restorerealstatus"==19) void restorerealstatus(struct i87_state const *savearea); #endif #pragma _builtin_("byte_rol"==74) unsigned char byte_rol(unsigned char, unsigned int); #pragma _builtin_("byte_ror"==75) unsigned char byte_ror(unsigned char, unsigned int); #pragma _builtin_("hword_rol"==76) unsigned short hword_rol(unsigned short, unsigned int); #pragma _builtin_("hword_ror"==77) unsigned short hword_ror(unsigned short, unsigned int); #endif