; ΟΔΗΓΙΕΣ ΧΡΗΣΗΣ ΤΟΥ ΥΠΟΔΕΙΓΜΑΤΟΣ
;
; 1. Η χρήση του  υποδείγματος ως βάση για το πρόγραμμά σας
; είναι ΥΠΟΧΡΕΩΤΙΚΗ. Μπορείτε να προσθέσετε εντολές και να 
; διαλέξετε τους καταχωρητές που χρησιμοποιούνται αλλά ΔΕΝ ΠΡΕΠΕΙ
; να αλλάξετε τη δομή του υποδείγματος.
; 
; 2. Πριν τη χρήση του υποδείγματος διαγράψτε ΟΛΕΣ τις γραμμές
; σχολίων. Στο τελικό πρόγραμμα πρέπει να υπάρχουν μόνο λατινικοί
; χαρακτήρες (ANSI text).

[start]

; Αρχικοποιήστε τον μετρητή C και τις μεταβλητές σύγκρισης Qn για
; τα 7 κανάλια PWM στις τιμές #20,#40,#60,#80,#A0,#C0,#E0 

ldb  80,#00

ldb  82,#20
ldb  84,#40
ldb  86,#60
ldb  88,#80
ldb  90,#A0
ldb  92,#C0
ldb  94,#E0

; Θέστε τα ports της PIA σε κατάσταση εξόδου (output)
; γράφοντας στη διεύθυνση της λέξης ελέγχου της PIA (1b03)

ldb  96,#80
stb  96,1b03[00]

; Χρησιμοποιήστε έναν καταχωρητή για να κρατάτε την τιμή που
; γράφετε στα ports της PIA. ΜΗΝ ΔΙΑΒΑΖΕΤΕ τα ports εξόδου!
; outvalue=0
; PIA_output_port=outvalue

ldb 98,#00

ldb 9A,#00
stb 9A,1b00[00]

; Τοποθετήστε τα διανύσματα διακοπής για τα INT7 και ΙΝΤ6 και
; ενεργοποιήστε τις διακοπές INT7 και INT6. Δείτε το παράδειγμα
; της 1ης άσκησης.

ld   9B,#int6
st   9B,440c[00]
ld   9B,#int7
st   9B,440e[00]

ei

; Ατέρμων βρόχος. Εδώ παράγετε συνεχώς τις 7 παλμοσειρές
; του PWM. Υλοποιήστε τον βρόχο ως εξής:

[loop]
; C+=1
incb  80

; if (C!=0) goto next1
cmpb 80,#00
jne  #next1
; outvalue=0
ldb 98,#00
; PIA_output_port=outvalue
ldb 9A,98
stb 9A,1b00[00]
; goto loop
sjmp loop

[next1]
; if (C!=Q1) goto next2
cmpb  80,82
jne  #next2
; outvalue|=τιμή_που_θέτει_το κανάλι1_σε_HIGH
orb 98,#01
ldb 9A,98
stb 9A,1b00[00]

[next2]
; if (C!=Q2) goto next3
cmpb  80,84
jne  #next3
; outvalue|=τιμή_που_θέτει_το κανάλι2_σε_HIGH
orb 98,#02
ldb 9A,98
stb 9A,1b00[00]

[next3]
; ...
; κ.λ.π.
; ...
; PIA_output_port=outvalue

cmpb  80,86
jne  #next4
orb 98,#03
ldb 9A,98
stb 9A,1b00[00]

[next4]
cmpb  80,88
jne  #next5
orb 98,#04
ldb 9A,98
stb 9A,1b00[00]

[next5]
cmpb  80,90
jne  #next6
orb 98,#05
ldb 9A,98
stb 9A,1b00[00]

[next6]
cmpb  80,92
jne  #next7
orb 98,#06
ldb 9A,98
stb 9A,1b00[00]

[next7]
cmpb  80,92
jne  #next8
orb 98,#07
ldb 9A,98
stb 9A,1b00[00]

[next8]
ljmp loop  


[int7]
di
; στο σημείο αυτό τροποποιήστε τις μεταβλητές σύγκρισης Qn
; έτσι ώστε να μειωθεί η φωτεινότητα των leds στο μισό.
; ΠΡΟΣΟΧΗ!!! Αν χρησιμοποιείτε εντολές ολίσθησης:
; ΜΗΝ ΧΡΗΣΙΜΟΠΟΙΗΣΕΤΕ π.χ shlb reg,#01 ΑΛΛΑ shlb reg,reg1 (με reg1=1).
; Επίσης φροντίστε να ελέγχετε τα όρια της ολίσθησης. 

ldb  9E,#01

shrb  82,9E
cmpb  82,#00
je  overfl

shrb  84,9E
cmpb  84,#00
je  overfl

shrb  86,9E
cmpb  86,#00
je  overfl

shrb  88,9E
cmpb  88,#00
je  overfl

shrb  90,9E
cmpb  90,#00
je  overfl

shrb  92,9E
cmpb  92,#00
je  overfl

shrb  94,9E
cmpb  94,#00
jne  end

[overfl]
ldb  82,#20
ldb  84,#40
ldb  86,#60
ldb  88,#80
ldb  90,#A0
ldb  92,#C0
ldb  94,#E0

[end]
ei
ret



[int6]
di
; στο σημείο αυτό τροποποιήστε τις μεταβλητές σύγκρισης Qn
; έτσι ώστε να διπλασιαστεί η φωτεινότητα των leds.
; ΠΡΟΣΟΧΗ!!! Αν χρησιμοποιείτε εντολές ολίσθησης:
; ΜΗΝ ΧΡΗΣΙΜΟΠΟΙΗΣΕΤΕ π.χ. shlb reg,#01 ΑΛΛΑ shlb reg,reg1 (με reg1=1).
; Επίσης φροντίστε να ελέγχετε τα όρια της ολίσθησης. 

ldb  9E,#01

shlb  82,9E
cmpb  82,#00
je  overfl

shlb  84,9E
cmpb  84,#00
je  overfl

shlb  86,9E
cmpb  86,#00
je  overfl

shlb  88,9E
cmpb  88,#00
je  overfl

shlb  90,9E
cmpb  90,#00
je  overfl

shlb  92,9E
cmpb  92,#00
je  overfl

shlb  94,9E
cmpb  94,#00
jne  end

[overfl]
ldb  82,#20
ldb  84,#40
ldb  86,#60
ldb  88,#80
ldb  90,#A0
ldb  92,#C0
ldb  94,#E0

[end]
ei
ret


