; *** Muster auf LED-Zeile ausgeben 1.1 (c) Oliver Mezger 21.6.2012
.include "tn2313def.inc"
  .def tmp= R16
  .def wi = R18 ; Warteschleife innen
  .def wa = R19 ; Warteschleife aussen

init: 
  ldi tmp, low(RAMEND) ; Stackpointer initialisieren
  out SPL, tmp
  ldi tmp,$ff
  out PORTB,tmp ; Ausgaenge auf 1 setzen damit nix leuchtet
  out DDRB,tmp  ; PB aus Ausgang

main:
  sbic PIND,0 ; ist PD0 = 1
  rjmp main   ; dann weiter abfragen
  ldi ZH, high(muster * 2) ; Z initialisieren
  ldi ZL, low(muster * 2)
musterAusgeben:
  lpm tmp, Z+ ; lade aus Flash und erhoehe Z
  com tmp     ;negieren des Musters (wegen negativer logik)
  out PORTB, tmp
  rcall warte
  cpi ZL,low(musterEnd*2)  ; auf Ende pruefen 
  brne musterAusgeben      ; nicht am Ende
  cpi ZH,high(musterEnd*2) ;
  brne musterAusgeben
  rjmp main

; Warteschleife wa * 1000 +7 Takte
warte: ; rcall 3 Takte
  ldi wa, 100 ; Wartezeit in ms @ 1MHz (+7 Takte UP-Aufruf)
warteaussen: 
  ldi wi,249  ; (249 * 4) + 4 = 1000 Takte
  nop
warteinnen: 
  nop
  dec wi
  brne warteinnen
  dec wa
  brne warteaussen
  ret ; 4 Takte

muster: ; Muster in den Programmspeicher
  .db 0, 0b10000001, 0b01000010, 0b00100100, 0b00011000,0
musterEnd: ; Endemarke
  .db 0

