Страница 8 из 26
3.1.7 Проверка/установка статуса клавиш-переключателей. Два байта, расположенные в ячейках памяти 0040:0017 и 0040:0018 содержат биты, отражающие статус клавиши сдвига и дру- гих клавиш-переключателей следующим образом:
Бит Клавиша Значение, когда бит = 1 0040:0017 7 Insert режим вставки включен 6 CapsLock режим CapsLock включен 5 NumLock режим NumLock включен 4 ScrollLock режим ScrollLock включен 3 Alt клавиша нажата 2 Ctrl клавиша нажата 1 левый Shift клавиша нажата 0 правый Shift клавиша нажата
0040:0018 7 Insert клавиша нажата 6 CapsLock клавиша нажата 5 NumLock клавиша нажата 4 ScrollLock клавиша нажата 3 Ctrl-NumLock режим Ctrl-NumLock включен остальные биты не используются
Прерывание клавиатуры немедленно обновляет эти биты статуса, как только будет нажата одна из клавиш-переключателей, даже если не было считано ни одного символа из буфера клавиатуры. Это верно и для клавиши Ins, которая единственная из этих 8 клавиш помещает код в буфер (установка статуса Ins меняется даже если в буфере нет места для символа). Отметим, что бит 3 по адресу 0040:0018 устанавливается в 1, когда действует режим задержки Ctrl-NumLock; поскольку в этом состоянии программа приостановлена, то этот бит несущественен. Прерывание клавиатуры проверяет состояние статусных битов перед тем, как интерпретировать нажатые клавиши, поэтому когда программа меняет один из этих битов, то эффект такой же, как при физическом нажатии соответствующей клавиши. Вы можете захотеть установить состояние клавиш NumLock и CapsLock, чтобы быть уве- ренным, что ввод будет требуемого вида. Наоборот, Ваша программа может нуждаться в чтении статуса этих клавиш, например для того, чтобы вывести текущий статус на экран. Отметим, что клавиатура AT правильно устанавливает световые индикаторы состояния клавиш, даже если переключены программно.
Высокий уровень. В данном примере клавиша NumLock переводится в режим, когда клавиши дополнительной клавиатуры используются для перемещения курсора, за счет сбрасывания бита 5 по адресу 0040:0017 в 0. Это достигается за счет операции логического "И" значения, располо- женного по этому адресу с числом 223 (цепочка битов 11011111B - описание логики битовых операций см. в Приложении Б). Результат помещается в байт статуса. В примере затем восстанавливается значение этого бита в 1, за счет логического "ИЛИ" с 32 (00100000B).
100 DEF SEG = &H40 'устанавливаем сегмент на область 110 STATUSBYTE=PEEK(&H17) 'BIOS и берем байт статуса 120 NEWBYTE=STATUSBYTE AND 223 'обнуляем бит 5 130 POKE(&H17,NEWBYTE) 'посылаем новое значение статуса
Чтобы, наоборот, включить этот бит:
120 NEWBYTE=STATUSBYTE OR 32 'устанавливаем бит 5 130 POKE(&H17,NEWBYTE) 'посылаем новое значение статуса
Строки 110-130 могут быть уплотнены к виду:
110 POKE(&H417,PEEK(&H417)AND 223) или 110 POKE(&H417,PEEK(&H417)OR 223)
Средний уровень. Функция 2 прерывания 16H предоставляет доступ к одному - но только одному - из байтов статуса. Это байт по адресу 0040:0017, который содержит больше полезной информации. Байт возвращается в AL.
;---проверка статуса клавиши вставки MOV AH,2 ;номер функции INT 16H ;получаем байт статуса TEST AL,10000000B ;проверяем бит 7 JZ INSERT_OFF ;если 0, то INSERT выключен
Низкий уровень. В данном примере устанавливается режим вставки, за счет уста- новки бита 7 байта статуса по адресу 0040:0017 (который адресует- ся как 0000:0417).
SUB AX,AX ;устанавливаем добавочный сегмент на MOV ES,AX ;начало памяти MOV AL,10000000B ;готовим бит 7 к установке OR ES:[417H],AL ;меняем байт статуса
|