;****** PunktMatrix 1.0 (c) Oliver Mezger 6.7.2009
; Balken wandert von Spalte 1 bis Spalte 5

.include "m16def.inc"

.def tmp = R16		;tmp-Register zum Arbeiten
.def tmp2 = R17
.def spalte = R18	;Spalte für Darstellung
.def zeichen = R19	;Index des Zeichens
.def durchlauf = R20

	jmp reset		;Einsprung nach Reset
	.org $2a		;folgender Code ab Adresse $2a
reset:
	ldi tmp,high(RAMEND);Oberste RAM-Adresse holen
	out	SPH, tmp		;Stack-Pointer initialisieren
	ldi tmp,low(RAMEND)	
	out	SPL, tmp
	ldi tmp,$ff
	out DDRA,tmp	;PA als Ausgang
	out DDRC,tmp	;PC als Ausgang
spalte1:
	inc durchlauf	;weiterer Durchlauf
	cpi durchlauf,50;nach 50 Durchlauf
	brlo nix
	clr durchlauf
	inc zeichen		;neues Zeichen
	andi zeichen,1
nix:
	ldi spalte,1	;Spalte1 initialisieren
	ldi ZH, high(daten*2)	;Datenzeiger initialisieren
	ldi ZL, low(daten*2)
	ldi tmp,5		;5 Byte pro Zeichen
	mul tmp,zeichen	;Position in der Tabelle
	add ZL,R0		;Addiere Position
	adc ZH,R1
nspalte:
	lpm tmp, z+		;lade Daten aus Flash
	out PORTA,tmp	;ausgeben Spalte
	out PORTC,spalte;Spalte einschalten
	rcall wait		;warte zum Anzeigen
	rol spalte		;naechste Spalte
	sbrc spalte,5	;wenn Spalte 6
	rjmp spalte1	;dann wieder Spalte 1
	rjmp nspalte	;sonst naechste Spalte

wait:
	ldi tmp,10		;aeusseren Zaehler laden 10 ms
wl1:
	ldi tmp2,250	;inneren Zaehler 1ms bei 1Mhz
wl2:
	nop
	dec tmp2		;tmp2--
	brne wl2		;Sprung wenn nicht null
	dec tmp			;tmp--
	brne wl1		;Sprung wenn nicht null
	ret

daten:
	.db $08,$04,$7E,$04,$08,$10,$20,$7E,$20,$10
