Der GTIA

Hauptkategorie: 8-Bitter
Erstellt: 14 November 2011
Zugriffe: 4115

Der GTIA

Der GTIA ist ein weiterer Spezialbaustein des Atari. Der Begriff ist eine Abkürzung für "Graphic Television Interface Adaptor". Der GTIA ist Hauptverbindungsglied zwischen ANTIC und dem Fernseher.

Die vorrangige Aufgabe des GTIA ist es also, die vom ANTIC übergebenen Daten in ein Fernsehbild umzusetzen. Der GTIA verfügt dazu über Farbregister. In jedes dieser Register wird jeweils eine bestimmte Farbe mit einer bestimmten Helligkeit eingetragen. Wenn der ANTIC ein Bild erstellt, gibt er nicht selbst die Farbe an, sondern wählt nur ein Farbregister des GTIA aus. Dies ist die normale Art der Bilddarstellung, es ist aber auch möglich, den GTIA dazu zu bringen, die vom ANTIC übergebenen Daten anders zu interpretieren.

Eine weitere Aufgabe des GTIA ist die Erzeugung von beweglichen Objekten auf dem Bildschirm, sogenannten "PLAYERn" und "MISSILEs" (Spielern und Geschossen). Diese Form der Darstellung wird daher auch als Player-Missile-Grafik bezeichnet. Es ist möglich, gleichzeitig vier Spieler und vier Geschosse darzustellen. Unter Umständen ist aber auch eine höhere Anzahl zu erreichen. Der GTIA unterstützt bei der Player-Missile-Grafik jeweils nur eine Bildzeile. Das heißt, daß für jede Zeile dem GTIA neue Daten über die Form der Spieler und Geschosse mitgeteilt werden müssen. Wie schon im Kapitel über den ANTIC beschrieben, ist dies auch automatisch durch den DMA möglich.

Für die Player-Missile-Grafik stehen im GTIA Register zur Verfügung. So sind wie für die Spielfelddaten, die der ANTIC übergibt, auch für die Player-Missile-Grafik Farbregister vorhanden. Außerdem gibt es Register für die Horizontalposition der Spieler und Geschosse und deren Aussehen (das heißt, wie ein Spieler bzw. ein Geschoß in EINER Zeile aussieht). Die Register, in denen das Aussehen der Spieler und Geschosse gespeichert wird, heißen Spieler- bzw. Geschoßgrafikregister. Oft werden diese Register in der Literatur auch als "Umrißregister" bezeichnet. Diese Bezeichnung halten wir jedoch für mißverständlich. Auch die horizontale

Größe der Spieler und Geschosse ist in Registern gespeichert und somit programmierbar.

Da das Bild vom ANTIC und die Daten der Spieler- und Geschoßgrafikregister im GTIA gemischt werden, kommt es bei Objekten und Bildteilen, die die gleiche Bildposition belegen zur Frage, was dargestellt werden soll, also: Was im Vorder- und was im Hintergrund liegen soll. Dies läßt sich mit einem Register steuern, das festlegt, welche Objekte bzw. welche Bildschirmfarben an welcher Stelle in einer "Prioritätsliste" stehen.

Besonders bei Spielen ist es auch interssant, ob Spieler oder Geschosse mit Spielern, Geschossen oder Bildschirmteilen zusammengestoßen sind. Auch dies wird dem Benutzer vom GTIA in Registern angezeigt. Durch diese Funktion wird der CPU erheblich Rechenzeit erspart, da sie nicht selbst anhand der Positionangaben ausrechnen muß, ob es "Zusammenstöße" gab.

Zusätzlich zu den beschriebenen Funktionen, ist der GTIA auch für die sogenannten Triggerleitungen zuständig. Die Triggerleitungen sind die Leitungen, die mit den "JoystickFeuertasten" verbunden sind. Der Status dieser Triggerleitungen wird über GTIA Register abgefragt. Bei den alten Atari-Geräten sind alle vier Triggereingänge des GTIA benutzt, da ja auch vier Joystickports zur Verfügung stehen. Bei den neuen Atari-Modellen sind zwei Triggereingänge mit Joystickports und ein Triggereingang mit einer Freigabe für den Cartridge-Steckplatz verbunden. Der vierte Triggereingang ist unbenutzt.

Auch die Zusatztasten der Tastatur, die sogenannten Konsolentaster, sind mit dem GTIA verbunden. Das bedeutet, daß die Tasten "START", "SELECT" und "OPTION" über den GTIA abgefragt werden.

Das "Klicken", das ertönt, wenn man eine Taste betätigt, wird ebenfalls vom GTIA erzeugt. Bei den alten Atari-Geräten

wird es über einen eingebauten Lautsprecher wiedergegeben. Dieser Lautsprecher wurde bei den neuen Modellen eingespart. Das "Klicken" wird jetzt direkt in das Tonsignal, das sonst vom POKEY über den Modulator zum Fernseher übertragen wird, gemischt.

