# PC-88エミュレータをブラウザで動かす｜WebAssembly移植と著作権の整理｜テクノスフィア

> レトロPC「PC-8801」のエミュレータQUASI88をEmscriptenでWebAssemblyに移植し、自社サイトで公開するまでの技術と法務の全記録。エミュレータ公開の著作権整理（本体はOK・ROMはNG）、ROMをサーバーに送らないローカル読込設計、MAMEライセンス由来コードの除外判断、ASYNCIFYとIndexedDB永続化まで実例で解説。実際に動くデモ付き。

URL: https://technosphere.co.jp/blog/pc88-emulator-wasm

** 目次
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エミュレータを起動する](https://technosphere.co.jp/labs/pc88/)
 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のアセンブラ資産を扱う[レガシーマイグレーション業務](https://technosphere.co.jp/blog/8051-z80-legacy-migration-guide)があり、Z80はいまだに「現役の技術」です。40年前のアーキテクチャがエミュレータという形で完全に再現でき、それが最新のブラウザ技術（WebAssembly）で動く——このつながり自体が、組込み技術者にとって最高の教材だと考えて本デモを作りました。

## 最重要：エミュレータ公開の著作権整理

 「エミュレータ＝グレー」という印象を持つ方は多いですが、実際には**何を配布するかで白黒がはっきり分かれます**。整理すると次の3層です。

```
【1】エミュレータ本体      → ○ 合法（独自実装のソフトウェア）
【2】ROM（BASIC/フォント）  → × 配布不可（NEC等の著作物）
【3】市販ソフトのイメージ    → × 配布不可（各社の著作物）
```

- **【1】エミュレータ本体は合法です。**ハードウェアの挙動をソフトウェアで互換実装すること自体は著作権侵害になりません。QUASI88は修正BSDライセンスで公開されており、著作権表示等の条件を守れば商用サイトでの公開・改変も可能です。
- **【2】ROMは配布できません。**N88-BASIC ROMやフォントROMはNEC（BASIC部分はMicrosoftも関係）の著作物で、フリー化されていません。サイトに置けば複製権・公衆送信権の侵害です。MSXにおけるC-BIOSのようなフリー互換ROMも、PC-88には存在しません。
- **【3】市販ゲームのディスクイメージも当然配布できません。**入手先を紹介する行為も侵害を助長するためNGです（正規配信のProject EGG等を紹介するのは問題ありません）。

 一方で、**実機の所有者が自分でROMを吸い出して自分で使う**のは私的使用のための複製（著作権法30条）の範囲です。つまり「エミュレータはこちらで用意する。ROMは持っている人が自分の分だけ持ち込む」という分担にすれば、サイト側も利用者側も適法な範囲に収まります。これが本デモの基本設計です。

## 「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ゲームを公開した時](https://technosphere.co.jp/blog/threejs-mobile-3d-game)と同じインフラです）。

 また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）のみで構成され、[ライセンス表記](https://technosphere.co.jp/labs/pc88/LICENSES.txt)も1ファイルで明快になりました。

## よくある質問（FAQ）

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

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

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

 起動はしますが画面は黒いままで、[デモページ](https://technosphere.co.jp/labs/pc88/)では内蔵メニューの動作確認ができます。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時代の資産を延命したい」——本記事の技術はそのままこうした案件に応用できます。テクノスフィアは[レガシーマイグレーション](https://technosphere.co.jp/blog/8051-z80-legacy-migration-guide)から[最新のブラウザ技術](https://technosphere.co.jp/blog/threejs-mobile-3d-game)まで一気通貫で対応します。

 [▶ PC-88エミュレータのデモを見る](https://technosphere.co.jp/labs/pc88/) ｜ [組込・レガシー移行サービス](https://technosphere.co.jp/embedded) ｜ [開発の相談をする](https://technosphere.co.jp/contact)

 Z80/8051のレガシー資産移行は[8051・Z80レガシーマイグレーションガイド](https://technosphere.co.jp/blog/8051-z80-legacy-migration-guide)、ブラウザだけで動くアプリの実例は[Three.jsスマホ3Dゲーム実装ガイド](https://technosphere.co.jp/blog/threejs-mobile-3d-game)で解説しています。   [技術コラム一覧に戻る](https://technosphere.co.jp/blog/)
