From: "Victor B. Wagner" <vitus@agropc.msk.su>
Organization: Agroecological problems Center
>1 - Кто нибудь программировал контроллер клавиатуры ?
> (конкретно интересует имитация нажатия клавиш,
> считывание нескольких нажатых и неотпущенных клавиш).
А зачем для этого лезть в контроллер клавиатуры?
Для того, чтобы сымитировать нажатие клавиш требуется всего лишь
запихать код в буфер клавиатуры. В AT-BIOS для этого существует
функция 5 прерывания 16H, описание которой найти не сложно.
Не намного сложнее напрямую работать с буфером клавиатуры.
Вот текст функции для этой цели из TurboProfessional 5.11
procedure StuffKey(W : Word);
{-Stuff one key into the keyboard buffer}
const
KbdStart = $1E;
KbdEnd = $3C;
var
KbdHead : Word absolute $40 : $1A;
KbdTail : Word absolute $40 : $1C;
SaveKbdTail : Word;
begin
SaveKbdTail := KbdTail;
if KbdTail = KbdEnd then
KbdTail := KbdStart
else
Inc(KbdTail, 2);
if KbdTail = KbdHead then
KbdTail := SaveKbdTail
else
MemW[$40:SaveKbdTail] := W;
end;
Что же касается считывания нескольких нажатых и неотпущенных клавиш,
то придется перехватить INT9 и работать со скэнкодами напрямую
Вот простая программка, поэкспериментировав с которой вы найдете ответ
на ваш вопрос. Обратите внимание на то, что она выдает при нажатии
клавиши и что при отпускании
Program TestScancode;
Uses Dos,CRT;{CRT здесь существеннен - не следует пользоваться функциями dos
из обработчика клавиатурного прерывания}
var OldKbdHandler:Pointer;
Procedure Int9;interrupt;
var Scancode:Byte;
begin
ScanCode:=Port[$60];
Write(ScanCode:4);
asm
Pushf
Call DWORD PTR OldKbdHandler;
end;
end;
begin
GetIntVec($9,OldKbdHandler);
SetIntVec($9,@Int9);
Repeat
Until Readkey=#27;
SetIntVec($9,OldKbdHandler);
end;
--
Phone: 230-80-61 Victor B.Wagner
E-Mail:vitus@agropc.msk.su Dokuchaev Soil Institute
7, Pyzhevsky lane,
Moscow, Russia
|