Atmel AVR Microcontroller Basic Math Code Library

for Multiplication

Multiply 16 bits by 16 bits in software by http://elm-chan.org/

;-----------------------------------------------------------------------------:
; 16bit x 16bit unsigned multiply
;
; Register Variables
;  Call:  var1[1:0] = 16bit multiplicand
;         var1[3:2] = <don't care>
;         var2[1:0] = 16bit multiplier
;         lc        = <don't care> (high register must be allocated)
;
;  Result:var1[3:0] = 32bit result of var1[1:0] * var2[1:0]
;         var2[1:0] = <not changed>
;         lc        = 0
;
; Size  = 13 words
; Clock = 157..172 cycles (+ret)
; Stack = 0 byte


mul16u:		sub	var13,var13	;initialize variables
		sub	var12,var12	;
		ldi	lc,17		; lc = 17;
		brcc	PC+3		;---- calcurating loop
		add	var12,var20	;
		adc	var13,var21	;
		ror	var13		;
		ror	var12		;
		ror	var11		;
		ror	var10		;
		dec	lc		;if (--lc > 0)
		brne	PC-8		; continue loop;
		ret



mul16s:		clr	lc		; Optional fast signed helper
		clr	var12		;  process with fast unsinged routine
		tst	var11
		brpl	PC+6
		inc	var12
		com	var10
		com	var11
		adc	var10,lc
		adc	var11,lc
		tst	var21
		brpl	PC+6
		inc	var12
		com	var20
		com	var21
		adc	var20,lc
		adc	var21,lc
		bst	var12,0
		rcall	mul16u
		brtc	PC+9
		com	var10
		com	var11
		com	var12
		com	var13
		adc	var10,lc
		adc	var11,lc
		adc	var12,lc
		adc	var13,lc
		ret