Présentons

L'assembleur vasm a donc été créé par Frank Wille spécialement pour le compilateur vbcc. L'assembleur supporte non seulement les processeurs de la famille M68k de Motorola - et apparemment les ColdFire de Freescale -, mais peut également générer du code pour processeurs x86, PPC, ARM, 6502 et un CPU que je ne connais pas. Il dispose en plus de cela de plusieurs modules de sortie, permettant de générer des fichiers objets pour le l'éditeur de liens vlink (format vobj), des hunk (format hunk) Amiga, des fichiers au standard ELF (format elf, un fichier texte de sortie permettant de valider la sortie de l'assembleur (format test, par défaut) ou encore au format binaire (format bin).

Le l'éditeur de lien vlink est l'outil qui va nous permettre de passer d'un fichier objet vobj à un exécutable Atari TOS, ou pour Amiga mais vasm permet déjà de générer directement un exécutable Amiga (le fameux format Amiga Hunk).

Compilons

Tout d'abord, il faut récupérons les sources de vasm et vlink sur le site de Frank Wille :

On désarchive le contenu des deux fichiers téléchargés (au format tar.gz) quelque part et on y va !

vlink

La compilation de cet élément est très simple. On se positionne dans le répertoire des sources de vlink et on crée un répertoire objects, qui contiendra tous les fichiers issues de la compilation, et on lance la compilation de la manière la plus traditionnelle qui soit :

cd vlink
mkdir objects
make

Ces opérations vont générer un exécutable vlink que l'on installera là où l'on souhaite à la main (man cp).

vasm

La compilation de vasm nécessite quant à elle d'ajuster quelques variables, mais le principe est le même. On va reprendre le fichier fichier Makefile et ajouter les lignes suivantes en tête de fichier, afin de générer un assembleur pour processeur M68k utilisant la syntaxe Motorola. Le fichier ressemblera à ça :

# Unix

CPU = m68k
SYNTAX=mot
TARGET =
CC = gcc
COPTS = -c -O2
LDFLAGS = -lm
RM = rm -f

include make.rules

On notera que l'on laisse la variable TARGET vide, cela nous évite de devoir faire une flopée de répertoires, vu que nous ne souhaitons avoir qu'une seule version de l'assembleur. Comme pour vlink, on crée un répertoire destiné à accueillir les fichiers objets issues de la compilation, mais il s'appellera cette fois obj, puis on lance la compilation :

cd vasm
mkdir obj
make

Et voilà ! Un exécutable vasmm68k_mot a été généré ! On le renommera éventuellement.

Essayons

Pour tester, nous supposerons que les deux exécutables sont accessibles, donc dans un répertoire accessible par le biais de la variable shell $PATH.

On commence par créer un source de test intelligemment appelé test.s, comme ceci :

Pterm0  macro
        clr.w   -(sp)
        trap    #1
        endm

Puts    macro
        pea     \1
        move.w  #9,-(sp)
        trap    #1
        endm

        Puts    chaine
        Pterm0

chaine  dc.b    "Hello, world", 10, 13
        even

On va dans un premier temps l'assembler avec le module de sortie test et examiner la sortie. Ce qui nous donne :

tom@clementina:~/Sources/vasm$ ./vasmm68k_mot -Ftest -o test.lst test.s 
vasm 1.2b (c) in 2002-2007 Volker Barthelmann
vasm M68k/ColdFire cpu backend 0.9c (c) 2002-2007 Frank Wille
vasm motorola syntax module 2.5 (c) 2002-2007 Frank Wille
vasm test output module 1.0 (c) 2002 Volker Barthelmann

Et le contenu du fichier test.lst généré :

Sections:
section CODE (attr=<acrx> align=2):
00000000: data(4): 48 7a 00 0c 
00000004: data(4): 3f 3c 00 09 
00000008: data(2): 4e 41 
0000000a: data(2): 42 67 
0000000c: data(2): 4e 41 
0000000e: symbol: chaine LAB (14) sec=CODE 
0000000e: data(12): 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 
0000001a: data(1): 0a 
0000001b: data(1): 0d 
0000001c: space(0,fill=00)
Symbols:
chaine LAB (14) sec=CODE 

Ce qui ne m'aide plus vraiment, car je n'ai connais pas les opcodes du 68000 par coeur.. Denis ??? Bon, il n'est pas là, on va générer un exécutable au format Atari TOS. Un peu rapidement et sans détailler, voici les deux étapes de la compilation (vasm et vlink) suivi d'une petite vérification de routine :

tom@clementina:~/Sources/vasm$ ./vasmm68k_mot -Fvobj -o test.o test.s 
vasm 1.2b (c) in 2002-2007 Volker Barthelmann
vasm M68k/ColdFire cpu backend 0.9c (c) 2002-2007 Frank Wille
vasm motorola syntax module 2.5 (c) 2002-2007 Frank Wille
vasm vobj output module 0.4 (c) 2002-2006 Volker Barthelmann

tom@clementina:~/Sources/vasm$ ./vlink -b ataritos -o test.prg test.o 

tom@clementina:~/Sources/vasm$ file test.prg
test.prg: Atari ST M68K contiguous executable (txt=28, dat=0, bss=0, sym=14)

On déplace l'exécutable test.prg dans le répertoire faisant office de disque dur virtuel à Steem, et on lance toute la machine !! Ouf, le message Hello, World est bien affiché !

Concluons

Je suis allé très vite, sans vraiment détailler l'utilisation de vasm et de vlink, et surtout, je n'ai fait qu'un simple test de rien du tout. Il faut cependant bien avoir à l'idée que vasm a été conçu pour être indépendant de l'architecture de la machine hôte (celle qui assemble), et notamment n'est pas sensible à ces histoires de grand et petit indien -big ou little endian pour ceux qui ne suivent pas - et du moins tant qu'on ne lui fait gober n'importe quoi comme fichier en inclusion binaire.

En utilisant PhxAss sur Amiga, j'avais noté une incompatibilité notable avec Devpac, c'est la manière dont est géré le symbôle *, qui représente soit l'adresse de l'instruction courante, soit l'adresse de l'instruction suivante. Donc pour ceux qui ont l'habitude de Devpac et qui passe sur vasm, faites attention à cela.

Je tâcherai de pousser un peu plus les tests pour voir ce qu'il est nécessaire d'adapter.