ドキュメント › アーキテクチャ
技術アーキテクチャ — OricTel
概要
OricTel は 2 つの独立したサブシステムから成ります:
- Oric プログラム(6502 C/ASM)— Minitel 端末。
- Python ブリッジ — WebSocket ↔ TCP ゲートウェイ。
データフロー
Minitel サーバ (ws://3617.fr/ws)
|
| WebSocket(バイナリフレーム、生の Vidéotex バイト)
v
+-------------------+
| orictel_bridge.py | Python asyncio
| TCP ポート 3615 | 透過的な双方向中継
+-------------------+
|
| TCP ソケット(生バイト、フレームなし)
v
+-------------------+
| Phosphoric | Oric エミュレータ
| TCP ACIA バックエンド | --serial tcp:127.0.0.1:3615
| V23 モード | --serial-v23 (1200/75 ボー)
+-------------------+
|
| ACIA 6551 レジスタ @ $0380-$0383(LOCI ベース)
| サイクル精度のタイミング
v
+-------------------+
| OricTel プログラム | 6502 コード (cc65)
| |
| serial_asm.s | <-- 低レベル ACIA ドライバ
| videotex.c | <-- プロトコルのステートマシン
| display.c | <-- HIRES 描画
| keyboard.c | <-- キーボードスキャン + マッピング
| main.c | <-- メインループ
+-------------------+
Oric メモリマップ
$0000-$00FB Zero Page (cc65: $00E2-$00FB)
$0100-$01FF 6502 スタック
$0200-$02FF システム変数
$0300-$030F VIA 6522(ミラー $0300-$03FF)
$0380-$0383 ACIA 6551(シリアル、LOCI ベース)
$0400-$0500 Oric システム領域
$0501-$97FF OricTel CODE + DATA(~37 KB)
$9800-$9FFF BSS / cc65 スタック(2 KB)
$A000-$BF3F HIRES フレームバッファ(8000 バイト)
$BB80-$BFDF テキスト画面(25-27 行 = ステータスバー)
$C000-$FFFF ROM(16 KB)
ACIA 6551 レジスタ(Oric 側)
| アドレス | 読み | 書き |
|---|---|---|
$0380 | 受信データ | 送信データ |
$0381 | ステータスレジスタ | プログラムリセット |
$0382 | コマンドレジスタ | コマンドレジスタ |
$0383 | コントロールレジスタ | コントロールレジスタ |
Minitel V23 設定
- コントロール:
$28= 1200 ボー、7 ビット、1 ストップ - コマンド:
$69= DTR on、RX IRQ off、偶数パリティ有効
Status レジスタのビット
- ビット 3(RDRF=
$08):受信データあり - ビット 4(TDRE=
$10):送信器レディ
Vidéotex プロトコル — ステートマシン
NORMAL ──ESC($1B)──> ESC_SEQ
──US($1F)───> US_ROW
──SO($0E)───> (G1 へ切替)
──SI($0F)───> (G0 へ切替)
──$20-$7F──> (文字を表示)
──$08-$0B──> (カーソル移動)
──$0C─────> (画面消去)
──$0D─────> (復帰)
ESC_SEQ ──$40-$47──> (インク色) -> NORMAL
──$50-$57──> (背景色) -> NORMAL
──$48/$49──> (点滅 on/off) -> NORMAL
──$4C-$4F──> (サイズ) -> NORMAL
──$5B─────> CSI
──$39─────> PRO
US_ROW ──$40-$57──> US_COL (行を記憶)
US_COL ──$41-$68──> NORMAL (カーソル位置指定)
CSI ──params+文字──> NORMAL (ANSI 風コマンド)
HIRES 表示
- 解像度:240×200 ピクセル = 40 桁 × 25 行
- 各セル:6×8 ピクセル
- 3 つの文字集合:
- G0:英数字(Minitel ASCII、フランス語アクセント)
- G1:セミグラフィックモザイク(2×3 ブロック = 64 パターン)
- G2:追加文字(ダイアクリティカル)
セルごとの属性
- インク色(0-7)
- 背景色(0-7)
- 点滅(flash)
- 反転
- 下線 / モザイク区切り
- サイズ(標準、倍高、倍幅、倍サイズ)
- 隠し(concealed)
最適化描画(dirty rectangles)
変更された各セルは「dirty」と印されます。各フレーム(50 Hz)で、変更されたセルのみが HIRES フレームバッファに再描画されます。これにより 6502 の CPU 負荷が大幅に低減します。
docs/ARCHITECTURE.md から再掲(正となる最新版は GitHub)。