[NDA: Article écrit en Setembre 1995, publié dans ST Magazine n° 100 en Décembre 1995.]

Le mois dernier, je vous présentais le code source du logiciel serveur Minitel STUT ONE 2.6X et son fonctionnement général. Ce mois ci, mous allons nous intéresser aux traitements spécifiques nécessaires pour communiquer avec un Minitel. Vous allez découvrir que malgré sa petite taille, il ne se laisse pas dompter si facilement... Le Minitel est il asocial? C'est la question que nous allons élucider ici, en tentant de communiquer avec lui...

Inutile de vous dire que, pour nos explications, nous allons très fortement nous baser sur le code source de STUT ONE fourni sur la disquette du mois dernier. Si vous avez été assez fou pour ne pas vous procurer le numéro précédent de l'unique magazine au monde qui n'a pas peur d'expliquer comment fonctionnent les composantes indispensables de notre monde (un serveur Minitel par exemple!), sachez qu'il n'est peu être pas trop tard et qu'avec un peu de chance, il en reste un exemplaire à la boutique Pressimage...

LES OREILLES DU MINITEL

Posez donc votre Minitel sur une table et regardez le en face. Regardez le bien. Est-ce que vous voyez des oreilles? Oui? Alors je vous conseille d'arrêter de manger des champignons... Non? Rassurez vous c'est normal! Simplement parce que les oreilles du Minitel sont sur sa face arrière!

Vous avez maintenant le choix entre retourner votre Minitel ou bien contourner votre table. Toujours est-il que sur la face arrière, vous verrez une prise DIN, ronde avec 5 canaux auditifs (5 trous quoi). C'est dans cette oreille là qu'il faut causer pour que votre Minitel vous écoute. C'est surtout, par là que le serveur va causer pour dominer le Minitel, tel un maître son esclave.

L'autre oreille du Minitel, elle se situe au bout d'un tentacule (un cordon quoi) qui part de la face arrière et se loge dans la première prise téléphonique qu'elle trouve. C'est par là que le Minitel écoute ce que veulent les connectés du serveur. Ce qu'il entend par là, il devra le rapporter à son maître: l'ordinateur serveur...

Mais comment fait-il, justement, pour parler au maître. Eh bien, en fait, les oreilles du Minitel sont aussi des bouches et il peut donc parler avec ses oreilles! C'est vraiment incroyable l'anatomie de ces bêtes là!

Le mode de fonctionnement de ces organes est néanmoins assez simple à la base: quand le serveur envoie quelque chose dans une oreille, le Minitel l'envoie au connecté par l'autre. Et quand le connecté fait une requête dans l'autre oreille, le Minitel la transmet au serveur par la première...

Vous connaissez cette moquerie: "çà rentre par une oreille et çà ressort par l'autre". Oui? Eh bien, elle est tout à fait adaptée au fonctionnement du Minitel. En gros, le Minitel est donc une boîte sans cervelle, tout à fait stupide et qui ne sait s'affranchir que d'un éventail de tâches très limité. Ceci implique que nous allons constamment devoir être derrière lui...

MAIS A QUOI SERT-IL?

En temps normal, quand vous utilisez le Minitel en tant qu'interprète, pour vous connecter au 11 par exemple (commercialement parlant, je devrais dire: quand vous vous connectez au 3615 STMAG)... quand vous vous connectez au 11 donc, c'est un peu différent, puisque les informations à afficher arrivent par l'autre oreille - celle qui est dans la prise téléphonique. Les commandes que vous tapez repartent également par cette 'oreille'...

Résumons nous: les deux oreilles fonctionnent à peu près de la même manière. Quand vous parlez dans l'une, çà ressort par l'autre, et en plus çà s'affiche sur l'écran. Et quand vous parlez dans l'autre, çà ressort par la première et çà s'affiche aussi sur l'écran. Et encore plus subtil: quand vous tapez sur le clavier, çà lui sort par les deux oreilles en même temps, au Mintel!

