Dokumentation › Architektur
Technische Architektur — OricTel
Überblick
OricTel besteht aus zwei unabhängigen Subsystemen:
- Oric-Programm (6502 C/ASM) — das Minitel-Terminal.
- Python-Brücke — ein WebSocket-↔-TCP-Gateway.
Datenfluss
Minitel-Server (ws://3617.fr/ws)
|
| WebSocket (Binärframes, rohe Videotex-Bytes)
v
+-------------------+
| orictel_bridge.py | Python asyncio
| TCP-Port 3615 | Transparentes bidirektionales Relais
+-------------------+
|
| TCP-Socket (rohe Bytes, kein Framing)
v
+-------------------+
| Phosphoric | Oric-Emulator
| TCP-ACIA-Backend | --serial tcp:127.0.0.1:3615
| V23-Modus | --serial-v23 (1200/75 Baud)
+-------------------+
|
| ACIA-6551-Register @ $0380-$0383 (LOCI-Basis)
| Taktgenaues Timing
v
+-------------------+
| OricTel-Programm | 6502-Code (cc65)
| |
| serial_asm.s | <-- Low-Level-ACIA-Treiber
| videotex.c | <-- Protokoll-Zustandsautomat
| display.c | <-- HIRES-Rendering
| keyboard.c | <-- Tastaturscan + Mapping
| main.c | <-- Hauptschleife
+-------------------+
Oric-Speicherkarte
$0000-$00FB Zero Page (cc65: $00E2-$00FB)
$0100-$01FF 6502-Stack
$0200-$02FF Systemvariablen
$0300-$030F VIA 6522 (Spiegel $0300-$03FF)
$0380-$0383 ACIA 6551 (seriell, LOCI-Basis)
$0400-$0500 Oric-Systembereich
$0501-$97FF OricTel CODE + DATA (~37 KB)
$9800-$9FFF BSS / cc65-Stack (2 KB)
$A000-$BF3F HIRES-Framebuffer (8000 Bytes)
$BB80-$BFDF Textbildschirm (Zeilen 25-27 = Statusleiste)
$C000-$FFFF ROM (16 KB)
ACIA-6551-Register (Oric-Seite)
| Adresse | Lesen | Schreiben |
|---|---|---|
$0380 | Empfangene Daten | Zu sendende Daten |
$0381 | Statusregister | Programm-Reset |
$0382 | Befehlsregister | Befehlsregister |
$0383 | Steuerregister | Steuerregister |
Minitel-V23-Konfiguration
- Steuerung:
$28= 1200 Baud, 7 Bit, 1 Stopp - Befehl:
$69= DTR an, RX-IRQ aus, gerade Parität aktiviert
Bits des Status-Registers
- Bit 3 (RDRF=
$08): empfangene Daten verfügbar - Bit 4 (TDRE=
$10): Sender bereit
Videotex-Protokoll — Zustandsautomat
NORMAL ──ESC($1B)──> ESC_SEQ
──US($1F)───> US_ROW
──SO($0E)───> (auf G1 umschalten)
──SI($0F)───> (auf G0 umschalten)
──$20-$7F──> (Zeichen anzeigen)
──$08-$0B──> (Cursorbewegung)
──$0C─────> (Bildschirm löschen)
──$0D─────> (Wagenrücklauf)
ESC_SEQ ──$40-$47──> (Tintenfarbe) -> NORMAL
──$50-$57──> (Hintergrundfarbe) -> NORMAL
──$48/$49──> (Blinken ein/aus) -> NORMAL
──$4C-$4F──> (Größe) -> NORMAL
──$5B─────> CSI
──$39─────> PRO
US_ROW ──$40-$57──> US_COL (speichert Zeile)
US_COL ──$41-$68──> NORMAL (positioniert Cursor)
CSI ──Params+Buchstabe──> NORMAL (ANSI-ähnlicher Befehl)
HIRES-Anzeige
- Auflösung: 240×200 Pixel = 40 Spalten × 25 Zeilen
- Jede Zelle: 6×8 Pixel
- 3 Zeichensätze:
- G0: alphanumerisch (Minitel-ASCII, französische Akzente)
- G1: Semigraphik-Mosaike (2×3 Blöcke = 64 Muster)
- G2: Zusatzzeichen (Diakritika)
Attribute pro Zelle
- Tintenfarbe (0-7)
- Hintergrundfarbe (0-7)
- Blinken (Flash)
- Video-Invertierung
- Unterstreichung / Mosaiktrennung
- Größe (normal, doppelte Höhe, doppelte Breite, doppelte Größe)
- Verbergen (concealed)
Optimiertes Rendering (Dirty Rectangles)
Jede geänderte Zelle wird „dirty“ markiert. Pro Frame (50 Hz) werden nur die geänderten Zellen neu in den HIRES-Framebuffer gerendert. Das senkt die CPU-Last des 6502 erheblich.
Reproduziert aus docs/ARCHITECTURE.md (maßgebliche, aktuelle Version auf GitHub).