★ CODING ★ LISTINGS ★ FAST-CLEAR ★![]() |
Fast - Clear (CPC Amstrad International) | Coding Listings |
Bei FastClear handelt es sich um eine ungemein schnelle Routine, die Bildschirmausschnitte mit einem bestimmten Byte füllt. Solch eine Routine benötigt man zum Beispiel, um den Hintergrund eines Pulldown-Windows zu löschen. Das Assemblerlisting umfaßt drei Routinen, die alle die gleichen Einsprungbedingungen haben und auch gleichartig funktionieren. Sie unterscheiden sich hauptsächlich durch die Länge und durch die Ausführungszeit. Die erste Routine (TC) ist sichtbar 'langsam' (ähnlich dem CLG-Befehl im BASIC), die zweite (FCII) ist schon erheblich schneller, da sie nach dem neuen Prinzip funktioniert. Die dritte und schnellste Routine (FC) arbeitet nach dem Prinzip der zweiten, nur wird hier hauptsächlich mit selbstveränderlichem Code gearbeitet. Sie füllt den Bildschirm innerhalb von zirka 0.022 Sekunden. Wieso ist die Routine so schnell? Betrachtet man einmal die Z80-Befehle, die ein Byte in den Speicher schreiben, so ergeben sich folgende Möglichkeiten:
Das sind die 'normalen' Befehle, wobei natürlich die Befehle LDI und LD (HL),A... noch eine Schleife 'drumherum' benötigen. Deshalb ist die Anzahl der Taktzyklen nicht ganz repräsentativ. Ein Befehl wurde in der Auflistung vergessen. Und genau dieser Befehl sorgt für die enorme Geschwindigkeit: -PUSH DE 11 Taktzyklen für 2(!)Bytes Der PUSH-Befehl ist also mehr als doppelt so schnell wie die herkömmlichen Befehle. Um den PUSH-Befehl anwenden zu können, wurde folgendermaßen vorgegangen:
Die Routine 'FC' ist hauptsächlich deshalb so schnell, weil die PUSH-Befehle nicht innerhalb einer Schleife ausgeführt werden, sondern 40 Befehle direkt hintereinander liegen. Die korrekte Anzahl wird dann über ein JR angesprungen, wobei der JR-Befehl entsprechend der Anzahl im Speicher geändert wird. Bei solch einer Manipulation muß darauf geachtet werden, daß die Anzahl der auszuführenden PUSHs im umgekehrten Verhältnis zum Sprungbefehl steht, das heißt, bei 40 PUSHs, die ausgeführt werden sollen, heißt der Befehl JR 0, bei 0 PUSHs heißt er JR 40. Daraus ergibt sich die Rechnung '40 minus Anzahl der P.'. Dieser Wert wird dann in den Sprungbefehl eingetragen. Tippen Sie den Datalader ab, und starten Sie das Programm. Es erzeugt die Binärdatei 'FASTCLR.BIN". Mit MEMORY &A4FF:LOAD "Fastclr.bin",&A500 bringen Sie das Programm in den Speicher. Der Aufruf der Routine erfolgt über CALL &A500,x1,y1,x2,y2,byte Der Wertebereich für die x-Variablen liegt zwischen 0 und 79, der für die y-Variablen zwischen 0 und 24. Der Koordinatenursprung ist in der oberen linken Ecke zu finden. Die Variable byte kann Werte zwischen 0 und 255 annehmen, die dann entsprechende Bytemuster in die Bildschirmausschnitte bringt.
|