Programmer's Corner 11/91 ------------------------- von Carsten Strotmann Tastaturabfragen Teil 2 Nach der Routine zum Einlesen von Zeichenketten im letzten Teil liegt das Augenmerk diesmal auf der Abfrage einzelner Tasten. Die einfachste Abfrage eines Tastendruck geschied über den Tastaturtreiber K: und dem CIO- Befehl GET. Hierzu muß zuerst ein Kanal für den Tastaturtreiber geöffnet werden. CLOSE #1 OPEN #1,4,0,"K:" Danach wird über den BASIC Befehl GET auf einen Tastendruck gewartet und dann der ASCII Wert der gedrückten Taste übergeben (hier an die Variable KEY). GET #1,KEY CLOSE #1 Turbo Basic Programmierer können sich das Öffnen und Schließen des Tastatur- kanals sparen, der GET Befehl ohne Kanalangabe bewirkt hier eine Tastatur- abfrage (GET KEY). Diese Art der Tasta- turabfrage ist die gebräuch- lichste und reicht in den meisten Fällen aus. Manchmal möchte man jedoch, daß das Programm durch die Tastaturabfrage nicht angehalten wird. Hierzu kann man die Speicherstelle CH (764/$2FC) odr KBCODE (53769 / $D209) abfragen, in welcher der Tastaturwert der letzten gedrückten Taste abgelegt wird. Leider unterscheidet sich dieser Tastaturcode sehr stark vom gewohnten ASCII-Code. Für diesen Tastaturcode gibt es zwar in einigen Büchern Tabellen, jedoch ist es einfacher, den Wert mittels ein paar Zeilen in den dazugehörige ASCII-Code umzurechnen. Zu diesem Zweck befindet sich im Betriebssystem des Atari XL/XE eine Tabelle, die für jeden Tastatur- code den dazugehörigen ASCII-Code enthält. Der Vektor KEYDEF (121-122 / $7A-$7B) zeigt auf diese Tabelle. Die Umrechnung funktioniert so: CH = PEEK (764) : REM Einlesen des Tastaturcodes KEYDEF = PEEK (121) + PEEK (122) * 256 : REM Position der Tabelle KEY = PEEK (KEYDEF + CH) : REM Ermittlung des ASCII-Codes Diese Umrechnung funktioniert in BASIC und auch in anderen Programmiersprachen (QUICK, ACTION!...), nicht aber in TURBO-BASIC! Warum? TURBO-BASIC benutzt den Speicherplatz unter dem Betriebs- system, d.h. das Betriebssystem ist abgeschaltet und die Umwandlungstabelle wird nicht gefunden. Abhilfe schafft ein kleines Maschinenspracheprogramm, welches sich auch im Beispiellisting auf dieser Diskette befindet: KEYDEF = $7A ATACHR = $2FB CH = $2FC PLA Parameteranzahl von Stack nehmen (USR-Aufruf) LDY CH Tastaturcode in Y laden LDA (KEYDEF),Y ASCII-Wert ermit- teln STA ATACHR und in ATACHR speichern RTS zurück zum BASIC Interessant ist die Abfrage des Tastaturcodes auch deshalb, weil hierdurch Tastenkombinationen mit SHIFT und CONTROL abgefragt werden können. Diese Werte können natürlich nicht in ASCII-Werte umgewandelt werden, weil hierfür keine ASCII-Werte existieren. Die HELP Taste wird mittels der Speicherstelle HELPFLG (732 / $2DC) abgefragt. Die Werte in dieser Speicherstelle haben folgende Bedeutung: 0 = HELP wurde nicht gedrückt 17 = HELP wurde gedrückt 81 = SHIFT+HELP wurde gedrückt 145 = CONTROL+HELP wurde gedrückt Wichtig ist zu wissen, daß das Register HLPFLG nicht wieder auf Null zurückgesetzt wird, wenn die HELP-Taste nicht mehr gedrückt wird. Abgefragt werden kann die HELP-Taste auch durch das Register KBCODE (53769 / $D209). Hier finden sich die Tastatur- codes aus dem Register 764 und die Codes für die Helptaste aus dem Register 732. Wichtige Speicherstellen für die Tastaturabfrage: POKMSK (16 / $ 10) --> ist das Schattenregister von IRQEN (53774 / $D20E), die einzelnen Bit ermöglichen das Sperren von IRQ-Interrupts (Bit löschen): BIT 7 = BREAK-Tasteninterrupt, BIT 6 = Tastaturinterrupt BRKKEY (17 / $11) --> Steht in diesem Register eine Null, so wurde die BREAK-Taste gedrückt FKDEF (96-96 / $60-$61) --> Zeiger auf die Funktionstastentabelle des 1200 XL KEYDEF (121-122 / $79-$80) --> Zeiger auf die Tastaturcodetabelle für die Umrechnung in ASCII-Werte (s.o.) VKEYBD (520-521 / $208-$209) --> Zeiger auf die Routine zum Abarbeiten des Tastaturinterrupts SRTIMR (555 / $ 22B) --> Zähler für die Tastenwiederholung. Bei jedem Tastendruck wird der Wert aus KRPDEL hier hineingeschrieben und dann jeden während des VBI's heruntergezählt. Erreicht dieser Zähler der Wert Null und ist die Taste immer noch gedrückt, so wird die Taste wiederholt ausgegeben BRKKEY (566-567 / $236-$237) --> Zeiger auf die Routine zum Abarbeiten des BREAK-Tasteninterrupts KEYDIS (621 / $26D) --> Ein- und Ausschalten der Tastatur. Eine Null bedeutet, das die Tastatur nicht gesperrt ist, jeder anderer Wert sperrt die Tastatur. Beim 1200XL kann die Tastatur über CONTROL-F1 gesperrt werden. ESCFLG (674 / $2A2) --> Durch Druck auf die Escape Taste wird in dieses Register der Wert 128 geschrieben. Wird hiernach eine Steuertaste gedrückt (z.B.. CLEAR), so wird das dazugehörige Steuerzeichen auf dem Bildschirm ausgegeben INVFLG (694 / $2B6) --> Steht in diesem Register der Wert 128, so werden alle Tastenanschläge invers ausgegeben, ist der Wert Null, so erfolgt die Ausgabe normal. Dieses Register wird durch die INVERS-Taste geändert SHFLOK (702 / $2BE) --> Dieses Register wird von der CAPS-Taste verändert um Klein-, Groß- und Graphikzeichen auszugeben. Enthält es den Wert Null, so werden Kleinbuchstaben ausgegeben, beim Wert 64 Großbuchstaben (SHIFT-LOCK) und bei 128 Graphikzeichen (CONTROL-LOCK). Der Wert 255 sperrt die Tastatur. KEYDEL (729 / $2D9) --> Zeitdauer bis zur Tastenwiederholung KEYREP (730 / $2DA) --> Wiederholungsgeschwindigkeit bei der Tastenwiederholung Hier kann die Zeitdauer bis zur Tasten- wiederholung und die Wiederholungs- geschwindigkeit eingestellt werden. Wen die vorgegebenen Werte zu langsam sind, sollte es mit 18 für KEYDEL und dem Wert 2 für KEYREP versuchen NOCLIK (731 / $2DB) --> Eine Null in diesem Register bewirkt, das nach jedem Tastendruck ein Klickgeräusch erzeugt wird. Der Wert 255 schaltet das Klicken ab HLPFLG (732 / $2DC) --> Flag für die HELP-Taste (s.o.) CH1 (754 / $2F2) --> Tastaturcode der zuletzt gedrückten Taste CH (764 / $2FC) --> Tastaturcode der derzeit gedrückten Taste SSFLAG (767 / $2FF) --> Flag für Start/Stop. Dieses Register wird durch die Taste Control-1 gesetzt. Der Wert 255 in diesem Register stoppt die Bildschirmausgabe. CONSOL (53279 / $D01F) --> Register zur Abfrage der CONSOL-Tasten (s.o.) KBCODE (53769 / $D209) --> Register zum Lesen des Tastaturcodes SKSTAT (53775 / $D20F) --> Register für serielle Schnittstelle. Folgende Bits sind für die Tastatur interessant (Bits gelöscht): BIT 3 --> SHIFT Taste gedrückt BIT 2 --> zuletzt gedrückte Taste ist immer noch gedrückt In der nächsten Ausgabe der Programmer's Corner geht's um den Tastaturinterrupt, das Sourcelisting des Tastaturinterrupts und Tips, wie man ihn verändert kann. Bis dahin Good Byte und eine schöne Adventszeit wünscht euch Carsten Strotmann