To Hardware του Rainbow Project σχεδιάζεται στο πρόγραμμα KiCad το οποίο είναι ελεύθερο λογισμικό. Αφού το κατεβάσετε μπορείτε να ανακτήσετε όλα τα σχηματικά μας και τις πλακέτες από το GitHub Repository του Project. Σε αυτό επίσης θα βρείτε μελλοντικά και τα προγράμματα που γράφουμε για το Ζ80 αλλά και για τους μικροελεγκτές των περιφερειακών μας συσκευών (π.χ. του κυκλώματος οθόνης).
Για βοήθεια στην ανάπτυξη του software έχουμε δημιουργήσει μια εικονική μηχανή (Virtual Machine) που περιλαμβάνει τον z80-asm cross assembler και τον εξομοιωτή z80-mon. Η εικονική μηχανή βασίζεται σε λειτουργικό σύστημα FreeBSD και έχει ελάχιστες απαιτήσεις. Για να τη χρησιμοποιήσετε:
- Κατεβάστε το VirtualBox από εδώ.
- Κατεβάστε την εικονική μηχανή με τα προγράμματα από εδώ.
- Κατεβάστε τις σημειώσεις που μοιράσαμε από εδώ.
Για να μπορέσετε φυσικά να καταλάβετε τι γίνεται θα χρειαστείτε ακόμα (ανοίγουν σε χωριστό παράθυρο):
- Το πίνακα εντολών του Ζ80 που δείχνει τις συμβολικές εντολές assembly, τη λειτουργία τους και τον τρόπο που επηρεάζουν τα flags.
- Το βιβλίο Programming the Z80 του Rodnay Zacks. Είναι το πλέον διάσημο βιβλίο για τον Ζ80.
- Την επίσημη τεκμηρίωση του Ζ80 από την ίδια τη Zilog
- To datasheet του 74HC138
- To datasheet του 74HC244
- To datasheet της EEPROM AT28C64 της Atmel
- To datasheet της στατικής RAM 6116
- Να μη ξεχνάμε και το (ταπεινό) NE555 timer!
Παρακάτω θα δούμε (και θα εξηγήσουμε) σε απλή μορφή μερικά από τα σχέδια των πειραμάτων μας (όλα τα παρακάτω σχηματικά θα τα βρείτε και στο GitHub repository)
Πείραμα 1 - Z80 Minimum Test Circuit
To minimum test circuit έχει σκοπό να δοκιμάσει τη λειτουργία του Ζ80 με όσο το δυνατόν λιγότερα εξωτερικά εξαρτήματα! Για το σκοπό αυτό συνδέεται πρακτικά μόνο ένα κύκλωμα ρολογιού (clock) το οποίο σε μας φτιάχθηκε με το 555 σε χαμηλή συχνότητα (5 - 10 Hz). Για να ξεκινήσει ο επεξεργαστής πρέπει να φτιάξουμε ένα υποτυπώδες σύστημα reset με διακοπτάκι και να συνδέσουμε κάποιους ακροδέκτες στα 5V. Συγκεκριμένα:
- Τους ακροδέκτες NMI και INT που χρησιμοποιούνται για να διακόψουν την κανονική λειτουργία και να εκτελέσουν διακοπή.
- Τον ακροδέκτη WAIT που χρησιμοποιείται για να περιμένει ο επεξεργαστής μια αργή μνήμη.
- Τον ακροδέκτη BUSRQ που χρησιμοποιείται για να πάρει τον έλεγχο των διαύλων κάποια άλλη συσκευή εκτός του επεξεργαστή.
Με τη σύνδεση στα 5V, οι παραπάνω λειτουργίες απενεργοποιούνται προκειμένου ο επεξεργαστής να μπορεί να "τρέξει" ελεύθερα. Στους ακροδέκτες του διαύλου διευθύνσεων συνδέονται LEDs που μας επιτρέπουν να βλέπουμε την απαρίθμηση διευθύνσεων καθώς ο επεξεργαστής εκτελεί τις εντολές τη μια μετά την άλλη. Και αν αναρρωτιέστε για ποιες εντολές μιλάμε, δείτε που συνδέεται ο διάυλος δεδομένων: στη γείωση, οπότε ο επεξεργαστής μας εκτελεί συνέχεια την εντολή "τίποτα" (NOP) με κωδικό (φυσικά) 00000000 (στο δυαδικό).
Πείραμα 2 - Δοκιμή του 74HC138
Το 74HC138 θα χρησιμοποιηθεί ως κύκλωμα αποκωδικοποίησης διευθύνσεων για τη μνήμη. Είναι ένας αποκωδικοποιητής 3 σε 8. Σε κάθε συνδυασμό ψηφίων των τριών εισόδων του, ενεργοποιείται μια από τις εξόδους. Η έξοδος χρησιμοποιείται για να ενεργοποιήσει μέσω του ακροδέκτη CS (Chip Select) ή CE (Chip Enable) το αντίστοιχο κύκλωμα μνήμης. Στο παραπάνω κύκλωμα βλέπουμε πως λειτουργεί το 74HC138 χρησιμοποιώντας διακοπτάκια και LED. Λεπτομέρεια: το 74HC138 στην πραγματικότητα δίνει λογικό μηδέν όταν ενεργοποιείται μια έξοδος (σβήνει δηλ. το αντίστοιχο LED). Αυτό όμως μας εξυπηρετεί γιατί το CS στα δικά μας κυκλώματα μνήμης είναι active low (τα κυκλώματα δηλ. ενεργοποιούνται με λογικό μηδέν).
Πείραμα 3 - Δοκιμή RAM
Για να γράψουμε και να διαβάσουμε τη RAM χρησιμοποιούμε το παραπάνω απλό κύκλωμα. Έχουμε 8 διακοπτάκια για να βάζουμε τιμή στη θέση μνήμης και 8 LED για να βλέπουμε τις τιμές. Έχουμε τέσσερα ακόμα διακοπτάκια για να επιλέξουμε τη διεύθυνση (οι υπόλοιπες γραμμές διευθύνσεων είναι στο μηδέν). Τέλος χρειαζόμαστε ένα button για να ειδοποιούμε τη μνήμη να κάνει την εγγραφή μέσω του ακροδέκτη Write Enable (WE) και ένα ακόμα για να ενεργοποιούμε την έξοδο (OE, Output Enable) όταν πρόκειται να κάνουμε ανάγνωση.
Πείραμα 4 - Ζ80 και ROM
Σε αυτό πείραμα συνδυάζουμε τις γνώσεις που έχουμε από τα προηγούμενα: γράφουμε ένα μικρό πρόγραμμα στη ROM μέσω ενός EPROM programmer και βάζουμε το Ζ80 να το εκτελέσει. Ουσιαστικά, αντικαθιστούμε την ψεύτικη μνήμη του minimum test circuit με τη ROM. Δεν χρειάζεται κύκλωμα αποκωδικοποίησης διευθύνσεων, καθώς δεν έχουμε παρά μόνο ένα τσιπάκι μνήμης. Η εκτέλεση του προγράμματος φαίνεται στα LEDs που έχουμε συνδέσει πλέον στο data bus (δίαυλο δεδομένων). Η σύνδεση γίνεται μέσω ενός κυκλώματος buffer 74HC244, διαφορετικά το αρκετό ρεύμα που χρειάζονται τα LEDs για να ανάψουν δε θα άφηνε το bus να λειτουργήσει κανονικά!
Πείραμα 5 - Intelligent Display Interface
Ο τρόπος που σχεδιάσαμε το κύκλωμα απεικόνισης έχει ιδιαίτερο ενδιαφέρον: Αν και θα μπορούσαμε να βάλουμε την οδήγηση απευθείας από το Ζ80, θα είχαμε προβλήματα με τα timings όταν λειτουργεί σε αργή ταχύτητα. Σκοπός μας είναι η απεικόνιση να γίνεται από πλευράς επεξεργαστή με όσο το δυνατόν πιο απλό τρόπο: Να στέλνει ο Ζ80 ένα χαρακτήρα ελέγχου ή προς εμφάνιση σε μια διεύθυνση εισόδου / εξόδου και ένα άλλο κύκλωμα να αναλαμβάνει τη διαδικασία απεικόνισης. Αυτό το επιτυγχάνουμε με το Intelligent Display Interface που σχεδιάσαμε:
- Ενας microcontroller MSP430G2553 έχει προγραμματιστεί να ελέγχει μια οθόνη LCD 16X2. Φυσιολογικά παραμένει σε sleep mode.
- Οταν ενεργοποιηθεί το IORQ του Ζ80, ο MSP ενεργοποιείται και λαμβάνει 8bit δεδομένα (ένα χαρακτήρα ελέγχου ή προς εμφάνιση) από το data bus.
- O MSP στέλνει τα δεδομένα αυτά για απεικόνιση στην οθόνη με τα σωστά πάντα timings και επιστρέφει σε sleep mode.
Εξασφαλίζουμε έτσι γρήγορη απεικόνιση, ακόμα και όταν ο επεξεργαστής μας είναι σε πολύ χαμηλή ταχύτητα. Η μόνη άλλη ιδιαιτερότητα της κατασκευής είναι ότι πρέπει να μετατρέψουμε τα 5V του Ζ80 σε 3.3V για τον MSP διαφορετικά θα τον καταστρέψουμε! Για το σκοπό αυτό χρησιμοποιούμε διαιρέτες τάσης με αντιστάσεις 39Κ και 56Κ και ένα κύκλωμα 74HC244 ως buffer (διαφορετικά φορτώνουμε υπερβολικά το δίαυλο του Ζ80). Το ακριβές πρωτόκολλο επικοινωνίας δεν έχει ολοκληρωθεί ακόμα. θα περιέχει μεταξύ άλλων χαρακτήρες ελέγχου για καθαρισμό της οθόνης καθώς και εμφάνιση χαρακτήρα σε συγκεκριμένη θέση. Ο κώδικας θα δημοσιευτεί φυσικά στο GitHub repository.