VIC-II: Grafikmodes – MCI

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

C64 Studio
Mehr Details, dank MCI (Multi Color Interlaced)

Neben FLI ist der MCI Modus wohl der wichtigste „neue“ Grafikmodus des C64. Diese beiden stellen die Basis für viele weitere Modi dar (z. B. IFLI oder SHI). Werfen wir mal einen Blick auf MCI und wie er funktioniert.

 

Ihr solltet bereits die Beiträge „VIC-II: Grafikmodes – BITMAP (Multi-Color)“ und „VIC-II: Speicherbereiche festlegen“ gelesen haben! Außerdem ist es sicherlich hilfreich, die VIC-II Register griffbereit zuhaben.

 

MCI – Funktionsprinzip

Als Programmierer könnt ihr euch zunächst mal freuen, der Multi Color Interlaced (MCI) Modus funktioniert nämlich technisch viel einfacher, als z. B. FLI. Ihr braucht eigentlich nur zwei passende BITMAPs und müsst ein Wenig scrollen. Für den Grafiker wird es aber etwas aufwendiger, da die Bilder speziell angepasst sein müssen.
Die Idee hinter MCI ist, dass ihr abwechselend, zwei entsprechend vorbereitete BITMAPs anzeigt, die um einen Pixel versetzt sind. Dadurch wirkt das Bild am C64 detailreicher, es zuckt aber auch ständig hin und her.

Aber seht besser selbst…

 

Das Bild (bzw. die Bilder)

Da ich absolut keine künstlerische Ader habe, war ich so frei und habe mir für unseren Test ein MCI Bild ‘stibitzt‚. Es nennt sich „Take me home“, stammt von Leon von der Singular Crew und wurde 2007 veröffentlicht.
Hier könnt ihr euch das Original herunterladen.


Das Programm

Beginnen wir einfach damit, dass wir zunächst die erste Grafik anzeigen. Dafür müssen wir nur ein kleines Programm erstellen, dass euch im Großen und Ganzen schon geläufig sein sollte. Da ihr ja bereits „VIC-II: Grafikmodes – BITMAP (Multi-Color)“ gelesen habt, gibt es eigentlich nichts Neues.

Hier einfach das komplette Listing…

Wie ihr seht, beginnt das Programm mit einer Reihe Konstanten. Wir brauchen nicht alle, aber da die nur für den Assembler von Interesse sind, schaden sie auch nicht. Zu Beginn aktivieren wir zunächst den Multi-Color-Bitmap-Modus. Wir lassen die VIC-Speicherbereiche auf Standard und sorgen einzig in $D018 dafür, dass der Bitmapspeicher in der zweiten Hälfte der ersten 16KB großen VIC-Bank, also bei $2000, beginnt.
Dann kopieren wir mit jsr copycolor die benötigten Farbwerte in den Bildschirmspeicher und ins Color-RAM. Außerdem setzen wir dort die Rahmen- und Hintergrundfarbe. Die Routine sollte euch schon aus „VIC-II: Grafikmodes – BITMAP (Multi-Color)“ bekannt sein, da haben wir sie für die Anzeige des Koala-Bildes genutzt.
Zum Schluß bleibt das Programm einfach in einer Endlosschleife „hängen“.

Jetzt brauchen wir natürlich noch die Daten für das Bild. Ich habe dieses Mal auf das Koala-Format verzichtet und einfach getrennte Dateien für Color-RAM, Bildschirmspeicher und Bitmap angelegt. Das Farb-RAM ist für beide Bilder identisch, daher brauchen wir das nur einmal. Bildschirmspeicher und Bitmap sind aber unterschiedlich, deshalb habe ich die durchnummeriert. Wir binden die drei Dateien einfach hinter unserem Programm ein und sorgen mit *=$2000 dafür, dass die Bitmap direkt an der richtigen Speicherposition liegt. Darum müssen nur, wie oben erwähnt, die Farben einmal kopiert werden.

Um das Programm starten zu können, braucht ihr jetzt natürlich noch die erwähnten Dateien. Im folgenden Download findet ihr bereits alles, was ihr bis zum Ende dieses Beispiels benötigt.


Entpackt bitte alle Dateien und kopiert sie mit ins Verzeichnis zu eurem Programmcode.

Erstellt nun das Programm und startet es. Ihr solltet folgendes Bild sehen:

Das erste Bild
Das erste Bild

 

Das Bild ist nun nichts anderes, als eine normale Bitmap. Wie bereits erwähnt, brauchen wir für MCI aber zwei Bilder. Lasst uns das Programm so ändern, dass wir auch die zweite Grafik anzeigen und mit den F-Tasten zwischen den Bildern umschalten können.

Wir wollen ja gleich automatisch, bei jedem neuen Bildaufbau, zwischen den beiden Grafiken hin- und herschalten. Dass wir dies nicht durch Umkopieren erreichen können, ist euch sicherlich klar. Wir müssten ja jedes Mal die 8000 BYTES der Bitmap plus den 1000 BYTES des Bildschirmspeichers kopieren. Dies schaffen wir aber nicht schnell genug. Also werden wir die zweite Grafik in eine andere VIC-Bank legen und nur die Bänke umschalten. Da ich ein fauler Hund bin, machen wir es uns mit der zweiten Grafik ganz einfach. Wir nehmen die VIC-Bank-1. Dabei legen wir den Bildschirmspeicher und die Bitmap so, dass sie relativ betrachtet, an den gleichen Positionen liegen, wie eben bei der ersten Bitmap.

Fügt dazu am Programmbeginn eine neue Konstante hinzu:

Jetzt binden wir am Programmende, hinter der ersten Bitmap von eben, noch die beiden weiteren Dateien ein. Beachtet, dass wir dieses Mal für beide Dateien eine neue Adresse angeben.

Wenn ihr von den Adressen, den Beginn der von uns verwendeten nächsten VIC-Bank $4000 abzieht, dann landet ihr wieder bei den gleichen Adressen für den Bildschirmspeicher und die Bitmap wie eben $0400 / $2000. Daher müssen wir gleich nur die Bank umschalten, um die Bilder zu wechseln.

Fügt jetzt die folgende Funktion checkKeyboard, am besten direkt hinter jmp *, ein:

Hier prüfen wir einfach, ob F1, F3 oder F5 gedrückt wurde. Bei F1 zeigen wir das erste Bild an und bei F3 das zweite. F5 hat aktuell noch keine Funktion, damit werden wir zum Schluß das automatische Umschalten aktivieren.

Jetzt müssen wir abschließend noch den Aufruf für unsere neue Funktion einfügen. Ersetzt dazu bitte jmp * durch folgende drei Zeilen:

Wenn ihr jetzt das Programm startet, seht ihr zunächst wieder die Grafk von oben. Drückt einmal F3 und ihr seht die zweite. Euch sollte auffallen, dass sich die Bilder geringfügig unterscheiden. Drückt einfach abwechselnd F1 und F3.

Das erste Bild
Das erste Bild (F1)

Das zweite Bild
Das zweite Bild (F3)

 

Wir nähern uns der Zielgeraden. Wie eingangs beschrieben, müssen wir die Bilder regelmäßtig umschalten und das zweite Bild um einen Pixel nach rechts scrollen. Laßt uns dies jetzt einbauen.

Damit das Umschalten kontrolliert abläuft, sollten wir es immer zum selben Zeitpunkt machen. Außerdem wäre es ratsam, dies außerhalb des sichtbaren Bereichs vorzunehmen.

Baut die folgende kleine Routine, die auf eine bestimme Rasterzeilenposition wartet, vor checkKeyboard ein. Falls euch Rasterzeilen noch fremd sind, werft mal einen Blick auf „Der Rasterzeileninterrupt“.

Die wahrscheinlich schon bekannte Funktion wartet einfach solange, bis die im Akku stehende Rasterzeile (hier 255) erreicht wurde.

Fügt nun eine weitere Konstante zum Programm hinzu:

Diese verwenden wir, um zu erkennen, ob wir automatisch umschalten oder nicht. Nehmt anschließend folgende Änderungen hinter jsr copycolor ;Farben kopieren vor, die neuen Zeilen sind gelb hervorgehoben.

Wir initialisieren ZP_AUTO erstmal so, dass direkt beim Start automatisch umgeschaltet wird. Dann warten wir hinter .loop auf unsere Rasterzeile 255. Danach kontrollieren wir die Tastatur und prüfen dann, ob ZP_AUTO noch 0 ist. Falls nicht, springen wir einfach wieder zum Schleifenanfang. Ist der Wert noch 0, dann schalten wir um. Dazu setzen wir zur Sicherheit noch die Datenrichtung im Port A des CIA auf schreiben fürs erste BIT. Um zwischen der VIC-Bank 0 und 1 hin- und herzuschalten, brauchen wir nur das unterste BIT. Dieses lesen wir von $DD00 und schalten es mit eor %00000001 bei jedem Durchlauf um. Da wir auch scrollen müssen, verfahren wir dort genau so! Nach dem Systemstart steht die links / rechts Scrollposition immer auf %111, also ganz links! Wir lesen den Inhalt von $D016 und müssen nur das unterste BIT immer zwischen 1 und 0 umschalten.
Zum Schluß springen wir wieder an den Schleifenanfang.

