Tastatur
Aus C64-Wiki
Die Tastatur ist das wichtigste Eingabegerät eines Computers. Der Benutzer kann hierüber alle verfügbaren Zeichen eingeben. Bestimmte eingegebene Zeichenfolgen werden vom Computer als Befehle wie z.B. LIST, RUN, LOAD, SAVE erkannt. Durch eine Aneinanderreihung (siehe Programmierung) von Befehle oft in Kombination mit Zeilennummern entstehen Programme, die dann bearbeitet, ausgeführt, abgespeichert oder geladen werden können.
Der C64 ist ein Tastaturcomputer, also ein Computer, der die Tastatur in sein Gehäuse integriert hat und mit dieser optisch zu einer Einheit verschmilzt. Zu dieser Gattung gehören auch andere Heimcomputer wie der Commodore VC 20, C16, C116, C128, Plus/4, Amiga oder Atari ST.
Die Tastatur ist das Haupteingabegerät des C64.
Inhaltsverzeichnis |
[bearbeiten] Hardware
[bearbeiten] Aufbau
Die C64-Tastatur besitzt 66 Tasten.
- Shift Lock ist mechanisch rastend und ist parallel zum linken Shift geschaltet.
- Restore wirkt direkt über ein Monoflop auf den NMI-Eingang des Prozessors.
- Die restlichen 64 Tasten sind in einer 8x8-Matrix zusammengeschaltet (siehe unten).
Funktionsweise der Matrix:
- Wurde z.B. A gedrückt, so besteht eine leitende Verbindung zwischen den Leitungen PA1 und PB2 der CIA 1.
[bearbeiten] Abfrage
Die Funktionsweise der Tastaturabfrage, wie sie im KERNAL implementiert ist:
- Die Portbits PB0-PB7 des CIA 1 werden als Eingänge programmiert ($DC03=0).
- Ohne Tastendruck liegt auf den Eingängen wegen der im Portbaustein integrierten Pull-Up-Widerstände ein High-Pegel.
- Die Portbits PA0-PA7 des CIA 1 werden als Ausgänge programmiert ($DC02=255) und auf 1 (High-Pegel) gesetzt ($DC00=255).
- Danach wird eine 0 (Low-Pegel) durch die Portbits PA0-PA7 geschoben ($DC01=254,253,251,247,239...) und die Eingänge an PB abgefragt.
- Werden Nullen bei den Portbits PB0-PB7 festgestellt, so sind die entsprechende(n) Taste(n) gedrückt.
[bearbeiten] Probleme
- Da u.a. die Joysticks die gleichen Leitungen benutzen (jede Bewegung zieht eine der Leitungen fest auf Masse), gibt es diverse Nebenwirkung.
- Bei der KERNAL-Implementierung der Tastaturabfrage fällt das bei Joystick 1 am stärksten auf (Zeichen erscheinen ohne Tastendruck), aber auch Joystick 2 stört die Abfrage der Tastatur (Tasten werden nicht mehr oder falsch erkannt).
- Alternative Tastaturabfragen (in eigenen Programmen oder Spielen) können zwar verhindern, dass Joystick-Bewegungen als Tastendruck erkannt werden (keine CIA-Leitung auf Low gesetzt, liest jedoch trotzdem Low aus => Joystick wird bewegt), jedoch trotzdem nicht die Tastatur (sicher) auslesen, wenn ein Joystick bewegt wird.
- Da in der Tastaturmatrix keine Dioden verwendet werden, werden beim Drücken von mindestens drei Tasten gleichzeitig teilweise weitere Tasten fälschlich als gedrückt erkannt. Dies kann man z.B. testen, indem man beide Cursor-Steuertasten gedrückt hält und dabei die linke SHIFT-Taste auf- und abbewegt. Es erscheinen Zeichen wie bei SHIFT-"A". In der Matrix unten im Artikel sieht man, dass, wenn man ein gedachtes Rechteck mit der linken SHIFT-Taste und den beiden CRSR-Tasten als drei Ecken bildet, die vierte Ecke auf der Taste "A" liegt. Nach derselben Methode kann man bei anderen Kombinationen von drei Tasten herausfinden, ob und welche weiteren Tasten fälschlich erkannt werden. Dieser Effekt wird von Emulatoren bisher (2008) nicht emuliert.
- Aus C64-Sicht lassen sich manche Kombinationen von Inputs prinzipiell nicht auseinanderhalten, so kann er z.B. nicht zwischen Joystick 2 hoch + F1 und Joystick 2 hoch + Joystick 1 Feuer unterscheiden.
[bearbeiten] RESTORE-Taste
Die RESTORE-Taste ist direkt über einen Kondensator mit der NMI-Hardware der CPU verbunden. Da dieser jedoch zumindest bei frühen Brotkasten-C64s zu klein dimensioniert ist, muss man die Taste sehr heftig (=schnell) anschlagen, damit sie anspricht. Abhilfe schafft das Ersetzen bzw. parallele Beschaltung des Original-Bauteiles (51 pF, C38) durch einen 1nF-Kondensator.
[bearbeiten] Schaltung
| CIA 1 Port B ($DC01) | Joy 2 | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| PB7 | PB6 | PB5 | PB4 | PB3 | PB2 | PB1 | PB0 | |||
| CIA1 Port A | PA7 | STOP | Q | C= | SPACE | 2 | CTRL | <- | 1 | |
| PA6 | / | ^ | = | RSHIFT | HOME | ; | * | £ | ||
| PA5 | , | @ | : | . | - | L | P | + | ||
| PA4 | N | O | K | M | 0 | J | I | 9 | Feuer | |
| PA3 | V | U | H | B | 8 | G | Y | 7 | Rechts | |
| PA2 | X | T | F | C | 6 | D | R | 5 | Links | |
| PA1 | LSHIFT | E | S | Z | 4 | A | W | 3 | Runter | |
| PA0 | CRSR DN | F5 | F3 | F1 | F7 | CRSR RT | RETURN | DELETE | Hoch | |
| Joy 1 | Feuer | Rechts | Links | Runter | Hoch | |||||
- Und hier die Anschlussbelegung im C64:
[bearbeiten] Programmierung
Die Tastaturabfragen können mit den BASIC-Befehlen INPUT, GET oder PEEK erfolgen oder über entsprechende Maschinenspracheprogramme (Assembler).
[bearbeiten] Direkte Tastenabfrage in Assembler
; Dieses Programm wartet bis die Taste "S" gedrückt wurde. ; Programmstart mit SYS 49152 *=$c000 ; Startadresse des Programmes PRA = $dc00 ; CIA#1 (Port Register A) DDRA = $dc02 ; CIA#1 (Data Direction Register A) PRB = $dc01 ; CIA#1 (Port Register B) DDRB = $dc03 ; CIA#1 (Data Direction Register B) start sei ; Interrupts sperren lda #%11111111 ; CIA#1 Port A = Ausgänge sta DDRA lda #%00000000 ; CIA#1 Port B = Eingänge sta DDRB lda #%11111101 ; Spalte 1 (COL1) der Matrix testen sta PRA loop lda PRB and #%00100000 ; Reihe 5 (ROW5) ausmaskieren bne loop ; Warte bis "S" gedrückt cli ; Interrupts zulassen ende rts ; Rücksprung ins Basic
.c000 78 sei .c001 a9 ff lda #$ff .c003 8d 02 dc sta $dc02 .c006 a9 00 lda #$00 .c008 8d 03 dc sta $dc03 .c00b a9 fd lda #$fd .c00d 8d 00 dc sta $dc00 .c010 ad 01 dc lda $dc01 .c013 29 20 and #$20 .c015 d0 f9 bne $c010 .c017 58 cli .c018 60 rts
[bearbeiten] Tastenabfrage in BASIC
10 INPUT "Geben Sie bitte etwas ein"; A$ 20 PRINT "Sie gaben ein: "; A$
Anmerkung: Hierbei muss eine Bestätigung der Tastatureingabe mit <RETURN> erfolgen, um das Programm fortzusetzen. Die Tastatureingabe befindet sich nach der Eingabe in der Variable A$.
- Mit dem BASIC-Befehl GET
10 PRINT "Druecken Sie bitte eine Taste:": A$ = "" 20 GET A$: IF A$="" THEN 20 30 PRINT "Sie drueckten die Taste: "; A$
Anmerkung: Die Tastatureingabe erfolgt Tastenweise. Steuer- und Sonderfunktionstasten können auch gedrückt werden, aber sie werden nicht korrekt angezeigt.
Wenn keine Taste gedrückt wird, ist die Rückmeldung der Variable A$ eine leere Zeichenkette. Um einen Wartezustand zu realisieren, muss A$ geprüft werden, und wenn A$ leer ist muss erneut auf den GET-Befehl verwiesen werden.
- Mit dem BASIC-Befehl PEEK
10 PRINT "Druecken Sie bitte eine Taste:": T = "" 20 T = PEEK(197) : IF T = 64 THEN 20 30 KL=245 : KH=246 : TB = PEEK(KL) + PEEK(KH) * 256 : REM KL,KH Zeiger fuer Tastencodetabelle TB 40 PRINT "Sie drueckten die Taste <"; CHR$( PEEK(TB+T) ) ;"> mit dem Tastencode: "; T
Anmerkung: Die Tastatureingabe erfolgt Tastenweise durch Auslesen der Speicheradresse 197 ($00C5).
Der Tastencode wird in der Variable T abgelegt. Wenn keine Taste gedrückt wird, ist die Rückmeldung immer der Wert 64. Um hier einen Wartezustand zu realisieren, muss daher T auf diesen Wert geprüft werden. Beträgt der Rückgabewert 64, so muss erneut der Tastaturcode mit PEEK ausgelesen werden.
Steuer- und Sonderfunktionstasten können auch gedrückt werden, sie werden nicht korrekt angezeigt, der Tastencode allerdings wird korrekt angezeigt.
[bearbeiten] Hilfreiche PEEKs & POKEs
Eine Erklärung der benutzten Speicherstellen findet sich unter Zeropage.
Autorepeat:
POKE 650,128 führt dazu, dass jede Taste automatisch wiederholt wird, solange man die Taste gedrückt hält.
POKE 650,0 hebt diese Funktion wieder auf.
Tastatursperre:
POKE 649,0 blockiert Eingaben von der Tastatur, weil Tastaturpuffer auf die Länge 0 gesetzt wird.
POKE 649,10: POKE 808,237 lässt die Eingabe wieder zu.
oder
POKE 655,71 Abändern des Zeigers auf die Dekodiertabelle, ebenfalls Tastatursperre
POKE 655,72 Tastatursperre aufheben.
oder
POKE 56322,224 schaltet die Tastatur ebenfalls ab, hierbei wird das Datenrichtungsregister des CIA 1 verändert. Dieser POKE wird deshalb gerne während der Joystickabfrage verwendet, da sich die Joysticksignale teilweise mit der Tastatur überschneiden.
POKE 56322,255 aktiviert die Tastatur wieder.
oder durch Abschaltung des Interrupts (Ausnahme: <RUN/STOP>+<RESTORE>) oder der E/A-Logik.
Einzelne Tasten deaktivieren:
- <RUN/STOP>:
POKE 877,52- Einschalten mitPOKE 877,49 - <RESTORE>:
POKE 792,193- Einschalten mitPOKE 792,234
Tastaturpuffer:
In der Speicherstellen 631-640 steht der Tastaturpuffer, der maximal 10 Zeichen umfassen kann. Er kann mit Hilfe von PEEK ausgelesen werden, aber es kann auch mit Hilfe von POKE Tastendrücke simuliert werden. Dies kann zum Beispiel dazu benutzt werden, um BASIC-Zeilen, etwa mit Funktionsdeklarationen via DEF FN, dynamisch über Benutzereingaben erstellen zu lassen. Mit entsprechend aufbereitetem Bildschirm (Programmzeilen), positioniertem Cursor und fingierten Tastendrücken im Tastaturpuffer ist das auf solch einen Umweg realisierbar.
Ein POKE 198,0 löscht den Tastaturpuffer.
[bearbeiten] Links
| Wikipedia: Tastatur |

