Tastatur

Aus C64-Wiki

Wechseln zu: Navigation, Suche
Ur-C64: orangene Funktionstasten
Ur-C64: orangene Funktionstasten
C64: graue Funktionstasten
C64: graue Funktionstasten
Aldi-C64: hellgraue Funktionstasten
Aldi-C64: hellgraue Funktionstasten
C64C / C64G: Beschriftung oben
C64C / C64G: Beschriftung oben

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
($DC00)

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:

Bild:KBD_C64.png

[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 mit POKE 877,49
  • <RESTORE>: POKE 792,193 - Einschalten mit POKE 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
Persönliche Werkzeuge
Andere Sprachen