You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.7 KiB
81 lines
1.7 KiB
subttl emfmisc.asm - FABS, FCHS, FFREE, FXCH
|
|
page
|
|
;*******************************************************************************
|
|
;emfmisc.asm - FABS, FCHS, FFREE, FXCH
|
|
;
|
|
; Microsoft Confidential
|
|
;
|
|
; Copyright (c) Microsoft Corporation 1991
|
|
; All Rights Reserved
|
|
;
|
|
;Purpose:
|
|
; FABS, FCHS, FFREE, FXCH instructions
|
|
;Inputs:
|
|
; edi = [CURstk]
|
|
; esi = pointer to st(i) from instruction field
|
|
;
|
|
;Revision History:
|
|
;
|
|
; [] 09/05/91 TP Initial 32-bit version.
|
|
;
|
|
;*******************************************************************************
|
|
|
|
|
|
;******
|
|
EM_ENTRY eFABS
|
|
eFABS:
|
|
;******
|
|
cmp EMSEG:[edi].bTag,bTAG_EMPTY
|
|
jz StackError ;in emarith.asm
|
|
mov EMSEG:[edi].bSgn,0 ;Turn sign bit off
|
|
ret
|
|
|
|
;******
|
|
EM_ENTRY eFCHS
|
|
eFCHS:
|
|
;******
|
|
cmp EMSEG:[edi].bTag,bTAG_EMPTY
|
|
jz StackError ;in emarith.asm
|
|
not EMSEG:[edi].bSgn ;Flip the sign
|
|
ret
|
|
|
|
;******
|
|
EM_ENTRY eFFREE
|
|
eFFREE:
|
|
;******
|
|
mov EMSEG:[esi].bTag,bTAG_EMPTY
|
|
ret
|
|
|
|
;******
|
|
EM_ENTRY eFXCH
|
|
eFXCH:
|
|
;******
|
|
cmp EMSEG:[esi].bTag,bTAG_EMPTY
|
|
jz XchDestEmpty
|
|
XchgChkSrc:
|
|
cmp EMSEG:[edi].bTag,bTAG_EMPTY
|
|
jz XchSrcEmpty
|
|
DoSwap:
|
|
;Swap [esi] with [edi]
|
|
mov eax,EMSEG:[edi]
|
|
xchg eax,EMSEG:[esi]
|
|
mov EMSEG:[edi],eax
|
|
mov eax,EMSEG:[edi+4]
|
|
xchg eax,EMSEG:[esi+4]
|
|
mov EMSEG:[edi+4],eax
|
|
mov eax,EMSEG:[edi+8]
|
|
xchg eax,EMSEG:[esi+8]
|
|
mov EMSEG:[edi+8],eax
|
|
ret
|
|
|
|
XchDestEmpty:
|
|
call ReturnIndefinite ;in emarith.asm - ZF set if unmasked
|
|
jnz XchgChkSrc ;Continue if masked
|
|
ret
|
|
|
|
XchSrcEmpty:
|
|
xchg edi,esi ;pass pointer in esi
|
|
call ReturnIndefinite ;in emarith.asm - ZF set if unmasked
|
|
xchg edi,esi
|
|
jnz DoSwap ;Continue if masked
|
|
ret
|