Assembleur 6809 pour Thomson MO5 sous Linux

cross-compilation Assembleur MO5 avec C6809

Dans la série “comment compiler à partir de Linux pour une autre machine”, l’objectif de ce mini-tutorial est d’obternir un .BIN pour Thomson MO5 avec l’assembleur C6809.

Le fichier exécutable sera testé avec l’émulateur DCMOTO de Daniel Coulom avant d’être transféré sur un véritable MO5.

Le MO5 et le 6809

Je vais décrire ici brièvement le Thomson MO5 et son fameux processeur 6809.

Thomson MO5

Les caractéristiques de la bête :

  • Processeur Motorola 6809 à 1 MHz
  • 48 Ko de mémoire : 16 Ko de ROM, 32 Ko de RAM
  • 320 x 200 en 16 couleurs, avec contrainte (2 couleurs tous les 8 pixels, par ligne)

Bref, un truc de dingue !

Au niveau du processeur :

  • registres “accumulators” (données) : A et B, 8 bits chacun. D étant la combinaison 16 bits de A et B
  • registres “pointers” (adresses) : X et Y sur 16 bits
  • registres de pile : U (User stack) et S (System stack) sur 16 bits chacun
  • registre PC (Program Counter) sur 16 bits
  • DP (Direct Page) et CC (Condition Code) sur 8 bits chacun.

Et c’est tout …

Installation de l’assembleur 6809

Pour compiler de l’assembleur Motorola 6809 , je vais utiliser c6809 réalisé par l’équipe “PULSDEMOS”.

Je vous invite d’ailleurs à regarder les réalistions sur Thomson TO8 de ce groupe, c’est absolument génial !

Le binaire pour Linux se situe dans le sous répertoire linux : c6809 que je copie dans /usr/share/bin :

Je teste l’installation en lançant la commande c6809 :

$ c6809
Compilateur Macro/Assembler-like
  Francois MOURET (c) C6809 v 0.83 - mars 2010

C6809 [options] fichier_source fichier_destination

  options :
  -h  aide de ce programme
  -o  option(s) d'assemblage (NO, OP, SS, WE, WL et WS)
      les parametres d'option (tous desactives par defaut) doivent
      etre separes par des '/'
  -b  type de la sortie (binaire non lineaire par defaut)
      l  binaire lineaire
      h  binaire hybride
      d  donnee
  -d  passage d'argument (<symbole>=<valeur>)
  -c  cree les fichiers ASM au format Thomson
  -q  notifie le depassement de 40 caracteres par ligne (300 par defaut)
  -e  groupe les messages d'erreur du listing (ordre de ligne par defaut)
  -s  ordre d'affichage des symboles du listing (alphabetique par defaut)
      e  par erreur de symbole
      t  par type de symbole
      n  par frequence d'utilisation
  -a  Notifie la compatibilite (assembleur virtuel par defaut)
      a  ASSEMBLER1.0 et ASSEMBLER 2.0
      m  MACROASSEMBLER 3.6
  -m  + TO/TO7/MO machine de travail (TO par defaut)

Tout est fonctionnel.

Compilation d’un programme MO5

Je me crée un petit programme en assembleur pour MO5 (attention, ce n’est pas compatible avec TO7 et +)

hello.ass

(main)MAIN.ASM   * Marquage du programme principal

DEBUT
    ORG $6000
    LDX #MESSAGE
AFFICHE		
    LDB ,X+
    BEQ FIN
    SWI 
    FCB $02
    BRA AFFICHE

FIN
    RTS

MESSAGE
    FCS "HELLO LES THOMSONISTES !",0
    END

Le programme sera implanté à l’adresse $6000.

Je compile cette nouvelle oeuvre avec c6809 :

$ c6809 -mMO hello.ass HELLO.BIN
Macro Pass
Pass1
Pass2

000000 Total Errors

000004 Total Symbols

Je peux afficher le code compilé :

