エミュレーターの仕組みに興味があります。彼らは何に書かれていますか?グラフィックスもエミュレートする必要がありますか?ゲームを ROM としてアップロードするにはどうすればよいですか? システム OS をシミュレートしますか?
1 に答える
いくつかのエミュレーション手法があります。最初の手法は、低レベルエミュレーションと呼ばれます。この場合のエミュレーターは、実質的に任意の言語で記述できますが、バイナリデータ操作が大量にあるため、CおよびC ++はそのようなタスクに適していますが、そのような機能を提供できる言語は他にもたくさんあります。
低レベルのエミュレーションでは、プログラムは元のシステムの正確なハードウェアをシミュレートします。たとえば、元のNESには、公式ドキュメントとリバースエンジニアリングの情報の両方から明確に定義されたハードウェアがあります。その6502ベースのCPUがグラフィックス、サウンドチップなどとともにどのように動作するかを正確に知っています。低レベルのエミュレーションでは、元のゲームの正確なバイナリデータは、元のハードウェアがデータを解釈するのとまったく同じ方法でソフトウェアで解釈されます。これには、6502命令セット用に記述された元のマシンコード、グラフィックスデータ、IO、すべてが含まれます。グラフィックスとサウンドハードウェアは、最新のグラフィックスとサウンドAPIを呼び出してそれらを実現することにより、元のハードウェアの命令を最新のハードウェアに変換することによってエミュレートされます。
この手法は最も正確で成功しますが、複雑なマシンに実装するのが最も遅く、場合によっては最も困難です。
2番目の方法は静的再コンパイルと呼ばれます。元のシステムの元のマシンコードが分析され、最新のコンピューター用に再コンパイルされます。この手法は最速のエミュレーションを生成しますが、成功率は非常に低くなります。この手法を採用しているエミュレーターは、せいぜい、いくつかのデモとゲームしかサポートできませんでした。その理由は、元のソフトウェアが予期するランタイム環境が、コンパイル時に知るのが困難または不可能な方法で変更されることが多いためです。
最後の手法は、動的再コンパイルと呼ばれます。この手法では、エミュレーターがコードを分析し、実行中にコードを再コンパイルします。これにより、コンパイラは、プログラムの実行中に利用可能な情報に基づいて、元のソフトウェアが期待するものに合わせてランタイム環境を調整できます。
ほとんどの形式の再コンパイル手法には、高レベルエミュレーションと呼ばれるものが含まれます。これは、ほとんどのコードがオペレーティングシステムまたはライブラリCルーチンを呼び出すためにコンパイルされたコードであるという観察結果です。コードはホストマシンに再コンパイルされ、元のオペレーティングシステムやライブラリ(グラフィックスやサウンドなど)への呼び出しは、エミュレートされるのではなく、ネイティブに再実装されます。たとえば、画面に三角形を描画する呼び出しがある場合、エミュレータは、描画コマンドを元のグラフィックハードウェアに伝達する正確な低レベルの実装をエミュレートすることなく、操作を直接実行できます。これは、ほとんどすべてのNintendo64およびPlayStationエミュレーターと動作方法です。
元のオペレーティングシステムは、再実装が必要な場合があります。たとえば、Nintendo 64には実際にはオペレーティングシステムがなく、各カートリッジはそれ自体が独自のOSでした。ただし、エミュレータは、すべてのROMが実装する共通のルーチンを認識し、それらを動的にキャプチャして再実装しました。ただし、プレイステーションには、基本的なハードウェアのセットアップとCDからのゲームの読み取りに使用される独自のBIOSがありました。エミュレーターは、このBIOSのコピーを持っているか、その機能を再実装しようとする必要があります。
オリジナルのXboxゲームをプレイするために、動的再コンパイルを使用するエミュレーターがXbox360などの内部に実装されていることはわかっています。このようなタスクは、外部の開発者にとっては非常に困難ですが、元の独自のドキュメントと、そのようなエミュレータを作成および最適化するための人材をすべて備えているMicrosoftにとっては簡単です。この場合、元のXboxオペレーティングシステム全体をエミュレートする必要はありませんが、元のゲームが元のオペレーティングシステムに対して行う呼び出しは、ネイティブオペレーティングシステムに変換する必要があります。XboxOneがXbox360をエミュレートする手法は似ていますが、エミュレーションでXbox 360タイトルとの互換性を高めるために、エミュレーターで元のXbox360オペレーティングシステムを実行することを選択した点が異なります。
ゲームカートリッジからのゲームは、ROMダンプ用に特別に設計されたハードウェアを介してコンピューターに移動されます。古いマシンのROMは、実際には非常に単純な方法で動作します。アドレス入力ラインとデータ出力ラインがあります。マイクロコントローラーを使用してデバイスを構築し、これらのROMをダンプしてから、シリアル、USB、またはその他の方法を使用してコンピューターに転送できます。一部のROMは、コンピュータのプログラム可能なパラレルポートを介して読み取ることもできます。最近のPCにはほとんどありませんが、それらのROMにはUSBアダプタがあります。
大量の動的コード生成のため、再コンパイル技術を使用するエミュレーターは、ほぼ排他的にCまたはC ++を使用しますが、実行時にシステムプログラミングと低レベルコードインターフェイスが可能な言語であれば、これを実行できます。