;A neat Multiply routine, from Peter Hemsley 15July01.

;Multiply 16 bit multiplicand (mulcL,H) by 16 bit multiplier (mulpL,H)
;32 bit result (product) in mulpL,H (low word) and prodL,H (high word)

	processor 16f84
	include p16f84.inc
	radix dec

;Ram equates
mulcL	equ	0xC		;Multiplicand
mulcH	equ	0xD		;Multiplicand
mulpL	equ	0xE		;Multiplier and low word of product
mulpH	equ	0xF		;Multiplier and low word of product
prodL	equ	0x10		;High word of product
prodH	equ	0x11		;High word of product
bitcnt	equ	0x12		;Loop counter


mulc	equ	65535		;Test code for MPLAB simulator
mulp	equ	65534
	org	0
test	movlw	low mulc
	movwf	mulcL
	movlw	high mulc
	movwf	mulcH
	movlw	low mulp
	movwf	mulpL
	movlw	high mulp
	movwf	mulpH
	call	mult
brk1	return


mult	movlw	16		;16 bit multiplication
	movwf	bitcnt
	clrf	prodL		;Clear result
	clrf	prodH

mtloop	clrc
	btfss	mulpL,0		;Test multiplier bit
	goto	shftpr
	movfw	mulcL		;If multiplier bit is a 1 then
	addwf	prodL		;add multiplicand to partial product
	movfw	mulcH
	skpnc
	goto	addc
	addwf	prodH
	goto	shftpr
addc	addwf	prodH
	incf	prodH
	skpnz
	setc

shftpr	rrf	prodH		;Right shift partial product (and multiplier)
	rrf	prodL
	rrf	mulpH
	rrf	mulpL

	decfsz	bitcnt
	goto	mtloop
	return

	end
