1 ;
--------------------------------------------------------------------------
4 ; Copyright
(C
) 2020-2021, Sergey Belyashov
6 ; This library is free software; you can redistribute it
and/or modify it
7 ; under the terms of the GNU General Public License as published by the
8 ; Free Software Foundation; either version
2, or (at your option
) any
11 ; This library is distributed in the hope that it will
be useful
,
12 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ; MERCHANTABILITY
or FITNESS FOR
A PARTICULAR PURPOSE. See the
14 ; GNU General Public License for more details.
16 ; You should have received
a copy of the GNU General Public License
17 ; along with this library; see the file COPYING. If
not, write to the
18 ; Free Software Foundation
, 51 Franklin Street
, Fifth Floor
, Boston
,
21 ; As
a special exception
, if you link this library with other files
,
22 ; some of which are compiled with SDCC
, to produce an executable
,
23 ; this library does
not by itself cause the resulting executable to
24 ;
be covered by the GNU General Public License. This exception does
25 ;
not however invalidate any other reasons why the executable file
26 ; might
be covered by the GNU General Public License.
27 ;
--------------------------------------------------------------------------
30 .optsdcc -mz80 sdcccall(1)
37 ;void __itoa
(int value
, char
*string
, unsigned char radix
);
53 ;positive
/negative numbers are supported only for radix
=10
57 ;
add minus sign to result
and inverse value
(Carry Flag is
0 here
)
63 ld (hl
), #0x2D ;minus symbol
69 ;void __uitoa
(unsigned int value
, char
*string
, unsigned char radix
);
88 ___uitoa_dehl
: ;DE
- value
, HL
- string
, 6 (ix
) - radix
98 cp
a, #10 ;most popular radix
101 ;
-------- decimal conversion
102 ; this algorithm up to
2 times faster than generic
110 push
bc ;
BC - pointer to string
112 call ___uitobcd ;HL
- value
, DE
- pointer to BCD value
113 pop de ;DE
- pointer to string
114 pop hl ;HL
- pointer to BCD value
115 ld b, #3 ;number of bytes in BCD value
116 ld a, #0x30 ;ASCII code of '0'
129 ;skip trailing zeroes
130 ld b, #5 ;real BCD number is at most 5 digits
131 dec de ;so always skip last zero
136 jr NZ
, 107$ ;break loop if non-zero found
139 inc de ;always point to symbol next to last significant
143 ;
---------------------------
147 jr C
, 190$ ;radix is less than
2
154 ;
-------- radix is power of
2
156 ; DE
- value
, HL
- pointer to string
, C
- mask
168 cp
a, #0x3A ;convert to 0...9A...Z
179 ;
---------------------------
181 ;
-------- custom radix
(generic algorithm
)
201 ;
---------------------------
203 ;
-------- finish string
and reverse its order
208 call ___strreverse_reg
216 ;in
: HL
- divident
, C
- divisor
217 ;out
: HL
- quotient
, A - remainder