home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
math
/
qmul.mac
< prev
next >
Wrap
Text File
|
1994-07-13
|
4KB
|
143 lines
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