Einfach mal nichts tun…

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 StudioEin Dreizeiler

Fügen wir unserem ‚Sprachschatz‚, mit einem Klassiker der C64 Beispiele, drei weitere Befehle hinzu.

Bevor ihr euch langweilt, weil wir den obigen Teil bereits kennen, kommen wir zum eigentlichen Programm. Es besteht nur aus drei Befehlen, aber die haben wir noch nicht verwendet.

 

INC: INCrement (Byte an der angegebenen Speicherstelle um 1 erhöhen)
INC absolut ($EE, 3B, 6T, NZ)

Der INC-Befehl stellt das Gegenstück zum DEC-Befehl dar. Er erhöht einfach das Byte, dass an der angegebenen absoluten Adresse liegt um eins. Hier erhöhen wir die Rahmenfarbe (die ist an der Speicherstelle $D020 gespeichert) um eins. Es sind ja nur 16 Farben möglich, wir schalten also einfach alle Farbe laufend durch, da wir mit der übernächsten Zeile eine Endlosschleife programmiert haben.

 

NOP: No OPeration (keine Anweisung)
NOP implizit ($EA, 1B, 2T, <keine>)

Das kann doch wohl nicht wahr sein, gibt es wirklich einen Befehl, der nichts macht? Der Befehl hat natürlich Auswirkungen aufs System. Er benötigt ein Byte im Speicher, dadurch wird natürlich auch der Programmcounter (PC / Programmzähler) erhöht und er verlangsamt unsere Programmausführung um zwei Taktzyklen. Der NOP-Befehl kann als Platzhalter und zur gewollten Verzögerung eingesetzt werden.

 

JMP: JuMP to (springe zur angegebenen Adresse)
JMP absolut ($4C, 3B, 3T, <keine>)

Der JMP-Befehl springt immer direkt zur angegebenen absoluten Adresse, er ist also, im Gegensatz zu den ‚Branch-Befehlen‚, von keiner Bedingung abhängig. Ein weiterer Unterschied zu den Branch-Befehlen ist, dass die Sprungweite keiner Beschränkung unterliegt, wir können also an jede beliebe Speicherstelle springen. Wie bereits beim BNE erklärt, bedeutet springen nichts anderes als den PC auf die angegebene Adresse zu setzen. Wir benutzen JMP hier, um zurück zum INC zuspringen und in einer  Endlosschleife unablässig die Rahmenfarbe zu ändern.

Und schon ist unser Programm fertig. Da wir eine Endlosschleife programmiert haben, verzichten wir diesmal auf ein RTS. Das Programm läßt sich nur durch <RUN/STOP>+<RESTORE> bzw. einen RESET beenden.

Nachdem ihr das Programm gestartet habt, achtet auf das Muster im Rahmen. Entfernt anschließend den NOP-Befehl und vergleicht wie sich das Muster verändert.

Ändern der Rahmenfarbe mit & ohne NOP.
Ändern der Rahmenfarbe mal mit und mal ohne NOP-Befehl.

Da der NOP-Befehl die Zeit bis zum nächsten INC verlängert hatte, blieb die Rahmenfarbe auch länger erhalten. Sobald wir NOP entfernen wird die Farbe schneller gewechselt und wir bekommen ein anderes Muster.


Wie eben im Intermezzo angekündigt, folgen nun die weiteren Adressierungsarten für die eben vorgestellten Befehle. Weiter unten gibt es dann doch noch eine Änderung des Beispiels, um eine neue Adressierungsart zu erklären.

Der INC-Befehl bietet die selben Adressierungsart wie der DEC-Befehl. Hier also die oben nicht aufgeführten Adressierungsarten.

INC absolut X-indiziert ($FE, 3B, 7T, NZ)
Erhöht das Byte an der angegebenen Adresse+X-Register.

 

INC Zero-Page ($E6, 2B, 5T, NZ)
Erhöht das Byte an der angegebenen Zero-Page-Adresse.

 

INC Zero-Page X-indiziert ($F6, 2B, 6T, NZ)
Erhöht das Byte an der angegebenen Zero-Page-Adresse+X-Register.

 

Da wir schon DEX und DEY verwendet haben, schauen wir uns doch noch die folgenden beiden Befehle an:

INX: INcrement X-Register (Inhalt des X-Registers um 1 erhöhen)
INX implizit ($E8, 1B, 2T, NZ)
Wie INC nur das hier das X-Register erhöht wird.

 

INY: INcrement Y-Register (Inhalt des Y-Registers um 1 erhöhen)
INY implizit ($C8, 1B, 2T, NZ)
Wie INX nur das hier das Y-Register erhöht wird.


Als Letztes gibt es noch eine neue Adressierungsart, die es nur beim JMP-Befehl gibt. Ändert dafür unser Programm hinter der NOP-Anweisung.

JMP indirekt ($6C, 3B, 5T, <keine>)

Hier wird das Sprungziel von der hinter JMP in den Klammern stehenden Adresse gelesen. Oben schauen wir also nach, welche Adresse an der Stelle jmptable: im Speicher steht und springen dann zu dieser Adresse. In unserem Fall haben wir dort das LSB und MSB des Lables loop: abgelegt.

Damit der indirekte JMP-Befehl weiß, wohin er springen soll, legen wir hinter jmptable: das LSB und MSB des loop: Labels ab.

Achtung: Bei der indirekten Adressierung gibt es eine böse Falle!
Würde unser Label  jmptable: an einer Pagegrenze, z. B. bei $C0FF beginnen, dann ginge der Sprung gehörig schief!
Eine genaue Erklärung für diesen und weitere ‚Fehler‚ des 6510 findet ihr unter ‚Systemfehler!

Das wars auch schon. Ein Programmstart führt wieder zur bereits gesehenen Ausgabe. Da der Befehl 2 Taktzyklen mehr als der ‘normale‚ JMP-Befehl benötigt sieht das Muster wie bei der Version mit NOP aus.


Schon haben wir das Ende dieses Beitrages erreicht.
Im nächsten geht es wieder in die Vollen: Wir werden Binär- und Hex-Zahlen auf dem Bildschirm ausgeben und indirekt Eingaben vom BS auslesen.


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

Loading...


 

<<< zurück | weiter >>>

 

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

5 Gedanken zu „Einfach mal nichts tun…“

  1. Hallo,
    Funktioniert der Befehl „jmp (jmptable:)“ auch immer noch unter CBM Prog Studio 2.8?
    Ich bekomme immer ein „Invalid operand, label or variable“ -Error für diese Zeile, sogar nach einem Copy/Paste von deinem Source.
    Danke!

    1. So, ich habe mir das Beispiel jetzt nochmal in Ruhe angesehen und es klappt tatsächlich nicht, weder mit 2.8.0 noch mit der 2.9.0 BETA!!!

      —-

      OK, sobald ein Label vor dem jmp (jmptable:) kommt, wirft das CBM prg Studio einen Fehler beim Erstellen.
      Mal sehen, was Arthur dazu sagt.

    2. Ich habe eben eine neue BETA erhalten. Dort wurde der Fehler behoben. Den Dank von Arthur geben ich hiermit gerne weiter.

      Das CBM prg Studio 2.9.0 wird voraussichtlich nächste Woche (passend zum Bericht in der neuen Retro) veröffentlicht.

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