Erstellt: 9. März 2014 (zuletzt geändert: 1. November 2021)

VIC-II: Grafikmodes – Text

Die Textmodi des VIC-II

C64 Studio & AMCE

Wie euch bestimmt bekannt ist, bietet der C64 grundsätzlich zwei unterschiedliche Grafikmodi: Text und Bitmap. Diese beiden bieten dann wiederum verschiedene Untermodi und es gibt noch eine ganze Reihe neu erfundener“ BITMAP-Modes z. B. FLI oder MCI.

Da wir gleich die Farben verwenden, hier die Liste mit den 16 Farben des C64:

Die Farben des C64.
Die 16 Farben des C64.

Textmodus

Dieser Modus wird wohl am häufigsten verwendet. Fast alle Spiele verwenden ihn und auch bei Demos läßt sich eine Menge damit anstellen. Da der Standardzeichensatz auf Dauer zu langweilig ist, verwendet man meistens einen eigenen Zeichensatz, dieses Thema wird in VIC-II: Eigener Zeichensatz behandelt.

Der Textmodus kann wiederum auf drei verschiedene Arten verwendet werden, die wir uns nun einmal kurz ansehen. Da wir gleich einige VIC-II-Register benötigen, werft evtl. noch mal einen Blick auf VIC-II: Die Register.

Standardzeichen

Diesen Modus kennt ihr bereits zur Genüge, er ist direkt beim Start des C64 aktiv. Ihr könnt einfarbige Zeichen darstellen (natürlich kann jedes Zeichen seine eigene Farbe bekommen, aber halt nur eine zur Zeit). Zwei Musterzeichensätze befinden sich bereits im ROM, einer mit ausschließlich Großbuchstaben, dafür mehr grafischen Symbolen, ein zweiter mit Groß- und Kleinbuchstaben, dafür eben weniger Symbole.

Ein Zeichen ist 8 Pixel breit und 8 Zeilen hoch. Ein Bit bestimmt somit, ob der jeweilige Pixel des Zeichens sichtbar ist oder nicht.

So sieht das Zeichen 'A' im Speicher aus.
So sieht das Zeichen ‚A‘ also im Speicher aus.

Ist ein Bit gesetzt, dann erscheint an der Stelle ein Pixel in der Zeichenfarbe aus dem Color-RAM $d800, bei einer Null für das Bit ist das Zeichen an der Stelle durchsichtig und die Hintergrundfarbe aus $d021 ist zu sehen.

Sorry, für dieses Beispiel!
Hier löschen wir den Bildschirm und geben dann, wie schon so oft, einfach einen Text aus. Damit wir gleich beim nächsten Schritt das Ergebnis besser verfolgen können, wird außerdem noch die Hintergrundfarbe auf schwarz gesetzt, sowie Rahmen und Zeichenfarbe auf den Standard hellblau. Da dieser Modus ein altbekannter ist, sollte dieses Beispiel reichen, damit haben wir ja schon bis zum Abwicken rumgespielt.

Eine einfache Textausgabe.
Eine einfache Textausgabe
Multicolor-Modus (mehrfarbige Zeichen)

Im Multicolor-Modus könnt ihr für ein Zeichen bis zu drei Farben verwenden. Dafür nimmt die Auflösung der Zeichen in der Breite (also X-Richtung), wie bei den MC-Sprites, ab. Ein Zeichen belegt zwar immer noch 8 Pixel auf dem Bildschirm, wir können in der Breite allerdings nur vier setzen, da immer zwei Bits für die Farbauswahl benötigt werden. Es bleibt aber weiterhin bei 8 Zeilen in der Höhe.

Das 'A' von eben als Multi-Color-Zeichen.
Das „A“ von eben, als Multicolor-Zeichen.

Schaltet ihr auf den Multicolor-Textmodus um, dann sieht das A im Speicher natürlich noch wie eben aus. Aber da jetzt immer zwei Bits für eine Farbinformation genommen werden, erscheint es auf dem Bildschirm unfreiwillig bunt und recht grob. Bei den Farben ist zu beachten, dass, ähnlich wie bei den MC-Sprites, je Zeichen eine Farbe freiwählbar ist, die beiden anderen gelten für alle Zeichen zusammen. Die vierte Farbe %00 ist natürlich wieder transparent, damit man auch den Hintergrund durchscheinen sieht. In der folgenden Liste könnt ihr nachlesen, welche Bit-Kombination, für welches Farbregister steht.

Im Multicolor-Modus werden also die VIC-II-Register 34 und 35 $d022 & $d023, die eigentlich für den gleich folgenden Extended Background Color Mode vorgesehen sind, verwendet, um die zusätzliche Zeichenfarbe zu bestimmen. Ändern wir unser Testprogramm etwas ab und schauen uns das Ergebnis einmal an. Ersetzt den obigen main-Block durch diesen:

Wir setzen den Hintergrund wieder auf schwarz, außerdem füllen wir $d022 & $d023 mit grün und rot, wie oben in der Grafik. Dann wird über Bit-4 im VIC-Register 22 $d016 der Multicolor-Textmodus aktiviert, der Bildschirm gelöscht und nochmal der selbe Text ausgegeben.

