----------------------------------------------------

Kapitel 3

Indirekte Graphik Adressierung

(Farbregister & Zeichensätze)

----------------------------------------------------

 

Indirekte Adressierung ist eine leistungsstarke Möglichkeit, die aber für den Programmieranfänger schwer zu verstehen ist. Im Assembler des 6502s besteht eine Auswahl zwischen 3 verschiedenen Stufen der indirekten Adressierung. Die erste und einfachste (direkteste) Stufe ist die direkte Adressierung, bei welchem die zu ladende Zahl selbst angegeben wird:

 

          LDA #$FA

 

Die zweite Stufe (indirekte Adressierung) liegt vor, wenn das Programm auf eine Speicheradresse verweist, welche die zu verwendende Zahl enthält:

 

          LDA $0602

 

Die dritte und zugleich höchste Stufe der indirekten Adressierung beim 6502 wird erreicht, sobald das Programm auf ein Paar von Speicherstellen verweist, die zusammen die Adresse enthalten, in welcher wiederum die zu benutzende Zahl steht. Die Möglichkeiten der Anweisung werden beim 6502-Assembler durch das Anfügen eines Indexes vergrößert:

 

          LDA ($DO),Y

 

Je höher die Stufe der indirekten Adressierung ist, desto allgemeiner und damit leistungsfähiger ist sie. Anstelle jedesmal die gleichen Zahlen einzeln laden zu müßen, kann der Programmierer durch einfaches ƒndern eines Zeigers ganze Datenblöcke lesen lassen. Indirekte Adressierung ist offenbar eine wichtige Möglichkeit beim Programmieren.

 

Indirekte Graphik-Adressierung ist auf zwei Arten im ATARIîTMî Personal Computer System realisiert: durch Farbregister und durch Zeichensätze. Benutzer, die zum ersten Mal mit diesem Gerät arbeiten, nachdem sie auf anderen Maschinen programmiert haben, denken oft in direkten Farbformen. Eine Farbe ist zwar ein andaürnder Wert, ein Farbregister jedoch funktioniert auch indirekt; es kann jeden Farbwert enthalten. Ein Farbregister ist flexibler als eine Farbe, allerdings auch schwerer zu handhaben.

 

Es gibt im ATARI Computer System 9 Farbregister; vier davon werden für Player-Missile-Graphiken benutzt, welche in Kapitel 4 besprochen werden. Von den 5 übrigen Registern werden nicht immer alle benutzt; die verwendete Anzahl hängt vom Graphik-Modus ab. Im BASIC-Modus 0 werden nur 1 O Farbregister benutzt, da der Farbwert der Buchstaben (und Zeichen) ignoriert wird; Buchstaben besitzen die Farbe, die durch Playfield-Register 2 angegeben wird, bekommen  aber ihren Helligkeitswert aus Register 1. Die Farbregister befinden sich bei den Adressen $D016 bis $D01A des CTIA. Sie werden vom OS während der Vertical Blanks in den RAM-Bereich übertragen. Abbildung 3.1 zeigt Hardware- und Schatten-Adressen der einzelnen Farbregister.

 

 

Beeinflußtes   Hardware-            Schatten-

Objekt         Adresse              Adresse

 

               LABEL     ADRESSE   LABEL     ADRESSE

 

Player    0    COLPMO    D012      PCOLR0    2C0

Player    1    COLPM1    D013      PCOLR1    2C1

Player    2    COLPM2    D014      PCOLR2    2C2

Player    3    COLPM3    D015      PCOLR3    2C3

 

Playfield 0    COLPFO    D016      COLOR0    2C4

Playfield 1    COLPF1    D017      COLOR1    2C5

Playfield 2    COLPF2    D018      COLOR2    2C6

Playfield 3    COLPF3    D019      COLOR3    2C7

Hintergrund    COLBK     D01A      COLOR4    2C8

 

Abbildung 3.1:

Farbregister-Label und -Adressen

 

