Grafik-Kurs Teil 4 c
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 einund ausgeschaltet wird. Wenn Sie das
einmal können ( und das ist sehr einfach), 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. Wiedereinmal handelt es sich hierbei um ein
paar POKEs, mit denen wir einige Register 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 kommen) können wir hier nämlich den Grafik- modus einschalten. Bit 5 dieses Registers ist hierfür zuständig. Ist es
gelöscht (= Binär 0), so ist der Grafikmodus 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 dezimalwert 32, also:
POKE V+17,PEEK(V+17) OR 32
Analog müssen wir es zum Ausschalten
wieder löschen. Dies geht entweder, indem man direkt das Komplement von 32 bildet (255-32=223) und es dann mit Hilfe des AND-Operators mit Register 17 verknüpft; oder man kombiniert ganz einfach 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 initialisiert ( also: V=53248) haben - das hatten wir ja auch schon im ersten Teil des
Grafikkurses.
Soviel zum Einschalten des Grafikbildschirms. Doch das ist leider noch nicht
alles. Um nämlich wirklich den Speicherbereich von 8192 bis 16191 auf dem Bildschirm 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 Grafikmodus 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 Grafikchip unseres 64 ers, daß er den Speicherbereich 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) sehen 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 Buchstaben mehr auf dem Bildschirm an ( das hat
etwas mit der schon erwähnten zweiten
Funktion des 3 . Bits zu tun) . Zum Ausschalten 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 Grafikmodus des VIC aktivieren. Sie sollten
jetzt - bei frisch eingeschaltetem 64 er
- einen Haufen wirre Punkte auf dem
Bildschirm sehen. Falls Sie übrigens
vorher irgendein Spiel, oder Grafikprogramm geladen hatten ( und mit einem RE-SET ausgestiegen sind - ohne den Rechner
also abzuschalten), so kann es sein, daß
sie sogar eine Titelgrafik oder ähnliches 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 Bildschirm 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 denselben Wert benutzten, der hier schon
beinhaltet war, dann sollten Sie erkennen, 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 Buchstaben gespeichert sind, die Sie im Normalmodus sehen, im Grafikmodus als Farbspeicher für die einzelnen Punkte fungiert. Löschen Sie doch einfach einmal
den Bildschirmspeicher mit SHIFT-CLR/ HOME. Jetzt sollten Sie alle Grafikpunkte in der selben Farbe sehen. Wenn
Sie jetzt einmal ein paar Worte eingeben, 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 nocheinmal 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 erstreckt. 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 gleichzeitig darstellen. Klingelts bei Ihnen?
Genau! Jede Speicherstelle des Bildschirmspeichers 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 Zeichen auf dem Bildschirm darzustellen. Er
überprüft in regelmäßigen Abständen, was
in diesem Speicherbereich an Daten abgespeichert 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 verschiedensten 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 64 ers 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ürfen ( 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 verschiedene Werte schreiben. . .
Jetzt wissen Sie auch, wie die Buchstaben von den Tasten Ihrer Tastatur auf
den Bildschirm kommen. Intern fragt das
Betriebssystem nämlich ständig die Tastatur ab, ob Sie nicht gerade eine Taste 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 Videosignal für Fernseher oder Monitor umsetzt, so daß er schließlich und endlich auf
selbigem erscheint. . .
Doch kehren wir von den Interna des
64 ers zurück zu unserer Grafik:
Der Bildschirmspeicher dient also normalerweise 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
64 ers brach liegen benutzt VIC sie dazu, den Punkten im Grafikmodus eine Farbe zu
geben ( sieht doch viel besser aus!) .
Jede Speicherstelle des Bildschirmspeichers kann nun genutzt werden, um einem
8 x8- Pixel-Block gewisse Farbinformationen zu geben ( aha! also doch kein Zufall
mit den 25 x40 Zeichen. . .) . Hierbei
bleibt die Zeilen-Spalten- Struktur des
Bildschirmspeichers voll und ganz erhal- ten!
Die eigentliche Farbinformation in einem
solchen 8 x8- Pixel-Block teilt sich nun
in 2 Komponenten, nämlich in Vorderund
Hintergrundfarbe, auf. Wie Sie ja wissen, kann der 64 er insgesamt 16 verschiedene 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 Hintergrundfarbe wird in den Bits 0-3 untegebracht, der für die Vordergrundfarbe in
den Bits 4-7 . Zunächst jedoch noch einmal die Farbtabelle ( ich hatte sie auch
schon einmal bei den Sprites aufgelistet), damit Sie die Farbwerte auch wieder 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 Hintergrundfarbe auf " Grün" und die Vordergrundfarbe 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 Vordergrundfarbe ( in den " höherwertigen" Bits 4-7) mit
16 multiplizieren und den Hintergrund- farbwert einfach hinzuaddieren ( auch
dies hatten wir schon an früherer Stelle) :
16*9+5=149
Schreiben Sie nun diesen Wert in die
erste Speicherstelle des Bildschirmspeichers ( nämlich. . . na? . . . richtig!-1024), so werden im ersten 8 x8- 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 Bildschirmspeicherzelle.
Soviel zur Farbgebung der Grafik. Kommen
wir nun noch einmal zurück zu den einzelnen 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 Grafikbildschirm 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 denkbar 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 00000000, 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 Programm " 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 8 x8- Pixel wieder die nächsten 8 x8- 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 Farbgebung zusammenhängt. Sollten Sie nicht
mehr so genau wissen, was ich damit meine, dann sollten Sie noch einmal einen
Blick in den zweiten Teil des Grafikkurses - MD64, Ausgabe 1/90- werfen, dort
steht alles noch einmal genau erklärt, nur halt im Rahmen der Spriteprogrammierung.
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 Farbquellen:
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 Hintergrundfarbregister des VIC ( Nr.32-->53280) wieder von Bedeutung. Bei allen nichtgesetzten 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 Bitmusterliste. Wenn die beiden Informationsgebenden 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 geschriebenen Buchstaben ebenfalls. Schalten 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 haben. 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 gespeichert 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 Zeichen 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 Zusammenhang mit der Multicolorgrafik. Der
Farbwert, der im Farbram gespeichert
ist, ist maßgebend für alle "11" kombinationen in dem 8 x8- Pixel-Block, für den
er zuständig ist ( ebenso wie Lowund
Highnibble des Bildschirmspeichers) .
Jetzt noch zum Einschalten des Multicolor- Grafikbildschirms. Diesmal müssen
wir ebenfalls lediglich ein Bit eines
VIC-Registers setzen, um ihn zu veranlassen, die Grafikinformationen in der
Multicolorweise darzustellen. Genau gesagt handelt es sich um Bit 4 des Registers 22( Adresse 53270) . Die ensprechenden Befehle zum Einund 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. Experimentieren Sie doch einfach einmal
ein wenig mit dem Grafikbildschirm des
64 ers 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 Zeichensatzprogrammierung auseinandersetzen
wollen, bis dahin Servus,
Ihr Uli Basters (ub)