Puzzle 009

Mal verliert man, mal gewinnen die Anderen 😉

C64 Studio

Wir wollen nun einen Timer einbauen. Ich habe mich, entgegen der ersten Planung, dazu entschieden, auf Interrupts beim Puzzle zu verzichten. Wir werden uns also selbst um alles kĂŒmmern mĂŒssen.

Vorbereitungen

Als Erstes habe ich unseren Puzzle-Bildschirm so geÀndert, dass wir rechts einen Zeitbalken erhalten. Mein Zeitbalken ist vier Zeichen breit und 20 Zeilen hoch. Ganz unten wird darauf hingewiesen, was passiert, wenn die Zeit abgelaufen ist.

Der Zeitbalken
Der Zeitbalken

Um spĂ€ter Sieg oder Niederlage anzuzeigen, fĂŒgen wir einfach zwei Funktionen zu unserem Programm, hinter der Routine puzzleMainLoop, hinzu.

Wie ihr seht, machen die beiden Funktionen erstmal nichts Anderes, als den Rahmen grĂŒn beim Lösen des Puzzles bzw. rot bei Ablauf der Zeit einzufĂ€rben. Stutzig werdet ihr evtl. beim Befehl jmp *. Nach dem * folgt meistens eine vorzeichenbehaftete Zahl, wie bei *-3, die die Sprungweite angibt. So könnt ihr z. B. Label sparen, indem ihr direkt die gewĂŒnschte Anzahl Bytes fĂŒr den Sprung angebet. Meistens wird dies mit bedingten SprĂŒngen verwendet, diese benĂŒtzen bekanntlich die relative Adressierung.
Mit * ohne weitere Angaben greift man auf die Adresse des Befehls zu, wir springen hier also direkt wieder zum jmp * und produzieren eine Endlosschleife. Die Verwendung von *-3 kann natĂŒrlich zu Problemen fĂŒhren. FĂŒgt ihr Zeilen hinzu oder entfernt / Ă€ndert welche, mĂŒsst ihr daran denken, auch diese SprĂŒnge zu kontrollieren und ggf. die Byte-Anzahl anzupassen.

Die Zeit lÀuft ab

Wir wollen nun den Zeitbalken in regelmĂ€ĂŸigen AbstĂ€nden verringern, dazu benötigen wir zunĂ€chst zwei neue Variablen. FĂŒgt diese einfach, wie so hĂ€ufig, hinter calc16Bit ein.

In timer steht unsere verbleibende Restzeit. Da unser Zeitbalken 20 Zeilen hoch ist, lassen wir timer auch mit 20 beginnen. Um flexibler zu sein, fĂŒgen wir noch die Variable timerStep ein. Wir prĂŒfen gleich, ob die hier hinterlegte Anzahl Sekunden verstrichen ist, um dann unseren timer herunterzuzĂ€hlen.

Wir benötigen noch zwei neuen Konstanten, am Besten hinter CIA1_B:

Diese Konstanten zeigen auf die Speicherstellen fĂŒr die Sekunden und zehntel Sekunden der internen Uhr des C64, aus dem CIA1. Man kann diese nicht nur lesen, sondern auch setzen. Genau dies machen wir gleich. Wir setzen die Uhr auf Null und prĂŒfen, ob die von uns gewĂŒnschte Zeit verstrichen ist. Da wir nur die Sekunden benötigen, setzen wir auch nur die Werte fĂŒr die Sekunden und zehntel auf Null.

FĂŒgen wir als nĂ€chstes, hinter die Routinen fĂŒrs Gewinnen / Verlieren eine weitere drawTimer, zum Zeichnen unseres Zeitbalkens, ein.

