packages feed

language-Modula2-0.1: examples/Modula-2_Libraries/andrea-m2/applications/eth-hamburg/keytest/keytest.mod

MODULE KeyTest;

(*
* This program will show which VT200 key is pressed
* till the user types the sequence "quit" or "exit"
*
* The intended use of this program is to help in the setup of
* PC emulation packages.
* Users can use this to test which keys on the PC map to which VT200 keys.
*)

(* John Andrea, Jun.16/1991 *)

FROM GetCharacter IMPORT Get, GetNoWait,
                         SetPassallCharacterMode, UnSetPassallCharacterMode;

FROM InOut IMPORT WriteString, WriteLn, WriteCard;

VAR
  c                :CHAR;
  v                :CARDINAL;
  quit, qui, qu, q :BOOLEAN;
  exit, exi, ex, e :BOOLEAN;

  esc, esc_openp,
  esc_openp_ABCD,
  esc_openp_16, esc_openp_16_tilde,
  esc_openp_16_09, esc_openp_16_09_tilde,
  esc_O, esc_O_LY                         :BOOLEAN;

  digit_1, digit_2 :CHAR;

  ctrl_names :ARRAY [0..31] OF ARRAY [0..3] OF CHAR;

  (* ------------------------------------------------------------- *)
  PROCEDURE SetupControls;
  (* setup names for the control-characters *)
  BEGIN
      ctrl_names[00] := 'NUL'; (* null, control @ *)
      ctrl_names[01] := 'SOH'; (* control A *)
      ctrl_names[02] := 'STX'; (* control B *)
      ctrl_names[03] := 'ETX'; (* control C *)
      ctrl_names[04] := 'EOT'; (* control D *)
      ctrl_names[05] := 'ENQ'; (* control E *)
      ctrl_names[06] := 'ACK'; (* control F *)
      ctrl_names[07] := 'BEL'; (* bell, control G *)
      ctrl_names[08] := 'BS '; (* backspace, control H *)
      ctrl_names[09] := 'HT '; (* tab, control I *)
      ctrl_names[10] := 'LF '; (* line feed, control J *)
      ctrl_names[11] := 'VT '; (* control K *)
      ctrl_names[12] := 'FF '; (* form feed, control L *)
      ctrl_names[13] := 'CR '; (* carriage return, control M *)
      ctrl_names[14] := 'SO '; (* control N *)
      ctrl_names[15] := 'SI '; (* control O *)
      ctrl_names[16] := 'DLE'; (* control P *)
      ctrl_names[17] := 'DC1'; (* control Q *)
      ctrl_names[18] := 'DC2'; (* control R *)
      ctrl_names[19] := 'DC3'; (* control S *)
      ctrl_names[20] := 'DC4'; (* control T *)
      ctrl_names[21] := 'NAK'; (* control U *)
      ctrl_names[22] := 'SYN'; (* control V *)
      ctrl_names[23] := 'ETB'; (* control W *)
      ctrl_names[24] := 'CAN'; (* control X *)
      ctrl_names[25] := 'EM '; (* control Y *)
      ctrl_names[26] := 'SUB'; (* control Z *)
      ctrl_names[27] := 'ESC'; (* escape, control [ *)
      ctrl_names[28] := 'FS '; (* control \ *)
      ctrl_names[29] := 'GS '; (* control ] *)
      ctrl_names[30] := 'RS '; (* control ^ *)
      ctrl_names[31] := 'US '; (* control _ *)
  END SetupControls;

  (* ------------------------------------------------------------- *)
  PROCEDURE ShowSeq( string :ARRAY OF CHAR );
  BEGIN
     WriteString( 'that sequence corresponded to the ' );
     WriteString( string );
     WriteLn;
  END ShowSeq;

BEGIN (* KeyTest *)

SetupControls;

WriteLn;
WriteString( 'KEYTEST begin, start hitting keys' ); WriteLn;
WriteString( 'the program stops with the sequence' ); WriteLn;
WriteString( 'quit OR exit' ); WriteLn;
WriteLn;

SetPassallCharacterMode;

