mtfloat.asm
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:5k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. TITLE MTFLOAT - Floating call helper functions
  2. ;***
  3. ; MTFLOAT - Float call helper functions
  4. ;
  5. ; Copyright <C> 1986, Microsoft Corporation
  6. ;
  7. ;Purpose:
  8. ; The majority of floating point math support for the runtime is via
  9. ; 'Float Calls', i.e., calls to floating point routines at a level
  10. ; that utilize an 80[2]87 if present, and the emulator mathpack if not.
  11. ; Functions in this module augment those float calls to provide
  12. ; additional functionality not provided by the current float call
  13. ; interface.
  14. ;
  15. ;******************************************************************************
  16. INCLUDE switch.inc
  17. INCLUDE rmacros.inc ;Runtime Macro Defintions
  18. USESEG <DV_TEXT>
  19. USESEG MT
  20. USESEG _DATA
  21. USESEG _BSS
  22. INCLUDE seg.inc
  23. INCLUDE compvect.inc ; component dispatch vectors
  24. INCLUDE idmac.inc
  25. INCLUDE rtps.inc
  26. sBegin DV_TEXT 
  27. externNP B$NearRet ;for disp vectors in compvect.inc
  28. sEnd DV_TEXT 
  29. sBegin _DATA
  30. externW B$AC
  31. externW B$DAC
  32. sEnd _DATA
  33. sBegin _BSS
  34. externB b$VTYP
  35. sEnd _BSS
  36. externFP B$FIST ; IEEE round to nearest integer in DX:AX
  37. sBegin MT_TEXT
  38. ASSUMES CS,MT_TEXT
  39. externNP B$ERR_TM
  40. ;***
  41. ;B$fmldw - push integer in BX onto top of numeric stack (ST0)
  42. ;Purpose:
  43. ; This routine is used as an interface to __fldw when the
  44. ; 2-byte integer is already in a register.
  45. ;Entry:
  46. ; BX contains the 2-byte integer to be put on the numeric stack.
  47. ;Exit:
  48. ; ST0 contains floating point equivalent of the given integer.
  49. ;Preserves:
  50. ; SI, DI, BX
  51. ;******************************************************************************
  52. cProc B$fmldw,<NEAR,PUBLIC> 
  53. cBegin
  54. push bx ; put integer in memory
  55. mov bx,sp ; bx = address of integer
  56. fild word ptr [bx] ; load integer
  57. pop bx ; restore BX
  58. cEnd
  59. ;***
  60. ;B$fmlds - push s.p. number in CXDX onto top of numeric stack (ST0)
  61. ;Purpose:
  62. ; This routine is used as an interface to __flds when the
  63. ; 4-byte real is already in registers.
  64. ;Entry:
  65. ; CXDX contains the 4-byte s.p. number; the high byte is in CH,
  66. ; low byte is in DL.
  67. ;Exit:
  68. ; ST0 contains floating point equivalent of the given s.p. number.
  69. ;Preserves:
  70. ; SI, DI, CX, DX
  71. ;******************************************************************************
  72. cProc B$fmlds,<NEAR,PUBLIC> 
  73. cBegin
  74. PUSH CX ;push high word first
  75. PUSH DX
  76. MOV BX,SP ;now BX points to s.p. number
  77. fld dword ptr [bx] ; load number into ST0
  78. add sp,4 ; reset SP
  79. cEnd
  80. ;***
  81. ;B$ftolrup - Round ST0 up and pop, result in DX:AX
  82. ;Purpose:
  83. ; This routine acts the same as __ftol, except the number is rounded
  84. ; up instead of being truncated toward zero.
  85. ;Entry:
  86. ; ST0 contains number to pop and round up.
  87. ;Exit:
  88. ; ST0 is popped, rounded 32-bit integer equivalent in DX:AX
  89. ;Preserves:
  90. ; SI, DI, BX, CX
  91. ;******************************************************************************
  92. cProc B$ftolrup,<NEAR,PUBLIC>
  93. cBegin
  94. call B$FIST ; temp (incorrect) rounding hack
  95. cEnd
  96. ;***
  97. ;B$ftolrnd - Round ST0 to nearest integer & pop, result in DX:AX
  98. ;Purpose:
  99. ; This routine acts the same as __ftol, except the number is rounded
  100. ; to the nearest integer (rounded to even number if equidistant) instead
  101. ; of being truncated toward zero.
  102. ;Entry:
  103. ; ST0 contains number to pop and round.
  104. ;Exit:
  105. ; ST0 is popped, rounded 32-bit integer equivalent in DX:AX
  106. ;Preserves:
  107. ; SI, DI, BX, CX
  108. ;******************************************************************************
  109. cProc B$ftolrnd,<NEAR,PUBLIC>
  110. cBegin
  111. call B$FIST
  112. cEnd
  113. ;***
  114. ;B$FRCINT - Force to integer routine compiler runtime interface routine
  115. ; Purpose:
  116. ;    Convert contents of floating point accumulator to integer as
  117. ;    follows:  Determine the type of variable contained in the FAC by
  118. ;    checking the contents of b$VTYP.  If the variable is a string
  119. ;    (b$VTYP = 3), issue a type mismatch error.  If b$VTYP is greater
  120. ;    than 3, assume single precision and return the integer equivalent
  121. ;    in BX.  If the b$VTYP is less than 3, assume integer and simply
  122. ;    move the leftmost two bytes of the FAC contents to BX.
  123. ;
  124. ; Entry:
  125. ;  FAC contains a variable, b$VTYP contains its type (integer is type 2,
  126. ;  string is type 3, single precision is type 4, double precision is type
  127. ;   8). Most often the variable in the FAC is a single precision number.
  128. ; Exit:
  129. ; BX = integer result
  130. ; If no error occurred, b$VTYP = 2.
  131. ; Preserves:
  132. ; ES,SI,DI
  133. ;****
  134. cProc B$FRCINT,<NEAR,PUBLIC>
  135. cBegin
  136. MOV BX,OFFSET DGROUP:B$AC
  137. MOV DL,[b$VTYP]
  138. CMP DL,VT_SD ; Is value type less than or equal to 3?
  139. JNB ISFLPT ;No: assume it is single precision
  140. JZ STRERR ;String: type mismatch error
  141. MOV BX,[BX]  ;Put integer in BX
  142. RET
  143. STRERR:  ;String: issue type mismatch error
  144. JMP B$ERR_TM ;Type mismatch error routine
  145. ISFLPT:  ;Floating pt number in accumulator
  146. PUSH ES ;save across float calls
  147. PUSH BX ;save pointer to B$AC
  148. CMP DL,VT_R4
  149. JNZ FRC_DUBL ;brif vtyp not s.p.
  150. fld dword ptr [bx] ; load s.p. number to ST0
  151. JMP SHORT FRC_CONT
  152. FRC_DUBL:
  153. DbAssertRelB DL,z,8d,MT_TEXT,<MTFLOAT.ASM: B$FRCINT: invalid var type>
  154. fld qword ptr [bx] ; load d.p. number to ST0
  155. FRC_CONT:
  156. CALL B$ftolrnd ;DX:AX = integer equiv. of number
  157. AND DX,08000H ; mask off all but sign bit
  158. OR AX,DX ;mask sign bit into 2-byte integer
  159. POP BX ;BX points to B$AC
  160. POP ES
  161. MOV [BX],AX  ;save integer in B$AC
  162. XCHG AX,BX ;BX is retval
  163. MOV [b$VTYP],VT_I2 ; Make value type integer
  164. cEnd
  165. sEnd MT_TEXT
  166. END