TITLE 'QMUL - Quick 16 x 16 multiply'
NAME ('QMUL')
.Z80
;****************************************************************
; *
; QMUL - Quick 16 x 16 Multiply *
; *
;===============================================================*
; *
; By: Jon Tara *
; MicroControl Software *
; 1300 E. Lafayette #2808 *
; Detroit, Michigan 48207 *
; (313) 393-2916 *
; *
; This software is placed in the public domain. *
; *
;===============================================================*
; *
; On entry: DE = Multiplicand *
; HL = Multiplier *
; *
; On exit: BCDE = Product *
; *
; Time: Worst case - 704 cycles = 176 uSec (4 mHz Z80) *
; *
; AF destroyed *
; *
; Revision 1.00 01/21/82 JT Initial Release *
; *
;****************************************************************
PUBLIC QMUL
CSEG
QMUL:
PUSH HL ; Save multiplier.
LD C,H ; Save MSBs of multiplier.
LD A,L ; LSBs to A for an 8 x 16 multiply.
LD B,0 ; Handy 0 to B for carry propagation.
LD H,B ; Init LSBs of product.
LD L,B
ADD A,A ; Test multiplier bit.
JR NC,$+4
ADD HL,DE ; Add multiplicand to product.
ADC A,B ; (Product in AHL)
ADD HL,HL ; Shift product left.
ADC A,A ; Test multiplier bit.
JR NC,$+4
ADD HL,DE ; Add multiplicand to product.
ADC A,B ; (Product in AHL)
ADD HL,HL ; Shift product left.
ADC A,A ; Test multiplier bit.
JR NC,$+4
ADD HL,DE ; Add multiplicand to product.
ADC A,B ; (Product in AHL)
ADD HL,HL ; Shift product left.
ADC A,A ; Test multiplier bit.
JR NC,$+4
ADD HL,DE ; Add multiplicand to product.
ADC A,B ; (Product in AHL)
ADD HL,HL ; Shift product left.
ADC A,A ; Test multiplier bit.
JR NC,$+4
ADD HL,DE ; Add multiplicand to product.
ADC A,B ; (Product in AHL)
ADD HL,HL ; Shift product left.
ADC A,A ; Test multiplier bit.
JR NC,$+4
ADD HL,DE ; Add multiplicand to product.
ADC A,B ; (Product in AHL)
ADD HL,HL ; Shift product left.
ADC A,A ; Test multiplier bit.
JR NC,$+4
ADD HL,DE ; Add multiplicand to product.
ADC A,B ; (Product in AHL)
ADD HL,HL
ADC A,A
PUSH HL ; Save LSBs in stack.
LD H,B ; Zero second product.
LD L,B ; .
LD B,A ; Save MSBs of first product in B
LD A,C ; Get MSBs of multiplier.
LD C,H ; Handy 0 in C this time.
ADD A,A ; Test multiplier bit.
JR NC,$+4
ADD HL,DE ; Add multiplicand to product.
ADC A,C ; (Product in AHL)
ADD HL,HL ; Shift product left.
ADC A,A ; Test multiplier bit.
JR NC,$+4
ADD HL,DE ; Add multiplicand to product.
ADC A,C ; (Product in AHL)
ADD HL,HL ; Shift product left.
ADC A,A ; Test multiplier bit.
JR NC,$+4
ADD HL,DE ; Add multiplicand to product.
ADC A,C ; (Product in AHL)
ADD HL,HL ; Shift product left.
ADC A,A ; Test multiplier bit.
JR NC,$+4
ADD HL,DE ; Add multiplicand to product.
ADC A,C ; (Product in AHL)
ADD HL,HL ; Shift product left.
ADC A,A ; Test multiplier bit.
JR NC,$+4
ADD HL,DE ; Add multiplicand to product.
ADC A,C ; (Product in AHL)
ADD HL,HL ; Shift product left.
ADC A,A ; Test multiplier bit.
JR NC,$+4
ADD HL,DE ; Add multiplicand to product.
ADC A,C ; (Product in AHL)
ADD HL,HL ; Shift product left.
ADC A,A ; Test multiplier bit.
JR NC,$+4
ADD HL,DE ; Add multiplicand to product.
ADC A,C ; (Product in AHL)
ADD HL,HL
ADC A,A