; 2010 (c) Bartosz Chodorowski <chomzee@ethernet.pl>
;                              <166142@student.pwr.wroc.pl>
;
; Lista 1, Zadanie 1
; 2 marca 2010
;


#include<usb1287def.inc>

.cseg
.org 0x0
rjmp Start

Start:
ldi R16, low(RAMEND)
ldi R17, high(RAMEND)
out SPH, R17
out SPL, R16

ldi R16, 0b11100000	;PORTB linie 5 do 7 w trybie wejściowym
in R17, PORTB
or R17, R16
out PORTB, R17

ldi R16, 0b00110000	;PORTE linie 4 i 5 w trybie wejściowym
in R17, PORTE
or R17, R16
out PORTE, R17

ldi R16, 0b11110000	;linie 4-7 portu D w trybie wyjściowym, 
in R17, DDRD
or R17, R16			;zasilanie diod LED
out DDRD, R17



; Start programu

.def counter = R17
.def diodes = R16

; ustawiamy licznik na 1
ldi counter, 1



MainLoop:

; sprawdz czy w liczniku. Jesli tak, to zakoncz
cpi counter, 0
breq Finish

sbis PINB, 7
rjmp Up
sbis PINE, 5
rjmp Down

rjmp MainLoop



Down:
in diodes, PORTD
andi diodes, 0x0F
ori diodes, 0x20			;0b0010 0000(dolna zielona)
out PORTD, diodes

; jesli przycisk dalej wcisniety, powtarzaj
call Wait
sbis PINE, 5
rjmp Down

; w przeciwnym przypadku, zgas diode, dekrementuj i sprawdzaj przyciski
andi diodes, 0x0F
out PORTD, diodes
dec counter
rjmp MainLoop



Up:
in diodes, PORTD
andi diodes, 0x0F
ori diodes, 0x40			;0b0100 0000(górna zielona)
out PORTD, diodes

; jesli przycisk dalej wcisniety, powtarzaj
call Wait
sbis PINB, 7
rjmp Up

; w przeciwnym przypadku, zgas diode, inkrementuj i sprawdzaj przyciski
andi diodes, 0x0F
out PORTD, diodes
inc counter
rjmp MainLoop



Finish:
in diodes, PORTD
andi diodes, 0x0F
ori diodes, 0x90			;0b1001 0000(obie czerwone)
out PORTD, diodes

Finish2: rjmp Finish2

.undef counter
.undef diodes

; Funkcja czeka w petli
Wait:
.def waiter=R16
.def waiter2=R17
push waiter
push waiter2
ldi waiter, 0
WaitLoop2:
WaitLoop:
nop
nop
nop
nop
nop
inc waiter
cpi waiter, 0
brne WaitLoop
inc waiter2
cpi waiter2, 0
brne WaitLoop2
pop waiter2
pop waiter
.undef waiter
.undef waiter2
ret