In den meisten Fällen kontrolliert der Benutzer die Farbregister, indem er in ihre SCHATTEN-Adresse schreibt. Es gibt lediglich zwei Situationen, in denen der Programmierer direkt in die CTIA-Adressen schreiben würde: beim Display List Interrupt (siehe Kapitel 5), oder beim Abschalten der Vertical-Blank-Interrupt-Routinen des OS. Geschieht dieses, werden die Werte nicht mehr automatisch in die CTIA-Register übertragen. Vertical Blank Interrupts sind das Thema von Anhang I.

 

Farben werden über eine einfache Formel in die Farbregister codiert. Das obere Nybble nennt den Farbwert, der identisch zum zweiten Parameter des SETCOLOR-Befehls in BASIC ist. Tabelle 9.3 des BASIC-Referenz Manuals listet die Farbwerte auf. Das untere Nybble des Farbregisters gibt den Helligkeitswert an. Dieser entspricht dem dritten Parameter des SETCOLOR-Kommandos. Das niederwertigste Bit dieses Nybbles hat keine Bedeutung, so daß es für jede Farbe 8 Helligkeitswerte gibt. Daraus ergibt sich eine Gesamtzahl von 128 Farben, unter denen sich der Benutzer entscheiden kann (8 Helligkeits-Stufen mal 16 Farben). In diesem Buch bezeichnet das Wort ÑFarbeî eine Farb-Helligkeits-Kombination.

 

Sobald eine Farbe in einem Register codiert wurde, wird sie auf den Schirm gebracht, indem auf das Farbregister verwiesen wird, das diesen Farbwert enthält. In Map-Modi, bei denen 4 Farben angezeigt werden, bestimmen die Bilddaten, welches Farbregister auf dem Schirm geworfen werden soll. Da es vier Register gibt, werden nur zwei Bits zur Definierung eines Pixels benötigt. Dieses wiederum bedeutet, daß jedes Byte der Bildschirmdaten 4 Pixel festlegt. Die Werte in jedem Bit-Paar legen das Farbregister fest, welches die Farbe für das entsprechende Pixel liefert.

 

In Text-Modi (BASIC-Modi 1 und 2) wird die Auswahl des Farbregisters durch die zwei obersten Bits des Zeichencodes getroffen. Dieses läßt andererseits nur 6 Bits zur Auswahl des Zeichens über. Daher stehen bei diesen beiden Modi nur 64 Zeichen anstelle von 128 + Inversen zur Verfügung.

 

Indirekte Farbadressierung liefert dem Programmierer vier spezielle Möglichkeiten. Erstens kann er zwischen 128 verschiedenen Farben für seine Displays wählen. Es gibt also sicherlich einen Farbton, der seinen Wünschen entspricht bzw. nahekommt.

 

Zweitens kann der Programmierer die Farbregister in Echtzeit manipulieren, woraus sich hübsche Effekte ergeben können. Die folgende BASIC-Zeile zeigt hierfür ein einfaches Beispiel:

 

FOR I=0 TO 254 STEP 2:POKE 712,I:NEXT I

 

Diese Zeile bewirkt, daß die Randfarbe alle Farbtöne durchläuft. Der Effekt ist sehr ansprechend und zieht sicherlich die Aufmerksamkeit des Benutzers an. Diese grundlegende Technik kann auf eine Vielzahl von Arten erweitert werden. Eine spezielle Variation hiervon ist die einfache zyklische Animation, indem zuerst eine Figur gezeichnet wird. Die Animation wird dann durch ƒnderung der zugehörigen Farbregister realisiert. Das folgende Programm verdeutlicht die Idee:

 

10 GRAPHICS 23

20 FOR X=0 TO 39

30 FOR I=0 TO 3

40 COLOR I

50 PLOT 4*X+1,0

60 DRAWTO 4*X+I,95

70 NEXT I

80 NEXT X

90 A=PEEK(712)

100 POKE 712,PEEK(710)

110 POKE 710,PEEK(709)

120 POKE 709,PEEK(708)

130 POKE 708,A

140 GOTO 90

 

