typedef struct _Win87EmSaveArea {
unsigned char Save80x87Area[SIZE_80X87_AREA];
unsigned char SaveEmArea[];
} Win87EmSaveArea;
The Win87EmSaveArea structure contains the states of the floating-point coprocessor and floating-point emulator.
Save80x87Area
Specifies an array of values defining the state of the floating-point coproces-sor if one is present. The array has the same format as data saved by an fsave instruction and consists of SIZE_80X87_AREA (94) array elements.
SaveEmArea
Specifies an array of values defining the state of the floating-point emulator. The array has the following form:
Have8087 db 0 ; 1 if coprocessor is present; otherwise, 0
db ? ; reserved
dw ? ; reserved
dw ? ; reserved
ControlWord label word ; emulator control word
CWmask db ? ; exception masks
CWcntl db ? ; arithmetic control flags
StatusWord label word ; emulator status word
SWerr db ? ; exception flags
SWcc db ? ; condition codes
BASstk dw ? ; offset of start of emulator register area
CURstk dw ? ; offset of current top-of-stack register
LIMstk dw ? ; offset of end of emulator register area
dw ? dup(?) ; reserved
The BASstk, CURstk, and LIMstk fields specify the offsets from the start of the SaveEmArea member into the emulator's register area. If BASstk and CURstk have the same value, the stack is empty. Each of the emulator's registers is 12 bytes long and has the form shown in the following illustration.
The mantissa contains the leading 1 before the decimal point in the high-order bit of the most significant byte (msb). The exponent is not biased, that is, it is a signed integer. The following illustration shows the flag and tag bytes.