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: