Table des matières:

6502 Ordinateur minimal (avec Arduino MEGA) Partie 3 : 7 étapes
6502 Ordinateur minimal (avec Arduino MEGA) Partie 3 : 7 étapes

Vidéo: 6502 Ordinateur minimal (avec Arduino MEGA) Partie 3 : 7 étapes

Vidéo: 6502 Ordinateur minimal (avec Arduino MEGA) Partie 3 : 7 étapes
Vidéo: Управление серводвигателем с помощью кнопки: перемещение сервопривода и возврат SPB-1 2024, Juillet
Anonim
6502 Ordinateur minimal (avec Arduino MEGA) Partie 3
6502 Ordinateur minimal (avec Arduino MEGA) Partie 3

Pour aller plus loin, j'ai maintenant ajouté un verrou octal, 8 LED rectangulaires et un réseau de résistances de 220 ohms à la carte principale. Il y a également un cavalier entre la broche commune de la matrice et la masse, de sorte que les LED puissent être éteintes. La porte NAND 74HC00 a été remplacée par une porte ET 78LS08, le câblage vers la porte a également été modifié. La porte ET signifie que le 6522 est maintenant situé à 6000 $ au lieu de E000 $.

Il y a aussi une broche pour la connexion d'une horloge externe pour piloter le 6502. Avec cette connexion, il n'est pas nécessaire que le MEGA fournisse un signal d'horloge. Le MEGA surveille toujours ce qui se passe avec le processeur comme avant.

J'ai utilisé un 74HC373 à 20 broches pour le loquet car j'en avais. C'était OK sur la maquette, mais un 74HC573 est compatible avec le bus et aurait économisé des charges de câblage. L'UCN5801A, qui est un circuit intégré à 22 broches, peut également être pris en compte dans le circuit, mais le câblage sera légèrement différent.

La LED orange unique du haut est un indicateur d'alimentation et la LED rouge en bas à gauche indique quand une écriture est en cours. Ce dernier sera insignifiant si la planche est exécutée à des vitesses plus élevées.

Le circuit modifié est au dessus (avec le 74HC573).

Étape 1: Programmes de démonstration

Programmes de démonstration
Programmes de démonstration

Deux programmes de démonstration simples sont inclus dans le moniteur 6502 et leur code désassemblé est ici.

Ce programme charge 1 dans le registre 6502 A et le stocke dans la bascule. Il ajoute ensuite 1 au registre A et le stocke dans le verrou. Ensuite, il revient à 1005 $ et le processus se répète indéfiniment.

* = 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 100D. END

Ce programme définit d'abord la DDR du 6522 port B en sortie. Il stocke ensuite 55 $ (B01010101) dans le port ainsi que le loquet. Le registre A tourne ensuite d'un pas vers la droite et contient maintenant $AA (B10101010). Ceci est à nouveau stocké dans le port B et le verrou. Le programme revient à 1005 $ et se poursuit pour toujours.

* = 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

Les plus perspicaces parmi vous remarqueront peut-être que les LED colorées affichent un motif différent de celui des vertes. C'est parce que le fil commun est connecté à 5v sur ceux de couleur et le commun sur les verts est connecté à la terre.

Remplacez cette ligne de code par program2 ou program3.

setDataPins(program3[offset]);

Un assembleur et un désassembleur 6502 sont des outils utiles pour vous aider à encoder vos programmes.

Étape 2: Ajout d'une EEPROM

Ajout d'une EEPROM
Ajout d'une EEPROM
Ajout d'une EEPROM
Ajout d'une EEPROM
Ajout d'une EEPROM
Ajout d'une EEPROM

Pour la carte EEPROM, j'ai utilisé une carte à bande de 950 x 650 mm et des broches d'en-tête mâles de 19 mm pour permettre à la carte d'effacer celle en dessous. Cette carte se branche sur la carte 6502 ci-dessous. L'EEPROM est un ATMEL 28C256 qui a 28 broches et contient 32k x 8 bits de mémoire. C'est plus que suffisant pour les petits programmes utilisés actuellement.

