home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wunderki.zip / WE87.ASM < prev    next >
Assembly Source File  |  1993-08-16  |  2KB  |  198 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Turbo Pascal Run-time Library                   *
  5. ; *    Windows Emulator Interface            *
  6. ; *                            *
  7. ; *     Copyright (c) 1988,92 Borland International     *
  8. ; *                            *
  9. ; *******************************************************
  10.  
  11.     TITLE    WE87
  12.  
  13.     INCLUDE    SE.ASM
  14.  
  15. DATA    SEGMENT    WORD PUBLIC
  16.  
  17. ; Local workspace
  18.  
  19. TempLong    DD    ?        ;Temporary longword
  20. CtrlWord    DW    ?        ;Saved control word
  21.  
  22. DATA    ENDS
  23.  
  24. CODE    SEGMENT    BYTE PUBLIC
  25.  
  26.     ASSUME    CS:CODE,DS:DATA
  27.  
  28. ; Externals
  29.  
  30.     EXTRN    HaltError:NEAR,__F87_Sine:NEAR,__F87_Cosine:NEAR
  31.     EXTRN    __F87_ArcTan:NEAR,__F87_Log:NEAR,__F87_Exp:NEAR
  32.  
  33. ; Publics
  34.  
  35.     PUBLIC    FTrunc,FRound,FInt,FSqrt,FSin,FCos,FArcTan,FLn
  36.     PUBLIC    FExp,FFrac,FRealExt,FExtReal
  37.  
  38. ; Chop rounding control word
  39.  
  40. CWChop        DW    1F3FH
  41.  
  42. ; Convert Real to Extended
  43.  
  44. FRealExt:
  45.  
  46.     OR    AL,AL
  47.     JE    @@1
  48.     XOR    CL,CL
  49.     MOV    CH,AH
  50.     MOV    AH,DH
  51.     AND    AH,80H
  52.     ADD    AX,3F7EH
  53.     OR    DH,80H
  54.     PUSH    AX
  55.     PUSH    DX
  56.     PUSH    BX
  57.     PUSH    CX
  58.     XOR    CX,CX
  59.     PUSH    CX
  60.     MOV    BX,SP
  61.     FLD    TBYTE PTR SS:[BX]
  62.     FWAIT
  63.     ADD    SP,10
  64.     RETF
  65. @@1:    FLDZ
  66.     RETF
  67.  
  68. ; Convert Extended to Real
  69.  
  70. FExtReal:
  71.  
  72.     SUB    SP,10
  73.     MOV    BX,SP
  74.     FSTP    TBYTE PTR SS:[BX]
  75.     FWAIT
  76.     ADD    SP,2
  77.     POP    CX
  78.     POP    BX
  79.     POP    DX
  80.     POP    AX
  81.     MOV    DI,AX
  82.     AND    AX,7FFFH
  83.     SUB    AX,3F7EH
  84.     JBE    @@2
  85.     OR    AH,AH
  86.     JNE    @@4
  87.     MOV    AH,CH
  88.     SHL    CL,1
  89.     ADC    AH,0
  90.     ADC    BX,0
  91.     ADC    DX,0
  92.     JC    @@3
  93. @@1:    SHL    DX,1
  94.     SHL    DI,1
  95.     RCR    DX,1
  96.     RETF
  97. @@2:    XOR    AX,AX
  98.     XOR    BX,BX
  99.     XOR    DX,DX
  100.     RETF
  101. @@3:    INC    AL
  102.     JNE    @@1
  103. @@4:    MOV    AX,205
  104.     JMP    HaltError
  105.  
  106. ; Trunc function
  107.  
  108. FTrunc:
  109.  
  110.     FSTCW    CtrlWord
  111.     FLDCW    CWChop
  112.     FISTP    TempLong
  113.     FWAIT                ;486 needs FWAIT before FLDCW
  114.     FLDCW    CtrlWord
  115.     MOV    AX,TempLong.w0
  116.     MOV    DX,TempLong.w2
  117.     RETF
  118.  
  119. ; Round function
  120.  
  121. FRound:
  122.  
  123.     FISTP    TempLong
  124.     FWAIT
  125.     MOV    AX,TempLong.w0
  126.     MOV    DX,TempLong.w2
  127.     RETF
  128.  
  129. ; Int function
  130.  
  131. FInt:
  132.  
  133.     FSTCW    CtrlWord
  134.     FLDCW    CWChop
  135.     FRNDINT
  136.     FWAIT                ;486 needs FWAIT before FLDCW
  137.     FLDCW    CtrlWord
  138.     RETF
  139.  
  140. ; Frac function
  141.  
  142. FFrac:
  143.  
  144.     FSTCW    CtrlWord
  145.     FLDCW    CWChop
  146.     FLD    ST(0)
  147.     FRNDINT
  148.     FSUB
  149.     FWAIT                ;486 needs FWAIT before FLDCW
  150.     FLDCW    CtrlWord
  151.     RETF
  152.  
  153. ; Sqrt function
  154.  
  155. FSqrt:
  156.  
  157.     FSQRT
  158.     RETF
  159.  
  160. ; Sin function
  161.  
  162. FSin:
  163.  
  164.     CALL    __F87_Sine
  165.     RETF
  166.  
  167. ; Cos function
  168.  
  169. FCos:
  170.  
  171.     CALL    __F87_Cosine
  172.     RETF
  173.  
  174. ; ArcTan function
  175.  
  176. FArcTan:
  177.  
  178.     CALL    __F87_ArcTan
  179.     RETF
  180.  
  181. ; Ln function
  182.  
  183. FLn:
  184.  
  185.     CALL    __F87_Log
  186.     RETF
  187.  
  188. ; Exp function
  189.  
  190. FExp:
  191.  
  192.     CALL    __F87_Exp
  193.     RETF
  194.  
  195. CODE    ENDS
  196.  
  197.     END
  198.