Πίνακας περιεχομένων:

6502 Ελάχιστος Υπολογιστής (με Arduino MEGA) Μέρος 3: 7 Βήματα
6502 Ελάχιστος Υπολογιστής (με Arduino MEGA) Μέρος 3: 7 Βήματα

Βίντεο: 6502 Ελάχιστος Υπολογιστής (με Arduino MEGA) Μέρος 3: 7 Βήματα

Βίντεο: 6502 Ελάχιστος Υπολογιστής (με Arduino MEGA) Μέρος 3: 7 Βήματα
Βίντεο: История CPU: MOS 6502 2024, Ιούλιος
Anonim
6502 Minimal Computer (με Arduino MEGA) Μέρος 3
6502 Minimal Computer (με Arduino MEGA) Μέρος 3

Προχωρώντας ακόμη περισσότερο, τώρα έχω προσθέσει ένα Octal Latch, 8 ορθογώνια LED και έναν πίνακα αντιστάσεων 220 Ohm στην κύρια πλακέτα. Υπάρχει επίσης ένας βραχυκυκλωτήρας μεταξύ του κοινού πείρου και της γείωσης του πίνακα, έτσι ώστε να μπορούν να απενεργοποιηθούν τα LED. Η πύλη 74HC00 NAND έχει αντικατασταθεί με μια πύλη 78LS08 AND, η καλωδίωση στην πύλη έχει επίσης αλλάξει. Η πύλη AND σημαίνει ότι το 6522 βρίσκεται τώρα στα 6000 $ αντί για E000 $.

Υπάρχει επίσης μια καρφίτσα για τη σύνδεση ενός εξωτερικού ρολογιού για την οδήγηση του 6502. Με αυτήν τη σύνδεση, δεν χρειάζεται το MEGA να παρέχει σήμα ρολογιού. Το MEGA εξακολουθεί να παρακολουθεί τι συμβαίνει με τον επεξεργαστή όπως πριν.

Χρησιμοποίησα ένα 20 ακίδων 74HC373 για το μάνταλο γιατί είχα μερικά. Αυτό ήταν εντάξει όταν ήταν στο breadboard, αλλά ένα 74HC573 είναι συμβατό με το λεωφορείο και θα είχε εξοικονομήσει φορτία καλωδίωσης. Το UCN5801A που είναι IC 22 ακίδων μπορεί επίσης να ληφθεί υπόψη στο κύκλωμα, αλλά η καλωδίωση θα είναι ελαφρώς διαφορετική.

Το επάνω, μονό πορτοκαλί LED είναι ένδειξη ισχύος και το κάτω αριστερό κόκκινο δείχνει πότε λαμβάνει χώρα μια εγγραφή. Το τελευταίο θα είναι ασήμαντο εάν ο πίνακας λειτουργεί σε υψηλότερες ταχύτητες.

Το τροποποιημένο κύκλωμα είναι παραπάνω (με το 74HC573).

Βήμα 1: Προγράμματα επίδειξης

Προγράμματα επίδειξης
Προγράμματα επίδειξης

Δύο απλά προγράμματα επίδειξης περιλαμβάνονται στην οθόνη 6502 και ο αποσυναρμολογημένος κωδικός τους είναι εδώ.

Αυτό το πρόγραμμα φορτώνει 1 στο μητρώο 6502 A και το αποθηκεύει στο μάνδαλο. Στη συνέχεια προσθέτει 1 στο μητρώο Α και το αποθηκεύει στο μάνδαλο. Στη συνέχεια, επιστρέφει στα 1005 $ και η διαδικασία επαναλαμβάνεται για πάντα.

* = 1000

1000 A9 01 LDA #$ 01 1002 8D 00 41 STA $ 4100 1005 69 01 ADC #$ 01 1007 8D 00 41 STA $ 4100 100A 4C 05 10 JMP $ 1005 100DEND

Αυτό το πρόγραμμα θέτει πρώτα το DDR της θύρας 6522 στην έξοδο. Στη συνέχεια αποθηκεύει 55 $ (B01010101) στη θύρα καθώς και το μάνδαλο. Στη συνέχεια, ο καταχωρητής A περιστρέφεται 1 βήμα δεξιά και κρατά τώρα $ AA (B10101010). Αυτό αποθηκεύεται ξανά στη θύρα Β και το μάνδαλο. Το πρόγραμμα επιστρέφει στα 1005 $ και συνεχίζεται για πάντα.

* = 1000

1000 A9 FF LDA #$ FF 1002 8D 02 60 STA $ 6002 1005 A9 55 LDA #$ 55 1007 38 SEC 1008 8D 00 60 STA $ 6000 100B 8D 00 41 STA $ 4100 100E 6A ROR A 100F 8D 00 60 STA $ 6000 1012 8D 00 41 STA $ 4100 1015 4C 05 10 JMP 1005 1018 $. END

Τα έντονα μάτια μεταξύ σας μπορεί να παρατηρήσουν ότι τα έγχρωμα LED δείχνουν διαφορετικό μοτίβο από τα πράσινα. Αυτό συμβαίνει επειδή το κοινό καλώδιο συνδέεται με 5v στα έγχρωμα και το κοινό στα πράσινα συνδέεται με τη γείωση.

Αλλάξτε αυτήν τη γραμμή κώδικα σε program2 ή program3.

setDataPins (πρόγραμμα3 [μετατόπιση]);

Ένα 6502 Assembler και Disassembler είναι χρήσιμα εργαλεία που βοηθούν στην κωδικοποίηση των προγραμμάτων σας.

Βήμα 2: Προσθήκη EEPROM

Προσθήκη EEPROM
Προσθήκη EEPROM
Προσθήκη EEPROM
Προσθήκη EEPROM
Προσθήκη EEPROM
Προσθήκη EEPROM

Για τον πίνακα EEPROM, χρησιμοποίησα έναν πίνακα ταινίας 950 x 650 mm και αρσενικούς πείρους κεφαλίδας 19 mm για να επιτρέψω στην πλακέτα να καθαρίσει αυτή από κάτω. Αυτή η πλακέτα συνδέεται στον πίνακα 6502 παρακάτω. Το EEPROM είναι ένα ATMEL 28C256 το οποίο έχει 28 ακίδες και περιέχει 32k x 8 bits μνήμης. Αυτό είναι περισσότερο από επαρκές για τα μικρά προγράμματα που χρησιμοποιούνται προς το παρόν.

Δεν έχω κάνει ένα διάγραμμα κυκλώματος για αυτόν τον πίνακα, αλλά είναι αρκετά απλό πώς συνδέεται με τον πίνακα 6502 παρακάτω. Αυτά τα τσιπ EEPROM δεν είναι φιλικά προς το λεωφορείο, επομένως πρέπει να συνδεθούν με τις μεμονωμένες ακίδες, εξ ου και όλα τα "πράσινα και άσπρα μακαρόνια". Έχω λύσει το πρόβλημα γεφύρωσης στον προηγούμενο πίνακα συνδέοντας τις γραμμές δεδομένων στην κάτω πλευρά του πίνακα.

Οι 14 ακίδες διεύθυνσης του EEPROM συνδέονται με τους κατάλληλους πείρους στην αριστερή πλευρά (πράσινα καλώδια) και οι ακίδες εισόδου/εξόδου με τους ακροδέκτες δεδομένων στη δεξιά πλευρά (λευκά σύρματα). Ο πείρος 27 (WE) συνδέεται με τον πείρο 28 (5v), ο πείρος 22 (OE) συνδέεται με τη γείωση και ο πείρος 20 (CE) συνδέεται με μια πύλη NAND. Οι 2 είσοδοι της πύλης NAND συνδέονται με το A15 στο κεντρική πλακέτα. Αυτό σημαίνει ότι όταν αυτός ο πείρος ανεβαίνει ψηλά, η πύλη NAND δίνει χαμηλό σήμα στον ακροδέκτη CE του EEPROM που το καθιστά ενεργό. Με αυτήν τη ρύθμιση σημαίνει ότι το EEPROM μπορεί να διαβαστεί μόνο από το 6502.

Καθώς το EEPROM ζει στα κορυφαία 32k του χάρτη μνήμης, σημαίνει ότι τα $ FFFC και $ FFFD μπορούν να διατηρήσουν τη διεύθυνση εκκίνησης για το 6502 μετά την επαναφορά του. Με το 6522 να έχει τις διευθύνσεις του μεταξύ $ 6000 και $ 600F και το μάνταλο είναι 4100 $, σταματά κάθε διένεξη μνήμης.

Το διάνυσμα NMI ($ FFFA και $ FFFB) και το διάνυσμα BRK / IRQ ($ FFFE και $ FFFF) θα μπορούσαν επίσης να γραφτούν με τον ίδιο τρόπο.

Βήμα 3: Προγραμματισμός του EEPROM

Προγραμματισμός του EEPROM
Προγραμματισμός του EEPROM
Προγραμματισμός του EEPROM
Προγραμματισμός του EEPROM

Για να αποθηκεύσετε ένα πρόγραμμα στο EEPROM, χρειάζεται προγραμματιστή. Έφτιαξα ένα από έναν πίνακα λωρίδας, ένα Arduino Pro Mini, ένα ζευγάρι 74HC595 και μια πρίζα ZIF. Αρχικά, ο προγραμματιστής δημιουργήθηκε για ένα AT28C16 το οποίο έχει λιγότερες γραμμές διευθύνσεων από το AT28C256 και έτσι έπρεπε να τροποποιηθεί.

Το διάγραμμα κυκλώματος δείχνει πώς να συνδέσετε και τα δύο αυτά EEPROM. Δεν είναι σαφές από τη φωτογραφία ότι οι δύο 595 μάρκες είναι ανάποδες και όχι όπως φαίνεται στο διάγραμμα. Οι ακίδες 1 έως 7 του 595/1 ευθυγραμμίζονται με το Α1 έως το Α7 της EEPROM ανεξάρτητα από το ποια χρησιμοποιείται. Αυτό εξοικονομεί 7 καλώδια σύνδεσης. Ο πίνακας φαίνεται τώρα λίγο σφιχτός και αυτό συμβαίνει επειδή αρχικά χρησιμοποίησα μια πρίζα DIL 24 ακίδων, η οποία τώρα αντικαταστάθηκε από την πολύ μεγαλύτερη υποδοχή ZIF 28 ακίδων.

Περιλαμβάνεται ένα πρόγραμμα που λειτουργεί με τον πίνακα μου. Το πρόγραμμα θα λειτουργήσει με οποιοδήποτε Arduino και 595 σε ένα κύκλωμα όπως φαίνεται. Επέλεξα ένα 5v Pro Mini επειδή είναι συμπαγές και αρκετά φθηνό για να το αφήσω στο στήσιμο.

Βήμα 4: Τα προγράμματα EEPROM

Τα προγράμματα EEPROM
Τα προγράμματα EEPROM

Υπάρχουν τρία απλά προγράμματα στον προγραμματιστή EEPROM. Για να τα χρησιμοποιήσετε, απλώς σχολιάστε τη γραμμή που θέλετε να χρησιμοποιήσετε.

// Διαβάστε από τη θύρα Α του 6522

// const byte data = {0xA9, 0x00, 0x8D, 0x03, 0x60, 0xAD, 0x01, 0x60, 0x4C, 0x05, 0x90, 0x00};

Το πρόγραμμα εμφανίζει μια ένδειξη μνήμης όταν τελειώσει. Το τμήμα του παρακάτω προγράμματος σάς δίνει τον πλήρη έλεγχο του τι θέλετε να γράψετε ή να διαγράψετε, ορίζει $ FFFC & $ FFFD και στη συνέχεια εμφανίζει το περιεχόμενο μιας δεδομένης περιοχής. Απλώς σχολιάστε ή τροποποιήστε τις παραμέτρους όπως θέλετε. Οι διευθύνσεις μπορούν επίσης να εισαχθούν σε δεκαδική μορφή.

// διαγραφή EEPROM (422, 930, 0x41); // Χρησιμοποιήστε το για να διαγράψετε ολόκληρο ή μέρος του EEPROM - έναρξη, τέλος, byte

Serial.println ("Προγραμματισμός EEPROM"); ποσό = program_numeric_data (0x1000)? writeEEPROM (0x7ffc, 0x00); // Ορίστε $ FFFC για 6502 writeEEPROM (0x7ffd, 0x90); // Ορίστε $ FFFD για 6502 // writeEEPROM (0x1000, 0xA9); // Γράψτε 1 byte δεδομένων Serial.println ("done"); String outline = "Γραμμένο" + (String) ποσό + "bytes"; Serial.println (περίγραμμα); Serial.println ("Ανάγνωση EEPROM"); printContents (0x0000, 0x112f); // Ορισμός εύρους για εμφάνιση printContents (0x7ff0, 0x7fff); // Διαβάζει τα τελευταία 16 byte στο EEPROM

Μια συνοπτική έξοδος από το πρόγραμμα είναι παραπάνω.

Βήμα 5: Εκτέλεση του 6502 Από το EEPROM

Εκτέλεση του 6502 From EEPROM
Εκτέλεση του 6502 From EEPROM
Εκτέλεση του 6502 From EEPROM
Εκτέλεση του 6502 From EEPROM
Εκτέλεση του 6502 From EEPROM
Εκτέλεση του 6502 From EEPROM

Το προγραμματισμένο EEPROM μπορεί τώρα να εισαχθεί στον πίνακα του και αυτό το κουμπαρά επιστρέφει στον κύριο πίνακα 6502, τον οποίο ο κουμπαράς στηρίζει στο MEGA. Οι φωτογραφίες στο πλάι και στην πάνω όψη δείχνουν πώς ταιριάζουν όλα μεταξύ τους.

Το 6502 μπορεί τώρα να διαβάσει το διάνυσμα έναρξης από $ FFFC και $ FFFD (που είναι $ 9000) και στη συνέχεια να μεταβεί στο πρόγραμμα που είναι αποθηκευμένο εκεί. Το MEGA εξακολουθεί να παρέχει το σήμα του ρολογιού και το πρόγραμμά του πρέπει να τροποποιηθεί για να παρέχει μόνο το σήμα του ρολογιού και να παρακολουθεί το 6502. Παρέχεται τροποποιημένο πρόγραμμα για να γίνει αυτό.

