home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / astrnomy / de118i.zip / SETPREC.87 < prev    next >
Text File  |  1993-02-24  |  3KB  |  176 lines

  1. ;
  2. ; Microsoft MASM subroutines for setting coprocessor precision
  3. ;
  4. .286
  5. .287
  6. _TEXT    SEGMENT  BYTE PUBLIC 'CODE'
  7. _TEXT    ENDS
  8. CONST    SEGMENT  WORD PUBLIC 'CONST'
  9. CONST    ENDS
  10. _BSS    SEGMENT  WORD PUBLIC 'BSS'
  11. _BSS    ENDS
  12. _DATA    SEGMENT  WORD PUBLIC 'DATA'
  13. _DATA    ENDS
  14. DGROUP    GROUP    CONST,    _BSS,    _DATA
  15.     ASSUME  CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
  16. EXTRN    __fac:QWORD
  17.  
  18. _BSS      SEGMENT
  19. EXTRN    __fltused:NEAR
  20. _BSS      ENDS
  21.  
  22.  
  23. ; exception masks (1 = masked)
  24. ;   1  invalid operation
  25. ;   2  denormalized operand
  26. ;   4  zero divide
  27. ;   8  overflow
  28. ;  10  underflow
  29. ;  20  precision
  30.  
  31. _DATA SEGMENT
  32.  
  33. ; double precision setting
  34. ;;ctlwrd dw 01230h ; note this traps on denormal operands!
  35. ;;ctld dw 0133fh   ; this doesn't trap
  36. ctld dw 01230h
  37.  
  38. ; single precision
  39. ctls dw 01030h
  40.  
  41. ; long double precision
  42. ctlld dw 01320h
  43.  
  44. _DATA ENDS
  45.  
  46.     ASSUME  CS: _TEXT
  47.  
  48. _TEXT SEGMENT
  49. ; Set coprocessor to single precision float
  50.     PUBLIC    _sprec
  51. _sprec    PROC NEAR
  52.     fclex
  53.     fwait
  54.     finit
  55.     fwait
  56.     fldcw word ptr ctls
  57.     fwait
  58.     ret
  59. _sprec ENDP
  60.  
  61. ; set coprocessor to long double precision
  62.     PUBLIC    _ldprec
  63. _ldprec PROC NEAR
  64.     fclex
  65.     fwait
  66.     finit
  67.     fwait
  68.     fldcw word ptr ctlld
  69.     fwait
  70.     ret
  71. _ldprec ENDP
  72.  
  73. ; set coprocessor to double precision
  74.     PUBLIC    _dprec
  75. _dprec PROC NEAR
  76.     fclex
  77.     fwait
  78.     finit
  79.     fwait
  80.     fldcw word ptr ctld
  81.     fwait
  82.     ret
  83. _dprec ENDP
  84.  
  85.  
  86. ; get a double promoted to long double size
  87. ; getld( &doub, &ldoub );
  88.     PUBLIC    _getld
  89. _getld    PROC NEAR
  90.     push bp
  91.     mov bp,sp
  92.     push bx
  93.     mov bx, word ptr [bp+4]
  94. ;    fld st(0)
  95.     fld qword ptr [bx]
  96.     mov bx, word ptr [bp+6]
  97.     fstp tbyte ptr [bx]
  98.     mov bx, word ptr [bp+4]
  99.     fld qword ptr [bx]
  100.     mov bx, word ptr [bp+8]
  101.     fstp qword ptr [bx]
  102.     pop bx
  103.     pop bp
  104.     ret
  105. _getld    ENDP
  106.  
  107.     PUBLIC    _getprec
  108. _getprec    PROC NEAR
  109.     push bp
  110.     mov bp,sp
  111.     sub sp,4
  112.     fstcw [bp-4]
  113.     fwait
  114.     mov ax,[bp-4]
  115.     add sp,4
  116.     pop bp
  117.     ret
  118. _getprec    ENDP
  119.  
  120. ; single precision square root
  121. ; assumes coprocessor precision already set up
  122. ; return value in static __fac
  123.     PUBLIC    _sqrtf
  124. _sqrtf    PROC NEAR
  125.     push bp
  126.     mov bp,sp
  127.     fld    DWORD PTR [bp+4]
  128.     fsqrt
  129.     fwait    
  130.     fstp    DWORD PTR __fac
  131.     mov    ax,OFFSET __fac
  132.     mov    sp,bp
  133.     pop bp
  134.     ret
  135. _sqrtf    ENDP
  136.  
  137.  
  138. ; double precision square root
  139. ; assumes coprocessor precision already set up
  140. ; return value in static __fac
  141.     PUBLIC    _sqrt
  142. _sqrt    PROC NEAR
  143.     push bp
  144.     mov bp,sp
  145.     fld    QWORD PTR [bp+4]
  146.     fsqrt
  147.     fwait    
  148.     fstp    QWORD PTR __fac
  149.     mov    ax,OFFSET __fac
  150.     mov    sp,bp
  151.     pop bp
  152.     ret
  153. _sqrt    ENDP
  154.  
  155.  
  156. ; long double precision square root
  157. ; assumes coprocessor precision already set up
  158. ; return value in fp register
  159.     PUBLIC    _sqrtl
  160. _sqrtl    PROC NEAR
  161.     push bp
  162.     mov bp,sp
  163.     fldt    TBYTE PTR [bp+4]
  164.     fsqrt
  165.     fwait    
  166.     mov    sp,bp
  167.     pop bp
  168.     ret
  169. _sqrtl    ENDP
  170.  
  171.  
  172. _TEXT ENDS
  173. END
  174.  
  175.  
  176.