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

Для примера, дайте команду DOS DIR, а затем, во время вывода каталога на экран, нажмите Ctrl-NumLock на 83-клавишной клавиатуре или Pause на 101-клавишной для остановки вывода (желательно, чтобы каталог был большим). Теперь нажмите любую клавишу сдвига. Состояние изменится, однако DOS не возобновит вывод списка каталога.

Комбинация клавиш Ctrl-S тоже останавливает вывод каталога, однако это реализовано не программой INT 09H. Ctrl-S обрабатывается и вводится в буфер клавиатуры точно так же, как и любой другой символ, a DOS уже интерпретирует ее как команду паузы.

Ctrl-Alt-Del

Комбинация Ctrl-Alt-Del имеет специальное назначение. При ее обнаружении в ячейку RESET_FLAG, находящуюся в области данных BIOS, заносится значение 1234H и выполняется переход на процедуру инициализации, которая выполняется обычно при включении компьютера. Программа инициализации проверяет RESET_FLAG и пропускает самопроверку в том случае, если его значение равно 1234H. Таким образом осуществляется "теплая" перезагрузка.

Если вы обратитесь к байту KD_FLAG, то заметите, что в нем зарезервированы биты для индикации состояния клавиш Ctrl и Alt, но не Del. Бита состояния клавиши Del нет также и в KD_FLAG1. Это означает, что INT 09H не имеет возможности хранения состояния клавиши Del. Поэтому для перезагрузки необходимо сначала нажать клавиши Ctrl и Alt а затем Del. Порядок нажатия клавиш Ctrl и Alt не имеет значения, важно только нажать Del в последнюю очередь.

Ctrl-Break

При обнаружении этой комбинации INT 09H выполняет несколько действий. Сначала очищается буфер клавиатуры путем установки указателя начала буфера равным указателю конца. Затем INT 09H устанавливает в 1 старший бит байта BIOS_BREAK с адресом 40:71Н в области данных BIOS. Любая программа может проверить значение этого бита для определения состояния Ctrl-Break. Затем INT 09H вызывает прерывание INT 1BH. Обычно INT 1BH указывает на обработчик DOS. но любая программа может перехватить этот вектор и тем самым самостоятельно обрабатывать Ctrl-Break. Если прерывание INT 1BH вызывает обработчик DOS, то последний устанавливает внутренний флаг Ctrl-Break DOS. При этом любая программа, использующая функции ввода/вывода DOS при взведенном флаге Ctrl-Break (Ctrl-Break DOS а не INT 09H), будет прервана. DOS отобразит на экране значок "^С" и выведет приглашение командной строки. Последнее, что делает INT 09H с Ctrl-Break — это помещает нулевой символ и скан-код в буфер клавиатуры.

Ввод Ctrl-C тоже интерпретируется как Ctrl-Break. Выполнение этой команды, так же как и выполнение Ctrl-S, не является функцией INT 09H. Ctrl-C обрабатывается INT 09H в той же последовательности, как и любой другой символ, а уже DOS сама интерпретирует ее как команду прерывания.

Print Screen

При нажатии комбинации Shift-PrtScrn на 83-клавишной клавиатуре или специальной клавиши PrintScreen на 101-клавишной, INT 09H просто вызывает INT 05H для посылки лампа экрана на принтер. INT 09H непосредственно печатью не занимается.

Алфавитно-цифровые клавиши

Если INT 09H не обнаруживает специальных скан-кодов, то она полагает, что принятый скан-код принадлежит алфавитно-цифровому символу ASCII. Для алфавитно-цифровых символов INT 09H проверяет состояние CapsLock. Затем INT 09H заносит в буфер как сам ASCII-символ, так и скан-код нажатой клавиши. Это дает возможность прикладной программе либо прочитать ASCII-символ, либо определить нажатую клавишу. Однако, прежде чем что-либо занести в буфер программа INT 09H должна проверить, есть ли в нём место. Если места недостаточно, то INT 09H сообщает об этом сигналом динамика и завершает свое выполнение без занесения символа в буфер.

М. Меффорд

(Окончание следует)