PIC Microcontoller Math Method

24x24 multiplication

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: