[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.
; outvalue=0
; PIA_output_port=outvalue

ldb 98,#00

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

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

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

;Αρχικοποιηση interrupts int6 kai int7
ei
orb 08,#A0
ldb 9E,1A01[00]
andb 9E,#3F
stb 9E,1A01[00]

; Ατέρμων βρόχος. Εδώ παράγουμε συνεχώς τις 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]
cmpb  80,86
jne  next4
orb 98,#04
ldb 9A,98
stb 9A,1b00[00]

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

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

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

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




[int7]
di
; στο σημείο αυτό τροποποιoυμε τις μεταβλητές σύγκρισης Qn
; έτσι ώστε να μειωθεί η φωτεινότητα των leds στο μισό.
; χρησιμοποιουμε εντολές ολίσθησης: shlb reg,reg1
; Επίσης ελέγχουμε τα όρια της ολίσθησης. 

ldb  9F,#01

shlb  82,9F
cmpb  82,#00
je  overf1

shlb  84,9F
cmpb  84,#00
je  overf1

shlb  86,9F
cmpb  86,#00
je  overf1

shlb  88,9F
cmpb  88,#00
je  overf1

shlb  90,9F
cmpb  90,#00
je  overf1

shlb  92,9F
cmpb  92,#00
je  overf1

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

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

[end]
ldb 98,#00
ldb 9A,98
stb 9A,1b00[00]
ldb 80,#00
ei
ret




[int6]
di
; στο σημείο αυτό τροποποιουμε τις μεταβλητές σύγκρισης Qn
; έτσι ώστε να διπλασιαστεί η φωτεινότητα των leds.
; χρησιμοποιουμε εντολές ολίσθησης: shrb reg,reg1
; Επίσης φροντίζουμε να ελέγχετε τα όρια της ολίσθησης. 

ldb  9F,#01

shrb  82,9F
cmpb  82,#00
je  overf2

shrb  84,9F
cmpb  84,#00
je  overf2

shrb  86,9F
cmpb  86,#00
je  overf2

shrb  88,9F
cmpb  88,#00
je  overf2

shrb  90,9F
cmpb  90,#00
je  overf2

shrb  92,9F
cmpb  92,#00
je  overf2

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

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

[end]
ldb 98,#00
ldb 9A,98
stb 9A,1b00[00]
ldb 80,#00
ei
ret


