52 lines
		
	
	
	
		
			658 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
	
		
			658 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
.define .mlu
 | 
						|
.sect .text
 | 
						|
.sect .rom
 | 
						|
.sect .data
 | 
						|
.sect .bss
 | 
						|
 | 
						|
 ! entry : d0 multiplicand
 | 
						|
 !         d1 multiplier
 | 
						|
 ! exit  : d0 high order result
 | 
						|
 !         d1 low order result
 | 
						|
 | 
						|
	.sect .text
 | 
						|
.mlu:
 | 
						|
	movem.l	d3/d4/d6,-(sp)
 | 
						|
	move.l	16(sp),d1
 | 
						|
	move.l	20(sp),d0
 | 
						|
	cmp.l	#32768,d0
 | 
						|
	bgt	1f
 | 
						|
	cmp.l	#32768,d1
 | 
						|
	bls	2f
 | 
						|
1:
 | 
						|
	move.l	d1,d3
 | 
						|
	move.l	d1,d2
 | 
						|
	swap	d2
 | 
						|
	move.l	d2,d4
 | 
						|
	mulu	d0,d1
 | 
						|
	mulu	d0,d2
 | 
						|
	swap	d0
 | 
						|
	mulu	d0,d3
 | 
						|
	mulu	d4,d0
 | 
						|
	clr.l	d6
 | 
						|
	swap	d1
 | 
						|
	add	d2,d1
 | 
						|
	addx.l	d6,d0
 | 
						|
	add	d3,d1
 | 
						|
	addx.l	d6,d0
 | 
						|
	swap	d1
 | 
						|
	clr	d2
 | 
						|
	clr	d3
 | 
						|
	swap	d2
 | 
						|
	swap	d3
 | 
						|
	add.l	d2,d0
 | 
						|
	add.l	d3,a0
 | 
						|
	bra	3f
 | 
						|
2:	mulu	d0,d1
 | 
						|
	clr	d0
 | 
						|
3:
 | 
						|
	movem.l	(sp)+,d3/d4/d6
 | 
						|
	move.l	(sp)+,a0
 | 
						|
	add	#8,sp
 | 
						|
	jmp	(a0)
 | 
						|
.align 2
 |