OSDev
http://osdev.su/

Сканкоды клавиатуры через BIOS int 16h
http://osdev.su/viewtopic.php?f=6&t=700
Страница 1 из 1

Автор:  megafanat [ 28 фев 2013, 05:39 ]
Заголовок сообщения:  Сканкоды клавиатуры через BIOS int 16h

Получаю скан-коды клавиатуры через прерывание BIOS int 16h, функцией 0:
Код:
   uint8_t _asciiCode = 0;
   uint8_t _scanCode = 0;
   __asm
   {
      mov ah, 00h
      int 16h
      mov _asciiCode, al
      mov _scanCode, ah
   }

Экспериментально установлено, что приходят сканкоды из набора 1.
Однако выявился ряд странных особенностей:
  • Все приходящие сканкоды однобайтовые. Даже если нажата клавиша, у которой в описании указан двухбайтовый сканкод(например Del).
  • Не приходят сканкоды отпускание клавиш, только на нажатие.
  • Не приходят сканкоды на нажатие клавиш-модификаторов.
  • При нажатой клавише Alt при нажатии цифровых клавиш приходят совсем другие сканкоды. А при нажатии символьных клавиш не приходит никаких сканкодов.

Это всё по большей части можно пережить, за исключением последнего пункта. Я не могу ловить нажатия сочетаний Alt+символьная клавиша (например Alt-[). Подскажите пожалуйста, как можно решить эту проблему наиболее простым способом?

Автор:  pavia [ 28 фев 2013, 06:44 ]
Заголовок сообщения:  Re: Сканкоды клавиатуры через BIOS int 16h

Написать драйвер для клавиатуры.
Это не сложно.
Вешаешь на прерывание свой обработчик.
Который напрямую общается с контроллёро 8042. Проверяешь что источником прерывания является 8042. Читаешь сканкод и переводишь в удобный тебе формат.
Предварительно только надо настроитб 8042. Для совместимости можно ещё старый обработчик вызывать.

Автор:  phantom-84 [ 28 фев 2013, 10:53 ]
Заголовок сообщения:  Re: Сканкоды клавиатуры через BIOS int 16h

megafanat писал(а):
Однако выявился ряд странных особенностей...
Ничего странного. BIOS транслирует оригинальные сканкоды.

Цитата:
Это всё по большей части можно пережить, за исключением последнего пункта. Я не могу ловить нажатия сочетаний Alt+символьная клавиша (например Alt-[). Подскажите пожалуйста, как можно решить эту проблему наиболее простым способом?
Для большинства сочетаний Alt/Ctrl/Shift+Клавиша BIOS возвращает вполне определенные коды (ищи соотв. таблицы в инете по кл. словам "расширенные коды клавиш"). Вроде если на выходе al=0, то в ah находится расширенный код.

Автор:  pavia [ 28 фев 2013, 12:50 ]
Заголовок сообщения:  Re: Сканкоды клавиатуры через BIOS int 16h

Можно биос использовать.
http://docviewer.yandex.ru/?url=ya-disk ... e&page=140
http://docviewer.yandex.ru/?url=ya-disk ... c9&page=50

Автор:  megafanat [ 28 фев 2013, 13:50 ]
Заголовок сообщения:  Re: Сканкоды клавиатуры через BIOS int 16h

Как раз проблема в том, что для некоторых сочетаний, например Alt-[ скан-код не приходит.

Впрочем, кажется я нашел частичное решение: вместо функций 00h и 02h можно использовать функции 10h и 12h. Они позволяют ловить сочетания вида Alt-[.

Но к сожалению, все равно остается ложка дегтя: эти функции не ловят сочетание Alt и клавиши со скан-кодом 0x56(обычно расположена справа от левой клавиши Shift). А это сочетание тоже нужно.

Автор:  pavia [ 28 фев 2013, 14:57 ]
Заголовок сообщения:  Re: Сканкоды клавиатуры через BIOS int 16h

ИХМО самый простой способ - через порты вода вывода. Пишешь драйвер раз и на всегда.
Ты сможешь контролировать одновременное нажатия нескольких клавиш. CTRL, SHIFT работают без вопросов, стрелки работают, мультимедийные клавиши тоже работают.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/