VIC-II: Grafikmodes – BITMAP (Multi-Color)

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

CBM prg StudioNun wirds mir aber zu bunt… 😉

Nachdem wir im letzten Beitrag ‚VIC-II: Grafikmodes – BITMAP (Hi-Res)‚ die BITMAP-Grundlagen und den Hi-Res-Modus kennengelernt haben, ist es nun an der Zeit mehr Farbe ins Spiel zu bringen.

 

Multi-Color-Modus
Wie schon beim Textmodus und den  Sprites gesehen, können wir auch bei BITMAPs, auf Kosten der Auflösung, für mehr Farbe sorgen. Wie bei den eben erwähnten Beispielen, wird auch hier die Auflösung in X-Richtung halbiert, weil dann je zwei BITs für die Pixelfarbe zuständig sind. Daher beträgt die Auflösung im Multi-Color-Modus auch nur noch 160*200 Pixel.
Als Basis für unsere nächsten Schritte, verwenden wir das abschließende Listing aus ‚VIC-II: Grafikmodes – BITMAP (Hi-Res)‚ :

Ihr erinnert euch bestimmt, dass das Programm einen weißen Pixel in jede Ecke und in die Mitte des Bildschirms setzt…

HiRes_09 

Das Erste, was wir nun machen wollen, ist natürlich das Einschalten des Multi-Color-Modus. Dies geschieht, wie schon beim Multi-Color-Text, über das Register 22 $D016 des VIC-II (vgl. ‚VIC-II: Die Register‚). Wir müssen dort also nur wieder das BIT-4 setzen.  Ergänzen wir das Programm (wie wäre es bei  main hinter  sta $D011) um drei kleine Zeilen:

 

Starten wir das Programm direkt einmal…

Ausgabe bei aktiviertem Multi-Color
Ausgabe bei aktiviertem Multi-Color

Wie ihr seht (ja, ist auf dem Bild oben sehr schlecht zu erkennen), hat sich unsere Anzeige merklich verändert. Der Hintergrund ist dunkelblau, auf der linken Seite und in der Mitte sind die Punkte schwarz, nur ganz rechts noch weiß. Außerdem sollte euch bei genauem Betrachten auffallen, dass die Pixel (wie bereits erwähnt) nun doppelt so breit sind.

Warum ist die Anzeige, wie sie ist?
Zunächst sieht es so aus, als würde unsere Punktberechnung noch funktionieren. Immerhin erscheinen die Punkte an der richtigen Stelle. Ihr wisst aber bereits, dass jetzt zwei Pixel für einen Punkt verwendet werden. Unsere Funktion setPixel ist aber noch auf Hi-Res ausgelegt. Korrigieren wir diese für den Multi-Color-Modus. Bevor wir das machen, wollen wir aber noch eine diagonale Linie zeichnen, die uns eine genauere Kontrolle unserer Ausgabe ermöglicht. Ersetzt dazu die bisherigen setPixel-Anweisungen in main, mit den folgenden Zeilen.

Hier zeichnen wir einfach eine diagonale Linie, da wir das X- & Y-Register mit den selben Werten füllen und dann setPixel aufrufen. Die Linie sollte über die gesamte Bildschirmbreite gehen, schließlich habe wir bei Multi-Color eine max. Breite von 160 Pixel. Fügt hinter jmp * noch die neue Variable test hinzu (ist ja nur zum Testen gedacht).

 

Ein Start zeigt uns, dass noch einiges schief geht:

Die Linie sieht nicht wie geplant aus!
Die Linie sieht nicht wie geplant aus!

OK, es wurde oben bereits erwähnt, dass setPixel noch für Hi-Res ausgelegt ist. Dies müssen wir jetzt ändern. Als erstes brauchen wir das Carry-Flag nicht mehr, um die X-Position zu übergeben! Schließlich passt nun die max. X-Position von 159 in 8-BIT. Ändern wir den Beginn von setPixel und ersetzen alles bis zu  @skip1 mit diesen Zeilen.

Nach dem Kopieren des X-Registers in den Akku, blenden wir beim and jetzt nur noch die unteren beiden BITs der X-Position aus. Bei Multi-Color passen in ein BYTE schließlich nur vier Pixel. Danach müssen wir den Wert im Akku mit asl verdoppeln und das Carry-Flag beachten. Sollte dies gesetzt sein, dann wird das MSB auf der Zero-Page um eins erhöht und das C-Flag wieder gelöscht. Zum Schluß addieren wir die BYTE-Anzahl aus dem Akku auf das LSB. Wer mag kann das Programm kurz starten und wird sehen, dass es noch nicht wirklich passt.

Wir nähern uns der Lösung
Wir nähern uns der Lösung

Wir haben eben ja schon gesehen, dass für die exakte Pixelposition in X-Richtung nur noch die unteren zwei BITs entscheidend sind. Dies müssen wir am Ende von  setPixel natürlich auch noch beachten. Sucht das Label  @loop1 und ändert die gelb hervorgehobenen Zeilen.

Wie erwähnt verwenden wir nur noch die unteren beiden BITs für die X-Position und rotieren dann in der Schleife bei jedem Durchlauf zwei Pixel (die definieren jetzt ja einen Punkt).
Ein Start zeigt endlich die diagonale Linie…

Da ist die Linie.
Da ist die Linie.

Wir haben es uns bei setPixel natürlich sehr einfach gemacht, indem wir immer zwei BITs für einen Pixel setzen. Eigentlich sollten wir auch noch die gewünschte Farbe an die Funktion übergeben. Schauen wir daher erstmal, wo die Farben herkommen.

Die 16 Farben des C64.
Die 16 Farben des C64.

Dazu geben wir (in main direkt vor jmp *) einmal alle Farbkombinationen, die mit zwei BITs möglich sind, aus. Damit wir die Ausgabe besser erkennen, machen wir dies achtmal untereinander.

BITMAP_MultiColor_05 Woher die Farben genau kommen, zeigt uns diese Tabelle:

Zur Kontrolle könnt ihr ja nochmal am Ende von main, wieder direkt vor dem jmp *, die Farben auf andere Werte setzen, z. B. mit…

Geänderte Farben
Geänderte Farben

 

Damit sind uns nun alle Grundlagen für den Multi-Color-Modus bekannt. Wer möchte kann zur Übung ja die Funktion  setPixel mal so erweitern, dass man auch die gewünschte Farbquelle übergeben kann. Ich verzichte darauf und möchte lieber, wie versprochen, eine ‚richtige‚ Grafik anzeigen.

 

Ein Koala-Bild anzeigen
KoalaPainter war / ist eines der bekanntesten Grafikprogramme für den C64. Die damit erstellten Bilder wurden im sog. Koala-Format gespeichert, das auch von anderen Programmen unterstützt wurde. Ein Beispielbild, das ihr bitte ins Verzeichnis mit eurem Quelltext entpackt, findet ihr hier im ZIP.

Wir verwenden hier das unkomprimierte Koala-Format, das sehr simpel aufgebaut ist.

 

Wir betten die Grafik einfach direkt in unser Programm ein. Dabei legen wir sie so, dass sie direkt bei unserem Speicherbereich für die BITMAP beginnt. Dann müssen wir nur noch die Daten für den Bildschirmspeicher und das Color-RAM kopieren, sowie die Hintergrundfarbe setzen und schon sehen wir unser Bild. Ein entsprechendes Programm lässt sich schnell erstellen…

Wie ihr seht, ist es wirklich sehr einfach, ein Bild anzuzeigen. Da die BITMAP-Daten durch *=$2000 bereits an der richtigen Position liegen, kopiert showKoala nur noch die Farbinformationen und setzt die Hintergrundfarbe.
Das Programm im Java-Emulator starten.

Ein Koala-Bild anzeigen
Ein Koala-Bild anzeigen

Damit haben wir uns die Standard Grafikmöglichkeiten des C64 erarbeitet. Es gibt aber, wie bereits erwähnt, noch ‘neue‚ Grafikmöglichkeiten, z. B. FLI. Diese werden wir uns später einmal anschauen.


Schrott!!Naja...Geht so...Ganz gut...SUPER! (2 Bewertungen | Ø 5,00 von 5 | 100,00%)

Loading...


 

<<< zurück | weiter >>>

 

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

Schreibe einen Kommentar

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

Protected by WP Anti Spam