Jetzt müssen wir noch auf F5 in unserer checkKeyboard-Funktion reagieren. Nehmt dazu die drei kleinen, gelb markierten, Änderungen vor:

Wir machen es uns hier ganz einfach! Der Akku hat schon immer einen passenden Wert, sodass wir diesen an den markierten Stellen nur noch ZP_AUTO schreiben müssen, damit die Automatik aktiviert bzw. deaktiviert wird.

Wenn ihr das Programm jetzt startet, stolpert ihr evtl. über zwei Probleme. Das erste fällt euch sicherlich direkt auf. Links entsteht eine unschöne weiße Line.

Die Line links stört!
Die Line links stört!

 

Das zweite kann auftreten, sobald ihr die Automatik mit F1 oder F3 unterbrecht und dann mit F5 fortsetzt. Dadurch kann unser Timing aus dem Tritt kommen. Ihr müsst dann evtl. wiederholt anhalten / fortfahren bis es wieder passt. Da diese Funktionen nur der Veranschaulichung dienen, kümmere ich mich nicht weiter darum. Ihr solltet aber zur Übung mal dafür sorgen, dass immer richtig angehalten und fortgestetzt wird.

 

Die störende Line muss aber unbedingt weg!
Die Linie entsteht durch unser Scrolling. Wie ihr durch die Linie seht, ist das Bild anscheinend viel kleiner, als der zur Verfügungstehende Ausgabebereich. Zur Kontrolle könnt ihr ja mal die Rahmenfarbe ändern:

Das eigentliche Bild braucht nicht den gesamten Platz.
Das eigentliche Bild braucht nicht den gesamten Platz.

Wir können also einfach, wie bei „Scrolling – Laufschrift“ gesehen, die Bildschirmausgabe auf 38 Spalten reduzieren. Fügt dazu am Programmanfang, wo wir den Multi-Color-Modus aktivieren die markierte Zeile ein:

Jetzt könnt ihr das Programm wieder starten und die nervige Linie ist weg.

Erstellt ihr eigene Bilder und sollten diese bis zum Rand reichen, dann könnt ihr auch Sprites verwenden, um die Linie zu überdecken. Damit könnt ihr auf einen Pixel genau arbeiten und somit, bis auf eine vertikale Pixelzeile, den gesamten Bildschirm ausnutzen.

 

Sobald ihr das Programm laufen lasst, sollte euer Bild ungefähr so aussehen:

Annäherung an das MCI Bild auf dem C64
Annäherung an das MCI Bild auf dem C64

Das Standbild ist selbstverständlich nur eine Annäherung an die C64 Ausgabe des MCI Bildes. Es flackert nicht, zeigt aber wie es ungefähr am C64 wirkt. Wenn ihr dieses Bild mit den vorherigen vergleicht, dann seht ihr bestimmt, dass es viel detaillierter aussieht. Dies kommt durch die Überlagerung der beiden Bilder.

Hier noch ein Versuch als animiertes GIF. Dies wird dem aber auch nicht gerecht, die Wahrheit liegt irgendwo da draußen 😉 dazwischen und läßt sich wohl nur direkt am C64 finden.

GIF-Animation
GIF-Animation

Das Flackern bekommt ihr durch Programmänderungen leider nicht weg! Dies ist aber für sog. Interlace-Auflösungen typisch. Falls ihr einen Amiga habt / hattet kennt ihr das bestimmt, von den entsprechenden Bildschirmauflösungen. Beim Amiga hilft ein Flickerfixer, beim MCI-Modus am C64 muss man es einfach „ertragen“ 😉 .

Die MCI Bilder kommen aber auf alten Röhren sehr viel besser rüber, als auf den modernen LCD- / TFT- / LED-Bildschirmen. Durch die „alte“ Technik, ist das Bild fast ganz ruhig! Probiert es einfach selbst mal aus.

Das MCI-Bild auf meinem SX-64
Das MCI-Bild auf meinem SX-64

 

Hier könnt ihr das Programm auch im Java-Emulator starten.


Wir (OK, ich war es) haben in diesem Beispiel aus Bequemlichkeit, eine Menge Platz für das MCI Bild verschwendet. Ihr könnt die Speicherbereiche natürlich auch besser positionieren und dann beim Umschalten neben der VIC-Bank auch noch die Speicheradressen ändern.


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

Loading...


 

<<< zurück |

 

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