;Stringausgabe aus Kode-Speicher
#ifndef AVRSTR_I90
#define AVRSTR_I90
;Benötigt:
; putchar(r16) Zeichen schreiben (blockierend)
;Bietet (diverses):
; SendStr(Z) konstanten String ausgeben (*)
; SendStrAfter konstanten String nach RCALL ausgeben (*)
; JumpZ(Z) Byteadresse Z in Wort aufrunden und anspringen (*)
;(*) Funktioniert auf ATmega128 nur in den unteren 64K Kode-Speicher!
; Oder man setzt das entsprechende Page-Register entsprechend.
SendStr: ;konstanten String ausgeben
;PE: Z = Zeiger auf nullterminierte Zeichenkette im Kode-Speicher
;PA: -
;VR: Z (zeigt hinter die Null), R0=0
lpm r16,z+
tst r16
breq ss1
rcall putchar
rjmp SendStr
ss1: ret
SendStrAfter: ;konstanten String nach CALL ausgeben
;PE: Nullterminierte Zeichenkette hinter dem CALL-Befehl
;PA: -
;VR: R16=0, Z
pophl Z ;da steht der String
lslhl Z ;verdoppeln (Byte-Adresse)
rcall SendStr
JumpZ:
adiw ZH:ZL,1 ;aufrunden
lsrhl Z ;halbieren (Wort-Adresse)
ijmp ;springt nach Z (ZH:ZL)
#endif//AVRSTR_I90
Detected encoding: UTF-8 | 0
|