276 lines
5.4 KiB
NASM
276 lines
5.4 KiB
NASM
|
||
;
|
||
;
|
||
; 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
|
||
|