]> git.sur5r.net Git - cc65/blob - libsrc/runtime/ludiv.s
149c98a7875e62ce790da91deee6df3389381c09
[cc65] / libsrc / runtime / ludiv.s
1 ;
2 ; Ullrich von Bassewitz, 17.08.1998
3 ;
4 ; CC65 runtime: division for long unsigned ints
5 ;
6
7         .export         tosudiv0ax, tosudiveax, getlop, udiv32
8         .import         addysp1
9         .importzp       sp, sreg, tmp3, tmp4, ptr1, ptr2, ptr3, ptr4
10
11 tosudiv0ax:
12         ldy     #$00
13         sty     sreg
14         sty     sreg+1
15
16 tosudiveax:                         
17         jsr     getlop          ; Get the paramameters
18         jsr     udiv32          ; Do the division
19         lda     ptr1            ; Result is in ptr1:sreg
20         ldx     ptr1+1
21         rts
22
23 ; Pop the parameters for the long division and put it into the relevant
24 ; memory cells. Called from the signed divisions also.
25
26 getlop: sta     ptr3            ; Put right operand in place
27         stx     ptr3+1
28         lda     sreg
29         sta     ptr4
30         lda     sreg+1
31         sta     ptr4+1
32
33         ldy     #0              ; Put left operand in place
34         lda     (sp),y
35         sta     ptr1
36         iny
37         lda     (sp),y
38         sta     ptr1+1
39         iny
40         lda     (sp),y
41         sta     sreg
42         iny
43         lda     (sp),y
44         sta     sreg+1
45         jmp     addysp1         ; Drop parameters
46
47 ; Do (ptr1:sreg) / (ptr3:ptr4) --> (ptr1:sreg), remainder in (ptr2:tmp3:tmp4)
48 ; This is also the entry point for the signed division
49
50 udiv32: lda     #0
51         sta     ptr2+1
52         sta     tmp3
53         sta     tmp4
54 ;       sta     ptr1+1
55         ldy     #32
56 L0:     asl     ptr1
57         rol     ptr1+1
58         rol     sreg
59         rol     sreg+1
60         rol     a
61         rol     ptr2+1
62         rol     tmp3
63         rol     tmp4
64
65 ; Do a subtraction. we do not have enough space to store the intermediate
66 ; result, so we may have to do the subtraction twice.
67
68         pha
69         cmp     ptr3
70         lda     ptr2+1
71         sbc     ptr3+1
72         lda     tmp3
73         sbc     ptr4
74         lda     tmp4
75         sbc     ptr4+1
76         bcc     L1
77
78 ; Overflow, do the subtraction again, this time store the result
79
80         sta     tmp4            ; We have the high byte already
81         pla
82         sbc     ptr3            ; byte 0
83         pha
84         lda     ptr2+1
85         sbc     ptr3+1
86         sta     ptr2+1          ; byte 1
87         lda     tmp3
88         sbc     ptr4
89         sta     tmp3            ; byte 2
90         inc     ptr1            ; Set result bit
91
92 L1:     pla
93         dey
94         bne     L0
95         sta     ptr2
96         rts
97
98