setprbor.asm 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. ;
  2. ; Borland assembler header
  3. ;
  4. ; Microsoft MASM subroutines for setting coprocessor precision
  5. ;
  6. .286
  7. .287
  8. PREC_TEXT SEGMENT BYTE PUBLIC 'CODE'
  9. PREC_TEXT ENDS
  10. DGROUP group _DATA,_BSS
  11. assume cs:PREC_TEXT,ds:DGROUP
  12. _DATA segment word public 'DATA'
  13. d@ label byte
  14. d@w label word
  15. _DATA ends
  16. _BSS segment word public 'BSS'
  17. b@ label byte
  18. b@w label word
  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. PREC_TEXT segment byte public 'CODE'
  38. assume cs:PREC_TEXT,ds:DGROUP
  39. ; Set coprocessor to single precision float
  40. PUBLIC _sprec
  41. _sprec PROC FAR
  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 far
  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 far
  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 far
  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 far
  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 far
  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 far
  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 FAR
  138. push bp
  139. mov bp,sp
  140. fld DWORD PTR [bp+6]
  141. fsqrt
  142. fwait
  143. mov sp,bp
  144. pop bp
  145. ret
  146. _sqrtf ENDP
  147. ; double precision square root
  148. ; assumes coprocessor precision already set up
  149. ; return value in static __fac
  150. PUBLIC _sqrt
  151. _sqrt PROC FAR
  152. push bp
  153. mov bp,sp
  154. fld QWORD PTR [bp+6]
  155. fsqrt
  156. fwait
  157. mov sp,bp
  158. pop bp
  159. ret
  160. _sqrt ENDP
  161. ; long double precision square root
  162. ; assumes coprocessor precision already set up
  163. ; return value in fp register
  164. PUBLIC _sqrtl
  165. _sqrtl PROC FAR
  166. push bp
  167. mov bp,sp
  168. fld tbyte ptr [bp+6]
  169. fsqrt
  170. fwait
  171. mov sp,bp
  172. pop bp
  173. ret
  174. _sqrtl ENDP
  175. PREC_TEXT ends
  176. _DATA segment word public 'DATA'
  177. s@ label byte
  178. _DATA ends
  179. PREC_TEXT segment byte public 'CODE'
  180. PREC_TEXT ends
  181. _s@ equ s@
  182. public _sprec
  183. public _dprec
  184. public _ldprec
  185. end