SX Microcontroller Math Method

24x24 multiplication

from Nikolai Golovchenko

Product         DS      6
Multipland      DS      3
BitCount        DS      1


Multiplier      equ     Product+3       ;3 bytes shared with Product's
                                        ;less significant bytes (+3...5)

MULTIPLY_24x24
        ; preload values to test
        mov     W, #$AB
        mov     Multipland, W
        mov     W, #$CD
        mov     Multipland+1, W
        mov     W, #$EF
        mov     Multipland+2, W

        mov     W, #$98
        mov     Multiplier, W
        mov     W, #$76
        mov     Multiplier+1, W
        mov     W, #$54
        mov     Multiplier+2, W

        ; these values should generate the reply = $6651AF33BC6C

;24 x 24 Multiplication
;Input:
; Multiplier - 3 bytes (shared with Product)
; Multiplicand - 3 bytes (not modified)
;Temporary:
; Bitcount
;Output:
; Product - 6 bytes

        clr     Product ; clear destination
        clr     Product+1
        clr     Product+2


        mov     W, #24
        mov     BitCount, W     ; number of bits

        rr      Product+3       ;shift out to carry
        rr      Product+4       ;next multiplier bit
        rr      Product+5

ADD_LOOP_24x24

        jnc     SKIP_LOOP_24x24 ; if carry is set we must add
                                ; multipland
                                ; to the product
        
        mov     W, Multipland+2 ; get LSB of multiplicand
        add     Product+2, W    ; add it to the lsb of the product

        mov     W, Multipland+1 ; middle byte
        snb     C               ; check carry for overflow
        movsz   W, ++Multipland+1 ; if carry set we add one to the source
        add     Product+1, W    ; and add it  (if not zero, in
                                ; that case mulitpland = $ff->$00 )

        mov     W, Multipland   ; MSB byte
        snb     C               ; check carry
        movsz   W, ++Multipland
        add     Product, W      ; 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

        rr      Product
        rr      Product+1
        rr      Product+2
        rr      Product+3
        rr      Product+4
        rr      Product+5

        decsz   BitCount
        jmp     ADD_LOOP_24x24
        ret



Questions: