目次
  1. デモ公開中:ブラウザで動くPC-88
  2. PC-8801という「日本のパソコン史」
  3. 最重要:エミュレータ公開の著作権整理
  4. 「ROMを配らずに動かす」アーキテクチャ
  5. EmscriptenでC言語エミュレータをWASM化する
  6. サウンドを捨てた話:ライセンスでコードを削る判断
  7. よくある質問(FAQ)
  8. まとめ:レガシー資産はブラウザで延命できる

デモ公開中:ブラウザで動くPC-88

まず成果物からご覧ください。NEC PC-8801のエミュレータ「QUASI88」をWebAssemblyに移植し、当サイトで公開しました。インストール不要、ブラウザだけで動きます。

▶ PC-88エミュレータを起動する
ROMなしでも内蔵メニューの動作を確認できます(PC推奨)

ただし、このデモには重要な特徴があります。ROMファイルを一切同梱していないことです。実機をお持ちの方がご自身で吸い出したROMを読み込んだときだけ、N88-BASICが起動します。なぜそうしたのか——本記事の半分は、その「著作権の整理」の話です。エミュレータ公開を検討している方の参考になれば幸いです。

PC-8801という「日本のパソコン史」

PC-8801は1981年にNECが発売した8bitパソコンです。CPUはZ80互換(4MHz)、メモリ64KB。BASICインタプリタ(N88-BASIC)をROMで内蔵し、電源を入れれば即プログラミングが始められました。『ザナドゥ』『イース』『ソーサリアン』など日本のPCゲーム黎明期の名作を生んだ、80年代の国民機です。

当社にはZ80や8051のアセンブラ資産を扱うレガシーマイグレーション業務があり、Z80はいまだに「現役の技術」です。40年前のアーキテクチャがエミュレータという形で完全に再現でき、それが最新のブラウザ技術(WebAssembly)で動く——このつながり自体が、組込み技術者にとって最高の教材だと考えて本デモを作りました。

「ROMを配らずに動かす」アーキテクチャ

設計の要点はひとつ。ROMファイルがネットワークを一切通らないことです。

// ROM選択:File API でブラウザ内メモリに読むだけ
romInput.onchange = async function (e) {
  const file = e.target.files[0];
  const data = new Uint8Array(await file.arrayBuffer());
  // Emscripten の仮想FS(IndexedDBで永続化)に書くだけ。
  // fetch/XHR は呼ばない = サーバーには何も送られない
  Module.FS.writeFile('/quasi88/ROM/N88.ROM', data);
};

選択されたROMはEmscriptenの仮想ファイルシステム(MEMFS)に書き込まれ、IndexedDB(IDBFS)へ永続化されます。次回訪問時はブラウザ内のIndexedDBから復元されるため再選択も不要。当社のサーバーはROMの存在すら知りません。エミュレータ本体のwasmとJSを静的配信しているだけです(当サイトはS3+CloudFrontの静的構成。3Dゲームを公開した時と同じインフラです)。

またROMなしの訪問者にも「動いていること」を見せるため、ROMなし起動モードを用意しました。QUASI88は起動時にROMが見つからなくても停止せず、内蔵メニュー(設定UI)は独自フォントで完全に描画されます。エミュレーションループ・画面描画・入力処理が動いていることは、ROMがなくても確認できるわけです。

EmscriptenでC言語エミュレータをWASM化する

ベースにしたのは、QUASI88作者の福永省三氏のコードと、Toyoshima氏によるWASM移植版quasi88nc(ともにBSDライセンス)です。当社ではサウンド部の除外(後述)とUIの再構成を行い、Dockerのemsdkコンテナでビルドしました。ポイントは3つあります。

1. SDLレイヤーはEmscriptenがそのまま吸収する

QUASI88の画面・入力はSDLで書かれています。Emscriptenは-s USE_SDL=2を指定するだけでSDL2互換レイヤーを提供し、SDLの描画がそのままHTMLの<canvas>に出ます。移植作業の大半を占めるはずの「画面と入力」がほぼゼロコストになります。

2. 無限ループは ASYNCIFY で解決する

エミュレータは「1命令実行→画面更新→待つ」を無限に繰り返すプログラムです。しかしブラウザのJavaScriptは無限ループを書いた瞬間にタブが固まります。EmscriptenのASYNCIFYは、C側のemscripten_sleep()呼び出しでWASMの実行状態を保存してブラウザに制御を返し、次のフレームで続きから再開する仕組みです。既存のCコードのメインループをほぼ書き換えずに移植できます。

# ビルド設定(Makefileより抜粋)
emcc -s USE_SDL=2 \
     -s ASYNCIFY -s ASYNCIFY_STACK_SIZE=131072 \
     -s ALLOW_MEMORY_GROWTH=1 \
     -s FORCE_FILESYSTEM=1 -lidbfs.js \
     -O2 *.o -o quasi88.js

3. ファイルI/OはIDBFSで「そのまま」動かす

C言語のfopen/freadはEmscriptenの仮想FSに透過的にマッピングされます。/quasi88をIndexedDBバックエンドのIDBFSでマウントしておけば、エミュレータの設定ファイルもROMもディスクイメージも、Cコード側は普通のファイル操作のままブラウザ内に永続化されます。40年前のパソコンのFDドライブが、IndexedDBの上で回っている——なかなか痺れる構図です。

ビルド成果物はwasm約1.7MB+JS約190KB。Z80 CPU、メモリバンク、FDC(フロッピーコントローラ)、CRTC、キーボードまで含めた完全なPC-88がこのサイズです。

サウンドを捨てた話:ライセンスでコードを削る判断

実は本デモ、あえて無音です。これも著作権(ライセンス)判断の実例なので紹介します。

QUASI88本体は修正BSDですが、サウンド出力部だけは事情が異なります。FM音源の再現にMAME 0.71由来のコード(旧MAMEライセンス:商用利用に厳しい制約)とfmgen(cisc氏作:商用ソフトへの組込は事前合意が必要)を使用しているのです。企業サイトでの公開は営利文脈と解釈される余地があるため、グレーを残すよりもサウンドドライバごとビルドから除外する判断をしました。

# USE_SOUND を外し、MAME/fmgen 由来のオブジェクトを除外
DEFS = -DQUASI88_SDL -DPI=M_PI ...   # -DUSE_SOUND -DUSE_FMGEN を削除
OBJS = $(PLATFORM_OBJS) $(CORE_OBJS) # SND_OBJS/FMGEN_OBJS を削除

QUASI88は設計が丁寧で、USE_SOUND未定義時のスタブが最初から用意されており、パッチはわずか数行で済みました。OSSを製品や公開物に組み込むとき、「リポジトリ全体のライセンス表記だけでなく、サードパーティ由来のディレクトリを個別に確認する」——これは業務のOSS利用監査でもそのまま使う手順です。結果として本デモの配布物はBSD系+MIT(Emscripten)+zlib(SDL2)のみで構成され、ライセンス表記も1ファイルで明快になりました。

よくある質問(FAQ)

Q. エミュレータを自社サイトで公開するのは著作権的に問題ないのですか?

エミュレータ本体は独自実装のソフトウェアであり合法です。BSD等のOSSライセンスの条件(著作権表示など)を守れば商用サイトでも公開できます。ROMや市販ソフトの配布は侵害になります。詳細は著作権整理の章をご覧ください。

Q. ROMなしでも動くのですか?

起動はしますが画面は黒いままで、デモページでは内蔵メニューの動作確認ができます。N88-BASICの表示にはROMが必要です。実機所有者による私的複製ROMの持ち込みのみを想定しています。

Q. 選択したROMはサーバーに送られませんか?

送られません。File APIでブラウザ内に読み、IndexedDBに保存するだけです。アーキテクチャの章のとおり、通信は発生しない設計です。

Q. C言語の既存資産は何でもブラウザに移植できますか?

かなりの範囲で可能です。SDL・ファイルI/O・無限ループといった「移植の壁」はEmscriptenの標準機能でほぼ解決します。注意すべきはむしろライセンスの混在と、スレッド・ネットワーク依存部分の設計です。

まとめ:レガシー資産はブラウザで延命できる

この記事のまとめ

  • エミュレータ本体の公開は合法。ROM・市販ソフトの配布は違法——「何を配るか」で明確に線が引ける
  • ROMは「実機所有者がブラウザ内でローカル読込」方式ならサイト側・利用者側とも適法な範囲に収まる
  • EmscriptenならSDL・無限ループ・ファイルI/OというC移植の三大障壁がほぼ標準機能で解決する
  • OSS利用はディレクトリ単位でライセンスを監査する。グレーな部分は「機能ごと削る」のも実務的な選択肢
  • Z80のエミュレーションが今のブラウザで完全動作する——レガシー技術と最新技術は地続きである

「古いC言語資産をWebで動かしたい」「Windowsでしか動かない業務ツールをブラウザ化したい」「Z80/8051時代の資産を延命したい」——本記事の技術はそのままこうした案件に応用できます。テクノスフィアはレガシーマイグレーションから最新のブラウザ技術まで一気通貫で対応します。

▶ PC-88エミュレータのデモを見る | 組込・レガシー移行サービス | 開発の相談をする

Z80/8051のレガシー資産移行は8051・Z80レガシーマイグレーションガイド、ブラウザだけで動くアプリの実例はThree.jsスマホ3Dゲーム実装ガイドで解説しています。