[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]

    { INGO ROHLOFF

    > I've got a problem I just CAN'T solve...
    > In a PASCAL-program I want to execute a procedure every time the user
    > presses a key... Fairly easy, right ? But here comes the problem : I want
    > to repeat that procedure until he RELEASES that key...

    The only way to do that is to hook up the int 9 (the Keyoard Int...).
    }

    Program KEY;

    uses
      crt, dos;

    var
      oldint  : pointer;
      keydown : byte;
      keys    : array [0..127] of boolean;
      scan,
      lastkey : byte;

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

    procedure INT9; interrupt;
    begin
      scan := port[$60];     { Get Scancode }
      if scan > $7F then     { Key released ? }
      begin
        if keys[scan xor $80] then
          dec(keydown);
        keys[scan xor $80] := false;   {Yes !}
      end
      else
      begin
        if not keys[scan] then
          inc(keydown);
        keys[scan] := true;  {NO ! Key pressed }
        lastkey := scan;
      end;
      port[$20] := $20;  { Send EndOfInterrupt to Interruptcontroller }
    end;

    begin
      init;
      getintvec(9, oldint);
      setintvec(9, @INT9);
      repeat
        if (keydown > 0) and not keys[1] then
        begin
          repeat
            sound(lastkey * 30);
          until keydown = 0;
          nosound;
        end;
      until keys[1];        {*** Wait for ESC pressed ***}
      setintvec(9, oldint);
    end.

[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]