home *** CD-ROM | disk | FTP | other *** search
- { 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.