Vous avez probablement un doute là... En effet, pourquoi deux oreilles au fonctionnement identique ont elles une apparence physique si différente? Il y a en effet une petite différence, elle se situe au niveau des signaux: l'oreille-fiche-téléphonique parle une langue "analogique" alors que l'oreille-prise-DIN-5-broches parle une langue "digitale". Quant au clavier et à l'écran, ils parlent une langue "humaine".

Le métier du Minitel est donc un métier d'interprète (même si vous ne l'aviez jamais remarqué jusque là). Le Minitel effectue instantanément la traduction entre trois langue: le "digital", la langue des ordinateurs, "l'analogique", la langue du réseau téléphonique, et "l'humain", la langue des utilisateurs.

Cet interprète, vous le payez 20 Francs/mois, ce qui est peu cher payé, voire complètement immoral. Néanmoins, comme il ne bronche pas, on ne va pas se priver et on va le faire travailler à plein régime.

Bien sûr, cette explication est un peu simpliste, et je vais vous la résumer, façon techno-maniac pour être sûr que tout le monde comprend bien: Le Minitel n'est autre qu'un terminal asynchrone interconnectant de manière complète un écran 40*25 8 niveaux de gris, un clavier AZERTY étendu, un modem V23 et un codec TTL. C'est clair? Bon, alors continuons...

AFFICHE!

La légende veut que les sysops de serveurs RTC, et à fortiori les auteurs de logiciels serveurs comme vous et moi, soient assoiffés de pouvoir. Ce pouvoir, ils, enfin nous, l'avons tout d'abord exercé sur notre chien, maintenant sur notre Minitel et le mois prochain, nous tenterons de l'exercer sur nos connectés. Ensuite nous serons probablement maîtres du monde. Mais d'ici là, nous avons du boulot! Je ne vais pas ici vous expliquer comment faire asseoir ou coucher votre Minitel, néanmoins, je vais tenter de vous montrer comment le faire afficher... Faciiiiile.

Première solution: vous allumez votre Minitel et vous écrivez en langage humain sur le clavier. Le Minitel va afficher en langage humain sur l'écran. C'est simple, rapide et efficace, sauf que vous allez vite en avoir marre de taper au clavier et de recommencer pour chaque nouveau connecté.

Deuxième solution: vous appelez le 11 et là bas un gentil ordinateur se charge de parler dans l'oreille téléphonique de votre Minitel pour le faire afficher. L'inconvénient c'est qu'il n'affiche pas vraiment ce que vous voulez!

Troisième solution: vous lui parlez dans son oreille-prise-DIN, mais cette oreille ne comprend que le "digital". Le grand bonheur, c'est que vous avez dans les parages un ordinateur de type ATARI ST (Avouez, nous savons tout!) parfaitement à même de parler le 'digital' avec votre Minitel. Un câble entre la prise DIN et la prise série de votre ATARI et ils sont prêts à se parler.

Votre ordinateur dispose également de la capacité fort intéressante de pouvoir être programmé. Vous pouvez donc lui faire mémoriser un série d'actions qu'il refera autant de fois que vous le désirez. Dans le cas qui nous intéresse, nous voulons qu'il mémorise des "phrases" et qu'il les répète dans l'oreille du Minitel lorsque bon nous semble.

En GfA Basic, il y a plusieurs manières de parler au Minitel en utilisant la prise série. La première s'applique très rapidement comme ceci:

OUT 1,65,66,67

Cette instruction affiche ABC sur l'écran de votre Minitel. Le 1 correspond au port série. Si vous avez plusieurs ports série, le 1 correspond au port série par défaut réglé dans le panneau de contrôle. Nous n'avons pas à chercher plus loin ici, puisque STUT ONE 2 ne gère qu'un seul port série. Les nombres 65, 66 et 67 quant à eux correspondent aux codes ASCII des lettres A, B et C.

La deuxième méthode est un peu plus civilisée:

OPEN "",#99,"AUX:"
PRINT #99,"ABC";
CLOSE #99

Il faut ici commencer par ouvrir un canal vers le port série (AUX:). Ici nous attribuons arbitrairement le n° 99 à ce canal. Ensuite nous pouvons faire des prints vers le port série, et c'est, ma foi, bien agréable. A la fin du programme, nous n'oublions pas de refermer la porte derrière nous...

