Applied patch #2762516
[fw/sdcc] / device / lib / z80 / mul.s
index 424554a732d994920348a779be65c34f3a2c466f..e81ac80040b958cb5be49d3e9b458f748d5900d7 100644 (file)
         .area   _CODE
 
-; This multiplication routine is similar to the one
-; from Rodnay Zaks, "Programming the Z80".
-
-__muluchar_rrx_s::
-        ld      hl, #2+1
-        add     hl, sp
-        ld      e, (hl)
-        dec     hl
-        ld      h, (hl)
-        ld      l, #0
-        ld      d, l
-        ld      b, #8
-muluchar_rrx_s_loop:
-        add     hl, hl
-        jr      nc, muluchar_rrx_s_noadd
-        add     hl, de
-muluchar_rrx_s_noadd:
-        djnz    muluchar_rrx_s_loop
-        ret
-
-; operands have different sign
-
-__mulsuchar_rrx_s::
-        ld      hl,#2+1
-        add     hl,sp
-
-        ld      e,(hl)
-        dec     hl
-        ld      c,(hl)
-        ld      b, #0
-        jr      signexte
-
-__muluschar_rrx_s::
-        ld      hl,#2+1
-        add     hl,sp
-
-        ld      c,(hl)
-        ld      b, #0
-        dec     hl
-        ld      e,(hl)
-        jr      signexte
-
-;; Originally from GBDK by Pascal Felber.
-
-__mulschar_rrx_s::
-        ld      hl,#2+1
-        add     hl,sp
-
-        ld      e,(hl)
-        dec     hl
-        ld      l,(hl)
-
-        ;; Fall through
-__mulschar_rrx_hds::
-        ;; Need to sign extend before going in.
-        ld      c,l
-
-        ld      a,l
-        rla
-        sbc     a,a
-        ld      b,a
-signexte:
-        ld      a,e
-        rla
-        sbc     a,a
-        ld      d,a
-
-        jr      .mul16
-
 __mulint_rrx_s::
-        ld      hl,#2
-        add     hl,sp
-
-        ld      e,(hl)
-        inc     hl
-        ld      d,(hl)
-        inc     hl
-        ld      a,(hl)
-        inc     hl
-        ld      h,(hl)
-        ld      l,a
+        pop     af
+        pop     hl
+        pop     de
+        push    de
+        push    hl
+        push    af
 
         ;; Fall through
 
 __muluchar_rrx_hds::
 __mulint_rrx_hds::
        ;; Parameters:
-       ;;      HL, DE (left, right irrelevant)
+       ;;      hl, de (left, right irrelevant)
        ld      b,h
        ld      c,l
 
        ;; 16-bit multiplication
        ;;
        ;; Entry conditions
-       ;;   BC = multiplicand
-       ;;   DE = multiplier
+       ;; bc = multiplicand
+       ;; de = multiplier
        ;;
        ;; Exit conditions
-       ;;   DE = less significant word of product
+       ;; hl = less significant word of product
        ;;
        ;; Register used: AF,BC,DE,HL
-.mul16:
-        ld      hl,#0
-        ld      a,b
-        ; ld c,c
-        ld      b,#16
+__mul16::
+       xor     a,a
+       ld      l,a
+       or      a,b
+       ld      b,#16
 
         ;; Optimise for the case when this side has 8 bits of data or
         ;; less.  This is often the case with support address calls.
-        or      a
-        jr      NZ,1$
-
+        jr      NZ,2$
         ld      b,#8
         ld      a,c
 1$:
         ;; Taken from z88dk, which originally borrowed from the
         ;; Spectrum rom.
         add     hl,hl
+2$:
         rl      c
         rla                     ;DLE 27/11/98
-        jr      NC,2$
+        jr      NC,3$
         add     hl,de
-2$:
+3$:
         djnz    1$
         ret
+