2.3. Аппаратное прерывание клавиатуры
Клавиатура подключена к линии прерывания IRQ1. Этой линии соответствует прерывание INT 09h.
Клавиатурное прерывание обслуживается модулями BIOS. Драйверы клавиатуры и резидентные программы могут организовывать дополнительную обработку прерывания INT 09h. Для этого может быть использована цепочка обработчиков прерывания. В первой книге первого тома мы приводили примеры расширения обработчика прерывания INT 09h.
Как работает стандартный обработчик клавиатурного прерывания, входящий в состав BIOS?
Этот обработчик выполняет следующие действия:
читает из порта 60h скан-код нажатой клавиши;
записывает вычисленное по скан-коду значение ASCII-кода нажатой клавиши в специальный буфер клавиатуры, расположенный в области данных BIOS;
устанавливает в 1 бит 7 порта 61h, разрешая дальнейшую работу клавиатуры;
возвращает этот бит в исходное состояние;
записывает в порт 20h значение 20h для правильного завершения обработки аппаратного прерывания.
Обработчик прерывания INT 09h не просто записывает значение ASCII-кода в буфер клавиатуры. Дополнительно отслеживаются нажатия таких комбинаций клавиш, как Ctrl-Alt-Del, обрабатываются специальные клавиши PrtSc и SysReq. При вычислении кода ASCII нажатой клавиши учитывается состояние клавиш Shift и CapsLock.
Буфер клавиатуры имеет длину 32 байта и расположен по адресу 0000h:041Eh для машин IBM PC/XT.
В IBM AT и PS/2 расположение клавиатурного буфера задается содержимым двух слов памяти с адресами 0000h:0480h (компонента смещения адреса начала буфера) и 0000h:0482h (смещение конца буфера). Обычно в IBM AT эти ячейки памяти содержат значения, соответственно, 001Eh и 003Eh. Так как смещения заданы относительно сегментного адреса 0040h, то видно, что обычное расположение клавиатурного буфера в IBM AT и PS/2 соответствует его расположению в IBM PC/XT.
Клавиатурный буфер организован циклически. Это означает, что при его переполнении самые старые значения будут потеряны. Две ячейки памяти, находящиеся в области данных BIOS с адресами 0000h:041Ah и 0000h:041Ch содержат, соответственно, указатели на начало и конец буфера. Если значения этих указателей равны друг другу, буфер пуст. (Можно удалить все символы из буфера клавиатуры, установив оба указателя на начало буфера. Однако есть более предпочтительный способ с использованием прерывания BIOS INT 16h).
Указателями на начало и конец клавиатурного буфера обычно управляют обработчики прерываний INT 09h и INT 16h.
Программа извлекает из буфера коды нажатых клавиш, используя различные функции прерывания INT 16h.
Помимо управления содержимым буфера клавиатуры, обработчик прерывания INT 09h отслеживает нажатия на так называемые переключающие клавиши - NumLock, ScrollLock, CapsLock, Ins. Состояние этих клавиш записывается в область данных BIOS в два байта с адресами 0000h:0417h и 0000h:0418h.
Формат байта 0000h:0417h:
Биты Значение
0 Нажата правая клавиша Shift.
1 Нажата левая клавиша Shift.
2 Нажата комбинация клавиш Ctrl-Shift с любой
стороны.
3 Нажата комбинация клавиш Alt-Shift с любой
стороны.
4 Состояние клавиши ScrollLock.
5 Состояние клавиши NumLock.
6 Состояние клавиши CapsLock.
7 Состояние клавиши Insert.
Формат байта 0000h:0418h:
Биты Значение
0 Нажата левая клавиша Shift вместе с клавишей
Ctrl.
1 Нажата левая клавиша Shift вместе с клавишей
Alt.
2 Нажата клавиша SysReq.
3 Состояние клавиши Pause.
4 Нажата клавиша ScrollLock.
5 Нажата клавиша NumLock.
6 Нажата клавиша CapsLock.
7 Нажата клавиша Insert.
Если вы изменяете состояние светодиодов на панели клавиатуры, не забывайте устанавливать соответствующие биты в байтах состояния клавиатуры.
Программой обработки прерывания INT 09h отслеживаются некоторые комбинации клавиш. В таблице приведены эти комбинации и действия, выполняемые обработчиком прерывания при их обнаружении:
Комбинация клавиш Выполняемые действия
Ctrl-Alt-Del Сброс и перезагрузка системы.
Ctrl-NumLock, Перевод машины в состояние ожидания
Pause до нажатия любой клавиши.
Shift-PrtSc Распечатка на принтере содержимого
видеопамяти.
Ctrl-Break Выполнение прерывания INT 1Bh,
завершающего работу программы.
Многие типы клавиатур имеют отдельную альтернативную цифровую панель, напоминающую клавиатуру калькулятора. Если одновременно с нажатием на клавишу Alt набрать число на этой панели (не большее, чем 255 и не равное 0), то это число будет помещено в буфер клавиатуры, как будто бы оно было введено нажатием на одну клавишу. Это число будет также записано в слове по адресу 0000h:0419h в области данных BIOS.
При переполнении внутреннего буфера клавиатуры или буфера, расположенного в области данных BIOS, программа-обработчик прерывания INT 09h генерирует звуковой сигнал.
При составлении программ для MS-DOS у вас едва ли появится необходимость непосредственного манипулирования содержимым буфера клавиатуры - вы можете использовать прерывание BIOS INT 16h для выполнения практически всех клавиатурных операций.
В следующем разделе мы займемся непосредственно изучением средств работы с клавиатурой, предоставляемых в распоряжение прерыванием BIOS INT 16h.
- Клавиатура
- 2.1. Принципы работы клавиатуры
- 2.2. Порты для работы с клавиатурой
- 2.3. Аппаратное прерывание клавиатуры
- 2.4. Средства bios для работы с клавиатурой
- 2.4.1. Чтение символа с ожиданием
- 2.4.2. Проверка буфера на наличие в нем символов
- 2.4.3. Получение состояния переключающих клавиш
- 2.4.4. Установка временных характеристик клавиатуры
- 2.4.5. Запись символов в буфер клавиатуры
- 2.4.6 Чтение символа с ожиданием для 101-клавишной клавиатуры
- 2.4.7. Проверка буфера на наличие в нем символов для 101-клавишной клавиатуры
- 2.4.8. Получение состояния переключающих клавиш для 101-клавишной клавиатуры
- 2.5. Средства ms-dos для работы с клавиатурой
- 2.5.1. Буферизованный ввод с эхо-выводом
- 2.5.2. Буферизованный ввод без эхо-вывода
- 2.5.3. Нефильтрованный ввод без эхо-вывода
- 2.5.4. Ввод/вывод на консоль
- 2.5.5. Ввод строки символов
- 2.5.6. Проверка состояния стандартного ввода
- 2.5.7. Сброс буфера клавиатуры
- 2.6. Клавиатурные функции библиотеки Microsoft c
- 2.6. Драйвера режима ядра для ps/2 клавиатуры Стек драйверов для системных устройств ввода
- Стек драйверов для Plug and Play ps/2-клавиатуры
- Стек устройств для Plug and Play ps/2-клавиатуры
- Обработка клавиатурного ввода приложениями Поток необработанного ввода (получение данных от драйвера)
- Обработка сообщений конкретным окном
- Массивы состояния клавиш клавиатуры
- Клавиатурные ловушки
- Общая схема обработки
- Модель прямого ввода (Raw Input)