Linken & rechten Rahmen öffnen

Für diesen Beitrag wurde das CBM prg Studio verwendet.
weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

CBM prg StudioDen seitlichen Rahmen ‚öffnen‚

In ‚Oberen & unteren Rand öffnen‚ wurde ja bereits erklärt, wie einfach sich der Rahmen über und unter dem Ausgabebereich entfernen lässt. Nach dem Beitrag ‚Raster-IRQ: Bad Lines‚ ist es uns nun auch möglich den seitlichen Rahmen zu entfernen.

 

Die Theorie
Für den oberen & unteren Rahmen mussten wir ja nur zur richtigen Zeit die Anzeige von 25 Zeilen auf 24 und dann wieder zurück ändern. Wie ihr evtl. bei ‚VIC-II: Die Register‚ gesehen habt, kann man neben der Zeilenanzahl auch die der Spalten einstellen. Dazu dient das BIT 3 im Register 22 $D016, hiermit kann zwischen 40 (Standard) und 38 Spalten umgeschaltet werden. Ändern wir nun zum passenden Zeitpunkt die Breite von 40 auf 38 Spalten, dann ‚denkt‚ der VIC-II wieder (wie beim oberen & unteren Rahmen) der Rahmen sei bereits gezeichnet worden und er wird ausgeblendet. Anschließend müssen wir den Wert wieder auf 40 zurückstellen und das Spiel beginnt von neuem.

Leider ist die Umsetzung nicht ganz so einfach. Wir müssen diesmal in jeder Rasterzeile dafür sorgen, dass die Spaltenanzahl geändert und zurückgestellt wird. Dabei bereiten uns die Bad Lines natürlich zusätzliches Kopfzerbrechen. Aber fangen wir doch einfach mal an.

 

Ein erster Versuch
Lasst uns zunächst mal einen stabilen Raster-IRQ so einrichten, dass wir in der letzen Zeile vor dem Ausgabebereich mit unserer Routine beginnen.

Dass sollte jetzt keinen mehr vor Probleme stellen, es wird ein Raster-IRQ für Zeile 47 ( $2F) eingerichtet. Da unsere bekannte Routine für den stabilen Raster-IRQ drei Zeilen benötigt, landen wir somit nach 3TZ in Zeile 50. Dies ist bekanntlich die letzte Zeile vor dem Ausgabebereich und somit die letzte vor der 1. Bad Line. Einzige Änderung zum bekannten Vorgehen ist, dass wir #%00001000 nach $D016 schreiben. Wir verhindern damit, dass die Ausgabe seitlich verschoben ist und aktivieren zur Sicherheit die 40-Spalten.

Die eigentliche Arbeit wird jetzt wieder ab MyIRQ_Main: erledigt.

Hier lassen wir erstmal die letzte Zeile vor der ersten Bad Line und die folgende Bad Line einfach verstreichen. Wir warten also 63TZ und 20TZ.

 

Der richtige Zeitpunkt, um die Anzeige von 40 auf 38 Spalten zu ändern, ist nach 56TZ in der Rasterzeile. Dort wird das letzte Zeichen der aktuellen Zeile ausgegeben. Also warten wir erstmal 50 Taktzyklen um dann mit einem dec $D016 auf 38 Spalten um zuschalten. Dass klappt hier so, da wir dort am Programmbeginn #%00001000 hinterlegt haben. Nach dem dec $D016 geht das BIT 3 also auf 0. Dass sich die Werte fürs Scrolling ändern ist nicht weiter wild, wir machen dies ja direkt mit dem folgenden inc $D016 wieder Rückgängig.

Nun folgt wieder das bekannte Ende des Interrupts:

Vektoren zurücksetzen, Zeile für den 1. Raster-IRQ eintragen, Interrupt bestätigen und zur System-Routine.

 

Ein Start sollte jetzt folgende Ausgabe erzeugen.

Der Rahmen wurde (zumindest für eine Zeile) geöffnet.
Der Rahmen wurde (zumindest für eine Zeile) geöffnet.

Mit einem POKE 53281,1 könnt ihr jetzt die Hintergrundfarbe ändern und so feststellen, dass diese auch durch den offenen Rahmen sichtbar ist. Außerdem fällt euch bestimmt auf, dass der Rahmen rechts beim Ausgabebereich geöffnet wird und dieses bis in die nächste Zeile links anhält. Um jetzt einen größeren Bereich zu öffen, müssen wir das Vorgehen wie bereits angekündigt in jeder Zeile wiederholen. Ersetzt also alles ab MyIRQ_Main: mit den folgenden Programmzeilen:

