
Grafik-Kurs Teil 4c
Sollten Sie jetzt immer noch nicht durch
dieses recht komplizierte System des
Grafikaufbaus durchgestiegen sein, so
macht das auch nichts. Gleich werden wir
lernen, wie der Grafikbildschirm ein-
und ausgeschaltet wird. Wenn Sie das
einmal können (und das ist sehr ein-
fach), dann können Sie ja einmal ein
wenig herumexperimentieren - nur Öbung
macht halt den Meister...
Doch nun zu den begehrten Befehlen, um
den Grafikbildschirm einzuschalten. Wie-
dereinmal handelt es sich hierbei um ein
paar POKEs, mit denen wir einige Regi-
ster im VIC verändern, so daß der uns
die Grafik dann darstellt.
Zum Einen brauchen wir hierfür das
Steuerregister 1, in Register 17 des
VIC. Neben einigen anderen Dingen (zu
denen wir später, beim Zeichensatz kom-
men) können wir hier nämlich den Grafik-
modus einschalten. Bit 5 dieses Regi-
sters ist hierfür zuständig. Ist es
gelöscht (=Binär 0), so ist der Grafik-
modus aus-, ist es gesetzt (=Binär 1) so
ist er eingeschaltet. Demnach müssen wir
es einfach mit Hilfe des OR-Operators
setzen (sie erinnern sich an den Anfang
dieses Kurses...) - Bit 5 hat den dezi-
malwert 32, also:
POKE V+17,PEEK(V+17) OR 32
Analog müssen wir es zum Ausschalten
wieder löschen. Dies geht entweder, in-
dem man direkt das Komplement von 32
bildet (255-32=223) und es dann mit Hil-
fe des AND-Operators mit Register 17
verknüpft; oder man kombiniert ganz ein-
fach AND mit NOT (das hatten wir auch
schon), was ja dasselbe ergibt, also:
POKE V+17,PEEK(V+17) AND 223
oder auch:
POKE V+17,PEEK(V+17) AND NOT 32
Alle POKE-Befehle, die ich eben nannte
müssen natürlich die Voraussetzung
erfüllen, daß Sie vorher die Variable
"V" mit der Basisadresse des VIC initia-
lisiert (also: V=53248) haben - das hat-
ten wir ja auch schon im ersten Teil des
Grafikkurses.
Soviel zum Einschalten des Grafikbild-
schirms. Doch das ist leider noch nicht
alles. Um nämlich wirklich den Speicher-
bereich von 8192 bis 16191 auf dem Bild-
schirm zu sehen, müssen wir dem VIC noch
eine weitere Information geben. Diese
ist in seinem 24. Register beinhaltet.
Bit 3 in diesem Register gibt ihm unter
anderem (nämlich dann, wenn der Grafik-
modus eingeschaltet ist - im Normalmodus
hat es wieder eine andere Funktion zu
der wir ebenfalls später kommen werden)
an, welcher Speicherbereich als HIRES-
Grafik dargestellt werden soll. Ist es
gelöscht (und das ist im normalerweise
der Fall), so heißt das für den Grafik-
chip unseres 64ers, daß er den Speicher-
bereich von 0 bis 7999 als HIRES-Grafik
darstellen soll. Damit wir aber auch den
zweiten Grafikbereich von 8192 bis 16191
(denn diesen Bereich nutzen wir ja) se-
hen können, müssen wir das 3. Bit im
Register 24 setzen. Dann zeigt uns VIC
nämlich diesen Bereich an. Auch dies
geht mit dem OR-Operator, nämlich so:
POKE V+24,PEEK(V+24) OR 8
Beim Ausschalten des Grafikmodus müssen
wir neben der Grafik-Ausschalt-Anweisung
von oben ebenfalls dieses Bit wieder
löschen, sonst zeigt VIC keine Buchsta-
ben mehr auf dem Bildschirm an (das hat
etwas mit der schon erwähnten zweiten
Funktion des 3. Bits zu tun). Zum Aus-
schalten schreiben wir also:
POKE V+24,PEEK(V+24) AND 247
oder einfacher:
POKE V+24,PEEK(V+24) AND NOT 8
So. Nun können Sie endlich den Grafikmo-
dus des VIC aktivieren. Sie sollten
jetzt - bei frisch eingeschaltetem 64er
- einen Haufen wirre Punkte auf dem
Bildschirm sehen. Falls Sie übrigens
vorher irgendein Spiel, oder Grafikpro-
gramm geladen hatten (und mit einem RE-
SET ausgestiegen sind - ohne den Rechner
also abzuschalten), so kann es sein, daß
sie sogar eine Titelgrafik oder ähnli-
ches hier entdecken können. Das liegt
dann einfach daran, daß das vorherige
Programm seine Grafik auch hier abgelegt
hatte.
Wie dem auch sei, nun können Sie also
DIREKT auf die Grafik zugreifen (geht
vorher natürlich auch, nur daß Sie dann
noch keine Veränderungen auf dem Bild-
schirm sehen). Sie sehen nun die Bytes
von 8192 bis 16191 auf dem Bildschirm
grafisch dargestellt. Schreiben Sie doch
einfach mal mittels POKE einen Wert in
Byte 8192. Wenn Sie nicht zufällig den-
selben Wert benutzten, der hier schon
beinhaltet war, dann sollten Sie erken-
nen, daß sich in der Ecke links oben, in
der ersten Zeile etwas verändert hat,
als Sie die RETURN-Taste zur Ausführung
des POKE-Befehls drückten.
Öbrigens: sollten Sie auf dem Bildschirm
außer den Grafikpunkten auch noch dicke
Farbige Quadrate sehen, oder sollten die
einzelnen Punkte der Grafik verschiedene
Farben aufweisen, so liegt das daran,
daß der normale Bildschirmspeicher
(hierzu später), in dem die ganzen Buch-
staben gespeichert sind, die Sie im Nor-
malmodus sehen, im Grafikmodus als Farb-
speicher für die einzelnen Punkte fun-
giert. Löschen Sie doch einfach einmal
den Bildschirmspeicher mit SHIFT-
CLR/HOME. Jetzt sollten Sie alle Grafik-
punkte in der selben Farbe sehen. Wenn
Sie jetzt einmal ein paar Worte einge-
ben, so werden Sie einen Farbzug sehen,
der sich mit dem Tippen eines Buchsta-
bens um 8 Punkte verlängert - obwohl Sie
die getippten Buchstaben nicht sehen...
Zur Erklärung dieses Phenomens, muß ich
etwas tiefer in die Kiste greifen, und
möchte Sie bitten, den Grafikmodus no-
cheinmal auszuschalten.
Kommen wir zum Bildschirmspeicher. Ich
hatte diesen ja schon unzählige Male bei
Speicherbereichsauflistungen erwähnt.
Dabei sagte ich, daß sich dieser ominöse
Speicher von Adresse 1024 bis 2023 er-
streckt. Das sind genau 1000 Bytes
(zählt man von 0 an!). Wie Sie sicher
wissen, oder auch leicht feststellen
können, ist der Textbildschirm in 25
Zeilen zu je 40 Spalten aufgeteilt
(huch! das war doch eben schon eimal der
Fall... so ein Zufall aber auch). 25*40
ergibt genau 1000. Sie können auf dem
Bildschirm also 1000 Zeichen gleichzei-
tig darstellen. Klingelts bei Ihnen?
Genau! Jede Speicherstelle des Bild-
schirmspeichers repräsentiert eine ganz
bestimmte Stelle (durch Zeile und Spalte
definiert) des Bildschirms, in der ein
Bytewert gespeichert ist, der den VIC
dazu veranlasst ein ganz bestimmtes Zei-
chen auf dem Bildschirm darzustellen. Er
überprüft in regelmäßigen Abständen, was
in diesem Speicherbereich an Daten abge-
speichert ist und stellt diese auf dem
Bildschirm in Form von Buchstaben (oder
Grafikzeichen) dar. Schreiben Sie doch
einmal den Wert 1 in die Speicherstelle
1024. Jetzt sollten Sie den Buchstaben
"A" links oben auf dem Bildschirm sehen.
Probieren Sie doch einmal verschiedene
Werte durch, Sie werden dann die ver-
schiedensten Zeichen auf dem Bildschirm
sehen. Zur Demonstation habe ich Ihnen
diesmal ein kleines Programm auf der
Rückseite der MagicDisk abgespeichert,
das Ihnen alle Zeichen des 64ers auf dem
Bildschirm ausdruckt. Es heißt "SHOW-
CHARS.GK und arbeitet nach der Methode,
daß es nacheinander die Werte von 0 bis
255 in den Bildschirmspeicher schreibt.
Zum Aufbau bleibt noch zu sagen, daß wir
diesmal wieder zeilenweise arbeiten dür-
fen (puuh - also nich son komplizierter
Kram wie eben). Die ersten 40 Bytes des
Bildschirmspeichers (1024-1064) sind
also für die erste Zeile, die nächsten
40 (1064-1104) für die zweite Zeile
(usw.) zuständig. Experimentieren Sie
doch einfach einmal, indem Sie in die
Speicherstellen von 1024 bis 2023 ver-
schiedene Werte schreiben...
Jetzt wissen Sie auch, wie die Buchsta-
ben von den Tasten Ihrer Tastatur auf
den Bildschirm kommen. Intern fragt das
Betriebssystem nämlich ständig die Ta-
statur ab, ob Sie nicht gerade eine Ta-
ste gedrückt haben. Ist dies der Fall,
so sucht es sich den entsprechenden
"Bildschirmcode" (so heißen nämlich die
Zahlen mit den dazugehörigen Zeichen -
ähnlich wie beim ASCII-Code) der Taste
aus einer Tabelle heraus und schreibt
diesen in den Bildschirmspeicher, von wo
aus ihn der VIC wieder in ein Videosig-
nal für Fernseher oder Monitor umsetzt,
so daß er schließlich und endlich auf
selbigem erscheint...
Doch kehren wir von den Interna des
64ers zurück zu unserer Grafik:
Der Bildschirmspeicher dient also norma-
lerweise zur Darstellung der Buchstaben
auf dem Bildschirm. Im HIRES-Grafikmodus
sehen wir diese jedoch eh nicht, die
Grafik ist ja eingeschaltet. Bevor jetzt
also ganze 1000 Bytes im Speicher des
64ers brach liegen benutzt VIC sie dazu,
den Punkten im Grafikmodus eine Farbe zu
geben (sieht doch viel besser aus!).
Jede Speicherstelle des Bildschirmspei-
chers kann nun genutzt werden, um einem
8x8-Pixel-Block gewisse Farbinformatio-
nen zu geben (aha! also doch kein Zufall
mit den 25x40 Zeichen...). Hierbei
bleibt die Zeilen-Spalten-Struktur des
Bildschirmspeichers voll und ganz erhal-
ten!
Die eigentliche Farbinformation in einem
solchen 8x8-Pixel-Block teilt sich nun
in 2 Komponenten, nämlich in Vorder- und
Hintergrundfarbe, auf. Wie Sie ja wis-
sen, kann der 64er insgesamt 16 ver-
schiedene Farben darstellen. Demnach
brauchen wir maximal 4 Bits (2↑4=16) um
alle verschiedenen Farben darstellen zu
können. Da uns in einem Byte allerdings
8 Bit zur Verfügung stehen, können wir
also quasi 2 verschiedene Farbwerte in
ein Byte "packen". Und genauso wird das
gehandhabt. Der Farbwert für die Hinter-
grundfarbe wird in den Bits 0-3 untege-
bracht, der für die Vordergrundfarbe in
den Bits 4-7. Zunächst jedoch noch ein-
mal die Farbtabelle (ich hatte sie auch
schon einmal bei den Sprites aufgeli-
stet), damit Sie die Farbwerte auch wie-
der im Kopf haben:
Wert Farbe Wert Farbe
----------------------------------------
0 Schwarz 8 Orange
1 Weiß 9 Braun
2 Rot 10 Hellrot
3 Türkis 11 Dunkelgrau
4 Violett 12 Mittelgrau
5 Grün 13 Hellgrün
6 Blau 14 Hellblau
7 Gelb 15 Hellgrau
Um nun beispielsweise die Hintergrund-
farbe auf "Grün" und die Vordergrundfar-
be auf "Braun" zu setzen, müssen wir die
Farbwerte ins Binärsystem übersetzen,
und sie in 8-Bit-Schreibweise aneinander
hängen, also:
Vordergrund = dez. 9 = bin. 1001
Hintergrund = dez. 5 = bin. 0101
--> (bin.) 10010101 = (dez.) 149
Oder Sie rechnen den Wert einfach so um,
daß sie den Farbwert der Vordergrundfar-
be (in den "höherwertigen" Bits 4-7) mit
16 multiplizieren und den Hintergrund-
farbwert einfach hinzuaddieren (auch
dies hatten wir schon an früherer Stel-
le):
16*9+5=149
Schreiben Sie nun diesen Wert in die
erste Speicherstelle des Bildschirmspei-
chers (nämlich...na?...richtig! - 1024),
so werden im ersten 8x8-Pixel-Block alle
gesetzten Punkte in braun erscheinen,
und alle nicht gesetzten in grün. Die
Hintergrundfarbe aus Register 32 (aus
dem ersten Teil des Grafikkurses) gilt
hier nicht mehr! Alle Punkte, die also
nicht gesetzt sind (=Binär 0) erhalten
ihre Farbinformation jetzt aus den Bits
0-3 und alle gesetzten aus den Bits 4-7
der entsprechenden Bildschirmspeicher-
zelle.
Soviel zur Farbgebung der Grafik. Kommen
wir nun noch einmal zurück zu den ein-
zelnen Bildpunkten auf dem Bildschirm.
Nachdem Sie jetzt ja wissen sollten,
woher die dicken Farbkleckse herkommen,
wollen wir uns noch einmal um den Aufbau
des Bildschirms kümmern. Als letztes
Beispiel, damit Sie diesen vielleicht
etwas besser verstehen, möchte ich Ihnen
jetzt zeigen, wie man den Grafikbild-
schirm löscht, denn die wirren Punkte da
kann man ja unmöglich als ansehliche
Grafik bezeichnen. Um also Ordnung zu
schaffen, müssen wir den Bildschirm erst
einmal löschen. Dieser Vorgang ist denk-
bar einfach: wir schreiben mit Hilfe
einer FOR-NEXT-Schleife ganz einfach in
die 8000 Datenbytes unserer Grafik (von
8192 bis 16191) den Wert 0 (das ist ja
binär 0000 0000, wobei dann ja keine
Punkte mehr auf der Grafikseite gesetzt
sind!). Also:
FOR I=0 TO 7999:POKE 8192+I,0:NEXT
Das wärs schon. Natürlich wäre diese
ganze Sache in Assembler besser geeig-
net, zumal diese Schleife (in BASIC)
schon eine geraume Zeit braucht, bis sie
vollends abgelaufen ist. Doch das ist
momentan gar nicht mal so schlimm, denn
so können Sie bildlich sehr gut sehen,
wie der Grafikbildschirm aufgebaut ist.
Starten Sie doch einfach einmal das Pro-
gramm "CLRGRAPH.BK" auf der Vorderseite
dieser MD. Es tut nichts anderes, als
den Grafikbildschirm einzuschalten und
ihn dann zu löschen. Sie werden sehen,
daß die Bytes nach und nach in den 0-
Status springen. Hierbei "läuft" quasi
ein unsichtbarer Radiergummi über den
Bildschirm, und Sie werden sehen, daß
alle 8x8-Pixel wieder die nächsten 8x8-
Pixel gelöscht werden und so fort...
Ich hoffe, daß Sie dieses Problem nun
endlich abhaken können (sollten Sie es
noch nicht verstanden haben). Deshalb
kommen wir gleich noch zu einer weiteren
Spezialität der Grafik. Man kann nämlich
- genau wie bei den Sprites - auch hier
den "Multicolormodus" einschalten. Auch
hier funktioniert das etwa ähnlich wie
bei den Sprites, zwei Bildpunkte werden
nämlich zu EINEM zusammengefaßt, deren
Gesamtinformation dann mit der Farbge-
bung zusammenhängt. Sollten Sie nicht
mehr so genau wissen, was ich damit mei-
ne, dann sollten Sie noch einmal einen
Blick in den zweiten Teil des Grafikkur-
ses - MD64, Ausgabe 1/90 - werfen, dort
steht alles noch einmal genau erklärt,
nur halt im Rahmen der Spriteprogrammie-
rung.
Wie auch bei den Sprites geben hier die
einzelnen Bitkombinationen dem VIC an,
welche Farbe er einsetzen soll. Hier die
vier möglichen Bitmuster und deren Farb-
quellen:
Bitmuster Farbquelle
----------------------------------------
00 Hintergrundregister (53280)
01 Highnibble Bildschirmspeicher
10 Lownibble Bildschirmspeicher
11 Farbram
Zunächst einmal zu den ersten 3 Einträ-
gen dieser Liste. Im Multicolormodus
ist, wie man sieht, das Hintergrundfar-
bregister des VIC (Nr. 32 --> 53280)
wieder von Bedeutung. Bei allen nicht-
gesetzten Punkten "scheint" diese Farbe
also durch.
Nun zu dem Begriff "Nibble". Dies ist
der Fachausdruck für ein halbes Byte,
oder auch vier Bit. Mit "Lownibble" ist
ganz einfach das "niederwertige" (Bits
0-3) Nibble und mit "Highnibble" das
"höherwertige" (Bits 4-7) gemeint. Und
zwar jeweils des Bytes der dazugehörigen
Adresse des Bildschirmspeichers, also
ähnlich wie bei der normalen 2-Farb-
Grafikdarstellung.
Jetzt zum vierten Eintrag der Bitmuster-
liste. Wenn die beiden Informationsge-
benden Bits in der Grafikseite auf "11"
stehen (also beide gesetzt), dann wird
die Farbinformation aus dem sogenannten
Farbram (oder englisch auch "Colorram")
geholt.
Doch was heißt das eigentlich. Auch hier
muß ich etwas weiter ausholen. Wie Sie
ja wissen, kann jeder Buchstabe auf dem
Bildschirm eine von 16 verschiedenen
Farben annehmen. Drücken Sie doch einmal
die Tastenkombination CTRL-1 - schon ist
der Cursor schwarz und alle mit ihm ge-
schriebenen Buchstaben ebenfalls. Schal-
ten Sie jetzt eine andere Farbe ein
(z.B. Weiß, mit CTRL-2), so wird alles
was sie nun eingeben in der Farbe Weiß
dargestellt. Sie haben jetzt also schon
2 verschiedenfarbige Buchstabengruppen
auf dem Bildschirm. Das Spiel können Sie
auch gerne weitertreiben, bis wir alle
Regenbogenfarben da so rumschillern ha-
ben. Klingelts bei Ihnen? Vorhin hatten
wir doch gelernt, daß jeder Buchstabe,
den wir auf dem Bildschirm sehen im
Bildschirmspeicher untergebracht ist.
Wenn jetzt aber jeder Buchstabe eine
andere Farbe annehmen kann, so ist die
logische Schlußfolgerung, daß es da noch
irgendwo einen weiteren Speicher geben
muß, in dem diese Farbinformation ge-
speichert ist. Und genau das ist der
Fall! Das Ganze nennt sich (wie oben
schon erwähnt) Farbram, und besteht
ebenfalls aus 1000 Bytes. Es erstreckt
sich von Adresse 55296 bis 56319 und
liegt somit im Ein-/Ausgabebereich des
Speichers.
Der Rest ist schnell gesagt, denn es ist
vom Aufbau haargenau identisch mit dem
Bildschirmspeicher nur daß es halt an
einer anderen Adresse liegt als dieser,
und daß es für die Farbgebung der Zei-
chen auf dem Bildschirm zuständig ist.
Wenn Sie also die (beispielsweise) 31.
Stelle des Farbrams (55296+31=55327) mit
einem Farbwert aus der, mittlerweile
schon altbekannten, Farbtabelle von 16
Farbwerten beschreiben, so erscheint der
31. Buchstabe des Bildschirmspeichers
(1024+31=1055) in eben dieser Farbe.
Nun verstehen Sie also auch den Zusam-
menhang mit der Multicolorgrafik. Der
Farbwert, der im Farbram gespeichert
ist, ist maßgebend für alle "11" kombi-
nationen in dem 8x8-Pixel-Block, für den
er zuständig ist (ebenso wie Low- und
Highnibble des Bildschirmspeichers).
Jetzt noch zum Einschalten des Multico-
lor-Grafikbildschirms. Diesmal müssen
wir ebenfalls lediglich ein Bit eines
VIC-Registers setzen, um ihn zu veran-
lassen, die Grafikinformationen in der
Multicolorweise darzustellen. Genau ge-
sagt handelt es sich um Bit 4 des Regi-
sters 22 (Adresse 53270). Die enspre-
chenden Befehle zum Ein- und Ausschalten
lauten demnach:
POKE V+22,PEEK(V+22) OR 16
(--> zum Einschalten)
POKE V+22,PEEK(V+22) AND NOT 16
(--> zum Ausschalten)
Vorausgestzt natürlich, daß die Variable
"V" die Basisadresse des VICs enthält
(53248)!
So. Das wärs dann für diesen Monat. Ex-
perimentieren Sie doch einfach einmal
ein wenig mit dem Grafikbildschirm des
64ers herum, denn nur so erhalten Sie
die routinemäßige Erfahrung, wie man mit
Ihm umgeht...
Ich verabschiede mich dann bis nächsten
Monat, wenn wir uns dann mit der Zei-
chensatzprogrammierung auseinandersetzen
wollen, bis dahin Servus,
Ihr Uli Basters (ub)