1
0

setprec.87 2.9 KB

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