OricTel — fonctionnalités détaillées
Terminal Minitel 1B pour Oric 1 / Atmos · C + assembleur 6502 (cc65) · licence EUPL 1.2
Cette page recense l'intégralité des fonctionnalités d'OricTel, avec une explication de chacune. Le dépôt GitHub reste la référence à jour ; le manuel d'utilisation et la documentation d'architecture détaillent l'usage et la technique.
Sommaire
1. Décodeur Vidéotex
Le cœur d'OricTel est un décodeur du protocole Vidéotex Téletel/Antiope (STUM 1B), implémenté comme une machine à états complète.
Machine à états
Gère ESC, CSI (avec paramètres), US, SS2, REP
(répétition), SEP, et les modes protocole PRO1/PRO2/PRO3.
Positionnement curseur (US ligne/colonne), déplacements, effacements, retour chariot.
Modes PRO2 / PRO3
Rouleau, minuscules, aiguillages appliqués au clavier, clavier étendu / mode curseur. Les flèches
gauche/droite n'envoient les séquences curseur (ESC[D / ESC[C) que si le serveur a
activé le mode curseur (PRO3), comme sur un vrai Minitel 1B.
Identification terminal
L'identification ENQ/ENQROM est volontairement muette : les serveurs modernes (MiniPavi)
échoient la réponse dans le champ de saisie au lieu de la consommer — même comportement que l'émulateur de
référence miedit.
2. Affichage HIRES
Résolution & grille
HIRES 240×200 pixels, soit 40 colonnes × 25 lignes (cellules de 6×8 pixels). Inversion vidéo par le bit 7, attributs série de l'Oric posés par scanline. Les 25 lignes de la page appartiennent au serveur ; la barre de statut occupe les 3 lignes texte que l'Oric affiche encore sous le HIRES.
Moteur de rendu en assembleur
Blits 6502 (blit_cell8 ~190 cycles par cellule contre ~2 000 en C, blit_run pour
les courses de cellules, blit_cell4x2 pour la double hauteur). Rafraîchissement par
plages « dirty » : chaque ligne modifiée mémorise la plage de colonnes touchée, et le rendu est
budgété à une ligne par passe depuis la boucle principale, qui cède la main dès qu'un octet
attend en réception. Coûts mesurés en cycles 6502 (make bench-render) : passe de rendu
~151 000, ligne de texte colorée réaliste ~79 000, mise à jour d'une cellule ~30 000, soit une page complète
en 2 à 4 s de rendu pour ~8 s d'arrivée à 1200 bauds.
Compatible Oric-1 et Atmos
La bascule HIRES détecte la ROM au démarrage : jsr $EC33 sur BASIC 1.1 (Atmos),
jsr $F8E3 sur BASIC 1.0 (Oric-1). Les tests sur cible sont joués avec les deux ROM.
3. Jeux de caractères
G0 / G1 / G2
- G0 — alphanumérique (ASCII Minitel, accents français).
- G1 — mosaïques semi-graphiques 2×3 blocs (64 motifs), cache précalculé.
- G2 — CEPT étendu, diacritiques et accents précomposés (minuscules/majuscules).
Bascule G0/G1 par SI/SO ; caractères G2 via SS2.
4. Attributs par cellule
Attributs complets
Couleur d'encre (0-7), couleur de fond (0-7), clignotement (flash), inversion vidéo, soulignement / séparation mosaïque, masquage (concealed), et taille : normal, double hauteur, double largeur, double taille. Une heuristique couleur hybride approxime les couleurs par cellule du Minitel avec les attributs série de l'Oric : attributs posés sur les cellules vides avec regard-avant (couleur du texte qui suit), mosaïques en couleur solide quand l'attribut correspond, dithering par luminance en repli.
5. Modes de rendu (CTRL+D)
L'Oric ne peut pas colorer chaque cellule individuellement comme le Minitel ; OricTel propose trois stratégies commutables à chaud :
| Mode | Comportement |
|---|---|
| AUTO (défaut) | Meilleur compromis, décidé ligne par ligne : couleurs par attributs quand la ligne s'y prête, trame de luminance pour les zones multicolores denses, rendu blanc pour les lignes inadaptées. |
| DITHERING | Tout en trames de densité : la hiérarchie de luminosité des couleurs est préservée en « niveaux de gris » texturés. |
| BRUT | Tout blanc sur noir : lisibilité maximale des formes, aucune couleur. |
6. Connexion
Modem AT (seule méthode)
OricTel pilote un modem Hayes via l'ACIA 6551 à $0380 (PicoWiFiModemUSB, réel ou émulé par
Phosphoric --serial modem/picowifi) : ATZ (reset) puis
ATDT hôte:port (numérotation = connexion TCP). Le serveur se choisit dans le menu, on peut donc en
changer sans relancer l'émulateur.
Config WiFi depuis l'Oric
Sur un montage réel LOCI + PicoWiFiModemUSB, le menu « Config WiFi » configure tout depuis
l'Oric : scan (AT$SCAN) des réseaux 2,4 GHz à portée, sélection, saisie du mot de passe (masqué),
puis association (AT$SSID=/AT$PASS=/ATC1) et sauvegarde en NVRAM du Pico
(AT&W).
Passerelle WebSocket
orictel_bridge.py (Python asyncio) relaie TCP (port 3615) vers un serveur Minitel WebSocket
(ws://3617.fr/ws). Relais binaire transparent, mono-client, statistiques, mode -v.
Robustesse de la liaison
Modem resté en ligne (Oric resetté, émulateur fermé sans raccrocher) : l'absence de
« OK » après ATZ est détectée, OricTel raccroche (+++, ATH) et rejoue
ATZ avant de composer. Sans « CONNECT », un écran d'échec explicite propose
Réessayer / Autre serveur / Entrer quand même, plutôt qu'une session à l'aveugle. Perte de
porteuse : le NO CARRIER du modem, confirmé par 4 s de silence, ouvre l'écran
« PERTE DE PORTEUSE » avec « 1 Reconnecter » — pas de recomposition silencieuse. Les délais sont comptés sur
le Timer 2 du VIA 6522, une vraie base de temps. Validé avec un PicoWiFiModemUSB physique sur PAVI 3617.
7. Serveurs Minitel
| Serveur | Adresse | Remarques |
|---|---|---|
| PAVI 3617 | pavi.3617.fr:3617 | recommandé, page d'accueil Téletel |
| MiniPavi | go.minipavi.fr:516 | passerelle multi-services |
| Autre | saisie libre hôte:port | option 3 du menu serveur |
8. Clavier Minitel
OricTel fonctionne sur Oric-1 et Atmos. Les touches de fonction passent par CTRL+lettre (les deux machines) ou FUNCT+lettre (Atmos uniquement).
| Fonction Minitel | Oric-1 & Atmos | Atmos seul | Code envoyé |
|---|---|---|---|
| Envoi | RETURN | SEP $41 | |
| Retour | CTRL+R ou Flèche HAUT | FUNCT+R | SEP $42 |
| Répétition | CTRL+E | FUNCT+E | SEP $43 |
| Guide | CTRL+G | FUNCT+G | SEP $44 |
| Annulation | CTRL+A | FUNCT+A | SEP $45 |
| Sommaire | CTRL+S | FUNCT+S | SEP $46 |
| Correction | DELETE | SEP $47 | |
| Suite | CTRL+N | FUNCT+N | SEP $48 |
| Connexion/Fin | CTRL+C | FUNCT+C | SEP $49 |
| Flèches G/D | Flèche GAUCHE/DROITE | ESC[D / ESC[C (mode curseur PRO3) |
Raccourcis locaux (n'envoient rien au serveur) : CTRL+D change le
mode de rendu, CTRL+L efface l'écran localement, CTRL+F réinitialise la liaison série
(ACIA). ESC est la touche de secours : en session, ESC puis ESC raccroche et revient au menu ;
dans un menu ou une saisie, ESC annule ; sur le menu principal, ESC quitte OricTel vers le BASIC.
9. L'écran & le statut
Zone d'affichage
Lignes 0-24 : la page Vidéotex du serveur (40 colonnes), ligne 0 comprise — OricTel n'y écrit plus rien, comme un vrai Minitel. Curseur : barre clignotante sous la cellule courante lorsque le serveur l'active (zones de saisie). Splash screen au démarrage avec jingle AY-3-8912.
Barre de statut (3 lignes texte sous le HIRES)
C PAVI 3617 00:12 AUTO ESC <- état (cyan)
ESC: quitter? ESC=menu autre=reprendre <- messages (jaune)
^A Annul ^R Retour ^S Somm ^N Suite <- aide (blanc)
C inversé = données reçues récemment (connecté), F = pas de données depuis 30 s
(liaison probablement coupée) ; puis le serveur choisi, le chrono de session
(mm:ss) et le mode de rendu courant (AUTO/TRAME/BRUT).
La ligne du milieu accueille les messages (question ESC, ACIA reset), la dernière l'aide des touches.
10. Spécifications techniques
Série (ACIA 6551)
ACIA 6551 à la base LOCI ($0380). Registres : donnée $0380, statut/reset
$0381, commande $0382, contrôle $0383. Contrôle $18
(1200 bauds, 8N1, horloge interne), commande $0B (DTR, IRQ RX désactivée, RTS bas sans IRQ TX).
Polling pur du registre STATUS, aucune IRQ ACIA ; l'init et chaque accès octet sont
protégés SEI/PLP (contrainte MIA du vrai LOCI). File d'émission logicielle non bloquante drainée par la boucle
principale. Le firmware LOCI place un anneau de 32 octets devant le registre : ~250 000 cycles
de tolérance entre deux lectures à 1200 bauds. Le bit /DCD n'étant pas piloté par l'état de l'appel sur LOCI,
la perte de porteuse est détectée par la réponse NO CARRIER.
Mémoire
TAP ~28 Ko (CODE 25,5 Ko, RODATA 2,3 Ko, BSS 7,7 Ko) ; code+données sous $9800 ; jeu de
caractères de la barre de statut $9800-$9BFF ; pile cc65 $9C00-$9FFF (1 Ko) ;
framebuffer HIRES $A000-$BF3F ; 3 lignes texte $BF68-$BFDF.
Protocole & performance
Vidéotex Téletel/Antiope (STUM 1B). Budget d'un octet à 1200 bauds : 8 333 cycles. Mesuré :
vtx_process() ~2 600 cycles par octet, passe de rendu ~151 000 cycles (18,8 temps-octet),
mise à jour d'une cellule ~30 000 (3,6). Référence de validité : l'émulateur JS miedit/telenet ;
fidélité vérifiée contre de vrais serveurs (make test-servers, PAVI 3617 et MiniPavi).
11. Compilation & exécution
make # compile orictel.tap
make dsk # disquette Sedoric orictel.dsk (MFM_DISK, bootable)
make test # tests hôte + cible (Vidéotex, ACIA/SMC, modem AT, clavier, UI, menus, porteuse, bridge)
make fuzz # fuzzing du décodeur Vidéotex (ASAN/UBSAN)
make coverage # couverture hôte gcov
make bench-render # banc de mesure du rendu HIRES en cycles 6502
make test-servers # fidélité du décodage sur de vrais serveurs (dongle requis)
make run # lance sous Phosphoric en mode modem AT
make run-loci # PicoWiFiModemUSB physique sur /dev/ttyACM*
make run-ws # lance le bridge WebSocket + l'émulateur
make run-dsk # boot Microdisc de la disquette Sedoric
Prérequis : cc65 (≥ 2.19), Python 3.8+ avec websockets ≥ 12.0 (bridge
uniquement), l'émulateur Phosphoric (ou un LOCI/PicoWiFiModemUSB physique), et les
ROMs Oric (basic11b.rom pour Atmos, basic10.rom pour Oric-1). Suite de tests :
344 contrôles, dont des parcours de menus et une mesure du délai de perte de porteuse sur cible.
12. Limites connues
- Les couleurs par cellule du Minitel sont approximées par les attributs série de l'Oric : sur une ligne sans cellule vide utilisable, la couleur d'un texte peut être perdue (rendu blanc).
- Le mode MIXED (télé-informatique 80 colonnes) n'est pas supporté.
- L'identification terminal (ENQ/ENQROM) est volontairement muette (alignement sur miedit).
- La configuration V23 asymétrique (1200/75 bauds, 7E1) n'est plus une cible : le montage supporté est LOCI + PicoWiFiModemUSB, qui dialogue en 1200 8N1.
- Validé avec un PicoWiFiModemUSB physique via la chaîne co-simulée de Phosphoric (vrai firmware LOCI) ; la validation de bout en bout sur un vrai Oric-1 reste à confirmer.