★ DEMOSCENE ★ DEMOS ★ RASTERPROGRAMMIERUNG IN ASSEMBLER (CPC AMSTRAD INTERNATIONAL) ★![]() |
| Rasterprogrammierung in Assembler (CPC Amstrad International) | Demoscene Demos |
Mein CPC und ich Daß der CPC in allen drei Modi mehr als die vorgegebenen Farben darstellen kann, ist klar. Daß man mit Hilfe einer kurzen Assemblerroutine jedoch auch Raster in allen möglichen Farben hersteilen kann, weiß noch nicht jeder. Wie das geht? Ganz einfach!
Wenn Sie das zweite Listing abtippen und starten, werden Sie sichcr von der Farbenvielfalt in allen drei Modi überraschtsein. Noch mehr jedoch sol Ite Sie beeindrucken, daß der vorhandene Text auf dem Bildschirm nicht zerstört wird. Vielmehr werden hinter den Text noch mehrere Farbbalken gelegt. Den soeben gesehenen Effekt nennt man Raster. Was sind Raster? Wenn man bei der CPC-Programmierung von Rastern spricht, meint man damit die Änderung der Farbe des Elektronenstrahls (EKS) in einer oder mehreren Rasterzeilen (Rasterzeile entspricht Pixelzeile). Wenn man die Farbe des EKS ändert, bleibt dieser Farbzustand nur so lange bestehen, bis das Betriebssystem wieder aufgerufen wird. Dies geschieht zum Beispiel durch Interrupts oder Systemcalls. Deshalb steht am Anfang des Listings auch der Befehl DI (Disable Interrupts). Er verbietet sämtliche Interrupts. Um nun gezielt die Farbe einer Rasterzeile zu ändern, braucht man nur noch jeder Rasterzeile eine Farbe zuzuweisen. Es ist hierbei jedoch notwendig, auf die Synchronisation zu achten. Das bedeutet, daß die Farbe der nächsten Rasterzeile erst geändert wird, wenn der EKS beginnt, diese zu “zeichnen”, und nicht, wenn er noch mit einer anderen beschäftigt ist. Dazu sind im ersten Listing auch die vier hintereinander folgenden NOPs, die nur die Funktion einer kurzen Pause haben. Es wird also gewartet, bis der EKS die richtige Position erreicht hat. Lassen Sie alle oder nur einige der NOPs im Assemblerlisting weg, so werden die Raster hin und herruckeln. Probieren Sie es aber ruhig einmal aus! Raster werden benutzt:
Aber mit Rastern kann man auch Grafiken einfärben, um sie so eindrucksvoller erscheinen zu lassen. Man kann sie jedoch auch wie bei der Euromeeting Party Demo (Bericht in CPC 2/3'92) für Laufschriften benutzen, die übereinen Hintergrund laufen, ohne ihn zu zerstören. Jetzt ist zwar das Prinzip bekannt, aber wie das alles in Assembler realisiert werden kann, noch nicht. Hierbei spielt das Gate Array (GA) noch eine entscheidende Rolle. Von ihm werden nämlich die Tintenfarben gespeichert, was schon den ersten Schritt zur Rasterprogrammierung liefert. Es gilt jetzt, diese Farben zu ändern und an das GA zuübergeben. Das Gate Array Um dies zu bewerkstelligen, gibt es zwei Register: Zum einen das Farbnummernregister (FN-Reg). Mit ihm kann man dem GA mitteilen, welche Farbnummer man ändern möchte. Zum anderen das Farbwertregister (FW-Reg). Mit ihm bestimmt man schließlich den neuen Weil der Farbe. Dies funktioniert ebenso wie bei dem INK- Befehl, mit dem kleinen Unterschied, daß die Farben nicht von 0 bis 26 durchnumeriert sind, sondern speziell codiert werden. Die Tabelle “Hardware-Farbwerte...” liefert hier die benötigten Infonnationen. Dort ist jeder Nummer von Obis 31 (27 bis 31 sind doppelte Farben) ein Wert zugeordnet. Da die Übergabe mit DEFM “TDU' einfacher als mit DEFB 84,68,85,92 ist, verwenden wir statt der Nummern die ASCII-Zeichen mit demselben Wert (siehe auch Ende von Listing 1). Die Portadresse für beide Register ist &7F als Highbyte und für das FN-Reg ein Wert von 0 bis 16 für den Farbstift als Lowbyte. Beim FW-Reg muß ein Wert aus der Tabelle als Lowbyte übergeben werden. Per ”Out” gesteuert Wenn wir uns nun noch einmal das erste Listing anschauen, so sehen wir vier OUT-Befehle. Der erste OUT übergibt einen Wert an das FN-Reg (B=&7F, C=&10 = Border). Der zweite OUT übergibt einen Farbwert an das FW-Reg und bestimmt so die Farbe. Beim dritten und vierten OUT passiert eigentlich dasselbe. Lediglich wird hier nicht der Border geändert, sondern Pen 0. Deshalb verlaufen die Raster auch über BORDER (Pen 16) und PAPER (Pen 0). Nach den OUT-Befehlen folgt noch eine Warteschleife. Dies ist notwendig, damit nicht eine, sondern mehrere Rasterzeilen auf einmal mit einer Farbe versehen werden. Ohne diese Warteschleife würde der Regenbogen nur zirka ein Zehntel so hoch sein, wie es tatsächlich der Fall ist.
Wie es funktioniert Die Routine arbeitet also so: Die Farbwerte werden, wie eben schon gesagt, mittels der entsprechenden OUTs geändert. Dazu wird in A der Wert aus HL gelesen und geOUTet. Natürlich eröffnen sich noch viele Möglichkeiten bei der Verwendung von Rastern. Animierte oder geteilte Raster und nicht zuletzt ein Raster-scroller sollen nur zur Anregung dienen. Klaus Meffert/rs, CPCAI
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||