Tachibana

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/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:

ModeBehaviour
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.
DITHERINGAll density dithering: the brightness hierarchy of colours is preserved as textured “greyscale”.
RAWAll 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

ServerAddressNotes
PAVI 3617pavi.3617.fr:3617recommended, Teletel home page
MiniPavigo.minipavi.fr:516multi-service gateway
Otherfree entry host:portoption 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 functionOric-1 & AtmosAtmos onlyCode sent
SendRETURNSEP $41
BackCTRL+R or UP arrowFUNCT+RSEP $42
RepeatCTRL+EFUNCT+ESEP $43
GuideCTRL+GFUNCT+GSEP $44
CancelCTRL+A or ESCFUNCT+ASEP $45
IndexCTRL+SFUNCT+SSEP $46
CorrectionDELETESEP $47
NextCTRL+NFUNCT+NSEP $48
Connect/EndCTRL+CFUNCT+CSEP $49
Left/Right arrowsLEFT/RIGHT arrowESC[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

← Back to OricTel · Technical documentation →