;*******************************************************************************
;*
;*	Titel:	Indirekte Adressierung von Konstanten im Flash
;*	(A408_flash_indirect_textstring.asm)
;*
;*	Datum:	23/02/07	Version:	0.1	
;*	Autor:	WEIGU
;*
;*	Informationen zur Beschaltung:
;*	Prozessor:	ATmega32	Quarzfrequenz:	1MHz intern
;*	Eingaenge:
;*	Ausgaenge:
;*
;*	Informationen zur Funktionsweise:
;*	
;*	Es sollen ein Text mit lpm im Flash ausgegeben werden
;*			
;*******************************************************************************

;-------------------------------------------------------------------------------
;       Einbinden der controllerspezifischen Definitionsdatei
;-------------------------------------------------------------------------------
.NOLIST                         ;List-Output ausschalten
.INCLUDE "m32def.inc"           ;AVR-Definitionsdatei einbinden
.LIST                           ;List-Output wieder einschalten

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;       Programmspeicher (FLASH)     Programmstart nach RESET ab Adr. 0x0000
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.CSEG                           ;was ab hier folgt kommt in den FLASH-Speicher
.ORG    0x0000                  ;Programm beginnt an der FLASH-Adresse 0x0000
RESET:  rjmp    INIT            ;springe nach INIT (ueberspringe ISR Vektoren)

;-------------------------------------------------------------------------------
;       Initialisierungen und eigene Definitionen
;-------------------------------------------------------------------------------
.ORG    INT_VECTORS_SIZE        ;Platz fuer ISR Vektoren lassen
INIT:
.DEF	Tmp1 = r16		;Register 16 dient als erster Zwischenspeicher

	;Adresszeiger initialisieren
	ldi	ZL,LOW(TXTSTR*2) ;Adresszeiger mit der Adresse der Texttabelle
	ldi	ZH,HIGH(TXTSTR*2); * 2 initialisieren (Worte statt Bytes)

	;alle Pins von PortD als Ausgang initialisieren
	ldi	Tmp1,0xFF	;DDRD = 11111111b
	out	DDRD,Tmp1	;alle Bis im Datenrichtungsregister auf Eins
	
;-------------------------------------------------------------------------------
;	Hauptprogramm
;-------------------------------------------------------------------------------
MAIN:	lpm	Tmp1,Z+		;Speichere das Zeichen der Speicherzeile deren
				;Adresse im Z-Pointer steht in das Arbeits-
				;register Tmp1. Inkrementiere danach den
				;Adresszeiger Z	
	tst	Tmp1		;Letztes Zeichen (Nullbyte) erreicht?
	breq	END		;Falls ja Ende
	out	PortD,Tmp1	;Gib das Zeichen an PortD aus
	rjmp	MAIN		;Hole nächstes Zeichen
		
       ;Ende des Hauptprogramms (falls keine Endlosschleife im Hauptprogramm)
END:    rjmp    END             ;Endlosschleife

;-------------------------------------------------------------------------------
;       Tabellen im Programmspeicher (Flash)
;-------------------------------------------------------------------------------
.ORG 0x0300			;ab Adresse 0x0300
TXTSTR:	.DB	"MICEL",10,13,0	;Text mit "carriage return" und "line feed"
				;sowie abschliessendem Nullbyte	(ASCII-Tab)

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.EXIT                           ;Ende des Quelltextes



