Вопрос по клавиатуре (scan-коды...)

Тема в разделе "WASM.ASSEMBLER", создана пользователем Microedition, 31 дек 2008.

  1. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    В книге В. Кулакова "Программирование на аппаратном уровне" написано, что такие клавиши,
    как Insert, Home, PgUp, Delete... при нажатии и отпускании посылают 4 (скан-) кода, например:
    E0h, 2Ah, E0h, 52h - для Insert
    E0h, 2Ah, E0h, 4Fh - для End

    Решил полностью изучить работу с клавиатурой, в том числе обрабатывать
    нажатия вышеперечисленных клавиш. Но код 2Ah (см. выше) не посылается.
    Что делать? Может клавиатуру предварительно настроить надо? (посылая
    команды контроллеру i8042 или самой клавиатуре)
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Microedition
    Боюсь тоже не смогу ответит точно. Есть два вида сканкодов или больше. Чтобы получать желаемый нужно настроить клавиатура. Настройка делается посылкой каманды клавиатуре.

    Сам контроллр 8042 отвечает за посылку и чтение кодов на разлличные устройства. Еще он может выбрать
     
  3. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Microedition
    Решил полностью изучить работу с клавиатурой - в обед принесу и выложу мою прожку - определение скэн-кодов всех клавиш клавы при нажатии/повторе/отпускании клавиши.
     
  4. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Хм... Тогда какие команды надо посылать? Может, F0h (изменить режим работы
    (набор cкан-кодов), посылается контроллеру клавиатуры).

    Но в "Программирование на аппаратном уровне" не описываются эти наборы скан-кодов.
     
  5. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Здесь правильно сказали, есть два основных набора сканкодов, один дополнительный набор плюс всякого рода извраты производителей клавиатур. С префиксами отпускания - это второй набор. Контроллер клавиатуры может транслировать второй набор в первый, т.е. не факт что если ты получаешь сканкоды из первого набора, то они поступают от клавиатуры, а не транслируются контроллером. Лично я сам устанавливаю второй набор и отключаю трансляцию. Серые клавиши Insert и End во втором наборе имеют коды E0 70 и E0 69 (hex) соответственно. То что написал ты - это вероятно первый набор. От появления первых двух "шифтовых" байт, возможно, можно избавиться, нажав NumLock. Если не получится, то их можно не обрабатывать, т.к. левый шифт имеет просто 2A, но это только при условии, что у "беленьких" Ins и End нет префикса E0, если есть, тогда E0 2A - признак серых клавиш. А вообще первый набор мутный в этом плане, наверное поэтому я его и не стал использовать.
     
  6. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Невнимательно прочитал первый пост... то что E0 2A не посылаются - это более разумно чем если бы они посылались. Нашел файл, где представлен первый набор. А вообще у меня много подобной документации, если нужно, могу еще поискать.
     
  7. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Phantom_84
    по таблице, которую ты дал, всё работает
     
  8. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Да, только у меня большие сомнения насчет кода отпускания серых клавиш - они там однобайтовые, а я уверен, что префикс E0 должен появляться и при отпускании. Кстати, вот здесь написано про шифт-эмуляцию: Fake shifts
    А здесь есть ссылки на все три набора сканкодов: The PS/2 Keyboard Interface
     
  9. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Microedition
    Как и обещал, ложу свою прожку для изучения скэн-кодов всяких клав. Работает в ДОСе (наилучший вариант), а также под Win98SE/Хрюшей.

    http://slil.ru/26508568
     
  10. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Phantom_84
    проверил - при отпускании серых клавиш генерируется E0h,
    затем код отпущенной клавиши с установленным старшим битом.
    Но все клавиши я не проверял.


    Memphis
    честно говоря, мне не понятно, зачем в программе (в обработчике прерывания) делается так:
    (по смещению 11Fh от начала файла)

    in al,61h
    or al,10000000b
    out 61h,al

    xor al,10000000b
    out 61h,al

    Я так понял, здесь клавиатура выключается, потом опять включается... Зачем?

    И еще кое-что интересное: когда я запускаю твою прогу под Windows (xp), то
    при нажатии серых клавиш генерируются одни коды. Когда запускаю под DOS
    на виртуальной машине или на реальном компе, то коды другие...

    Например, для клавиши PageUp (hex):
    на реальном компе: E0 2A E0 49
    вирт. машина: E0 49

    Возможно, потому, что драйвер клавиатуры Windows предварительно
    конфигурирует клавиатуру, устанавливает набор скан-кодов, и так далее...
     
  11. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Microedition
    А это контроллеру клавы посылается сигнал, что скэн-код прочитан и он может генерить новый (если требуется).
     
  12. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Memphis
    прочитай пост #10 - обновил
     
  13. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    а при отпускании:
    на реальном компе: E0 C9 E0 AA
    вирт. машина: E0 C9
     
  14. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Кстати говоря, при отпускании этих расширенных клавиш скан-коды
    генерируются, но в обратном порядке и с установленными старшими битами,
    например:

    при нажатии End (hex):
    E0 2A E0 4F

    при отпускании:
    E0 CF E0 AA
     
  15. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Я порт 61h использую только для спикера. Думаю, сейчас его использование непосредственно для работы с клавиатурой неактуально.
     
  16. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Phantom_84
    61h порт относился к клавиотуре только в XT.
    В AT порт 61h был вынесен из клавиатуры. PS/2 является наследником AT.
    И имеет другой функционал нежели чем в XT.
    В AT бит 7 порта 61h только для чтения.

    В AT флаг заприщения прерывания устанавливается автоматически и также автоматически снимается при чтении из порта 60h. Поэтому читать из порта 60h обязятельно надо.


    Порт 61h XT или 8255
    бит 7 блокировка клавиотуры, посылка 1 блокирует 0 разблокир
    бит 6 различные
    бит 5 различные
    бит 4 различные
    бит 3 различные
    бит 2 различные
    бит 1 RW включить выключить передачу данных для спикер
    бит 0 RW открыть закртыть GATE2 счетчика 8254


    Порт 61h AT или PS/2 или 8042
    бит 7 RO ошибка PCI или PCK. Устанавливается при наличии бита 2 в противном 0
    бит 6 RO ошибка IOCHK ISA. Устанавливается при наличии бита 3 в противном 0
    бит 5 RO статус выхода второго счетчика таймера 8254
    бит 4 RO статус цикла обновления или регенерации.
    бит 3 RW разрешить проверку канала IOCHK
    бит 2 RW разрешить детект ошибки PCI или PCK
    бит 1 RW включить выключить передачу данных для спикер
    бит 0 RW открыть закртыть GATE2 счетчика 8254
     
  17. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Pavia, ну так я об этом же. Обновления содержимого порта 60h не происходит, пока из него не будет хотябы один раз выполнено чтение, т.е. прежний функционал достигается без использования порта 61h. Работа с клавиатурой сейчас выполняется через порты 60h и 64h. Про современное назначение порта 61h я все прекрасно знаю - маскировка отдельных источников возникновения NMI и их фиксация плюс, как я уже сказал, работа со спикером.
     
  18. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Составляющая четырехбайтовых кодов серых клавиш E0 2A / E0 AA то есть то нет благодаря NumLock'у. Предположим, вместо четырехбайтовых кодов генерируются двухбайтовые; нажали NumLock - и получили свои долгожданные четырехбайтовые последовательности по книжке; нажали снова NumLock - опять по два байта. Соответственно в вирт. машинах и/или в разных ОС состояние клавы в этом плане может быть разным - где-то сразу после запуска включен NumLock, где-то нет... Вроде и страдать тут не о чем; такая ситуация была еще в материнках и клавах 90-х годов. Я лично, обнаружив данную особенность, не стал заморачиваться, а просто решил, что проще выкидывать последовательности E0 2A / E0 AA, если они встречаются, т.е. работать так, как будто бы их нет.

    Кажется, я протупил. Об этом уже написано в первых постах темы
     
  19. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Я вот не понимаю смысл поля, например, shift, в 91 таблице файла kbd.pdf. Ведь если нажать клавишу Shift, то сначала будет приниматься скан код этой клавиши, а потом уже скан код, например, клавиши "3". Откуда в таблице код 23 для клавиши "3"?
     
  20. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    В таблице 91 представлены уже не "чистые" сканкоды, а, как я понимаю, коды возвращаемые функциями BIOS. Видимо, в столбце Shift указывается код клавиши, нажатой вместе с шифтом.