Je n'ai pas fait de schéma de circuit pour cette carte, mais sa connexion à la carte 6502 ci-dessous est assez simple. Ces puces EEPROM ne sont pas compatibles avec les bus et doivent donc être câblées aux broches individuelles, d'où tous les "spaghettis verts et blancs". J'ai résolu le problème de pontage sur la carte précédente en câblant les lignes de données ensemble sous la carte.

Les 14 broches d'adresse de l'EEPROM se connectent aux broches appropriées sur le côté gauche (fils verts) et les broches E/S aux broches de données sur la droite (fils blancs). La broche 27 (WE) est connectée à la broche 28 (5v), la broche 22 (OE) est connectée à la masse et la broche 20 (CE) est connectée à une porte NAND. Les 2 entrées de la porte NAND sont connectées à A15 sur le carte principale. Cela signifie que lorsque cette broche passe au niveau haut, la porte NAND donne un signal faible à la broche CE de l'EEPROM qui la rend active. Avec cette configuration, cela signifie que l'EEPROM ne peut être lu que par le 6502.

Comme l'EEPROM réside dans les 32 premiers Ko de la carte mémoire, cela signifie que $FFFC et $FFFD peuvent contenir l'adresse de début du 6502 après sa réinitialisation. Avec le 6522 ayant ses adresses entre 6000 $ et 600F et le verrou est à 4100 $, il arrête tout conflit de mémoire.

Le vecteur NMI ($FFFA et $FFFB) et le vecteur BRK / IRQ ($FFFE et $FFFF) pourraient également s'écrire de la même manière.

Étape 3: Programmation de l'EEPROM

Programmation de l'EEPROM
Programmation de l'EEPROM
Programmation de l'EEPROM
Programmation de l'EEPROM

Pour stocker un programme sur l'EEPROM, il faut un programmeur. J'en ai fabriqué un à partir d'une carte à bande, d'un Arduino Pro Mini, de quelques 74HC595 et d'un socket ZIF. A l'origine, le programmateur a été conçu pour un AT28C16 qui a moins de lignes d'adresse que l'AT28C256 et a donc dû être modifié.

Le schéma de circuit montre comment câbler ces deux EEPROM. Il n'est pas clair d'après la photo que les deux puces 595 sont à l'envers et non comme indiqué sur le schéma. Les broches 1 à 7 de 595/1 s'alignent avec A1 à A7 de l'EEPROM quel que soit celui qui est utilisé. Cela permet d'économiser 7 fils de connexion. La carte semble maintenant un peu serrée et c'est parce qu'à l'origine j'ai utilisé une prise DIL à 24 broches qui a maintenant été remplacée par la prise ZIF à 28 broches beaucoup plus grande.

Un programme est inclus qui fonctionne avec ma carte. Le programme fonctionnera avec n'importe quel Arduino et 595 dans un circuit comme indiqué. J'ai choisi un 5v Pro Mini car il est suffisamment compact et bon marché pour le laisser en place.

Étape 4: Les programmes EEPROM

Les programmes EEPROM
Les programmes EEPROM

Il existe trois programmes simples dans le programmeur EEPROM. Pour les utiliser, décommentez simplement la ligne que vous souhaitez utiliser.

// Lecture depuis le port A de 6522

//données d'octets const = {0xA9, 0x00, 0x8D, 0x03, 0x60, 0xAD, 0x01, 0x60, 0x4C, 0x05, 0x90, 0x00};

Le programme affiche un vidage de la mémoire lorsqu'il est terminé. La partie du programme ci-dessous vous donne un contrôle total sur ce que vous voulez écrire ou effacer, définit $FFFC et $FFFD, puis affiche le contenu d'une plage donnée. Décommentez ou modifiez simplement les paramètres selon vos besoins. Les adresses peuvent également être saisies au format décimal.

// effacerEEPROM(422, 930, 0x41); // Utiliser pour effacer tout ou partie de l'EEPROM - début, fin, octet

Serial.println("Programmation EEPROM"); montant = program_numeric_data (0x1000); écrireEEPROM (0x7ffc, 0x00); // Définir $FFFC pour 6502 writeEEPROM (0x7ffd, 0x90); // Définir $FFFD pour 6502 //writeEEPROM (0x1000, 0xA9); // Ecrit 1 octet de données Serial.println(" done"); Contour de chaîne = " Écrit " + montant (chaîne) + " octets"; Serial.println(contour); Serial.println("Lecture EEPROM"); printContents (0x0000, 0x112f); // Définir la plage pour afficher printContents(0x7ff0, 0x7fff); // Lit les 16 derniers octets de l'EEPROM

