home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
pascal
/
bp7os2
/
os2rtl
/
sys
/
we87.asm
< prev
next >
Wrap
Assembly Source File
|
1993-08-16
|
2KB
|
198 lines
; *******************************************************
; * *
; * 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