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
|
|||
|
|