Tricks for Amusement - RTS als Switch (6502)

  • Ich habe gedacht, daß man evtl. mal ein paar lustige Tricks sammeln könnte, die einem so über den Weg laufen. Mit Beschreibung und verständlich erklärt zum Nachbasteln, auch für Leute, die evtl. (noch) kein Demospitzenlevel erreicht haben. Oder eben einfach, weils nett ist.



    No1 : Rücksprungbefehl als Auswahlswitch


    Normalerweise kann man ja Unterrotinen anspringen und wieder verlassen - mit JSR und RTS. Will man nun bestimmte Sprünge zulassen oder unterbinden, ist eine interessante Möglichkeit, einen zusätzlichen Sprungbefehl einzufügen und wenn man ein Subroutine abschalten will, einfach deren Befehl für JMP durch ein RTS zu ersetzen.


    Also so:


    Code
    1. .5000 JSR $6000
    2. .5003 JSR $6050
    3. .5006 JSR $6100
    4. ...
    5. .6000 JMP $subroutine1 ---> springt zu subroutine1 ... RTS kehrt von dort aber zu JSR zurück
    6. .6050 JMP $subroutine2 ---> springt zu subroutine2 ... ~
    7. .6100 JMP $subroutine3 ... ~


    Um jetzt z.B. Subroutine2 abzuschalten, überschreibt man den Opcode für den JMP Befehl in $6050 einfach mit dem für RTS.

    Code
    1. LDA #$60
    2. STA $6050


    oder von BASIC aus mit einem einfachen POKE 24656,96

    wodurch aus dem JMP Befehl ein RTS wird und somit direkt zurückgesprungen wird zum ursprünglichen JSR Befehl.

    Die eigentliche Sprungadresse bleibt dabei aber natürlich erhalten, da nur der Opcode sich ändert.


    Um die Subroutine wieder zuzuschalten, schreibt man entsprechend den Wert für den JMP Befehl ($4C bzw. 76 dezimal) an die Stelle $6050.


    Vorteil der Sache ist, daß man a.) den Schalter ganz einfach "von außen" (BASIC) bedienen kann, daß b.) irgendwelche Tests zur Laufzeit wegfallen ( IF flag THEN subroutine).

    Nachteil ist a.) : es ist ein wenig ein "schmutziger Demotrick", weil selbstmodifizierend (aber in Maßen) und b.) die JMPs kosten unnötig Zeit, noch mehr aber die Rücksprünge, wenn die Subroutine gar nicht angesprungen wird.