Viele Adressen sind mit zwei Registern des GTIA belegt. Jeweils ein Register ist dann für eine Funktion zuständig, die nur ein Schreiben in das Register erfordert und ein anderes ist für eine Funktion zuständig, die nur ein Lesen des Registers erfordert. So können beide Register die gleiche Adresse haben und sich trotzdem nicht gegenseitig stören. Zum Beispiel liegen die Register, die die Horizontalposition der Spieler festlegen, mit denen, die eine Überprüfung, ob Kollisionen zwischen den Geschossen und dem Spielfeld vorliegen, ermöglichen, auf den gleichen Adressen.

Auch für viele der GTIA-Register stellt das Betriebssystem Schattenregister zur Verfügung. Jeweils während der Vertikalsynchronisation werden die Register- und Schattenregisterinhalte aktualisiert (bzw. aufeinander angeglichen). Dies ist zum Beispiel zu beachten, wenn man die Farben des Spielfeldes ändern möchte. Wenn man die neuen Informationen in die Register im GTIA schreibt, die ein Schattenregister haben, so werden sie bei der nächsten Vertikalsynchronisation überschrieben, tauchen also maximal eine Fünfzigstelsekunde auf dem Bildschirm auf. Um die neue Farbe dauerhaft auf den Bildschirm zu bringen, muß man in das Schattenregister schreiben, da das Betriebssystem von dort aus die Daten liest, die es in das GTIA-Register schreibt. Eine weitere Fehlerquelle liegt oft in der Tatsache, daß die Schattenregisterinhalte erst nach spätestens einer Fünfzigstelsekunde richtig sind. Unter Umständen tritt also der Fall ein, daß ein GTIA-Register und ein Schattenregister zusammen eine unmögliche Aussage machen. Dies führt zu Fehlern in Programmen. Der Benutzer sollte die Informationen also nur aus GTIA- oder nur aus Schattenregistern lesen.


Darstellung der Bilddaten des ANTIC

Wie schon erwähnt, überträgt der ANTIC Daten, die dem GTIA miteilen, welche Farbregister er jeweils abbilden soll. Im Kapitel über den ANTIC war auch schon bei der Beschreibung der diversen Grafikmodi angegeben, welches Bitmuster in den Bilddaten stehen muß, um die Farbe und Helligkeit eines bestimmten Farbregisters auf den Bildschirm zu bringen. Bei Grafikmodi, die eine Auflösung von zwei Bildpunkten pro Farbtakt haben, können benachbarte Punkte nur unterschiedliche Helligkeiten aufweisen, nicht jedoch unterschiedliche Farben. Pro Farbtakt kann nur eine Farbe dargestellt werden.

Alle Farbregister im GTIA sind gleichartig aufgebaut:

Bit 0 unbenutzt
Bit 1-3 Helligkeit
Bit 4-7 Farbe

Die Helligkeit läßt sich also in acht Stufen einstellen (da für sie 3 Bits zur Verfügung stehen). Dabei gilt folgende Tabelle:

Bit 3 Bit 2 Bit 1 Helligkeit
0 0 0 Helligkeit 0,  minimal (schwarz)
0 0 1 Helligkeit 1
0 1 0 Helligkeit 2
0 1 1 Helligkeit 3
1 0 0 Helligkeit 4
1 0 1 Helligkeit 5
1 1 0 Helligkeit 6
1 1 1 Helligkeit 7, maximal (weiß)

Es stehen 16 verschiedene Grundfarben zur Verfügung. Allerdings hängt es sehr vom Fernseher ab, wie welche Farbe "wirkt". Bei schlecht eingestellten Fernsehern können auch statt weißen Punkten dicht beieinander liegende andersfarbige Punkte erscheinen. Einen derartigen Fehler, der meist an einer schlechten "Konvergenzeinstellung" des Fernsehers liegt, sollte man vom Fachmann beseitigen lassen.



Für die Wahl der Farben gilt folgende Tabelle:

Bit 7 Bit 6 Bit 5 Bit 4 Farbe
0 0 0 0 Grau
0 0 0 1 Gold
0 0 1 0 Orange
0 0 1 1 Rot-Orange
0 1 0 0 Rosa
0 1 0 1 Purpur
0 1 1 0 Violett
0 1 1 1 Blau1
1 0 0 0 Blau2
1 0 0 1 Hellblau
1 0 1 0 Türkis
1 0 1 1 Blaugrün
1 1 0 0 Grün
1 1 0 1 Gelbgrün
1 1 1 0 Grün-Orange
1 1 1 1 Hellorange

Für die Spielfeldfarben gibt es vier Register, die mit COLPF0, COLPF1, COLPF2 und COLPF3 bezeichnet werden. Die Abkürzung "COLPF" hat sich in der Literatur eingebürgert, sie steht für "COLOR OF PLAYFIELD", was man mit "SPIELFELDFARBE" übersetzen kann. Außerdem gibt es noch ein Farbregister COLBAK, was für "COLOR OF BACKGROUND" (Hintergrundfarbe) steht. Die Farbe dieses Registers erscheint in jedem Fall überall dort, wo sich kein anderes Bildteil befindet, also im Wesentlichen in der Bildumrandung. Bei einigen Grafikmodi wird dieses Register auch als normale Bildschirmfarbe angesprochen (z.B. beim ANTIC-Modus "8" oder "A"). Für alle diese Register erzeugt das Betriebssystem Schattenregister.

