Cleared the top bytes for use in arrays.
[fw/sdcc] / device / lib / z80 / mul.s
index 57c06a91df7950ea62ba6c7147891aa08b98103d..f0817aefdc99d8f3aab992c3d0ba4f1ab2db6e8e 100644 (file)
@@ -1,47 +1,71 @@
        ;; Originally from GBDK by Pascal Felber.
        
        .area   _CODE
-__mulschar::   
-__muluchar::
-       push    de
-       push    bc
-       push    ix
-       ld      ix,#0
-       add     ix,sp
 
-       ld      c,8(ix)
-       ld      e,9(ix)
-       call    .mulu8
-       
-       pop     ix
-       pop     bc
-       pop     de
-       ret
+__mulschar_rr_s::
+        ld      hl,#2
+        add     hl,sp
 
-__mulsint::
-__muluint::
-       push    de
-       push    bc
-       push    ix
-       ld      ix,#0
-       add     ix,sp
+        ld      e,(hl)
+        inc     hl
+        ld      l,(hl)                
 
-       ld      c,8(ix)
-       ld      b,9(ix)
-       ld      e,10(ix)
-       ld      d,11(ix)
-       call    .mulu16
-       
-       pop     ix
-       pop     bc
-       pop     de
-       ret
-               
-.mul8:
-.mulu8:
-       LD      B,#0x00         ; Sign extend is not necessary with mul
-       LD      D,B
-       ; Fall through
+        ;; Fall through
+__mulschar_rr_hds::
+        ;; Need to sign extend before going in.
+        ld      c,l
+        
+        ld      a,l
+        rla
+        sbc     a,a
+        ld      b,a
+
+        ld      a,e
+        rla
+        sbc     a,a
+        ld      d,a
+
+        jp      .mul16
+
+__muluchar_rr_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      .mulu16
+        
+__mulsint_rr_s::
+__muluint_rr_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
+
+        ;; Fall through
+        
+__muluchar_rr_hds::
+__mulsint_rr_hds::
+__muluint_rr_hds::
+       ;; Parameters:
+       ;;      HL, DE (left, right irrelivent)
+       ld      b,h
+       ld      c,l
        
        ;; 16-bit multiplication
        ;; 
@@ -63,16 +87,17 @@ __muluint::
 .mlp:
        SLA     E               ; Shift multiplier left 1 bit
        RL      D
-       JR      NC,.mlp1        ; Jump if MSB of multiplier = 0
+       jp      NC,.mlp1        ; Jump if MSB of multiplier = 0
        ADD     HL,BC           ; Add multiplicand to partial product
 .mlp1:
        ADD     HL,HL           ; Shift partial product left
        DEC     A
-       JR      NZ,.mlp         ; Continue until count = 0
+       jp      NZ,.mlp         ; Continue until count = 0
        ;; Add multiplicand one last time if MSB of multiplier is 1
        BIT     7,D             ; Get MSB of multiplier
        JR      Z,.mend         ; Exit if MSB of multiplier is 0
        ADD     HL,BC           ; Add multiplicand to product
 .mend:
-       RET                     ; HL = result
+                               ; HL = result
+       ret