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).