fr –

Le Minitel comme terminal GNU/Linux

2022-07-02
Minitel, rétro, Arduino

Objectif : utiliser un Minitel comme terminal d'un système GNU/Linux.

Minitel affichant le logo de Rust.

Cet article est paru dans le magazine Programmez! #256, qui contient plusieurs autres articles concernant le Minitel et son interfaçage.

§😎 L'ère de la péri-informatique

Le Minitel dispose d'une prise "péri-informatique", qui est un port série d'entrée-sortie. Il suffit pour communiquer avec d'une interface série. J'ai donc utilisé une Arduino comme pont entre le Minitel et l'ordinateur. Mais attention, il faut un Arduino possédant plusieurs interfaces série (comme le Mega). Cela nous évite d'avoir à coder un pilote série logiciel. Le standard péri-informatique utilise à peu près de l'ASCII 7 bits et un découpage en octets. Le bit de poids fort est la somme de contrôle des 7 autres.

§🔌 Électronique

Schéma du branchement

§💻️ Logiciel

J'ai d'abord codé un contrôleur en Python. C'est une sorte d'émulateur de terminal, avec le port USB comme entrée-sortie. Il prend une ligne de commande et l'exécute à l'appui de la touche Envoi.

Minitel affichant le logo de Rust.

Rien que ça demandait de surmonter plusieurs difficultés :

Toutes ces contraintes rendent la conception d'un terminal générique compliquée. Il faut que chaque programme adapte sa gestion du clavier et de l'affichage, car les besoins sont différents pour un utilitaire en ligne de commande, un éditeur de texte, une messagerie instantanée ou un jeu en temps réel.

On m'a donc donné l'idée d'une approche différente : plutôt que d'envoyer la sortie des programmes au Minitel, on garde un tampon de l'écran du Minitel en mémoire. C'est un tableau de l'état de chaque caractère, dont le mode texte ou semi-graphique, la couleur, le clignotement, le code du caractère, etc. Les programmes écrivent dedans, puis demandent au contrôleur de l'envoyer. Au prix de calculs plus lents (ce qui reste négligeable), l'algorithme cherche alors à envoyer le moins de données possibles. Les caractères inchangés ne sont pas renvoyés, on profite de l'instruction plaçant le curseur à la position donnée et de celle permettant de répéter les N derniers caractères.

J'ai implémenté ce nouveau contrôleur en Rust (un langage bas-niveau offrant des abstractions haut-niveau sans coût et la sécurité de la mémoire), ce qui permet un code plus propre, sûr et rapide qu'en Python. C'est une bibliothèque réutilisable (publiée sous licence libre GNU AGPL), que j'ai pu utiliser pour faire un terminal, un Tetris et un Snake.

Au prix de quelques nanosieverts et d'un ultrason désagréable, cette petite aventure rétro m'a plongé dans une époque que je n'ai pas connue, quoique j'y vis peut-être encore.

Ressources utiles :