Der Key ManagerEntgegen landläufiger Meinung zwingt ein Tastendruck den Computer nicht, eine Eingabe entgegenzunehmen und auch entsprechend zu handeln. Ganz im Gegenteil. Man kann beliebig lange auf der Tastatur herumhaemmern, ohne dass sich auch nur irgend etwas tut, wenn der Computer nicht geneigt ist, das Zeichen aktiv entgegenzunehmen. Man muss sich hierfür nur all die unwiderruflich abgestürzten Programme in Erinnerung rufen, wo dann auch Einleitung: Die Tastatur Die Eingaben über Einleitung: Die Tastatur Um Einleitung: Die Tastatur Tastatur-AbfrageAlle Tasten und auch die beiden Joystick-Anschlüsse sind an eine Draht-Matrix mit 8 mal 10 Leitungen angeschlossen. Normalerweise sind alle Taster geöffnet und es besteht keine elektrische Verbindung zwischen den Zeilen- und den Spaltendraehten. Die 10 Zeilendraehte sind mit den Ausgängen eines ICs 74LS145 verbunden. Das ist ein BCD zu Dezimal Dekoder mit offenen Kollektor-Ausgängen. Normalerweise sind alle Ausgänge praktisch hochohmig. Über 4 Eingänge kann, binär kodiert, aber ein Ausgang angewählt werden, der dann auf 0Volt gezogen wird. Diese Eingänge sind an die Port C - Output: &F6xx: Bits 0 bis 3:Bits 0 bis 3 des Erklärung zu den Anschluss-Bezeichnungen: PC0 bis PC7 - Port C Leitungen 0 bis 7Port C der Die ICs im Überblick: Die PIO 8255 Demgegenüber sind die 8 Spaltendraehte an den I/O-Port des Sound-ICs angeschlossen. Intern sind diese Leitungen über einen Widerstand auf +5Volt, also logischen Eins-Pegel hochgezogen. Der Die ICs im Überblick: Der PSG AY-3-8912 Um Einleitung: Die Tastatur Auf diese Weise werden für eine komplette Der Key Manager: Tastatur-AbfrageTastatur-Abfrage 10 Datentypen: Bytes Normalerweise, wenn keine Taste gedrückt ist, werden alle Spaltendraeht bei jeder Abfrage auf logischem Eins-Pegel liegen, in den eingelesenen Datentypen: Bytes Wird aber eine Taste gedrückt, so werden dadurch ein Zeilen- und ein Spaltendraht verbunden. Wird jetzt Einleitung: Die Tastatur Nach einer kompletten Der Key Manager: Tastatur-AbfrageTastatur-Abfrage erhält man also zunächst einmal nur 10 Datentypen: Bytes Aus der Lage der einzelnen Tasten in der Drahtmatrix ergibt sich dann auch ihre Tastennummer, die man beispielsweise bei der Basic-Funktion 'INKEY(nr)' angeben muss. Die Die Tastatur: TastennummernTastennummern des ersten Datentypen: Bytes (...) --> Schaubilder der Tastatur: CPC 464/664: Zehnerblock und CursorblockZehnerblock oder Cursor-Taste [...] --> Schaubilder der Tastatur: Erster Joystick 0 und zweiter Joystick 1Joystick 0 (normaler Schaubilder der Tastatur: Erster Joystick 0 und zweiter Joystick 1Joystick) {...} --> Schaubilder der Tastatur: Erster Joystick 0 und zweiter Joystick 1Joystick 1 (zweiter Schaubilder der Tastatur: Erster Joystick 0 und zweiter Joystick 1Joystick) \ Datentypen: Bytes Während der normale Schaubilder der Tastatur: Erster Joystick 0 und zweiter Joystick 1Joystick 0 einen eigenen Zeilendraht als COMMON-Leitung hat, ist COMMON 2 für den zweiten Schaubilder der Tastatur: Erster Joystick 0 und zweiter Joystick 1Joystick identisch mit einem Zeilendraht der Tastatur. Bei der Der Key Manager: Tastatur-AbfrageTastatur-Abfrage kann man deshalb nicht erkennen, ob eine Taste des zweiten Schaubilder der Tastatur: Erster Joystick 0 und zweiter Joystick 1Joysticks oder eine Taste der Tastatur gedrückt wurde. Außerdem ist der Spaltendraht 6 am Joystickport herausgeführt. Er wird jedoch von keinem normalen Schaubilder der Tastatur: Erster Joystick 0 und zweiter Joystick 1Joystick benutzt, und ist deshalb als n.c. (not connected = nicht angeschlossen) markiert. Wirklich nicht angeschlossen ist aber die Taste mit dem Code 79. Hier könnte man so etwas wie eine Geheimtaste erfinden, um in die eigenen kopiergeschützen Programme wieder 'hinein' zukönnen. EntprellenEs genügt jedoch nicht, die gedrückten Tasten zu erkennen. Mechanische Taster haben nämlich die unangenehme Eigenschaft, zu prellen. Wird die Taste gedrückt, so schließt der Kontakt, federt zurück, schließt und vielleicht dann noch 'mal, bevor der Kontakt endlich fest hergestellt ist. Beim Einlesen der Taste kann es also passieren, dass zunächst ein geschlossener Kontakt, dann wieder ein offener und dann wieder ein geschlossener erkannt wird. Dieses Kontakt-Prellen muss nun software-mäßig von bewusst wiederholten Tastendrücken des Anwenders unterschieden werden. Dazu dient die Zeit als Maß: Kontakt-Prellen ist naturgemaess nur eine sehr kurzlebige Angelegenheit, Doppelanschlaege auf der Tastatur dauern länger. Einleitung: Die Tastatur 3 im KarreeEine weitere Eigenheit einer matrix-foermig aufgebauten Tastatur ist zu beachten. Werden drei Tasten gleichzeitig gedrückt, die die Eckpunkte eines Rechtecks in der Tastenmatrix bilden, so wird der vierte, nicht gedrückte Eckpunkt auch ein Nullbit liefern. Als Beispiel sollen die Spaltendraehte 1 und 3 und die Zeilendraehte 5 und 6 betrachtet werden: Durch Taste Eins wird S1 und Z5 verbunden. Die zweite Taste verbindet S1 mit Z6, die dritte verbindet S3 mit Z6. Dadurch ist auch S3 mit Z5, die 4. Tastenposition elektrisch verbunden, ohne dass die Taste gedrückt zu sein braucht: S1 S2 S2 +-T3-+-T2-+-T1-+ | | | | | | | --T1---Tx---T4-------Z5 S2 - Z6 - S1 - Z5 <-------> | | | | | --T2---Ty---T3-------Z6 +-----T4-------+ | | | Das müsste ebenfalls von der Tastatur-Software erkannt und abgefangen werden. Dazu muss man einfach nur Erklärung der Anschlussbelegung: Testtesten, ob eben vier oder noch mehr Tasten erkannt werden, und dann diese Abfrage einfach ignorieren. Da bei normalem Gebrauch der Tastatur maximal zwei Tasten gleichzeitig gedrückt werden, muss wohl bei drei oder noch mehr eingelesenen Tasten ein 'Ausrutscher' beim Schreiben vorliegen. In diesem Punkt ist die Tastatur-Software aber nicht sehr durchdacht gestaltet Datenbreite: Wordsworden. Beim Schneider CPC wird nämlich genau dieser Fall nicht erkannt. Als Beispiel kann ich u. Operationen: BD5B / 349A / 349A: FLO SUBA. einen Fall anführen, der mich in Assemblertexten manchmal zur Weissglut bringen kann: Habe ich Einleitung: Die Tastatur D EFW Der Grund ist, dass 'SHIFT', 'D' und 'LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION WarteschlangeDie Tastaturabfrage auf dem Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt und das Programm, das die Eingaben bearbeitet, sind zwei unabhängig voneinander arbeitende Programme. Damit ein Tastendruck seinen Weg zum laufenden Programm findet, sind zwei Arbeitsgänge notwendig: Zum Einen muss Die Abteilungen des Betriebssystems: Der Key Managerder Key Manager regelmäßig nachschauen, ob eine Taste gedrückt ist. Das tut er mal in der Sekunde. Zum Anderen müssen die erkannten Tasten vom laufenden Programm abgeholt werden. Es kann dabei durchaus vorkommen, dass das Programm eine Zeit lang keine Eingaben abholen kann, weil es gerade mit einer anderen Aufgabe beschäftigt ist. In diesem Fall wird immer eine Der Key Manager: WarteschlangeWarteschlangen benötigt. An einem Ende werden bei der Der Key Manager: Tastatur-AbfrageTastatur-Abfrage Tasten nachgeschoben, am anderen Ende holt sich das laufende Programm die Tasten ab. Diese Queue ist dabei lang genug, 20 'Tasten' aufzunehmen. Programm-technisch gesehen ist die Queue als Ringspeicher in einem Datenspeicherung und Datenstrukturen: ArraysArray für 'fixed length Datenspeicherung und Datenstrukturen: Recordsrecords' realisiert. Ist der Puffer voll (was bei 20 Zeichen eigentlich nicht so schnell vorkommen sollte), so werden weitere Tastendrücke einfach ignoriert. Leider gibt Die Abteilungen des Betriebssystems: Der Key Managerder Key Manager dann keine Warnung von sich. Andere Computer piepsen in diesem Fall wenigstens. TastenübersetzungNatürlich ist es noch recht unkomfortabel, nur zu erfahren, welche Taste gerade gedrückt wurde. Meist ist man viel mehr daran interessiert, zu erfahren, welches Zeichen dadurch erzeugt werden sollte. Zu diesem Zweck hält Die Abteilungen des Betriebssystems: Der Key Managerder Key Manager drei Tabellen bereit, in denen zu jeder Tastenposition eingetragen ist, welches Zeichen diese Taste erzeugen soll, wenn sie alleine, zusammen mit 'SHIFT' oder zusammen mit 'CTRL' gedrückt wird. Zusätzlich gibt es noch eine Tabelle, in der eingetragen ist, welche Tasten sich automatisch wiederholen dürfen, wenn man seinen Finger nur lange genug darauf hält. Diese Tabellen werden in's RAM kopiert und sind auch von Einleitung: BASIC KEY DEF nr, rep, solo, shift, ctrl Als Basic und Maschinencode: ParameterParameter müssen in dieser Reihenfolge die Tastennummer, der Repeat-Status (0 = keine automatische Wiederholung) und die Der Key Manager: TastenübersetzungTastenübersetzungen alleine, mit 'SHIFT' und mit 'CTRL' angegeben werden. RepeatAuch die Repeat-Funktion für die Tasten, denen es durch den Eintrag in der Repeat-Tabelle erlaubt wurde, sich zu wiederholen, ist sehr durchdacht implementiert Datenbreite: Wordsworden: Zunächst wird zwischen der ersten Start-Verzögerung und der Wiederholungs-Verzögerung zwischen den folgenden Selbst-Anschlägen unterschieden. Diese beiden Zeiten sind in Einleitung: BASIC Eine Taste wird aber nicht bedingungslos neu angeschlagen, wenn die entsprechende Wartezeit abgelaufen ist. Die Abteilungen des Betriebssystems: Der Key ManagerDer Key Manager schaut erst nach, ob er auch keine weitere Taste mehr im Puffer hat. Nur wenn der Tastenpuffer vollständig leer ist, wird ein Repeat-Anschlag im Tastatur-Puffer vermerkt. Wenn der Puffer nicht leer ist, wird die Taste nicht eingetragen, und muss eben noch etwas warten. Das ist sehr günstig, weil sich der Tastenpuffer so nicht unbemerkt mit selbst- wiederholten Zeichen füllen kann, wenn das abarbeitende Programm einmal nicht schnell genug ist. Das wäre z.LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL Clear InputTrotzdem kann sich im Tastatur-Puffer aber auch ganz schön 'Muell' ansammeln. Dann nämlich, wenn das Programm längere Zeit keine Eingaben entgengen nehmen kann. Haemmert dann der Anwender nervoes auf der Tastatur herum, so sammeln sich die 'Eingaben' beim MAIN FIRMWARE JUMPBLOCK: KEY MANAGER Wendet sich das Programm dann endlich wieder dem Anwender zu, so erhält es zunächst einmal den gesamten Muell aus dem Tastatur-Puffer. Da der Anwender zu diesem Zeitpunkt diese 'Eingaben' wahrscheinlich nicht mehr machen wollte, ist es sinnvoll, den Tastatenpuffer vorher zu leeren. Garbage Collection: ... beim CPC 664 und 6128Beim CPC 664 und 6128 gibt es dafür in Einleitung: BASIC 1000 WHILE INKEY$<>"":WEND In Maschinensprache sieht das ähnlich einfach aus: ; Flush keyboard buffer ; FLUSH: Maschinencode über HIMEM: CALLCALL #BB09 ; KEY MANAGER: BB09: KM READ CHARKM READ CHAR (Hole Zeichen, falls vorhanden) JR C,FLUSH ; CY=1, wenn ein Zeichen da war. Dann noch mal. RET ; sonst fertig. spezielle TastencodesIn den Tasten-Übersetzungstabellen hat der Eintrag &FF eine spezielle Bedeutung: Hiermit wird angedeutet, dass diese Tastenkombination kein Zeichen erzeugen soll. Aber auch noch weitere, reservierte Zeichencodes gibt es: So wird mit &FE der Shift-Lock-Status und mit &FD der Caps-Lock-Status invertiert. Das sind die Die Fließkomma-Routinen: FunktionenFunktionen, die man mit 'CAPS_LOCK' und 'CAPS_LOCK' plus 'CTRL' erreicht. &FC wird normalerweise von der 'ESC'-Taste erzeugt. Zusätzlich wird aber auch das Zeichen &EF in den Tastenpuffer eingefügt, wenn der Break-Mechanismus aktiv ist. Das ist dafür gedacht, den Tastenpuffer bis zu der Stelle leeren zu können, an der der Anwender das Programm unterbrochen hat. In Einleitung: BASIC Speziell die Behandlung der Break-Taste scheint Garbage Collection: ... beim CPC 464beim CPC 464 noch nicht ganz ausgegoren zu sein. Garbage Collection: ... beim CPC 664 und 6128Beim CPC 664 und 6128 wurden hier einige Änderungen vorgenommen: So ist es Garbage Collection: ... beim CPC 464beim CPC 464 noch möglich, die Zeichen &FC und &EF mittels INKEY$ einzulesen, wenn man eine Taste mit dieser Belegung definiert. Wenn man den Break-Mechanismus abschaltet (Maschinencode über HIMEM: CALLCALL &KEY MANAGER: BB48: KM DISARM BREAKBB48) kann das sogar die 'ESC'-Taste sein. Der CPC 6128 weigert sich aber beharrlich, sowohl das Zeichen &FC als auch &EF herauszurücken. Garbage Collection: ... beim CPC 464Beim CPC 464 enthält der Basic-Interpreter noch einen Der Linien-Algorithmus: Fehler 3Fehler, der es trotz 'ON BREAK GOSUB' möglich macht, das Programm mit 'ESC' zu stoppen. 'Breaks' während der Zeileneditor auf eine Eingabe wartet (INPUT, LINE INPUT), stoppen in allen Fällen das Programm. Das folgende Programm zeigt, wie man den Break-Mechanismus ganz ausschaltet, aber trotzdem noch software-mäßig einen Break erkennen kann. 100 Maschinencode über HIMEM: CALLCALL &KEY MANAGER: BB48: KM DISARM BREAKBB48 ' entspricht ON BREAK CONT Garbage Collection: ... beim CPC 464beim CPC 664/6128 110 ' 120 KEY DEF 66,0,159,159,159 ' Break-Taste 130 KEY 159,CHR$(13)+CHR$(27) ' erzeugt jetzt erst ENTER dann ESCAPE 140 ' 150 ' Demo: 160 ' 170 INPUT Operationen: BD5B / 349A / 349A: FLO SUBa ' lässt sich nicht breaken 180 IF INKEY$=CHR$(27) THEN GOTO 170 ' Erklärung der Anschlussbelegung: TestTest, ob man breaken wollte 190 FOR i=0 TO 1000:PRINT"#";:NEXT ' lässt sich auch nicht breaken Weitere Sonderbehandlungen nimmt Die Abteilungen des Betriebssystems: Der Key Managerder Key Manager aber mit den Zeichen nicht mehr vor. Alle anderen Kontroll-Funktionen, die einzelnen Zeichen bei der Arbeit mit dem Zeileneditor zugeordnet sind, werden nicht vom MAIN FIRMWARE JUMPBLOCK: KEY MANAGER drei Abhol-MethodenNeben der Möglichkeit, mit INKEY(nr) eine Taste direkt zu Erklärung der Anschlussbelegung: Testtesten (wobei Die Abteilungen des Betriebssystems: Der Key Managerder Key Manager nicht tatsächlich Einleitung: Die Tastatur Hierbei gibt es aber nochmals zwei unterschiedliche Möglichkeiten: Die eine, die unter Einleitung: BASIC Von Einleitung: BASIC Auch diese Tabelle ist im RAM angelegt und kann geändert werden. In Einleitung: BASIC KEY nr,"Datentypen: Stringsstring"
Return to SenderFür Maschinesprache-Programme besteht darüber hinaus die Möglichkeit, ein Zeichen zurückzugeben. Man kann sich ein Zeichen vom MAIN FIRMWARE JUMPBLOCK: KEY MANAGER Damit lassen sich manche Probleme lösen, an denen man sonst schwer zu knacken hätte. In Einleitung: BASIC | CPC 464 | CPC 664/6128 -------------+---------+------------- Zeichen im $:| &B4DE | &B628 Exp$-Nummer: | &B4DF | &B629 -------------+---------+------------- Im folgenden Beispiel fügt ein Basic-Programm sich selbst neue Zeilen ein: 10 ' Selbst-vernderndes Basic-Programm (c) G.Woigk Erklärung zu den Anschlüssen: Vcc und Vss |