cat codes.lst 
/*--------------------------------------------------------------*
 * Compilé avec C6809 v0.83                                     *
 *--------------------------------------------------------------*
 * Fichier source      : hello.ass
 * Fichier destination : HELLO.BIN
 * Contenu :
 *     Main     0:MAIN.ASM     174
 *--------------------------------------------------------------*/

Macro Pass
Pass1
Pass2
      2
      3        0000               DEBUT
      4        6000                      ORG $6000
      5  3     6000 8E   600C            LDX #MESSAGE
      6        6003               AFFICHE
      7  4+2   6003 E6   80              LDB ,X+
      8  3     6005 27   04              BEQ FIN
      9  19    6007 3F                   SWI
     10        6008 02                   FCB $02
     11  3     6009 20   F8              BRA AFFICHE
     12
     13        600B               FIN
     14  5     600B 39                   RTS
     15
     16        600C               MESSAGE
     17        600C 48 45 4C 4C          FCS "HELLO LES THOMSONISTES !",0
               6010 4F 20 4C 45
               6014 53 20 54 48
               6018 4F 4D 53 4F
               601C 4E 49 53 54
               6020 45 53 20 21
               6024 00
     18                  0000            END

000000 Total Errors

000004 Total Symbols
     1x          Label 6003 AFFICHE
     0x          Label 0000 DEBUT
     1x          Label 600B FIN
     1x          Label 600C MESSAGE

Le fichier produit est un .BIN qui ne fait que 47 octets :

$ hexdump -C HELLO.BIN 
00000000  00 00 25 60 00 8e 60 0c  e6 80 27 04 3f 02 20 f8  |..%`..`...'.?. .|
00000010  39 48 45 4c 4c 4f 20 4c  45 53 20 54 48 4f 4d 53  |9HELLO LES THOMS|
00000020  4f 4e 49 53 54 45 53 20  21 00 ff 00 00 00 00     |ONISTES !......|
0000002f

Je génère une disquette .fd avec support DOS et importation du fichier avec l’outil DCFDUTIL

DCFDUTIL

Ensuite je peux lancer l’émulateur avec cette disquette, charger le programme et le lancer.

Le mieux pour cela c’est de préparer un petit programme en BASIC qui va être ajouté aussi à la disquette :

RUNME.BAS

10 LOADM "HELLO.BIN"
20 EXEC &H6000

Je lance DCMOTO, avec Wine sous Linux, en mode MO5 avec la disquette demo.fd

DCMOTO

Tada !

Conclusion

Le plus difficile, dans tout cela, c’est de créer l’image de la disquette et de lancer l’émulateur ! Etant sous Linux j’aurais aimé pouvoir scripter cela.

Je vous invite à (re)découvrir cette machine simple mais efficace, qui m’a permis de découvrir l’informatique et la programmation quand j’avais 10 ans ! A l’époque j’avais la cartouche “Assembleur” et un gros (très gros) bouquin !

Liens

Commentaires

Mes autres articles
Atari ST : Routines YM avec le Timer A
Atari ST : coopération C et Assembleur
Simulateur de Palette et 4 bitplanes
4 bitplanes de l'Atari ST
Assembleur 68000 pour Atari ST sous Linux
Programmation C pour Atari ST sous Linux
REST API avec Quarkus, JPA, PostGreSQL et GraalVM
Functional Switch/Case en Java 8 et +
Repenser son style de codage
Le singleton est mort, vive le singleton !
Découverte de Deltaspike Data Module
Préconditions des méthodes d'une API
Serveur minimal HTTP avec JShell en Java_10
Apache Archiva sur Raspberry PI
Contribuer à l'Eclipse Foundation : DONE
Connaissez-vous bien l'instanciation ?
Xenon Reborn, développer en s'amusant et réciproquement
Où définir au mieux une NamedQuery JPA ?
Lombok, Oui ! Mais...