Sie können dies im Allgemeinen nicht tun, aber in gewisser Hinsicht können Sie sehr viel, und es gab einige historische Fälle, in denen Sie tatsächlich mussten .
Der Atari 2600 (oder Atari Video Computer System) war eines der frühesten Heimvideospielsysteme und wurde erstmals 1978 veröffentlicht. Im Gegensatz zu späteren Systemen der damaligen Zeit konnte Atari es sich nicht leisten, dem Gerät einen Bildpuffer zu geben, was bedeutet, dass die CPU dies hatte Code an jeder Scanlinie ausführen, um zu bestimmen, was zu produzieren ist - wenn dieser Code mehr als 17,08 Mikrosekunden zum Ausführen benötigt (das HBlank-Intervall), werden die Grafiken nicht richtig eingestellt, bevor die Scanlinie mit dem Zeichnen beginnt. Schlimmer noch, wenn der Programmierer komplexere Inhalte zeichnen wollte, als es der Atari normalerweise zuließ, musste er die genauen Zeiten für Anweisungen messen und die Grafikregister während des Zeichnens des Strahls mit einer Zeitspanne von 57,29 Mikrosekunden für die gesamte Scanlinie ändern.
Der Atari 2600 hatte jedoch wie viele andere Systeme auf Basis des 6502 eine sehr wichtige Funktion, die ein sorgfältiges Zeitmanagement ermöglichte, das für dieses Szenario erforderlich war: Die CPU, der RAM und das TV-Signal liefen alle mit Uhren, die auf demselben Master basierten Uhr. Das TV-Signal lief von einem 3,98-MHz-Takt ab, wobei die obigen Zeiten in eine ganze Zahl von "Farbtakten" aufgeteilt wurden, die das TV-Signal handhabten, und ein Zyklus der CPU- und RAM-Takte bestand aus genau drei Farbtakten, so dass der CPU-Takt erhalten blieb ein genaues Zeitmaß in Bezug auf das aktuelle TV-Fortschrittssignal. (Weitere Informationen hierzu finden Sie im Stella-Programmierhandbuch , das für den Emulator Stella Atari 2600 geschrieben wurde. )
Diese Betriebsumgebung bedeutete außerdem, dass jeder CPU-Befehl in jedem Fall eine bestimmte Anzahl von Zyklen benötigte, und viele 6502-Entwickler veröffentlichten diese Informationen in Referenztabellen. Betrachten Sie zum Beispiel diesen Eintrag für die CMP
Anweisung (Speicher mit Akku vergleichen) aus der folgenden Tabelle :
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
Mit all diesen Informationen konnten Atari 2600 (und andere 6502-Entwickler) genau bestimmen, wie lange die Ausführung ihres Codes dauerte, und Routinen erstellen, die genau das taten, was sie brauchten und dennoch die Timing-Anforderungen des Atari für TV-Signale erfüllten. Und weil dieses Timing so genau war (insbesondere für zeitraubende Anweisungen wie NOP), konnten sie es sogar verwenden, um die Grafiken beim Zeichnen zu ändern.
Natürlich ist der 6502 des Atari ein sehr spezieller Fall, und all dies ist nur möglich, weil das System über Folgendes verfügt:
- Eine Hauptuhr, die alles lief, einschließlich RAM. Moderne Systeme haben unabhängige Takte für die CPU und den RAM, wobei der RAM-Takt oft langsamer ist und die beiden nicht unbedingt synchron sind.
- Kein Caching jeglicher Art - der 6502 hat immer direkt auf DRAM zugegriffen. Moderne Systeme verfügen über SRAM-Caches, die die Vorhersage des Zustands erschweren. Das Verhalten eines Systems mit einem Cache lässt sich zwar noch vorhersagen, es ist jedoch definitiv schwieriger.
- Keine anderen Programme laufen gleichzeitig - das Programm auf der Kassette hatte die vollständige Kontrolle über das System. Moderne Systeme führen mehrere Programme gleichzeitig mit nicht deterministischen Planungsalgorithmen aus.
- Eine Taktrate, die langsam genug ist, damit die Signale rechtzeitig über das System übertragen werden können. Bei einem modernen System mit einer Taktrate von 4 GHz (zum Beispiel) benötigt ein Photon von Licht 6,67 Taktzyklen , um die Länge eines Motherboards von einem halben Meter zu erreichen. Man könnte nicht erwarten, dass ein moderner Prozessor mit etwas anderem auf dem Board interagiert in nur einem Zyklus, da es mehr als einen Zyklus dauert, bis ein Signal auf der Platine das Gerät erreicht.
- Eine gut definierte Taktrate, die sich selten ändert (1,19 MHz im Fall des Atari) - die CPU-Geschwindigkeiten moderner Systeme ändern sich ständig, während ein Atari dies nicht tun könnte, ohne auch das TV-Signal zu beeinflussen.
- Veröffentlichte Zykluszeiten - Der x86 definiert nicht, wie lange eine seiner Anweisungen dauert.
All diese Dinge haben sich zu einem System zusammengeschlossen, in dem es möglich war, Anweisungen zu erstellen, die genau so viel Zeit in Anspruch nahmen - und für diese Anwendung war genau das erforderlich. Die meisten Systeme verfügen nicht über diese Genauigkeit, nur weil sie nicht benötigt werden. Berechnungen werden entweder ausgeführt, wenn sie ausgeführt werden, oder wenn eine genaue Zeitdauer erforderlich ist, kann eine unabhängige Uhr abgefragt werden. Wenn die Anforderungen jedoch erfüllt sind (z. B. auf einigen eingebetteten Systemen), wird dies möglicherweise weiterhin angezeigt, und Sie können genau bestimmen, wie lange der Code in diesen Umgebungen ausgeführt werden muss.
Und ich möchte noch den großen, massiven Haftungsausschluss hinzufügen, dass all dies nur für die Erstellung einer Reihe von Montageanleitungen gilt, die eine genaue Zeitspanne in Anspruch nehmen. Wenn das, was wollen Sie einige beliebige Stück Montage tun nehmen, auch in diesen Umgebungen und fragen : „Wie lange dauert diese nehmen ausführen“ können Sie kategorisch das nicht tun - das ist das ist Halting Problem , das unlösbare bewiesen wurde.
EDIT 1: In einer früheren Version dieser Antwort gab ich an, dass der Atari 2600 keine Möglichkeit hatte, den Prozessor darüber zu informieren, wo er sich im TV-Signal befand, was ihn zwang, das gesamte Programm von Anfang an gezählt und synchronisiert zu halten. Wie in den Kommentaren erwähnt, gilt dies für einige Systeme wie das ZX Spectrum, nicht jedoch für das Atari 2600, da es ein Hardware-Register enthält, das die CPU anhält, bis das nächste horizontale Austastintervall auftritt eine Funktion, um das vertikale Austastintervall nach Belieben zu starten. Daher ist das Problem des Zählens von Zyklen auf jede Scanlinie beschränkt und wird nur dann genau, wenn der Entwickler den Inhalt ändern möchte, während die Scanlinie gezeichnet wird.