La deuxième méthode, plus civilisée, semble avoir tous les avantages. Eh oui, on pourrait par exemple stocker une grande chaîne de caractères dans la variable page$ et l'afficher en un tournemain avec:

PRINT #99;page$;

Malheureusement ce n'est pas si simple, en effet, le Minitel se laisse piloter par un certain nombre de codes de contrôles assez barbares. Dans ce cas, on aura par exemple le choix entre:

OUT 1,27,66

et

PRINT #99;chr$(27);chr$(66);

pour passer en encre verte.

Déjà, la première solution semble plus courte. Autre exemple:

PRINT #99;"çà c'est génial";

produira quelque chose de bizarre. En effet, le Mintel et l'ATARI ne sont pas d'accord sur la représentation des caractères accentués. Pour afficher une telle phrase, il faut donc l'analyser caractère par caractère et envoyer des codes spéciaux à chaque fois que l'on rencontre un caractère accentué. C'est ce que fait la procédure affiche_msg() par exemple. La conversion d'un caractère accentué en une chaîne de caractères équivalente pour le Minitel se fait en appelant la procédure code_accent().

STUT ONE mélange donc allègrement la méthode OUT1,x et la méthode PRINT #99;x$; pour afficher sur le minitel, selon ce qui est le plus pratique à un instant donné.

VITESSE, PARITE ET LES AUTRES...

Envoyer des caractères vers le port série, d'une manière ou d'une autre, est une bonne chose. Mais en pratique cela pose quelques petits problèmes de compréhension entre la machine qui émet et celle qui est censée recevoir. Nous évoquions plus haut que le port série de l'ordinateur et la prise DIN 5 broches parlaient la même langue: le 'digital'. Soit, mais cette langue se décompose en plusieurs 'dialectes'! Il y a des paramètres tels que le débit, le nombre de bits par caractère, la parité et le contrôle de flux sur lesquels ils doivent se mettre d'accord.

Le Minitel impose des échanges à 7 bits par caractère et une parité paire. Quant à la vitesse (le débit), il y a plusieurs possibilités. D'un côté, sur la prise téléphonique, le Minitel (hormis les modèles les plus récents que seuls les employés de France Télécom peuvent s'offrir) ne peut communiquer qu'à 1200 bps. Que signifie bps? Cela signifie 'bits par secondes'. Dans ce cas précis on peut aussi parler de 1200 bauds, mais évitez, çà vous évitera de dire des âneries par la suite.

Concrètement, à quoi correspond cette vitesse? Nous avons vu que le Minitel utilisait 7 bits par caractère. Il y a également un bit de parité (paire). S'ajoute à cela, un bit de début de caractère et un bit de fin de caractère. Sans eux, deux Minitels (ou modems) communiquant entre eux ne sauraient pas où commencent les caractères. Ca nous fait donc 10 bits par caractère. Si on divise alors 1200 par 10 on se rend compte que le Minitel transmet (ou reçoit, selon les cas) 120 caractères par seconde. Sachant que son écran de 40 colonnes et 25 lignes fait 1000 caractères, un écran complet peut donc théoriquement s'afficher en 8,3 secondes, ce qui est déjà assez long...

Mais ce chiffre correspond à une suite de caractères blancs sur fond noir, sans jamais changer de couleur, sans clignotement, sans soulignement, sans animations, sans caractères semi-graphiques, etc... En effet à chaque fois que l'on veut introduire l'un des effets ci-dessus, il faut introduire dans le flux de caractères affichables, des caractères de contrôle permettant de changer de couleur, de passer en inverse vidéo, etc... Ces caractères de contrôles viennent rarement seuls, c'est souvent une séquence de 2, 3 ou 4 caractères d'un coup. Pour distinguer ces séquences de caractères du texte, elles commencent généralement par le caractère 'escape' de code ASCII 27 ($1B en héxadécimal). Vous le retrouverez dans l'exemple plus haut permettant de passer en entre verte.

