home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* SCANSEND.PAS *)
- (* Residente Utility zur Bestimmung von Tastaturcodes *)
- (* (c) 1991 Martin Wölker & DMV-Verlag *)
- (* ------------------------------------------------------ *)
- {$M 1024,0,0}
- PROGRAM Scansend;
-
- {.$DEFINE Noise}
-
- USES Crt, Tsr, Dos;
-
- CONST
- HotKey : WORD = $6700;
- HotString : STRING [15] = '<Ctrl-F10>';
- Mode : BYTE = 0;
- OutMode : BYTE = 0;
-
- Hex : ARRAY [0..15] OF CHAR = '0123456789ABCDEF';
-
- TYPE
- OutRec = RECORD
- C : WORD; { Tastatur-Scancode }
- n : STRING [15]; { Name der Taste }
- dBc : STRING [ 4]; { dBase-Code für INKEY() }
- dBr : STRING [ 4]; { dBase-Code für READKEY() }
- END;
-
- CONST
- MaxRes = 114; { Anzahl der decodierten Tastencodes }
-
- {$I Code.TAB}
-
- TYPE
- tLine = ARRAY [1..80] OF WORD;
- tScreen = ARRAY [1..25] OF tLine;
-
- CONST
- Status : ARRAY [0..3] OF STRING [25] = (
- (' Taste --> Scancode '),
- (' Taste --> Name '),
- (' Taste --> dBase-Code '),
- (' Taste --> dBase-Read ') );
-
- VAR
- ScreenSeg : ^tScreen;
- SavedLine : tLine;
- Regs : Registers;
- SysX, SysY : BYTE;
- Res : WORD;
- i, Nr : BYTE;
- RetCode : INTEGER;
- StrCode : STRING [3];
-
- FUNCTION GetKey : WORD;
- (* Eine Taste auslesen *)
- BEGIN
- Regs.AH := Mode; Intr($16, Regs); GetKey := Regs.AX;
- END;
-
- PROCEDURE KBD_Write(Key : CHAR);
- (* Ein Zeichen in den Puffer schreiben *)
- BEGIN
- Regs.AH := 5; Regs.CX := BYTE(Key); Intr($16, Regs);
- END;
-
- PROCEDURE SaveScreen;
- (* Bildschirminhalt und Cursorposition retten *)
- BEGIN
- Move(ScreenSeg^, SavedLine, 160);
- SysX := WhereX; SysY := WhereY;
- END;
-
- PROCEDURE RestoreScreen;
- (* Bildschirm, Cursorposition und Videomodus *)
- (* restaurieren *)
- BEGIN
- Move(SavedLine, ScreenSeg^, 160);
- GotoXY(SysX, SysY); NormVideo;
- END;
-
- PROCEDURE Beep;
- BEGIN
- Sound(1000); Delay(10); NoSound;
- END;
-
- FUNCTION Which : BOOLEAN;
- (* ermittelt die gewünschte Nr. aus der Tabelle *)
- BEGIN
- Nr := 1;
- WHILE (Nr <= MaxRes) AND (Res <> CodeTab[Nr].C) DO
- INC(Nr);
-
- { Fehler bei unbekanntem Code erzeugen }
-
- IF (OutMode = 3) AND (CodeTab[Nr].dBr = '?') THEN
- Nr := SUCC(MaxRes);
- Which := NOT (Nr > MaxRes);
- END;
-
- {$F+}
- PROCEDURE SelectKey;
- BEGIN
- SaveScreen;
- TextBackground(LightGray); TextColor(Brown);
- REPEAT
- GotoXY(27, 1);
- Write(Status[OutMode]);
- GotoXY(SysX, SysY);
- Res := GetKey; { wiederholtes Drücken }
- IF Res = HotKey THEN { des Hotkeys schaltet }
- { die Ausgabeart um. }
- OutMode := (OutMode + 1) MOD 4;
- UNTIL Res <> HotKey;
-
- IF OutMode = 0 THEN BEGIN
- { Ausgabe der Taste als hexadezimaler Scancode }
- KBD_Write('$');
- KBD_Write(Hex[Hi(Res) AND $F0 SHR 4]);
- KBD_Write(Hex[Hi(Res) AND $0F]);
- KBD_Write(Hex[Lo(Res) AND $F0 SHR 4]);
- KBD_Write(Hex[Lo(Res) AND $0F]);
- END ELSE BEGIN
- IF (Lo(Res) < 32) OR (Lo(Res) > 127) OR
- (OutMode = 3) THEN
- { kein normales Textzeichen oder READKEY() }
- IF Which THEN BEGIN
- CASE OutMode OF
- 1 : { Ausgabe der Taste als String }
- FOR i := 1 TO Length(CodeTab[Nr].n) DO
- KBD_Write(CodeTab[Nr].n[i]);
- 2 : { Ausgabe für dBase INKEY() }
- FOR i := 1 TO Length(CodeTab[Nr].dBc) DO
- KBD_Write(CodeTab[Nr].dBc[i]);
- 3 : { Ausgabe für dBase READKEY() }
- FOR i := 1 TO Length(CodeTab[Nr].dBr) DO
- KBD_Write(CodeTab[Nr].dBr[i]);
- END;
- END ELSE
- {$IFDEF Noise} Beep; {$ENDIF}
- ELSE IF (OutMode = 1) THEN BEGIN
- KBD_Write(#39);
- KBD_Write(CHR(Lo(Res)));
- KBD_Write(#39);
- END ELSE BEGIN
- Str(Lo(Res), StrCode);
- FOR i := 1 TO Length(StrCode) DO
- KBD_Write(StrCode[i]);
- END;
- END;
- RestoreScreen;
- END;
- {$F-}
-
- (* ------------------------------------------------------ *)
- (* Installationsteil *)
- (* Adressen ermitteln *)
- (* Interruptvektoren sichern *)
- (* Resident beenden *)
- (* ------------------------------------------------------ *)
-
- PROCEDURE GetScr_Segment;
- (* ermittelt Basisadresse des Bildspeichers *)
- BEGIN
- IF Lo(LastMode) = 7 THEN
- ScreenSeg := Ptr($B000, $0000)
- ELSE
- ScreenSeg := Ptr($B800, $0000);
- END;
-
- PROCEDURE ParamCheck;
- (* Aufrufparameter interpretieren *)
- VAR
- s : STRING [10];
- i : BYTE;
- Code : WORD;
- BEGIN
- FOR i := 1 TO ParamCount DO BEGIN
- s := ParamStr(i);
- IF (Pos('?', s) = 1) OR (Pos('h', s) = 1) OR
- (Pos('H', s) = 1) THEN BEGIN
- WriteLn(' TSR Routine "Keyboard-Decoder"');
- WriteLn(HotString, ' startet die Routine');
- Halt(0);
- END ELSE IF (Pos('s', s) = 1) THEN BEGIN
- Move(s[3], s[1], Length(s) - 2);
- s[0] := CHAR(Length(s) - 2);
- HotString := s;
- END ELSE IF (POS('k', s) = 1) THEN BEGIN
- (* Move(s[3], s[1], Length(s) - 2);
- s[0] := CHAR(Length(s) - 2);
- VAL(s, Code, RetCode);
- IF RetCode = 0 THEN HotKey := Code SHL 8; *)
- END ELSE BEGIN
- WriteLn('Syntax: lz [parameterliste]');
- WriteLn(' Parameter in beliebiger Reihenfolge');
- WriteLn;
- WriteLn('Parameter= ═╦═ k="scancode" der Taste');
- WriteLn(' ╠═ s="String" Bezeichnung');
- WriteLn(' ║');
- WriteLn(' ╚═══ ?,h,H Hilfe');
- Halt(1);
- END;
- END;
- END;
-
- BEGIN
- IF ParamCount <> 0 THEN ParamCheck;
- WriteLn(' (c) 1991 Martin Wölker & DOS-Toolbox');
- WriteLn(' ', HotString, ' startet die Routine');
- GetScr_Segment; { Aktueller Zustand }
- SwapVectors; { SYSTEM - Vektoren }
- MakeResident(@Selectkey, HotKey); { Resident beenden }
- END.
- (* ------------------------------------------------------ *)
- (* Ende von SCANSEND.PAS *)
-