Tachibana

Documentación › Arquitectura

Arquitectura técnica — OricTel

Visión general

OricTel se compone de dos subsistemas independientes:

  1. Programa Oric (6502 C/ASM) — el terminal Minitel.
  2. Bridge Python — pasarela WebSocket ↔ TCP.

Flujo de datos

Servidor Minitel (ws://3617.fr/ws)
        |
        | WebSocket (frames binarios, octetos Vídeotex brutos)
        v
+-------------------+
| orictel_bridge.py |  Python asyncio
| Puerto TCP 3615   |  Relé bidireccional transparente
+-------------------+
        |
        | Socket TCP (octetos brutos, sin frame)
        v
+-------------------+
| Phosphoric        |  Emulador Oric
| Backend TCP ACIA  |  --serial tcp:127.0.0.1:3615
| Modo V23          |  --serial-v23 (1200/75 baudios)
+-------------------+
        |
        | Registros ACIA 6551 @ $0380-$0383 (base LOCI)
        | Timing de ciclo exacto
        v
+-------------------+
| Programa OricTel  |  código 6502 (cc65)
|                   |
| serial_asm.s      |  <-- Driver ACIA de bajo nivel
| videotex.c        |  <-- Máquina de estados del protocolo
| display.c         |  <-- Renderizado HIRES
| keyboard.c        |  <-- Escaneo de teclado + mapeo
| main.c            |  <-- Bucle principal
+-------------------+

Mapa de memoria del Oric

$0000-$00FB  Zero Page (cc65: $00E2-$00FB)
$0100-$01FF  Pila 6502
$0200-$02FF  Variables del sistema
$0300-$030F  VIA 6522 (espejo $0300-$03FF)
$0380-$0383  ACIA 6551 (serie, base LOCI)
$0400-$0500  Zona de sistema Oric
$0501-$97FF  CÓDIGO + DATOS OricTel (~37 KB)
$9800-$9FFF  BSS / Pila cc65 (2 KB)
$A000-$BF3F  Framebuffer HIRES (8000 octetos)
$BB80-$BFDF  Pantalla de texto (líneas 25-27 = barra de estado)
$C000-$FFFF  ROM (16 KB)

Registros ACIA 6551 (lado Oric)

DirecciónLecturaEscritura
$0380Dato recibidoDato a enviar
$0381Registro de estadoReset de programa
$0382Registro de comandoRegistro de comando
$0383Registro de controlRegistro de control

Configuración V23 Minitel

Bits del registro Status

Protocolo Vídeotex — Máquina de estados

NORMAL ──ESC($1B)──> ESC_SEQ
       ──US($1F)───> US_ROW
       ──SO($0E)───> (cambiar a G1)
       ──SI($0F)───> (cambiar a G0)
       ──$20-$7F──> (mostrar carácter)
       ──$08-$0B──> (movimiento del cursor)
       ──$0C─────> (borrar pantalla)
       ──$0D─────> (retorno de carro)

ESC_SEQ ──$40-$47──> (color de tinta) -> NORMAL
        ──$50-$57──> (color de fondo) -> NORMAL
        ──$48/$49──> (flash on/off) -> NORMAL
        ──$4C-$4F──> (tamaño) -> NORMAL
        ──$5B─────> CSI
        ──$39─────> PRO

US_ROW ──$40-$57──> US_COL (memoriza fila)

US_COL ──$41-$68──> NORMAL (posiciona cursor)

CSI ──params+letra──> NORMAL (comando tipo ANSI)

Pantalla HIRES

Atributos por celda

Renderizado optimizado (dirty rectangles)

Cada celda modificada se marca «dirty». En cada trama (50 Hz), solo se re-renderizan las celdas modificadas en el framebuffer HIRES. Esto reduce considerablemente la carga de CPU del 6502.

Reproducido de docs/ARCHITECTURE.md (versión de referencia actualizada en GitHub).

← Documentación · Manual de usuario →