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: