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)