Source file: /~heha/Mikrocontroller/avr-inc.zip/atoi.i90

;ASCII-zu-Integer-Konvertierung für ATmega
;h#s 01/06
#ifndef ATOI_I90
#define ATOI_I90

;Bietet (r32 bezeichnet r5:r4:r3:r2):
;	r32=atos4(Z,base)	vzb. Zahl konvertieren
;	r32=atos4a(Z,base)	vzb. Zahl konvertieren, mit Basis-Override
;	r32=atou4(Z,base)	vzl. Zahl konvertieren
;	r32=atou4a(Z,base)	vzl. Zahl konvertieren, mit Basis-Override
;	mulu4u1(r32,r17)	Multiplikation große mit kleiner Zahl
;	r16=skipws(Z)		Weißraum übergehen

;Basis-Override:
;0=oktal, b,0b=binär, x,0x,$=hex, Suffix "h" wird nicht unterstützt!
;N


.include "makros.i90"

skipws:
;Weißraum übergehen
;PE: Z=String-Zeiger in RAM (nicht Flash!)
;PA: R16=erstes Nicht-Weißraum-Zeichen
;    Z vorgerückt (mindestens um 1)
;VR: R16,Z
	ld	r16,Z+
	cpi	r16,' '
	breq	skipws
	cpi	r16,9
	breq	skipws
	ret
	
mulu4u1:
;Multiplikation 32bit*8bit=32bit
;PE: R5:R4:R3:R2 = "großer" Faktor
;    R17 = "kleiner" Faktor
;PA: R5:R4:R3:R2 = neues Produkt
;VR: R0-R5
	mul	r5,r17
	mov	r5,r0
	mul	r4,r17
	mov	r4,r0
	add	r5,r1
	mul	r3,r17
	mov	r3,r0
	add	r4,r1
	adc	r5,ZERO
	mul	r2,r17
	mov	r2,r0
	add	r3,r1
	adc	r4,ZERO
	adc	r5,ZERO
	ret
	
;Hier Baustelle!
atos4:
;Wandlung einer Zeichenkette in Zahl, vzb.
;PE: Z=Zeichenkette im RAM
;    R17(?)=Zahlenbasis
;PA: R5:R4:R3:R2=Zahl, C=1 bei Fehler
;VR: R16-R19, Z
	clr	r19
	rcall	skipws
	cpi	r16,'-'
	brne	at1
	dec	r19	;R19=FFh
at2:	ld	r16,Z+
at1:	cpi	r16,0
	breq	at3
	subi	r16,'0'
	brcs	ate	;Fehler: keine Ziffer
	ldi	r17,9
	cp	r17,r16
	brcs	ate	;Fehler: keine Ziffer
	;jetzt in R16 eine Zahl zwischen 0 und 9
	ldi	r17,10
	rcall	mulu4u1
	add	r2,r16	;Neue Ziffer addieren
	adc	r3,ZERO
	adc	r4,ZERO
	adc	r5,ZERO
	rjmp	at2
at3:	;Wenn negativ, Zweierkomplement bilden
	sbrc	r19,7
	 rcall	neg4
	clc		;(C wäre nach SBC von Null beinahe immer gesetzt)
ate:	ret
	

#endif//ATOI_I90
Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded