51 lines
		
	
	
	
		
			812 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
	
		
			812 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
.define .mlu2
 | 
						|
.sect .text
 | 
						|
.sect .rom
 | 
						|
.sect .data
 | 
						|
.sect .bss
 | 
						|
.sect .text
 | 
						|
 | 
						|
! 16 bits unsigned multiply routine
 | 
						|
! Expects operands on stack
 | 
						|
! Yields result in de-registers
 | 
						|
! This routine could also be used for signed integers, but it won't
 | 
						|
! because there is a more clever one just for signed integers.
 | 
						|
 | 
						|
.mlu2:
 | 
						|
	pop h
 | 
						|
	shld .retadr
 | 
						|
	mov h,b
 | 
						|
	mov l,c
 | 
						|
	shld .bcreg
 | 
						|
 | 
						|
	pop b		! bc = multiplier
 | 
						|
	pop d		! de = multiplicand
 | 
						|
	lxi h,0		! hl = product
 | 
						|
 | 
						|
1:	mov a,b		! if multiplier = 0 then finished
 | 
						|
	ora c
 | 
						|
	jz 3f
 | 
						|
 | 
						|
	xra a		! reset carry
 | 
						|
	mov a,b		! shift multiplier right
 | 
						|
	rar
 | 
						|
	mov b,a
 | 
						|
	mov a,c
 | 
						|
	rar
 | 
						|
	mov c,a
 | 
						|
 | 
						|
	jnc 2f		!if carry set: add multiplicand to product
 | 
						|
	dad d
 | 
						|
 | 
						|
2:	xchg		! shift multiplicand left
 | 
						|
	dad h
 | 
						|
	xchg
 | 
						|
	jmp 1b		! keep looping
 | 
						|
 | 
						|
3:	xchg		! de becomes product
 | 
						|
 | 
						|
	lhld .bcreg
 | 
						|
	mov b,h
 | 
						|
	mov c,l
 | 
						|
	lhld .retadr
 | 
						|
	pchl
 |