WHILE NOT ( quit OR exit ) DO

   Get(c);     v := ORD( c );

   WriteString( 'value:' ); WriteCard( v, 4 ); WriteString( ', ' );

   IF ( c > ' ' ) & ( c <= '~' ) THEN
     WriteString( 'the standard character: ' );
     WriteString( c );
   ELSIF c = ' 'THEN
     WriteString( 'the SPACE character' );
   ELSIF v = 127 THEN
     WriteString( 'the DEL character' );
   ELSIF ( v >= 0 ) & ( v <= 31 ) THEN
     WriteString( 'the control character named: ');
     WriteString( ctrl_names[v] );
     WriteString( ' which is Control-' );
     WriteString( CHR(v+64) );
   ELSIF ( v >= 161 ) & ( v <= 253 ) THEN
     WriteString( 'the compose character: ' );
     WriteString( c );
   ELSE
     WriteString( 'unknown character' );
   END;

   WriteLn;

   (* 5 chars *)
   esc_openp_16_09_tilde := esc_openp_16_09 & ( c = '~' );

   (* 4 chars *)
   esc_openp_16_09       := esc_openp_16 & ( ( c >= '0' ) & ( c <= '9' ) );
   esc_openp_16_tilde    := esc_openp_16 & ( c = '~' );

   (* 3 chars *)
   esc_openp_16          := esc_openp & ( ( c >= '1' ) & ( c <= '6' ) );
   esc_openp_ABCD        := esc_openp & ( ( c >= 'A' ) & ( c <= 'D' ) );
   esc_O_LY              := esc_O     & (( CAP(c) >= 'L' ) & ( CAP(c) <= 'Y' ));

   (* 2 chars *)
   esc_O                 := esc & ( c = 'O' );  (* thats an "oh" *)
   esc_openp             := esc & ( c = '[' );

   (* 1 char *)
   esc                   := v = 27;

   IF esc_openp_16 THEN
     digit_1 := c;
   END;

   IF esc_openp_16_09 THEN
     digit_2 := c;
   END;

   IF esc_O_LY THEN
     IF    c = 'p' THEN
       ShowSeq( 'KEYPAD 0' );
     ELSIF c = 'q' THEN
       ShowSeq( 'KEYPAD 1' );
     ELSIF c = 'r' THEN
       ShowSeq( 'KEYPAD 2' );
     ELSIF c = 's' THEN
       ShowSeq( 'KEYPAD 3' );
     ELSIF c = 't' THEN
       ShowSeq( 'KEYPAD 4' );
     ELSIF c = 'u' THEN
       ShowSeq( 'KEYPAD 5' );
     ELSIF c = 'v' THEN
       ShowSeq( 'KEYPAD 6' );
     ELSIF c = 'w' THEN
       ShowSeq( 'KEYPAD 7' );
     ELSIF c = 'x' THEN
       ShowSeq( 'KEYPAD 8' );
     ELSIF c = 'y' THEN
       ShowSeq( 'KEYPAD 9' );
     ELSIF c = 'm' THEN
       ShowSeq( 'KEYPAD MINUS' );
     ELSIF c = 'l' THEN
       ShowSeq( 'KEYPAD COMMA');
     ELSIF c = 'n' THEN
       ShowSeq( 'KEYPAD PERIOD' );
     ELSIF c = 'M' THEN
       ShowSeq( 'KEYPAD ENTER' );
     ELSIF c = 'P' THEN
       ShowSeq( 'PF1' );
     ELSIF c = 'Q' THEN
       ShowSeq( 'PF2' );
     ELSIF c = 'R' THEN
       ShowSeq( 'PF3' );
     ELSIF c = 'S' THEN
       ShowSeq( 'PF4' );
     END;
   END;

   IF esc_openp_16_09_tilde THEN
     IF    digit_1 = '1' THEN
       IF    digit_2 = '7' THEN
         ShowSeq( 'F6 key' );
       ELSIF digit_2 = '8' THEN
         ShowSeq( 'F7 key' );
       ELSIF digit_2 = '9' THEN
         ShowSeq( 'F8 key' );
       END;
     ELSIF digit_1 = '2' THEN
       IF    digit_2 = '0' THEN
         ShowSeq( 'F9 key' );
       ELSIF digit_2 = '1' THEN
         ShowSeq( 'F10 key' );
       ELSIF digit_2 = '3' THEN
         ShowSeq( 'F11 key' );
       ELSIF digit_2 = '4' THEN
         ShowSeq( 'F12 key' );
       ELSIF digit_2 = '5' THEN
         ShowSeq( 'F13 key' );
       ELSIF digit_2 = '6' THEN
         ShowSeq( 'F14 key' );
       ELSIF digit_2 = '8' THEN
         ShowSeq( 'HELP key' );
       ELSIF digit_2 = '9' THEN
         ShowSeq( 'DO key' );
       END;
     ELSIF digit_1 = '3' THEN
       IF    digit_2 = '1' THEN
         ShowSeq( 'F17 key' );
       ELSIF digit_2 = '2' THEN
         ShowSeq( 'F18 key' );
       ELSIF digit_2 = '3' THEN
         ShowSeq( 'F19 key' );
       ELSIF digit_2 = '4' THEN
         ShowSeq( 'F20 key' );
       END;
     END;
   END;

   IF esc_openp_16_tilde THEN
     IF    digit_1 = '1' THEN
        ShowSeq( 'FIND key' );
     ELSIF digit_1 = '2' THEN
        ShowSeq( 'INSERT HERE key' );
     ELSIF digit_1 = '3' THEN
        ShowSeq( 'REMOVE key' );
     ELSIF digit_1 = '4' THEN
        ShowSeq( 'SELECT key' );
     ELSIF digit_1 = '5' THEN
        ShowSeq( 'PREV SCREEN key' );
     ELSIF digit_1 = '6' THEN
        ShowSeq( 'NEXT SCREEN key' );
     END;
   END;

   IF esc_openp_ABCD THEN
     IF    c = 'A' THEN
        ShowSeq( 'UP ARROW' );
     ELSIF c = 'B' THEN
        ShowSeq( 'DOWN ARROW' );
     ELSIF c = 'C' THEN
        ShowSeq( 'RIGHT ARROW' );
     ELSIF c = 'D' THEN
        ShowSeq( 'LEFT ARROW' );
     END;
   END;

   c    := CAP( c );
   quit := qui & ( c = 'T' );
   qui  := qu  & ( c = 'I' );
   qu   := q   & ( c = 'U' );
   q    :=       ( c = 'Q' );
   exit := exi & ( c = 'T' );
   exi  := ex  & ( c = 'I' );
   ex   := e   & ( c = 'X' );
   e    :=       ( c = 'E' );
END; (* while *)

UnSetPassallCharacterMode;

WriteLn; WriteString( 'KEYTEST finished' ); WriteLn;

END KeyTest.