Magic Disk 64

home to index to text: MD9003-KURSE-GRAFIKKURS_TEIL_4-3.txt
MD9003-KURSE-GRAFIKKURS_TEIL_4-3.koala.png

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)

Valid HTML 4.0 Transitional Valid CSS!