Triceraprog
La programmation depuis le Crétacé

Travailler sur émulateur et dump de la ROM VG5000µ ()

Précédemment, j'ai commencé à parler d'une chaîne d'assemblage pour développer un programme depuis un ordinateur actuel vers une machine ancienne, le VG5000µ qui est l'ordinateur qui nous suit depuis le début de ces articles.

Un des avantages d'utiliser une machine de développement différente de la machine cible est de ne pas souffrir des erreurs, plantages et reboot provoquées par des erreurs. Imaginez, développer sur la machine que l'on programme elle-même, à une époque où le système d'exploitation ne protège rien du tout : une erreur, un reboot et si vous n'avez pas sauvé, il faut recommencer. Et si vous avez sauvé, les temps de chargements et de sauvegardes sont assez long, surtout sur une machine qui n'a pour mémoire externe qu'un magnétophone à cassettes !

Bref, développer sur une machine annexe et envoyer sur la machine cible, c'est plus simple, cela permet de profiter d'outils modernes mais... ça reste lent dans la plupart des cas. En tout cas sur une machine comme le VG5000µ qui n'a pas eu de développement spécifique qui pourrait injecter du code depuis une autre machine (pour le moment tout du moins, car c'est possible et j'ai cru comprendre qu'une carte était à l'étude).

Viens la solution de l'émulation. Un émulateur est un logiciel qui va reproduire le fonctionnement de la machine cible. Étant énormément plus lente que la machine hôte, la machine cible pourra être émulée de manière tout à fait satisfaisante. Un émulateur pourra aussi facilement et rapidement charger un programme depuis la machine hôte pour la mise au point, réduisant la fréquence d'essai sur machine véritable.

Mais pour utiliser un émulateur, dans la majorité des cas, il faut fournir la ROM, c'est-à-dire le programme résident de la machine. Ce n'est pas nécessaire pour DCVG5K, l'émulateur développé par Daniel Coulom. Par contre, c'est nécessaire pour l'utilisation de MAME (plus exactement sa sous-partie MESS, qui émule les ordinateurs). De manière générale, vous êtes supposés avoir une copie de votre propre version de la ROM. Passons sur la partie un peu ridicule de cette restriction puisque le fichier que vous allez obtenir sera en tout point identique à celui obtenu par extraction depuis une autre machine...

Toujours est-il qu'il est très simple de copier (dumper) le contenu de la ROM d'une machine de ce type, puisqu'elle est visible et complètement adressable par l'utilisateur.

La méthode

Le VG5000µ doit être branché, bien entendu, et relié à une carte d'acquisition audio. Cela peut être tout simplement l'entrée son de votre ordinateur, certains utilisent des enregistreurs séparés.

L'idée est donc de sauver le contenu de la ROM, tel quel, dans un fichier. Rien de plus simple :

CSAVEM"ROM",0,16384

CSAVEM est la commande pour sauver un fichier depuis la Mémoire. Le nom du fichier est entre guillemets. 0 est l'adresse de départ et 16384 la taille en octets de la plage à sauvegarder. La ROM faisant 16 kio, la sauvegarde contiendra l'intégralité de la ROM.

Avant d'appuyer sur la touche ENTRÉE du VG5000µ, il faudra démarrer l'enregistrement sur l'ordinateur. J'utilise Audacity pour cela. Un logiciel libre de manipulation audio.

Assurez-vous au niveau du niveau d'entrée que le signal sature, cela sera plus facile pour le décodage. N'oublions pas qu'on est-ici dans un codage de signal numérique, pas dans de l'écoutable, ce qui est important, c'est que les signaux soient distinguables.

L'opération est assez longue, environ 2 minutes 30.

Signal audio d'un enregistrement sur K7

Une fois le signal enregistré, il faut l'exporter en format WAV puis le décoder. Comment décoder un signal en sortie de VG5000µ sera l'objet d'un futur article ou je décrirai le programme que j'utilise (et que je publierai sur GitHub). En attendant, l'outil DCToolBox de Daniel Coulom fonctionne bien, et se lance tout à fait avec Wine sous Ubuntu si vous n'êtes pas sous Windows.

Avec mon outil, le contenu binaire intéressant est extrait simplement.

Avec DCToolBox, il vous faudra transformer le WAV en format K7 et en extraire les informations. Le format K7 est extrêmement simple, il contient l'ensemble des données encodées dans le signal numérique produit par la machine. Tout d'abord les 32 octets d'en-tête, qui ne nous intéressent pas ici, puis 10 octets d'amorce du contenu sauvé, puis le contenu lui-même. La taille, nous la connaissons, est de 16384 octets.

Il faut donc aller chercher les 16384 octets à partir du 42ième, ce qui s'écrit très simplement dans un shell Unix :

tail -c+43 dump.k7 | head -c 16384 > dump.rom

dump.k7 étant le nom du fichier au format K7 et dump.rom le fichier résultat.

Si vous n'avez pas accès à un shell Unix... je suis preneur d'une méthode simple pour l'ajouter à l'article.

Et voilà !

Vous avez à présent une extraction de la ROM d'une machine VG5000µ, utilisable par les émulateurs la nécessitant.

Sauver la ROM sur K7