Wenn ihr euch die Funktion anseht, sollte als Erstes auffallen, dass wir den Zeitbalken ĂŒberhaupt nicht zeichnen. Er wird mit unserem Spielfeld ausgegeben, wir Ă€ndern nur die Farbe, aber schauen wir uns das mal im Detail an.
ZunĂ€chst holen wir uns die Sekunden in den Akku und vergleichen diese mit dem in timerStep hinterlegten Wert. Stimmen die nicht ĂŒberein, dann sind wir erstmal fertig. Ist das Intervall erreicht, dann legen wir die Adresse des Farb-RAMs auf der Zero-Page ab. Dabei addieren wir gleich 32, damit unsere Startadress eine Zeile ĂŒber dem Beginn des Farbbalkens liegt. Als nĂ€chstes berechnen wir, wie viele Intervalle bereits verstrichen sind. Dazu holen wir die max. Anzahl (20) in den Akku und ziehen den Wert aus timer ab. Anschließend kopieren wir die errechnete Anzahl ins X-Register, fĂŒr unsere folgende Schleife. Vorher verringern wir timer und springen zu gameOver, falls die Zeit abgelaufen ist. Wenn noch Zeit ĂŒbrig ist, addieren wir fĂŒr jedes verstrichene Intervall 40 auf die Zero-Page-Adresse, um unsere zu Ă€ndernde Zeile zu finden. Sobald wir diese haben, laden wir den Akku mit der neuen Farbe und das Y-Register mit 3 (wir prĂŒfen auf positiv und Ă€ndern so vier Zeichen). Mit der Y-nach-indizierten Adressierung, Ă€ndern wir jetzt die Farbe der vier Zeichen des Balkens (das gilt auch fĂŒr die Spitze, obwohl dort nur zwei Zeichen verwendet werden). Zum Schluß setzen wir die Sekunden wieder auf Null und verlassen dann die Funktion.

Den Aufruf der drawTimer-Funktion fĂŒgt ihr direkt vor das jmp puzzleMainLoop in puzzleMainloop ein (s. gelbe Zeile).

Damit unsere Uhr korrekt startet, sollten wir vor puzzleMainLoop die Sekunden und zehntel Sekunden auf Null setzen.

Bevor wir das Programm testen, sollten wir noch eine letzte Kleinigkeit Àndern. Sucht in checkInput nach der Zeile jsr performInput und Àndert den Abschnitt wie hier markiert:

Damit haben wir es mal wieder geschafft, wenn ihr das Programm startet, dann sollte die Zeit ablaufen und das Programm aufs Gewinnen / Verlieren reagieren.

Die Zeit lÀuft ab, trotzdem gewonnen!

Das Puzzle ist nun fast fertig. Im nĂ€chsten Beitrag werden wir noch dafĂŒr sorgen, dass der Spieler es nochmal versuchen kann.


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

Loading...


ZurĂŒckWeiter

2 Gedanken zu „Puzzle 009“

  1. Servus!

    Ich muss zuerst mal ein Kompliment fĂŒr deine Arbeit aussprechen. Das ist mit Abstand das Beste, das ich je gesehen habe. Wenn es so was auch noch fĂŒr den Amiga gĂ€be, dann wĂ€ren die langweiligen Sonntag Nachmittage Geschichte 😉

    Ich habe da eine Frage, der Timer sollte ja eigentlich warten, bis der SekundenzĂ€hler auf 2 steht, so wie es unser timer Intervall vorgibt, das wĂ€ren dann gesamt 40 Sekunden. Bei mir lĂ€uft das aber derart schnell ab, dass in ca. 10 Sekunden alles vorbei ist…
    Liegt das daran, dass Vice viel schneller lÀuft als ein originaler C64?

    Ich schaffe es nicht, den Monitor von Vice geschickt mit Breakpoints aus CBM prg Studion zu beschicken. Wenn du mal Zeit hast, mit der du nicht weißt was anzufangen 😉 könntest du darĂŒber berichten. Ich denke da wĂ€re nicht nur mir geholfen.

    Nochmals Danke fĂŒr deine Arbeit, schlichtweg GEWALTIG!!!!

    1. Danke fĂŒr die ‚Blumen‚.

      VICE kann zwar schneller laufen, das musst du aber im MenĂŒ einstellen. Normalerweise steht in der Titelleiste die Geschwindigkeit. Dort sollte 100% 50fps stehen (es kann durchaus mal um 3% schwanken). Tritt das Problem mit deinem eigenen Source oder auch mit ‚meinem‘ D64-Image auf?

      Ich ziehe mittlerweile das C64 Studio vor. Dort kannst du direkt in der IDE tracen, das erleichtert vieles.

Schreibe einen Kommentar

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

Protected by WP Anti Spam