一般的にこれを行うことはできませんが、ある意味では、非常に多くのことができ、実際に必要ないくつかの歴史的なケースがありました。
アタリ2600(またはアタリビデオコンピュータシステム)は、アタリはCPUが持っていたことを意味し、デバイスにフレームバッファを与えるために余裕がなかった最も初期の家庭用ビデオゲームシステムの一つであったと第一の時代のそれ以降のシステムとは異なり、1978年にリリースされました。すべてのスキャンラインでコードを実行して何を生成するかを決定します-このコードの実行に17.08マイクロ秒(HBlank間隔)以上かかった場合、スキャンラインが描画を開始する前にグラフィックが適切に設定されません。さらに悪いことに、プログラマがAtariで通常許可されているよりも複雑なコンテンツを描画したい場合、命令の正確な時間を測定し、ビームが描画されているときにグラフィックレジスタを変更する必要がありました。スキャンライン全体で57.29マイクロ秒のスパンです。
ただし、Atari 2600は、6502に基づく他の多くのシステムと同様に、このシナリオに必要な注意深い時間管理を可能にする非常に重要な機能を備えていました。CPU、RAM、およびTV信号はすべて、同じマスタークロック。TV信号は3.98 MHzクロックから流れ、上記の時間をTV信号を管理する整数の「カラークロック」に分割し、CPUおよびRAMクロックのサイクルは正確に3カラークロックであったため、CPUのクロックは現在の進行中のTV信号に対する時間の正確な測定値。(これに関する詳細については、Stella Atari 2600エミュレーター向けに書かれたStella Programmer's Guideをご覧ください)。
さらに、この動作環境は、すべてのCPU命令がすべての場合に必要なサイクルの定義された量を持ち、多くの6502開発者がこの情報を参照表に公開することを意味しました。たとえばCMP
、この表から取られた(アキュムレータとメモリを比較する)命令のこのエントリを考えてみましょう:
CMP Compare Memory with Accumulator
A - M N Z C I D V
+ + + - - -
addressing assembler opc bytes cycles
--------------------------------------------
immediate CMP #oper C9 2 2
zeropage CMP oper C5 2 3
zeropage,X CMP oper,X D5 2 4
absolute CMP oper CD 3 4
absolute,X CMP oper,X DD 3 4*
absolute,Y CMP oper,Y D9 3 4*
(indirect,X) CMP (oper,X) C1 2 6
(indirect),Y CMP (oper),Y D1 2 5*
* add 1 to cycles if page boundary is crossed
このすべての情報を使用して、Atari 2600(および他の6502開発者)は、コードの実行にかかった時間を正確に判断し、必要な機能を実行し、AtariのTV信号タイミング要件に準拠したルーチンを構築できました。また、このタイミングは非常に正確だったため(特にNOPのような時間の無駄な命令)、描画中にグラフィックを変更するためにそれを使用することさえできました。
もちろん、Atariの6502は非常に特殊なケースであり、これはすべて、システムに次のすべてがあるためにのみ可能です。
- RAMを含むすべてを実行するマスタークロック。最近のシステムには、CPUとRAMに独立したクロックがあり、RAMクロックはしばしば遅く、2つは必ずしも同期していません。
- キャッシュは一切ありません-6502は常にDRAMに直接アクセスします。現代のシステムには、状態を予測するのをより困難にするSRAMキャッシュがあります-キャッシュを使用してシステムの動作を予測することはおそらくまだ可能ですが、間違いなくより困難です。
- 同時に実行される他のプログラムはありません-カートリッジ上のプログラムはシステムを完全に制御していました。現代のシステムは、非決定的なスケジューリングアルゴリズムを使用して複数のプログラムを一度に実行します。
- クロック速度が十分に遅いため、信号が時間内にシステムを通過できます。クロック速度が4 GHz(たとえば)の最新システムでは、0.5メートルのマザーボードの長さを移動するのに光の光子6.67クロックサイクルがかかります-最新のプロセッサがボード上の他の何かと対話することは期待できませんボード上の信号がデバイスに到達するまでに1サイクル以上かかるため、たった1サイクルで。
- まれにしか変化しない明確なクロック速度(Atariの場合は1.19 MHz)-現代のシステムのCPU速度は常に変化しますが、AtariはTV信号に影響を与えることなくこれを行うことはできませんでした。
- 公開されたサイクルタイミング-x86は、命令の所要時間を定義しません。
これらすべてが一緒になって、正確な時間を要する命令セットを作成できるシステムを作成しました。このアプリケーションでは、まさにそれが要求されていました。ほとんどのシステムには、単に必要がないため、この程度の精度はありません。計算が完了すると計算が完了するか、正確な時間が必要な場合は、独立したクロックを照会できます。ただし、一部の組み込みシステムなどでニーズが適切な場合でも、それは引き続き発生する可能性があり、これらの環境でコードを実行するのにかかる時間を正確に判断できます。
また、このすべては、正確な時間を要するアセンブリ命令のセットの構築にのみ適用されるという大きな大規模な免責事項を追加する必要があります。これらの環境でも、任意のアセンブリを実行して、「実行にどれくらい時間がかかるか」を尋ねる場合、それを断固として行うことはできません-それは解決不可能であることが証明されている停止問題です。
編集1:この回答の以前のバージョンでは、Atari 2600にはプロセッサにテレビ信号のどこにあるかを知らせる方法がなく、プログラム全体を最初からカウントして同期させなければならないと述べました。コメントで私に指摘したように、これはZX Spectrumのような一部のシステムには当てはまりますが、次の水平ブランキング間隔が発生するまでCPUを停止するハードウェアレジスタが含まれているため、Atari 2600には当てはまりません。自由に垂直ブランキング期間を開始する関数。したがって、サイクルのカウントの問題は各スキャンラインに限定され、開発者がスキャンラインの描画中にコンテンツを変更したい場合にのみ正確になります。