[start]
;Αρχικοποιηση των μεταβλητων που θα χρησιμοποιησουμε
ldb  80,#0C	;"Μετρητης"=12=0C hex
ldb  82,#01	;flag για το σταματημα και την συνεχιση του μετρητη
ldb  84,#00	;αρχικοποιηση μεταβλητης που θα χρησιμοποιησω παρακατω στον timer

; Θέτουμε τα ports της PIA σε κατάσταση εξόδου (output)
; γράφοντας στη διεύθυνση της λέξης ελέγχου της PIA (1b03)
ldb  88,#80
stb  88,1b03[00]

; Χρησιμοποιουμε έναν καταχωρητή για να κρατάμε την τιμή που
; γράφετε στα ports της PIA.
ldb 90,#00	;Καταχωρητης σκια του portA
ldb 92,#00
stb 92,1b00[00]	;Γραφω την τιμη 0 στο portA

; Τοποθετουμε τα διανύσματα διακοπής για τα INT7, ΙΝΤ6 και τον timer και
; ενεργοποιουμε τις διακοπές.
ld   94,#int6
st   94,440c[00]	;για το int6
ld   94,#int7
st   94,440e[00]	;για το int7
ld   94,#timer
st   94,4f0c[00]	;για τον timer

ei

;Αρχικοποιηση interrupts int6 kai int7 και του timer
orb 08,#A0	;Ενεργοποιηση των εξωτερικων interrupts και του software timer interrupt
ldb 96,1A01[00]	; Interrupt Mask Register
andb 96,#3F	;IMR=00111111
stb 96,1A01[00]	;set IMR (enable INT7 και INT6)

;Εντολες για τον  software timer
ldb 06,#18	;επιλογη του Τimer0
ld 04,#F3A7	;εκκινηση του Τimer0

;Εδω δημιουργουμε ενα ατέρμων βρόχο
[loop]
sjmp loop





;καλειται καθε 62375 * 1336ns=83,333ms
[timer]
di
decb 80		;μειωση μεταβλητης "μετρητη"
jne  endti		;εξοδος αν δεν ειναι 0 (δηλαδη αν δεν εχει περασει ενα sec)

;Το σημειο αυτο εκτελειτε καθε 83,333 * 12 = ~1sec
ldb  80,#0C	;Αρχικοποιηση παλι του μετρητη με την τιμη 12 (0C hex)
cmpb 82,#00	;Ειναι το flag ενεργοποιησης του μετρητη ισο με 0;(δηλ ανενεργο)
je   endti		;αν ναι εξοδος(ετσι σταματα ο timer που δημιουργησαμε στην τρεχουσα κατασταση)

;Αυξηση του μετρητη που φτιαξαμε κατα 1 (δηλ αυξηση της τιμης του PortA κατα 1)
incb  90		;αυξηση κατα 1 του μετρητη δηλ του καταχωρητη σκιας του portA
cmpb 90,#9A	;ελεγχουμε αν η τιμη του μετρητη εχει περασει το οριο δηλ το 99 (δηλ. αν ειναι ιση με 9Α)
jne  next1	;αν οχι πηγενε στο next1
ldb 90,#00	;αλλιως μηδενισε την τιμη του μετρητη δηλ του καταχωρητη σκιας του portA
sjmp next2

[next1]
andb 84,90,#0f	;τωρα ο καταχωρητης 84 περιεχει το λιγοτερο σημαντικο byte(δηλ. τις μοναδες) του καταχωρητη σκιας 90 του portA
cmpb 84,#0A	;ελεγχουμε αν η τιμη των μοναδων ειναι ιση με 0Α (δηλ αν εχει υπερχυλισει) ωστε να γινει μετα 00 
jne next2		;αν οχι πηγενε στο next2
addb 90,#06	;αλλιως προσθεσε στην τιμη του μετρητη δηλ του καταχωρητη σκιας του portA την τιμη 06 (π.χ. αν ο 90 μετα το incb 90 εχει την τιμη 2Α τοτε αν του προσθεσω το 06 θα παρει την τιμη 30(σε BCD))

[next2]
ldb 92,90		
stb 92,1b00[00]	;αποθηκευση της νεας τιμης του μετρητη στο portA

;Νεα εντολη για software timer
[endti]
ldb  06,#18	;επιλογη του Τimer0
ld   04,#f3a7	;εκκινηση του Τimer0
ei
ret




;καλειται οταν υπαρξει interrupt στο INT6 (κουμπι Α)
[int6]
di
ldb  82,#00	;απενεργοποιηση του flag του μετρητη
ei
ret



;καλειται οταν υπαρξει interrupt στο INT7 (κουμπι Β)
[int7]
di
ldb  82,#01	;ενεργοποιηση του flag του μετρητη
ei
ret
