Multiply 16x16 bit from
;malin@onspec.co.uk
;unsigned multiply of a2:a1 with b2:b1 leaving result in res4:res3:res2:res1
; These 8 variables need to be defined
;
; Program length 32 line
; time 129 to 228 cycles
; This program looks at the lsb of a1 to decide whether to add b1 to res2
;
; and b2 to res3, with appropriate carrys
; It then looks at the lsb of a2 to decide whether to add b1 to res3 and
; b2 to res4, again with appropriate carrys.
; The rotates then only have to be done 8 times
;
; This is uses slightly more program but takes a little less time than
; a routine that performs one 16 bit addition per rotate and 16 rotates
;
; Multiple byte addition routine from Microchip AN617
; Result registers used as loop counter from Bob Fehrenbach & Scott Dattalo
;
clrf res4
clrf res3
clrf res2
movlw 0x80
movwf res1
nextbit
rrf a2,f
rrf a1,f
btfss status, carry
goto nobit_l
movf b1,w
addwf res2,f
movf b2, w
btfsc status, carry
incfsz b2, w
addwf res3, f
btfsc status, carry
incf res4, f
bcf status, carry
nobit_l
btfss a1, 7
goto nobit_h
movf b1,w
addwf res3,f
movf b2, w
btfsc status, carry
incfsz b2, w
addwf res4, f
nobit_h
rrf res4,f
rrf res3,f
rrf res2,f
rrf res1,f
btfss status, carry
goto nextbit