2 ; Ullrich von Bassewitz, 05.06.1998
4 ; int atoi (const char* s);
5 ; long atol (const char* s);
10 .importzp sreg, ptr1, ptr2, tmp1
13 ; Conversion routine (32 bit)
17 _atol: sta ptr1 ; Store s
21 sty ptr2+1 ; initial value (32 bit)
29 lda __ctype,x ; get character classification
30 and #$80 ; tab or space?
35 bne L1 ; branch always
37 ; Check for a sign. The character is in X
40 ldx #0 ; flag: positive
41 cmp #'+' ; ### portable?
43 cmp #'-' ; ### portable?
50 ; Store the sign flag and setup for conversion
52 L5: stx tmp1 ; remember sign flag
54 L6: lda (ptr1),y ; get next char
56 lda __ctype,x ; get character classification
60 ; Multiply ptr2 (the converted value) by 10
88 sta sreg+1 ; x*2 + x*8 = x*10
90 ; Get the character back and add it
94 sbc #'0' ; make numeric value
112 ; Conversion done. Be shure to negate the value if needed.
119 ; Negate the 32 bit value in ptr2/sreg
139 ; Done, load the low 16 bit into A/X
142 ldx ptr2+1 ; get value