L'EXL 100 et tous ses supports

 · 13 min read
 · Jean Schurger

English version below.

Dans le billet précédent, l'Exelvision EXL 100 n'était qu'une machine sur trois. Depuis, c'est elle qui a pris tout le temps : exl100.schurger.org sait maintenant lire tout ce qui s'est branché ou glissé dans un EXL 100 en 1984, et une bonne partie de l'effort est allée là. Voici le point.

Le papillon Exelvision au démarrage de l'EXL 100 émulé

La machine

L'EXL 100 est un ordinateur familial français d'Exelvision (une équipe issue de Texas Instruments, à Valbonne). Il n'a rien d'un clone : deux processeurs TMS7000 (le TMS7020 principal et un TMS7041 qui gère les entrées-sorties et dialogue avec lui par une boîte aux lettres), un processeur vidéo TMS3556 qui dessine 40 colonnes de texte ou 320 × 250 points en huit couleurs, une puce de synthèse vocale TMS5220 et, détail inoubliable, un clavier et des manettes infrarouges, sans fil. Il n'y a pas de BASIC en ROM : nu, l'EXL 100 affiche son papillon et attend une cartouche.

L'émulation vient de dsp-cpp, un émulateur multi-machines en C++ dont le pilote exelv suit celui de MAME ; je l'ai compilé en WebAssembly et habillé d'une page. Tout tourne dans le navigateur, rien n'est envoyé ailleurs.

Les supports

Les cartouches. C'est le support de base : une ROM qui apparaît à l'adresse $0200. Les vingt cartouches connues sont dans la page (ExelBASIC, ExelBASIC+, Tennis, Guppy, Capitaine Menkar, Imagix, Exeltexte, Exelpaint, Exelogo, Exeldrums, Exelmax, Pindo…), prises dans le pack TOSEC et sur webmo.fr. Les tailles comptent : le pilote attend des dumps de 8, 16 ou 32 Ko à la taille exacte, et un dump bourré à 32 Ko ne se charge pas.

Les cassettes. Les programmes BASIC se vendaient sur cassette. Un fichier .k7 est la bande numérisée ; pour l'utiliser il faut ExelBASIC en cartouche, puis taper LOAD"1" et RUN. La page le fait pour vous : elle monte ExelBASIC et la cassette, puis tape elle-même la séquence au clavier infrarouge émulé (le guillemet est un Shift+3, avec une vraie touche Shift maintenue, sinon rien ne passe). Près de trois cents cassettes sont dans la bibliothèque : le pack TOSEC, puis la logithèque DCExel de Daniel Coulom, moissonnée page par page. Beaucoup de titres tenaient sur deux faces ou plusieurs cassettes ; elles sont reliées entre elles, et un bouton « Face B » change la cassette à chaud quand le programme la demande.

Minipuce, un programme BASIC sur cassette, lancé automatiquement

L'Exelmémoire. C'est une cartouche de 16 Ko de mémoire vive sauvegardée par pile, avec son propre système de fichiers, CROS (« CMOS RAM Operating System ») : on y copie des programmes depuis une cassette, et ils y restent. Rien de tout ça n'existait dans l'émulateur. Il a fallu désassembler la ROM système pour trouver comment elle détecte la cartouche (une signature $A5 lue en $C800, une amorce $AA en $8000), où vit le système ($D000 à $EFFF) et pourquoi, au premier formatage, l'écran virait au rouge : CROS range des vecteurs système sur une pile logicielle dans une zone de RAM que le pilote ne mappait pas. DCExel a servi d'oracle à chaque étape, et ses manuels scannés en DjVu, passés à l'OCR, ont donné les réponses que le code ne donnait pas. Résultat : l'Exelmémoire se branche d'une case, son contenu survit dans le navigateur (localStorage), on l'importe et on l'exporte au format .cram de DCExel, et les onze sauvegardes .bkp publiées par webmo.fr (Kong, Kamicar, Burgertime, Slalom, Pindo…) se lancent d'un clic. Ces jeux-là sont du code machine qui appelle ExelBASIC : la page insère la cartouche, puis tape CALL EXEC(32768).

Les disquettes. L'Exeldisk est le lecteur 3½ pouces d'Exelvision : un contrôleur WD1770 derrière quatre ports, une ROM d'amorçage de 8 Ko, 31 Ko de RAM en plus, et EXELDOS chargé depuis la disquette. Aucun émulateur libre ne le faisait. La pièce maîtresse a été le fichier EXELDOS.equ du kit de développement Jester (les équates du DOS, publiées sur DCExel) et la doc technique scannée : verrou DSKCTL qui choisit ce qu'on voit en $8000, $D000 et $0200, lecture d'un octet en deux temps, DRQ sur une broche du

  1. Les images .fd sont des fichiers à plat de 640 Ko (80 pistes, 2 faces,

16 secteurs de 256 octets). La page lit le système de fichiers d'EXELDOS elle-même : un bouton « Disquette » liste le contenu, et un clic sur un programme amorce la machine, insère ExelBASIC s'il s'agit d'un .BAS et tape la commande.

