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