C'est ainsi que le Minitel est devenu célèbre pour sa légendaire vitesse de transmission. La seule solution pour que çà aille un tout petit peu plus vite est d'afficher des pages un peu plus dépouillées...

Imaginez maintenant que vous êtes en train de créer une page vidéotex (un écran Minitel). Si a chaque modification, vous devez attendre 10 secondes pour voir le résultat, vous allez vite devenir fou. C'est pour cela que sur la prise DIN (qui s'appelle en fait prise péri-informatique), le Minitel 1B peut communiquer jusqu'à 4800 bps et le Minitel 2, jusqu'à 9600 bps. Et celui qui me parle de bauds sur la prise péri-informatique sera banni à jamais!

Au début, on se dit donc la chose suivante: on va communiquer à 9600 bps entre l'ordinateur et le Minitel, et puis derrière, sur la ligne téléphonique, ma foi, on ne communiquera qu'à 1200 bps, puisqu'on ne peut pas aller plus vite. Oui, c'est très intéressant çà! Comme çà, quand on fait des tests en local, çà va vite, et puis quand un type est connecté sur notre serveur, eh bien çà va aussi vite que çà peut!

Mais ce n'est pas si simple. Dans le cas précis où un type est connecté à 1200 bps et que l'ordinateur envoie une page vers le Minitel à 9600 bps, le Minitel reçoit, en une seconde, 8 fois plus d'informations qu'il ne peut en transmettre dans le même intervalle de temps. Ces données doivent êtres mises en mémoire par le Minitel, pour les envoyer un peu plus tard. Mais l'ordinateur continue d'envoyer, et le Minitel doit mettre de plus en plus de données en Mémoire. Cette mémoire, qu'on appelle une mémoire tampon (buffer en anglais) est limité. Dans le cas du Minitel, elle fait 256 octets, c'est à dire que c'est comme s'il n'y en avait pas. En envoyant à 9600 bps, vous la remplissez en un peu plus d'un quart de seconde! Et en moins d'une demi seconde, vous aurez envoyé plus de données que le Minitel n'a pu en stocker ou envoyer. Ces données en trop disparaîtront littéralement dans le néant (il y a un trou noir dans tous les Minitel, sisi, croyez moi!).

La seule solution pour éviter ces fâcheux problèmes, est de repasser la liaison ordinateur-Minitel à 1200 bps lorsqu'on travaille en mode connecté. Si vous arrivez à comprendre çà, vous êtes sur la bonne voie. Les éminents programmeurs d'une éminente société d'édition du nom de Log Access n'ont jamais saisi... [NDA: Private joke... sorry!]

CHANGER DE VITESSE

Bon, accrochez-vous, on va faire une comparaison vraiment tirée par les cheveux! Quand vous conduisez une voiture, si vous voulez changer de vitesse, vous devez d'abord débrayer et ensuite vous pouvez manipuler le levier de vitesse. Si vous ne débrayez pas avant de changer de vitesse, vous n'arriverez pas au résultat escompté. Vous aurez même des effets secondaires indésirables...

Eh bien pour changer la vitesse de la liaison ordinateur-Minitel, c'est pareil. L'ATARI dispose d'un appel système: XBIOS(15) pour changer la vitesse du port série. La procédure init_rs_520_1040 utilise cet appel système. Mais cet appel système, c'est comme le levier de vitesse: il faut 'débrayer' avant de l'utiliser!

En effet, imaginez que l'ordinateur communique avec le Minitel à 1200 bps et que tout à coup vous changez la vitesse de l'ordinateur à 9600 bps. La vitesse du Minitel, elle, reste à 1200 bps. Et les deux appareils ne peuvent plus communiquer jusqu'à ce que vous les mettiez à nouveau sur la même vitesse.

