fa3fb63ebfcebfa43eb9e0686ef39e767a8daa55
[fw/sdcc] / device / lib / z80 / mul.s
1         ;; Originally from GBDK by Pascal Felber.
2         
3         .area   _CODE
4
5 __mulschar_rr_s::
6         ld      hl,#2
7         add     hl,sp
8
9         ld      e,(hl)
10         inc     hl
11         ld      l,(hl)                
12
13         ;; Fall through
14 __mulschar_rr_hds::
15         ;; Need to sign extend before going in.
16         ld      c,l
17         
18         ld      a,l
19         rla
20         sbc     a,a
21         ld      b,a
22
23         ld      a,e
24         rla
25         sbc     a,a
26         ld      d,a
27
28         jp      .mul16
29
30 __muluchar_rr_s::
31         ld      hl,#2
32         add     hl,sp
33
34         ld      e,(hl)
35         inc     hl
36         ld      c,(hl)                
37
38         jp      .mulu16
39         
40 __mulsint_rr_s::
41 __muluint_rr_s::
42         ld      hl,#2
43         add     hl,sp
44         
45         ld      e,(hl)
46         inc     hl
47         ld      d,(hl)
48         inc     hl
49         ld      a,(hl)
50         inc     hl
51         ld      h,(hl)
52         ld      l,a
53
54         ;; Fall through
55         
56 __muluchar_rr_hds::
57 __mulsint_rr_hds::
58 __muluint_rr_hds::
59         ;; Parameters:
60         ;;      HL, DE (left, right irrelivent)
61         ld      b,h
62         ld      c,l
63         
64         ;; 16-bit multiplication
65         ;; 
66         ;; Entry conditions
67         ;;   BC = multiplicand
68         ;;   DE = multiplier
69         ;; 
70         ;; Exit conditions
71         ;;   DE = less significant word of product
72         ;;
73         ;; Register used: AF,BC,DE,HL
74 .mul16:
75 .mulu16:
76         LD      HL,#0x00        ; Product = 0
77         LD      A,#15           ; Count = bit length - 1
78         ;; Shift-and-add algorithm
79         ;; If MSB of multiplier is 1, add multiplicand to partial product
80         ;; Shift partial product, multiplier left 1 bit
81 .mlp:
82         SLA     E               ; Shift multiplier left 1 bit
83         RL      D
84         jp      NC,.mlp1        ; Jump if MSB of multiplier = 0
85         ADD     HL,BC           ; Add multiplicand to partial product
86 .mlp1:
87         ADD     HL,HL           ; Shift partial product left
88         DEC     A
89         jp      NZ,.mlp         ; Continue until count = 0
90         ;; Add multiplicand one last time if MSB of multiplier is 1
91         BIT     7,D             ; Get MSB of multiplier
92         JR      Z,.mend         ; Exit if MSB of multiplier is 0
93         ADD     HL,BC           ; Add multiplicand to product
94 .mend:
95                                 ; HL = result
96         ret
97