26 |
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
27 |
POSSIBILITY OF SUCH DAMAGE. */ |
POSSIBILITY OF SUCH DAMAGE. */ |
28 |
|
|
29 |
|
/* $Id$ */ |
30 |
|
|
31 |
/* |
/* |
|
$Id$ |
|
32 |
|
|
33 |
Contributors: |
Contributors: |
34 |
Created by Reiner Patommel |
Created by Reiner Patommel |
73 |
*/ |
*/ |
74 |
|
|
75 |
_U(atoi): |
_U(atoi): |
76 |
LOAD_Z (str_lo, str_hi) ; set pointer to string |
X_movw ZL, str_lo ; set pointer to string |
77 |
CLR num_lo |
CLR num_lo |
78 |
CLR num_hi ; clear number |
CLR num_hi ; clear number |
79 |
CLT ; clear sign flag |
CLT ; clear sign flag |
80 |
|
|
81 |
.atoi_loop: |
.L_atoi_loop: |
82 |
LD tmp, Z+ ; get (next) character |
LD tmp, Z+ ; get (next) character |
83 |
TST tmp ; is it end of string? |
TST tmp ; is it end of string? |
84 |
BREQ .atoi_sig |
BREQ .L_atoi_sig |
85 |
CPI tmp, ' ' ; skip whitespace |
CPI tmp, ' ' ; skip whitespace |
86 |
BREQ .atoi_loop |
BREQ .L_atoi_loop |
87 |
CPI tmp, '\t' |
CPI tmp, '\t' |
88 |
BREQ .atoi_loop |
BREQ .L_atoi_loop |
89 |
CPI tmp, '\n' |
CPI tmp, '\n' |
90 |
BREQ .atoi_loop |
BREQ .L_atoi_loop |
91 |
CPI tmp, '\f' |
CPI tmp, '\f' |
92 |
BREQ .atoi_loop |
BREQ .L_atoi_loop |
93 |
CPI tmp, '\r' |
CPI tmp, '\r' |
94 |
BREQ .atoi_loop |
BREQ .L_atoi_loop |
95 |
CPI tmp, '\v' |
CPI tmp, '\v' |
96 |
BREQ .atoi_loop |
BREQ .L_atoi_loop |
97 |
CPI tmp, '+' ; if '+' convert |
CPI tmp, '+' ; if '+' convert |
98 |
BREQ .atoi_loop2 |
BREQ .L_atoi_loop2 |
99 |
CPI tmp, '-' ; if '-' remember sign |
CPI tmp, '-' ; if '-' remember sign |
100 |
BRNE .atoi_digit |
BRNE .L_atoi_digit |
101 |
|
|
102 |
.atoi_neg: |
.L_atoi_neg: |
103 |
SET ; remember number is negative |
SET ; remember number is negative |
104 |
|
|
105 |
.atoi_loop2: |
.L_atoi_loop2: |
106 |
LD tmp, Z+ |
LD tmp, Z+ |
107 |
TST tmp |
TST tmp |
108 |
BREQ .atoi_sig |
BREQ .L_atoi_sig |
109 |
|
|
110 |
.atoi_digit: |
.L_atoi_digit: |
111 |
CPI tmp, '0' ; test on [0 .. 9] |
CPI tmp, '0' ; test on [0 .. 9] |
112 |
BRLT .atoi_sig |
BRLT .L_atoi_sig |
113 |
CPI tmp, '9'+1 |
CPI tmp, '9'+1 |
114 |
BRGE .atoi_sig |
BRGE .L_atoi_sig |
115 |
SUBI tmp, '0' ; make figure a number |
SUBI tmp, '0' ; make figure a number |
116 |
XCALL __mulhi_const_10 ; r25:r24 *= 10 |
XCALL __mulhi_const_10 ; r25:r24 *= 10 |
117 |
ADD num_lo, tmp ; num = (num * 10) + (tmp - '0') |
ADD num_lo, tmp ; num = (num * 10) + (tmp - '0') |
118 |
ADC num_hi, __zero_reg__ |
ADC num_hi, __zero_reg__ |
119 |
RJMP .atoi_loop2 ; next figure |
RJMP .L_atoi_loop2 ; next figure |
120 |
|
|
121 |
.atoi_sig: |
.L_atoi_sig: |
122 |
CP num_lo, __zero_reg__ |
CP num_lo, __zero_reg__ |
123 |
CPC num_hi, __zero_reg__ ; did we get a number? |
CPC num_hi, __zero_reg__ ; did we get a number? |
124 |
BREQ .atoi_done ; no, drop sign and return |
BREQ .L_atoi_done ; no, drop sign and return |
125 |
BRTC .atoi_done ; positive number? -> return |
BRTC .L_atoi_done ; positive number? -> return |
126 |
COM num_lo |
COM num_lo |
127 |
COM num_hi |
COM num_hi |
128 |
ADIW num_lo, 1 ; make number negative |
ADIW num_lo, 1 ; make number negative |
129 |
|
|
130 |
.atoi_done: |
.L_atoi_done: |
131 |
RET |
RET |
132 |
|
|
133 |
.atoi_end: |
.L_atoi_end: |
134 |
.size _U(atoi), .atoi_end - _U(atoi) |
.size _U(atoi), .L_atoi_end - _U(atoi) |
135 |
|
|
136 |
#endif /* not DOXYGEN */ |
#endif /* not DOXYGEN */ |