Le contenu d'une disquette EXELDOS, chaque programme cliquable PING.BAS lancé depuis la disquette par LOADRUN

Et l'EXELTEL. Le petit frère télématique de 1986 (64 Ko, modem, Minitel intégré) est la seconde machine de la page. Il lit les cartouches et cassettes de l'EXL 100, et c'est sur lui que l'Exelmémoire a été comprise en premier : son système CROS64 à menus est plus bavard que le CROS en ligne de commande de l'EXL 100.

La bibliothèque : cartouches, cassettes, Exelmémoire et disquettes, avec la provenance de chaque programme

Ce que l'émulateur a gagné au passage

  • Les couleurs du TMS3556 : le port de dsp-cpp utilisait un fond global là où la puce porte un fond de zone dans des cellules délimiteurs. Les menus d'Exeldrums étaient noir sur noir, le titre d'Imagix brouillé. Réécrit d'après MAME.
  • La parole : le TMS5220 était avancé deux fois par cycle et parlait 4,8 fois trop vite. Et le contexte audio du navigateur restait suspendu tant qu'on n'avait pas cliqué ; la page le réveille au premier geste.
  • La RAM basse $0200 à $0FFF visible quand aucune cartouche n'occupe la page, sans laquelle CROS plantait.
  • Le clavier : la page capture les touches au clic sur l'écran (la barre d'espace ne fait plus défiler la page) et les rend au clic à côté.

Ce qui est émulé, ce qui ne l'est pas

Composant État
TMS7020, TMS7041 et leur boîte aux lettres émulés (dsp-cpp)
Vidéo TMS3556, texte et bitmap émulée, couleurs corrigées
Parole TMS5220 émulée, vitesse corrigée
Clavier et manettes infrarouges au clavier de l'hôte (positions MAME)
Cartouches 8, 16 et 32 Ko oui
Cassettes .k7 oui, auto-chargement, faces multiples
Cassettes en enregistrement audio .wav oui : décodeur recadré sur l'octet de synchronisation, 15 cassettes de webmo.fr ajoutées
Exelmémoire 16 Ko (CROS) sur EXL 100 et EXELTEL oui, persistante, import/export
Exelmémoire 64 Ko pour EXL 100 non : le seul OS 64 Ko connu est celui de l'EXELTEL, qui exige son moniteur paginé ; les programmes « 64 Ko » tournent en 16 Ko
Exeldisk, EXELDOS, images .fd oui, deux lecteurs (A et B)
Écritures sur disquette oui, conservées dans le navigateur, retour à l'image d'origine possible
Images Teledisk .td0 oui (non compressées)
Exeldrums (boîte à rythmes) la cartouche tourne, mais son son vient d'une puce PCF0705 non émulée
Souris, imprimante (bus série), Exelmodem non
EXELTEL : téléphone, répondeur, Minitel non (pas de ligne)

Plus de trois cents programmes, deux machines, deux périphériques : tout n'a pas été essayé, loin de là. La plupart des programmes n'ont été vus qu'à leur écran de titre. Un balayage automatique (qui lit l'écran dans la mémoire vidéo pour y chercher un Err) a lancé les 286 cassettes et faces : 277 tournent, 6 ne chargent pas et 3 restent à voir. Les onze cassettes DCExel que LOAD"1" refusait étaient en fait des volumes Exelmémoire enregistrés par CROS64, parfois suivis du programme BASIC qui s'en sert : le volume est maintenant mis en place avant le chargement. La bibliothèque montre l'état de chaque cassette : ✓, ✗ ou ?, avec le détail en infobulle. Si quelque chose d'autre ne marche pas, écrivez-moi.

Le code est sur git.schurger.org ; les cartouches et cassettes viennent du pack TOSEC, de DCExel et de webmo.fr, et la ROM système de MAME.


English version

In the previous post, the Exelvision EXL 100 was one machine out of three. Since then it has taken all the time: exl100.schurger.org now reads everything that was ever plugged or slid into an EXL 100 in 1984, and most of the effort went there. Here is where things stand.

The machine

The EXL 100 is a French home computer by Exelvision, a team that came out of Texas Instruments in Valbonne. It is no clone: two TMS7000 processors (the main TMS7020 and a TMS7041 that handles I/O and talks to it through a mailbox), a TMS3556 video processor drawing 40 columns of text or 320 × 250 pixels in eight colours, a TMS5220 speech chip and, unforgettably, an infrared, wireless keyboard and joysticks. There is no BASIC in ROM: bare, the EXL 100 shows its butterfly and waits for a cartridge.

The emulation comes from dsp-cpp, a C++ multi-machine emulator whose exelv driver follows MAME's; I compiled it to WebAssembly and wrapped it in a page. Everything runs in the browser, nothing is sent anywhere.

The media

Cartridges. The basic medium: a ROM that appears at address $0200. The twenty known cartridges are in the page (ExelBASIC, ExelBASIC+, Tennis, Guppy, Capitaine Menkar, Imagix, Exeltexte, Exelpaint, Exelogo, Exeldrums, Exelmax, Pindo…), taken from the TOSEC pack and from webmo.fr. Sizes matter: the driver expects 8, 16 or 32 KB dumps at their exact size, and a dump padded to 32 KB does not load.

