Documentatie › Architectuur
Technische architectuur — OricTel
Overzicht
OricTel bestaat uit twee onafhankelijke subsystemen:
- Oric-programma (6502 C/ASM) — de Minitel-terminal.
- Python-brug — een WebSocket ↔ TCP-gateway.
Datastroom
Minitel-server (ws://3617.fr/ws)
|
| WebSocket (binaire frames, ruwe Videotex-bytes)
v
+-------------------+
| orictel_bridge.py | Python asyncio
| TCP-poort 3615 | Transparant bidirectioneel relais
+-------------------+
|
| TCP-socket (ruwe bytes, geen framing)
v
+-------------------+
| Phosphoric | Oric-emulator
| TCP ACIA-backend | --serial tcp:127.0.0.1:3615
| V23-modus | --serial-v23 (1200/75 baud)
+-------------------+
|
| ACIA 6551-registers @ $0380-$0383 (LOCI-basis)
| Cyclusnauwkeurige timing
v
+-------------------+
| OricTel-programma | 6502-code (cc65)
| |
| serial_asm.s | <-- Laag-niveau ACIA-driver
| videotex.c | <-- Protocol-toestandsmachine
| display.c | <-- HIRES-rendering
| keyboard.c | <-- Toetsenbordscan + mapping
| main.c | <-- Hoofdlus
+-------------------+
Oric-geheugenkaart
$0000-$00FB Zero Page (cc65: $00E2-$00FB)
$0100-$01FF 6502-stack
$0200-$02FF Systeemvariabelen
$0300-$030F VIA 6522 (spiegel $0300-$03FF)
$0380-$0383 ACIA 6551 (serieel, LOCI-basis)
$0400-$0500 Oric-systeemgebied
$0501-$97FF OricTel CODE + DATA (~37 KB)
$9800-$9FFF BSS / cc65-stack (2 KB)
$A000-$BF3F HIRES-framebuffer (8000 bytes)
$BB80-$BFDF Tekstscherm (regels 25-27 = statusbalk)
$C000-$FFFF ROM (16 KB)
ACIA 6551-registers (Oric-zijde)
| Adres | Lezen | Schrijven |
|---|---|---|
$0380 | Ontvangen data | Te verzenden data |
$0381 | Statusregister | Programma-reset |
$0382 | Commandoregister | Commandoregister |
$0383 | Controlregister | Controlregister |
Minitel V23-configuratie
- Control:
$28= 1200 baud, 7 bits, 1 stop - Commando:
$69= DTR aan, RX-IRQ uit, even pariteit ingeschakeld
Bits van het Status-register
- Bit 3 (RDRF=
$08): ontvangen data beschikbaar - Bit 4 (TDRE=
$10): zender gereed
Videotex-protocol — toestandsmachine
NORMAL ──ESC($1B)──> ESC_SEQ
──US($1F)───> US_ROW
──SO($0E)───> (schakel naar G1)
──SI($0F)───> (schakel naar G0)
──$20-$7F──> (toon teken)
──$08-$0B──> (cursorverplaatsing)
──$0C─────> (scherm wissen)
──$0D─────> (regelterugloop)
ESC_SEQ ──$40-$47──> (inktkleur) -> NORMAL
──$50-$57──> (achtergrondkleur) -> NORMAL
──$48/$49──> (flash aan/uit) -> NORMAL
──$4C-$4F──> (grootte) -> NORMAL
──$5B─────> CSI
──$39─────> PRO
US_ROW ──$40-$57──> US_COL (bewaart rij)
US_COL ──$41-$68──> NORMAL (positioneert cursor)
CSI ──params+letter──> NORMAL (ANSI-achtig commando)
HIRES-weergave
- Resolutie: 240×200 pixels = 40 kolommen × 25 rijen
- Elke cel: 6×8 pixels
- 3 tekensets:
- G0: alfanumeriek (Minitel-ASCII, Franse accenten)
- G1: semigraphische mozaïeken (2×3 blokken = 64 patronen)
- G2: extra tekens (diakritische tekens)
Attributen per cel
- Inktkleur (0-7)
- Achtergrondkleur (0-7)
- Flash
- Video-inversie
- Onderstreping / mozaïekscheiding
- Grootte (normaal, dubbele hoogte, dubbele breedte, dubbele grootte)
- Verberging (concealed)
Geoptimaliseerde rendering (dirty rectangles)
Elke gewijzigde cel wordt «dirty» gemarkeerd. Elk frame (50 Hz) worden alleen de gewijzigde cellen opnieuw gerenderd in de HIRES-framebuffer. Dit verlaagt de CPU-belasting van de 6502 aanzienlijk.
Gereproduceerd uit docs/ARCHITECTURE.md (gezaghebbende, actuele versie op GitHub).