windows-nt/Source/XPSP1/NT/base/mvdm/wow16/win87em/emlstmp.asm

184 lines
3.2 KiB
NASM
Raw Normal View History

2020-09-26 03:20:57 -05:00
page ,132
subttl emlstmp.asm - Load/Store Temp Real Numbers
;***
;emlstmp.asm - Load/Store Temp Real Numbers
;
; Copyright (c) 1986-89, Microsoft Corporation
;
;Purpose:
; Load/Store Temp Real Numbers
;
; This Module contains Proprietary Information of Microsoft
; Corporation and should be treated as Confidential.
;
;Revision History:
; See emulator.hst
;
;*******************************************************************************
ProfBegin LSTMP
;*********************************************************************;
; ;
; Load 80 Bit Temp Real ;
; ;
;*********************************************************************;
;
; ES:SI: memory address of 80 bit tempreal
pub eFLDtemp
MOV edi,esi ; Get a new stack element and leave
PUSHST
XCHG edi,esi
mov ax,es
mov dx,ds
mov es,dx
mov ds,ax
MVUS2DI ; Move 8 bytes of mantissa to TOS
MVUS2DI
MVUS2DI
MVUS2DI
mov ax,es
mov dx,ds
mov es,dx
mov ds,ax
LDUS2AX ; Fetch exponent
SUB edi,8 ; Reset pointer to TOS
XCHG esi,edi ; Now DS:SI points to TOS
MOV DH,AH ; Exponent and Sign to DX
AND DH,Sign ; Mask to Sign only
MOV Flag[esi],DH
AND AH,7FH ; Mask out sign
XOR DH,DH ; Set Tag to valid non-zero
CMP AX,IexpMax
JE short TNANorInf
CMP AX,IexpMin
JE short TZeroOrDenorm
SUB AX,IexpBias
pub TStoreExpnTag
MOV Expon[esi],AX
MOV Tag[esi],DH
RET
pub TNANorInf
MOV AX,IexpMax - IexpBias
MOV DH,Special
CMP MB6[esi],8000H ; Test for Infinity
JNE short TStoreExpnTag
MOV BP,MB4[esi]
OR BP,MB2[esi]
OR BP,MB0[esi]
JNZ TStoreExpnTag
OR DH,ZROorINF
JMP TStoreExpnTag
pub TZeroOrDenorm
MOV BP,MB6[esi]
OR BP,MB4[esi]
OR BP,MB2[esi]
OR BP,MB0[esi]
JNZ short TDenormal
pub TZero
MOV AX,IexpMin - IexpBias
MOV DH,ZROorINF
JMP TStoreExpnTag
pub TDenormal
OR [CURerr],Underflow+Precision ; Say it underflowed - set it to 0
XOR BP,BP
MOV MB0[esi],BP
MOV MB2[esi],BP
MOV MB4[esi],BP
MOV MB6[esi],BP
JMP TZero
PAGE
;*********************************************************************;
; ;
; Store 80 Bit Temp Real (& POP since only FSTP supported for temp) ;
; ;
;*********************************************************************;
;
; ES:SI: memory address of 80 bit tempreal
pub TNANorINFST
TEST BH,ZROorINF
JNZ short TInfST
pub TNANST
MVSI2US ; copy mantissa
MVSI2US
MVSI2US
MVSI2US
MOV AX,IexpMax ; Set maximum mantissa
OR AH,DH ; Overstore proper sign
STAX2US
POPST
RET
pub TInfST
XOR AX,AX
STAX2US
STAX2US
STAX2US
MOV AX,8000H
STAX2US
MOV AX,IexpMax ; Set maximum mantissa
OR AH,DH ; Overstore proper sign
STAX2US
POPST
RET
pub TSpecialST
TEST BH,Special
JNZ TNANorINFST
pub TzeroST
XOR AX,AX
STAX2US
STAX2US
STAX2US
STAX2US
STAX2US
POPST
RET
pub eFSTtemp
MOV edi,esi
MOV esi,[CURstk]
MOV AX,Expon[esi] ; Adjust exponent of TOS
ADD AX,IexpBias
MOV DH,Flag[esi]
if fastSP
TEST DH,Single
JZ TD1
MOV word ptr MB0[esi],0
MOV word ptr MB2[esi],0
MOV byte ptr MB4[esi],0
TD1:
endif
AND DH,Sign ; Mask to sign only
OR AH,DH
MOV BH,Tag[esi] ; See if it is a special case
OR BH,BH
JNZ TSpecialST
MVSI2US ; Move Mantissa
MVSI2US
MVSI2US
MVSI2US
STAX2US ; Move Exponent & Sign
SUB esi,8 ; Reset pointer to TOS
POPSTsi
RET
ProfEnd LSTMP