26
26
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
27
POSSIBILITY OF SUCH DAMAGE. */
30
$Id: atoi.S,v 1.7 2003/09/30 23:05:18 troth Exp $
29
/* $Id: atoi.S,v 1.9 2005/11/09 23:51:43 aesok Exp $ */
33
33
Created by Reiner Patommel
34
34
Changes: Jochen Pernsteiner, Marek Michalkiewicz
75
LOAD_Z (str_lo, str_hi) ; set pointer to string
75
X_movw ZL, str_lo ; set pointer to string
77
77
CLR num_hi ; clear number
78
78
CLT ; clear sign flag
81
81
LD tmp, Z+ ; get (next) character
82
82
TST tmp ; is it end of string?
84
84
CPI tmp, ' ' ; skip whitespace
96
96
CPI tmp, '+' ; if '+' convert
98
98
CPI tmp, '-' ; if '-' remember sign
102
102
SET ; remember number is negative
110
110
CPI tmp, '0' ; test on [0 .. 9]
114
114
SUBI tmp, '0' ; make figure a number
115
115
XCALL __mulhi_const_10 ; r25:r24 *= 10
116
116
ADD num_lo, tmp ; num = (num * 10) + (tmp - '0')
117
117
ADC num_hi, __zero_reg__
118
RJMP .atoi_loop2 ; next figure
118
RJMP .L_atoi_loop2 ; next figure
121
121
CP num_lo, __zero_reg__
122
122
CPC num_hi, __zero_reg__ ; did we get a number?
123
BREQ .atoi_done ; no, drop sign and return
124
BRTC .atoi_done ; positive number? -> return
123
BREQ .L_atoi_done ; no, drop sign and return
124
BRTC .L_atoi_done ; positive number? -> return
127
127
ADIW num_lo, 1 ; make number negative
133
.size _U(atoi), .atoi_end - _U(atoi)
133
.size _U(atoi), .L_atoi_end - _U(atoi)
135
#endif /* not DOXYGEN */
135
#endif /* not __DOXYGEN__ */