Phosphoric — 機能の詳細
サイクル精度の ORIC-1 / Atmos エミュレータ · C11 で記述 · MIT ライセンス
このページは Phosphoric のすべての機能を、各機能の説明と対応するコマンドラインオプションとともに列挙します。最新の正となる情報は GitHub リポジトリです。各サブシステムの詳細は技術ドキュメントを参照してください。
目次
1. エミュレーションコア
コアはマシンをサイクル単位で再現します。各チップはオリジナルのシリコンと同じ速度で進みます — デモやラスタ依存コードに必須です。
MOS 6502 CPU
151 の公式オペコード、13 のアドレッシングモード、十進演算(BCD)、レベルトリガの IRQ をサイクル精度でエミュレーション。テストスイートは非公式 NMOS オペコードもカバーします。
64 KB メモリ
RAM $0000-$BFFF、ROM $C000-$FFFF、バンク切替、I/O ルーティングを Oric のメモリ構成に忠実に。
VIA 6522
16 レジスタ、Timer 1/2、IFR/IER 割り込み、キーボードマトリクス、シフトレジスタ(8 モード)、T2 パルス計数、完全な CA2/CB2 PCR モード(入力エッジ、独立割り込み、ハンドシェイク — シリコンと同様に CB2 は書き込み専用 —、1 サイクルパルス、手動)、IRA/IRB 入力ラッチ(ACR ビット 0-1)。
ULA ビデオ
テキストモード(40×28)と HIRES(240×200)、シリアル属性、PAL タイミング(312 ライン × 64 サイクル)。
AY-3-8910 PSG
3 トーンチャンネル、ノイズ、16 のエンベロープ形状、SDL2 オーディオ出力。
2. 周辺機器とカード
Microdisc(WD1793 コントローラ)
WD1793 FDC、4 ドライブ(A-D)、オーバーレイ ROM、Sedoric 起動。デフォルトで実機の機械的タイミング(ステップレート 6/12/20/30 ms、300 rpm の回転レイテンシ、5 インデックスパルス後の Record-Not-Found、ライブ Type I インデックスパルス)。堅牢性検証用の不良セクタ注入:損傷はドライブ切替をまたいでメディアに追従し、セーブステートに保存されます。
- --disk-rom ファイル · --disk / --disk1/2/3 ドライブ A〜D
- --fdc-timing real(既定)| fast · --disk-writeback · --bad-sector [D:]S:T:N
カセット(TAP 形式)
ROM パッチによる CLOAD/CSAVE、高速ロード、マルチブロック、CLOAD 後の再連結、そして信号レベル再生(--tape-signal:ROM が読む実際の VIA CB1 波形、独自・保護ローダ向け)。
- --tape ファイル · --fast-load · --tape-signal
ACIA 6551(シリアル)
$031C-$031F(LOCI 下では $0380)のシリアルコントローラ。トランスポートは loopback / TCP / PTY / COM / ファイル、加えてプロトコルバックエンド(Hayes AT モデム、PicoWiFiModemUSB)、V23 モード(Minitel / Digitelec)。チップ × トランスポート表を参照。
Digitelec DTL 2000
$03F8-$03FD の忠実な PIA 6821 + ACIA 6850 モデムカード(当時の資料から OCR で検証したレジスタ)、V23 75/1200 と対称 1200、回線/キャリア制御、IRQ 配線。当時の OTRM 端末に対して検証済み。
- --dtl2000 トランスポート · --dtl2000-addr XXXX
Mageco / ORICON MIDI
MIDI DIN 端子を駆動する MC6850 ACIA(31250 ボー、8-N-1)。Oric フォーラム由来の 2 設計:$03FE-$03FF のオリジナル Mageco カード(--mageco)と、$031C-$031D + クロック生成器の現代版 ORICON(LOCI 互換、--oricon)。生 MIDI ストリームの記録/再生、Standard MIDI File を(テンポで)Oric へ再生、または MIDI=1 ビルドではライブのホスト MIDI ポート(ALSA / CoreMIDI / WinMM)を開き FluidSynth や DAW を駆動。
- --mageco file:in[:out] | smf:ファイル[:loop] | midi[:ターゲット] | loopback | tcp | pty · --oricon トランスポート
PicoWiFiModemUSB
sodiumlb の WiFi モデム(Pico W、USB CDC ↔ WiFi)のエミュレーションで、LOCI により $0380 の ACIA として公開。完全な AT コマンドセット v0.1.0;WiFi はシミュレート、データ接続は実 TCP。
- --serial picowifi[:SSID[:PASS]]
LOCI — Lovely Oric Computer Interface
sodiumlb のインターフェース(2024):MIA バス $03A0-$03BF、36/36 の API 操作(ファームウェア準拠 ABI)、USB HID、サイクル精度の WD1793、FAT16/32 SD イメージ、実行時 ROM 切替。アクションボタン(F8):短押し → セッションスナップショット + LOCI メニュー;長押し(≥ 2 秒)→ Mike Brown の診断 ROM。ホストの実 USB キーを Oric に提供、MIA バスのタイミング調整可。LOCI ファームウェア経由で完全な Sedoric V4 マスターを起動。
- --loci · --loci-flash DIR · --loci-sdimg パス · --loci-usb DIR|none
- --loci-mia-window LO-HI · --loci-irq-latency US
3. ORIC-1 と Atmos のモデル
モデルの自動判別
ROM ヘッダから BASIC 1.0(ORIC-1)と 1.1(Atmos)を判別し、各版に正しいカセットパッチアドレスを使用。モデルは強制も可能。
- --model oric1 | atmos | 1.0 | 1.1
4. ジョイスティック・プリンタ・プロッタ
IJK ジョイスティック
IJK インターフェース(最も一般的なアダプタ、PSG ポート A でアクティブロー)。キーボードモード(矢印キー + RCtrl/RAlt で発射)または SDL2 ゲームパッド(D-pad、アナログスティック、A/B/X ボタン)、ホットプラグ対応。ジョイスティックとキーボードの信号はポート A で合成。
- --joystick keys | gamepad
Centronics プリンタと MCP-40 プロッタ
LPRINT/LLIST をテキストファイルにキャプチャ、または 4 色の MCP-40 ペンプロッタをエミュレート(コマンド H/D/M/J/P/L、480×400 フレームバッファ、Bresenham 直線描画、5×7 フォント、BMP エクスポート)。VIA ポート A + CA2(STROBE)エッジによる Centronics プロトコル。
- --printer ファイル · --printer-type text(既定)| mcp40
5. セーブステート
.ost 形式
CRC32 整合性チェック付きの完全なバイナリ状態を 13 セクション(CPU, MEM, VIA, PSG, VID, KBD, FDC, MDC, DSK, BAD, TAP, SER, META)に分割。未知のセクションは無視されます:前方・後方互換。
- --save-state ファイル · --load-state ファイル · キー F2(保存)/ F4(ロード)
6. 対話型デバッガ
ブレークポイントとウォッチポイント
最大 16 の PC ブレークポイント、条件付き(b ADDR if EXPR)、8 のラスタライン・ブレークポイント、8 のメモリ書き込みウォッチポイント。
実行と検査
step、next、step-out、continue、undo(CPU+RAM の 16 スナップショットを巻き戻し)、レジスタ、シンボル解決オペランド付きのページ送り逆アセンブル、メモリのダンプ/編集、インラインアセンブラ(a ADDR MNEMONIC [operand])、メモリ検索(find バイトまたはテキスト)、スタック。周辺機器のライブ検査(via、psg、disk、acia、tape、loci)。
シンボル・TUI・GDB
シンボルテーブルの読み込み(.sym/.lab/EQU/VICE)、6 ペインの ncurses TUI(TUI=1 ビルド)、そして何より gdb・lldb・IDE(VS Code、CLion)から RSP プロトコル経由で 6502 をデバッグできるリモート GDB スタブ — 他の Oric エミュレータにはない機能。
- --debug · --break ADDR · --symbols ファイル · --tui · --gdb[=ポート]
7. 制御と自動化
IPC 制御モード OricForge
--control を付けると、Phosphoric は stdin/stdout でテキストプロトコルを話します(ログは stderr):40 を超えるコマンド(hello、regs、read、write、peek、break、step、load-tap、load-rom、load-disk…)と 3 種類のイベント。実行中の非同期ポーズ、機能ネゴシエーション。OricForge IDE 向け設計。
HTTP API(REST)
同じコマンドセットを HTTP/JSON で公開(HTTPAPI=1 ビルド、既定ポート 8888)。スクリプト、ブラウザダッシュボード、エンドツーエンドテスト向け。エンドポイント GET /hello /regs /mem /peek/… と POST /reset /mem /keys /tape /disk /exec/…。リモートでキーボード入力も可能(POST /keys に text=…)。既定で 127.0.0.1 にバインド、ファイル操作はサンドボックスのディレクトリに限定。
- --http-api[=ポート] · --http-api-bind アドレス · --http-api-root DIR
決定論的な記録/再生(「TAS movie」)
キーボード入力を記録しビット単位で決定論的に再生:ツールアシスト実行、バグ再現、CI 回帰。他の Oric エミュレータにはない機能。
- --record ファイル · --replay ファイル
キーボード自動入力
エスケープ付きの入力シミュレーション(\n Return、\e Esc、矢印、\Cx Ctrl+x、\Fx Funct+x…)。ペースは実際のキーボードスキャナに同期(VIA PB3 マトリクス走査):キー取りこぼしなし。推測したサイクルではなくメモリ状態でアーム可能。
- --type-keys N:テキスト · --type-keys-when A:V:テキスト
8. Chromecast / Google Cast 配信
Google Cast テレビへ配信
Phosphoric は Oric の画面と音声を Chromecast / Google Cast 機器へ配信できます。HTTP MJPEG サーバ(映像ストリーム /stream、720×672、3 倍拡大)、リアルタイムの PSG WAV 音声(/audio)、ネイティブ CASTV2 制御(Google Cast プロトコル)、ネットワーク上の機器の mDNS 検出。CAST=1 ビルドが必要。
- --cast-server[=ポート] MJPEG サーバ(既定 8080)
- --cast-to[=機器] Chromecast へ配信 · --cast-discover 機器を列挙
9. 表示とキャプチャ
スケーリング
整数スケーリング ×1(240×224)〜 ×4(960×896)、最近傍(ピクセルパーフェクト、ぼかしなし)、F3 でその場切替。
- --scale 1 | 2 | 3(既定)| 4 · --keyboard qwerty | azerty · --fullscreen(F11)
スクリーンショットと動画
PPM / BMP / PNG スクリーンショット — 終了時、指定サイクル、またはメモリ状態でトリガ(RAM[A]==V)。画面テキストダンプ(ASCII)またはフレームバッファの ANSI トゥルーカラー。Motion-JPEG AVI 動画録画(GUI モードでは音声トラック付き)。PSG WAV 音声キャプチャ、画面なしでも CI でテスト可能。
- --screenshot[-at/-text/-ansi/-when] · --dump-ram-when A:V:ファイル
- --video ファイル · --video-fps N · --video-quality N · --audio-wav ファイル
10. ULA-NG(新世代)
FPGA 版 ULA のためのソフトウェア参照
将来の Verilog/FPGA ULA(Sipeed Tang Primer 20K / GW2A-18)のための参照モデル。レジスタ窓 $0340-$035F、リセット時はロック → プログラムがアンロックする($0340 に 'N','G')まで標準の HCS 10017 とビット単位で同一。8 機能:パレット間接(16×12 ビット LUT)、ラスタ IRQ、開始アドレス(ダブルバッファ/スクロール)、スキャンラインごとの copper、細かな X/Y スクロール、並列属性(セルごとの ink+paper、カラークラッシュなし)、16 個のハードウェアスプライト 16×16(優先順位 + 衝突)、そして chunky 4bpp(320×224、16 色)/ 80 桁テキスト モード。各機能に 1 つずつデモを同梱。
- --ula-ng-poke "340=4E,340=47,341=05,…"(起動時に注入)
11. トレース・プロファイリング・ROM 解析
CPU 命令トレース
各命令を逆アセンブルとレジスタ状態とともにログ(サイクル PC バイト DISASM A= X= Y= SP= P=)。
- --trace ファイル · --trace-max N
パフォーマンスプロファイラ
64 KB 全域のアドレスごとのヒット数とサイクル、256 オペコードのヒストグラム、上位 20 のホットスポットレポート。
- --profile ファイル
ROM 解析
ベクタ(RESET, NMI, IRQ)の抽出、サブルーチンマップ(参照数付きの JSR/JMP ターゲット)、ASCII 文字列検出、使用統計(コード/データ/埋め)、パターン検索。
- --rom-info [ファイル]
12. 対応オペレーティングシステム
Phosphoric は 3 大デスクトップ OS でネイティブに、ブラウザで、そして自動化向けの headless モードで動作します。同じコードがどこでも同一の出力を生みます。
| システム | 方法 | 備考 |
|---|---|---|
| Linux | ネイティブ SDL2 ビルド(make SDL2=1) | 主要な開発プラットフォーム。全機能:ALSA MIDI、Cast、GDB スタブ、TCP/PTY/COM シリアル。 |
| Windows 11(ネイティブ) | .exe(CI または MinGW-w64、make WIN=1 SDL2=1) | v1 の制限:シリアル tcp/pty/modem/com/picowifi、--gdb、--control(非同期ポーズ)、Cast とホスト MIDI は Linux のみ。 |
| Windows 11(WSL2) | WSLg 上の Linux ビルド | 完全な Linux ビルド、全機能。 |
| macOS | ネイティブ SDL2 ビルド | CoreMIDI 経由のホスト MIDI。 |
| ブラウザ | WebAssembly(make wasm) | クロスプラットフォーム(Chrome、Firefox、Safari、Edge)、インストール不要。ネイティブのソケット/スレッドは no-op;コア、映像、音声、キーボード、カセット、ディスクは動作。ブラウザガイドを参照。 |
| CI / サーバ | headless モード(make SDL2=0、--headless) | 画面なし:テスト、自動化、キャプチャ、CI でテスト可能な WAV 音声。 |
13. 利便性と移植
クロスプラットフォーム
Linux・Windows・macOS のネイティブ SDL2 ビルド。Windows 11 では:ブラウザ(WebAssembly、インストール不要)、ネイティブ .exe(CI または MinGW-w64)、WSL2(WSLg 上の完全な Linux ビルド)。詳細は上のオペレーティングシステムの節を参照。
WebAssembly ビルド
完全なマシンがタブ内の <canvas> で動作(Web Audio、.tap/.dsk のドラッグ&ドロップ、ROM セレクタ、CRT フィルタ、.ost セーブステート、テープ/ディスク動作 LED、ORIC-1/Atmos の画面キーボード)。ネイティブとバイト単位で同一の出力。これがサイトの「オンライン実行」ボタンを動かすビルドです。
変換ツールなど
bas2tap、bin2tap、tap2sedoric(Sedoric ファイル注入)、sedoric-info(ディスク検査)。QWERTY/AZERTY 配列、headless モード(CI/自動化)、ホストファイルシステム共有(--hostfs)。
- --headless · --hostfs DIR · --cycles N · make tools
14. シリアル通信:チップ × トランスポート
Phosphoric は Oric プログラムが駆動する UART(メモリマップされたチップ)と、ホスト側でバイトを運ぶトランスポートを分離します。チップを 1 つ選び、トランスポートを与えます。
チップ(プログラムが読み書きする場所):
| オプション | チップ | アドレス | 実ハードウェア |
|---|---|---|---|
--serial | ACIA 6551(MOS) | $031C(--loci 下では $0380) | Oric V23 モデム、Telestrat |
--dtl2000 | PIA 6821 + ACIA 6850 | $03F8 | Digitelec DTL 2000 カード |
--mageco | ACIA 6850 | $03FE | Mageco MIDI インターフェース(31250 ボー) |
--oricon | ACIA 6850 + クロック生成 | $031C | ORICON MIDI(LOCI 互換) |
--loci | LOCI MIA | $03A0-$03BF | LOCI インターフェース(sodiumlb) |
トランスポート(バイトの行き先)。透過 = 生のバイトパイプ;プロトコル = 独自のコマンド/UART 層を挿入:
| トランスポート | 種類 | 備考 |
|---|---|---|
loopback | 透過 | TX を RX に戻す(テスト) |
tcp:H:P | 透過 | BBS / Minitel / telnet / TCP 上の MIDI ルータ |
pty | 透過 | POSIX 疑似端末(minicom、screen) |
com:B,D,P,S,DEV | 透過 | 実シリアルデバイス(termios) |
file:IN[:OUT] | 透過 | 決定論的な再生(RX)/記録(TX);MIDI キャプチャ |
midi[:ターゲット] | 透過 | ライブのホスト MIDI ポート(MIDI=1) |
smf:ファイル[:loop] | 透過 | Standard MIDI File → タイミング付き MIDI IN |
modem[:H:P] | プロトコル | Hayes AT インタプリタ(--serial のみ) |
digitelec:H:P | プロトコル | 非推奨 → --dtl2000 を使用 |
picowifi[:…] | プロトコル | PicoWiFiModemUSB WiFi モデム(--serial のみ) |
--serial の調整オプション:--serial-v23(非対称 1200/75 Minitel)、--serial-buffer N、--serial-baud N、--serial-irq-on-rdrf(WDC 65C51 IRQ モード)、--serial-trace、--serial-tcp-backpressure、--acia-addr。
15. キーボードショートカット
| キー | 機能 |
|---|---|
| F2 | 状態のクイックセーブ |
| F3 | 表示スケール切替(×1→×2→×3→×4) |
| F4 | 状態のクイックロード |
| F5 | ウォームリセット |
| F6 | OSD — カセット/ディスクのホットスワップ |
| F7 | メモリダンプ(64 KB RAM をタイムスタンプ付き .bin へ) |
| F8 | LOCI アクションボタン — 短押し:スナップショット + メニュー;≥ 2 秒:診断 ROM |
| F9 | デバッガを開く |
| F10 | 終了 |
| F11 | フルスクリーン |
| F12 | PNG スクリーンショット(既存ならタイムスタンプ付き) |
16. コンパイル
make # SDL2 の標準ビルド(既定)
make SDL2=0 # headless ビルド(SDL2 なし、CI/自動化向け)
make DEBUG=1 # デバッグビルド(-g -O0)
make CAST=1 # Chromecast / Google Cast 対応付き
make MIDI=1 # リアルタイムのホスト MIDI 付き(ALSA/CoreMIDI/WinMM)
make wasm # WebAssembly / ブラウザビルド(Emscripten が必要)
make tools # 変換ツール(bas2tap, bin2tap, tap2sedoric, sedoric-info)
sudo make install # /usr/local へインストール
前提(Debian/Ubuntu):sudo apt install build-essential libsdl2-dev
(Chromecast には libssl-dev)。プラットフォーム別の詳細はドキュメントを参照。