[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]
{
Unit for reading multiple keys... works brilliantly,
although I (Scott Tunstall) didn't write it, I think it was
Lou Duchez. Thanks Lou!
}
Unit NWKBDINT ;
Interface
Procedure HookKeyBoardInt; { Take over Keyboard handler }
Procedure UnHookKeyBoardInt; { Return control back to system }
Var
KeyDown : Array[0..127 ] of Boolean ;
Implementation
Uses DOS;
Var
OldInt09 : Pointer ;
ExitSave : Pointer ;
{$F+}
procedure Newint09; assembler; { new keyboard handler }
asm
push ax { push registers }
push bx
push ds
mov ax, SEG @Data
mov ds, ax
in al, 60h
mov bx, ax
and bx, 007fh { switch high bit of BX to zero }
and al, 80h { check high bit of port value }
jz @press
@release: { high bit = 1: "release" code }
mov byte ptr keydown[bx], 00h { write 00 to "down" array element }
jmp @done
@press: { high bit = 0: "press" code }
mov byte ptr keydown[bx], 01h { write 01 to "down" array element }
@done:
in al, 61h { read port 61h, system ctrl port }
mov ah, al { save value to AH }
or al, 80h { set top bit to "1" - reset kbd }
out 61h, al { write out value to port }
xchg ah, al { put original value back into AL }
out 61h, al { rewrite original value in AL }
mov al, 20h { generate End of Interrupt }
out 20h, al
pop ds { pop registers }
pop bx
pop ax
iret { return }
end;
Procedure HookKeyBoardInt; { Take over keyboard }
Var KeyCount: byte;
Begin
For KeyCount:=0 to 127 do
KeyDown[KeyCount]:=False;
GetIntVec(9,OldInt09);
SetIntVec(9,@NewInt09);
End;
Procedure UnHookKeyBoardInt; { Let system do hard work now }
Begin
SetIntVec(9,OldInt09);
Mem[$40:$1c]:=Mem[$40:$1a]; { Flush key buffer so
there's no phantom keys }
End;
Begin
Writeln('Installing NEWKBDINT multiple key handler..');
End.
[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]