4

私は複数の場所で見ました-次のエミュレート方法

つまり、サイクルはエミュレート関数に渡されます

int CPU_execute(int cycles) {
    int cycle_count;

    cycle_count = cycles;
    do {

         /* OPCODE execution here */

    } while(cycle_count > 0);

    return cycles - cycle_count;
}     

エミュレートするためにこのアプローチを行う理由、つまり特定のサイクル数でエミュレートする理由を理解するのに苦労していますか? このアプローチが役立ついくつかのシナリオを教えてください。

どんな助けでも心から感謝します!!!

4

3 に答える 3

6

エミュレーターは、複数のチップデバイス用に作成されたソフトウェアをだますことに関心を持つ傾向があります。Z80と、CPUに加えて、少なくともグラフィックチップとサウンドチップについて話しているベストセラーデバイスの観点からです。

現実の世界では、これらのチップはすべて同時に動作します。それらすべてが通信できるようにするためのバスロジックがいくつかありますが、それ以外の場合は独自の世界にあります。

同期イベントを実施するコストが高すぎるため、通常、異なるチップのエミュレーションを並行プロセスとして実行することはありません。特に、RAMの同じブロックのようなものが複数のチップ間で共有される一般的な配置ではそうです。

したがって、代わりに最も基本的なアプローチは、さまざまなチップを協調的にマルチタスクすることです。Z80を数サイクル実行してから、グラフィックチップを同じ時間など、無限に実行します。ここから、nサイクル実行して戻るというアプローチが生まれます。

これは通常、実際のコンピュータバスの動作を正確に再現する方法ではありませんが、実装は簡単で、ほとんどのソフトウェアをだますことができます。

あなたが投稿した特定のコードで、作者はさらに、エミュレーションが次の命令全体の終わりまでサイクル数を切り上げることを決定しました。繰り返しになりますが、これは実際のマシンの実際の内部とは関係がなく、実装の単純さに関するものです。他のサブシステムが適応を試みることができるように、実際に実行されるサイクル数が返されます。

于 2012-12-05T07:32:35.107 に答える
3

あなたが z80 について言及したので、私はたまたま、この種の正確なエミュレーションが必要な場合があるプラットフォームの完璧な例を知っています: ZX Spectrum. ZX Spectrum の標準的なグラフィックス出力領域は、画面の中央にある 256 x 192 ピクセルのボックスで、単色で塗りつぶされたかなり広い「境界」領域に囲まれていました。境界線の色は、値を特別な出力ポートに出力することによって制御されました。コンピュータ設計者のアイデアは、メイン画面で起こっていることに最も適した境界線の色を選択するというものでした。

ZX Spectrum には精密タイマーがありませんでした。しかし、プログラマーはすぐに、z80 の「厳格な」(現代の基準による) タイミングにより、モニターのビームの動きと同期した描画が可能であることに気付きました。ZX Spectrum では、各フレームの開始時に生成される割り込みを待ってから、さまざまな効果を実現するために必要な正確なサイクル数を文字通りカウントできます。たとえば、ZX Spectrum の 1 つの完全なスキャンラインは 224 サイクルでスキャンされました。したがって、224 サイクルごとに境界線の色を変更し、境界線上にピクセルの太さの線を生成することができます。

ZX Spectrum のグラフィックス容量は、画面が 8x8 のピクセル ブロックに分割され、常に 2 色しか使用できないという意味で制限されていました。プログラマーは、224 サイクルごとにこれら 2 つの色を変更することでこの制限を克服しました。これにより、事実上、色の解像度が 8 倍になりました。

別の回答の下での議論は、1つのスキャンラインがエミュレーターにとって十分に正確な解像度であるかどうかに焦点を当てていることがわかります。私が ZX Spectrum で見たボーダー スクローラー効果のいくつかは、基本的に、単一の z80 サイクルに合わせて調整されています。そのようなコードの正しい出力を再現したいエミュレーターは、単一のマシンサイクルまで正確でなければなりません。

于 2013-03-12T22:18:32.113 に答える
2

プロセッサを他のハードウェアと同期させたい場合は、そのようにすると便利です。たとえば、タイマーと同期させたい場合、タイマーが CPU に割り込む前に何サイクル通過できるかを制御したいとします。

于 2012-12-04T08:50:33.747 に答える