OricTel — Funktionen im Detail
Minitel-1B-Terminal für den Oric 1 / Atmos · C + 6502-Assembler (cc65) · EUPL-1.2-Lizenz
Diese Seite listet alle Funktionen von OricTel auf, mit einer Erläuterung zu jeder. Das GitHub-Repository ist die maßgebliche, aktuelle Quelle; das Benutzerhandbuch und die Architekturdokumentation behandeln Nutzung und Interna.
Inhalt
1. Videotex-Decoder
Das Herz von OricTel ist ein Decoder für das Teletel/Antiope-Videotex-Protokoll (STUM 1B), implementiert als vollständiger Zustandsautomat.
Zustandsautomat
Behandelt ESC, CSI (mit Parametern), US, SS2, REP
(Wiederholung), SEP und die Protokollmodi PRO1/PRO2/PRO3.
Cursorpositionierung (US Zeile/Spalte), Bewegungen, Löschungen, Wagenrücklauf.
PRO2- / PRO3-Modi
Roll-Modus, Kleinbuchstaben, Tastaturumschaltungen, erweiterte/Cursor-Tastatur. Die Links/Rechts-Pfeile senden
nur dann Cursorsequenzen (ESC[D / ESC[C), wenn der Server den Cursormodus (PRO3) aktiviert
hat — wie bei einem echten Minitel 1B.
Terminalidentifikation
Die ENQ/ENQROM-Identifikation ist bewusst stumm: Moderne Server (MiniPavi) spiegeln die Antwort ins
Eingabefeld, statt sie zu verbrauchen — dasselbe Verhalten wie der Referenz-Emulator miedit.
2. HIRES-Anzeige
Auflösung & Raster
HIRES 240×200 Pixel, also 40 Spalten × 25 Zeilen (6×8-Pixel-Zellen). Video-Invertierung über Bit 7, serielle Oric-Attribute pro Scanline. Eine Statusleiste belegt die oberste Zeile.
Rendering-Engine in Assembler
Eine 6502-Span-Engine (~300 Takte pro Zelle). „Dirty“-Zellen-Auffrischung: Pro Frame (50 Hz) werden nur geänderte Zellen neu in den HIRES-Framebuffer gerendert, was die CPU-Last stark senkt. Adaptives Budget: Die Tastatur bleibt selbst mitten im Seitenaufbau reaktionsfähig. Tastenecho ~1 ms (Einzelzellen-Rendering), Vollseite ~0,3 s.
3. Zeichensätze
G0 / G1 / G2
- G0 — alphanumerisch (Minitel-ASCII, französische Akzente).
- G1 — 2×3-Block-Semigraphik-Mosaike (64 Muster), vorberechneter Cache.
- G2 — erweitertes CEPT, Diakritika und vorkomponierte Akzente (Klein-/Großbuchstaben).
G0/G1-Umschaltung über SI/SO; G2-Zeichen über SS2.
4. Attribute pro Zelle
Vollständige Attribute
Tintenfarbe (0-7), Hintergrundfarbe (0-7), Blinken (Flash), Video-Invertierung, Unterstreichung / Mosaiktrennung, Verbergen (concealed) und Größe: normal, doppelte Höhe, doppelte Breite, doppelte Größe. Eine hybride Farbheuristik nähert die Zellenfarben des Minitel mit den seriellen Oric-Attributen an: Attribute auf leeren Zellen mit Vorausschau (Farbe des folgenden Textes), Mosaike in Vollfarbe, wenn das Attribut passt, Luminanz-Dithering als Rückfall.
5. Rendering-Modi (STRG+D)
Der Oric kann nicht jede Zelle einzeln färben wie der Minitel; OricTel bietet drei umschaltbare Strategien:
| Modus | Verhalten |
|---|---|
| AUTO (Standard) | Bester Kompromiss, zeilenweise entschieden: Attributfarben, wo die Zeile es zulässt, Luminanz-Dithering für dichte Mehrfarbenzonen, Weiß-Rendering für ungeeignete Zeilen. |
| DITHERING | Alles in Dichteraster: Die Helligkeitshierarchie der Farben bleibt als texturierte „Graustufen“ erhalten. |
| ROH | Alles Weiß auf Schwarz: maximale Formlesbarkeit, keine Farbe. |
6. Verbindung
AT-Modem (die einzige Methode)
OricTel steuert ein Hayes-Modem über die ACIA 6551 bei $0380 (PicoWiFiModemUSB, echt oder von
Phosphoric emuliert --serial modem/picowifi): ATZ (Reset), dann
ATDT Host:Port (Wählen = TCP-Verbindung). Der Server wird im Menü gewählt, sodass man ohne Neustart des
Emulators wechseln kann.
WLAN-Konfig vom Oric aus
Auf einem echten LOCI + PicoWiFiModemUSB-Aufbau konfiguriert das Menü „WLAN-Konfig“ alles vom
Oric aus: Scan (AT$SCAN) nach 2,4-GHz-Netzen in Reichweite, Auswahl, Passworteingabe (maskiert), dann
Zuordnung (AT$SSID=/AT$PASS=/ATC1) und Speichern im NVRAM des Pico
(AT&W).
WebSocket-Brücke
orictel_bridge.py (Python asyncio) leitet TCP (Port 3615) an einen WebSocket-Minitel-Server
(ws://3617.fr/ws) weiter. Transparentes Binärrelais, Einzel-Client, Statistiken, -v-Modus.
7. Minitel-Server
| Server | Adresse | Hinweise |
|---|---|---|
| PAVI 3617 | pavi.3617.fr:3617 | empfohlen, Teletel-Startseite |
| MiniPavi | go.minipavi.fr:516 | Multiservice-Gateway |
| Andere | freie Eingabe Host:Port | Option 3 des Server-Menüs |
8. Minitel-Tastatur
OricTel läuft auf Oric-1 und Atmos. Funktionstasten nutzen STRG+Buchstabe (beide Maschinen) oder FUNCT+Buchstabe (nur Atmos).
| Minitel-Funktion | Oric-1 & Atmos | Nur Atmos | Gesendeter Code |
|---|---|---|---|
| Senden | RETURN | SEP $41 | |
| Zurück | STRG+R oder Pfeil HOCH | FUNCT+R | SEP $42 |
| Wiederholen | STRG+E | FUNCT+E | SEP $43 |
| Hilfe | STRG+G | FUNCT+G | SEP $44 |
| Abbrechen | STRG+A oder ESC | FUNCT+A | SEP $45 |
| Inhalt | STRG+S | FUNCT+S | SEP $46 |
| Korrektur | DELETE | SEP $47 | |
| Weiter | STRG+N | FUNCT+N | SEP $48 |
| Verbinden/Ende | STRG+C | FUNCT+C | SEP $49 |
| Pfeile L/R | Pfeil LINKS/RECHTS | ESC[D / ESC[C (PRO3-Cursormodus) |
Lokale Kürzel (senden nichts an den Server): STRG+D wechselt den
Rendering-Modus, STRG+L löscht den Bildschirm lokal, STRG+F setzt die serielle Verbindung
(ACIA) zurück.
9. Der Bildschirm & Status
Anzeigebereich & Verbindungsanzeige
Zeilen 1-24: die Videotex-Seite des Servers (40 Spalten). Statuszeile (oben rechts): invertiertes
C = kürzlich Daten empfangen (verbunden), F = keine Daten seit ~30 s (Verbindung
wahrscheinlich getrennt). Cursor: ein blinkender Balken unter der aktuellen Zelle, wenn der Server
ihn aktiviert (Eingabefelder). Ein Splashscreen beim Start mit einem AY-3-8912-Jingle.
10. Technische Spezifikationen
Seriell (ACIA 6551)
ACIA 6551 an der LOCI-Basis ($0380). Register: Daten $0380, Status/Reset $0381,
Befehl $0382, Steuerung $0383. Reines Polling des STATUS-Registers, kein
ACIA-IRQ; Registerschreibvorgänge sind SEI/PLP-geschützt (MIA-Beschränkung des echten LOCI). Eine
nicht-blockierende Software-TX-Warteschlange, von der Hauptschleife geleert.
Speicher
TAP ~23 KB; Code+Daten unter $9800 (cc65-Stack bei $0800); HIRES-Framebuffer
$A000-$BF3F. Statusleiste bei $BB80+.
Protokoll & Leistung
Teletel/Antiope-Videotex (STUM 1B). Vollseite ~0,3 s, Tastenecho ~1 ms. Gültigkeitsreferenz: der miedit/telenet-JS-Emulator.
11. Bauen & ausführen
make # baut orictel.tap
make dsk # Sedoric-Diskette orictel.dsk (MFM_DISK, bootfähig)
make test # Host-Tests (Videotex, ACIA/SMC, AT-Modem, Tastatur, Brücke)
make fuzz # Videotex-Decoder-Fuzzing (ASAN/UBSAN)
make coverage # Host-gcov-Abdeckung
make run # läuft unter Phosphoric im AT-Modem-Modus
make run-ws # startet die WebSocket-Brücke + den Emulator
make run-dsk # Microdisc-Boot der Sedoric-Diskette
Voraussetzungen: cc65 (≥ 2.19), Python 3.8+ mit websockets ≥ 12.0 (nur Brücke), der
Phosphoric-Emulator (oder ein physisches LOCI/PicoWiFiModemUSB) und die Oric-ROMs
(basic11b.rom für den Atmos, basic10.rom für den Oric-1).
12. Bekannte Einschränkungen
- Die Zellenfarben des Minitel werden mit den seriellen Oric-Attributen angenähert: In einer Zeile ohne nutzbare leere Zelle kann die Farbe eines Textes verloren gehen (weiß gerendert).
- Der MIXED-Modus (80-Spalten-Teleinformatik) wird nicht unterstützt.
- Die Terminalidentifikation (ENQ/ENQROM) ist bewusst stumm (an miedit ausgerichtet).
- Die echte V23-Konfiguration (1200/75 Baud, 7E1) für echte Oric-+-Modem-Hardware steht auf der Roadmap; unter dem Emulator ist die Übertragung sofortig.