Tachibana
Langue : français

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

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 :

ModeComportement
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.
DITHERINGTout en trames de densité : la hiérarchie de luminosité des couleurs est préservée en « niveaux de gris » texturés.
BRUTTout 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

ServeurAdresseRemarques
PAVI 3617pavi.3617.fr:3617recommandé, page d'accueil Téletel
MiniPavigo.minipavi.fr:516passerelle multi-services
Autresaisie libre hôte:portoption 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 MinitelOric-1 & AtmosAtmos seulCode envoyé
EnvoiRETURNSEP $41
RetourCTRL+R ou Flèche HAUTFUNCT+RSEP $42
RépétitionCTRL+EFUNCT+ESEP $43
GuideCTRL+GFUNCT+GSEP $44
AnnulationCTRL+AFUNCT+ASEP $45
SommaireCTRL+SFUNCT+SSEP $46
CorrectionDELETESEP $47
SuiteCTRL+NFUNCT+NSEP $48
Connexion/FinCTRL+CFUNCT+CSEP $49
Flèches G/DFlèche GAUCHE/DROITEESC[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

← Retour à OricTel · Documentation technique →