;****** PunktMatrix 4.0 (c) Oliver Mezger 7.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;Zaehler fuer Zeichenwechsel
.def itmp = R21		;tmp-Register bei Interrupt
.def led = R22		;RGB-LED animieren

	jmp reset		;Einsprung nach Reset
	.org OVF0addr	;Einsprung nach Timer0 Ueberlauf
	jmp isr_timer	;nach ISR
	.org $2a		;folgender Code ab Adresse $2a

isr_timer:
	in itmp,SREG	;SREG retten
	push itmp
	sbrs spalte,5	;wenn nicht Spalte 6
	rjmp nspalte	;dann naechste Spalte
	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 itmp,5		;5 Byte pro Zeichen
	mul itmp,zeichen	;Position in der Tabelle
	add ZL,R0		;Addiere Position
	adc ZH,R1
nspalte:
	lpm itmp, z+	;lade Daten aus Flash
	out PORTA,itmp	;ausgeben Spalte
	in itmp, PORTC
	andi itmp,0b11100000
	or itmp,spalte
	out PORTC,itmp	;Spalte einschalten
	rol spalte		;naechste Spalte
	pop itmp
	out SREG,itmp
	reti			;return from Interrupt

reset:				;Hauptprogramm
	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
	ldi tmp,3		;Systemtakt / 64
	out TCCR0,tmp
	in tmp,TIMSK	;Timerinterrupt einschalten
	ori tmp, 1 << TOIE0
	out TIMSK,tmp
	sei				;globale Interruptfreigabe
loop:
	inc led			;naechste Farbe
	andi led,7		;nur von 0 bis 7
	mov tmp,led
	swap tmp		;vertausche Nibble
	lsl tmp			;und noch einmal schieben
	in tmp2,PORTC	;schreibe auf PORTC
	andi tmp2,0b00011111
	or tmp2,tmp
	out PORTC,tmp2
	rcall wait
	rjmp loop

wait:
	ldi tmp,150		;aeusseren Zaehler laden 150 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