Cassettes. BASIC programs were sold on tape. A .k7 file is the digitised tape; to use it you need ExelBASIC as a cartridge, then type LOAD"1" and RUN. The page does it for you: it mounts ExelBASIC and the tape, then types the sequence itself on the emulated infrared keyboard (the double quote is Shift+3 with a real Shift key held down, otherwise nothing goes through). Nearly three hundred tapes are in the library: the TOSEC pack, then Daniel Coulom's DCExel collection, harvested page by page. Many titles spanned two sides or several tapes; they are linked together, and a "Side B" button swaps the tape while the machine runs, when the program asks for it.

The Exelmémoire. A 16 KB battery-backed RAM cartridge with its own file system, CROS ("CMOS RAM Operating System"): you copy programs into it from tape and they stay there. None of this existed in the emulator. I had to disassemble the system ROM to find how it detects the cartridge (an $A5 signature read at $C800, an $AA boot marker at $8000), where the system lives ($D000 to $EFFF) and why the screen turned red on the first format: CROS saves system vectors on a software stack in a RAM area the driver did not map. DCExel served as the oracle at every step, and its scanned DjVu manuals, run through OCR, gave the answers the code would not. The result: the Exelmémoire plugs in with a checkbox, its content survives in the browser (localStorage), it imports and exports DCExel's .cram format, and the eleven .bkp backups published by webmo.fr (Kong, Kamicar, Burgertime, Slalom, Pindo…) launch with one click. Those games are machine code that calls into ExelBASIC: the page inserts the cartridge, then types CALL EXEC(32768).

Floppy disks. The Exeldisk is Exelvision's 3½-inch drive: a WD1770 controller behind four ports, an 8 KB boot ROM, 31 KB of extra RAM, and EXELDOS loaded from the disk. No free emulator did it. The key piece was the EXELDOS.equ file from the Jester development kit (the DOS equates, published on DCExel) and the scanned technical manual: a DSKCTL latch that selects what is visible at $8000, $D000 and $0200, a two-step byte read, DRQ on a 7020 pin. .fd images are flat 640 KB files (80 tracks, 2 sides, 16 sectors of 256 bytes). The page reads the EXELDOS file system itself: a "Disk" button lists the content, and clicking a program boots the machine, inserts ExelBASIC if it is a .BAS and types the command.

And the EXELTEL. The telematic little brother from 1986 (64 KB, modem, built-in Minitel) is the page's second machine. It reads EXL 100 cartridges and tapes, and it is where the Exelmémoire was understood first: its menu-driven CROS64 is chattier than the EXL 100's command-line CROS.

What the emulator gained along the way

  • TMS3556 colours: the dsp-cpp port used a global background where the chip carries a zone background in delimiter cells. Exeldrums' menus were black on black, Imagix's title garbled. Rewritten after MAME.
  • Speech: the TMS5220 was advanced twice per cycle and spoke 4.8 times too fast. And the browser's audio context stayed suspended until a click; the page wakes it on the first gesture.
  • The low RAM $0200 to $0FFF, visible when no cartridge occupies the page, without which CROS crashed.
  • The keyboard: the page grabs keys when you click the screen (the space bar no longer scrolls the page) and gives them back when you click beside it.

What is emulated, what is not

Component Status
TMS7020, TMS7041 and their mailbox emulated (dsp-cpp)
TMS3556 video, text and bitmap emulated, colours fixed
TMS5220 speech emulated, speed fixed
Infrared keyboard and joysticks on the host keyboard (MAME positions)
8, 16 and 32 KB cartridges yes
.k7 tapes yes, auto-load, multiple sides
Audio recordings of tapes (.wav) yes: decoder realigned on the sync byte, 15 tapes from webmo.fr added
16 KB Exelmémoire (CROS) on EXL 100 and EXELTEL yes, persistent, import/export
64 KB Exelmémoire for the EXL 100 no: the only known 64 KB OS is the EXELTEL's, which needs its paged monitor; "64 KB" programs run in 16 KB
Exeldisk, EXELDOS, .fd images yes, two drives (A and B)
Disk writes yes, kept in the browser, with a way back to the original image
Teledisk .td0 images yes (uncompressed ones)
Exeldrums (drum machine) the cartridge runs, but its sound comes from a PCF0705 chip that is not emulated
Mouse, printer (serial bus), Exelmodem no
EXELTEL: phone, answering machine, Minitel no (no line)

Over three hundred programs, two machines, two peripherals: far from everything has been tried. Most programs have only been seen up to their title screen. An automatic sweep (which reads the screen from video memory looking for an Err) ran all 286 tapes and sides: 277 run, 6 do not load and 3 remain to be checked. The eleven DCExel tapes that LOAD"1" refused turned out to be Exelmémoire volumes written by CROS64, sometimes followed by the BASIC program that uses them: the volume is now put in place before loading. The library shows each tape's state: ✓, ✗ or ?, with details in a tooltip. If something else does not work, write to me.

The code is on git.schurger.org; cartridges and tapes come from the TOSEC pack, DCExel and webmo.fr, and the system ROM from MAME.