CODINGLISTINGS ★ RASTERPROGRAMMIERUNG IN ASSEMBLER|CPC AMSTRAD INTERNATIONAL) ★

Rasterprogrammierung in Assembler (CPC Amstrad International)Coding Listings
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 
Mein CPC und ich
Rasterprogrammierung in Assembler

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:

  • für Effekte, die den Bildschirminhalt nicht zerstören sollen,
  • für Effekte, die Farbe auf den Screen bringen sollen
  • und in der Szene für Demos.

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.

InkFarbwertInkFarbwertInkFarbwertInkFarbwert
084=T8 77=M16 71=G24 74=J
168=D 986=V 1779=O 2567=C 
285=U 1070=F 1882=R 2675=K 
492=\ 1187=W 1966=B 2765=A 
588=X 1294=^ 2083=S 2872=H 
693=] 1364=@ 2190=Z 2973=I 
776=L 1495=_ 2289=Y 3080=P 
869=E 1578=N 2391=[ 3181=Q 
Hardware-Farbwerte: INK 27-31 sind doppelt vorkommende Farben! FARBWERT ist der entsprechend codierte Wert zu dem normalen INK-Wert

Wie es funktioniert

Die Routine arbeitet also so:
Am Anfang wird mittels eines LDIR eine Warteschleife ausgeführt (es wird nichts verschoben, da Quelle und Ziel gleich sind!), damit die Raster nicht am oberen Rand des Monitors beginnen, wo man sie noch nicht sieht!
Dann werden die Register belegt:
HL zeigt auf die Rasterfarbtabelle, welche die codierten Farben enthält.
In B ist der Wert &7F abgelegt, was der Portadresse fürdas GA entspricht.
In C der Wert & 10, in E der Wert &00 für Pen 16 (Border) und Pen 0.
Das D-Register wird als Zählregister verwendet. In unserem Fall wird also 43mal die Schleife zum Ändern der Farbwerte ausgeführt.

Die Farbwerte werden, wie eben schon gesagt, mittels der entsprechenden OUTs geändert. Dazu wird in A der Wert aus HL gelesen und geOUTet.
HL wird um eins erhöht und zeigt dann auf den nächsten Farbwert.
Nachdem die Schleife beendet ist, wird noch auf einen Tastendruck gewartet. Die verwendete Routine (CALL &BD19) ist zwar sehr langsam, da ein Zugriff auf die Firmware stattfindet, doch in unserem Fall ist noch genügend Zeit vorhanden.
In dieser Ausgabe, genauer gesagt in der Trickkiste, finden Sie noch eine Tastaturabfrage, die direkt auf die Firmware zugreift und somit wesentlich schneller ist. Vielleicht versuchen Sie diese selbständig in die kleine Rasterdemo einzubauen.
Doch schauen Sie sich einfach Listing 1 noch einmal in aller Ruhe an. Für den etwas geübten Assembler-Programmierer sollte deutlich sein, was hier passiert.
Um andere Farben zu erhalten, können Sie einfach die Farbwerte im Listing ändern (verwenden Sie nur die Werte aus der Tabelle). Es muß jedoch darauf geachtet werden, daß mindestens so viele Werte in der Tabelle stehen, wie der Wert des D-Registers ausmacht. Auch sollte das Programm nicht bei laufendem Floppy-Motor gestartet werden, da die Raster durch den Interrupt gestört werden.

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

★ PUBLISHER: CPC Amstrad International
★ YEAR: 1992
★ AUTHOR: Klaus Meffert

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listings:
» Rasterprogrammierung  in  Assembler    (CPC  Amstrad  International)    GERMANDATE: 2020-04-25
DL: 22 fois
TYPE: ZIP
SIZE: 5Ko
NOTE: 40 Cyls
.HFE: NON

» Rasterprogrammierung  in  Assembler    (CPC  Amstrad  International)    GERMAN    LISTINGDATE: 2020-04-28
DL: 25 fois
TYPE: text
SIZE: 2Ko

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding Src's » Freeze
» Coding Src's » Eine Zeile - viel Wirkung
» Coding Src's » Illusion
» Coding Src's » Des tests
» Coding Src's » Baum des Pythagoras (CPC Amstrad International)
» Coding Src's » Circles

QUE DIT LA LOI FRANÇAISE:

L'alinéa 8 de l'article L122-5 du Code de la propriété intellectuelle explique que « Lorsque l'œuvre a été divulguée, l'auteur ne peut interdire la reproduction d'une œuvre et sa représentation effectuées à des fins de conservation ou destinées à préserver les conditions de sa consultation à des fins de recherche ou détudes privées par des particuliers, dans les locaux de l'établissement et sur des terminaux dédiés par des bibliothèques accessibles au public, par des musées ou par des services d'archives, sous réserve que ceux-ci ne recherchent aucun avantage économique ou commercial ». Pas de problème donc pour nous!

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 641 millisecondes et consultée 135 fois

L'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.