
		;   D0/D1
		;
		;   (c)Copyright 1990, Matthew Dillon, All Rights Reserved

		section text,code

		xdef	__divu
		xdef	_hyper__divu

_hyper__divu:
__divu:

		tst.l	D1
		beq	du5
		swap	D1
		tst.w	D1
		bne	du100	; 32/32 -> 16

		move.l	D2,-(sp)

		swap	D1

		move.l	D0,D2
		divu	D1,D2	; 32/16 -> 16r:16q
		bvs	du10
		move.l	D2,D1
		clr.w	D1
		swap	D1	; D1 = remainder
		moveq.l #0,D0
		move.w	D2,D0	; D0 = quotient
		move.l	(sp)+,D2
		rts

du5		move.l	D0,D1	; remainder = numerator
		moveq.l #-1,D0	; quotient = illegal
		rts

		;   D0:32/D1:16 = :32, remainder = SWAP D2

du10		move.l	D3,-(sp)
		;;clr.w   D2	      ; D2 = r.0
		;;swap	  D2	      ; D2 = remainder.l
		;;move.l  D2,-(sp)
		;;sub.l   D2,D0       ; D0 = D0 - remainder (new numerator)
		move.l	D0,D2
		clr.w	D2
		swap	D2	    ; D2 = 0.msb of new numerator
		divu	D1,D2	    ; D2 = r.qmsb
		move.w	D2,D3
		swap	D3
		clr.w	D3	    ; D3 = qmsb.0

		move.w	D0,D2	    ; D2 = r.nlsb
		divu	D1,D2	    ; D2 = r.qlsb

		move.w	D2,D3
		move.l	D3,D0	    ; D0 = quotient
		clr.w	D2
		swap	D2
		move.l	D2,D1	    ; D1 = remainder

		move.l	(sp)+,D3
		move.l	(sp)+,D2
		rts

		;   32/32 -> 32 , D1 in lsb.msb order	(D0.32 / D1.32)

du100		movem.l D2-D4,-(sp)

		move.l	D0,D2
		clr.w	D2
		swap	D2	    ; D2 = numerator 0.msb
		divu	D1,D2	    ; 0.msb / x.msb, D2.w = result
		move.w	D2,D3

		moveq.l #0,D2
		move.w	D3,D2	    ; D2.l = result (0.result)

		mulu.w	D1,D3	    ; D3.l = D1.w.msb x result (0.msb x)
		swap	D1	    ; D1 now in msb.lsb order
		move.w	D2,D4
		mulu.w	D1,D4	    ; D4.l = D1.w.lsb x result (0.lsb x)
		swap	D3	    ; D3 = msb.0 x
		add.l	D4,D3	    ; D3 = multiplication result
		sub.l	D3,D0	    ; D0 = D0 - D3.
		bmi	du150
		move.l	D0,D1	    ; D1 = remainder
		move.l	D2,D0	    ; D0 = quotient
		movem.l (sp)+,D2-D4
		rts
du150		subq.l	#1,D2	    ; D0 is negative, add D1 until it becomes +
		add.l	D1,D0
		bmi	du150
		move.l	D0,D1	    ; D1 = remainder
		move.l	D2,D0	    ; D0 = quotient
		movem.l (sp)+,D2-D4
		rts

		END



