home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / packer / arc / arctool / atkybd.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-09-29  |  5.3 KB  |  150 lines

  1. {
  2.                        F i l e    I n f o r m a t i o n
  3.  
  4. * DESCRIPTION
  5. Turbo Pascal 4.0 non-resident procedure to change AT class keyboard delay
  6. (.25 - 1.0 sec) and typematic (2 - 30 repeats/sec).
  7.  
  8. * ASSOCIATED FILES
  9.  
  10. }
  11. {$M 16324,0,16324}
  12. program atkybd; { Set AT keyboard delay and typematic.  Turbo Pascal 4.0 }
  13.  
  14. { Keying On A Standard, Bob Smith, PC Tech Journal, July 87, p134
  15.   Rev Up The AT Keyboard, Kevin M Crenshaw, PC Tech Journal, May 85, p39
  16.   Speedier AT Keyboard, Robert Patenaude, PC Magazine, Mar 25, 1986, p289}
  17.  
  18. { John Haluska CIS 74000,1106 }
  19.  
  20. const
  21.   DlyVal : array[0..3] of string[3] = ('.25','.5','.75','1.0');
  22.   RepVal : array[0..31] of string[5] = ('30','26.7','24','21.8','20','18.5',
  23.              '17.1','16','15','13.3','12','10.9','10','9.2','8.6','8','7.5',
  24.              '6.7','6','5.5','5','4.6','4.3','4','3.7','3.3','3','2.7','2.5',
  25.              '2,3','2.1','2');
  26. var
  27.   Dly1, Repeat1    : byte;
  28.   Result1,Result2  : integer;
  29.   Error            : byte;
  30.  
  31. {----------------------------------------------------------------------------}
  32. { Set AT Keyboard Delay code 0-3 (.25, .5, .75, or 1 sec) before start of
  33.   Typematic code 0-31 (30, 26.7, 24, 21.8, 20, 18.5, 17.1, 16, 15, 13.3, 12,
  34.   10.9, 10, 9.2, 8.6, 8, 7.5, 6.7, 6, 5.5, 5, 4.6, 4.3, 4.0, 3.7, 3.3, 3, 2.7,
  35.   2.5, 2.3, 2.1 or 2 repeats/sec). Return Error code 0 (Operation successful),
  36.   1 (Invalid Delay and/or Typematic code), 2 (Hardware error or feature not
  37.   supported) }
  38.  
  39. procedure SetATKybdDelayTypematic(Delay,Typematic:byte; var Error: byte);
  40.  
  41. procedure Xmit(Data:byte; var Error:byte);
  42.           {Transmit info to keyboard}
  43. var
  44.   Rdy1        : byte;
  45.   TickCount   : ^longint;
  46.   Tc1         : longint;
  47.  
  48. begin
  49.   Error:=0;
  50.   TickCount := Ptr($40,$6C);   { location of DOS clock }
  51.   Tc1 := TickCount^;           { 18.2 tickcounts/second }
  52.   repeat
  53.     Rdy1 := Port[$64];         { Is data waiting for the controller? }
  54.     if (TickCount^ - Tc1) > 36 then
  55.       begin
  56.         Error:=2; Exit;   { Time out - hardware error or not supported }
  57.       end;
  58.   until Rdy1 and 2 = 0;
  59.   Port[$60] := Data;           { Send data to keyboard }
  60.   Tc1 := TickCount^;
  61.   repeat
  62.     Rdy1 := Port[$64];         { Wait for keyboard to read data }
  63.     if (TickCount^ - Tc1) > 36 then
  64.       begin
  65.         Error:=2; Exit;
  66.       end;
  67.   until Rdy1 and 2 = 0;
  68.   Tc1 := TickCount^;
  69.   repeat
  70.     Rdy1 := Port[$64];         { Wait for keyboard to send ACK }
  71.     if (TickCount^ - Tc1) > 36 then
  72.       begin
  73.         Error:=2; Exit;
  74.       end;
  75.   until Rdy1 and 1 = 0;
  76.   Tc1 := TickCount^;
  77.   repeat until (TickCount^ - Tc1) > 2;
  78.   Rdy1 := Port[$60];
  79.   if Rdy1 <> $FA then Error:=2;   { Was it ACK? }
  80. end; {Xmit}
  81.  
  82. begin
  83.   Error:=0;
  84.   if (Delay<0) or (Delay>3) or (Typematic<0) or (Typematic>31) then
  85.     begin
  86.       Error:=1;  Exit;
  87.     end;
  88.   Xmit($F3,Error);              { send command to set delay and typematic }
  89.   if Error = 2 then Exit;
  90.   Xmit(Delay shl 5 + Typematic,Error);  { send delay and typematic values }
  91. end;{SetATKybdDelayTypematic}
  92. {----------------------------------------------------------------------------}
  93.  
  94. begin
  95.   case ParamCount of
  96.     0: begin
  97. Writeln('                  Set AT Keyboard Delay and Repeat Rate');
  98. Writeln;
  99. Writeln('            Syntax: ATKYBD [Delay Code] [Repeats/Sec Code] ');
  100. Writeln;
  101. Writeln('                   Code  Delay(Sec)    Code  Delay(Sec)');
  102. Writeln('                     0     .25           2      .75 ');
  103. Writeln('                     1     .50*          3     1.00 ');
  104. Writeln;
  105. Writeln('       Code Rep/Sec    Code Rep/Sec    Code Rep/Sec   Code Rep/Sec ');
  106. Writeln;
  107. Writeln('         0    30         8    15        16    7.5      24    3.7 ');
  108. Writeln('         1    26.7       9    13.3      17    6.7      25    3.3 ');
  109. Writeln('         2    24        10    12        18    6        26    3.0 ');
  110. Writeln('         3    21.8      11    10.9*     19    5.5      27    2.7 ');
  111. Writeln('         4    20        12    10        20    5        28    2.5 ');
  112. Writeln('         5    18.5      13     9.2      21    4.6      29    2.3 ');
  113. Writeln('         6    17.1      14     8.6      22    4.3      30    2.1 ');
  114. Writeln('         7    16        15     8.0      23    4.0      31    2.0 ');
  115. Writeln;
  116. Writeln('          * Standard Values');
  117.        end;
  118.     2: begin
  119.          Val(ParamStr(1),Dly1,Result1);
  120.          Val(ParamStr(2),Repeat1,Result2);
  121.          if (Result1 > 0) or (Result2 > 0) then
  122.            begin
  123.              Writeln('Syntax error - Exit Program');  Exit;
  124.            end
  125.          else
  126.            begin
  127.              SetATKybdDelayTypematic(Dly1,Repeat1,Error);
  128.              case Error of
  129.                0: begin
  130.                     Write('AT Keyboard Delay: ',DlyVal[Dly1],' sec.  ');
  131.                     Writeln('Typematic: ',RepVal[Repeat1],' repeats/sec');
  132.                   end;
  133.                1: begin
  134.                     Writeln('Syntax Error - Exit Program'); Exit;
  135.                   end;
  136.                2: begin
  137.                     Write('Hardware error or feature not supported');
  138.                     Writeln(' - Exit Program');  Exit;
  139.                   end;
  140.                end;
  141.            end;
  142.        end;
  143.     else           { 1 or greater than 2 command line parameters }
  144.       begin
  145.         Writeln('Syntax error - Exit Program');  Exit;
  146.       end;
  147.    end;
  148.  end.
  149. 
  150.