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

Вы можете создать файл, текст которого приведен ниже, и направить его в отладчик командой

Debug < TOGGLE.SCR

RCX С

А

MOV AX,0040

MOV DS,AX

XOR BytePtr [0017],80

INT20

N INSERT.COM W

Е 109 40

N CAPSLOCK.COM

W

Е 109 20

N NUMLOCK.COM

W

Е 109 10

N SCROLOCK.COM

W

Q

Рисунок 5

либо ввести инструкции непосредственно, находясь в отладчике. Результирующие файлы INSERT.COM, CAPSLOCK.COM, NUMLOCK.COM и SCROLOCK.COM можно использовать в пакетных файлах для включения того или иного состояния. Для некоторых расширенных клавиатур данные программы не будут включать соответствующие светодиодные индикаторы, однако результирующее состояние будет верным.

Клавиши-переключатели

Логика работы клавиш-переключателей (Insert, CapsLock, NumLock и ScrollLock) отличается от логики работы клавиш сдвига. Когда программа INT 09H встречает скан-код клавиши-переключателя, она подготавливается к установке (с использованием оператора OR) соответствующего бита в байте KD_FLAG1. Так как все биты в KD_FLAG уже заняты, то для хранения состояния этих клавиш используется второй байт (см. рис. 6). Перед установкой этого бита INT 09H проверяет, не был ли он установлен ранее.

Рисунок 6

Если был. то INT 09H считает, что произошел автоповтор, и не предпринимает никаких действий. С помощью программы PORT-A можно увидеть, что нажатие или отпускание CapsLock действует точно так же, как нажатие и отпускание любой другой клавиши, при этом так же посылается набор скан-кодов в случае автоповтора. Если не использовать дополнительную логику переключения, то автоповтор приведет к непредсказуемым и нежелательным переключениям. Если бит еще не установлен, то он устанавливается, указывая на то, что клавиша нажата. Также переключается бит в KD_FLAG для индикации смены состояния (это выполняется операцией XOR). Для просмотра содержимого KD_FLAG в вашем компьютере воспользуйтесь рекомендациями, приведенными выше.

Набор символов через Alt

Программа INT 09H специальным образом обрабатывает комбинации клавиши Alt с клавишами цифровой клавиатуры. Если клавиша Alt нажата (INT 09H определяет это по биту 3 в KD_FLAG), и если обнаруживается скан-код цифровой клавиши, то INT 09H добавляет число, нарисованное на клавише, к байту по адресу 40:19 в области данных BIOS — ALT_INPUT. Предыдущее значение ALT_INPUT умножается на 10 (для сдвига десятичной точки вправо на одну позицию) прежде, чем будет добавлено новое число. При отпускании клавиши Alt полученное таким образом число интерпретируется как десятичный эквивалент ASCII-кода и помещается в буфер клавиатуры. Для примера, в командной строке DOS нажмите клавишу Alt и, удерживая ее, нажмите и отпустите клавишу 6, а затем 5 на цифровой клавиатуре. Отпустите клавишу Alt — на экране появится буква А, ASCII-код которой равен 65. При отпускании Alt INT 09H сбрасывает ALT INPUT в 0. Если при отпускании Alt значение ALT_INPUT равно 0, то ввод не производится, что объясняет невозможность ввода нуля (ASCII — ноль) с помощью этого метода.

Этот альтернативный метод ввода работает только с цифровой клавиатурой, но не с числовыми клавишами в верхнем ряду. Состояние NumLock не имеет значения. Метод набора через Alt используется для ввода символов управления и псевдографики.

Состояние удержания

Если не нажаты клавиши сдвига или клавиши-переключатели, INT 09H проверяет бит 3 в байте KD_FLAG1 для определения активности состояния паузы. Если этот бит установлен, что подразумевает пребывание машины в "замороженном" состоянии, то он сбрасывается и INT 09H прекращает работу. Бит 3 устанавливается нажатием комбинации Ctrl-NumLock на 83-клавишной клавиатуре, или специализированной клавиши Pause на 101-клавишной клавиатуре. Для "замораживания" машины INT 09H зацикливается сразу после установки бита паузы, ожидая его сброса. Сброс осуществляется при нажатии на любую клавишу, за исключением клавиш сдвига. Это происходит потому, что проверка состояния клавиш сдвига выполняется раньше, чем проверка состояния бита паузы.