Landung 002

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 StudioKeep watching the sky

Nach einer etwas längeren Vorbereitungszeit, soll nun ein blauer Himmel über dem Canyon entstehen.
Da die Volour den Sinkflug von Space Commander Rick Razor bemerkt haben und in erhöhter Alarmbereitschaft sind haben sie auch noch ein Laser-Raster über den Canyon gelegt, so dass das Landungsschiff den Canyon nicht mehr verlassen kann!

ACHTUNG: Das Wissen aus den Beiträgen ‚Interrupts‚, ‚Ein erster NMI‚ und besonders ‚Der Rasterzeileninterrupt‚ wird vorausgesetzt!

 

‚Rahmen‚-Programm
Wer sich das Programm aus dem letzten Beitrag ‚Landung 001‚ im ZIP einmal angesehen hat, wird das folgende Listing schon kennen. Hier gibt es nichts wirklich Neues, alles wurde so ähnlich schon beim Puzzle gezeigt.

Neu sind hier eigentlich nur die  incasm-Anweisungen, die aber auch schon in ‚Landung 001‚ erwähnt wurden. Der Rest sollte kein Problem darstellen. Es wird direkt zum Start nach init_Lander: gesprungen, um die Leveldaten zurückzustellen. Aktuell wird nur der Canyon gezeichnet. Auch die Funktionen fürs Zeichnen wurden beim Puzzle bereits verwendet. Nach der Rückkehr vom Zeichnen, bleibt das Programm einfach in einer Endlos-Schleife bei gameloop: ‚hängen‚.

 

Den Raster-IRQ einrichten
Um die Rahmenfarbe unterschiedlich einzufärben, wird jetzt fast 1:1 das ‚Flaggen-Beispiel‚ verwendet. Der einzige Unterschied ist die Verteilung der Farben und dass eine Farbe blinkt.

Dazu werden drei Konstanten eingefügt:

In diesen Konstanten steht wo jeweils, die Farbe für den Himmel, Laser und Canyon beginnen soll.

Danach wird die Initialisierung, wie unten gelb markiert, eingefügt.

Die neuen VIC-Konstanten wurden zu Beginn mit incasm "system_const.asm" eingefügt. Das Programm sperrt erstmal wieder alle Interrupts und legt die Adresse der Interrupt-Routine lander_irq: im RAM-Vector JT_IRQVECTOR = $0314 / 15 ab. Dann wird die aktuelle Interruptmaske VICIRQMASK = $D01A so gesetzt, dass der VIC-II erstmal nur Raster-IRQs erzeugt. Anschließend muss der VIC-II noch wissen, wann er überhaupt einen Rasterinterrupt auslösen soll. Der Himmel beginnt bei Zeile 0 RASTERIRQ_SKY = $0, also diesen Wert ins Register für die Rasterzeile VICRASTERROWPOS = $D012 schreiben. Da die Rasterzeile aber neun BITs benötigt, zur Sicherheit auch noch dieses löschen. Es befindet sich in BIT 7 vom Kontrollregister 1 VICCONTROLREG1 = $D011. Schon ist die Initialisierung des Raster-IRQs abgeschlossen und die Interrupts können wieder freigegeben werden.

 

Der eigentliche Rasterinterrupt
Jetzt fehlt nur noch die lander_irq:-Routine. Diese soll IRQs vom VIC-II verarbeiten und andere an die System-Funktion weiterleiten.

Die Funktion holt direkt den Interruptstatus VICIRQSTATUS = $D019 in den Akku. Wenn der VIC-II einen Interrupt ausgelöst hat, dann ist dort das höchste BIT gesetzt, also kann mit einer Prüfung, ob der Wert, der in den Akku geholt wurde, negativ ist, unterschieden werden, ob die Routine zur System-Funktion springt oder den Interrupt selbst verarbeitet. Ist der Akku nicht negativ, dann werden die CIA1-Interrupts durch lesen des CIA1-Kontrollregisters CIA1_IRQCONTROL = $DC0C bestätigt, weitere Interrupts über cli erlaubt und schließlich zur ROM-Routine gesprungen ROM_IRQFUNCTION = $EA31.

 

Wenn das höchste BIT in VICIRQSTATUS gesetzt war landet das Programm bei doRasterIRQ:. Aktuell findet keine weitere Unterscheidung statt, welcher IRQ es eigentlich war, da z. Zt. nur Raster-IRQs vom VIC-II möglich sind. Das Verarbeiten der VIC-Interrupts muss diesem mitgeteilt werden, dazu wird der aktuelle Register-Inhalt wieder nach VICIRQSTATUS zurückgeschrieben, dieser befindet sich ja noch im Akku. Anschließend wird die aktuelle Rasterzeile in den Akku geladen. Hier habe ich mir einen Vergleich mit cmp gespart, setzt man RASTERIRQ_SKY aber auf einen anderen Wert als 0, dann muss natürlich ein Vergleich her. So reicht es jetzt allerdings mit bne zu prüfen, ob der Rasterstrahl in Zeile 0 ist, wenn nicht, wird zur nächsten Prüfung nach doRasterIRQ_Laser: gesprungen. Sonst setzt das Programm die Rahmenfarbe auf hellblau und teilt dem VIC dann mit, dass der nächste Raster-IRQ beim erreichen der Zeile in RASTERIRQ_LASER gewünscht ist. Das wars dann, es geht zum EXIT.

 

Wenn der Strahl nicht in der Startzeile für den Himmel ist, dann landet man bei doRasterIRQ_Laser:. Hier wird geprüft, ob der Rasterstrahl in der Zeile für das Laser-Raster RASTERIRQ_LASER ist. Wenn nicht gehts zum letzten Abschnitt nach doRasterIRQ_Canyon:, sonst läuft fast alles wie eben ab. Aber da das Laser-Raster ‚gefährlich‚ wirken soll, wird es zum Blinken gebracht. Nun klappt es natürlich nicht, einfach $D020 zu erhöhen. Da ab Zeile 0 ja die Rahmenfarbe immer auf hellblau gesetzt wird, würde sich durch ein inc VICBORDERCOLOR die Farbe immer nur auf grau (14 für hellblau +1 = 15 für hellgrau) ändern. Daher wird hier eine Variable im Speicher LaserFlash: laufend erhöht und als Rahmenfarbe verwendet. Dann wird noch dem VIC die Zeile für den letzten Raster-IRQ  RASTERIRQ_CANYON mitgeteilt und zum EXIT gesprungen.

 

Traf die Position des Rasterstrahls bei keiner der vorigen Prüfungen zu, dann geht es bei doRasterIRQ_Canyon: weiter. Hier wird nun einfach die Rahmenfarbe, auf die des Canyons gesetzt und für den nächsten Raster-IRQ wieder der Beginn des Himmels eingetragen. Danach läuft das Programm direkt zum EXIT weiter.

 

Beim EXIT werden einfach die Register wieder vom Stack geholt und der Interrupt mit rti verlassen.

Dahinter wurde noch die Hilfsvariable  LaserFlash: für das Blinken des Laser-Rasters eingefügt.

Jetzt sieht alles wie gewünscht aus:

Love_2_2_1
Der Rasterzeileninterrupt in Aktion (wieder mit aktiver CRT-Emulation)

 

 


Oops, da war ich doch etwas redseliger als geplant. Beim nächsten Mal geht es dann wieder um Sprites. Das Landungsschiff wird in die Szene aufgenommen.


 

Start im Java Emulator

 


Schrott!!Naja...Geht so...Ganz gut...SUPER! (3 Bewertungen | Ø 4,33 von 5 | 86,67%)

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