windows-nt/Source/XPSP1/NT/multimedia/directx/dxg/d3d8/util/texdiff.inc
2020-09-26 16:20:57 +08:00

79 lines
1.7 KiB
PHP

;----------------------------------------------------------------------------
;
; texdiff.inc
;
; Assembly macro for TextureDiff.
;
; Copyright (C) Microsoft Corporation, 1997.
;
;----------------------------------------------------------------------------
IFNDEF __TEXDIFF_INC__
__TEXDIFF_INC__ EQU 1
;----------------------------------------------------------------------------
;
; TEXTURE_DIFF
;
; Computes difference of two texture coordinates and returns it on
; the top of the FP stack.
;
; Destroys eax and ecx.
;
;----------------------------------------------------------------------------
TEXTURE_DIFF MACRO fTb, fTa, iMode, fTmp
LOCAL L_Exit, L_Ltz, L_Gtz, L_Zero, L_Straight
; Start initial fTb - fTa computation.
fld fTb
fsub fTa
; Check for wrapping.
cmp iMode, 0
jz L_Exit
; Compute smaller of straight or wrapped difference.
fst fTmp
fld st(0)
; Adjust straight difference according to sign to compute
; wrapped difference.
mov eax, fTmp
cmp eax, 080000000h
ja L_Ltz
cmp eax, 0
je L_Zero
; Gtz
fsub _g_fOne
jmp L_Gtz
L_Ltz:
fadd _g_fOne
L_Zero:
and eax, 07fffffffh
L_Gtz:
fst fTmp
mov ecx, fTmp
and ecx, 07fffffffh
; Pick smaller based on absolute values of differences.
cmp eax, ecx
jle L_Straight
; Discard straight difference so wrapped difference is
; returned.
fxch st(1)
L_Straight:
; Discard wrapped difference so straight difference is
; returned.
fstp st(0)
L_Exit:
ENDM
ENDIF