]> git.sur5r.net Git - cc65/blob - libsrc/runtime/lmul.s
1a909a3d64d370449e395f875630bb1f5e53318b
[cc65] / libsrc / runtime / lmul.s
1 ;
2 ; Ullrich von Bassewitz, 13.08.1998
3 ;
4 ; CC65 runtime: multiplication for long (unsigned) ints
5 ;
6
7         .export         tosumuleax, tosmuleax
8         .import         addysp1
9         .importzp       sp, sreg, tmp1, tmp2, tmp3, tmp4, ptr1, ptr3, ptr4
10
11 tosmuleax:
12 tosumuleax:
13 mul32:  sta     ptr1
14         stx     ptr1+1          ; op2 now in ptr1/sreg
15         ldy     #0
16         lda     (sp),y
17         sta     ptr3
18         iny
19         lda     (sp),y
20         sta     ptr3+1
21         iny
22         lda     (sp),y
23         sta     ptr4
24         iny
25         lda     (sp),y
26         sta     ptr4+1          ; op1 in pre3/ptr4
27         jsr     addysp1         ; Drop TOS
28
29 ; Do (ptr1:sreg)*(ptr3:ptr4) --> EAX.
30
31         lda     #0
32         sta     tmp4
33         sta     tmp3
34         sta     tmp2
35         ldy     #32
36 L0:     lsr     tmp4
37         ror     tmp3
38         ror     tmp2
39         ror     a
40         ror     sreg+1
41         ror     sreg
42         ror     ptr1+1
43         ror     ptr1
44         bcc     L1
45         clc
46         adc     ptr3
47         pha
48         lda     ptr3+1
49         adc     tmp2
50         sta     tmp2
51         lda     ptr4
52         adc     tmp3
53         sta     tmp3
54         lda     ptr4+1
55         adc     tmp4
56         sta     tmp4
57         pla
58 L1:     dey
59         bpl     L0
60         lda     ptr1            ; Load the low result word
61         ldx     ptr1+1
62         rts
63