OricTel — full feature list
Minitel 1B terminal for the Oric 1 / Atmos · C + 6502 assembly (cc65) · EUPL 1.2 license
This page lists every OricTel feature, with an explanation of each. The GitHub repository is the authoritative, up-to-date source; the user manual and the architecture documentation cover usage and internals.
Contents
1. Videotex decoder
The heart of OricTel is a decoder for the Teletel/Antiope Videotex protocol (STUM 1B), implemented as a full state machine.
State machine
Handles ESC, CSI (with parameters), US, SS2, REP
(repeat), SEP, and the PRO1/PRO2/PRO3 protocol modes. Cursor
positioning (US row/column), moves, erases, carriage return.
PRO2 / PRO3 modes
Roll mode, lowercase, keyboard switches, extended/cursor keyboard. The left/right arrows only send cursor
sequences (ESC[D / ESC[C) if the server has enabled cursor mode (PRO3), just like a real
Minitel 1B.
Terminal identification
ENQ/ENQROM identification is deliberately silent: modern servers (MiniPavi) echo the reply into the
input field instead of consuming it — the same behaviour as the reference emulator miedit.
2. HIRES display
Resolution & grid
HIRES 240×200 pixels, i.e. 40 columns × 25 rows (6×8-pixel cells). Video inverse via bit 7, Oric serial attributes set per scanline. A status bar occupies the top line.
Assembly rendering engine
A 6502 span engine (~300 cycles per cell). “Dirty”-cell refresh: each frame (50 Hz), only changed cells are re-rendered into the HIRES framebuffer, which sharply cuts CPU load. Adaptive budget: the keyboard stays responsive even mid page-load. Keystroke echo ~1 ms (single-cell render), full page ~0.3 s.
3. Character sets
G0 / G1 / G2
- G0 — alphanumeric (Minitel ASCII, French accents).
- G1 — 2×3-block semigraphic mosaics (64 patterns), precomputed cache.
- G2 — extended CEPT, diacritics and precomposed accents (lower/uppercase).
G0/G1 switching via SI/SO; G2 characters via SS2.
4. Per-cell attributes
Complete attributes
Ink colour (0-7), background colour (0-7), flash, video inverse, underline / mosaic separation, conceal, and size: normal, double height, double width, double size. A hybrid colour heuristic approximates the Minitel's per-cell colours using the Oric's serial attributes: attributes placed on empty cells with look-ahead (colour of the following text), mosaics in solid colour when the attribute matches, luminance dithering as a fallback.
5. Rendering modes (CTRL+D)
The Oric cannot colour each cell individually like the Minitel; OricTel offers three hot-swappable strategies:
| Mode | Behaviour |
|---|---|
| AUTO (default) | Best compromise, decided line by line: attribute colours where the line allows, luminance dithering for dense multi-colour zones, white rendering for unsuitable lines. |
| DITHERING | All density dithering: the brightness hierarchy of colours is preserved as textured “greyscale”. |
| RAW | All white on black: maximum shape legibility, no colour. |
6. Connection
AT modem (the only method)
OricTel drives a Hayes modem via the ACIA 6551 at $0380 (PicoWiFiModemUSB, real or emulated by
Phosphoric --serial modem/picowifi): ATZ (reset) then
ATDT host:port (dialling = TCP connection). The server is chosen from the menu, so you can switch
without restarting the emulator.
WiFi config from the Oric
On a real LOCI + PicoWiFiModemUSB setup, the “WiFi Config” menu configures everything from the
Oric: scan (AT$SCAN) for in-range 2.4 GHz networks, selection, password entry (masked), then
association (AT$SSID=/AT$PASS=/ATC1) and saving to the Pico's NVRAM
(AT&W).
WebSocket bridge
orictel_bridge.py (Python asyncio) relays TCP (port 3615) to a WebSocket Minitel server
(ws://3617.fr/ws). Transparent binary relay, single-client, statistics, -v mode.
7. Minitel servers
| Server | Address | Notes |
|---|---|---|
| PAVI 3617 | pavi.3617.fr:3617 | recommended, Teletel home page |
| MiniPavi | go.minipavi.fr:516 | multi-service gateway |
| Other | free entry host:port | option 3 of the server menu |
8. Minitel keyboard
OricTel runs on the Oric-1 and Atmos. Function keys use CTRL+letter (both machines) or FUNCT+letter (Atmos only).
| Minitel function | Oric-1 & Atmos | Atmos only | Code sent |
|---|---|---|---|
| Send | RETURN | SEP $41 | |
| Back | CTRL+R or UP arrow | FUNCT+R | SEP $42 |
| Repeat | CTRL+E | FUNCT+E | SEP $43 |
| Guide | CTRL+G | FUNCT+G | SEP $44 |
| Cancel | CTRL+A or ESC | FUNCT+A | SEP $45 |
| Index | CTRL+S | FUNCT+S | SEP $46 |
| Correction | DELETE | SEP $47 | |
| Next | CTRL+N | FUNCT+N | SEP $48 |
| Connect/End | CTRL+C | FUNCT+C | SEP $49 |
| Left/Right arrows | LEFT/RIGHT arrow | ESC[D / ESC[C (PRO3 cursor mode) |
Local shortcuts (send nothing to the server): CTRL+D changes the
rendering mode, CTRL+L clears the screen locally, CTRL+F resets the serial link (ACIA).
9. The screen & status
Display area & link indicator
Lines 1-24: the server's Videotex page (40 columns). Status line (top right): inverse
C = data received recently (connected), F = no data for ~30 s (link likely dropped).
Cursor: a blinking bar under the current cell when the server enables it (input fields). A splash
screen on startup with an AY-3-8912 jingle.
10. Technical specifications
Serial (ACIA 6551)
ACIA 6551 at the LOCI base ($0380). Registers: data $0380, status/reset
$0381, command $0382, control $0383. Pure polling of the STATUS register,
no ACIA IRQ; register writes are SEI/PLP-guarded (the real LOCI's MIA constraint). A non-blocking
software TX queue drained by the main loop.
Memory
TAP ~23 KB; code+data below $9800 (cc65 stack at $0800); HIRES framebuffer
$A000-$BF3F. Status bar at $BB80+.
Protocol & performance
Teletel/Antiope Videotex (STUM 1B). Full page ~0.3 s, keystroke echo ~1 ms. Validity reference: the miedit/telenet JS emulator.
11. Building & running
make # builds orictel.tap
make dsk # Sedoric floppy orictel.dsk (MFM_DISK, bootable)
make test # host tests (Videotex, ACIA/SMC, AT modem, keyboard, bridge)
make fuzz # Videotex decoder fuzzing (ASAN/UBSAN)
make coverage # host gcov coverage
make run # runs under Phosphoric in AT modem mode
make run-ws # runs the WebSocket bridge + the emulator
make run-dsk # Microdisc boot of the Sedoric floppy
Prerequisites: cc65 (≥ 2.19), Python 3.8+ with websockets ≥ 12.0 (bridge only),
the Phosphoric emulator (or a physical LOCI/PicoWiFiModemUSB), and the Oric ROMs
(basic11b.rom for the Atmos, basic10.rom for the Oric-1).
12. Known limitations
- The Minitel's per-cell colours are approximated by the Oric's serial attributes: on a line without a usable empty cell, a text's colour may be lost (rendered white).
- MIXED mode (80-column teleinformatics) is not supported.
- Terminal identification (ENQ/ENQROM) is deliberately silent (aligned with miedit).
- Real V23 configuration (1200/75 baud, 7E1) for real Oric + modem hardware is on the roadmap; under the emulator the transfer is instantaneous.