| 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
 |