L'idée de construire une chaîne de développement complète pour micro-ordinateurs Thomson sur PC a été proposée par Edouard Forler. Il a résulté de la discussion qui s'en est suivi qu'elle pouvait être constituée autour de GCC, le compilateur multi-langage et multi-plateforme du projet GNU et de la Free Software Foundation. Les autres composants de cette chaîne sont d'origines diverses mais s'imbriquent parfaitement les uns dans les autres, après quelques modifications parfois substantielles pour certains d'entre eux.
Le concept de chaîne de développement trouve ses racines dans la philosophie qui a présidé à la conception du système UNIX à la fin des années 1960 (et que l'on pourrait faire remonter jusqu'à Descartes et son Discours de la Méthode ;-), à savoir la division d'un problème en autant de sous-problèmes simples qu'il est nécessaire pour résoudre le problème de départ. Le problème en question ici est la traduction d'un programme écrit en langage de programmation de haut-niveau (Pascal, C, C++, Fortran par exemple) en un programme machine directement éxécutable sur un micro-ordinateur Thomson. Des outils ont été créés sur machines Thomson pour le résoudre; ainsi le compilateur Pascal développé à l'Université de Californie à San Diego au cours des années 1970 (Pascal UCSD) a été porté sur Thomson. Néanmoins, le concept de développement croisé (cross-development en anglais) s'est vite imposé dans le cas où la machine cible est limitée, particulièrement en terme de mémoire. La chaîne de développement décrite ci-dessous est donc une chaîne de développement croisé, c'est-à-dire qu'elle fonctionne sur un autre type de machine (le PC) que celui qu'elle cible (les Thomson). Elle a été initialement conçue pour Linux, mais peut parfaitement tourner sous MS-DOS ou Windows; enfin elle transforme un programme écrit en langage C ou C++ (Objective-C et Fortran pourrait facilement être ajoutés) en un programme binaire Thomson éxécutable sur disquette. |
schéma de la chaîne |
Le compilateur gcc09 est un portage de GCC vers l'architecture Motorola MC6809 (avec quelques modifications mineures additionnelles pour Thomson). Seule la partie finale du compilateur est spécifique à la machine cible, les parties frontales (qui traduisent les langages, ici C ou C++) et la partie intermédiaire (qui optimise le code produit) étant identiques pour toutes les architectures. L'adaptation pour Motorola MC6809 a été réalisée par un informaticien américain du Laboratoire d'Astronomie Spatiale de l'Université du Wisconsin, Tom Jones, au début des années 1990; elle a ensuite été modifiée pour être utilisée avec une version plus récente de GCC (2.5.8) par un étudiant allemand de l'Université d'Erlangen, Matthias Dörfel, en 1997; enfin elle a été modifiée pour les besoins de la chaîne de développement Thomson et pour fonctionner avec une version récente de GCC, la version 2.95.3 sortie le 16 Mars 2001.
GCC est un compilateur optimisant qui traduit un langage de haut-niveau (ici C ou C++) en langage d'assemblage, via un langage intermédiaire appelé RTL (Register Transfer Language) sur lequel sont effectuées les optimisations. Il possède une large palette d'options qui permettent aussi bien de contrôler le dialecte du langage source que le type et le nombre des optimisations à appliquer au langage intermédiaire.
L'assembleur as09 est une adaptation de l'assembleur AS6809 au format de code d'assemblage produit par gcc09, réalisée par Matthias Dörfel. AS6809 est à l'origine la version 6809 d'une famille d'assembleurs croisés dédiés aux microprocesseurs 8-bit Motorola (6800, 6081, 6802, 6803, 6804, 6805, 6808, 6809, 6811), Intel (8080, 8085) et Zilog (Z80), imaginée à la fin des années 1980 par un informaticien américain de l'Université d'état Kent dans l'Ohio, Alan R. Baldwin.
as09 est un assembleur avancé qui traduit le langage d'assemblage du 6809 en un module objet relogeable, c'est-à-dire en un fichier contenant aussi bien du code machine pour le 6809 que les informations nécessaires au déplacement de ce code à n'importe quel emplacement de la mémoire et à la liaison de ce code avec celui d'autres modules objet. L'assembleur gère les symboles locaux et globaux, les labels, les directives d'assemblage conditionnel, les directives d'inclusion et utilise un format de code objet propriétaire mais simple.
L'éditeur de liens ld09 est une adaptation de l'éditeur de liens ASLINK 6809, d'abord à l'environnement gcc09 (Matthias Dörfel) puis au format éxécutable Thomson. ASLINK 6809 est le compagnon de l'assembleur AS6809 et a été lui aussi écrit par Alan R. Baldwin. L'adaptation à gcc09 a principalement consisté en la possibilité d'importer des modules objets contenus dans des librairies pré-compilées, en particulier la possibilité d'importer plusieurs fois la même librairie, tandis que l'adaptation au format éxécutable Thomson a consisté en l'augmentation du nombre de passes, l'ordonnancement de la production du code machine tout au long de ces multiples passes et l'ajout d'un nouveau format de sortie, le BIN Thomson.
ld09 est un éditeur de liens relogeant qui imbrique entre eux plusieurs modules objet, importe si nécessaire d'autres modules objet à partir de librairies pré-compilées, et produit un fichier binaire à l'emplacement mémoire spécifié.
La libc est une librairie (collection) de modules objet pré-compilés à partir de fichiers source en langage C ou en assembleur. Elle fournit au programmeur des fonctions courantes de manipulation de chaînes de caractères, d'affichage, de lecture et d'écriture de fichiers, de gestion de la mémoire, écrites spécifiquement pour la machine cible. Ces modules objet sont ajoutés à la demande par l'éditeur de liens aux modules objet du programme en cours de compilation, par le simple référencement (en général le simple appel) de ces fonctions dans le code source du programme.
La libc est constituée de la juxtaposition des modules objet qu'elle contient en un fichier unique. Cette opération est réalisée par l'archiveur de librairies, ar09 (non représenté sur le schéma), écrit par Matthias Dörfel en complément de son adaptation de l'éditeur de liens ld09.
sapfs est un utilitaire de manipulation des archives au format SAP, qui est le format de transfert des disquettes du monde Thomson au monde PC. Il permet de créer, de formater, de lire, de vérifier une archive SAP; d'y ajouter ou d'y effacer des fichiers à partir du seul PC. Il a été écrit en parallèle à l'intégration des composants de la chaîne de développement car il était le seul chaînon manquant pour leur assemblage.
sapfs contient entre autres choses une implémentation enrichie du DOS BASIC Thomson, qui lui permet de manipuler les fichiers Thomson aussi bien individuellement que par groupes (par exemple, effacer tous les fichiers .BIN ou extraire tous les fichiers contenant les 4 lettres VAMP).
sap2 est un utilitaire de transfert des archives au format SAP entre le monde PC et le monde Thomson. Il permet de transférer une archive SAP vers une disquette 3"5 ou 5"25 Thomson, ou dans l'autre sens de créer une telle archive à partir d'une disquette Thomson. sap2 est une version entièrement réécrite de l'utilitaire original sap d'Alexandre Pukall, qui ajoute principalement la prise en charge du formatage des disquettes et du format 5"25 Thomson.
Le code source suivant, écrit en langage C, est une version quelque peu intriquée du célèbre programme qui affiche "Hello world !" à l'écran:
#include <stdio.h> char hello_str[]="Hello world !"; int main(void) { int i = 0; char c; while ((c=hello_str[i])) { putchar(c); i++; } return 0; }
La ligne de commandes pour compiler ce code source avec la chaîne de développement Thomson est:
gcc09 -Wall -Wl,-b,_CODE=0xA000 -O2 -fomit-frame-pointer -o hello.bin hello.c
Par défaut GCC est configuré pour appeler tour à tour le compilateur, l'assembleur et l'éditeur de liens, de sorte qu'il réalise automatiquement les trois premières étapes de la chaîne et transforme directement hello.c en hello.bin (l'option -o hello.bin permet de spécifier le nom du fichier de sortie). Il est bien sûr possible de réaliser chaque étape l'une après l'autre:
gcc09 -S -Wall -O2 -fomit-frame-pointer -o hello.s hello.c
réalise la seule compilation du fichier source C en le fichier assembleur 6809 suivant:
.module hello.c gcc2_compiled.: ___gnu_compiled_c: .globl _hello_str .area _DATA _hello_str: .ascii "Hello world !\0" ; extern _putchar .area _CODE .globl _main _main: ;;;----------------------------------------- ;;; PROLOGUE for main ;;;----------------------------------------- pshs x ;save registers ;;;END PROLOGUE jsr ___main ;CALL: (VOIDmode) ___main (0 bytes) ldx #_hello_str ;movhi: #_hello_str -> R:x jmp L7 L5: stb ,-s ;movqi: R:b -> ,-s jsr _putchar ;CALL: R:d = _putchar (1 bytes) leas 1,s ;addhi: R:s = R:s + #1 leax 1,x ;addhi: R:x = R:x + #1 L7: ldb ,x ;movqi: ,x -> R:b lbne L5 clra ;movhi: ZERO -> R:d clrb ;;;EPILOGUE puls x,pc ;restore registers ;;;----------------------------------------- ;;; END EPILOGUE for main ;;;-----------------------------------------
Tout ce qui est à droite d'un point-virgule est un commentaire. Le programme commence par le prologue de main et se termine par son épilogue. Il y a deux références externes: __main qui est une routine vide qui retourne immédiatement et _putchar qui est la routine d'affichage des caractères de la libc.
as09 -o hello.o hello.s
réalise l'assemblage du fichier assembleur 6809 en le fichier objet suivant:
XH H 2 areas 4 global symbols M hello.c S ___main Ref0000 S _putchar Ref0000 A _CODE size 1E flags 0 S _main Def0000 A _DATA size E flags 0 S _hello_str Def0000 T 00 00 48 65 6C 6C 6F 20 77 6F 72 6C 64 20 21 00 R 00 00 00 01 T 00 00 34 10 BD 00 00 8E 00 00 7E 00 14 E7 E2 BD R 00 00 00 00 02 05 00 00 00 08 00 01 00 0B 00 00 T 00 0E 00 00 32 61 30 01 E6 84 10 26 FF F1 4F 5F R 00 00 00 00 02 02 00 01 T 00 1C 35 90 R 00 00 00 00
Les lignes débutant par T contiennent du code machine 6809 tandis que celles débutant par R contiennent les informations de relocation de ce code.
ld09 -L/home/thomson/lib -b _CODE=0xA000 -t -o hello.bin /home/lib/gcc-lib/thomson/295.3/crt0.o hello.o -lc
réalise l'édition des liens et produit le fichier éxécutable. L'éditeur de liens est allé chercher dans la libc (option -lc) la routine putchar et l'a fondue dans le code machine final. Le fichier objet crt0.o doit être ajouté avant celui de tout programme C et l'option -b permet de spécifier l'adresse de début du code, ici 0xA000 pour une machine TO.
L'étape suivante est l'inclusion du fichier éxécutable dans une archive SAP à l'aide de sapfs:
sapfs --create hello.sap sapfs --add hello.sap hello.bin
Enfin l'étape finale est le transfert de l'archive sur disquette Thomson à l'aide de sap2: (on utilise ici le lecteur A: du PC)
sap2 --unpack hello.sap 0
Le programme peut ensuite être éxécuté sur toute machine TO munie d'un lecteur de disquettes par:
LOADM"hello.bin",,R
La chaîne de développement Thomson est disponible sur le site des Nostalgies Thomsonistes, à la fois sous forme de code source et de binaires pré-compilés pour MS-DOS. Elle est pleinement fonctionnelle et permet de produire des éxécutables Thomson à partir de programmes écrits en langages C et C++.
La principale tâche restante est l'écriture de la libc; elle contient pour le moment environ 70 fonctions qui représentent un sous-ensemble de la librairie ISO C, ainsi que quelques fonctions POSIX, mais l'interface bas-niveau avec le matériel est encore à l'état embryonnaire.
J'espère que ce rapide aperçu vous incitera à essayer et à tester la chaîne de développement Thomson, et à contribuer à son évolution.
Eric Botcazou