На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 4 / Клавиатура Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Клавиатура

Стандартная клавиатура PC содержит свой собственный микропроцессор (Intel 8048 или его эквивалент). Нажатие или освобождение клавиши посылает сигнал IRQ1 контроллеру прерываний, который вызывает подпрограмму обслуживания прерывания int 9 для обработки этого запроса. Приоритет прерываний от клавиатуры второй после прерываний от таймера.


ROM (постоянное запоминающее устройство) на системной плате по умолчанию содержит ISR int 9. Это достаточно сложная программа. Она читает и декодирует считываемый код, отслеживает наличие специальных клавиш (Control,Shift,Alt и др.) и преобразует сканируемые коды во внутренние. Каждое нажатие клавиши вырабатывает два сканируемых кода - для нажатой и отпущенной клавиши. Выбор сканируемого кода зависит от информации о состоянии клавиатуры. Например, нажатие клавиши A производит сканируемый код 61h (код ASCII строчной буквы а). Если при нажатии клавиши A нажата управляющая клавиша, сканируемый код трансформируется в 01h (код ASCII для Control-A). Если при нажатии клавиши A нажата клавиша Shift, сканируемый код получается 41h (ASCII для заглавной буквы A).


В результате нажатия таких клавиш как Shift и Alt ISR int 9 обновляет байт состояния клавиатуры внутри сегмента данных BIOS и обращается к IRET. Сегмент данных BIOS начинается с параграфа 40h и содержит множество динамических переменных, используемых различными подпрограммами ROM-BIOS. Листинг 4-1 описывает часть этой области данных.



                         Листинг 4-1. Сегмент данных BIOS
         ----------------------------------------------------------------

         KB_M_RShift     EQU   01h   ; установка правой клавиши сдвига
         KB_M_LShift     EQU   02h   ; установка левой клавиши сдвига
         KB_M_Control    EQU   04h   ; установка управляющей клавиши
         KB_M_Alt        EQU   08h   ; установка клавиши "Alt"
         KB_M_Scroll     EQU   10h   ; нажатие клавиши "Scroll Lock"
         KB_M_Num        EQU   20h   ; нажатие клавиши "Num Lock"
         KB_M_Caps       EQU   40h   ; нажатие клавиши "Caps Lock"
         KB_M_InsState   EQU   80h   ; режим вставки

         KB_C_BufSize    EQU   10h   ; размер буфера клавиатуры

         BIOS            SEGMENT     at 40h
                         ORG   17h   ; не существенно для др. данных BIOS
         KB_B_Flag       DB    0     ; флаг состояния клавиатуры
                         ORG   1ah   ; не существенно для 18h и 19h
         KB_W_BufHead    DW    0     ; начало буфера клавиатуры
         KB_W_BufTail    DW    0     ; оставшаяся часть буфера клавиатуры
         KB_T_Buffer     DW    KB_C_BufSize DUP(0)
         BIOS            ENDS
         ----------------------------------------------------------------

Определенные комбинации клавиш имеют специальные значения. Подпрограмма обработки прерываний от клавиатуры выполняет команду int 1Bh, когда она видит сканируемый код, соответствующий клавише прерывания. По умолчанию ISR int 1Bh содержит IRET, но обычно драйвер консоли устанавливает свою собственною ISR 1Bh, что дает ему возможность обрабатывать его прерывания специальным образом. (Этот вопрос обсуждается в главе об обработке прерываний).


В конечном счете страшная Cntrl-Alt-Del выдает int 19h. Дальнейшее обсуждение int 19h и комбинации клавиш Cntrl-Alt-Del необязательно.


Если код клавиши не имеет специального значения, ISR int 9 сохраняет его в буфере клавиатуры. Этот буфер начинается со смещения 1h внутри сегмента данных BIOS и представляет собой циркулярный буфер из 16 слов. Смещения 1Ah и 1h в этом сегменте указывают, соответственно, на начало и конец буфера. Если буфер полон, ISR int 9 выдает звуковой сигнал и отвергает символ; в противном случае символ вставляется в конец буфера.


Длина каждого элемента буфера 2 байта; его формат зависит от того, как ISR int 9 интерпретирует нажатие клавиши.


С помощью определенных комбинаций клавиш (например, Alt плюс буква или цифра) и специальных клавиш (например, функциональных клавиш) воспроизводятся символы расширенного ASCII; остальные клавиши воспроизводят обычный ASCII. Нулевой байт записи подпрограммы обработки прерываний int 9 содержит числовой идентификатор для расширенных символов ASCII, запись кода символа ASCII и сканируемый код для всех других. Программное обеспечение доступно аппаратным средствам клавиатуры через ROM-BIOS. Int 16h позволяет удалять символ из буфера клавиатуры, взглянув на первый символ в буфере, и изменять статус клавиатуры. Фактически, любой доступ к клавиатуре осуществляется через int 16h. Любой драйвер консоли использует для ввода символов и изменения статуса клавиатуры int 16h.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz