Intégration d'un assembleur Z80 dans VScode

Intégration d'un assembleur Z80 dans VScode

VScode (ou VScodium) est un éditeur de texte orienté code, multi plateforme (linux, windows, mac OS) et qui se situe dans la lignée d’atom, notepad++ ou encore sublime text. Ce sont des éditeurs plutôt légers et très modulaires, grâce à leur système de plugins. Pour l’installer, il suffit de suivre les instructions ici.

Je vais décrire ici la configuration de vscode pour développer avec votre assembleur préféré pour CPC, que ce soir SJasm+, Rasm ou encore UZ80. Nous verrons comment ajouter des commandes, et nous pencherons sur l’usage de deux plugins dédiés à simplifier le développement en assembleur z80. Le contenu de cet article est basé sur des échanges avec Ivan Duchaufour (alias gurneyh), qui a apporté sa contribution aux deux plugins dont il va être question.

Pour commencer, voyons comment ajouter des commandes pour exécuter RASM sur votre propre projet.

Commande build

Vscode permet d’ajouter très simplement des commandes personnalisées, pour chaque projet que l’on crée avec. Pour cela, il suffit de créer (ou d’éditer) le fichier task.json et d’y ajouter un objet dans le tableau tasks, qui ressemble a cela:

{
    "version": "2.0.0",
    "tasks": [
      {
        "label": "build-rasm",
        "group" : "build",
        "command": "rasm",
        "args": [
          "./main.asm",
          "-o",
          "test"
        ],
        "problemMatcher": "$errmatcher-rasm"
      }
    ]
  }

Exécuter cette tache revient à exécuter la commande

rasm ./main.asm -o test

Vous pouvez adapter cette tache, en modifiant le chemin d’accès à rasm si nécessaire (command), et modifier les paramètres passés à RASM (args). Le paramètre ‘problemMatcher‘ servira dans la suite, pour que les erreurs et warnings renvoyés par RASM soient récupérés par le plugin Macro Assembler (si le plugin n’est pas installé, il faudra commenter cette ligne). A la fin de l’article vous retrouverez d’autres exemples de tâches.

Comme la tâche fait partie du groupe ‘build’, le raccourci CTRL+SHIFT+B permet d’éxécuter directement la commande.

Installation des plugins

A noter que dès que vous ouvrez une fichier .asm, vscode suggère l’utilisation de plugins (appelées extension). Il est aussi possible de chercher avec le mot clef ‘Z80’ dans le menu extension. Parmi la liste proposée, il faudra choisir Z80 Macro-Assembler et Z80 Assembly meter. Le premier apporte la coloration syntaxique et la gestions des erreurs, tandis que le second permet de calculer rapidement la taille ainsi que le temps d’exécution (en cycles ou en micro secondes) d’un bloc de code.

Gestion des erreurs

Considérons le code suivant: (spoiler: il est truffé d’erreurs):

  org #8000
    
  ld u, "a"
  call #fffff

loop:
  jp .loop

Si on execute notre commande build-rasm sur ce fichier, on obtiendra le résultat suivant:

Timing des instructions

Si l’on sélectionne une section du code, la barre d’information en base de la fenêtre indique la taille en octet et le nombre de cycles du bloc. Quelques informations supplémentaires apparaissent en survolant cette zone:

Par défaut, le plugin indique le nombre de cycles, mais il est possible dans les options de sélectionner le timing pour le CPC (parmi d’autres).

Build avancée

Lorsqu’un projet grossi, il devient pratique d’utiliser un script bash ou un makefile pour builder le projet.
Imaginons que l’on souhaite exécuter un script bash situé à la racine de notre projet, on peut ajouter une autre tâche de build, le fichier task.json deviendrait alors:

{
    "version": "2.0.0",
    "tasks": [
      {
        "label": "build-rasm",
        "group" : "build",
        "command": "rasm",
        "args": [
          "./main.asm",
          "-o",
          "test"
        ],
        "problemMatcher": "$errmatcher-rasm"
      },

      {
          "label": "build",
          "group" : "build",
          "command": "./build.sh",
          "problemMatcher": "$errmatcher-rasm"
       }
    ]
  }

On peut également continuer à utiliser le problemMatcher spécifique à RASM dans ce cas.

Si vous souhaitez créer une tache pour compiler le fichier actuellement ouvert, au lieu de main.asm il suffit de remplacer l’argument par « ${file}« :

 "args": [
          "${file}",
          "-oa"
        ],

L’option -oa permet d’utiliser le nom du fichier en entrée pour générer le fichier en sortie (RASM V.0115 ou supérieur requis).

Executer un émulateur

Toujours à l’aide des Tasks, il est possible par exemple, de créer une commande run qui exécutera l’émulateur de votre choix, pour y lancer directement le.dsk, .cpr ou .sna voulu… mais ce sera l’objet d’un autre article!

Quelques liens: