JSR $hhll

Aus C64-Wiki
(Weitergeleitet von jsr)
Zur Navigation springenZur Suche springen
Mnemonic: JSR $hhll
Opcode: $20
Operand(en): $ll $hh
Anzahl der Bytes: 3
Befehlsgruppe: Sprungbefehl
Adressierung: absolut
Beeinflusste Flags im Statusregister:
keine
Taktzyklen: 6


Der Assembler-Befehl JSR $hhll verzweigt zur angegebenen Adresse, indem der Programmzähler (PC) direkt auf diesen Wert gesetzt wird, wo dann die Programmausführung fortsetzt.
Vor der Verzweigung wird die um 1 verminderte Rücksprungadresse am Stapel gesichert, mit der der Befehl RTS am Ende des aufgerufenen Unterprogramms wieder an die aufrufende Stelle zurückkehren kann (dabei die Rücksprungadresse am Stapel um 1 korrigierend).

Die genauen Schritte, die bei JSR ablaufen, sind wie folgt:

  1. Programmzähler + 2
  2. High-Byte des Programmzählers auf den Stapel
  3. Stapelzeiger - 1
  4. Low-Byte des Programmzählers auf den Stapel
  5. Stapelzeiger - 1
  6. Das Sprungziel des JSR-Befehls in den Programmzähler übertragen

Auf den Stapel wird zuerst das High-, dann das Low-Byte der Rücksprungadresse-1 geschrieben (= Adresse des JSR-Opcodes + 2). Der RTS-Befehl "korrigiert" beim Rücksprung die vom Stapel genommene Adresse durch Addition von 1.

Funktionsprinzip

Ass befehl 20.gif

Bedeutung der Buchstaben im Befehl

JSR Jump to SubRoutine
Verzweige ins Unterprogramm

Beispiel

; Dieses Programm löscht den Bildschirm und gibt einen Text an einer definierten Position aus.
; Programmstart mit SYS 49152

*=$c000   ; Startadresse des Programms

BSOUT = $ffd2

start        lda #147          ; Steuerzeichen für Bildschirm löschen
             jsr BSOUT         ; Löschen durchführen

             ldx #03           ; Zeile 3
             ldy #10           ; Spalte 10
             clc               ; Carry-Flag = 0 Cursorposition setzen, = 1 Cursorposition lesen
             jsr $fff0         ; Cursor setzen

             ldx #$00          ; Index für Textbuchstaben in X-Register
schleife     lda TEXT,X        ; Zeichen holen
             beq ende          ; Endmarkierung? (wenn 0)
             jsr BSOUT         ; Zeichen am Bildschirm ausgeben
             inx               ; nächstes Zeichen der Zeichenkette
             jmp schleife

ende         rts               ; Rücksprung ins Basic

TEXT         .text "C64-WIKI"  ; Zeichenkette
             .byte $00         ; Endemarkierung

Speicherauszug:

.c000	 a9 93		lda #$93
.c002	 20 d2 ff	jsr $ffd2
.c005	 a2 03		ldx #$03
.c007	 a0 0a		ldy #$0a
.c009	 18		clc
.c00a	 20 f0 ff	jsr $fff0
.c00d	 a2 00		ldx #$00
.c00f	 bd 1c c0	lda $c01c,x
.c012	 f0 07		beq $c01b
.c014	 20 d2 ff	jsr $ffd2
.c017	 e8		inx
.c018	 4c 0f c0	jmp $c00f
.c01b	 60		rts
>c01c	 43 36 34 2d 57 49 4b 49 00

Siehe Assembler-Befehl-Beispiele.

Vergleichbare BASIC-Anweisung

Für BASIC V2:

GOSUB

Beispielprogramme