
   xdef     ldivs
   xdef     ldivu
   xdef     lmulu   * really signed
   xdef     lmoddivu

   section  one

* divide D1 by D2
* quotient in D1; remainder in D0
lmoddivu
   cmp.l     #$00FFFF,D2
   bgt       .bigdiv
   move.w    D1,A1
   clr.w     D1
   swap      D1
   divu      D2,D1
   move.l    D1,D0
   swap      D1
   move.w    A1,D0
   divu      D2,D0
   move.w    D0,D1
   clr.w     D0
   swap      D0
   rts       
.bigdiv
   move.l    D1,D0
   clr.w     D0
   swap      D0
   swap      D1
   clr.w     D1
   move.l    D2,A1
   moveq     #$0F,D2
1$ add.l     D1,D1
   addx.l    D0,D0
   cmp.l     D0,A1
   bgt       2$
   sub.l     A1,D0
   addq.w    #1,D1
2$ dbra      D2,1$
   rts       

lmulu
   move.l    D2,-(SP)
   move.l    D0,D2
   mulu      D1,D2
   move.l    D2,A0
   move.l    D0,D2
   swap      D2
   mulu      D1,D2
   swap      D1
   mulu      D1,D0
   add.l     D2,D0
   swap      D0
   clr.w     D0
   add.l     D0,A0
   move.l    A0,D0
   move.l    (SP)+,D2
   rts       

* remainder after unsigned divide D0 by D1

*   move.l    D2,-(SP)
*   move.l    D1,D2
*   move.l    D0,D1
*   bsr       lmoddivu
*   move.l    (SP)+,D2
*   rts       

* unsigned divide D0 by D1
ldivu
   move.l    D2,-(SP)
   move.l    D1,D2
   move.l    D0,D1
   bsr       lmoddivu
   move.l    D1,D0
   move.l    (SP)+,D2
   rts

* signed remainder after signed divide D0 by D1
*   move.l    D2,-(SP)
*   move.l    D1,D2
*   bge       lab736A
*   neg.l     D2
*lab736A
*   move.l    D0,D1
*   moveq     #0,D0
*   tst.l     D1
*   bge       lab7376
*   neg.l     D1
*   not.l     D0
*lab7376
*   move.l    D0,A0
*   bsr       lmoddivu
*   move.w    A0,D2
*   beq       lab7382
*   neg.l     D0
*lab7382
*   move.l    (SP)+,D2
*   rts       

ldivs
   move.l    D2,-(SP)
   move.l    D0,A0
   moveq     #0,D0
   move.l    D1,D2
   bge       1$      same as bpl
   neg.l     D2
   not.l     D0
1$ move.l    A0,D1
   bge       2$      same as bpl
   neg.l     D1
   not.l     D0
2$ move.l    D0,A0
   bsr       lmoddivu
   move.l    A0,D2
   beq       3$      were signs the same?
   neg.l     D1
3$ move.l    D1,D0
   move.l    (SP)+,D2
   rts

   end

