home *** CD-ROM | disk | FTP | other *** search
/ norge.freeshell.org (192.94.73.8) / 192.94.73.8.tar / 192.94.73.8 / pub / computers / cpm / alphatronic / PASCALZ4.ZIP / D3 / MPNORM.SRC < prev    next >
Text File  |  1999-04-05  |  2KB  |  64 lines

  1. ;MULT.PRECISION ADD AND SUB. AND NORMALIZE A FLOATING POINT NUMBER
  2. ;
  3.     NAME MPNORM
  4.     ENTRY .MPADD,.MPSUB,.FNORM
  5.     EXT .FPERR
  6.     INCLUDE FPINIT.SRC
  7. ;
  8. ;THIS IS MOD MPNORM, SO..
  9. $FNORM    SET    0FFFFH
  10. ;
  11.     INCLUDE FPMAC.SRC
  12. ;
  13. ;
  14. ; multiple precision op, (de) <op> (hl) -> (de)
  15. ;
  16. .mpadd:    xra    a        ;clear carry
  17.     push    b        ;save b
  18.     mvi    b,fracln    ;add all bytes
  19. mpadd1:    ldax    d        ;get byte from op1
  20.     adc    m        ;add byte from op2
  21.     stax    d        ;store it
  22.     inx    h        ;bump pointers
  23.     inx    d
  24.     djnz    mpadd1        ;any more?
  25.     pop    b        ;restore b
  26.     ret            ;no, return
  27.  
  28. .mpsub:    xra    a        ;clear carry
  29.     push    b        ;save b
  30.     mvi    b,fracln
  31. mpsub1:    ldax    d        ;get byte from op1
  32.     sbb    m        ;subtract byte from op2
  33.     stax    d        ;store it
  34.     inx    h        ;bump pointers
  35.     inx    d
  36.     djnz    mpsub1        ;any more?
  37.     pop    b        ;restore b
  38.     ret            ;no, return
  39. ;
  40. ; normalize a floating point number
  41. ;
  42. .fnorm:    xra    a        ;clear acc
  43.     mov    scr1(x),a    ;set sign indicator to +ve num
  44.     bit    sign,msb(y)    ;test sign of number
  45.     jrz    posit        ;it's positive
  46.     inr    scr1(x)        ;negative...set sign indicator
  47.     res    sign,msb(y)    ;and negate fraction
  48. posit:    zchk    y        ;check number = 0
  49.     jrnz    fpanz        ;..fpacc <> 0
  50.     mvi    exp(y),0    ;set exp = 0
  51.     ret
  52. fpanz:    bit    sign-1,msb(y)    ;check msb
  53.     jrnz    allrot        ;all rotated
  54.     rotate    y,left        ;rotate left until msb is a one
  55.     dcr    exp(y)        ;adjust exponent
  56.     jv    .fperr        ;floating point error
  57.     jr    fpanz        ;try again
  58. allrot:    dcr    scr1(x)        ;check sign indicator
  59.     rnz            ;positive number, return
  60.     bset    sign,msb(y)    ;negate number and return
  61.     ret
  62.  
  63. ;
  64.