home *** CD-ROM | disk | FTP | other *** search
- 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
-
- POP DE ; Fetch LSBs of 1st product.
- LD C,A ; Add partial products.
- LD A,D ; .
- ADD A,L ; .
- LD D,A ; .
- LD A,B ; .
- ADC A,H ; .
- LD H,A ; .
- LD A,C ; .
- ADC A,0 ; .
- LD B,A ; .
- LD C,H ; .
- POP HL ; Restore multiplier.
- RET
-
- END