Η τρέχουσα φωτογραφία δείχνει αυτό το πρόγραμμα να λειτουργεί.

9000 LDA #$ 00 A9 00

9002 STA $ 6003 8D 03 60 9005 LDA #$ FF A9 FF 9007 STA $ 6002 8D 02 60 900A LDA $ 6001 AD 01 60 900D STA $ 6000 8D 00 60 9010 EOR #$ FF 49 FF 9012 STA $ 4100 8D 00 41 9015 JMP $ 900A 4C 0A 90

Οι διακόπτες είναι συνδεδεμένοι στη θύρα Α και το πρόγραμμα εμφανίζει την τιμή που διαβάζει στη θύρα Β και το 74HC373 (το οποίο καλύπτεται προς το παρόν). οι διακόπτες συνδέονται με τη γείωση και οι λυχνίες LED συνδέονται με 5v. Το EOR #$ FF διορθώνει το πρόβλημα του μανδάλου και της θύρας Β που εμφανίζουν διαφορετικά μοτίβα αναστρέφοντας τα bits πριν γράψετε στο μάνδαλο.

Βήμα 6: Εξωτερικό σήμα ώρας

Εξωτερικό σήμα χρόνου
Εξωτερικό σήμα χρόνου

Εάν εφαρμοστεί ένα σήμα ρολογιού στην ακίδα στο πάνω μέρος της πλακέτας, το 6502 μπορεί τώρα να λειτουργεί ανεξάρτητα από το MEGA. Φυσικά χρειάζεται και τροφοδοτικό. Έχω πειραματιστεί με διαφορετικά ρολόγια και μάλιστα τρέχω το 6502 στα 1MHz με έναν κρυσταλλικό ταλαντωτή. Το MEGA δεν μπορεί να συμβαδίσει με υψηλότερες ταχύτητες, οπότε πρέπει να αφαιρεθεί.

Δοκίμασα επίσης την έξοδο από ένα χρονόμετρο 555 αλλά αυτό δεν λειτουργεί. Νομίζω ότι μπορεί να είναι επειδή δεν είναι τετράγωνο κύμα; Όταν συνδέθηκε σε μία από τις εξόδους CD4017, οδήγησε το 6502. Έφτιαξα σε ένα από τα παραπάνω κιτ για να προσπαθήσω να λάβω σήμα ρολογιού.

Εξακολουθώ να εξετάζω διαφορετικές μεθόδους για να λάβω σήμα ρολογιού.

Βήμα 7: Συμπέρασμα

Έχω δείξει πώς να φτιάξω μερικά πολύπλοκα κυκλώματα και να κάνω έναν πολύ απλό "υπολογιστή" να λειτουργεί με ελάχιστο αριθμό εξαρτημάτων. Βεβαίως, ο υπολογιστής δεν μπορεί να κάνει πολλά προς το παρόν ή είναι πιθανό να το κάνει στο μέλλον.

Στις αρχές της δεκαετίας του '80, με το VIC20 μου, συνήθιζα να αναρωτιέμαι για το φοβερό μηχάνημα και δεν είχα την πρώτη ιδέα για το πώς να ξεκινήσω να το συνδυάζω. Οι καιροί έχουν προχωρήσει και το ίδιο και η τεχνολογία, αλλά είναι ακόμα ωραίο να επιστρέφεις στα βασικά και να είσαι περήφανος για κάτι που έχεις χτίσει από την αρχή.

Για περαιτέρω ανάπτυξη αυτού του υπολογιστή, σκοπεύω να βάλω 2k SRAM στα $ 0000 έως $ 2047 και να προσθέσω έναν ταλαντωτή 1 MHz. Πιθανότατα θα προσθέσω κάτι σαν CD4040 (12-Stage Binary Ripple Counter / Divider), ώστε να μπορώ να αξιοποιήσω διαφορετικές ταχύτητες ρολογιού.

Μπορεί ακόμη και να προσθέσει μια οθόνη LCD για να δώσει έξοδο κειμένου και όχι απλώς φώτα που αναβοσβήνουν. Ο προγραμματιστής EEPROM θα πρέπει επίσης να τροποποιηθεί για να αντιμετωπίσει τα μεγαλύτερα προγράμματα που απαιτούνται για την εκτέλεση μιας οθόνης LCD.

Παρόλο που το MEGA καθίσταται περιττό για τη λειτουργία του 6502, εξακολουθεί να είναι χρήσιμο για τον εντοπισμό σφαλμάτων στον κώδικα του μηχανήματος. Όπως γνωρίζει κανείς, ο κώδικας του μηχανήματος περιέχει πάντα σφάλματα!

Συνιστάται: