Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.15.136.22] |
|
Сообщ.
#1
,
|
|
|
Всем привет!
Есть у меня несколько вопросов по клавиатуре. Опишу их, пожалуй, в одной теме, дабы не плодить кучу похожих тем... 1. Клавиша Pause под чистым DOS'ом генерирует сразу 6 скан-кодов при нажатии (E1,1D,45, E1,9D,C5). При удержании же, как и при отпускании не генерирует ничего. Однако под Windows (включая DOSBox и VMware с DOS) нажатие на Pause генерирует скан-коды E1,1D,45 при нажатии и удержании (которые повторяются, как для любой другой клавиши) и E1,9D,C5 при отпускании. Вопрос: что такого нужно сделать, чтобы в чистом DOS'е заставить клавишу Pause работать как все остальные, т.е. как под Windows? 2. Мультимедийные клавиши (Home, Mail, Calc, Play, Stop, Prev, Next) работают только из-под Windows, в DOS они не генерируют IRQ 1. Почему? И как заставить их работать в DOS? Виндовый драйвер (причём, самый стандартный, а не фирменный) же как-то их отлавливает! Это я делал на настольном компе, но на ноуте IRQ 1 всё же генерируется, но я получаю на все клавиши один и тот же скан-код (точно уже не помню, E0 31, кажется). 3. Не реагируют светодиоды в DOS, а в VMware всё ok. Что не так? SetLEDState PROC PASCAL State:BYTE pushf cli xor cx,cx @@1: in al,64h test al,2 loopnz @@1 ; ожидаем готовность к приёму команды mov al,0EDh ; команда управления светодиодами out 60h,al xor cx,cx @@2: in al,64h test al,2 loopnz @@2 ; ожидаем готовность к приёму команды mov al,State ; состояние светодиодов out 60h,al popf ret SetLEDState ENDP p.s. Клава USB-шная. Но скан-коды из 60h читаются, сброс IRQ 1 через порт 61h работает, сброс процессора через отсылку 0FEh в порт 64h – тоже. А вот лампочки не переключаются 4. Есть прога, которая показывает нажатые клавиши (т.е. жмём все 4 стрелки – видим, что все 4 нажаты, отпускаем по одной, видим 3, 2, 1, 0). Так вот, если быстро стукнуть по нескольким клавишам (по тем же стрелкам, например), получаем генерацию IRQ 1 с нажатием 4-х клавиш и следом IRQ 1 с отпусканием... не всегда 4-х, а чаще 3-х или 2-х. Соответственно, 1 или 2 клавиши продолжают отображаться как нажатые. Причём, при запуске из-под винды (DOSBox, VMware+FreeDOS) такого нет, только в чистом DOS'е. Но тут есть один интересный момент. При таком же быстром ударе по Ctrl, Alt и Shift происходит то же самое (что неудивительно), при этом если я делаю это в каком-нибудь Volcov Commander, то вижу, что строка с помощью по функциональным клавишам остаётся в состоянии Shift или Alt, к примеру. Но! Если я нажму на букву, то эта буква будет воспроизведена как обычная буква, без Shift или Alt. Значит, BIOS каким-то образом понимает (в момент нажатия на букву, судя по всему), что Shift или Alt всё же отпущен. Как он это понимает? Добавлено Накидал прогу, которая непрерывно показывает скан-коды из порта 60h. Скан-код 0FEh отображается после нажатия на Caps/Num/Scroll Lock. Так что, видимо, эхо 0FEh – это нормально (по вопросу №3). А скан-коды мультимедийных клавиш не показываются даже без привязки к IRQ 1 (вопрос №2). |
Сообщ.
#2
,
|
|
|
1. Кака определил? чтением портов контроллера периферии? А сторонние управляющие коды (от драйвера) - смотрел?
2. Их состояние определяется исключительно поллингом. Так что никаких аппаратных прерываний - либо они эмулируются софтом. 3. УСБ клавиатура не использует контроллер периферии. Слать что-то туда нет смысла. А в Варе отрабатывает перехват низкого обращения к апп. ресурсам. 4. Клавиши-модификаторы обрабатываются не так, как остальные - у них есть регистр состояния. |
Сообщ.
#3
,
|
|
|
Цитата Akina @ Вишу на int 9 (полностью сам обрабатываю, без вызова старого обработчика), вывожу последовательность кодов из 60-го порта.1. Кака определил? Цитата Akina @ Какие сторонние управляющие коды? От какого драйвера? А сторонние управляющие коды (от драйвера) - смотрел? Цитата Akina @ Как это работает? Постоянное чтение из порта 60h ничего не показывает.2. Их состояние определяется исключительно поллингом. Цитата Akina @ Ну а почему же...3. УСБ клавиатура не использует контроллер периферии. Цитата Jin X @ (из-под DOS'а в том числе)??? Это не контроллер обрабатывает?скан-коды из 60h читаются, сброс IRQ 1 через порт 61h работает, сброс процессора через отсылку 0FEh в порт 64h – тоже Цитата Akina @ А можно чуть подробнее? Что за регистр состояния, как его получить? 4. Клавиши-модификаторы обрабатываются не так, как остальные - у них есть регистр состояния. |