Подробное исследование работы клавиатуры ПК и обслуживающих ее прерываний, страница 11

Нажмите F3 для отображения команды D 40:17 L1, но пока не нажимайте Enter. Сначала нажмите Insert для включения режима вставки и после этого нажмите Enter, Вы увидите значение 80Н, указывающее на то, что режим вставки активен. Снова нажмите Insert для его деактивации, затем по одной нажимайте другие фиксируемые клавиши сдвига (CapsLock, NumLock, ScrollLock). Нажимая F3 и Enter после каждого из переключении, наблюдайте производимый эффект. Проверьте, соответствуют ли полученные значения приведенным на рис. 4.

Далее нажмите CapsLock и NumLock. Нажмите F3 и Enter. На этот раз вы увидите значение, являющееся комбинацией отдельных битов, а именно, 60Н (40Н+20Н). Заметьте, что указанным способом нельзя наблюдать состояние клавиш Ctrl и АН в байте KB_FLAG, так как комбинации Ctrl-Enter и Alt-Enter не генерируют возврата каретки.

Теперь проделайте подобные операции с байтом состояния клавиш KD_PLAG1, расположенным по адресу 40:18 в области данных BIOS. Введите:

D 40:18 L1

На этот раз вы увидите 0, независимо от состояния фиксируемых клавиш. KD_FLAG1 используется BIOS для отслеживания нажатия нескольких клавиш одновременно. Для того, чтобы это увидеть, повторите предыдущую команду, не нажимая клавиши Enter, затем нажмите и удерживайте клавишу Insert и нажмите Enter. Вы увидите значение 80Н, указывающее на то, что клавиша Insert находится в нажатом состоянии. Проэкспериментируйте с другими клавишами сдвига, проделывая эту же процедуру. Для выхода из отладчика введите Q.

Как можно заметить, программа INT 09H интерпретирует скан-коды в виде строчных и прописных букв. В действительности, при нажатии на левый Shift программа INT 09H получает код 2АН и устанавливает (оператором OR) бит левой клавиши Shift (бит 1) в байте KD_FLAG. Та же логика используется и при автоповторе клавиши Shift. Последовательная установка одного и того же бита не приводит к каким-либо изменениям. Если нажимается клавиша "А", то INT 09H обнаруживает скан-код 1ЕН, соответствующий строчной букве а. В то же самое время INT 09H проверяет состояние двух клавиш Shift, просматривая содержимое байта KD_FLAG. Программа обнаруживает, что левый Shift еще нажат, поэтому строчная а становится прописной А.

Прежде чем запомнить А в буфере клавиатуры, INT 09H проверяет бит, соответствующий состоянию клавиши CapsLock (7) в байте KD_FLAG. Если CapsLock выключен, то INT 09H заносит в буфер прописную А. Если же CapsLock включена то А снова становится строчной а, тем самым отменяя CapsLock.

Далее, при отпускании левой клавиши Shift INT 09H обнаруживает скан-код ААН (ААН = 2АН+80Н) и сбрасывает бит левой клавиши Shift в байте KD_FLAG. При поступлении следующего кода 1ÅÍ INT 09H обнаруживает, что левый Shift больше не нажат (а также не нажаты ни правый Shift, ни CapsLock) и записывает в буфер строчную а.

Та же логика смены функций используется и при обработке нажатий клавиш цифровой клавиатуры. Если включен NumLock, то нажатие левой или правой клавиши Shift перед нажатием клавиши на цифровой клавиатуре отменяет установленный статус, тем самым превращая клавиши цифр в клавиши управления курсором. Такая гибкость особенно полезна для пользователей 83-клавишной клавиатуры, которые обычно оставляют NumLock включенным. Когда необходимо использовать цифровую клавиатуру для управления курсором, то вместо переключения NumLock достаточно нажать левый Shift и удерживать его.

У 101-клавишной клавиатуры наряду с блоком цифровой клавиатуры имеются специализированные клавиши управления курсором. Машины с такими клавиатурами обычно при загрузке включают NumLock, поэтому клавиатура готова для ввода чисел. Однако некоторым пользователям трудно побороть привычку и они продолжают использовать цифровую клавиатуру для управления курсором. Так как при загрузке устанавливается NumLock, то при первой попытке управления курсором на экране появляется строка цифр. Для 83-клавишной клавиатуры наблюдается обратная ошибка. Однако можно включать эти клавиши из batch-файла, например из AUTOEXEC.BAT (см. рис. 5).