posted to PICList
Something like this:
--------------------
mult24x8:
clrf prod0 ; Clear the product
clrf prod1
clrf prod2
clrf prod3
clrf twofour3 ; Clear the top byte of the multiplicand
multloop:
movf eight,W ; Check to see if eight bit is empty
btfsc STATUS,Z ; Done if zero
return
bcf STATUS,C ; clear carry
rrl eight,F ; Get the next bit
btfss STATUS,C ; Add if carry is set
goto multshift ; shift only if 0
movf twofour0,W ; Add the 32 bits of multiplicand to product
addwf prod0,F ; each addwf sets the carry
btfsc STATUS,C ; Don't increment if no carry
call carryprop1 ; Propigate carry to next byte(s)
movf twofour1,W ;
addwf prod1,F ;
btfsc STATUS,C ; Don't increment if no carry
call carryprop2 ; Propigate carry to next byte(s)
movf twofour2,W ;
addwf prod2,F ;
btfsc STATUS,C ; Don't increment if no carry
incf prod3,F ; Add one to next byte if carry occured
movf twofour3,W ;
addwf prod3,F ;
multshift:
bcf STATUS,C ; clear carry
rlf twofour0,F ; Shift the 24 bits one bit to the left
rlf twofour1,F
rlf twofour2,F
rlf twofour3,F
goto multloop
carryprop1:
incfsz prod1,F
return
carryprop2:
incfsz prod2,F
return
carryprop3:
incf prod3,F
return
------------------------------------------------------------
I wrote this off the top of my head and I haven't tested it, but it should be
in the ballpark.
Not speedy, but should work.