from Nikolai Golovchenko
cblock
Product:6
Multipland:3
BitCount:1
endc
Multiplier EQU Product+3 ;3 bytes shared with Product's
;less significant bytes (+3..5)
MULTIPLY_24x24
; preload values to test
MOVLW 0xAB
MOVWF Multipland
MOVLW 0xCD
MOVWF Multipland+1
MOVLW 0xEF
MOVWF Multipland+2
MOVLW 0x98
MOVWF Multiplier
MOVLW 0x76
MOVWF Multiplier+1
MOVLW 0x54
MOVWF Multiplier+2
; these values should generate the reply = 0x6651AF33BC6C
;24 x 24 Multiplication
;Input:
; Multiplier - 3 bytes (shared with Product)
; Multiplicand - 3 bytes (not modified)
;Temporary:
; Bitcount
;Output:
; Product - 6 bytes
CLRF Product ; clear destination
CLRF Product+1
CLRF Product+2
MOVLW D'24'
MOVWF BitCount ; number of bits
RRF Product+3,F ; shift out to carry
RRF Product+4,F ; next multiplier bit
RRF Product+5,F
ADD_LOOP_24x24
BTFSS STATUS,C ; if carry is set we must add multipland
; to the product
GOTO SKIP_LOOP_24x24 ; nope, skip this bit
MOVF Multipland+2,W ; get LSB of multiplicand
ADDWF Product+2,F ; add it to the lsb of the product
MOVF Multipland+1,W ; middle byte
BTFSC STATUS,C ; check carry for overflow
INCFSZ Multipland+1,W ; if carry set we add one to the source
ADDWF Product+1,F ; and add it (if not zero, in
; that case mulitpland = 0xff->0x00 )
MOVF Multipland,W ; MSB byte
BTFSC STATUS,C ; check carry
INCFSZ Multipland,W
ADDWF Product,F ; handle overflow
SKIP_LOOP_24x24
; note carry contains most significant bit of
; addition here
; shift in carry and shift out
; next multiplier bit, starting from less
; significant bit
RRF Product,F
RRF Product+1,F
RRF Product+2,F
RRF Product+3,F
RRF Product+4,F
RRF Product+5,F
DECFSZ BitCount,F
GOTO ADD_LOOP_24x24
RETURN
Questions:
Nikolai Golovchenko's 24 x 24 multiplication function does not work as listed and appears is in-complete !!! Multipler is define but never used as well as Product is not define but goes potluck. zeroes.
James Newton replies: Product is defined in the cblock at the beginning and Multiplier is used because it is actually part of Product. Works fine as far as I can tell.