Die Register und Schattenregister befinden sich an folgenden Speicherstellen im Atari-System:

Register
Schattenregister
COLPF0 53270 $d016
COLPF0@ 708 $2c4
COLPF1 53271 $d017
COLPF1@ 709 $2c5
COLPF2 53272 $d018
COLPF2@ 710 $2c6
COLPF3 53173 $d019
COLPF3@ 711 $2c7







COLBAK 53174 $d01a
COLBAK@ 712 $2c8

Wie schon am Anfang des Kapitels erwähnt, ist es möglich, den GTIA dazu zu bringen, die Bilddaten, die er vom ANTIC erhält, auf andere Art als normal darzustellen. Auch das BASIC enthält Grafikbetriebsarten ("Grafikgänge"), die nicht zu den sonst üblichen Darstellungen des ANTIC passen. Gemeint sind die Modi, die man durch "GRAPHICS 9", "GRAPHICS 10" oder "GRAPHICS 11" erhält.

Ursprünglich hat Atari seine Anlagen mit einem Chip namens "CTIA" ausgeliefert. Dieser Chip ist besonders für das Amerikanische Farbsystem (NTSC-Norm) konzipiert. Als klar wurde, daß Atari in Europa nicht nur ein paar Rechner verkaufen würde, wurden die weiteren Geräte mit dem GTIA-Chip ausgerüstet. Der GTIA ist besonders für europäische Farbsysteme ausgelegt. Fast alle Atari-Systeme in Europa enthalten den GTIA (in jedem Fall alle neuen Geräte, aber auch die meisten Atari 400 und 800). Die neuesten Geräte in den USA enthalten inzwischen ebenfalls einen weiterentwickelten Chip anstelle des alten CTIA.

Zwischen GTIA und CTIA gibt es einen wesentlichen Unterschied. Bei der Grafik mit CTIA und ANTIC werden nur die Grafikregister, die auch mit dem "SETCOLOR"-Befehl erreicht werden können, verwendet. Ohne Player-Missile-Grafik bleiben also Farbregister unbenutzt. Der GTIA-Chip kann dagegen alle neun Farbregister auch ohne Benutzung der Player-MissileGrafik ansprechen, ermöglicht dem Benutzer also eine bessere Ausnutzung des Atari-Systems.

