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: - LDIR 21 Taktzyklen für ein Byte
- LDI16 Taktzyklen für ein Byte
- LD (HL),A 7 + 6 = 13 Taktzyklen für ein Byte INC HL
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:- Stapelzeiger Zwischenspeichern
- Interrupt sperren
- Stapelzeiger hinter das Ende des gewünschten Adreßbereiches legen, da durch ein PUSH die Daten an- (SP-1) und (SP-2) abgelegt werden.
- Schleife mit PUSH- Befehl(en) ausführen
- alten Stapelzeiger zurückholen
- Interrupt wieder zulassen
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 Sprung befehl 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 Sprung befehl eingetragen. Tippen Sie den Datalader ab, und starten Sie das Programm. Es erzeugt die Binärdatei 'FASTCLR.BIN". MitMEMORY &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. JF, CPCAI | ★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.732-desktop/c Page créée en 765 millisecondes et consultée 1832 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|
|