Pour changer la vitesse de la prise péri-informatique du Minitel, on peut utiliser la combinaison de touches Fnct+P puis 9 sur le clavier du Minitel (9 comme 9600, 4 comme 4800, 1 comme 1200 ou 3 comme 300 bps). Néanmoins ce sera vite lassant si vous devez répéter cette gymnastique avec vos doigts à chaque fois. Les ingénieurs de France Télécom y ont pensé et ont prévu une séquence de codes (vous savez celles qui commencent par Escape) que l'on peut envoyer par la prise péri-info, ce qui changera sa vitesse. Seulement voilà, si vous avez changé la vitesse de l'ordinateur, tout ce qu'il pourra bien envoyer à la prise péri-info sera incompris. Il faut donc demander au Minitel de changer de vitesse AVANT de changer la vitesse de l'ordinateur! Vu?

De plus, il ne faut pas changer la vitesse de l'ordinateur avant d'être sûr que les codes de changement de vitesse soient bien arrivés au Minitel. Il faut donc marquer une petite pose. Mais, bien sûr, entre le moment où le Minitel à changé de vitesse et celui ou l'ordinateur l'a fait aussi, il y a un laps de temps pendant lequel toute communication est impossible. Si le Minitel avait quelque chose d'important à dire à ce moment là, par exemple "j'ai détecté un appel entrant", l'ordinateur ne l'entendra pas.. et comme le Minitel ne le répétera pas... on distingue dores et déjà un deuxième trou noir! Les aléas de la technique... mmmh...

Permettez moi de faire une parenthèse et de vous dire comment les américains on traité le problème. Vous savez déjà que chez eux, les voitures sont automatiques et qu'on n'y débraye pas avant de changer de vitesse. Eh bien, quand ils ont inventé le modem à plusieurs vitesses, ils ont continué dans cette voie. Prenez un modem compatible Hayes, branchez-le, réglez la vitesse de l'ordinateur à n'importe quelle vitesse, envoyez une commande AT quelconque, et hop, le modem à adopté la vitesse. Changez la vitesse de l'ordinateur, renvoyez une commande Hayes, hop le modem s'est adapté... "Trop puissant le protocole Hayes!" serait-on tenté de dire. M'enfin, revenons en au Minitel...

Le corollaire du problème, c'est que quand STUT ONE démarre, il n'a aucune idée de la vitesse actuelle du Minitel, et pourtant il doit s'aligner sur cette vitesse pour commencer à communiquer avec lui! Il a trois chances sur quatre de se planter. Voici donc la méthode utilisée pour obtenir un taux de réussite de 100%. STUT ONE passe la prise série de l'ATARI successivement aux vitesses de 9600 bps, 1200 bps et 300 bps. A chaque fois, on demande au Minitel de passer à 4800 bps. Soit le Minitel reconnaît la requête lors d'un des trois essais, soit il était déjà à 4800 bps. Ensuite on passe l'ordinateur à 4800 bps et là on est sûr d'être à la même vitesse que le Minitel. On peut maintenant continuer sur de bonnes bases.

LES BASES, PARLONS-EN DES BASES!

Maintenant que vous savez à peu près tout ce qui est nécessaire pour envoyer des caractères, commandes et autres séquences de codes au Minitel, il ne vous reste plus qu'à connaître la syntaxe desdites commandes.

Je vous ai dévoilé au début, comment passer en encre verte. Je suis conscient que ce n'est pas très palpitant, mais vous pourrez trouver pratiquement toutes les séquences de commande du Minitel rien qu'en fouinant dans le code source de STUT ONE. La procédure code_vdt() est particulièrement adaptée pour commencer vos recherches. En effet, c'est elle qui s'occupe de traduire les pages vidéotex composées en langage SOVI.

Maintenant, si vous voulez de la documentation officielle, sachez qu'elle existe. Ca s'appelle "Spécifications Techniques d'Utilisation du Minitel 1B" (STUM1B pour les intimes) et çà se commande au CNET (renseignements dans les agences France Télécom). Existe aussi en version STUM2, additif au STUM1B et décrivant les nouvelles fonctions du Minitel 2. On espère le STUM4 pour bientôt... Remarquez, on est pas encore sûr du nom, ce sera peut-être aussi STUM-TVR (Télétel Vitesse Rapide) STUM-Photo ou même STUM'95 (Si ils s'inspirent de Microsoft...)

Bon allez, je vous laisse tenter de dompter votre Minitel. Bon courage!