1. Problematik der Hintergrundverarbeitung von Tastatureingaben (CP/M)Bekanntlich ist CP/M ein System, bei dem dem Programmierer keine Möglichkeit der Interruptprogrammierung zur Verfügung steht. Es sei denn, man paßt sich speziell an die Hardware seiner Maschine an, wobei allerdings das Betriebssystem umgangen wird. Dies hat den Nachteil, daß unter dieser Voraussetzung entwickelte Programme eben nur an einer einzigen Maschine lauffähig sind, was dem eigentlichen Sinn von CP/M entgegen spricht.Eine Möglichkeit bietet sich dem Assemblerprogrammierer, der an geeigneter Stelle eine Abfrage der Tastatur einbauen kann, z.B. immer dann, wenn rechenintensive Operationen durchgeführt werden. Ein anschauliches Beispiel für eine solche Anwendung bietet der Editor VDO25, der aus dem Public Domain Bereich erhältlich ist. Jedoch auch dem TURBO PASCAL Programmierer bietet sich eine Möglichkeit, den Zustand der Tastatur abzufragen und anstehende Zeichen zu sammeln, bis diese bei einer Eingabe benötigt werden. Eine Möglichkeit ist, eine Prozedur zu schreiben, die dann zum geeigneten Zeitpunkt aufgerufen wird, ähnlich der erwähnten Methode der Assemblerprogrammierung. Schöner wäre es jedoch, wenn der Aufruf einer solchen Prozedur automatisch erfolgt. Mit einem kleinen Trick läßt sich eine bestimmte Eigenschaft von TURBO PASCAL (hier wird Bezug genommen auf die Version 3.0) für diese Zwecke ausnutzen. Dem Handbuch ist zu entnehmen, daß mit dem Compilerbefehl {$U+} eine Abfrage der Tastatur erfolgt speziell für das Kontrollzeichen Ctrl-C, was als Unterbrechung interpretiert wird.
Was verbirgt sich nun hinter dieser Option bezogen auf die Ausführung des
Prozessors Z80 (oder 8080)?
2. TURBO PASCAL 3.0 PatchBenötigt werden dazu die Dateien TURBO.COM und SID.COM auf möglichst gleicher Diskette. Dann müssen folgende Kommandos eingetippt werden:A>SID TURBO.COM ( Aufruf des Debuggers ) CP/M 3 SID - Version 3.0 ( Bereitmeldung von SID ) NEXT MSZE PC END 7980 7980 0100 D2FF ( Statistikausgabe von SID ) #F372,F372,30 ( Umsetzen RST 7 auf RST 6 ) #F378,F378,31 ( dto. ) #F595,F595,F7 ( OpCode ändern ) #WTURBOP.COM ( Neue Datei TURBOP.COM erzeugen ) 00F1h record(s) written ( SID Fertigmeldung ) #^C ( STOP Taste am JOYCE ) A>TURBOP ( Aufruf des geänderten Compilers ) 3. Die TURBO PASCAL RoutinenVorgestellt wird hier nun eine Reihe von Prozeduren und Funktionen, die als Include Datei vorliegen, um die Compiler Option {$U+} zum Sammeln von Zeichen auszunutzen.Vorab sei auf folgende Nachteile hingewiesen:
Damit die Prozeduren funktionieren, wird eine Typen Deklaration LINE benötigt, die ein String mit einer vom Programmierer vorgegebenen Länge darstellt, also z.B.: TYPE LINE : STRING [80];um einen Puffer zum Sammeln von maximal 80 Zeichen bereitzustellen. Die Include Datei erzeugt intern vier globale Variable, die dann natürlich nicht mehr vom Hauptprogramm deklariert werden dürfen. Diese sind:
Die Prozeduren und Funktionen: AHEAD; Diese, komplett in Assembler geschriebene Prozedur wird immer dann aufgerufen, wenn vom Compiler die RST 6 Funktion ausgeführt wird. Falls ein Ctrl-C eingegeben wurde, so erfolgt dann ein Programmabbruch, wenn vorher die Variable UOPT entsprechend gesetzt wurde. Zu beachten ist, daß zur Installation die Prozedur INI_AHEAD aufgerufen werden muß. INI_AHEAD(BUFF:INTEGER;OPT:BOOLEAN); Diese Prozedur installiert die besprochene Prozedur AHEAD. Sie
GET_AHEAD(VAR XIN:LINE):BOOLEAN; Diese Funktion, von der ein Teil in Assembler geschrieben ist, verarbeitet gesammelte Zeichen. Hierbei ist XIN ein Puffer, in den die vorhandenen Zeichen kopiert werden. Neben dem zurückgegebenen Boolschen Wert der Funktion wird auch noch die interne Boolsche Variable DETECT gesetzt. Es ergeben sich folgende Funktionen in Abhängigkeit der Boolschen Variablen:
READ_LINE(TEXT:LINE):LINE; Diese Funktion erlaubt das Einlesen einer Zeile aus dem Puffer. Als Ergebnis wird eine Zeile zurückgegeben. Bezogen auf die oben aufgeführten Fälle ergibt sich:
4. Abschliessende Hinweise
Abgedruckt in Klubzeitung Nr. 54 - Nov. 1998. Autor: Werner Cirsovius |