Der Mustertext im Multicolor-Modus.
Der Mustertext im Multicolor-Modus.

Die Texte sind noch annähernd zu erkennen, aber zoomen wir trotzdem mal etwas ran…

Die drei 'A's in der Vergrößerung.
Die drei „A“s in der Vergrößerung.

Hier erkennt ihr, dass das A wirklich, wie oben in der Übersichtsgrafik schon zu erkennen war, dargestellt wird, nur unsere Hintergrundfarbe ist hier schwarz.
Den Grund für meine Farbwahl (Rahmen hellblau / Hintergrund schwarz) könnt ihr auch in der Vergrößerung finden. Schaut euch mal die blaue Farbe des Zeichens an…diese sollte doch eigentlich der Rahmenfarbe entsprechen, oder? Wir haben die Zeichenfarbe schließlich auf hellblau gesetzt (vergleicht es ggf. noch mal mit der „normalen“ Ausgabe). Hier kommt eine zusätzliche Steuerungsmöglichkeit für den Multicolormodus zum Tragen. Man möchte ja nicht unbedingt alle Zeichen als Multicolor ausgeben, zum Beispiel reine Texte oder Punkteanzeigen sehen einfarbig (aber hochauflösend) einfach besser aus. Genau dies wird durch die jeweilige Zeichenfarbe im Color-RAM ab $d800 möglich. Mit der Zeichenfarbe wird gesteuert, ob ein Zeichen einfarbig oder mehrfarbig dargestellt werden soll. Dabei sorgen die Farben $00 - $07 für eine einfarbige und $08 - $0f für eine mehrfarbige Darstellung. Da Hellblau den Wert $0e hat, erscheinen alle unsere Zeichen als Multicolor.
Fügt vor das rts, am Ende von main, einmal die beiden folgenden Zeilen ein

und startet das Programm.

Bei Verwendung der Farben 0–7, erscheint das „A“ hochauflösend.
Bei Verwendung der Farben 0–7, erscheint das „A“ hochauflösend.

In der Vergrößerung könnt ihr besser erkennen, dass das A in weiß $01 nun wieder hochauflösend ist.

Das weiße 'A' ist wieder hochauflösend.
Das weiße ‚A‘ ist wieder hochauflösend.

Also wird mit dem höchsten Bit (denkt daran, dass es nur 4 Bits sind!) des Farbwertes im Color-RAM gesteuert, ob das Zeichen ein- oder mehrfarbig ist. Somit haben wir auch die Erklärung, warum das Blau in den Multicolor As nicht hell- sondern dunkelblau ist. $0e = %1110 = 15 aktiviert den Mehrfarbenmodus, damit bleiben nur die unteren drei Bits für die Farbe %110 = $06 = 6 und dies entspricht der Farbe dunkelblau. Im Umkehrschluß bedeutet dies, dass wir im Multicolormodus, als Zeichenfarbe, nur die Farben 0 bis 7 verwenden können.

In Kombination mit VIC-II: Eigener Zeichensatz, könnt ihn nun also eure Spiele viel hübscher gestalten. Beim mehrfarbigen Zeichensatz müsst ihr nur darauf achten, dass auch die richtige Farbe im Color-RAM landet und schon wird es viel bunter.

Wie ein schicker Multicolor-Zeichensatz aussehen kann, habe ich zwar schon mal gezeigt, aber weil es so schön ist und als Motivation für euch, hier nochmal das Wizball-Beispiel.

Zeichen erstellen und zu Tiles zusammenfassen.
Der Multicolor-Zeichensatz von Wizball…
...und so sieht dann der erste Level von Wizball aus.
…und so sieht dann der erste Level von Wizball aus.

Kleines Intermezzo

Um einen Multi-Color-Zeichensatz mal in Aktion zu sehen, habe ich das Uridium-Beispiel (s. VIC-II: Eigener Zeichensatz, der Beitrag wird jetzt vorausgesetzt!) in ein kleines Programm umgesetzt.

Das Programm verwendet den Zeichensatz und die Leveldaten des ersten Levels von Uridium. Der Level wird angezeigt und die ersten 256 Spalten scrollen Ping-Pong-mäßig hin und her. Es gibt allerdings kein Softscrolling, sondern es wird immer um ein ganzes Zeichen gescrollt. Um den Unterschied zwischen Multi-Color / normalem Modus, sowie einem eigenen und dem ROM Zeichensatz zu zeigen könnt ihr über die Funktionstasten diese Werte jeder Zeit umschalten.

F1 – Multi-Color
F3 – Standard-Textmodus
F5 – Uridium-Zeichensatz
F7 – ROM-Zeichensatz
RETURN – Pause / weiter

oben: Uridium-Zeichensatz unten: ROM-Zeichensatz links: Multi-Color rechts: normaler Textmodus
oben: Uridium-Zeichensatz | unten: ROM-Zeichensatz

links: Multi-Color | rechts: normaler Textmodus

