1
2SECTION code_clib
3SECTION code_l
4
5PUBLIC l_fast_utoa
6PUBLIC l0_fast_utoa, l_utoa_lib
7
8l_fast_utoa:
9
10   ; write unsigned decimal integer to ascii buffer
11   ;
12   ; enter : hl = unsigned integer
13   ;         de = char *buffer
14   ;         carry set to write leading zeroes
15   ;
16   ; exit  : de = char *buffer (one byte past last char written)
17   ;         carry reset
18   ;
19   ; uses  : af, bc, de, hl
20
21   ld bc,0+256
22   push bc
23
24   ld bc,-10+256
25   push bc
26
27   inc h
28   dec h
29   jr z, eight_bit
30
31;  ld bc,-100+256
32   ld c,0xff & (-100+256)
33   push bc
34
35   ld bc,-1000+256
36   push bc
37
38   ld bc,-10000
39
40l_utoa_lib:
41l0_fast_utoa:
42
43   ; hl = unsigned int
44   ; de = char *buffer
45   ; bc = first divisor
46   ; carry set for leading zeroes
47   ; stack = remaining divisors
48
49   jr c, leading_zeroes
50
51
52no_leading_zeroes:
53
54   call divide
55   cp '0'
56   jr nz, write
57
58   pop bc
59   djnz no_leading_zeroes
60
61   jr write1s
62
63
64leading_zeroes:
65
66   call divide
67
68write:
69
70   ld (de),a
71   inc de
72
73   pop bc
74   djnz leading_zeroes
75
76
77write1s:
78
79   ld a,l
80   add a,'0'
81
82   ld (de),a
83   inc de
84   ret
85
86
87divide:
88
89   ld a,'0'-1
90
91divloop:
92
93   inc a
94   add hl,bc
95   jr c, divloop
96
97   sbc hl,bc
98   ret
99
100eight_bit:
101
102   ld bc,-100
103   jr nc, no_leading_zeroes
104
105   ; write two leading zeroes to output string
106
107   ld a,'0'
108   ld (de),a
109   inc de
110   ld (de),a
111   inc de
112
113   jr leading_zeroes
114