IBM PC エミュレータ JavaScript の説明
戻る


このプログラムは初期の頃の IBM PC の動作をエミュレートします.
主に以下の機能をエミュレートします.ただし,何れについても,そのすべての機能をサポートしている訳ではなく,エミュレートするのが難しいものや,あまり使われない機能についてはサポートしていません.

◆ CPU
8086/8088 CPU をエミュレートします.
プロテクト モードや,80286 以降の拡張命令はサポートしていません.
◆ ビデオ
CGA と MDA をエミュレートします.

実機の IBM PC では,CGA でコンポジット モニタを使用してカラー モードで画面表示すると,色の滲みを生じます.これは仕様上避けられないものですが,逆にそのことを利用して,通常 CGA で表示できる色より多くの色を表示するプログラムがあります.
このエミュレータでは,基本的には RGB モニタを使用しているように画面を表示しますが,グラフィック モードについては,コンポジット モニタのように画面を表示することもできます.「コンポジット モニタ」(後述)をチェックすると,グラフィック モードのときはコンポジット モニタのように画面を表示するようになります.テキスト モードのときは,チェックの有無によらず RGB モニタのような表示になります.
◆ キーボード
101 キーボードをエミュレートします.
ブラウザの動作環境によってキーボードのキー配列は異なりますので,101 キーボードの動作を完全にエミュレートすることはできません.特に,特殊記号については一般に,日本語キーボードと 101 キーボードでは Shift キーの押下状態と文字の対応が合いませんので,動かすプログラムによってはおかしな動作になることもあるかも知れません.
◆ フロッピー ディスク ドライブ
2 台のフロッピー ディスク ドライブをエミュレートします.
フロッピー ディスクについては,ディスク イメージ ファイルを使用します.
ディスク イメージ ファイルは,ディスクの一連のセクタの生データをファイルにダンプしたものです.拡張子は通常“img”や“ima”が使われます.ディスクの形式に関する情報は何も記録されておらず,セクタのデータのみが記録されています.

IBM PC 用のプログラムのディスクをイメージ ファイル化したものは,ウェブ上にいろいろあります.また,もし実物のディスクを持っていれば,変換ツールでイメージ ファイル化することも簡単にできます.

ファイル内にはディスクの形式に関する情報が無いため,ディスクの形式はファイルのサイズから判定します.
このエミュレータで使用できるディスクの形式と,対応するイメージ ファイルのサイズは以下のものです.
ディスク容量シリンダ数ヘッド数セクタ数セクタ長ファイル サイズ
160 KB4018512 B163840 B
180 KB4019512 B184320 B
200 KB40110512 B204800 B
320 KB4028512 B327680 B
360 KB4029512 B368640 B
400 KB40210512 B409600 B
720 KB8029512 B737280 B
1.44 MB80218512 B1474560 B
◆ サウンド
ビープ音の発生をエミュレートします.
◆ BIOS
主に無印(XT や AT でない)IBM PC の BIOS ファンクション コールと,BIOS データ領域のデータのうちプログラムから直接参照されることが多いものをエミュレートします.
一部,無印 PC より後の機種の機能もサポートしているものがあります.

ジョイスティックのエミュレートはしていません.ハード ディスクも使用できません.

このエミュレータで起動できるのは,フロッピー ディスクをドライブにセットしてリセット ボタンを押す(または PC の電源を入れる)と起動するもの(PC booter と呼ばれるもの)です.DOS 用の実行形式ファイルなどを直接起動することはできません.
ただし,上記の機能の範囲で動作する DOS(比較的初期の DOS)をこのエミュレータで実行することはできますので,そういった DOS を動かして,その上で DOS の実行形式ファイルを実行することは可能です.


使い方

「マウント」ボタン

フロッピー ディスクのイメージ ファイルをデータとして読み込みます.プログラムから(仮想の)フロッピー ディスクにアクセスできる状態になります.
フロッピー ディスクへの書き込みは,読み込んだデータに対する更新になります.JavaScript から直接ファイルにアクセスすることはできませんので,元のイメージ ファイルに直接書き込みが行われる訳ではありません.
更新した内容をイメージ ファイルに反映させたい場合は,「保存」でイメージのデータをファイルに保存します.

「取り外し」ボタン

フロッピー ディスク イメージをマウントすると,「マウント」ボタンの表示が「取り外し」に変わります.
「取り外し」ボタンを押すと,ディスク イメージがマウントされていない状態になり,ボタンの表示は「マウント」に戻ります.
フロッピー ディスクに書き込みが行われていた場合,取り外しを行おうとすると,取り外してもよいか確認するメッセージが出ます.イメージを保存せずに取り外した場合,書き込んだ内容は失われます.

ファイル名

「取り外し」ボタンの横に,マウントしたフロッピー ディスク イメージのファイル名が表示されます.
フロッピー ディスクに書き込みが行われると,ファイル名の表示の色が赤に変わります.

「書き込み禁止」チェック ボックス

チェックすると,フロッピー ディスクを書き込み禁止にします.

「保存」ボタン

ファイル ダウンロードの形で,(仮想の)フロッピー ディスクの内容をイメージ ファイルとして保存します.

