IBM PC エミュレータ JavaScript の説明 |
このプログラムは初期の頃の IBM PC の動作をエミュレートします. 主に以下の機能をエミュレートします.ただし,何れについても,そのすべての機能をサポートしている訳ではなく,エミュレートするのが難しいものや,あまり使われない機能についてはサポートしていません. ◆ CPU 8086/8088 CPU をエミュレートします.◆ ビデオ CGA と MDA をエミュレートします.◆ キーボード 101 キーボードをエミュレートします.◆ フロッピー ディスク ドライブ 2 台のフロッピー ディスク ドライブをエミュレートします.◆ サウンド ビープ音の発生をエミュレートします.◆ BIOS 主に無印(XT や AT でない)IBM PC の BIOS ファンクション コールと,BIOS データ領域のデータのうちプログラムから直接参照されることが多いものをエミュレートします. ジョイスティックのエミュレートはしていません.ハード ディスクも使用できません. このエミュレータで起動できるのは,フロッピー ディスクをドライブにセットしてリセット ボタンを押す(または PC の電源を入れる)と起動するもの(PC booter と呼ばれるもの)です.DOS 用の実行形式ファイルなどを直接起動することはできません. ただし,上記の機能の範囲で動作する DOS(比較的初期の DOS)をこのエミュレータで実行することはできますので,そういった DOS を動かして,その上で DOS の実行形式ファイルを実行することは可能です. 使い方 ・ 「マウント」ボタン フロッピー ディスクのイメージ ファイルをデータとして読み込みます.プログラムから(仮想の)フロッピー ディスクにアクセスできる状態になります. フロッピー ディスクへの書き込みは,読み込んだデータに対する更新になります.JavaScript から直接ファイルにアクセスすることはできませんので,元のイメージ ファイルに直接書き込みが行われる訳ではありません. 更新した内容をイメージ ファイルに反映させたい場合は,「保存」でイメージのデータをファイルに保存します. ・ 「取り外し」ボタン フロッピー ディスク イメージをマウントすると,「マウント」ボタンの表示が「取り外し」に変わります. 「取り外し」ボタンを押すと,ディスク イメージがマウントされていない状態になり,ボタンの表示は「マウント」に戻ります. フロッピー ディスクに書き込みが行われていた場合,取り外しを行おうとすると,取り外してもよいか確認するメッセージが出ます.イメージを保存せずに取り外した場合,書き込んだ内容は失われます. ・ ファイル名 「取り外し」ボタンの横に,マウントしたフロッピー ディスク イメージのファイル名が表示されます. フロッピー ディスクに書き込みが行われると,ファイル名の表示の色が赤に変わります. ・ 「書き込み禁止」チェック ボックス チェックすると,フロッピー ディスクを書き込み禁止にします. ・ 「保存」ボタン ファイル ダウンロードの形で,(仮想の)フロッピー ディスクの内容をイメージ ファイルとして保存します. 保存を行っても,フロッピー ディスクが更新されているという状態は解除されません.すなわち,取り外しを行おうとすると確認メッセージが表示されます. できれば,更新した内容が保存されたら,取り外し時の確認メッセージは出さないようにしたいところですが,保存が実際に行われたかどうかが JavaScript からは判りません.「保存」ボタンを押してダウンロードの確認ダイアログが出たところで,ユーザーはダウンロードをキャンセルできます.実際にダウンロードを実行したかキャンセルしたかは判りません. そのため,「保存」ボタンを押しても,更新されているという状態は解除しないようにしてあります. ・ 「速度」コントロール エミュレーションの速度を調節します. 動かすプログラムによっては,処理速度が速すぎて使いにくい場合があります.そのような場合に速度を落とすために使用します.(主としてゲーム用?) ・ 「コンポジット モニタ」チェック ボックス チェックすると,グラフィック モードのとき,コンポジット モニタのように画面を表示します. チェックしていない場合やテキスト モードのときは,RGB モニタのように画面を表示します. ・ 「リセット」ボタン PC をリセットします. これにより,PC はフロッピー ディスクからのブートを開始します. ・ 「停止」ボタン プログラムの実行を停止します. ビデオの表示は消えます. ・ 「空ディスク イメージ作成」ボタン 空(セクタのデータがすべてゼロ)のディスク イメージを作成します.実際のディスクでは物理フォーマットのみが行われた状態に相当します. 直接アドレスを指定してディスクをアクセスするプログラムからは,この状態で使用可能です. DOS などで使用する場合は,さらに何らかのプログラム(FORMAT.EXE など)で論理フォーマットする必要があります. 作成したイメージはドライブにマウントするか,またはファイル ダウンロードの形でファイルとして保存します. 使用例 FreeDOS(8086 版)を動かしているところ CP/M-86 を動かしているところ ゲームを動かしているところ コンポジット モニタ表示の使用例 ディスク イメージ サンプル サンプルのディスク イメージを用意しました.このファイルを使って,とりあえず動かしてみることができます. 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 に変更してください. |