Das Listing ist eigentlich gut kommentiert, daher möchte ich mich auf einige Anmerkungen beschränken: In main wird alles vorbereitet, als erstes werden die Farben und Adressen gesetzt. Der Zeichensatz muss dieses Mal nicht kopiert werden, da wir ihn durch entsprechende Platzierung direkt verwenden. Dazu wird er, wie auch die Leveldaten, direkt ins Programm gebunden. Wichtig ist, dass der Zeichensatz hinter den Leveldaten folgt, damit vermeiden wir automatisch den problematischen Bereich bei $1000! In main befindet sich auch die Hauptschleife. Diese bewegt das Raumschiff und fragt die Tasten ab, um eine konstante Geschwindigkeit zu erhalten, wird alles über waitForVsync getimed. Für das Scrolling wird einfach regelmäßig drawMap aufgerufen, diese zeichnet jedes Mal den gesamten Bildschirm, abhängig von einem vorgegebenen Offset. Dieser Offset wird von main direkt beim adc aktualisiert und bewirkt das Scrolling.

Ich denke es ist nun am Besten, wenn ihr euch das Programm vornehmt und etwas damit rumspielt. Ihr könnt euch das komplette Projekt inkl. der benötigten .bin-Dateien herunterladen.

Extended Background Color Mode (Erweiterter Hintergrundfarbmodus)

Abschließend werfen wir noch einen Blick auf den Extended Background Color Mode. Die deutsche Bezeichnung „Erweiterter Hintergrundfarbmodus“ verrät eigentlich schon, was es damit auf sich hat. Wie ihr wisst, haben alle Zeichen ein und dieselbe Hintergrundfarbe (die aus $d021), die immer dann sichtbar wird, wenn ein Pixel des Zeichens den Wert 0 hat. Mit dem Extended Background Color Mode habt ihr nun die Möglichkeit bis zu vier unterschiedliche Hintergrundfarben für die Zeichen zu verwenden! Aktiviert wird der Modus über Bit-6 im VIC-II Register 17 $d011. Die vier Hintergrundfarben legen wir in den Registern 33 bis 36 $d021 - $d024 ab.

Schalten wir den Extended Background Color Modus einfach mal an und schauen was passiert. Ersetzt dazu den bisherigen main-Block durch den folgenden:

Wir setzen hier wieder unsere Farben, aktivieren dann den gewünschten Modus durchs Setzen von Bit-6 in $d011 und werfen einen Blick auf die Ausgabe.

Hmm, hat sich nichts geändert, oder doch??
Hmm, hat sich nichts geändert, oder doch??

Wie ihr seht, zeigt sich kein Unterschied zum normalen Textmodus aus dem ersten Beispiel. Wirklich kein Unterschied? Schaut noch mal genau hin… Richtig, der Cursor ist nun rot. Unser Text sieht nur deshalb, wie bisher aus, da wir nur Zeichen ausgeben, die einen Screencode unter 64 haben. Im Extended Background Color Mode stehen uns nämlich nur die ersten 64 Zeichen zur Verfügung, da die oberen zwei Bits des Zeichencodes, für die Auswahl der Hintergrundfarbe verwendet werden. Um dies nun zu überprüfen, fügt die nächsten neun Zeilen bei main, direkt vor dem rts, ein.

Startet ihr das Programm jetzt, dann seht ihr vier hellblaue As mit unterschiedlichen Hintergrundfarben.

Die „A“s im Extended Background Color Mode.
Die „A“s im Extended Background Color Mode.

Auch dies noch mal zur Verdeutlichung etwas größer…

Vier unterschiedliche Hintergrundfarben für die 'A's
Vier unterschiedliche Hintergrundfarben für die ‚A‘s

Natürlich könnt ihr auch die Farbe der einzelnen Zeichen weiterhin verändern…

Vorder- und Hintergrundfarbe lassen sich natürlich gleichzeitig verändern.
Vorder- und Hintergrundfarbe lassen sich gleichzeitig verändern.

Das wars eigentlich schon zum Extended Background Color Mode, ihr könnt hiermit z. B. Textstellen hervorheben, um den Anwender darauf aufmerksam zu machen. Durch die Limitierung auf 64 Zeichen ist man allerdings nicht so flexibel, was die Darstellungsmöglichkeiten angeht.

Wer jetzt auf die Idee kommt, den Multicolor und Extended Background Color Mode gleichzeitig zu nutzen, der wird leider enttäuscht! Der VIC-II mag dies überhaupt nicht und zeigt nur einen schwarzen Bildschirm, probiert es ruhig selbst mal.


Jetzt seid ihr über die Textmodi des C64 informiert und könnt diese für eure Projekte nutzten. Der Textmodus ist, wie bereits erwähnt, mit am wichtigsten für Spiele und Demos, aber natürlich möchte man hin und wieder auch mal eine schicke Grafik anzeigen. Darum dreht sich der kommende Beitrag.


Schrott!!Naja...Geht so...Ganz gut...SUPER! (8 Bewertungen | Ø 3,88 von 5 | 77,50%)

Loading...


ZurückWeiter

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Protected by WP Anti Spam