L'EXL 100 et tous ses supports
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.
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.
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
- Les images
.fdsont 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.
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.
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à$0FFFvisible 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
$0200to$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.