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.