Da bei den "neuen" Systemen nur statt des CTIAs der GTIA verwendet wurde, nicht jedoch auch ein anderer ANTIC, muß zwangsläufig der GTIA allein für die neuen Modi ("GRAPHICS 9, 10 oder 11) "zuständig" sein. Tatsächlich betreibt man den ANTIC in diesen Modi auch normal, zum Beispiel in einem Schriftmodus oder auch einem Modus für hochauflösende Grafik, der GTIA stellt die Informationen des ANTIC lediglich anders dar.

Der neue GTIA ist zum CTIA kompatibel, das heißt, daß alle Programme, die auf dem CTIA laufen, auch für den GTIA geeignet sind. Der umgekehrte "Weg" ist aber nur möglich, wenn nur CTIA-Möglichkeiten ausgenutzt worden sind.

Der GTIA interpretiert die Bilddaten des ANTIC anders als in der gewohnten Weise. Er faßt die Daten zu jeweils vier Bit breiten Nibbles zusammen. Diese Nibbles steuern dann, welche Farben auf den Bildschirm gelangen. Es muß allerdings beachtet werden, daß es bei Verwendung der horizontalen Feinverschiebung oft unerwünschte Ergebnisse gibt, wenn diese Möglichkeiten des GTIA ausgenutzt wedrden.

Die unterschiedlichen Betriebsarten werden über die Bits 6 und 7 des Registers GTIACNTL gewählt. Die Bits 0-5 des GTIACNTL werden für die Player-Missile-Grafik verwendet. Bei der Programmierung ist also darauf zu achten, daß es nicht zu Konflikten mit der Player-Missile-Grafik kommt. Auch für GTIACNTL gibt es ein Schattenregister (GTIACNTL@). Die Register befinden sich an folgenden Stellen:

GTIACNTL 53275 $d01b
GTIACNTL@ 623 $26f



Die möglichen Kombinationen von Bit 6 und Bit 7 führen zu folgenden Funktionen:

Bit7 Bit6 Beschreibung
0 0 Diese Bitkombination liegt beim CTIA immer vor. Wenn Programme von einem Atari mit GTIA auf einem Atari mit CTIA (der in Europa selten ist !) laufen sollen, muß diese Bitkombination vorliegen. Bei dieser Kombination arbeitet der Atari wie gewohnt.
0 1 Jetzt interpretiert der GTIA die erwähnten Nibbles als Helligkeitstufen. Dabei nimmt er die Farbe, die in Register COLBAK bzw. COLBAK@ steht und als Helligkeit die Bitkombination des jeweiligen Nibbles. Wenn der ANTIC beispielsweise den ANTICModus "F" (BASIC: "Graphics 8") benutzt, faßt der GTIA je 4 Bildpunkte zu einem eine Bildzeile hohen Streifen zusammen, der die Farbe aus COLBAK hat. Die Bitkombination der normalerweise erscheinenden vier Punkte bestimmt die Helligkeit des Streifens. Dieses Beispiel entspricht dem "BASIC-Gang 9".
1 0 Jetzt interpretiert der GTIA die Nibbles als Nummer eines Farbregisters. Da der GTIA aber nur über neun Farbregister verfügt, ist die Zahl der gleichzeitig darstellbaren Farben auf neun beschränkt. Wenn der ANTIC beispielsweise den Modus "F" benutzt, faßt der GTIA je vier Bildpunkte zu einem eine Bildzeile hohen Streifen zusammen. Das von dem jeweiligen Nibble (der Bitkombination der normalerweise erscheinenden vier Punkte) angewählte Farbregister bestimmt, aus welchem Farbregister Farbe und Helligkeit des Streifens stammen. Dieses Beispiel entspricht dem "BASIC-Gang 10".
1 1 Jetzt interpretiert der GTIA die Nibbles als Farbstufen. Dabei nimmt er die Helligkeit, die in Register COLBAK bzw. COLBAK@ steht. Die Farbe wird durch die Bitkombination des Nibbles gewählt. Dabei gilt die normale Farbtabelle. Wenn der ANTIC beispielsweise den Modus "F" benutzt, faßt der GTIA je vier Bildpunkte zu einem eine Bildzeile hohen Streifen zusammen. Dieser Streifen hat dann die Helligkeit aus Register COLBAK und die Farbe, die durch die Bitkombination, der normalerweise erscheinenden, vier Bildpunkte bestimmt wird. Dieses Beispiel entspricht dem "BASIC-Gang 11".

Durch diese Möglichkeiten des GTIA erhöht sich die Zahl der gleichzeitig auf dem Bildschirm darstellbaren Farben erheblich. Auch die Auflösung ist im Verhältnis zu der Anzahl der gleichzeitig darstellbaren Farben sehr hoch. Gerade Darstellungen für die Statistik oder Spiele lassen sich oft so aufbauen, daß es nicht weiter stört, daß der Bildschirm aus kurzen, einzeiligen Linien besteht.

Natürlich kann man praktisch jedes Bild, das vom ANTIC erzeugt wird, in der beschriebenen Art vom GTIA darstellen lassen. Gerade mit den Schriftmodi des ANTIC lassen sich sehr farbreiche Bilder erzeugen, die im Speicher nur wenig Raum verbrauchen, sich daher also schnell von der CPU verändern lassen. Dazu ist es aber notwendig, sich einen eigenen Zeichensatz zu definieren.

Eine weitere Möglichkeit, interessante Effekte zu erzielen und mehr Farben als üblich auf den Bildschirm zu bringen, ist der Wechsel von Farbregisterinhalten während einer ANTIC-Programm-Unterbrechung. Während der Unterbrechung trägt man in die Farbregister neue Werte ein. Auf diese Art kann man mehr Farben gleichzeitig auf dem Bildschirm darstellen, als Farbregister vorhanden sind. Auch die Betriebsart der GTIA läßt sich während einer ANTIC-Programm-Unterbrechung variieren.

Mit dem Basic-Befehl "SETCOLOR R,F,H" schreibt man in die Schattenfarbregister bestimmte Werte, die die Farbe und Helligkeit codiert enthalten (die "Codierung" wurde bereits beschrieben). Für die möglichen "R" im Befehl wird jeweils ein Schattenfarbregister angesprochen:

für R = 0: COLPF0@
für R = 1: COLPF1@
für R = 2: COLPF2@
für R = 3: COLPF3@
für R = 4: COLBAK@

Statt "SETCOLOR R,F,H" läßt sich auch

POKE (Adresse des Schattenfarbregisters), F * 16 + H

eingeben. Mit diesem Befehl ist auch die Wahl der Farbe der Farbregister für die Player-Missile-Grafik möglich, dies läßt sich mit dem "SETCOLOR"-Befehl nicht machen.


Die PLAYER-MISSILE-Grafik

Zu den wichtigsten Elementen bei Spielen gehören natürlich bewegliche Objekte. Bei herkömmlichen Systemen ist der Bildschirm ein einfacher Bereich des Speichers, der auf eine bestimmte Art auf den Monitor "projiziert" wird.

Ein auf dem Bildschirm zusammenhängendes Feld, das einen Spieler oder ein Geschoß darstellen soll, liegt im Speicher meist nicht direkt hintereinander. Zwischen den Informationen, die zu einem Spieler gehören, befinden sich Bytes, die zu den Bildteilen, die von einem Teil des Spielers in einer Zeile bis zum gleichen Spieler in der nächsten Zeile folgen, gehören. Dies muß bei jeder Operation mit einem Spieler beachtet werden. Die CPU muß also, wenn sie zum Beispiel das Aussehen eines Spielers ändern will, nur jedes soundsovielte Byte ändern. Dies bringt einen erheblichen Rechenaufwand mit sich.

Womöglich liegt ein Spieler auch noch halb in einem oder mehreren anderen Bytes, dann muß die CPU auch noch einzelne, zum Spieler gehörige und nicht zum Spieler gehörige Bits trennen. Dies bringt weiteren Rechenaufwand.

Zudem überdeckt jeder Spieler Bildteile oder wird von Bildteilen überdeckt. Jedes überdeckte Bildteil oder jeder überdeckte Spieler müssen nach dem Weiterbewegen natürlich wiederhergestellt werden. Also muß bei jedem Bildüberschreiben für einen Spieler zwischengespeichert werden, was gerade verdeckt wird.

Der gesamte Rechenaufwand läßt sich dadurch verringern, daß man die Spieler immer mehrere Punkte weit bewegt. Allerdings wirkt die Bewegung dann nicht mehr flüssig, sondern ruckend. Eine Lösung bringt die Einführung von Spielern und Geschossen, die nicht mehr per Software, sondern per Hardware eingeblendet werden. Auch Trefferkontrollen lassen sich hardwaremäßig leichter durchführen als per Software.

Bei den Atari-Geräten übernimmt dies die sogenannte PlayerMissile-Grafik. Wenn auch der Aufwand nicht auf Null absinkt und der Atari sicher auch nicht das einfachste Konzept für bewegliche Objekte hat, sollte man sich immer vor Augen halten, welche Operationen der CPU man einspart. Außerdem ist die Player-Missile-Grafik von Atari extrem flexibel.

Mit der Player-Missile-Grafik ist es möglich, bis zu vier Spieler und vier Geschosse in jedes beliebige Bild des ANTIC einzublenden. Diese Zahl läßt sich jedoch erhöhen, man kann auch mehrere Objekte mit einem Spieler oder einem Geschoß darstellen. Innerhalb von einer Zeile lassen sich jedoch nie mehr als vier Geschosse und vier Spieler darstellen.

Wenn zwei Objekte gemeinsam einen Spieler oder ein Geschoß "benutzen" sollen, können entweder ohne DMA, je nachdem welche Zeile des Bildes gerade aufgebaut wird, die Daten des einen oder des anderen Objekts in das Grafikregister geschrieben werden. Es ist aber auch mit DMA möglich, zwei Objekte durch einen Spieler darzustellen. Man muß lediglich in einer Bildzeile eine ANTIC-Programm-Unterbrechung auslösen und in der Unterbrechungsroutine das Register PMBASE (das Register ist im ANTIC-Kapitel beschrieben) auf die Basisadresse eines anderen Speicherfeldes legen.

Die Player-Missile-Grafik wird über das Register PMCNTL ein- und ausgeschaltet. Das Register PMCNTL befindet sich bei Adresse 53277 bzw. $d01d. Die einzelnen Bits des Registers haben folgende Funktionen:

Bit 0: Wenn dieses Bit auf "1" steht, ist die Übertragung der Grafikregister der Geschosse auf den Bildschirm eingeschaltet. Somit werden die Geschosse mit diesem Bit eingeschaltet.

Bit 1: Wenn dieses Bit auf "1" ist, ist die Übertragung der Grafikregister der Spieler auf den Bildschirm eingeschaltet. Somit werden die Spieler mit diesem Bit eingeschaltet.

Bit 2: Wenn dieses Bit auf "1" ist, können die Triggereingänge nur auf "0" gesetzt werden, das Loslassen einer Joystick-Feuertaste wird dadurch nicht mehr registriert. Damit ist das Speichern eines Tastendruckes auf eine der "Joystick-Feuertasten" möglich.

Die Farben der Spieler werden wie die Farben des Spielfeldes in Farbregistern gespeichert. Dabei haben immer ein Spieler und ein Geschoß gemeinsam ein Farbregister. Die Register sind in ihrer Funktion mit den anderen Farbregistern identisch. Die Register befinden sich an folgenden Adressen im Atari:

COLPM0 53266 $d012 Spieler/Geschoß 0
COLPM0@ 704 $2c0 (Schattenregister)

COLPM1 53267 $d013 Spieler/Geschoß 1
COLPM1@ 705 $2c1 (Schattenregister)

COLPM2 53268 $d014 Spieler/Geschoß 2
COLPM2@ 706 $2c2 (Schattenregister)

COLPM3 53269 $d015 Spieler/Geschoß 3
COLPM3@ 707 $2c3 (Schattenregister)

Die Form der Spieler wird in sogenannten Spieler- und Geschoßgrafikregistern abgelegt. Der GTIA unterstützt aber nur jeweils eine Bildzeile. Das heißt, daß nach jeder Zeile, sofern sich das Bild des Spielers zu dieser Zeile hin ändern soll, neue Daten in die Spieler- und Geschoßgrafikregister gebracht werden müssen. Dies läßt sich sowohl aus einem Assemblerprogramm heraus ausführen, als auch durch die ANTIC-DMA erledigen. Über die Benutzung der ANTIC-DMA gibt das Kapitel über den ANTIC Auskunft.

Für jeden Spieler ist ein Grafikregister vorhanden:

GRAFP0 53261 $d00d
GRAFP1 53262 $d00e
GRAFP2 53263 $d00f
GRAFP3 53264 $d010

Für die Geschosse ist ein gemeinsames Grafikregister vorhanden, in das die Daten aller Geschosse geschrieben werden:

GRAFPM 53265 $d011

Zu jedem Geschoss gehören zwei Bits in diesem Register:

Bit 0-1 Geschoß 1
Bit 2-3 Geschoß 2
Bit 4-5 Geschoß 3
Bit 6-7 Geschoß 4

Die Programmierung des Geschoßregisters ist etwas komplizierter als die Programmierung der Spielergrafikregister, da hier die einzelnen Bits der Geschosse zu einem Byte zusammengefügt werden müssen. Auch die DMA erleichtert diese Arbeit nicht. Aber trotzdem lassen sich Spiele auch mit dieser Form der Player-Missile-Grafik leichter programmieren, als völlig ohne Hardwarehilfe für bewegliche Objekte.

Die horizontale Position der Geschosse und Spieler wird ebenfalls in Register geschrieben. Der Registerinhalt besagt jeweils, beim wievielten Farbtakt einer Bildzeile angefangen wird, den Inhalt des Grafikregister (also das Objekt) auf den Bildschirm zu bringen.

Zu beachten ist aber, daß der linke Spielfeldrand je nach der Anzahl der Farbtakte pro Bildzeile, die man im ANTIC einstellen kann, bei verschiedenen Farbtakten liegt. Die Farbtakte vor dem eigentlichen Bild gehören zum Bildrand, der die Farbe aus COLBAK hat. Die ersten Farbtakte liegen normalerweise außerhalb des Fernseherbildes. Um Objekte unsichtbar zu machen, kann man sie ohne weiteres in diesen Bildbereich bewegen, man muß das Horizontalregister des Spielers nur auf Null setzen.

Für jeden Spieler und jedes Geschoß ist ein Horizontalregister vorhanden:

HPOSP0 53248 $d000 (Spieler 0)
HPOSP1 53249 $d001 (Spieler 1)
HPOSP2 53250 $d002 (Spieler 2)
HPOSP3 53251 $d003 (Spieler 3)

HPOSM0 53252 $d004 (Geschoß 0)
HPOSM1 53253 $d005 (Geschoß 1)
HPOSM2 53254 $d006 (Geschoß 2)
HPOSM3 53255 $d007 (Geschoß 3)

Außerdem gibt es ein weiteres Register, um die vertikale Position von Spielern und Geschossen zu beeinflussen: VDELAY 53276 $d01c

VDELAY wird benutzt, wenn man zweizeilige Auflösung gewählt hat, aber ein Objekt trotzdem in eine bestimmte Zeile bringen möchte. Durch eine "1" in einem Bit wird bewirkt, daß das entsprechende Objekt um eine Zeile nach unten gerückt wird. Das Register ist folgendermaßen belegt:

Bit 0 Geschoß 0
Bit 1 Geschoß 1
Bit 2 Geschoß 2
Bit 3 Geschoß 3

Bit 4 Spieler 0
Bit 5 Spieler 1
Bit 6 Spieler 2
Bit 7 Spieler 3

Die horizontale Größe der Objekte wird ebenfalls in Registern gespeichert. Die horizontale Größe ist die Anzahl der Farbtakte, die ein Objekt in einer Zeile einnimmt. Für jeden Spieler gibt es ein derartiges Register:

SIZEP0 53256 $d008 (Spieler 0)
SIZEP1 53257 $d009 (Spieler 1)
SIZEP2 53258 $d00a (Spieler 2)
SIZEP3 53259 $d00b (Spieler 3)

Die horizontale Größe wird durch Bit 0 und Bit 1 der Register bestimmt (die anderen Bits sind unbenutzt):

Bit1Bit0 Größe
0
0
Normalgröße, jedes Bit ist einen Farbtakt breit (ein Spieler ist also 8 Farbtakte breit).
0
1
Doppelte Größe, jedes Bit ist zwei Farbtakte breit (ein Spieler ist also 16 Farbtakte breit).
1
0
Normalgröße, jedes Bit ist einen Farbtakt breit (ein Spieler ist also 8 Farbtakte breit).
1
1
Vierfache Größe, jedes Bit ist vier Farbtakte breit (ein Spieler ist also 32 Farbtakte breit).


Die Größen der Geschosse werden dagegen in dem Register

SIZEM 53260 $d00c

gespeichert.

Je zwei Bits des Registers bestimmen die Größe eines Geschosses:

Bit 0-1 Geschoß 0
Bit 2-3 Geschoß 1
Bit 4-5 Geschoß 2
Bit 6-7 Geschoß 3

Die möglichen Bitkombinationen bewirken folgendes:

0
0
Normalgröße, jedes Bit ist einen Farbtakt breit (das Geschoß ist also zwei Farbtakte breit).
0
1
Doppelte Größe, jedes Bit ist zwei Farbtakte breit (das Geschoß ist also vier Farbtakte breit).
1
0
Normalgröße, jedes Bit ist einen Farbtakt breit (das Geschoß ist also zwei Farbtakte breit).
1
1
Vierfache Größe, jedes Bit ist vier Farbtakte breit (das Geschoß ist also acht Farbtakte breit).

Wenn Teile des Bildschirms die gleiche Bildschirmposition haben wie Spieler oder Geschosse, stellt sich die Frage, was im Vordergrund und was im Hintergrund dargestellt wird. Dies läßt sich durch das Register GTIACNTL (bzw. GTIACNTL@) bestimmen. Dieses Register ist aber auch noch für weitere Fuktionen zuständig. So bestimmen Bit 6 und 7 die GTIA-Betriebsart. Die ersten 4 Bits dienen der Prioritätskontrolle. Durch Setzen eines der 4 Bits wählt man eine Prioritätsfolge zwischen den Spielfeldfarben und den Spielern und Geschossen:

(Die Priorität FÄLLT von links nach rechts !)

Bit 0: P0, P1, P2, P3, PF0, PF1, PF2, PF3/P5, BAK

Bit 1: P0, P1, PF0, PF1, PF2, PF3/P5, P2, P3, BAK

Bit 2: PF0, PF1, PF2, PF3/P5, P0, P1, P2, P3, BAK

Bit 3: PF0, PF1, P0, P1, P2, P3, PF2, PF3/P5, BAK

Wenn mehr als eins der 4 Bits gesetzt ist, so sind die Prioritäten nicht eindeutig festgelegt. Es kommt zu Prioritätskonflikten zwischen den einzelnen Bildobjekten. Die "Überlappungszone" zwischen derartigen, in einem Prioritätskonflikt stehenden Objekten erscheint schwarz. Wenn man zum Beispiel Bit 0 und Bit 2 von GTIACNTL setzt, so wird P0 schwarz erscheinen, wenn er über PF1 gerät. Das gleiche geschieht auch mit P1, P2 und P3 wenn sie über PF1, PF2 und PF3/P5 geraten.

In den ANTIC-Modi mit einer Farbe und 40 Zeichen pro Zeile wird die Leuchtstärke eines Zeichens ohne Rücksicht auf die Priorität von PF1 bestimmt. Wenn ein Spieler oder ein Geschoß mit höherer Priorität ein derartiges Zeichen überdeckt, so wird die Farbe dieser Zone von der Spielerfarbe bestimmt.

Die beiden verbleibenden Bits von GTIACNTL haben folgende Funktionen:

Bit 4: Wenn dieses Bit gesetzt ist, haben alle Geschosse die Farbe, die in COLPF3 steht (Farbe von PF3). Dadurch können die Geschosse auch zu einem fünften Spieler (P5) zusammengefaßt werden.

Bit 5: Das Setzen dieses Bits ermöglicht es, auch mehrfarbige Spieler abzubilden. Dabei werden Spieler 0 und Spieler 1 sowie Spieler 2 und Spieler 3, sofern sie sich überlappen, miteinander verknüpft. Die Priorität gilt dann nur noch bedingt. Es können die Farben beider Spieler erscheinen. Je nachdem, welches Bit welches Spielers gesetzt ist, erscheint eine von drei Farben (zwei Farben der Spieler und die Farbe unter den Spielern) auf dem Bildschirm .

Besonders bei Spielen ist es interessant, festzustellen ob es "Zusammenstöße" zwischen Spielern und Geschossen mit anderen Spielern, Geschossen und Bildteilen gab. Der GTIA besitzt insgesamt 16 Register, die ein Programm abfragen kann, um derartige Kollisionen zu erkennen.

Für jedes Geschoß gibt es ein Register, das Kollisionen zwischen dem jeweiligen Geschoß und den Spielfeldfarben speichert:

KOLM0PF 53248 $d000
KOLM1PF 53249 $d001
KOLM2PF 53250 $d002
KOLP3PF 53251 $d003

Ein Bit dieser Register signalisiert dadurch, daß es auf "1" steht, daß es eine Kollision zwischen dem Geschoß, dem das Register zugeordnet ist und der jeweiligen Spielfeldfarbe gab:

Bit 0 : Kollision mit PF0
Bit 1 : Kollision mit PF1
Bit 2 : Kollision mit PF2
Bit 3 : Kollision mit PF3
Bit 4-7 : unbenutzt (stehen auf "0")

Es gibt auch für jeden Spieler ein Register, das einen Zusammenstoß zwischen dem jeweiligen Spieler und einer Spielfeldfarbe signalisiert:

KOLP0PF 53252 $d004
KOLP1PF 53253 $d005
KOLP2PF 53254 $d006
KOLP3PF 53255 $d007

Ein Bit dieser Register signalisiert daurch, daß es auf "1" steht, daß eine Kollision zwischen dem Spieler, dem das Register zugeordnet ist und der jeweiligen Bildschirmfarbe stattgefunden hat:

Bit 0 : Kollision mit PF0
Bit 1 : Kollision mit PF1
Bit 2 : Kollision mit PF2
Bit 3 : Kollision mit PF3
Bit 4-7 : unbenutzt (stehen auf "0")

Desweiteren gibt es für jedes Geschoß ein Register, das signalisiert, ob es Kollisionen des jeweiligen Geschosses mit einem Spieler gab:

KOLM0P 53256 $d008
KOLM1P 53257 $d009
KOLM2P 53258 $d00a
KOLM3P 53259 $d00b

Ein Bit dieser Register signalisiert dadurch, daß es auf "1" steht, daß eine Kollision des Geschosses, dem das jeweilige Register zugeordnet ist, mit dem jeweiligen Spieler stattgefunden hat:

Bit 0 : Kollision mit Spieler 0 (P0)
Bit 1 : Kollision mit Spieler 1 (P1)
Bit 2 : Kollision mit Spieler 2 (P2)
Bit 3 : Kollision mit Spieler 3 (P3)
Bit 4-7 : unbenutzt (stehen auf "0")

"Last but not least" gibt es für jeden Spieler ein Register, dessen Bits Zusammenstöße mit anderen Spielern signalisieren:

KOLP0P 53260 $d00c
KOLP1P 53261 $d00d
KOLP2P 53262 $d00e
KOLP3P 53263 $d00f

Ein Bit dieser Register signalisiert, daß ein Zusammenstoß zwischen dem Spieler, dem das Register zugeordnet ist und einem anderen Spieler stattgefunden hat. Das "eigene" Bit im jeweiligen Register steht immer auf "0".

Bit 0 : Kollision mit Spieler 0 (P0)
Bit 1 : Kollision mit Spieler 1 (P1)
Bit 2 : Kollision mit Spieler 2 (P2)
Bit 3 : Kollision mit Spieler 3 (P3)
Bit 4-7 : unbenutzt (stehen immer auf "0")

Eine Kollision wird in dem Moment markiert, in dem die Position, an der die Kollision stattfindet, auf dem Bildschirm abgebildet wird. Direkt nach dem Einschreiben in die Positionsregister hat zwar genaugenommen die Kollision schon stattgefunden, durch die interne Struktur des GTIA ist es aber zu diesem Zeitpunkt noch nicht möglich, die Kollision zu bemerken.

Die Bits in den Kollisionsregistern bleiben so lange gesetzt, bis in ein "Löschregister" irgendein Wert geschrieben wird. Die einzelnen Bits dieses Registers haben keine weitere Funktion. Es ist also wirklich völlig egal, welcher Wert in das Register

HITCLR 53278 $d01e

geschrieben wird.

Die Kollision ist also unter Umständen auch noch in dem Moment gespeichert, in dem die Objekte sich bereits wieder an anderen Stellen befinden. Auf diese Art kann man die Bewegungen der Objekte auch in Unterbrechungsroutinen ausführen, die Abfrage aber erst später im Hauptprogramm machen.


Wie benutzt man die Player-Missile-Grafik nun konkret?

Zuerst muß man sich entscheiden, ob man die Objekte durch den DMA des ANTICs darstellen läßt oder direkt aus einem Assemblerprogramm in die Grafikregister des GTIA schreibt. Gewöhnlich wird man den DMA benutzen, da man ansonsten sehr genau darauf achten muß, welche Zeile gerade abgebildet wird. Der Aufand, der entsteht, wenn man ohne DMA mit der Player-Missile-Grafik arbeitet, ist nur sehr selten zu rechtfertigen.

Sofern man die Player-Missile-Grafik mit dem DMA benutzt, muß man sich einen freien Speicherbereich im Atari suchen. Gewöhnlich liegt ganz "oben" im freien Arbeitsspeicher der Bildschirmspeicher. Direkt darunter wird man gewöhnlich das ANTIC-Programm ansiedeln. Es empfiehlt sich, unter dem ANTIC-Programm das Speicherfeld für den Player-Missile-DMA unterzubringen. Falls man weitere Speicherfelder für die Player-Missile-Grafik anlegt, sollte der Speicher weiter von oben nach unten gefüllt werden. Die Adresse des Speicherfeldes für den Player-Missile-DMA muß dem ANTIC über das Register PMBASE mitgeteilt werden. Bei der Wahl der Speicherbereiche der Player-Missile-DMA ist jedoch zu beachten, daß, wie schon erwähnt, immer an einer 1K-Byte bzw. 2K-Byte Grenze beginnen müssen.

Die horizontale Spielerbewegung läßt sich direkt durch ein Verändern der Positionsregister im GTIA erreichen. Um eine vertikale Spielerbewegung zu bewirken, muß man die Bytes des Spielers oder die einzelnen Bits des Geschosses durch das Speicherfeld für den Player-Missile-DMA bewegen. Dafür sollte man sich jeweils Unterprogramme schaffen. Die Unterprogramme dafür sind jedoch relativ einfach, da der Speicherbereich für einen Spieler oder ein Geschoß nie mehr als 256 Bytes hat, also nie größer ist, als der größte mit einem Prozessorregister (Register A,X oder Y) darstellbare Wert. Die 16 Bit Operationen, die ohne Player-Missile-Grafik nötig wären, entfallen also weitestgehend.

Jetzt sollte der Speicherbereich für die Player-MissileGrafik gelöscht werden. Außerdem müssen die Horizontalpositionen und Größen der Spieler, sowie der Grad der vertikalen Auflösung im ANTIC bzw. GTIA festgelegt werden. Die Spielerfarben werden in die Register COLPM0@ bis COLPM3@ (Schattenregister von COLPM0 bis COLPM3) eingetragen.

Ganz zuletzt sollte man den Player-Missile-DMA (mit Register DMACNTL) und die Player-Missile-Grafik (mit Register PMCNTL) einschalten; so treten keine Störungen auf dem Bildschirm während der Initialisierung auf.