На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Работа с клавиатурой через порты
    Всем привет!

    Есть у меня несколько вопросов по клавиатуре.
    Опишу их, пожалуй, в одной теме, дабы не плодить кучу похожих тем...



    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. Что не так?
    ExpandedWrap disabled
      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
    Вообще, это процедура всё же генерит IRQ 1, но при чтении скан-кода (из обработчика int 9) я получаю в качестве эха не 0FAh (как должно быть, насколько я понимаю), а 0FEh. Что это может означать?
    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).
      1. Кака определил? чтением портов контроллера периферии? А сторонние управляющие коды (от драйвера) - смотрел?
      2. Их состояние определяется исключительно поллингом. Так что никаких аппаратных прерываний - либо они эмулируются софтом.
      3. УСБ клавиатура не использует контроллер периферии. Слать что-то туда нет смысла. А в Варе отрабатывает перехват низкого обращения к апп. ресурсам.
      4. Клавиши-модификаторы обрабатываются не так, как остальные - у них есть регистр состояния.
        Цитата Akina @
        1. Кака определил?
        Вишу на int 9 (полностью сам обрабатываю, без вызова старого обработчика), вывожу последовательность кодов из 60-го порта.
        Цитата Akina @
        А сторонние управляющие коды (от драйвера) - смотрел?
        Какие сторонние управляющие коды? От какого драйвера? :)

        Цитата Akina @
        2. Их состояние определяется исключительно поллингом.
        Как это работает? Постоянное чтение из порта 60h ничего не показывает.

        Цитата Akina @
        3. УСБ клавиатура не использует контроллер периферии.
        Ну а почему же...
        Цитата Jin X @
        скан-коды из 60h читаются, сброс IRQ 1 через порт 61h работает, сброс процессора через отсылку 0FEh в порт 64h – тоже
        (из-под DOS'а в том числе)??? Это не контроллер обрабатывает?

        Цитата Akina @
        4. Клавиши-модификаторы обрабатываются не так, как остальные - у них есть регистр состояния.
        А можно чуть подробнее? Что за регистр состояния, как его получить?
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0290 ]   [ 15 queries used ]   [ Generated: 19.04.24, 04:57 GMT ]