;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