z80 library cleanup
[fw/sdcc] / device / lib / z80 / mul.s
index 00e6ce9ee2e9747a980aab13522a1c7a3d74b102..6dd917a1ec2c5961c24c9d838c5d27695915fa51 100644 (file)
@@ -1,13 +1,57 @@
-       ;; Originally from GBDK by Pascal Felber.
+        .area   _CODE
 
-       .area   _CODE
+; This multiplication routine is similar to the one
+; from Rodnay Zaks, "Programming the Z80".
+
+; Now replaced by a builtin for code generation, but
+; still called from some asm files in this directory.
+__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
+        ld      hl,#2+1
         add     hl,sp
 
         ld      e,(hl)
-        inc     hl
+        dec     hl
         ld      l,(hl)
 
         ;; Fall through
@@ -19,29 +63,13 @@ __mulschar_rrx_hds::
         rla
         sbc     a,a
         ld      b,a
-
+signexte:
         ld      a,e
         rla
         sbc     a,a
         ld      d,a
 
-        jp      .mul16
-
-__muluchar_rrx_s::
-        ld      hl,#2
-        add     hl,sp
-
-        ld      e,(hl)
-
-        inc     hl
-        ld      c,(hl)
-
-        ;; Clear the top
-        xor     a
-        ld      d,a
-        ld      b,a
-
-        jp      .mul16
+        jr      .mul16
 
 __mulint_rrx_s::
         ld      hl,#2
@@ -61,7 +89,7 @@ __mulint_rrx_s::
 __muluchar_rrx_hds::
 __mulint_rrx_hds::
        ;; Parameters:
-       ;;      HL, DE (left, right irrelivent)
+       ;;      HL, DE (left, right irrelevant)
        ld      b,h
        ld      c,l
 
@@ -84,7 +112,7 @@ __mulint_rrx_hds::
         ;; 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
-        jp      NZ,1$
+        jr      NZ,1$
 
         ld      b,#8
         ld      a,c