Dans les articles précédents sur l'automatisation au niveau des outils de développement, j'avais vu comment injecter un programme dans MAME en émulation VG5000µ d'abord grâce au debuggeur manuellement, puis avec un script LUA grâce aux possibilité d'extensions de MAME.
Ce n'est toujours pas suffisant pour moi. Comme je l'ai déjà écrit dans ces autres articles, je ne veux pas faire ce qu'une automatisation peut faire bien plus facilement, et sans se tromper. Lancer l'assembleur en ligne de commande, puis lancer MAME avec les bons paramètres, cela n'est pas bien compliqué avec un shell
moderne (comme fish
).
Un des principaux problèmes que j'y vois, outre que ce sont des opérations manuelles, c'est que ce sont des opérations non documentées. Si je fais une pause dans un projet et que j'y reviens deux mois après (ça arrive bien souvent, surtout pour du hobby), il y a de bonnes chances que je ne me souvienne plus des opérations exactes à faire. J'ai pu prendre des notes, laisser des instructions, écrire un article même. Mais quoi de mieux comme instructions que de laisser des outils qui fonctionneront et seront une source de documentation si besoin ?
Un premier script assez simple serait de regrouper l'assemblage et le lancement dans un même script. Ou pourquoi pas dans un Makefile
.
J'ai choisi d'ajouter les outils à un environnement Sublime Text 3
, qui est l'un des deux éditeurs de texte que j'utilise le plus souvent.
De la couleur
Et puisque j'en étais à créer un petit environnement confortable pour mettre au point des programmes en assembleurs pour Z80
, j'ai fait un petit détour par la colorisation syntaxique. N'ayant pas trouvé de colorisation adéquat à de l'assembleur tel qu'attendu par z80asm
, j'ai écrit une description simpliste que vous trouverez dans le package en fin d'article.
Il ne gère pas tous les cas, et je pense l'améliorer en fonction des besoins.
Au passage, Sublime Text 3
a un système de tests pour la colorisation syntaxique qui est extrêmement pratique pour mettre au point le fichier. Le fichier de test est disponible dans le paquetage au côté des autres, pour référence.
Un système de build
Deuxième étape, la plus importante, celle qui permet de construire un code objet à partir d'un code source en assembleur. La mise en place de la colorisation syntaxique n'a pas amené que des couleurs à l'affichage. Elle a aussi permis de déclarer l'existence d'un format spécifique, que j'ai appelé z80asm.
Lorsque l'éditeur de texte ouvrira un fichier .asm
, il l'associera par défaut à ce format (sauf si vous avez d'autres associations pour .asm
, auquel cas cela sera un choix possible).
Pour créer un nouveau système de build
avec Sublime Text 3, il suffit d'aller dans Tools
-> Build System
-> New Build System
. Un nouveau fichier de description, en JSON
, permettra d'indiquer à l'éditeur les actions qu'il devra effectuer lors de la construction du fichier.
Pour une construction simple, qui appel l'assembleur z80asm
se trouvant dans vos chemin de recherche d'exécutables, cela peut donner ceci :
{
"selector": "source.asm.z80",
"cmd": ["z80asm", "-b", "-v", "$file"],
"file_patterns": ["*.asm"],
"file_regex": "^Error at file '([^']+)' line (\\d+): ()(.+)"
}
selector
: indique que ce type de construction est valable pour le type de fichier associé au formatsource.asm.z80
.cmd
: indique la commande à exécuter.$file
indiquant le fichier actif au moment du lancement de la construction.file_patterns
: indique le type de fichier valable pour ce type de construction aussi, au cas où le format deselector
n'aurait pas été appliquéfile_regex
: est une expression régulière identifiant les erreurs de construction, et permettant à l'éditeur de texte d'indiquer ces erreurs directement dans le fichier édité.
Avec ceci, un Ctrl-B
(sous Linux et Windows) transforme votre fichier .asm
en fichier du même nom .bin
.
Lancer MAME après le build
Je voulais aller un peu plus loin et avoir la possibilité de lancer MAME
depuis Sublime Text
si l'assemblage était un succès. Pour cela, il m'a fallu écrire un script python
un peu plus complexe qui lance l'assemblage de la même manière que ce qui est indiqué au paragraphe précédent, et en cas de succès, lance MAME
avec les bons paramètres.
Il aurait été aussi tout à fait possible, et probablement plus simple, d'appeler un fichier script shell (ou batch). Mais j'avais depuis quelques temps envie de comprendre comment écrire un plugin de build pour Sublime Text
, j'ai donc fait un détour.
Je ne rentrerai pas dans le détail du fonctionnement du plugin de build que vous pourrez trouver dans le paquetage à la fin de l'article.
Le système est améliorable. Pour le moment, l'adresse de démarrage du code objet est fixé par le script vgboot.lua
. Il faudra donc changer cette adresse dans le script à l'endroit de l'injection du code et au moment du CALL
si votre code objet est situé à une autre adresse mémoire.
Dans le fichier README.md
, vous trouverez les instructions pour créer le système de build correspondant. Je le reprends ici pour l'expliquer :
{
"selector": "source.asm.z80",
"cmd": ["z80asm", "-b", "-v", "$file"],
"file_patterns": ["*.asm"],
"file_regex": "^Error at file '([^']+)' line (\\d+): ()(.+)",
"variants": [
{
"target": "z80_asm",
"name": "run",
"mame_path": "mame",
"script": "vgboot.lua"
}
]
}
Outre le début, qui est identique à la version du paragraphe précédent, une section variants
a fait son apparition. Cette section indique des versions alternatives de construction. Le paramètre target
indique quel est le plugin à invoquer. Les autres paramètres sont passés tel quel au plugin.
Les variantes hérites aussi des paramètres principaux, mais mon plugin se contente de les ignorer pour tout gérer seul.
Pour sélectionner une variante dans Sublime Text 3
, le raccourci est Ctrl-Shift-B
(sous Linux et Windows).
Le paquetage
Les sources du paquetages sont disponibles sur Github mais aussi sous forme de paquetage Sublime Text 3
(qui est en fait un fichier zip) directement ici (à la version lors de la publication de l'article).
Le résultat
À présent, je peux écrire de l'assembleur dans mon éditeur de texte et, par un seul raccourci, lancer l'assemblage, avoir un retour d'erreur annoté directement dans le code source, et en cas de réussite, le programme lancé directement dans l'émulateur.
On pourrait aller encore plus loin, avec le script MAME
qui ouvrirait un canal de communication afin d'injecter le code sans relancer l'émulateur... Mais je vais m'arrêter ici et revenir sur le sujet qui a entraîné tout cela.