]> git.sur5r.net Git - cc65/blob - libsrc/runtime/lmul.s
Code review changes and build fix.
[cc65] / libsrc / runtime / lmul.s
1 ;
2 ; Ullrich von Bassewitz, 13.08.1998
3 ; Christian Krueger, 11-Mar-2017, added 65SC02 optimization
4 ;
5 ; CC65 runtime: multiplication for long (unsigned) ints
6 ;
7
8         .export         tosumul0ax, tosumuleax, tosmul0ax, tosmuleax
9         .import         addysp1
10         .importzp       sp, sreg, tmp1, tmp2, tmp3, tmp4, ptr1, ptr3, ptr4
11
12         .macpack        cpu
13
14 tosmul0ax:
15 tosumul0ax:
16 .if (.cpu .bitand ::CPU_ISET_65SC02)
17         stz     sreg
18         stz     sreg+1
19 .else
20         ldy     #$00    
21         sty     sreg
22         sty     sreg+1
23 .endif        
24
25 tosmuleax:
26 tosumuleax:
27 mul32:  sta     ptr1
28         stx     ptr1+1          ; op2 now in ptr1/sreg
29 .if (.cpu .bitand ::CPU_ISET_65SC02)
30         lda     (sp)
31         ldy     #1
32 .else        
33         ldy     #0
34         lda     (sp),y
35         iny
36 .endif
37         sta     ptr3
38         lda     (sp),y
39         sta     ptr3+1
40         iny
41         lda     (sp),y
42         sta     ptr4
43         iny
44         lda     (sp),y
45         sta     ptr4+1          ; op1 in pre3/ptr4
46         jsr     addysp1         ; Drop TOS
47
48 ; Do (ptr1:sreg)*(ptr3:ptr4) --> EAX.
49
50         lda     #0
51         sta     tmp4
52         sta     tmp3
53         sta     tmp2
54         ldy     #32
55 L0:     lsr     tmp4
56         ror     tmp3
57         ror     tmp2
58         ror     a
59         ror     sreg+1
60         ror     sreg
61         ror     ptr1+1
62         ror     ptr1
63         bcc     L1
64         clc
65         adc     ptr3
66         pha
67         lda     ptr3+1
68         adc     tmp2
69         sta     tmp2
70         lda     ptr4
71         adc     tmp3
72         sta     tmp3
73         lda     ptr4+1
74         adc     tmp4
75         sta     tmp4
76         pla
77 L1:     dey
78         bpl     L0
79         lda     ptr1            ; Load the low result word
80         ldx     ptr1+1
81         rts
82