]> git.sur5r.net Git - cc65/blob - libsrc/runtime/udiv.s
Add definitions in telestrat.inc (TELEMON 2.4)
[cc65] / libsrc / runtime / udiv.s
1 ;
2 ; Ullrich von Bassewitz, 07.08.1998
3 ;
4 ; CC65 runtime: division for unsigned ints
5 ;
6 ; Don't use tmp1 here, the signed division tunnels data with it!
7
8         .export         tosudiva0, tosudivax, udiv16
9         .import         popptr1
10         .importzp       sreg, ptr1, ptr4
11
12
13 tosudiva0:
14         ldx     #$00            ; Clear high byte
15 tosudivax:
16         sta     ptr4
17         stx     ptr4+1          ; Save right operand
18         jsr     popptr1         ; Get left operand
19
20 ; Do the division
21
22         jsr     udiv16
23
24 ; Result is in ptr1, remainder in sreg
25
26         lda     ptr1
27         ldx     ptr1+1
28         rts
29
30 ;---------------------------------------------------------------------------
31 ; 16by16 division. Divide ptr1 by ptr4. Result is in ptr1, remainder in sreg
32 ; (see mult-div.s from "The Fridge").
33 ; This is also the entry point for the signed division
34
35 udiv16: lda     #0
36         sta     sreg+1
37         ldy     #16
38         ldx     ptr4+1
39         beq     udiv16by8a
40
41 L0:     asl     ptr1
42         rol     ptr1+1
43         rol     a
44         rol     sreg+1
45
46         tax
47         cmp     ptr4
48         lda     sreg+1
49         sbc     ptr4+1
50         bcc     L1
51
52         sta     sreg+1
53         txa
54         sbc     ptr4
55         tax
56         inc     ptr1
57
58 L1:     txa
59         dey
60         bne     L0
61         sta     sreg
62         rts
63
64
65 ;---------------------------------------------------------------------------
66 ; 16by8 division
67
68 udiv16by8a:
69 @L0:    asl     ptr1
70         rol     ptr1+1
71         rol     a
72         bcs     @L1
73
74         cmp     ptr4
75         bcc     @L2
76 @L1:    sbc     ptr4
77         inc     ptr1
78
79 @L2:    dey
80         bne     @L0
81         sta     sreg
82         rts
83