von Bernd Dongus Heute wird es nicht ganz so trocken, wie bei den beiden letzten Artikeln. Diesmal werde ich mein Wissen über den BEFEHLSSATZ des ANTIC loslassen. Die Programme des ANTIC nennt man DISPLAY LIST. Wie jeder von uns benötigt auch der ANTIC einen Startpunkt. Dieser Start- punkt wird in dem Schattenregister $230/$231 (siehe Januar) abgelegt. Ab der hier eingetragenen Adresse liest ANTIC die für ihn bestimmten Befehle. Diese Befehle beziehen sich auf das darzustellende Bild und definieren die nächste(n) 1 bis 16 Bildzeilen. Es gibt auch Kommandos, die dem ANTIC die Adresse der Bilddaten übermitteln, da er sonst nicht kontrollierbare Grafiken darstellen würde. Last but not least gibt es auch noch Sprungbefehle, die den ANTIC dazuveranlassen die nächsten Befehle von einer anderen Adresse zu holen. Da die Mitteilung der Bildspeicher- adresse an den ANTIC im Grunde kein extra Befehl ist (kommt später), lassen sich dessen Befehle in drei Gruppen aufteilen : 1 - Befehle, die Leerzeilen erzeugen. 2 - Befehle, die Bildzeilen (mit Grafik) erzeugen. 3 - Befehle, die Sprünge veranlassen. ANTIC holt sich, aus Geschwindigkeits- gründen alle Befehle im DMA (Direct Memory Access). Bei Sprungbefehlen und dem Befehlszusatz "Merke Bildspeicher- anfang" werden zwei weiter Bytes gelesen, die eine Speicheradresse beschreiben. Zuerst kommt das nieder- wertige, dann das höherwertige Byte der Adresse. Der ANTIC-interne Bild- speicherzähler hat eine Länge von 12 Bits und daher eine Reichweite von 4096 Bytes. Dies hat zur Folge, daß nach 4096 Bytes der Zähler vom ANTIC- Programm aus neu geladen werden muß. Wenn man zum Beispiel die DISPLAY LIST eines GRAPHICS 8 Bildes anschaut, so am Anfang des Bildes, sowie nach etwa 100 Zeilen, ein Befehl zu finden, der den Befehlszusatz "Merke Bildspeicheranfang" enthält. Dies ist aufgrund der oben genannten Reichweite von 4096 Bytes notwendig, da die restlichen Zeilen sonst Müll zeigen würden. Bevor ich zu den drei Befehlskategorien komme will noch etwas zum Thema DLI dazwischen schieben. Um einen DLI richtig zu aktivieren, müssen einige Dinge beachtet werden: Zunächst muß man ein DLI-Programm haben, welches anfangs die im Programm benutzten CPU-Register auf dem Stack ablegt und diese vor der Rückkehr mit einem RTI wiederherstellt. Bsp: PHA rettet Akku TXA PHA rettet X-Reg. : : PLA TAX holt X-Reg. zurück PLA holt Akku zurück Auf dieses Programm wird nun der DLI-Programm-Vektor ($200) verbogen. Daraufhin muß dem ANTIC mitgeteilt werden wann er einen DLI auslösen soll. Dies geschieht durch Setzten des Bit 7 des DL-Befehls in der dementsprechenden Zeile. (z.B. $82 löst nach der GRAPHICS 0 Zeile einen DLI aus) Zuletzt wird Bit 7 der Speicherstelle $d40e (NMIEN) gesetzt, damit ANTIC die Berechtigung hat einen DLI auszuführen, sprich hiermit werden DLIs freigegeben. Nun aber zurück zu den DL-Befehlen. Befehle, die Leerzeilen erzeugen -------------------------------- Bei diesen Befehlen werden vom ANTIC keine Bilddaten ausdem Speicher gelesen und somit nur die Hintergrundfarbe dargestellt. Ausnahme: PLAYER-MISSILES werden dennoch dargestellt, sofern sie aktiv sind. Da im Normalfall (Leerzeile ohne PM-Grafik) hier keine DMA-Zyklen außer denen zum Lesen des DL-Befehls benötigt werden werden in diesen Zeilen die Maschinensprachebefehle schneller ausgeführt als in anderen Zeilen, wie z.B. bei einer GRAPHICS 0 Zeile. Dies kann für das Funktionieren eines DLI von enormer Wichtigkeit sein. Also aufgepasst ! Je weniger DMA-Zyklen verbraucht werden durch Grafiken jeglicher Art, desto schneller arbeitet der Mikroprozessor. Aber ich denke Ihr werdet das im Laufe der Zeit am eigenen Leibe erfahren. Um eine oder mehrere Leerzeile(n) zu erzeugen, muß dem ANTIC ein entsprechender Befehl gegeben werden, der wie folgt aufgebaut ist. Bit 0-3 müssen Null sein, für Dezimalfreaks: der Wert muß ohne Rest durch 16 teilbar sein. Bit 4-6 enthalten die Anzahl der Zeilen plus eins. Für sechs Leerzeilen sähen diese Bits folgendermaßen aus : %101 . Bit 7 ist das 'DLI-Flag' (siehe oben) Beispiel: Wir wollen drei Leerzeilen einmal ohne und einmal mit nachfolgendem DLI erzeugen. 3 Zeilen - 1 = %010 Diesen Wert haben die Bits 4-6, unser Byte sieht im Moment also so aus : 0010 0000 hex = $20 Den ersten Befehl haben wir dann auch schon. Für den Zweiten muß nun nur noch Bit 7 gesetzt werden. 1010 0000 hex = $a0 Hurra! Wir haben die ersten Befehle gelernt. Um eine DL richtig programmieren zu können, braucht man Sprungbefehle. Diese funktionieren wie die Sprungbe- fehle des 6502. Mit ihnen wird der Programmzähler des Prozessores (in diesem Fall des ANTIC) neu geladen. Wie beim 6502 folgen dem Sprungbefehl zwei Byte, die die neue Adresse darstellen. Ein Sprungbefehl des ANTIC ist hat so auszusehen : 1. Byte : Sprungbefehl (*) 2. Byte : LOW-Byte der neuen Adresse 3. Byte : HIGH-Byte der neuen Adresse (*) Bit 0-5 : %000100, signalisiert "Sprung" Bit 6 : Bei "0" wird die DL ab der neuen Adresse weiter abgearbeitet. Bei "1" erfolgt ebenfalls ein Sprung zur neuen Adresse, aber ANTIC wartet mit der weiteren Abarbeitung bis zum Ende der nächsten Vertikalsynchronisation, also bis zum nächsten Bild. Bit 7 : Ist wieder für das Kenn- zeichnen eines DLI zu- ständig. WICHTIGE HINWEISE !!! Wer das ATARI INTERN besitzt und dies nachliest wird feststellen, daß auf S.91 dieser Sprungbefehl anders aufgeteilt wird. DIESE AUFTEILUNG IST FALSCH ! Zur Programmierung von Sprungbefehlen: Im Prinzip sind die Sprungbefehle bei denen Bit 6 null ist völlig unbrauchbar. Sie werden nur benötigt, wenn die DL eine 4K-Grenze im Speicher überschreitet. Wer sie dennoch benutzen will, dem sei gesagt, daß sie an der Stelle, an der sie auftreten eine Leerzeile auf dem Bildschirm erzeugen. Jede DL aber benötigt die Sprungbefehle bei denen Bit 6 gesetzt ist ! Schon jetzt könnten wir eine DL programmieren, die funktioniert. Sie könnte etwa so aussehen : DL .HX 70707041 .DA DL Diese DL ist zwar nicht gerade glorreich, aber sie zeigt die Grundzüge auf, die bei einer DL zu beachten sind. Die ersten 3 Byte erzeugen 24 Leer- zeilen, nach diesen 24 Leerzeilen wird das Bild mit $41 (Sprung und Warten) beendet und der ANTIC-Programm- zähler auf die Startadresse der DL zurück- gesetzt. Mit unserem bisherigen Wissen können wir aber mehr auf den Bildschirm bringen, als Leerzeilen. Wir können einen DLI programmieren. Dieser DLI kann dann zum Beispiel neue Farben setzten, und schon haben wir ein Bild, zwar ohne Grafik, aber interessanter als einfarbige Leerzeilen. Die neue DL würde dann etwa so aufgebaut sein : DL .HX 8070707041 .DA DL Nach einer Leerzeile wird ein DLI ausgelöst, der dann (in meinem Beispiel) die Farben der folgenden Zeilen bestimmt. Diesem Artikel beigefügt ist ein Assembler-Programm im BIBO-Format, welches meiner Meinung nach hier keine weiteren Erläuterungen benötigt, da die Grundzüge bereits erklärt wurden und dieses kleine Programm nur eine Übung sein soll. Auf die Gefahr hin, daß diesmal die Assembler-Ecke etwas kurz wird, höre ich hier auf, da die Befehle, die Grafik erzeugen ein etwas größeres Kapitel sind und das wäre dann doch ein wenig zuviel auf einmal.