home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / asm / wasm / convert2.inc < prev    next >
Text File  |  1988-03-02  |  4KB  |  133 lines

  1. ;=============================================================================
  2. ; 8087 Number Conversion Routines
  3. ;
  4. ; These are routines to convert from floating point to integer numbers. All
  5. ; registers are preserved except those used to return parameters. All
  6. ; parameters are passed through registers. It is assumed that DS = ES = CS.
  7.  
  8. ;================================================
  9. ; Convert a floating point real number to a
  10. ; decimal integer and a base ten exponent.
  11. ; Expects the number to be converted in ST and
  12. ; the number of significant bits (i.e. bits to
  13. ; place in the significand) in AX.  The
  14. ; significand integer value is returned in ST
  15. ; and the signed exponent is returned in AX.
  16.  
  17. Flt2dec Proc Near
  18.  Push Bp
  19.  Sub Sp, 8
  20.  Mov Bp, Sp
  21.  
  22.  Fstcw Word [Bp]        ;save control word
  23.  Mov Word [Bp+2], 03bfh ;new control word, round to nearest
  24.  Fldcw Word [Bp+2]      ;load control word
  25.  Mov Word [Bp+4], Ax
  26.  
  27. ;--- convert number
  28.  
  29.  Fld St(0)
  30.  Fxtract                ;extract exponent
  31.  Fstp St(0)             ;pop top (significand)
  32.  Fisubr Word [Bp+4]     ;subtract bits for significand
  33.  Fldl2t                 ;load log2(10)
  34.  Fdiv                   ;divide, get 10**X
  35.  Frndint                ;round to nearest
  36.  Fist Word [Bp+6]       ;save exponent
  37.  Call Exp10             ;get exponent factor
  38.  Fmul                   ;adjust real number for exponent
  39.  
  40. ;--- finished
  41.  
  42.  Fldcw Word [Bp]        ;restore control word
  43.  Add Sp, 6
  44.  Pop Ax
  45.  Neg Ax
  46.  Pop Bp
  47.  Ret
  48.  Endp           ;Flt2dec
  49.  
  50. ;================================================
  51. ; Calculate 10 to the power of ST. Return result
  52. ; in ST. Uses 10**N = 2**(N*Log2(10)).
  53.  
  54. Exp10 Proc Near
  55.  Fldl2t         ;load Log2(10)
  56.  Fmul           ;multiply
  57.  Call Exp2      ;raise 2 to ST power.
  58.  Ret
  59.  Endp           ;Exp10
  60.  
  61. ;================================================
  62. ; Calculate 2 to the power of ST. Return result
  63. ; in ST(0).
  64.  
  65. Exp2 Proc Near
  66.  Push Bp
  67.  Sub Sp, 6              ;room for local data
  68.  Mov Bp, Sp             ;start of local data
  69.  
  70.  Fstcw Word [Bp]        ;save control word
  71.  Mov Word [Bp+2], 03bfh ;new control word, round to nearest
  72.  Fldcw Word [Bp+2]      ;load control word
  73.  
  74. ;--- for 2**X, where X = W + F or X = W - F, where W is a whole number and
  75. ;--- F is between 0 and .5 (inclusive), ST gets F and ST(1) gets W
  76.  
  77.  Fld St(0)              ;duplicate number
  78.  Frndint                ;round to integer, ST => W
  79.  Fxch                   ;exchange
  80.  Fsub St, St(1)         ;get difference, ST => F
  81.  
  82. ;--- check sign of fractional portion (F)
  83.  
  84.  Ftst                   ;set flags
  85.  Fstsw Word [Bp+4]      ;save flags
  86.  Fwait
  87.  And Byte [Bp+5], 45h   ;mask relevant bits
  88.  Cmp Byte [Bp+5], 1     ;check negative bit
  89.  Ja Exp2err             ;jump if other bits set, error
  90.  Je Exp2neg             ;jump if negative
  91.  
  92. ;--- fractional part is positive for
  93.  
  94.  F2xm1                  ;ST => (2**F) - 1
  95.  Fld1                   ;load one
  96.  Fadd                   ;ST => 2**F
  97.  Fxch                   ;put whole portion (W) on top
  98.  Fld1                   ;load one
  99.  Fscale                 ;ST => 2**W
  100.  Fmulp St(2), St        ;ST(2) => (2**F) * (2**W)
  101.  Fstp St(0)             ;pop stack
  102.  Jmps Exp2don
  103.  
  104. ;--- fractional part is negative
  105.  
  106. Exp2neg
  107.  Fabs                   ;take absolute value
  108.  F2xm1                  ;ST => (2**F) - 1
  109.  Fld1                   ;load one
  110.  Fadd                   ;ST => 2**F
  111.  Fxch                   ;put whole portion (W) on top
  112.  Fld1                   ;load one
  113.  Fscale                 ;ST => 2**W
  114.  Fdivrp St(2), St       ;ST(2) => (2**W) / (2**F)
  115.  Fstp St(0)             ;pop stack
  116.  
  117. ;--- finished
  118.  
  119. Exp2don
  120.  Fldcw Word [Bp]        ;restore control word
  121.  Add Sp, 6
  122.  Pop Bp
  123.  Ret
  124.  
  125. ;--- zero or error
  126.  
  127. Exp2err
  128.  Fstp St(0)
  129.  Fstp St(0)     ;clear stack
  130.  Fld1           ;return one
  131.  Jmps Exp2don
  132.  Endp           ;Exp2
  133.