保存を行っても,フロッピー ディスクが更新されているという状態は解除されません.すなわち,取り外しを行おうとすると確認メッセージが表示されます.
できれば,更新した内容が保存されたら,取り外し時の確認メッセージは出さないようにしたいところですが,保存が実際に行われたかどうかが JavaScript からは判りません.「保存」ボタンを押してダウンロードの確認ダイアログが出たところで,ユーザーはダウンロードをキャンセルできます.実際にダウンロードを実行したかキャンセルしたかは判りません.
そのため,「保存」ボタンを押しても,更新されているという状態は解除しないようにしてあります.

「速度」コントロール

エミュレーションの速度を調節します.
動かすプログラムによっては,処理速度が速すぎて使いにくい場合があります.そのような場合に速度を落とすために使用します.(主としてゲーム用?)

「コンポジット モニタ」チェック ボックス

チェックすると,グラフィック モードのとき,コンポジット モニタのように画面を表示します.
チェックしていない場合やテキスト モードのときは,RGB モニタのように画面を表示します.

「リセット」ボタン

PC をリセットします.
これにより,PC はフロッピー ディスクからのブートを開始します.

「停止」ボタン

プログラムの実行を停止します.
ビデオの表示は消えます.

「空ディスク イメージ作成」ボタン

空(セクタのデータがすべてゼロ)のディスク イメージを作成します.実際のディスクでは物理フォーマットのみが行われた状態に相当します.
直接アドレスを指定してディスクをアクセスするプログラムからは,この状態で使用可能です.
DOS などで使用する場合は,さらに何らかのプログラム(FORMAT.EXE など)で論理フォーマットする必要があります.
作成したイメージはドライブにマウントするか,またはファイル ダウンロードの形でファイルとして保存します.


使用例

FreeDOS(8086 版)を動かしているところ

IBM PC エミュレータ使用例 1

CP/M-86 を動かしているところ

IBM PC エミュレータ使用例 2

ゲームを動かしているところ

IBM PC エミュレータ使用例 3

コンポジット モニタ表示の使用例

コンポジット モニタ表示にしない場合


コンポジット モニタ表示にした場合



ディスク イメージ サンプル

サンプルのディスク イメージを用意しました.このファイルを使って,とりあえず動かしてみることができます.
ibm_samp.img (160 KB)
このプログラムは簡単なビデオの表示テストを行います.
何れかのキーを押す度にビデオ モード 3 と 4 を交互に切り替えて,画面に文字と,ビデオ モード 4 については簡単な図形を表示します.
サンプル プログラム実行画面


ブラウザの不具合について

このエミュレータで使用している JavaScript の機能に関して,Firefox に不具合があります.
Firefox を起動してから長時間経った状態でこのエミュレータを動かすと,細かい速度調節ができなかったり,プログラムによっては,動作が極端に遅くなったりすることがあります.この現象は,処理に使っているタイマーの精度が落ちてしまうために起こります.

このエミュレータでは,処理のタイミングをとるために Performance.now() を使用しています.Performance.now() から返される値は浮動小数点数で,単位はミリ秒です.小数部でミリ秒未満の時間が表されます.
ところが,Firefox を起動してから時間が経つと,いつの間にか返される値の小数部がゼロになって,ミリ秒の精度しか得られないようになってしまいます.このエミュレータの処理ではマイクロ秒のオーダーの精度が必要なため,この現象が発生すると,上記のような速度的な問題が起きます.起動後どれ位時間が経つとそうなるのか正確には把握できていませんが,数時間はかかるようです.
これは特定のウィンドウ/タブだけに起こる現象ではなく,一度この現象が起きるようになると,すべてのウィンドウ/タブで同様の現象が起きます.ページを再ロードしたり新しいウィンドウ/タブを開いても直りません.ページをロードすると Performance.now() はゼロからカウントを始めますが,それでもミリ秒未満はゼロになります.これを直すには Firefox を再起動するしか方法が無いようです.

ミリ秒未満の精度が無いこと自体は,仕様に反することではありません.仕様では,ハードウェアやソフトウェアの制約のためミリ秒未満の精度を提供できない場合は,ミリ秒の精度の値を返してもよいことになっています.実際,ミリ秒の精度の値しか返さないブラウザもあります.
しかし Firefox の場合は,最初はミリ秒未満があるのに,時間が経つと,新しく開いたウィンドウ/タブでさえミリ秒未満が無くなり,そして,再起動すると直るという症状から考えると,これはやはりバグだろうと思います.

ですので,もしこのエミュレータを使っていて速度的な面で何かおかしいところがあったら,Firefox を再起動すると直るかも知れません.

追記

Firefox 59 以降でこのエミュレータを実行する場合は,Firefox の設定を変更する必要があります.
このエミュレータでは,処理のタイミングをとるために Performance.now() を使用しています.Firefox 59 以降ではデフォルトの Performance の精度が粗くなったため,このエミュレータが正常に動作しません.
Performance の精度は Firefox の設定(about:config)で変更できます.精度を以前の Firefox と同じにするには,設定項目の“privacy.reduceTimerPrecision”の値を false に変更してください.

戻る