; MuluL är en sölig (kortare) version av MuluLong 
; DivuLong är också ganska sölig
; Jag vet inte om de funkar helt (orkar inte testa), men de funkar
; iallafall ibland (hehe).

	move.l	#10000,d0
	move.l	#5,d1
	bsr	DivuLong
	rts


; ----------------------------------------------------------------------------
;           d0 - Number to multiply
;           d1 - Other number
; ---------------------------------------------------------------------------- 
MuluL:
	cmp.l	#0,d1		; Check if value is zero
	bhi	.EjKlar		; Exit if so.
	moveq.l	#0,d0
	bra	.Klar
.EjKlar:
	moveq.l	#0,d2		; Cl
	subq.l	#1,d1
.loop:
	add.l	d0,d2
	dbra	d1,.loop
	move.l	d2,d0
.Klar:
	rts

; ----------------------------------------------------------------------------
;                           d0 - Number to multiply         (32-bit)
;                           d1 - Number to multiply with    (16-bit)
; ----------------------------------------------------------------------------

MuluLong:
	movem.l	d2-d6,-(sp)	; Save registers
	move.w	#0,d5		; Clear Carry
	move.w	d0,d2		; Get lower word
	mulu	d1,d2		; Multiply lower word
	move.w	d2,d6		; Save result
	swap	d2		; Swap d2 to test
	tst.w	d2		; if there is any Carry
	beq	.NoCarry	; No Carry!
	move.w	d2,d5		; Save Carry
.NoCarry:
	swap	d0		; Swap to get higher word
	move.w	d0,d2		; Get higher word
	mulu	d1,d2		; Multiply h.w
	swap	d6		; Swap result register
	move.w	d2,d6		; Move result to register
	add.w	d5,d6		; Add Carry
	swap	d6		; Get normal order
	move.l	d6,d0		; Save result
	movem.l	(sp)+,d2-d6
	rts
; ----------------------------------------------------------------------------
;                           d0 - Number to divide
;                           d1 - Number to divide with
; ----------------------------------------------------------------------------
DivuLong:
	move.l	d2,-(sp)		; Save registers
	moveq.l	#0,d2			; Reset result

	cmp	#0,d1			; We don't want any division by zero,
	bls	.Slut			; it returns just a 'Konsum-märke'

	cmp	#0,d0			; Check if zero, then answer must
	bls	.Slut			; be zero, no need to calculate.
.Loop:
	addq.l	#1,d2			; Add 1 to result
	sub.l	d1,d0			; Subtract d1 from d0
	cmp.l	#1,d0
	bpl	.Loop

	cmp.l	#0,d0
	bge	.Slut
	subq.l	#1,d2
.Slut:
	move.l	d2,d0

	move.l	(sp)+,d2
	rts
