;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
|
|