JOY (TSB)

Aus C64-Wiki
Zur Navigation springenZur Suche springen
JOY (TSB)
Syntax: a = JOY bzw. a = JOY(<n>)
Parameter
n: 0..255 (Portnummer)
Einordnung
Typ: numerische Funktion
Kontext: Peripheriekontrolle
Aufgabe: ermittelt den Zustand des Joysticks in einem der Ports
Abkürzung: jO
Token: $64 $51 (100 81)
Verwandte Befehle
POT - PENX - PENY


Dieser Artikel beschreibt das TSB-Schlüsselwort JOY (TSB).
Das entsprechende Simons'-Basic-Schlüsselwort lautet ebenfalls JOY.

Typ: Systemvariable
Syntax: a = JOY[(<n>)]
oder:   PRINT JOY [(<n>)]

JOY liest den Wert eines der beiden C64-Controlports (CIA 1, $DC00 und $DC01) aus, um einen dort angeschlossenen Joystick für das Programm nutzbar zu machen. Die Werte, die der Port liefert, werden übersetzt in Werte zwischen 0 und 8, wobei jeder Wert einer bestimmten Richtung zugeordnet ist. Wenn der Feuerknopf betätigt wird, addiert sich ein Wert von 128 zum Richtungswert hinzu:

Wert mit Feuer Richtung
0 128 -
1 129 N
2 130 NO
3 131 O
4 132 SO
5 133 S
6 134 SW
7 135 W
8 136 NW

Gegenüber Simons' Basic hat die TSB-Version des Befehls zwei Vorteile. Der wichtigste ist die Tatsache, dass beide Controlports ausgelesen werden können. Der zweite ist, dass unter TSB die Nummer des Controlports (1 oder 2) als Argument für die Funktion angegeben werden kann. Somit sind Verwechslungen nicht mehr so leicht möglich. Die Funktionsargumente löst TSB dahingehend auf, ob sie geradzahlig (Controlport 2) oder ungeradzahlig sind (Controlport 1), wobei der Wert 0 als geradzahlig betrachtet wird.

Ab TSB v2.40508 erlaubt ein POKE, die Joystickabfrage auch ohne Warteschleife durchzuführen: POKE $919D, 208. Der Normalwert an dieser Stelle lautet 103. Beachten: Nach dem POKE können Tastatur und Joystick nicht mehr gleichzeitig abgefragt werden (wie im Beispiel unten ab Programmzeile 1330).

Beispiel: 

1600 PROC stick
1610   x7=JOY(1):
       IF x7=0 THEN END PROC 
1620   IF x7=1 THEN x$="{crsr up}"
1630   IF x7=3 THEN x$="{crsr right}"
1640   IF x7=5 THEN x$="{crsr down}"
1650   IF x7=7 THEN x$="{crsr left}"
1660   IF x7>127 THEN x$=CHR$(13)
1670 END PROC 

Diese Abfrageroutine ist sinnvoll in Programmen mit kombinierter
Joystick-Tastatur-Bedienung und liest einen Joystick in Port 1 aus. 
Eine solches Programm müsste die folgende Hauptabfrageroutine 
aufweisen (Ausschnitt):

1330     REPEAT :
           IF lg>0 THEN PRINT "_";
1332       GET x$:
           stick:
           IF x$="" THEN 1332
1335       IF x$=CHR$(20) THEN IF l THEN l=l-1:
             x9$=LEFT$(x9$,l):
             x$=x9$+" ":
             set:
             x$=""
1337     UNTIL x$>"":

Kommentar: In LG steht die zulässige Gesamtlänge der Eingabe, in L die aktuelle Länge. 
In X9$ wird die Summe der Eingabe-Tastendrücke zusammengestellt. CHR$(20) ist das Backspace-
Zeichen und löscht den rechten Rand von X9$, solange dort etwas vorhanden ist.