★ CODING ★ Vertrackte Warte-Takte ★ |
Das CPU-Timing des Schneider CPC (Computer Technik) |
Wer mit dem Schneider in Maschinensprache arbeitet, kann nicht in gewohnter Manier die Ausführungszeiten der einzelnen Befehle einem Assembler-Handbuch entnehmen. Die Z80A-CPU muß nämlich WAIT-Zyklen ausführen, damit sie nicht gleichzeitig mit dem Video-Controller auf den gemeinsamen Speicher zugreift. Rund 20% Wartezeitverlust sind daher zu beklagen. Wenn man sich aber nicht mit diesem groben Mittelwert zufriedengeben möchte, benötigt man genaue Angaben über die tatsächlichen Ausführungszeiten. Für viele Zwecke reicht es zwar, mit den Original-Taktangaben der Befehle und einer effektiven Taktfrequenz von 3,2 MHz zu rechnen, für zeitkritische Routinen aber - wie beispielsweise SuperTape - ist die Kenntnis der genauen Werte unverzichtbar. Um diese Ausführungszeiten der einzelnen Maschinensprachebefehle zu bestimmen, kann man zwei Wege gehen: entweder man ermittelt die Zeiten empirisch durch Messung, oder man analysiert die Auswirkungen der WAIT- Signale auf die einzelnen Prozessor-Zyklen. In vorliegendem Fall ist der zweite Nun darf man daraus aber nicht den Schluß ziehen, die CPU wäre demnach drei Viertel der Zeit ‘abgehängt'. Der Z80-Prozessor fragt nämlich den WAIT-Eingang nur zu bestimmten Zeitpunkten während der Ausführung eines Maschinensprachebefehls ab. So ein Befehl kann einen Bearbeitungs-Zyklus (Beispiel LD A.B) oder bis zu sechs Zyklen (Beispiel EX (SP),IX) erfordern, wobei jeder Zyklus normalerweise - ohne WAIT - drei bis sechs Takte lang ist. Der Abfragezeitpunkt für WAIT fällt auf die fallende Flanke des zweiten Taktes eines Zyklus. Wenn nun diese fallende Flanke genau auf den inaktiven WAIT-Zustand trifft, also auf logisch 'eins', so beendet der Prozessor den laufenden Zyklus ungestört. Falls dieser Zyklus insgesamt vier Takte währt, fällt beim nächsten Zyklus die fallenden Flanke von T2 wiederum auf das inaktive WAIT-Signal. Bild I. Einfluß des WAIT-Signals auf die CPU-Zyklen >> ln diesem Fall 'sieht' der Prozessor nichts vom WAIT (Bild 1c). Hat der Zyklus jedoch drei Takte, so erwischt die CPU beim nächsten Zyklus noch einen WAIT-Takt (Bild Id). Besonders hart trifft es einen Zyklus mit fünf Takten, der zusätzlich drei Wartetakte erzwingt, zwei sind es beim Sechs-Takte-Zyklus (Bild 1e,f). Das Taktschema (Bild 1) verdeutlicht diese Zwangssynchronisation mit dem WAIT-Signal: Alle Zyklen sind entweder vier oder acht Takte lang, der Zeitbedarf der Befehle ist demnach immer ein Vielfaches von vier Takten. Zugriffsart Um die Sache aber etwas komplizierter zu gestalten, gibt es beim Z80 auch Zyklen, die gar keine WAIT-Abfrage durchführen. Das sind die internen Rechenzyklen, bei denen der Prozessor weder auf den Speicher noch auf einen Port zugreift. Die genaue Kenntnis der Zugriffsarten ist also zusätzlich für die Berechnung der Ausführungszeiten notwendig. So benötigt beispielsweise der BeWeg beschritten worden, wobei allerdings die Messung als 'ultima ratio' die Ergebnisse bestätigte. Das WAIT-Signal, das die Arbeit des Prozessors kurzzeitig unterbricht, kommt völlig regelmäßig vom Gate-Array mit einer Periode von vier Takten (Bild la,b). Für die Dauer von drei Takten liegt es danach auf logisch 'null' ujjd einen Takt lang auf logisch 'eins'. Logisch 'null' kennzeichnet bei diesem Signal die aktive Phase (active low), das heißt, daß dann die CPU in den Wartezustand übergehen soll. fehl 'CPl' vier Zyklen: zwei Lesezyklen ä vier Takte zum Lesen der beiden Opcode-Bytes EDA1, mit der Signalkennung 'M1', einen normalen Lesezugriff (RD) mit drei Takten und einen internen Zyklus mit fünf Takten. Diese letzten fünf Takte werden aber durch WAIT nicht auf acht Takte aufgebläht, sondern quasi als Verlängerung des vorausgehenden Lesezyklus gewertet (Bild lg). Dieser wird dadurch 3 + 5 = 8 Takte lang, hat also schon das erforderliche 'Synchronmaß', so daß die Ausführungszeit des CPI-Befehls durch die WAITs unbeeinflußt bei 16 Takten bleibt. Eine weitere Besonderheit tritt beim Timing der In/Out-Befehle zutage. Der bei diesen Befehlen von der CPU grundsätzlich eingefügte zusätzliche WAIT-Takt führt zu einer veränderten Situation (Bild lh.i). So bekommt beispielsweise der Befehl IN A,(C) trotz dreier Vier-Takte-Zyklen noch ein WAIT von weiteren vier Takten 'aufgebrummt'. Für die nachfolgende Tabelle wurden die Werte für Takte und Zyklen dem 'Z80-Assembly Language Programming Manual' des Z80-Ent Wicklers Zilog entnommen. Die Zugriffsarten sind darin leider nicht verzeichnet, so daß sie aus den Befehlen und den Zyklen hergeleitet werden mußten. 'M1' markiert dabei einen Befehlhol-Zyklus, 'RD' und 'WR' stellen einen normalen Lesebeziehungsweise Schreibzugriff auf den Speicher dar, während 'IORD' und 'IOWR' auf einen Port zugreifen. Interne Zyklen sind durch '-' gekennzeichnet. Die Blockbefehle 'OTIR/ OTDR' und 'INIR/INDR' lassen sich beim Schneider nicht sinnvoll verwenden, da dabei das B-Register und somit die Portadresse (siehe c't 8/85: ‘Des Schneiders Kern') verändert werden. Andreas Stiller, c't
|