Documentación › Arquitectura
Arquitectura técnica — OricTel
Visión general
OricTel se compone de dos subsistemas independientes:
- Programa Oric (6502 C/ASM) — el terminal Minitel.
- 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ón | Lectura | Escritura |
|---|---|---|
$0380 | Dato recibido | Dato a enviar |
$0381 | Registro de estado | Reset de programa |
$0382 | Registro de comando | Registro de comando |
$0383 | Registro de control | Registro de control |
Configuración V23 Minitel
- Control:
$28= 1200 baudios, 7 bits, 1 stop - Comando:
$69= DTR on, IRQ RX off, paridad par activada
Bits del registro Status
- Bit 3 (RDRF=
$08): dato recibido disponible - Bit 4 (TDRE=
$10): transmisor listo
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
- Resolución: 240×200 píxeles = 40 columnas × 25 filas
- Cada celda: 6×8 píxeles
- 3 juegos de caracteres:
- G0: alfanumérico (ASCII Minitel, acentos franceses)
- G1: mosaicos semigráficos (2×3 bloques = 64 patrones)
- G2: caracteres adicionales (diacríticos)
Atributos por celda
- Color de tinta (0-7)
- Color de fondo (0-7)
- Parpadeo (flash)
- Inversión de vídeo
- Subrayado / separación de mosaico
- Tamaño (normal, doble altura, doble anchura, doble tamaño)
- Ocultación (concealed)
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).