Une sortie abrégée du programme est ci-dessus.

Étape 5: Exécuter le 6502 à partir de l'EEPROM

Exécution du 6502 à partir de l'EEPROM
Exécution du 6502 à partir de l'EEPROM
Exécution du 6502 à partir de l'EEPROM
Exécution du 6502 à partir de l'EEPROM
Exécution du 6502 à partir de l'EEPROM
Exécution du 6502 à partir de l'EEPROM

L'EEPROM programmée peut maintenant être insérée dans sa carte et ce ferroutage sur la carte principale 6502 qui se greffe sur le MEGA. Les photos de côté et de dessus ci-dessus montrent comment tout cela s'emboîte.

Le 6502 peut maintenant lire le vecteur de démarrage à partir de $FFFC et $FFFD (qui est de 9000 $), puis passer au programme qui y est stocké. Le MEGA fournit toujours le signal d'horloge et son programme doit être modifié pour fournir uniquement le signal d'horloge et surveiller le 6502. Un programme modifié est fourni pour ce faire.

La photo en cours d'exécution montre ce programme en cours d'exécution.

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

Les commutateurs sont branchés sur le port A et le programme affiche la valeur qu'il lit sur le port B et le 74HC373 (qui est actuellement masqué). les interrupteurs sont connectés à la masse et les LED sont connectées au 5v. L'EOR #$FF corrige le problème du verrou et du port B affichant des motifs différents en retournant les bits avant d'écrire sur le verrou.

Étape 6: Signal horaire externe

Signal horaire externe
Signal horaire externe

Si un signal d'horloge est appliqué à la broche en haut de la carte, le 6502 peut désormais fonctionner indépendamment du MEGA. Bien sûr, il a également besoin d'une alimentation électrique. J'ai expérimenté différentes horloges et j'ai même fait fonctionner le 6502 à 1 MHz avec un oscillateur à cristal. Le MEGA ne peut pas suivre des vitesses plus rapides, il doit donc être retiré.

J'ai également essayé la sortie d'une minuterie 555 mais cela ne fonctionne pas. Je pense que c'est peut-être parce que ce n'est pas une onde carrée ? Lorsqu'il est connecté à l'une des sorties du CD4017, il pilote le 6502. Je me suis connecté à l'un des kits ci-dessus pour essayer d'obtenir un signal d'horloge.

Je suis toujours à la recherche de différentes méthodes pour obtenir un signal d'horloge.

Étape 7: Conclusion

J'ai montré comment construire des circuits complexes et obtenir un "ordinateur" très simple pour travailler avec un minimum de pièces. Certes, l'ordinateur ne peut pas faire grand-chose à l'heure actuelle ou est susceptible de le faire à l'avenir.

Au début des années 80, avec mon VIC20, j'avais l'habitude de me poser des questions sur cette machine géniale et je n'avais pas la première idée de comment commencer à en monter une. Les temps ont évolué et la technologie aussi, mais il est toujours agréable de revenir à l'essentiel et d'être fier de quelque chose que vous avez construit à partir de zéro.

Pour développer davantage cet ordinateur, j'ai l'intention de mettre 2k de SRAM à 0000 $ à 2047 $ et d'ajouter un oscillateur à 1 MHz. J'ajouterai probablement quelque chose comme un CD4040 (compteur/diviseur d'ondulation binaire à 12 étapes) afin que je puisse puiser dans différentes vitesses d'horloge.

Pourrait même ajouter un écran LCD pour donner des sorties de texte plutôt que de simples lumières clignotantes. Le programmeur EEPROM devra également être modifié pour gérer les programmes plus volumineux nécessaires pour exécuter un écran LCD.

Même si le MEGA devient inutile pour le fonctionnement du 6502, il reste utile pour déboguer le code machine. Comme tout le monde le sait, le code machine contient toujours des bugs !

Conseillé: