home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / squsq / fcrnch11.lbr / IDIV.MZC / IDIV.MAC
Text File  |  1986-12-24  |  2KB  |  76 lines

  1.     extrn    .c2bc
  2. ;
  3. ; unsigned integer divide
  4. ; (de) := (dehl) DIV (bc)
  5. ; (hl) := (dehl) MOD (bc)
  6. ; carry for overflow (or zero divide)
  7. ;    when registers unchanged
  8. ; divisor, remainder and quoutient range 0 to 65535
  9. ; dividend range 0 to 4295*10^6 (approx)
  10. ; f, d, e, h, l
  11. .idiv::    ora    a;        clear any cy
  12.     push    psw;        save (a)
  13.     mov    a,e;        check for overflow
  14.     sub    c
  15.     mov    a,d
  16.     sbb    b
  17.     jnc    errexit;    overflow or divide by zero
  18.     xchg    
  19.     push    b
  20.     call    dvstep;        div into hi 3 bytes of dividend
  21.     mov    e,a
  22.     call    dvstepm;    next 8 bits of quoutient
  23.     mov    e,a
  24.     pop    b
  25.     pop    psw
  26.     ret
  27. ;
  28. ; error exit from various routines
  29. errexit:
  30.     pop    psw
  31.     stc
  32.     ret
  33. ;
  34. ; unsigned divide, 24 bit by 16 bit
  35. ; no overflow checks.
  36. ; (a) := (hld) / (bc)
  37. ; (hl) := (hld) MOD (bc)
  38. ; (d) := (e on entry)
  39. ; a,f,b,c,d,e,h,l
  40. dvstep:    call    .c2bc;        (bc) := -(bc)
  41. ;    "    "
  42. ; same, divides by -(bc)
  43. ; a,f,d,e,h,l
  44. dvstepm:
  45.     mov    a,d;        low order dividend byte
  46.     mov    d,e;        save lo dividend or hi quoutient byte
  47.     mvi    e,9;        loop counter
  48. dvstep2:
  49.     dcr    e
  50.     rz;            done
  51.     dad    h;        l shift dividend
  52.     jc    dvstep5;    1 bit out, generate 1 bit
  53.     add    a;        l shift lo dividend, quoutient
  54.     jnc    dvstep3
  55.     inx    h;        propagate into (hl)
  56. dvstep3:
  57.     push    h;        save for restoration
  58.     dad    b;        trial
  59.     jc    dvstep4;    succeeds, generate 1 bit
  60.     pop    h;        fails, restore, generate 0 bit
  61.     jmp    dvstep2
  62. dvstep4:
  63.     inx    sp;        clean stack
  64.     inx    sp;        of saved partial dividend
  65.     inr    a;        generate 1 bit
  66.     jmp    dvstep2
  67. dvstep5:
  68.     adc    a;        finish dividend shift, 1 bit generate
  69.     jnc    dvstep6
  70.     inx    h;        propagate cy
  71. dvstep6:
  72.     dad    b;        subtraction
  73.     jmp    dvstep2
  74.  
  75.     end
  76. 4