Die dritte Verwendung von Farbregistern ist die Zuordnung bestimmter Farben zu bestimmten Situationen. Bei einem seitenmäßig angelegten Menü kann z.B. die Hintergrundfarbe geändert werden, wenn auf eine andere Menüseite gegangen wird. Der Bildschirm kann außerdem rot blinken, wenn eine nicht zuläßige Taste gedrückt wurde. Die Verwendung von Farbbuchstaben der BASIC-Modi 1 und 2 können die Wirkung und ‹bersichtlichkeit eines Textes erhöhen. Es ist möglich, eine Rechnung rot ausgeben zu lassen, wenn ihr Ergebnis negativ ist; bei einem positiven Resultat könnte sie in schwarz ausgedruckt werden. Es ist auch denkbar, wichtige Wörter oder Sätze eines Textes in speziellen Farben auszugeben, damit sie sich von den anderen abheben.

 

Die Wirkung von Graphiken in Map-Modi (kein Text) wird durch die Benutzung von Farben ebenfalls verbessert. Verschiedene Versionen eines Objektes könnten durch unterschiedliche Färbung des gleichen Bildes erreicht werden. Es wird relativ viel RAM benötigt, um ein Bild zu speichern, aber wenig, um die Farbe eines schon vorhandenen Bildes zu ändern. Es ist z.B. einfacher, drei verschiedene Boote zu zeigen, indem dreimal das gleiche Boot in anderen Farben gezeigt wird, als wenn drei unterschiedliche Bootsformen gezeigt werden.

 

Die vierte und wichtigste Verwendung von Farbregistern besteht in der Verbindung mit Display List Interrupts. Ein einzelnes Farbregister kann dabei zum Anzeigen von bis zu 128 verschiedenen Farben auf einem Bildschirm benutzt werden. Diese wichtige Möglichkeit wird in Kapitel 5 besprochen.

 

 

ZEICHENSƒTZE

 

Indirekte Adressierung liegt auch bei der Neudefinition eines Zeichensatzes vor. Im ROM befindet sich zwar ein standardmäßiger Zeichensatz, aber es gibt keinen Grund, warum ausgerechnet dieser immer benutzt werden muß. Der Benutzer ist in der Lage, jeden beliebigen Zeichensatz zu entwerfen und vom Computer anzeigen zu lassen. Dazu sind drei Schritte erforderlich. Als erstes muß der Programmierer natürlich einen Zeichensatz entwerfen, was auch der zeitraubendste Vorgang ist. Jedes Zeichen wird auf dem Bildschirm in einem 8x8-Gitter angezeigt; im Speicher ist es als eine 8-Byte-Tafel codiert. Abbildung 3.2 zeigt die Codierungs-Anordnung:


 

Zeichen                   Binär-         Hexadezimale-

                          Darstellung    Darstellung

 

          00000000             00

          00011000             l8

          00111100             3C

          01100110             66

          01100110             66

          01111110             7E

          01100110             66

          00000000             00

 

 

Abbildung 3.2:

Codierung des Buchstaben "A''

 

 

Ein vollständiger Zeichensatz besteht aus 128 Zeichen, jeweils normal und invertiert (d.h. Nullen werden zu Einsen und umgekehrt). Ein solcher Zeichensatz benötigt 1024 Bytes und muß bei einer 1K-Grenze beginnen. Die Zeichensätze der BASIC-Modi 1 und 2 bestehen aus nur 64 verschiedenen Zeichen. Daher brauchen sie nur die Hälfte der oben angegebenen Speichermenge - 512 Bytes. Dieser Zeichensatz muß bei einer OK-Grenze beginnen. Die ersten 8 Bytes legen den ersten Buchstaben fest, die nächsten 8 Bytes den zweiten usw. Das Definieren eines neuen Zeichensatzes ist offensichtlich eine umfangreiche Arbeit. Hierfür gibt es aber glücklicherweise schon Software auf dem Markt, die diese Arbeit erleichtert.

 

