home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / MATH / QMUL.MAC < prev    next >
Text File  |  2000-06-30  |  4KB  |  143 lines

  1.     TITLE    'QMUL  -  Quick 16 x 16 multiply'
  2.     NAME    ('QMUL')
  3.     .Z80
  4.  
  5. ;****************************************************************
  6. ;                                *
  7. ;  QMUL  -  Quick 16 x 16 Multiply                *
  8. ;                                *
  9. ;===============================================================*
  10. ;                                *
  11. ;         By:           Jon Tara                *
  12. ;                          MicroControl Software            *
  13. ;            1300 E. Lafayette #2808            *
  14. ;            Detroit, Michigan  48207        *
  15. ;            (313) 393-2916                *
  16. ;                                *
  17. ;        This software is placed in the public domain.        *
  18. ;                                *
  19. ;===============================================================*
  20. ;                                *
  21. ;  On entry:  DE = Multiplicand                    *
  22. ;          HL = Multiplier                    *
  23. ;                                *
  24. ;  On exit:   BCDE = Product                    *
  25. ;                                *
  26. ;  Time:  Worst case - 704 cycles = 176 uSec (4 mHz Z80)    *
  27. ;                                *
  28. ;  AF destroyed                            *
  29. ;                                *
  30. ;  Revision 1.00  01/21/82  JT  Initial Release            *
  31. ;                                *
  32. ;****************************************************************
  33.  
  34.     PUBLIC    QMUL
  35.     CSEG
  36.  
  37. QMUL:
  38.     PUSH    HL        ; Save multiplier.
  39.     LD    C,H        ; Save MSBs of multiplier.  
  40.     LD    A,L        ; LSBs to A for an 8 x 16 multiply. 
  41.  
  42.     LD    B,0        ; Handy 0 to B for carry propagation.
  43.     LD    H,B        ; Init LSBs of product.
  44.     LD    L,B
  45.  
  46.     ADD    A,A        ; Test multiplier bit.
  47.     JR    NC,$+4   
  48.     ADD    HL,DE        ; Add multiplicand to product. 
  49.     ADC    A,B        ; (Product in AHL)  
  50.     ADD    HL,HL        ; Shift product left.
  51.     ADC    A,A        ; Test multiplier bit.
  52.     JR    NC,$+4   
  53.     ADD    HL,DE        ; Add multiplicand to product. 
  54.     ADC    A,B        ; (Product in AHL)  
  55.     ADD    HL,HL        ; Shift product left.
  56.     ADC    A,A        ; Test multiplier bit.
  57.     JR    NC,$+4   
  58.     ADD    HL,DE        ; Add multiplicand to product. 
  59.     ADC    A,B        ; (Product in AHL)  
  60.     ADD    HL,HL        ; Shift product left.
  61.     ADC    A,A        ; Test multiplier bit.
  62.     JR    NC,$+4   
  63.     ADD    HL,DE        ; Add multiplicand to product. 
  64.     ADC    A,B        ; (Product in AHL)  
  65.     ADD    HL,HL        ; Shift product left.
  66.     ADC    A,A        ; Test multiplier bit.
  67.     JR    NC,$+4   
  68.     ADD    HL,DE        ; Add multiplicand to product. 
  69.     ADC    A,B        ; (Product in AHL)  
  70.     ADD    HL,HL        ; Shift product left.
  71.     ADC    A,A        ; Test multiplier bit.
  72.     JR    NC,$+4   
  73.     ADD    HL,DE        ; Add multiplicand to product. 
  74.     ADC    A,B        ; (Product in AHL)  
  75.     ADD    HL,HL        ; Shift product left.
  76.     ADC    A,A        ; Test multiplier bit.
  77.     JR    NC,$+4   
  78.     ADD    HL,DE        ; Add multiplicand to product. 
  79.     ADC    A,B        ; (Product in AHL)  
  80.     ADD    HL,HL
  81.     ADC    A,A
  82.  
  83.     PUSH    HL        ; Save LSBs in stack. 
  84.     LD    H,B        ; Zero second product.
  85.     LD    L,B        ; .
  86.     LD    B,A        ; Save MSBs of first product in B
  87.     LD    A,C        ; Get MSBs of multiplier. 
  88.     LD    C,H        ; Handy 0 in C this time.
  89.  
  90.     ADD    A,A        ; Test multiplier bit.
  91.     JR    NC,$+4   
  92.     ADD    HL,DE        ; Add multiplicand to product. 
  93.     ADC    A,C        ; (Product in AHL)  
  94.     ADD    HL,HL        ; Shift product left.
  95.     ADC    A,A        ; Test multiplier bit.
  96.     JR    NC,$+4   
  97.     ADD    HL,DE        ; Add multiplicand to product. 
  98.     ADC    A,C        ; (Product in AHL)  
  99.     ADD    HL,HL        ; Shift product left.
  100.     ADC    A,A        ; Test multiplier bit.
  101.     JR    NC,$+4   
  102.     ADD    HL,DE        ; Add multiplicand to product. 
  103.     ADC    A,C        ; (Product in AHL)  
  104.     ADD    HL,HL        ; Shift product left.
  105.     ADC    A,A        ; Test multiplier bit.
  106.     JR    NC,$+4   
  107.     ADD    HL,DE        ; Add multiplicand to product. 
  108.     ADC    A,C        ; (Product in AHL)  
  109.     ADD    HL,HL        ; Shift product left.
  110.     ADC    A,A        ; Test multiplier bit.
  111.     JR    NC,$+4   
  112.     ADD    HL,DE        ; Add multiplicand to product. 
  113.     ADC    A,C        ; (Product in AHL)  
  114.     ADD    HL,HL        ; Shift product left.
  115.     ADC    A,A        ; Test multiplier bit.
  116.     JR    NC,$+4   
  117.     ADD    HL,DE        ; Add multiplicand to product. 
  118.     ADC    A,C        ; (Product in AHL)  
  119.     ADD    HL,HL        ; Shift product left.
  120.     ADC    A,A        ; Test multiplier bit.
  121.     JR    NC,$+4   
  122.     ADD    HL,DE        ; Add multiplicand to product. 
  123.     ADC    A,C        ; (Product in AHL)  
  124.     ADD    HL,HL 
  125.     ADC    A,A
  126.  
  127.     POP    DE        ; Fetch LSBs of 1st product. 
  128.     LD    C,A        ; Add partial products.
  129.     LD    A,D        ; .
  130.     ADD    A,L        ; .
  131.     LD    D,A        ; .
  132.     LD    A,B        ; .
  133.     ADC    A,H        ; .
  134.     LD    H,A        ; .
  135.     LD    A,C        ; .
  136.     ADC    A,0        ; .
  137.     LD    B,A        ; .
  138.     LD    C,H        ; .
  139.     POP    HL        ; Restore multiplier.
  140.     RET    
  141.  
  142.     END
  143.