Tachibana

Documentation › Architecture

Architecture technique — OricTel

Vue d'ensemble

OricTel est composé de deux sous-systèmes indépendants :

  1. Programme Oric (6502 C/ASM) — le terminal Minitel.
  2. 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)

AdresseLectureÉcriture
$0380Donnée reçueDonnée à envoyer
$0381Registre statutReset programme
$0382Registre commandeRegistre commande
$0383Registre contrôleRegistre contrôle

Configuration V23 Minitel

Bits du registre Status

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

Attributs par cellule

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).

← Documentation · Manuel d'utilisation →