Sobald ein Zeichensatz definiert und in¥s RAM gebracht wurde, muß dem ANTIC-Prozessor mitgeteilt werden, wo dieser sich befindet. Dieses geschieht, indem die Seitennummer (page) der Start-Adresse des Zeichensatzes in die Speicherstelle $D409 (dezimal 54281) geschrieben wird. Die Schattenadresse, welche normalerweise verwendet wird, trägt die Bezeichnung CHBAS und liegt bei $2F4 (dezimal 756). Der dritte Schritt beim Benutzen eigener Zeichensätze besteht in der Ausgabe des Zeichens auf dem Bildschirm. Dieses kann wie gewöhnlich durch einfache PRINT-Befehle in BASIC oder durch direktes Schreiben von Daten in den Bereich der Bildschirmspeichers geschehen.

 

Eine spezielle  Möglichkeit des Systems, die in BASIC nicht verfügbar ist, besteht in den 4-Farb-Zeichen-Modi (bei der XL-Serie sind diese Modi verfügbar). Die BASIC-Modi 1 und 2 liefern zwar 5 Farben aber jeder Buchstabe ist zweifarbig; er besitzt eine Vordergrund- und eine Hintergrundfarbe. Die Vordergrundfarbe kann eine der vier möglichen Farben sein, wobei aber pro Zeichen nur eine ausgewählt werden kann.

 

Dieses ist ein Hindernis bei der Erstellung von Zeichensatz-Graphiken, z. B. bei geographischen Karten. Es gibt

allerdings noch zwei weitere Text-Modi, die speziell für solche Fälle vorgesehen sind. Es sind die ANTIC-Modi 4 und 5. Jedes Zeichen hat bei diesen Modi nur eine Breite von vier Pixeln, aber jedes Pixel kann eine von vier Farben annehmen (einschließlich Hintergrund). Die Zeichen werden genau wie BASIC-Modus 0 definiert, wobei aber jedes Pixel doppelte Breite und zwei Bits zum Festlegen der Farbe besitzt. Anders als bei den ANTIC-Modi 6 und 7 (BASIC-Modi 1 und 2) wird die Auswahl des Farbregisters nicht durch die einzelnen Bitpaare innerhalb eines Zeichens getroffen. Jedes Byte der Zeichentabelle wird in 4 Bitpaare aufgespalten, von denen jedes die Farbe für den zugehöriges Pixel bestimmt (aus diesem Grunde gibt es waagerecht nur 4 Pixel in jedem Zeichen). Das höchste Bit des Zeichennamens (D7) modifiziert das benutzte Farbregister. Diese Auswahl wird in Abbildung 3.3 dargestellt:

 

 

               Bitpaar   D7=0      D7=1

               00        COLBAK    COLBAK

               01        PF0       PFO

               10        PF1       PF1

               11        PF2       PF3

 

     Abbildung 3.3

Farbregister-Auswahl bei 4-Farb-Zeichen

 

 

 

Durch  Benutzen dieser Text-Modi können vielfarbige Zeichen-Graphiken auf den Bildschirm gebracht werden.

 

Ein weiterer interessanter ANTIC-Zeichen-Modus ist der Kleinbuchstaben-Unterlängen-Modus (ANTIC-Modus 3). Dieser Modus zeigt 10 Scan-Lines in einer Mode-Line an, da Buchstaben aber nur 9 Bytes senkrecht benutzen, ist anzunehmen, daß die unteren beiden Reihen leer sind. Dies trifft zu, solange das angezeigte Zeichen aus den drei ersten Vierteln des Zeichensatzes stammt. Steht das Zeichen aber im letzten Viertel, so bleiben die oberen beiden Scan-Lines leer und die normalerweise dort hingehörenden Daten werden in den unteren beiden Scan-Lines angezeigt. Dieses gestattet dem Benutzer das Entwerfen von Kleinbuchstaben mit Unterlängen (z.B. Ñgî & Ñyî).

 

