プログラミング
Casio FX-870P エミュレータ
Casio FX-870P Emulator (github.com)
要約
Casio FX-870P(VX-4としても販売)ポケットコンピュータ用のブラウザベースエミュレータがTypeScriptとVue 3で開発されました。このエミュレータは、1986年製のプログラマブル電卓の機能をウェブプラットフォームに移植したもので、CPU、メモリ、ディスプレイ、キーボード、シリアルポート、フロッピーディスクドライブなどのハードウェアコンポーネントをエミュレートします。また、BASICプログラムの編集やデバッグ機能も備えています。
全文翻訳
FX-870P エミュレータ
Casio FX-870P(VX-4としても販売)ポケットコンピュータ用のブラウザベースエミュレータで、TypeScriptとVue 3で書かれています。
FX-870Pは、921 kHzで動作する日立HD61700 CPU、96×64ピクセルのLCD、83キーキーボード、シリアルポート、オプションのMD-120フロッピーディスクドライブを備えた1986年のプログラマブル電卓でした。このエミュレータは、オリジナルのDelphiリファレンス実装をウェブプラットフォームに完全に移植したものです。
クレジット
オリジナルのエミュレータはPISIで入手可能であり、このサイトで入手可能な素晴らしいエミュレータスイートのオリジナルの作者にクレジットが与えられています。この実装は、そのエミュレータの背後にあるコードをインターネット上のより広いオーディエンスに提供することを純粋に目的として設計されています。
Mark Wickensによって実装されたこのバージョンは、ソースコードがGitHubでホストされており、試したい場合はここにホストされています。
エミュレートされたハードウェアコンポーネントの詳細
CPU
日立 HD61700, 921 kHz
メモリ
18ビットアドレス空間: ROM0 (6 KB, 16ビットワード), ROM1 (128 KB × 2バンク), RAM (64 KB)
ディスプレイ
HD44352A01 LCDコントローラ — 96×64ピクセル + 5つのステータスインジケータ
キーボード
83キーマトリクス (9ブロック, 16 KO列)
シリアル
XON/XOFFフロー制御付きUART
ストレージ
Origin Private File System (OPFS) 経由のMD-120フロッピーディスク
機能
レスポンシブな電卓フェイス — 複数の解像度のフェイスプレート画像で、あらゆる画面サイズにフィットするようにスケーリングされます
フルキーボードマッピング — PCキーボードから直接入力でき、CAPSとシフトシンボルの処理が自動で行われます
プログラムライブラリ — ツールバーから直接ロードできる、キュレーションされたサンプルBASICプログラムのコレクションが組み込まれています
RS-232Cシリアル — XON/XOFFフロー制御を使用して、エミュレートされたCOM0経由でBASICプログラムをロードおよび保存します
フロッピーディスク — Origin Private File System (OPFS) 経由のMD-120ディスクエミュレーション
文字セットテーブル — すべての256文字ビットマップを表示するインタラクティブな16x16の16進グリッド(ROMフォントから)
DEFCHR$ピクセルエディタ — 任意の文字をクリックすると、ドラッグしてペイントできる5x8ピクセルエディタが開き、ワンクリックでコピーできるBASICのDEFCHR$コマンドを生成します
ターボモード — 計算負荷の高いBASICプログラムのために、CPUを約50倍速で実行します
フルスクリーンモード — ツールバーとパネルを非表示にして電卓をフルスクリーンで使用できます(モバイルで便利です)
ファームウェアトグル — FX-870P(日本語)とVX-4(英語)のROMモードを切り替えます
CPUデバッガ — ライブレジスタ、フラグ、逆アセンブリビュー
BASICリスティングパネル — RAMに保存されているすべてのBASICプログラム(P0–P9)のデトークナイズされたライブリスティング。タブナビゲーション、シンタックスハイライト、ライブ/フリーズ切り替え付き
BASICエディタ — シンタックスハイライト、直接RAM書き込み、行の追加/削除/編集、リッチテキストクリップボードでのプログラム全体のエクスポート/インポートを備えた、インプレース編集
コミュニケーションパネル — UARTレジスタの状態、シリアルバイトストリーム、診断機能
実行前提条件
Node.js 22 LTS
ROMファイルは public/roms/ に配置(含まれていません)
開発サーバー
npm install
./start.sh # http://localhost:3007/fx870p-emulator/ で起動します
./stop.sh # サーバーを停止します
またはnpmを直接使用します:
npm run dev # フォアグラウンド、Ctrl-Cで停止
本番ビルド
npm run build # dist/ に出力します
npm run preview # ビルドされたアプリをプレビューします
アプリは、開発モードと本番モードの両方で /fx870p-emulator/ のベースパスの下で提供されます。
プロジェクト構造
src/
emulator/
cpu.ts
HD61700 CPUコア — リセット、フェッチ/デコード/実行ループ
exec.ts
命令ハンドラ (~2100行)
decoder.ts
256エントリの命令ディスパッチテーブル
def.ts
CPU状態、メモリマップ、srcRead/dstWrite
disassemble.ts
ランタイム逆アセンブラ(DebugPanelで使用)
lcd.ts
HD44352A01 LCDコントローラ → Canvas ImageData
keyboard.ts
83キーマトリクス — keydown + マウスイベント
port.ts
I/OポートとUARTステートマシン
comm.ts
RS-232C TX/RXキュー、XON/XOFF、SAVE
basic-tokens.ts
共有キーワードテーブル(PREFIX4–7)とRAMレイアウト定数
detokenize.ts
BASICデトークナイザー — RAMからトークナイズされたプログラムを読み取ります
tokenize.ts
BASICトークナイザー — ソーステキストをFX-870Pトークンバイトに変換します
ram-edit.ts
RAMエディタ — ファイルテーブル管理でトークナイズされたプログラムをRAMに書き込みます
casio-ascii.ts
Casio ASCII ↔ Unicode文字マッピング
emulator.ts
メインrAFループ、ROMロード、状態永続化
remote-log.ts
デバッグログ(開発専用)
trace.ts
命令ごとのJSONLトレースレコーダー
components/
EmulatorView.vue
トップレベルオーケストレータ + パネルレイアウト
LcdCanvas.vue
Canvas LCDレンダラー
KeyboardOverlay.vue
フェイス画像の上にクリック可能なキーヒット領域
CommPanel.vue
シリアル通信パネル + ツールバーボタン
DebugPanel.vue
CPUデバッガ(レジスタ、フラグ、逆アセンブリ)
BasicListPanel.vue
BASICプログラムリスト/エディタパネル(デトークナイズビュー、インプレース編集、インポート/エクスポート)
CharsetPopup.vue
文字セットテーブル + DEFCHR$ピクセルエディタ
LibraryPopup.vue
プログラムライブラリポップアップ(ブラウズ + サンプルプログラムをロード)
AboutPopup.vue
アバウトダイアログ(ABOUT.mdをレンダリング)
editor/
BasicEditor.vue
再利用可能なCodeMirror 6エディタコンポーネント(シングル/マルチラインモード)
cm-basic-lang.ts
CodeMirror StreamLanguage定義(FX-870P BASIC用)
cm-basic-theme.ts
パネルUIに合わせたCodeMirrorダークテーマ
basic-highlight.ts
リスティング表示とリッチテキストクリップボードエクスポート用のシンタックスハイライター
public/
ABOUT.md
ユーザー向けドキュメント(アバウトポップアップでレンダリング)
basic/
サンプルBASICプログラム (.bas)
images/
face.png
電卓フェイスプレート(標準)
face-large.png
電卓フェイスプレート(大)
face-huge.png
電卓フェイスプレート(特大)
keys.png
キーオーバーレイリファレンス
casio-logo.svg
Casioロゴ(アバウトポップアップのウォーターマークとして使用)
roms/
ROMおよび文字セットバイナリ(リポジトリには含まれていません)
tests/
emu-harness.ts
ヘッドレスエミュレータブート + キー入力ヘルパー
sin90.test.ts
SIN(90)回帰テスト
tokenize.test.ts
BASICトークナイザーテスト(キーワード、ラウンドトリップ、エッジケース)
tools/
dis.ts
スタンドアロン逆アセンブラ(npm run dis)
compare-traces.mjs
Delphi vs TypeScriptトレース比較
charset-dump.ts
文字セットマークダウンを生成(docs/charset.md)
charset-table.ts
文字セットHTMLテーブルを生成(docs/charset-table.html)
compiler/
Casio JIS BASIC → HD61700マシンコードコンパイラ(README内)
emu-debugger/
ヘッドレスデバッガライブラリ + CLI(README内)
リファレンス/
ドキュメント
説明
reference/fx870p-rom-annotations.md
注釈付きROMアドレスラベルとコールフローノート
reference/fx870p-roms.md
完全なROM逆アセンブリ
[reference/FX-870P_VX-4 Manual.html](docs/FX-870P_VX-4 Manual.html)
オリジナルのユーザーマニュアル(HTML)
docs/CasioVX-4-Manual-Peter-Rost.pdf
Peter RostによるVX-4マニュアル(PDF)
docs/FX-870P emulator.pdf
Delphiエミュレータドキュメント(PDF)
docs/basic-detokenizer.md
BASICデトークナイザーリファレンス — トークンテーブル、メモリレイアウト、行フォーマット
docs/basic-editor.md
BASICエディタユーザーガイド — 編集、インポート/エクスポート、制限事項
docs/plan.md
ウェブポート実装計画とコンポーネントマッピング
reference/fx870_es/
オリジナルのDelphi 5ソース(リファレンスのみ)
テスト
エミュレータには、Node.jsでエミュレータをブートし、キー入力を注入し、CPUを実行し、LCD出力を検証するvitest搭載のヘッドレステストスイートがあります。
すべてのテストを実行
npm test
単一のテストファイルを実行
npx vitest run tests/sin90.test.ts
テストを実行