Grafikkurs Teil 3
Sie sehen in dieser Grafik, welche der
Bitkombinationen welche Speicheraufteilung 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 schreiben 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 Ausblenden 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 Assemblerprogrammier 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 ausblenden, 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öglichen Absturz des Rechners zu verhindern
müssen wir auch noch den System-Interrupt abschalten. Dies ist eine Einrichtung 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ährleistet, da der Ein-Ausgabebereich des
Speichers ja abgeschaltet ist. Der Interrupt ( 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 Rechnerabsturz zur Folge. Öber den Interrupt ansich 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 zeigen, wie man den IRQ einund ausschaltet. Dies geht wie immer über den POKE-Befehl. Die entsprechenden Befehle lauten:
POKE 56334,PEEK(56334) AND 254 zum einschalten, und POKE 56334,PEEK(56334) OR 1
Nun also zu dem Programm, daß den Zeichensatz aus dem Zeichensatz-ROM ins RAM
von 8192-12288 kopiert. Ich habe es Ihnen 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 laufen, nach einiger ( sogar sehr langer) Zeit meldet sich der 64 er 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 Programm abbrechen - so hat es den anschein, als würde der Rechner " schlafen" . 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 Zeichensatz endlich im RAM liegt zu dessen
Veränderung.
Ein Zeichen, so wie Sie es auf dem Bildschirm sehen können, ist aus einer
Punktmatrix von 8 x8- Pixeln aufgebaut.
Diese werden durch 8 aufeinanderfolgende
Bytes zu je 8 Bit repräsentiert ( wie das
vor sich geht sollten Sie nun ja mittlerweile 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 anstelle des alten auf dem Bildschirm stehen. 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 verschiedene Möglichkeiten gibt. Hier einmal 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 dieser Liste von Bedeutung, denn er adressiert den Bereich, in dem wir unseren
neuen Zeichensatz abgelegt haben. Setzen
wir also die unteren vier Bits von Register 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 eingestellt. 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 Klammeraffe "" . Schreiben Sie doch einmal ein
solches Zeichen irgendwo auf den Bildschirm. 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 Klammeraffe oben deutlich abgeflacht wurde.
Verändern Sie auch noch das nächste Byte, so wird er sich immer mehr entstellen. Probieren Sie was sich so alles
damit anstellen läßt. Sie wissen ja
mittlerweile, daß jeweils ein Bit einer
Speicherstelle einen Punkt in einer Zeile 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 Zeichensätze, wie sie in manchen Spielen, oder in einem der zahlreichen Demo-Creator- Programme der MagicDisk vorhanden sind.
Nun noch ein wenig über den Aufbau eines
Zeichensatzes. Die Zeichen ansich,256 an der Zahl, sind 8- Byte-Weise hintereinander im Speicher abgelegt. Das wissen
wir ja schon. Da ein Zeichen 8 Byte belegt, müßte ein Zeichensatz also 8*256 Bytes lang sein, das sind insgesamt allerdings 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 Zeichensatz 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 Zeichensä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 Grafikzeichen 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 sichtbaren Zeichensatz aus!
Soviel hierzu. Jetzt noch ein Wort zu
der Lage von bestimmten Zeichen innerhalb eines Zeichensatzes. Zu diesem Zweck habe ich Ihnen ein weiteres Programm 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 Punktmatrix aussieht. Die Zeichen von 0 bis 255 entsprechen hierbei dem " Groß/ Grafik"- Zeichensatz, die von 256 bis 511 dem
" Kleinschrift"- Zeichensatz. Die Reihenfolge entspricht übrigens der der Bildschirmcodes, 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 Bildschirm 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 64 ers zurückgreifen. 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 adressieren (= 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 diesen 16 K-Bereich des VIC umzuschalten auf
folgende 16 K-Bereiche, doch hierzu an
späterer Stelle mehr. Im Normalfall arbeitet der VIC also in den ersten 16 K
des Speichers. Das Zeichensatz-ROM befindet sich nun aber in den letzten 16 K, womit sich ein Problem ergibt - denn wie
soll der VIC den auf diesen Bereich zugreifen 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 Zeichensatz- Bereich eines jeden 16 K-Blocks eingespiegelt. 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 Inhalte der entsprechenden RAM-Adressen an
dieser Stelle. Der VIC sieht hier jedoch
den ROM-Zeichensatz, weshalb dieser Bereich 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 Zeichensatzbereichsliste von oben repräsentativ für
das Zeichensatz-ROM. Schalten wir also
diesen Bereich ein, so erhalten wir wieder 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 16 K nicht so recht verstanden haben, dann macht das auch nichts.
Hauptsache, Sie wissen, wie man den Zeichensatz wieder in den Grundzustand
bringt. Das Thema mit der Adressierung
des VICs werden wir nächsten Monat sowieso 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 durchgehen möchten, in dem es dann um noch einige 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) .