windows-nt/Source/XPSP1/NT/base/mvdm/wow16/win87em/emintern.asm
2020-09-26 16:20:57 +08:00

276 lines
5.4 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
;
; Copyright (C) Microsoft Corporation, 1986
;
; This Module contains Proprietary Information of Microsoft
; Corporation and should be treated as Confidential.
;
subttl emintern.asm - Emulator Internal Format and Macros
page
;---------------------------------------------------------------------------
;
; Emulator Internal Format:
;
; +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11
; .___.___.___.___.___.___.___.___.___.___.___.___.
; ptr --> |___|___|___|___|___|___|___|___|___|___|___|___|
; lsb msb exl exh flg tag
; |<--- mantissa --->|exponent
;
; The mantissa contains the leading 1 before the decimal point in the hi
; bit of the msb. The exponent is not biased i.e. it is a signed integer.
; The flag and tag bytes are as below.
;
; bit: 7 6 5 4 3 2 1 0
; .___.___.___.___.___.___.___.___.
; Flag: |___|_X_|_X_|_X_|_X_|_X_|_X_|___| X = unused
; ^ ^
; SIGN SINGLE (=1 if single precision)
;
;
; bit: 7 6 5 4 3 2 1 0
; .___.___.___.___.___.___.___.___.
; Tag: |_X_|_X_|_X_|_X_|_X_|_X_|___|___| X = unused
; ^ ^
; | |
; Special (Set for NAN or Inf) ---+ |
; ZROorINF (Set for 0 or Inf) -------+
;
PAGE
; Data Structure Equates
Lsb equ 0
Msb equ 7
MB0 equ 0
MB1 equ 1
MB2 equ 2
MB3 equ 3
MB4 equ 4
MB5 equ 5
MB6 equ 6
MB7 equ 7
Expon equ 8
Flag equ 10
Sign equ 128
if fastSP
Single equ 1
endif
Tag equ 11
Special equ 2
ZROorINF equ 1
Reg87Len equ 12
MantissaByteCnt equ Msb - Lsb + 1
IexpBias equ 3FFFh ; 16,383
IexpMax equ 7FFFh ; Biased Exponent for Infinity
IexpMin equ 0 ; Biased Exponent for zero
DexpBias equ 3FFh ; 1023
DexpMax equ 7FFh ; Biased Exponent for Infinity
DexpMin equ 0 ; Biased Exponent for zero
SexpBias equ 07Fh ; 127
SexpMax equ 0FFh ; Biased Exponent for Infinity
SexpMin equ 0 ; Biased Exponent for zero
; Control Word Format CWcntl
InfinityControl equ 10h
ICaffine equ 10h
ICprojective equ 0
RoundControl equ 0Ch
RCchop equ 0Ch
RCup equ 08h
RCdown equ 04h
RCnear equ 0
PrecisionControl equ 03h
PC24 equ 0
PC53 equ 02h
PC64 equ 03h
; Status Word Format SWcc
C0 equ 01h
C1 equ 02h
C2 equ 04h
C3 equ 40h
ConditionCode equ C0 + C1 + C2+ C3
CCgreater equ 0
CCless EQU C0
CCequal equ C3
CCincomprable equ C3 + C2 + C0
; Status Flags Format CURerr
Invalid equ 1h ; chip status flags
Denormal equ 2h
ZeroDivide equ 4h
Overflow equ 8h
Underflow equ 10h
Precision equ 20h
Unemulated equ 40h ; soft status flags
SquareRootNeg equ 80h
IntegerOverflow equ 100h
StackOverflow equ 200h
StackUnderflow equ 400h
UStatMask equ 1FFFh ; user status flags
MemoryOperand equ 2000h ; special instruction flags
Reexecuted equ 4000h
; floating point error signals (also used as DOS return code)
errInvalid equ 81h ; sorted as above
errDenormal equ 82h
errZeroDivide equ 83h
errOverflow equ 84h
errUnderflow equ 85h
errPrecision equ 86h
errUnemulated equ 87h
errSquareRootNeg equ 88h
errIntegerOverflow equ 89h
errStackOverflow equ 8Ah
errStackUnderflow equ 8Bh
subttl emintern.asm - Emulator interrupt frame
page
; define emulator interrupt frame
ifdef i386
ifdef XENIX
; 386 frame for XENIX
frame struc ; emulator interrupt frame
regEAX dd ? ; 386 registers
regECX dd ?
regEDX dd ?
regEBX dd ?
regESP dd ?
regEBP dd ?
regESI dd ?
regEDI dd ?
regSegOvr dw ?,? ; segment override for bp relative EAs
regES dw ?,?
regDS dw ?,?
regAX dw ?,? ; original EAX - stuff area for FSTSW AX
regSS dd ? ; need to save ss
regEIP dd ?
regCS dw ?,?
regFlg dd ?
frame ends
else
; 386 frame
frame struc ; emulator interrupt frame
regEAX dd ? ; 386 registers
regECX dd ?
regEDX dd ?
regEBX dd ?
regESP dd ?
regEBP dd ?
regESI dd ?
regEDI dd ?
regSegOvr dw ?,? ; segment override for bp relative EAs
regES dw ?,?
regDS dw ?,?
regAX dw ?,? ; original EAX - stuff area for FSTSW AX
regEIP dd ?
regCS dw ?,?
regFlg dd ?
frame ends
endif
else
; 286 frame
frame struc ; emulator interrupt frame
regBP dw ?
regSegOvr dw ? ; segment override for bp relative EAs
regBX dw ?
regCX dw ?
regDX dw ?
regSI dw ?
regDI dw ?
regDS dw ?
regES dw ?
regAX dw ?
regIP dw ?
regCS dw ?
regFlg dw ?
frame ends
endif ;i386
subttl emintern.asm - User Memory Management Macros
page
;*********************************************************************;
; ;
; User Memory Management Macros ;
; ;
;*********************************************************************;
; All user data access uses these five macros.
; Load user memory word at (DS:)SI to AX register; smash AX only
LDUS2AX MACRO
lods word ptr es:[esi] ; 12 move word from ES:SI to AX
ENDM
; Store word from AX to user memory at (ES:)DI; smash AX only
STAX2US MACRO
stos word ptr es:[edi] ; 10 move word from AX to ES:DI
ENDM
; Move user memory word at (DS:)SI to local at (ES:)DI; smash AX only
MVUS2DI MACRO
movs word ptr es:[edi],word ptr ds:[esi] ; 18 move word from DS:SI to ES:DI
ENDM
; Move local word at (DS:)SI to user memory at (ES:)DI; smash AX only
MVSI2US MACRO
movs word ptr es:[edi],word ptr ds:[esi] ; 18 move word from DS:SI to ES:DI
ENDM
; Move local word at (CS:)SI to user memory at (ES:)DI; smash AX only
csMVSI2US MACRO
movs word ptr es:[edi],word ptr cs:[esi]
ENDM