Durch indirekte Zeichensatz-Adressierung ergeben sich interessante und nützliche Möglichkeiten. Die offensichtlichste Anwendung ist der modifizierte Schriftsatz. Ein neuer Zeichensatz gibt einem Programm ein eigenes Gesicht. Es ist z.B. möglich, einen griechischen, kyrillischen oder einen anderen Schriftsatz aufzustellen. Außerdem kann der Benutzer graphische Zeichensätze einsetzen. Das ÑENERGY CZARîTMîî-Programm benutzt einem neudefinierten Zeichensatz um Balkendiagramme anzeigen zu können. Ein Zeichen umfaßt 9 Pixel; das bedeutet, daß Balkendiagramme mit normalen Zeichen nur eine grobe Auflösung von jeweils 8 Pixeln besitzen. Bei ENERGY CZAR wurde ein Zeichensatz entworfen, bei dem die normalerweise weniger benutzten Symbole (Ñ#", Ñ$î usw.) durch spezielle Zeichen für ein  Balkendiagramm ersetzt werden. Ein solches Zeichen wurde zu einem Ein-Pixel-Balken, ein weiteres zu einem Zwei-Pixel-Balken usw. bis zum 8-Pixel-Balken. So ist es dem Programm möglich, detaillierte Balkendiagramme zu zeichnen, die eine Auslösung von maximal einem Pixel besitzen. Abbildung 3.4 zeigt ein typisches Bild dieses Programms. Es scheint, als ob Text- mit Graphik-Modi gemischt wurden; in Wahrheit besteht das gesamte Display aus Zeichen.

 

 

 

Abbildung 3.4

Balkendiagramm des "ENERGY CZAR™"-Programms

 

 

Es gibt viele Möglichkeiten, bei denen Zeichensätze geschaffen und benutzt werden können, um spezielle Bilder zu zeigen. Man könnte z. D. einen Zeichensatz für Landschaften entwerfen, der jeweils Zeichen für Flüsse, Wälder, Berge usw. enthält. Mit diesem Satz wäre es dann machbar, Karten jedes Gebietes auf der Erde aufzubauen. Gleiches gilt auch für andere Planeten. Mit ein wenig Phantasie ist die Erstellung eines hierfür benötigten Zeichensatzes möglich.

 

Beim Aufbauen solcher Landschafts-Zeichensätze sollte für jeden Oberflächentyp 5 bis 8 verschiedene Zeichen entworfen werden. Dadurch wird ein eintöniges Aussehen der Karte vermieden, das charakteristisch für einfache Graphiken dieser Art ist. Die meisten Menschen werden nicht bemerken, daß eine Karte, die mit verschiedenen Variationen eines Oberflächentyps ausgestattet ist, mit einem Zeichensatz anstelle von Graphik erstellt worden ist.

 

 

Die Schwarz-weiße Abbildung wird dem Original allerdings nicht gerecht, welches z.B. bis zu 19 verschiedene Farben gleichzeitig enthält.

 

 

Abbildung 3.5

Animation mit Zeichensatz-Graphik

 

 

Es wäre möglich, einen Elektronik-Zeichensatz zu entwerfen, der Symbole für Transistoren, Dioden, Spulen usw. enthält. Mit einem solchen Zeichensatz könnten elektrische Schaltkreise aufgebaut werden. Gleiches wäre mit einem Architektur-Zeichensatz für Wohnraumgestaltung machbar. Die Möglichkeiten für Zeichensatz-Graphiken sind schier unerschöpflich.

 

Zeichen können auf den Kopf gestellt werden, indem eine vier in die Adresse 755 geschrieben wird. Diese Möglichkeit wäre z.B. beim Anzeigen von Spielkarten auf dem Bildschirm nützlich. Die obere Hälfte einer Karte würde richtig herum stehen, die untere Hälfte auf dem Kopf. Dieser Trick könnte auch beim Anzeigen von Spieleffekten Anwendung finden (z.B. Seen, Swimmingpools usw.).

 

Eine weitere leistungsstarke Anwendung von Zeichensätzen besteht im Wechseln zwischen mehreren Sätzen, während das Programm läuft. Ein Zeichensatz braucht entweder 512 oder 1024 Bytes. In beiden Fällen ist es relativ Ñbilligî (im Bezug auf den benötigten Speicher), mehrere Zeichensätze im RAM zu haben und zwischen ihnen zu wechseln. Es gibt drei Geschwindigkeitsstufen für solches Zeichensatz-"Multiplexing": menschlich langsam (länger Aus als 1 Sekunde), menschlich schnell (eine 60stel Sekunde bis 1 Sekunde), maschinenmäßig schnell (schneller als ein 60stel Sekunde).

 

Menschlich langsames Zeichensatz-Multiplexing ist sinnvoll beim ƒndern von Szenen. Ein Raumfahrt-Programm könnte z.B. verschiedene Zeichensätze für Planeten und Weltraum haben. ƒndert der "reisende" Benutzer den Standort, wechselt das Programm den Zeichensatz. Besonders praktisch ist diese Methode bei sogenannten "Adventure"-Spielen, bei denen die Position des Spielers relativ häufig wechselt.

 

Menschlich schnelles Multiplexen ist an erster Stelle sinnvoll für Animation. Dieses kann auf zwei Arten geschehen: entweder werden die Zeichen innerhalb eines Zeichensatzes geändert, oder der gesamte Zeichensatz wird gewechselt. Das ÑSPACE-INVADERS (Warenzeichen der Taito America Corp.)"-Programm auf dem ATARI Computer benutzt die erste Technik. Die Gegner sind in Wahrheit alles Zeichen, die durch rasches Wechseln animiert werden. Da es nur 6 verschiedene Monster mit 4 Darstellungen gibt, ist dieses relativ einfach.

 

Ist jedes Zeichen eine leicht geänderte Variation des gleichen Objektes, so durchläuft dieses eine Animations-Sequenz, sobald zwischen den Zeichen gewechselt wird. Auf diese Art kann ein ganzer Bildschirm mit Objekten in Bewegung gebracht werden. Befinden sich die Zeichensätze einmal im Speicher, so ist es lediglich erforderlich, die folgende Programmschleife durchlaufen zu lassen:

 

 

1000 FOR I=l TO 10: REM ANZAHL DER ZEICHENSÄTZE

1010 POKE 756, CHARBASE(I):REM ADRESSE DES JEWEILIGEN SATZES

1020 NEXT I

1030 GOTO 1000

 

 

Computermäßig schnelle Zeichensatz-Animation wird benutzt, um mehrere verschiedene Zeichensätze auf einen Bildschirm zu bringen. Dabei wird die Display List Interrupt-Möglichkeit des Gerätes angewandt, die in Kapitel 5 besprochen wird.

 

Die Benutzung von Zeichensätzen für Grafik und Animation besitzt viele Vorteile und nur wenige Einschränkungen. Der größte Vorteil ist, daß nur wenig RAM gebraucht wird, um detaillierte Displays zu produzieren. Ein Graphik-Display, das BASIC-Modus-2-Zeichen verwendet (wie in Abbildung 3.5 gezeigt), kann besser Details und Farbe anzeigen, als ein Display im BASIC-Modus 7. Außerdem benötigt das Bild aus Zeichen 200 Bytes, wogegen das Map-Modus-Display ganze 4000 Bytes verbraucht.

 

Für jeden Zeichensatz werden 512 Bytes des Speichers benötigt. Aus diesem Grund ist es praktischer, mehrere Zeichensätze gleichzeitig im RAM zu haben. Schirmmanipulationen mit Zeichensätzen sind schneller, da nur wenige Datenz zu verändern sind. Natürlich sind Zeichensatz-Graphiken nicht so flexibel wie Map-Modus Graphiken, da nicht alles überallhin auf den Bildschirm gebracht werden kann. Dieses unterbindet die Verwendung von Zeichensätzen in bestimmten Fällen. Andererseits gibt es viele Fälle, in denen eine nur geringe Anzahl von Figuren an festen Positionen gezeigt werden muß. Hierbei sind Zeichensätze von einzigartigem Nutzen.