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