Documentation › Architecture
Architecture technique — OricTel
Vue d'ensemble
OricTel est composé de deux sous-systèmes indépendants :
- Programme Oric (6502 C/ASM) — le terminal Minitel.
- Bridge Python — passerelle WebSocket ↔ TCP.
Flux de données
Serveur Minitel (ws://3617.fr/ws)
|
| WebSocket (frames binaires, octets Vidéotex bruts)
v
+-------------------+
| orictel_bridge.py | Python asyncio
| Port TCP 3615 | Relais bidirectionnel transparent
+-------------------+
|
| TCP socket (octets bruts, pas de trame)
v
+-------------------+
| Phosphoric | Émulateur Oric
| Backend TCP ACIA | --serial tcp:127.0.0.1:3615
| Mode V23 | --serial-v23 (1200/75 baud)
+-------------------+
|
| Registres ACIA 6551 @ $0380-$0383 (base LOCI)
| Timing cycle-exact
v
+-------------------+
| Programme OricTel | code 6502 (cc65)
| |
| serial_asm.s | <-- Driver ACIA bas niveau
| videotex.c | <-- Machine à états protocole
| display.c | <-- Rendu HIRES
| keyboard.c | <-- Scan clavier + mapping
| main.c | <-- Boucle principale
+-------------------+
Carte mémoire Oric
$0000-$00FB Zero Page (cc65 : $00E2-$00FB)
$0100-$01FF Pile 6502
$0200-$02FF Variables système
$0300-$030F VIA 6522 (miroir $0300-$03FF)
$0380-$0383 ACIA 6551 (série, base LOCI)
$0400-$0500 Zone système Oric
$0501-$97FF CODE + DATA OricTel (~37 Ko)
$9800-$9FFF BSS / Pile cc65 (2 Ko)
$A000-$BF3F Framebuffer HIRES (8000 octets)
$BB80-$BFDF Écran texte (lignes 25-27 = barre statut)
$C000-$FFFF ROM (16 Ko)
Registres ACIA 6551 (côté Oric)
| Adresse | Lecture | Écriture |
|---|---|---|
$0380 | Donnée reçue | Donnée à envoyer |
$0381 | Registre statut | Reset programme |
$0382 | Registre commande | Registre commande |
$0383 | Registre contrôle | Registre contrôle |
Configuration V23 Minitel
- Contrôle :
$28= 1200 baud, 7 bits, 1 stop - Commande :
$69= DTR on, IRQ RX off, parité paire activée
Bits du registre Status
- Bit 3 (RDRF=
$08) : donnée reçue disponible - Bit 4 (TDRE=
$10) : transmetteur prêt
Protocole Vidéotex — Machine à états
NORMAL ──ESC($1B)──> ESC_SEQ
──US($1F)───> US_ROW
──SO($0E)───> (basculer G1)
──SI($0F)───> (basculer G0)
──$20-$7F──> (afficher caractère)
──$08-$0B──> (déplacement curseur)
──$0C─────> (effacer écran)
──$0D─────> (retour chariot)
ESC_SEQ ──$40-$47──> (couleur encre) -> NORMAL
──$50-$57──> (couleur fond) -> NORMAL
──$48/$49──> (flash on/off) -> NORMAL
──$4C-$4F──> (taille) -> NORMAL
──$5B─────> CSI
──$39─────> PRO
US_ROW ──$40-$57──> US_COL (mémorise ligne)
US_COL ──$41-$68──> NORMAL (positionne curseur)
CSI ──params+lettre──> NORMAL (commande ANSI-like)
Affichage HIRES
- Résolution : 240×200 pixels = 40 colonnes × 25 lignes
- Chaque cellule : 6×8 pixels
- 3 jeux de caractères :
- G0 : alphanumérique (ASCII Minitel, accents français)
- G1 : mosaïques semi-graphiques (2×3 blocs = 64 motifs)
- G2 : caractères supplémentaires (diacritiques)
Attributs par cellule
- Couleur encre (0-7)
- Couleur fond (0-7)
- Clignotement (flash)
- Inversion vidéo
- Soulignement / séparation mosaïque
- Taille (normal, double hauteur, double largeur, double taille)
- Masquage (concealed)
Rendu optimisé (dirty rectangles)
Chaque cellule modifiée est marquée « dirty ». À chaque trame (50 Hz), seules les cellules modifiées sont re-rendues dans le framebuffer HIRES. Cela réduit considérablement la charge CPU du 6502.
Reproduit depuis docs/ARCHITECTURE.md (version de référence à jour sur GitHub).