Nach der Joystickroutine in Omikron-BASIC in der Juniausgabe zeigen wir Ihnen jetzt eine Variante in GfA-BASIC, um den freudigen Knüppel auch in eigenen Programmen benutzen zu können.
Wenn man nach einer Lösung sucht, probiert man es wahrscheinlich erst einmal mit dem Durchstöbern von BASIC Büchern. An irgendeiner Stelle wird dann erklärt, wie man mittels ’Peek’ auf eine bestimmte Adresse zugreifen kann, die die Daten des Joysticks enthält. Doch hat diese Lösung dann meist den Nachteil, daß nur der zweite Joystick benutzt werden kann.
Es geht aber auch anders:Wir sprechen unmittelbar den Tastaturprozessor an und versuchen, die Routine möglichst allgemein zu formulieren. Wenn man beim neuen TOS die gleiche(n) absoluten Adresse(n) verwendet (siehe Lösung 1), könnte man den Knüppel noch so stark verrenken, eine Abfrage des Joysticks wäre nicht möglich. So ist die zweite Lösung besser, denn sie läuft dann auch mit dem neuen TOS. Dieses wurde ja bekanntlich zwecks Blitter aufgeräumt und somit verändert. Um nun Kompatibilität auch zur neuen Version des TOS zu erreichen, benutzen wir hier bestimmte Betriebssystemfunktionen. Ein Beispiel zum Verständnis: Xbios(2) liefert die Anfangsadresse des angezeigten Bildschirm-Speichers X. Wenn sich X in einem neuen TOS ändert, liefert Xbios(2) aber dennoch die richtige Adresse. Deshalb funktionieren auch Programme, die diese Funktion verwenden, auf ST-Computern, die eine unterschiedliche Speicherkapazität haben. (Der ST schiebt die Bildschirmadresse im Speicher immer nach oben.) Für unsere Zwecke verwenden wir die Funktion Xbios($14). Diese liefert die Anfangsadresse einer Tabelle, in der wiederum Adressen von Routinen stehen, die Daten des Tastaturprozessors verarbeiten. In dieser Tabelle ist z. B. neben der Joystickadresse auch die Adresse der Maus-Routine 'eingetragen’. Um nun für beide Joysticks die Adressen zu erhalten, addieren wir zum Tabellenanfang ’Tabanf%’ jeweils einen Wert. Für Joystick 1 ist dies 60, für den anderen 61. Diese Adressen werden später in der Prozedur ’Pruefe’ auf Ereignisse untersucht. Nun muß der Tastaturprozessor so programmiert werden, daß er ab jetzt die Joystickwerte entgegennimmt. Dies geschieht mit der Funktion Xbios($19), welche dem Prozessor dafür den Befehlcode $14 übergibt. Omikron-BASIC ist hier eleganter. Hier hätte man einfach einen Kanal zum Tastaturprozessor mittels 'Open „K“’ eröffnet, und dann in diesen die Befehlcodes geschrieben, bzw. die Joystickwerte ausgelesen. Nun aber zurück zu unserem Programm. Um die Joystickwerte zu erhalten, müssen wir die Adressen Ereignis 1% und Ereignis2% mittels des BASIC Befehls ’Peek’ auslesen. Die Werte ändern sich entsprechend den Bewegungen der Joysticks (siehe Ereigniswerte im Listing). Die diagonalen Werte ergeben sich logischerweise aus den anliegenden Werten. Beispiel:
rechtsoben = rechts + oben
8+1 = 9.
' >> Joystickabfrage von Dirk Beyer <<
' >> in GfA BASIC <<
'
Hidem ! Maus aus
Tabanf%=Xbios(34) ! Tabelle mit Adresse fuer Abfrage
Ereignis1%=Tabanf%+60 ! Adresse fuer Joystick 1
Ereignis2%=Tabanf%+61 ! Adresse fuer Joystick 2
'
' Befehlcodes, die durch Xbios(&h19) an den
' Tastaturprozessor geschickt werden:
'
A$=Chr$(&H14) ! Joystick abfragen
'
B$=Chr$(&H15) ! \
' Maus wieder an
C$=Chr$(&H8) ! /
'
X=Xbios(&H19,3,L:Varptr(A$)) ! Joystickabfrage ein
While Inkey$=""
Gosub Pruefe
Wend
'
X=Xbios(&H19,3,L:Varptr(B$)) ! Joystickabfrage aus
X=Xbios(&H19,3,L:Varptr(C$)) ! Maus ein
'
Procedure Pruefe
'
' Ereigniswerte:
'
' 5 1 9
' \ | /
' 4 - 0 - 8
' / | \
' 6 2 10
'
' Feuertaste = 128
' Ausserdem möglich: z.B. Feuer + links
' = 128 + 4
' = 132
J1%=Peek(Ereignis1%)
J2%=Peek(Ereignis2%)
If J1%<>0
Print At(22,10);"Joystick 1: ";J1%;" "
Endif
If J2%<>0
Print At(40,10);"Joystick 2: ";J2%;" "
Endif
Return
Diese Werte für links, rechts, Feuer usw. können beliebig kombiniert sein. Wird der Knüppel nach oben gedrückt, während der Feuerknopf gedrückt ist, entspricht dies dem Ereigniswert 1 + 128 = 129. Das Programm verharrt solange in einer Abfrageschleife, bis eine Taste gedrückt wird. Danach wird dem Tastaturprozessor ein Befehl geschickt, um die Maus wieder zu aktivieren.
Probieren Sie diese Joystickroutine aus! Sie können auch auf eine andere Art feststellen, welcher Knüppel bewegt wurde. Dazu fragt man die Adresse ’Tabanf+59’ ab. Enthält diese Adresse den Wert 254, wurde Joystick 1 benutzt, anderfalls(255) der zweite.
Sie können mit dem Tastaturprozessor „beliebig“ experimentieren. Doch rate ich Ihnen, das Programm im Editor immer vorher abzuspeichern, bevor Sie in die Tiefen der Tastatur Vordringen. Irgendwann wird der Tastaturprozessor unwillig und Sie lösen einen Systemabsturz aus...
Wir wollen nun die Maus näher untersuchen. Klicken wir einfach einmal die linke Taste, dann zeigt unser ahnungsloses Programm einen Wert für Joystick 1 an, der dem gedrückten Feuerknopf entspricht. Die rechte Taste ist dem Knopf des zweiten Joysticks gleichzusetzen. Die Daten für die Richtungen und die Tasten erscheinen als Summe. Es gibt im Vergleich zum Joystick einen Unterschied. Anstatt daß die Richtungsdaten - wie beim Joystick - nur dann vorhanden sind, wenn dieser auch wirklich betätigt wird, bleiben die Mausdaten solange erhalten, bis eine Richtungsänderung eintritt. Nun hat die Maus z. B. den Wert 11 geliefert. Jetzt ziehen wir den Mausstecker aus der Buchse. Anstatt der 11 wird jetzt eine 0 angezeigt. Nun schließen wir die Maus wieder an und stellen fest, daß in der Speicherstelle nun wieder der alte Wert 11 steht. Der Tastaturprozessor weiß also, ob eine Maus angeschlossen ist. Und er speichert die Daten. Dieses Spielchen funktioniert auch am zweiten Port. So, und nun sind Sie an der Reihe.