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 / ZSYS / SIMTEL20 / SYSLIB / SLIB3.LBR / SMTH11.Z80 < prev    next >
Text File  |  2000-06-30  |  2KB  |  96 lines

  1. ;
  2. ; SYSLIB Module Name:  SMTH11
  3. ; Author:  Richard Conn
  4. ; SYSLIB Version Number:  3.6
  5. ; Module Version Number:  1.1
  6.  
  7.     public    mulhd
  8.  
  9. ;
  10. ;  MULHD -- MULTIPLY HL BY DE, RESULT IN HL
  11. ;    CARRY SET MEANS OVERFLOW
  12. ;    A IS DESTROYED
  13. ;
  14. MULHD:
  15.     PUSH    AF
  16.     PUSH    BC    ; SAVE REGS
  17.     PUSH    DE
  18.     XOR    A    ; SET NO OVFL
  19.     LD    (OVFL),A
  20.     PUSH    HL    ; SAVE HL
  21.     LD    HL,0    ; ZERO LONG ACC
  22.     LD    (ACC),HL
  23.     POP    HL    ; GET HL
  24.     LD    B,16    ; 16 LOOPS
  25. MLHD:
  26.     CALL    SHFTRH    ; SHIFT RIGHT MULTIPLIER
  27.     JP    NC,MLHD1    ; DON'T ADD IN IF LSB IS ZERO
  28.     PUSH    HL    ; SAVE VALUE
  29.     LD    HL,(ACC)
  30.     LD    A,L    ; ADD IN MULTIPLICAND
  31.     ADD    A,E
  32.     LD    L,A
  33.     LD    A,H
  34.     ADC    A,D
  35.     LD    H,A
  36.     LD    (ACC),HL    ; NEW ACCUMULATED VALUE
  37.     JP    NC,MLHD0
  38.     LD    A,0FFH    ; SET OVFL FLAG
  39.     LD    (OVFL),A
  40. MLHD0:
  41.     POP    HL    ; GET VALUE
  42. MLHD1:
  43.     EX    DE,HL    ; SHIFT LEFT MULTIPLICAND
  44.     CALL    SHFTLH
  45.     EX    DE,HL
  46.     DEC    B    ; COUNT DOWN
  47.     JP    NZ,MLHD
  48.     POP    DE    ; RESTORE REGS
  49.     POP    BC
  50.     LD    HL,(ACC)    ; GET RESULT
  51.     LD    A,(OVFL)    ; OVERFLOW?
  52.     OR    A    ; 0=NO
  53.     JP    Z,OKRET
  54. OVFLRET:
  55.     POP    AF    ; GET PSW
  56.     SCF        ; SET CARRY
  57.     RET
  58. OKRET:
  59.     POP    AF
  60.     OR    A    ; CLEAR CARRY
  61.     RET
  62.  
  63. ;
  64. ;  SHIFT ROUTINES
  65. ;
  66. SHFTRH:            ; SHIFT RIGHT
  67.     PUSH    AF
  68.     AND    A    ; CLEAR CARRY
  69.     LD    A,H    ; SHIFT HIGH
  70.     RRA        ; ROTATE 9-BIT ACC RIGHT
  71.     LD    H,A
  72.     LD    A,L    ; SHIFT LOW
  73.     RRA
  74.     LD    L,A
  75.     JP    NC,OKRET
  76.     JP    OVFLRET
  77. SHFTLH:            ; SHIFT LEFT
  78.     PUSH    AF
  79.     AND    A    ; CLEAR CARRY
  80.     LD    A,L    ; SHIFT LOW
  81.     RLA        ; ROTATE 9-BIT ACC LEFT
  82.     LD    L,A
  83.     LD    A,H    ; SHIFT HIGH
  84.     RLA
  85.     LD    H,A
  86.     JP    NC,OKRET
  87.     JP    OVFLRET
  88.  
  89. ;
  90. ;  BUFFERS
  91. ;
  92. ACC:    DS    2    ; TEMP ACCUMULATOR
  93. OVFL:    DS    1    ; OVERFLOW FLAG
  94.  
  95.     END
  96.