Grafikkurs Teil 3 ----------------------------------------
Sie sehen in dieser Grafik, welche der Bitkombinationen welche Speicherauftei- lung bewirkt. Die 3 Zahlen jeweils unter einer Konfiguration geben die Stellung der Bits 0-2 an, die Zahl dahinter, den Dezimalwert, den man im Normalfall mit dieser Kombination in Adresse 1 schrei- ben sollte. Verändern Sie die Bits von 3-7 bitte nicht! Diese haben bestimmte Funktionen, die den Prozessor zu anderen Dingen veranlassen. Bei Veränderungen könnten Sie so den Rechner schnell zum Absturz bringen! Ebenso verhält es sich mit den Kombinationen, die ein Ausblen- den des Betriebssystems oder des BASIC- ROMs bewirken, da wir nämlich von BASIC aus programmieren, braucht der Rechner diese beiden Bereiche! Wenn Sie also verschwinden "verläuft" sich der Rechner im RAM darunter und stürzt ebenfalls ab! Diese Kombinationen werden erst für As- semblerprogrammier interessant, und selbst dann ist Vorsicht geboten beim Abschalten der ROMs. Für uns ist lediglich die Bitkombination "011" sinnvoll. Durch sie können wir nämlich einfach den I/O-Bereich ausblen- den, der dann durch das Zeichensatz-ROM ersetzt wird. Beim Zugriff auf die Adressen 53248-57344 bekommen wir nun also nicht mehr etwa die Werte von VIC, SID und den anderen Ein- /Ausgabebausteinen geliefert, sondern die des Zeichenssatz-ROMs. Wir können nun den gesamten Bereich mittels einer Schleife ins RAM kopieren, wo wir ihn dann verändern werden. Hierzu jedoch noch ein kleiner Hinweis, denn so einfach wird es uns leider doch nicht gemacht. Um wiederum einen mögli- chen Absturz des Rechners zu verhindern müssen wir auch noch den System- Interrupt abschalten. Dies ist eine Ein- richtung des Betriebssystems, die unter anderem macht, daß der Cursor auf dem Bildschirm rumblinkt. Das wiederum hat etwas mit der Bildschirmausgabe zu tun, und die ist ja nun nicht mehr gewährlei- stet, da der Ein-Ausgabebereich des Speichers ja abgeschaltet ist. Der In- terrupt (auch IRQ genannt) würde also versuchen auf die Register des VIC und vor allem auf Register der Ein- /Ausgabebausteine zuzugreifen, die natürlich nicht mehr da sind. Es gäbe ein großes Chaos mit einem Rechnerab- sturz zur Folge. Öber den Interrupt an- sich möchte ich mich hier allerdings nicht auslassen, das soll Aufgabe meines Assemblerkollegen Ralf Trabhardt sein (dessen Kurs Sie ja parallel zu diesem hier auch mitmachen können), ich werde mich darauf beschränken, Ihnen zu zei- gen, wie man den IRQ ein- und ausschal- tet. Dies geht wie immer über den POKE- Befehl. Die entsprechenden Befehle lau- ten:
POKE 56334,PEEK(56334) AND 254 zum einschalten, und POKE 56334,PEEK(56334) OR 1
Nun also zu dem Programm, daß den Zei- chensatz aus dem Zeichensatz-ROM ins RAM von 8192-12288 kopiert. Ich habe es Ih- nen auch als BASIC-Programm auf der Rückseite dieser MD unter dem Namen "COPYCHARSET" abgespeichert:
10 POKE 56334,PEEK(56334) AND 254:REM IRQ AUSSCHALTEN 20 POKE 1,51:REM ZEICHENSATZ EINBLENDEN 30 FOR I=0 4095 40 POKE 8192+I,PEEK(53248+I) 50 NEXT 60 POKE 1,55:REM I/O WIEDER EINBLENDEN 70 POKE 56334,PEEK(56334) OR 1:REM IRQ WIEDER EINSCHALTEN
Lassen Sie das Programm doch einmal lau- fen, nach einiger (sogar sehr langer) Zeit meldet sich der 64er wieder mit "READY." zurück, und der Zeichensatz steht im RAM. Damit Sie nicht solange warten müssen, bis die Kopierschleife durchlaufen ist, habe ich Ihnen auch noch die Assemblerversion von "COPYCHAR- SET" auf der Rückseite unter "COPYCHAR- SET.ASM" gespeichert. Öbrigens auch ein schöner Vergleich zwischen BASIC und Assembler - der Zeichensatz ist mit dem zweiten Programm nämlich in nur wenigen Sekundenbruchteilen umkopiert, anstatt in wenigen Minuten, mit der BASIC- Version! Haben Sie übrigens keine Angst, wenn Sie das BASIC-Programm nicht mit RUN-STOP abbrechen können. Der IRQ fragt nämlich auch ab, ob diese Taste gedrückt wurde und läßt in diesem Fall ein Pro- gramm abbrechen - so hat es den an- schein, als würde der Rechner "schla- fen". Da wir den IRQ jedoch abgeschaltet haben, kann das Programm folglich nicht mehr gestoppt werden, bis es abgelaufen ist. So. Kommen wir nun, nachdem der Zeichen- satz endlich im RAM liegt zu dessen Veränderung. Ein Zeichen, so wie Sie es auf dem Bild- schirm sehen können, ist aus einer Punktmatrix von 8x8-Pixeln aufgebaut. Diese werden durch 8 aufeinanderfolgende Bytes zu je 8 Bit repräsentiert (wie das vor sich geht sollten Sie nun ja mitt- lerweile wissen). In unserem Fall belegt das erste Zeichen des Zeichensatzes die Bytes 8192 bis 8199. Die Daten eines neuen Zeichens müssen also lediglich dort ins RAM geschrieben werden, und schon haben wir ein anderes Zeichen ans- telle des alten auf dem Bildschirm ste- hen. Das heißt noch nicht ganz, denn wir müssen dem VIC ja erst noch mitteilen, daß er sich die Zeichendaten jetzt aus einem anderen Speicherbereich holen soll, als aus dem Zeichensatz-ROM. Dies geht wieder über eines der VIC-Register, genauer gesagt über Register 24. Die Bits 0-3 dieses Registers steuern die Lage des Zeichensatzes, derer es 4 ver- schiedene Möglichkeiten gibt. Hier ein- mal eine Tabelle:
Adressbereich Bitmuster Wert(dez.) ----------------------------------
0- 4095 0001 01 4096- 8191 0101 05 8192-12287 1001 09 12288-16383 1101 13
Für uns ist also der dritte Eintrag die- ser Liste von Bedeutung, denn er adres- siert den Bereich, in dem wir unseren neuen Zeichensatz abgelegt haben. Setzen wir also die unteren vier Bits von Regi- ster 24 einmal auf "1001":
POKE V+24,PEEK(V+24) AND 240 OR 9
Somit wäre also der Zeichensatzgenerator des VIC auf den neuen Bereich einge- stellt. Ich werde Ihnen nachher noch einige Sonderheiten dieses Registers erklären, behalten Sie es also im Auge! Nun jedoch endlich zu der langersehnten Zeichenveränderung. Das erste Zeichen des neuen Zeichensatzes ist der Klamme- raffe " ". Schreiben Sie doch einmal ein solches Zeichen irgendwo auf den Bild- schirm. Jetzt fahren Sie mit dem Cursor an eine Stelle, die noch frei ist und schreiben mittels POKE den Wert 255 in Speicherzelle 8192, also:
POKE 8192,255
Sie werden jetzt sehen, daß unser Klam- meraffe oben deutlich abgeflacht wurde. Verändern Sie auch noch das nächste By- te, so wird er sich immer mehr entstel- len. Probieren Sie was sich so alles damit anstellen läßt. Sie wissen ja mittlerweile, daß jeweils ein Bit einer Speicherstelle einen Punkt in einer Zei- le des Zeichens darstellt. Pro Zeichen haben Sie acht Bytes zur Verfügung, die das Aussehen dieses Zeichens erheblich verändern können. Das zweite Zeichen des Zeichensatzes ist übrigens das "A", wenn Sie also die Speicherstellen von 8200 bis 8207 verändern, so werden Sie alle "A"s auf dem Bildschirm in ihrer Form verändern und so fort. Sie sehen, so ist es leicht möglich, andere Zeichen zu erzeugen, und so entstehen auch die Zei- chensätze, wie sie in manchen Spielen, oder in einem der zahlreichen Demo- Creator-Programme der MagicDisk vorhan- den sind. Nun noch ein wenig über den Aufbau eines Zeichensatzes. Die Zeichen ansich, 256 an der Zahl, sind 8-Byte-Weise hinterei- nander im Speicher abgelegt. Das wissen wir ja schon. Da ein Zeichen 8 Byte be- legt, müßte ein Zeichensatz also 8*256 Bytes lang sein, das sind insgesamt al- lerdings 2048 Bytes und nicht 4096, wie ich vorhin erwähnte (und soviele Daten haben wir ja auch umkopiert). Wie Sie merken ist 4096 genau das doppelte von 2048. Die Erklärung dafür, daß der Zei- chensatz länger ist als er eigentlich sein sollte, liegt darin, daß ein er in der Form, in der er auch im Zeichensatz- ROM vorliegt eigentlich aus ZWEI Zei- chensätzen besteht. Nämlich dem "Groß- schrift"-und dem "Kleinschrift"- Zeichensatz. Normalerweise schalten Sie zwischen diesen beiden Zeichensätzen mit der Tastenkombination "SHIFT-COMMODORE" hin und her. Hierbei können Sie entweder mit Großen Buchstaben und Grafikzeichen schreiben, oder mit kleinen und großen Buchstaben und dafür mit einigen Grafik- zeichen weniger. Probieren Sie es einmal aus: wenn Sie einige Grafikzeichen mit der SHIFT-Buchstabentaste-Kombination auf den Bildschirm bringen und dann auf Kleinschrift umschalten ("SHIFT/C="), dann verwandeln sich die Grafikzeichen in Großbuchstaben und umgekeht. Demnach reichen also 2096 Bytes für einen sicht- baren Zeichensatz aus! Soviel hierzu. Jetzt noch ein Wort zu der Lage von bestimmten Zeichen inner- halb eines Zeichensatzes. Zu diesem Zweck habe ich Ihnen ein weiteres Pro- gramm unter dem Namen "CHARLOC" auf der Rückseite der MD gespeichert. Es zeigt Ihnen an, wo ein Zeichen im Zeichensatz angesiedelt ist, und wie seine Punktma- trix aussieht. Die Zeichen von 0 bis 255 entsprechen hierbei dem "Groß/Grafik"- Zeichensatz, die von 256 bis 511 dem "Kleinschrift"-Zeichensatz. Die Reihen- folge entspricht übrigens der der Bild- schirmcodes, die wir ja schon im letzten Kursteil hatten. Nun möchte ich nocheinmal zu Register 24 des VIC kommen. In diesem kann ja die Lage des darzustellenden Zeichensatzes festgelegt werden. Wir hatten da ja auch den Bereich von 8192-12287 eingestellt, um unsere neuen Zeichen auf den Bild- schirm zu bringen. Was jedoch tun, wenn wir wieder den "alten" ROM-Zeichensatz auf dem Bildschirm haben wollen, der ROM-Bereich von 53248-57334 ist ja nicht dort aufgelistet? Nun, zur Erklärung dieser Frage muß ich wieder auf die Hardware-Grundlagen des 64ers zurück- greifen. Ich hatte Ihnen weiter oben ja schon erläutert, daß der VIC sich den Zeichensatz aus dem Zeichensatz-ROM holt. Der VIC kann nun aber nur einen Bereich von maximal 16 KiloByte adres- sieren (=auf ihn zugreifen) - das ist durch seinen hardwaremäßigen Aufbau so gegeben. Deshalb haben wir übrigens auch immer, wenn wir irgendwo Grafikdaten abgelegt haben, sei das jetzt eine HI- RES-Grafik, oder ein Sprite gewesen, im Bereich von 0 bis 16384 gearbeitet. Es gibt übrigens auch die Möglichkeit die- sen 16K-Bereich des VIC umzuschalten auf folgende 16K-Bereiche, doch hierzu an späterer Stelle mehr. Im Normalfall ar- beitet der VIC also in den ersten 16K des Speichers. Das Zeichensatz-ROM be- findet sich nun aber in den letzten 16K, womit sich ein Problem ergibt - denn wie soll der VIC den auf diesen Bereich zu- greifen können, wenn er nicht in seinem "Einzugsbereich" liegt. Hier wird mit einem kleinen Harwaretrick gearbeitet. Für den VIC wird der ROM-Zeichensatz nämlich immer in den zweiten Zeichen- satz-Bereich eines jeden 16K-Blocks ein- gespiegelt. Aber NUR für den VIC, der Prozessor hat darauf keinen Zugriff. Im Normalfall ist das also der Bereich von 4096 bis 8191. Wenn wir mit PEEK oder POKE an diesen Bereich gehen, erhalten oder verändern wir jedoch nur die Inhal- te der entsprechenden RAM-Adressen an dieser Stelle. Der VIC sieht hier jedoch den ROM-Zeichensatz, weshalb dieser Be- reich nicht dazu geeignet ist einen RAM-Zeichensatz aufzunehmen. VIC wird dann immer den Zeichensatz aus dem ROM holen und sich nicht darum kümmern, was dort im RAM steht. Deshalb ist auch der zweite Eintrag in der Zeichensatzbe- reichsliste von oben repräsentativ für das Zeichensatz-ROM. Schalten wir also diesen Bereich ein, so erhalten wir wie- der den alten ROM-Zeichensatz! Sie kön- nen ihn somit mit folgendem POKE wieder herholen:
POKE V+24,PEEK(V+24) AND 240 OR 5
Soviel also zu diesem Thema. Wenn Sie das mit den 16K nicht so recht verstan- den haben, dann macht das auch nichts. Hauptsache, Sie wissen, wie man den Zei- chensatz wieder in den Grundzustand bringt. Das Thema mit der Adressierung des VICs werden wir nächsten Monat so- wieso nocheinmal genauer behandeln. Befassen Sie sich jetzt erst einmal mit der Änderung des Zeichensatzes selbst, und experimentieren Sie ein wenig. Ich verabschiede mich nämlich jetzt wieder von Ihnen bis nächsten Monat, wenn wir den letzten Teil dieses Kurses durchge- hen möchten, in dem es dann um noch ei- nige Feinheiten der Grafikprogrammierung geht und um die Einzelheiten, was man mit einem gänderten Zeichensatz noch so anstellen kann. Bis dann also, Ihr Uli Basters (ub).