File: lmul.s

package info (click to toggle)
cc65 2.19-1
  • links: PTS
  • area: main
  • in suites: bookworm, bullseye
  • size: 20,272 kB
  • sloc: ansic: 117,151; asm: 66,339; pascal: 4,248; makefile: 1,008; perl: 607
file content (82 lines) | stat: -rw-r--r-- 1,769 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
;
; Ullrich von Bassewitz, 13.08.1998
; Christian Krueger, 11-Mar-2017, added 65SC02 optimization
;
; CC65 runtime: multiplication for long (unsigned) ints
;

        .export         tosumul0ax, tosumuleax, tosmul0ax, tosmuleax
        .import         addysp1
        .importzp       sp, sreg, tmp1, tmp2, tmp3, tmp4, ptr1, ptr3, ptr4

        .macpack        cpu

tosmul0ax:
tosumul0ax:
.if (.cpu .bitand ::CPU_ISET_65SC02)
        stz     sreg
        stz     sreg+1
.else
        ldy     #$00    
        sty     sreg
        sty     sreg+1
.endif        

tosmuleax:
tosumuleax:
mul32:  sta     ptr1
        stx     ptr1+1          ; op2 now in ptr1/sreg
.if (.cpu .bitand ::CPU_ISET_65SC02)
        lda     (sp)
        ldy     #1
.else        
        ldy     #0
        lda     (sp),y
        iny
.endif
        sta     ptr3
        lda     (sp),y
        sta     ptr3+1
        iny
        lda     (sp),y
        sta     ptr4
        iny
        lda     (sp),y
        sta     ptr4+1          ; op1 in pre3/ptr4
        jsr     addysp1         ; Drop TOS

; Do (ptr1:sreg)*(ptr3:ptr4) --> EAX.

        lda     #0
        sta     tmp4
        sta     tmp3
        sta     tmp2
        ldy     #32
L0:     lsr     tmp4
        ror     tmp3
        ror     tmp2
        ror     a
        ror     sreg+1
        ror     sreg
        ror     ptr1+1
        ror     ptr1
        bcc     L1
        clc
        adc     ptr3
        pha
        lda     ptr3+1
        adc     tmp2
        sta     tmp2
        lda     ptr4
        adc     tmp3
        sta     tmp3
        lda     ptr4+1
        adc     tmp4
        sta     tmp4
        pla
L1:     dey
        bpl     L0
        lda     ptr1            ; Load the low result word
        ldx     ptr1+1
        rts