Bonsoir.
Voici une mise à jour de ce dépannage.
Je rappelle la méthodologie :
- j'ai déconnecté la CLOCK d'origine, qui fonctionnait à environ 20 MHz
- j'ai mis à la place un bouton poussoir qui fait avancer la CLOCK pas à pas
- je dis bonjour à chaque instruction qui se présente
- je contrôle son exécution
Cette méthodologie m'a déjà permis de résoudre 2 problèmes :
- le composant P13 (chargé de stocker le n° de la page de RAM sélectionnée) était mort
- la PROM PR-10 avait un problème de désélection
Je la trouve très efficace, mais particulièrement longue et laborieuse.
À chaque fois, je dois vérifier à l'oscillo l'instruction exécutée, la valeur de certains registres du CCPU, etc...
L'idée de gc339 d'utiliser des composants type TIL311 (voir
ce message) serait un gain de temps et de confort très appréciable.
Jeudi dernier, lors de la
rencontre entre lyonnais, gc339 m'a remis 6 composants TIL311 qu'il a pu dessouder de son stock de cartes diverses :
Composants TIL311 donnés par gc339
L'idée est de leur faire afficher en
hexadécimal toute donnée clé que je jugerai utile :
- l'adresse courante en ROM
- l'instruction en cours d'exécution
- les valeurs des 2 accumulateurs
- la page RAM sélectionnée
- etc...
Vu que je ne possède qu'un nombre limité de ces afficheurs TIL311, j'ai décidé de leur associer à chacun un composant 74LS157.
Ce composant est un quadruple sélectionneur 2 entrées / 1 sortie.
Il me permettra de choisir avec un bouton poussoir 2 sources de données différentes pour 1 afficheur TIL311.
Ainsi, chaque TIL311 pourra afficher 2 infos différentes. Un bouton poussoir me permet d'afficher l'une ou l'autre.
Voici donc le petit montage pour mettre en oeuvre le 1
er TIL311...
J'utilise une chute de plaque à trous et pastilles cuivrées.
Le boîtier 74LS157 a 2 pattes dans le vide, mais c'est sans importance.
Montage à base de TIL311
J'ai choisi de lui faire afficher les 4 bits de poids fort de l'instruction en cours d'exécution. Ces 4 bits sont les plus importants, car ils définissent le type de l'instruction (une addition, la lecture d'une entrée, etc...)
Les 4 bits de poids faible seront affichés si j'appuie sur le bouton poussoir.
La technique de réalisation la plus adaptée aurait été incontestablement le
wrapping.
Malheureusement, je ne suis pas (encore) équipé pour ça.
J'en ai fait quand j'étais étudiant et c'est d'une simplicité et d'une rapidité extraordinaire.
Pour aujourd'hui, j'ai donc dû me battre et souder le tout.
Et voilà !
Affichage des 4 bits de poids fort de la 1ère instruction
L'afficheur affiche un "4".
Ca tombe bien, c'est effectivement les 4 bits de poids fort de la 1ère instruction du jeu Space Wars (flèche rouge) :
Lorsque j'appuie sur le bouton poussoir, l'afficheur me montre alors les 4 bits de poids faible (flèche verte :"9") :
Affichage des 4 bits de poids faible de la 1ère instruction
Maintenant, simplement avec cet unique afficheur et son bouton poussoir, je peux faire du pas à pas beaucoup plus vite :
- je vois quelle instruction est exécutée
- je sais où j'en suis dans le code du jeu
- je peux me concentrer sur sur ce que je veux investiguer
Cette fois, j'ai pu suivre une trentaine d'instructions sans perdre de temps ni me faire de noeuds au cerveau.
Je ne revérifie pas en détail toutes les instructions que j'ai déjà vues fonctionner.
Adresse | Code | Assembleur | Statut | Commentaire |
7EA | 8F | LDP #F | OK | Sélectionner la page de RAM n°15 ("F" en hexa) |
7EB | 08 | LDA #800 | OK | Charger l'accumulateur avec la constante 800 (en hexa) |
7EC | DF | STA F | OK | Enregistrer l'accumulateur à l'adresse RAM n°15 ("F" en hexa) de la page courante |
7ED | 0A | LDA #A00 | OK | Charger l'accumulateur avec la constante A00 (en hexa) |
7EE | DE | STA E | OK | Enregistrer l'accumulateur à l'adresse RAM n°14 ("E" en hexa) de la page courante |
7EF | 8B | LDP #B | OK | Sélectionner la page de RAM n°11 ("B" en hexa) |
7F0 | 20 A0 | ADD #A0 | OK | Ajouter la constante A0 (en hexa) à l'accumulateur |
7F2 | D6 | STA 6 | OK | Enregistrer l'accumulateur à l'adresse RAM n°6 de la page courante |
7F3 | 00 | CLR | OK | Effacer l'accumulateur |
7F4 | D3 | STA 3 | OK | Enregistrer l'accumulateur à l'adresse RAM n°3 de la page courante |
7F5 | D5 | STA 5 | OK | Enregistrer l'accumulateur à l'adresse RAM n°5 de la page courante |
7F6 | 21 | ADD #1 | OK | Ajouter la constante 1 à l'accumulateur |
7F7 | D4 | STA 4 | OK | Enregistrer l'accumulateur à l'adresse RAM n°4 de la page courante |
7F8 | 95 | OUT 5 | OK | Mettre la sortie n°5 à la valeur opposée du bit de poids faible de l'accumulateur (il faut suivre, hein ?) |
7F9 | 4C 27 | LDJ #72C | OK | Charger le registre J (adresse de destination du prochain jump) avec la constante 72C (en hexa) |
7FB | 58 | JMP | OK | Sauter à l'adresse contenue dans le registre J |
72C | A6 | LDA 6 | KO | Charger l'accumulateur avec le contenu en RAM de l'adresse n°6 dans la page courante |
L'instruction de l'adresse 72C a foiré.
Si on suit bien :
- en 7F2, l'accumulateur valait A00 (chargé en 7ED) + A0 (instruction en 7F0) = AA0
- cette valeur AA0 a été écrite en RAM à l'emplacement B:6
- en 72C, lorsque le programme veut relire cette adresse, j'ai constaté une erreur :
- valeur qu'il aurait dû relire : AA0 (soit en binaire 101010100000)
- valeur effectivement relue : A20 (soit en binaire 101000100000)
Le bit foireux correspond au bit de poid fort du composant de RAM
M14.
Ce composant est donc bel est bien en panne comme je l'avais indiqué dans
ce message.
À ce moment là, il était en
L14, mais il a changé de place depuis que tous les boîtiers de RAM sont sur support.
J'ai aujourd'hui la preuve de sa panne, car j'ai vérifié à l'oscillo directement en sortie du composant.
Il ne s'agit pas d'une piste coupée ou autre farce.
La bonne nouvelle, c'est que dès que j'avais déterminé qu'au moins un composant de RAM était foireux, je m'étais mis en quête d'en trouver un autre.
Une personne de la liste de diffusion
vectorlist s'était proposée pour m'en envoyer gratuitement.
Il y a donc en ce moment même 3 de ces composants de RAM en train de se diriger vers ma boîte à lettre.