Hier haben wir nun den Rahmen für mehrere Zeilen geöffnet. Die Bad Lines lassen wir erstmal wieder aus.

Hintergrundfarbe zur Kontrolle geändert.
Hintergrundfarbe zur Kontrolle geändert (Rahmen debuggen ist aktiv).

Die nächste (ausgelassene) Bad Line erkennt ihr an der hellblauen Linie, die unseren Rahmen durchkreuzt. Der Source wird durch das Kopieren der einzelnen Codeblöcke für jede Rasterzeile auch immer unübersichtlicher, daher laßt uns abschließend ein paar Funktionen ‚basteln‚ um für etwas Ordnung zu sorgen. Außerdem wollen wir die Bad Lines mit dem bekannten Scrolling überspringen, damit der Rahmen endlich durchgängig geöffnet wird. Dass wir dann aber keinen Ausgabebereich mehr haben ist wohl klar.

Also fügen wir erstmal an den Programmbeginn, vor das  cli folgende beiden Zeilen hinzu:

Da der VIC-II durch unser Scrollen keine gültigen Daten für den Ausgabebereich mehr bekommt, greift er (wie bereits bei ‚Oberen & unteren Rand öffnen‚ erklärt) auf das BYTE bei $3FFF zurück. Damit wir einen definierten Zustand erhalten, füllen wir es zur Sicherheit mit $00.

Nun bauen wir uns drei kleine Sub-Routinen. Zum besseren Verständnis möchte ich euch jetzt noch darauf hinweisen, dass wir immer so zu den Routinen springen, dass die jeweilige Funktion mit dem 50 Taktzyklus beginnt. Der erste Befehl ist stets ein dec $D016.

Die erste Routine kümmert sich um die letzte Zeile vor einer Bad Line.

Wir öffnen mit dem ersten Befehl den Rahmen (OK eigentlich ändern wir die Spaltenanzahl auf 38). Da gleich eine unerwünschte Bad Line folgt, scrollen wir den Ausgabebereich um eine Zeile. Dann stellen wir zurück auf 40 Spalten und verbummeln den Rest der Zeile.
Diese Funktion müssen wir also immer direkt vor einer Bad Line aufrufen!

 

Nach einer Bad Line wollen wir wieder zurückscrollen, also:

Diese Routine ist bis auf einen Befehl mit beforeBadLine: identisch. Nur dass wir hier mit inc $D011 wieder zurückscrollen.
Diese Funktion muss also immer direkt nach einer Bad Line ausgeführt werden!

 

Da es nun keine Bad Lines mehr gibt, brauchen wir nur noch eine Funktion, die sich um alle ‚anderen‚ Zeilen kümmert:

Hier öffnen wir einfach nur den seitlichen Rahmen und warten, bis die Zeit für diese Zeile rum ist.
Diese Routine also einfach für alle anderen Rasterzeilen aufrufen.

 

Jetzt noch unser Programm ab  MyIRQ_Main: anpassen:

Wie ihr seht, lassen wir 44TZ in der ersten Zeile verstreichen, da diese auch die letzte Zeile vor einer Bad Line ist, springen wir dann zu beforeBadLine:. Anschließend geht es zu normalLine:, da es durch das Scrolling keine Bad Line gibt und zu guter Letzt wird mit afterBadLine: das Scrolling zurückgesetzt. Nun folgen fünf normale Zeilen und wir haben einen 8 Zeilen Block geschafft (OK eigentlich gehört ein kommendes beforeBadLine: noch dazu). Aber wir können nun durch einfaches Kopieren dieser acht Zeilen unseren Rahmen durchgängig öffnen.

Fügen wir also noch ein paar Blöcke hinzu und schließen die Funktion dann auch ab. Ich habe hier auch die benötigten drei Funktionen mit aufgeführt, also vorsicht, falls ihr die oben bereits in den Source aufgenommen habt.

Hier gibt es einfach nur den 2. bis 5. Block, dann wird der Raster-IRQ verlassen. Ganz zum Schluß findet ihr die drei neuen Routinen.

