Lecture et sauvegarde des ROMs du Micral N

Par Sylvain Glaize.

C'est le 5 avril 2021 qu'a lieu la très importante session de dump, ou lecture et sauvegarde, des ROMs du Micral N.

Détail d'une des ROMs du moniteur du Micral N de l'association MO5

Détail d'une des ROMs du moniteur du Micral N de l'association MO5

Ces EPROMs sont tellement anciennes qu'il est possible de voir les transistors de stockage tant la gravure est grossière. En nous renseignant sur leur technologie, nous apprenons que la tension électrique nécessaire pour programmer ces EPROMs est de 47 volts, ce qui est énorme par rapport aux standards actuels. Cette très importante différence de potentiel a peut-être protégé le contenu de ces EPROMs, et nous allons nous en assurer tout de suite.

À noter que ces EPROMs sont des composants NMOS (https://fr.wikipedia.org/wiki/NMOS), comme le 8008 et certaines SRAMs de la machine. Ces composants nécessitent une alimentation bitension +5V et -9V, des niveaux logiques différents des niveaux TTL classiques.

Dumper de ROM spécialement conçu par Jean François Del Nero pour le Micral N

Dumper de ROM spécialement conçu par Jean François Del Nero pour le Micral N

Jean-François Del Nero a préparé en amont un appareil spécifique qui, en étant adapté à ces niveaux, va nous permettre de lire ces EPROMs. Cet outil permet, en plus de permettre la lecture de ces EPROMs 1702, de tester l'ensemble des mémoires RAM de la machine. Ces RAM (SRAMs 2102 et 4007) sont d'ailleurs en bon état de fonctionnement, à part une que nous remplaçons par une 2102A.

Les sources et le schéma de cet outil sont disponibles sur ce dépôt Github :
>>>Sources ici

Jean-François à l'œuvre sur un plan de travail avec instruments de mesure

Jean-François à l'œuvre sur un plan de travail avec instruments de mesure dans les locaux de Viveris Technologies

 

Le résultat d'un dump d'une des EPROMs

Le résultat d'un dump d'une des EPROMs

Tout se passe à merveille. Le contenu des EPROMs est sauvé ! Jean-François et Philippe m'envoient immédiatement le contenu fraîchement sorti du « dumper ».

La première étape est de vérifier que le contenu est correct. En effet, ces octets ont été stockés pendant des années sur des EPROMs. Le contenu a pu être altéré.
Il y a deux ROMs différentes, l'une de 256 octets, l'autre de 2 kilo octets. Autant commencer par la plus courte. 256 octets, ça n'est pas très long à parcourir.

La première ROM

Immédiatement, l'espoir de données exécutables est permis. En effet, les deux premières instructions décodées sont LAA et JMP $0048.

Sous ces mnémoniques se cache une séquence de démarrage de processeur 8008, c'est très bon signe !

LAA signifie « Load from register A to register A », autrement dit, « charge le contenu du registre (un morceau de mémoire du processeur) A vers le registre A ». Ce qui n'a pas d'effet visible sur l'état du processeur et est la convention pour indiquer au 8008 de... ne rien faire d'intéressant. Un mnémonique équivalent sur d'autres processeur est NOP, pour « No OPeration ».

Cette instruction est généralement la première instruction que l'on présente à un 8008 qui vient de démarrer. En effet, du fait de son fonctionnement, le processeur va exécuter cette instruction deux fois. Conventionnellement, le choix se porte sur une instruction qui n'a pas d'effet visible.

La seconde instruction JMP $0048 est un saut vers l'adresse indiquée, qui se trouve plus loin, après un lot d'adresses réservées.

C'est là aussi une instruction classique, que l'on retrouve sur des machines à base de Z80, qui présente les mêmes premières adresses réservées, révélant une filiation.

Et la suite ?

À partir de l'adresse `$0048`, cela ressemble à un programme. Après un peu de travail et quelques premières notes, je suis à peu près certain que ce programme n'a pas été altéré. Cela a l'air cohérent.

Il y a cependant un petit point qui mérite attention. Dans les adresses réservées mentionnées plus haut (les adresses de « Restart », utilisées par l'instruction RST et, sur le Micral N, par les interruptions), seules deux contiennent des choses cohérentes.

Le reste forme un ensemble incohérent, et ressemble plus à une suite de bits aléatoires.

Une ROM de démarrage

Ce point se rapproche d'un autre : à la fin du traitement de la ROM, une instruction demande le redémarrage du processeur à l'adresse 0.

L'intuition est alors de dire que cette ROM effectue une opération de démarrage, puis qu'elle « s'efface », au sens de se cacher, pour laisser la place à autre chose.

Ce qui tend à confirmer cette intuition, c'est que la ROM fait des requêtes sur ses entrées/sorties pour acquérir des données depuis un périphérique. Ces données sont alors placées, après vérification d'une somme de contrôle, en mémoire à partir de l'adresse 0.

Il s'agit donc probablement d'un programme d'amorçage qui va lire un second programme depuis une source externe. Un « boot loader ».

Ces intuitions seront confirmées plus tard.

La seconde ROM

La seconde ROM est plus volumineuse. 2048 octets, cela peut sembler petit, et ça n'est certes pas bien gros. Traduire ce contenu pour se faire une idée assez précise du fonctionnement reste tout de même une tâche un peu fastidieuse.

Mais c'est un exercice que je trouve néanmoins plaisant.

La première étape est de savoir où se trouve cette ROM en mémoire. Ici, la simplicité du 8008 aide. Les instructions de saut mentionnent toutes des adresses absolues. Une technique est alors de trouver une petite boucle d'instructions et d'en déduire un emplacement probable.

En effet, une boucle va mentionner une adresse proche de l'instruction de saut elle-même. Après avoir choisi une adresse probable, il reste à la confirmer avec une paire d'autres boucles.

Cette ROM se situe donc en $3800, c'est-à-dire tout à la fin de l'espace adressable en mémoire du 8008, qui adresse une plage de 16 ko entre les adresses $0000 et $3FFF.

Bouillie initiale

Dans ces exercices, au début, on nage un peu. Il faut trouver des extrémités de fils, tirer dessus, et voir comment toute la pelote peut être démêlée.

La ROM commence par une sauvegarde du contexte du 8008 dans des adresses fixes.

Puis continue en envoyant le code ASCII correspondant à un point d'interrogation à un périphérique extérieur. Ça ne ressemble pas à une coïncidence... y aurait-il un dialogue avec l'extérieur ?

Je cherche alors s'il y a une récupération de données depuis l'extérieur. En effet, il y en a bien une.

La ROM moniteur

Il est temps d'ouvrir le manuel du Micral N et de regarder la partie qui décrit le moniteur, un programme qui permet d'effectuer des opérations génériques, comme lire et afficher la mémoire, charger des données depuis un ruban perforé...

Et le manuel indique que celui-ci affiche un point d'interrogation en attendant une commande. Et les commandes, nombreuses, sont toutes formées d'une lettre majuscule.

Or il se trouve que dans un morceau de la ROM qui ne ressemble pas à des instructions, ces lettres apparaissent, séparées par ce qui pourrait tout à fait être des adresses valides dans cette ROM.

Après vérification, ces adresses sont bien des points d'entrées de routines.

Le doute n'est plus permis, et sera entièrement levé quelques heures plus tard : il s'agit bien là du moniteur tel que décrit dans le manuel.

Apport des ROMs

L'étude des ROMs a été une étape cruciale dans la compréhension de la machine. Le manuel n'est pas toujours très clair sur le fonctionnement du Micral N. De plus, c'est une machine modulaire, qui peut avoir des configurations diverses.

Ces deux ROMs ont permis de partir sur une configuration précise, déduite des adresses auxquelles elles sont stockées, ainsi que des ports d'entrées/sortis utilisés.

Ce sont des informations qui me manquaient pour modéliser à travers l'émulateur un début de configuration fonctionnelle et plausible du Micral N.

Nous verrons cela dans un prochain article.

N'oubliez pas de participer à la campagne pour soutenir nos travaux ! https://micral.mo5.com