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
' >> 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.
JOYNEU.LST