Jetzt haben wir endlich einen durchgängig geöffneten Rahmen. Bei uns zur Zeit zwar nur in den ersten fünf Textzeilen, aber wie ihr den Rest öffnet, wisst ihr nun auch.

Ein durchgängig geöffneter Rahmen.
Ein durchgängig geöffneter Rahmen (Rahmen debuggen).

 

Um den seitlichen Rahmen auch ober- und unterhalb des Ausgabebereichs zu öffnen, müssen, wie bereits bei ‚Oberen & unteren Rand öffnen‚ erwähnt, beide Rahmen entfernt werden. Da bereits beides beschrieben wurde, braucht ihr diese beiden Vorgehensweisen nur kombinieren.

Ändert doch mal die Konstante RASTER am Programmbeginn in RASTER = $20 und ersetzt dann alles ab MyIRQ_Main: mit dem folgenden Block.

Hier beginnt das Öffnen des seitlichen Randes schon in Zeile 32. Da sich dort der obere Rahmen befindet, öffnen wir mit einem weiteren IRQ MyIRQ_2: auch den oberen & unteren Rand.
Hinter MyIRQ_Main: setzen wir die Anzeige zunächst auf 25 Zeilen. Dann verbummeln wir wieder den Rest der Zeile, bis wir im 44TZ angekommen sind. Dann rufen wir 15 mal normalLine: auf. Dies sind die Zeilen im Rahmen. Anschließend geht es mit den eben entwickelten Blöcken weiter. Zum Schluß setzen wir den RAM-Vektor aber auf einen weiteren Raster-IRQ MyIRQ_2:, den wir in Zeile $FA auftreten lassen.

Bei MyIRQ_2: wird nur auf 24 Zeilen umgeschaltet, dann der Hauptinterrupt MyIRQ: in den Vektor geschrieben und schließlich der Interrupt bestätigt und verlassen.

Den Rahmen (teilweise) an allen vier Seiten entfernt.
Den Rahmen (teilweise) an allen vier Seiten entfernt.

 


Wie man den gesamten Rahmen öffnet sollte jetzt kein Problem mehr sein, dass könnt ihr ja mal selbst in Angriff nehmen. Ihr dürft euch nur nicht bei den Taktzyklen verzählen. Da wir durchs Scrollen dann aber keine Ausgabe mehr haben, könnt ihr aktuell wenig damit anfangen. Solltet ihr auf die Idee kommen Sprites zu verwenden, dann werdet ihr euer ‚blaues Wunder‚ erleben. Es klappt dann nichts mehr, dass Thema wird im Beitrag ‚Raster-IRQ: Sprites & Timing‚ behandelt.

Bedenkt auch, dass der Rahmen nicht aus Spass vorhanden ist. Unter VICE ist es kein Problem den vollen Rahmen auszunutzen. Läuft euer Programm aber auf einem echten C64, der an einem Röhrenmonitor angeschlossen ist, dann sieht die Sache schon anders aus, wie ihr auf den beiden folgenden Bildern sehen könnt.

Deus Ex Machina (VICE)
Deus Ex Machina unter WinVICE…

 

...und das Bild auf einem SX-64.
…und auf einem SX-64.

Ein Vergleich mit WinVICE und einem SX-64 ist zwar nicht ganz fair (beim SX-64 ist der Rahmen sehr ‚dünn‚) aber er illustiert das Problem sehr gut.

 

Abschließend noch ein kleines Beispielprogramm, dass ich zum Testen geschrieben habe. Es öffnet im oberen Bereich komplett den Rahmen, zeigt alle 8 Sprites an und bewegt diese von links nach rechts über die gesamte Breite. Das BASIC bleibt verfügbar.

Im oberen Bereich wurde der Rahmen komplett entfernt.
Im oberen Bereich wurde der Rahmen komplett entfernt.

Wer es in Bewegung sehen möchte, kann sich das Beispiel als D64-Image herunterladen, der Java-Emulator kommt damit leider nicht klar!


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

Loading...


 

<<< zurück |

 

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

Schreibe einen Kommentar


Beachtet bitte, dass ich eure Kommentare erst manuell freigegeben muß, bevor sie auf der Seite erscheinen! Da ich nicht pausenlos am Rechner sitze, kann es schon mal etwas dauern, bis ein Kommentar für alle sichtbar ist.

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

Protected by WP Anti Spam