home *** CD-ROM | disk | FTP | other *** search
-
- ; *******************************************************
- ; * *
- ; * Turbo Pascal Run-time Library *
- ; * Windows Emulator Interface *
- ; * *
- ; * Copyright (c) 1988,92 Borland International *
- ; * *
- ; *******************************************************
-
- TITLE WE87
-
- INCLUDE SE.ASM
-
- DATA SEGMENT WORD PUBLIC
-
- ; Local workspace
-
- TempLong DD ? ;Temporary longword
- CtrlWord DW ? ;Saved control word
-
- DATA ENDS
-
- CODE SEGMENT BYTE PUBLIC
-
- ASSUME CS:CODE,DS:DATA
-
- ; Externals
-
- EXTRN HaltError:NEAR,__F87_Sine:NEAR,__F87_Cosine:NEAR
- EXTRN __F87_ArcTan:NEAR,__F87_Log:NEAR,__F87_Exp:NEAR
-
- ; Publics
-
- PUBLIC FTrunc,FRound,FInt,FSqrt,FSin,FCos,FArcTan,FLn
- PUBLIC FExp,FFrac,FRealExt,FExtReal
-
- ; Chop rounding control word
-
- CWChop DW 1F3FH
-
- ; Convert Real to Extended
-
- FRealExt:
-
- OR AL,AL
- JE @@1
- XOR CL,CL
- MOV CH,AH
- MOV AH,DH
- AND AH,80H
- ADD AX,3F7EH
- OR DH,80H
- PUSH AX
- PUSH DX
- PUSH BX
- PUSH CX
- XOR CX,CX
- PUSH CX
- MOV BX,SP
- FLD TBYTE PTR SS:[BX]
- FWAIT
- ADD SP,10
- RETF
- @@1: FLDZ
- RETF
-
- ; Convert Extended to Real
-
- FExtReal:
-
- SUB SP,10
- MOV BX,SP
- FSTP TBYTE PTR SS:[BX]
- FWAIT
- ADD SP,2
- POP CX
- POP BX
- POP DX
- POP AX
- MOV DI,AX
- AND AX,7FFFH
- SUB AX,3F7EH
- JBE @@2
- OR AH,AH
- JNE @@4
- MOV AH,CH
- SHL CL,1
- ADC AH,0
- ADC BX,0
- ADC DX,0
- JC @@3
- @@1: SHL DX,1
- SHL DI,1
- RCR DX,1
- RETF
- @@2: XOR AX,AX
- XOR BX,BX
- XOR DX,DX
- RETF
- @@3: INC AL
- JNE @@1
- @@4: MOV AX,205
- JMP HaltError
-
- ; Trunc function
-
- FTrunc:
-
- FSTCW CtrlWord
- FLDCW CWChop
- FISTP TempLong
- FWAIT ;486 needs FWAIT before FLDCW
- FLDCW CtrlWord
- MOV AX,TempLong.w0
- MOV DX,TempLong.w2
- RETF
-
- ; Round function
-
- FRound:
-
- FISTP TempLong
- FWAIT
- MOV AX,TempLong.w0
- MOV DX,TempLong.w2
- RETF
-
- ; Int function
-
- FInt:
-
- FSTCW CtrlWord
- FLDCW CWChop
- FRNDINT
- FWAIT ;486 needs FWAIT before FLDCW
- FLDCW CtrlWord
- RETF
-
- ; Frac function
-
- FFrac:
-
- FSTCW CtrlWord
- FLDCW CWChop
- FLD ST(0)
- FRNDINT
- FSUB
- FWAIT ;486 needs FWAIT before FLDCW
- FLDCW CtrlWord
- RETF
-
- ; Sqrt function
-
- FSqrt:
-
- FSQRT
- RETF
-
- ; Sin function
-
- FSin:
-
- CALL __F87_Sine
- RETF
-
- ; Cos function
-
- FCos:
-
- CALL __F87_Cosine
- RETF
-
- ; ArcTan function
-
- FArcTan:
-
- CALL __F87_ArcTan
- RETF
-
- ; Ln function
-
- FLn:
-
- CALL __F87_Log
- RETF
-
- ; Exp function
-
- FExp:
-
- CALL __F87_Exp
- RETF
-
- CODE ENDS
-
- END
-