Справочник программиста на персональном компьютере фирмы IBM. Клавиатура - Проверка/установка статуса клавиш-переключателей

ОГЛАВЛЕНИЕ

     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     ;меняем байт статуса