Magic Disk 64

home to index to text: MD9004-KURSE-GRAFIKKURS_TEIL_5-3.txt
MD9004-KURSE-GRAFIKKURS_TEIL_5-3.koala.png
           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) .

Valid HTML 4.0 Transitional Valid CSS!