{ Questo esempio vale per tre! 
  1) come leggere la tastiera svincolandosi dal sistema di ripetizione
     automatica dei tasti
  2) come leggere pi— tasti contemporaneamente (ad esempio due tasti
     cursore premuti insieme, utile nei videogiochi)
  3) come eseguire ripetutamente una subroutine durante tutto il tempo in cui
     un tasto Š premuto

  Il programma proviene dall'archivio SWAG ed Š opera di
  Ingo Rohloff (2:246/36.7), con qualche piccolo ritocco da parte mia. }


Program KEY;

uses CRT, DOS;

var oldint9  : pointer;
    keysdown : byte;                  { Number of keys currently down }
    keys     : array[0..127] of boolean;   { keys[n]=TRUE if key n is down }
    scan,
    lastkey  : byte;                  { Scan of last key pressed }


procedure init;
var i: byte;
begin
   clrscr;
   for i := 0 to 127 do keys[i]:=false;   { No key pressed }
   keysdown := 0;
end;


procedure INT9; interrupt;
begin
   scan := port[$60];     { Get scan code }
   if scan > $7F then     { Key released? }
      begin
         if keys[scan xor $80] then dec(keysdown);
         keys[scan xor $80] := false
      end
   else
      begin
         if not keys[scan] then inc(keysdown);
         keys[scan] := true;
         lastkey:=scan
      end;
   port[$20] := $20   { Send End Of Interrupt to interrupt controller }
end;


begin  { Main }
   init;
   GetIntVec(9, oldint9);
   SetIntVec(9, @INT9);
   repeat
      if (keysdown > 0) and not keys[1] then
          begin
             repeat
                sound(lastkey*30);
             until keysdown = 0;
             nosound
          end;
   until keys[1];        {*** Wait for ESC pressed ***}
   SetIntVec(9, oldint9)
end.


{ N.B.  I tasti vengono riferiti mediante il loro codice di scansione (scan
        code) e non mediante un codice ASCII.  Per conoscere lo scan code di
        ciascun tasto basta stampare la variabile lastkey.
        Ctrl-Break e Ctrl-Alt-Del non hanno pi— effetto, come anche le fun-
        zioni ReadKey e KeyPressed della unti CRT.

  Nota per i programmatori C: se traducete questo programma in C ricordatevi
  di mettere il qualificatore "volatile" davanti al tipo delle variabili
  keysdown, keys e lastkey. }
