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

ОГЛАВЛЕНИЕ

     3.1.2 Проверка символов в буфере.


   Вы можете проверить был ли ввод с клавиатуры, не удаляя символ
из буфера клавиатуры.  Буфер  использует  два  указателя, которые
отмечают голову и хвост очереди символов, находящихся в буфере  в
текущий момент. Когда  значения  этих  указателей равны, то буфер
пуст.   Надо просто сравнить содержимое ячеек памяти 0040:001A  и
0040:001C.  (Нельзя просто проверить символ, находящийся в голове
очереди, поскольку буфер организован в виде циклической очереди и
позиция ее головы постоянно меняется [3.1.1].)

   Высокий уровень.


   Надо просто использовать оператор PEEK для получения значений,
а затем сравнить их:

100 DEF SEG = &H40    'устанавливаем сегмент на начало памяти
110 IF PEEK(&H1A)<>PEEK(&H1C) THEN ... '...то буфер не пуст

   Средний уровень.


   Функция 0BH прерывания 21H возвращает значение 0FFH в регистре
AL, когда буфер  клавиатуры  содержит  один  или более символов и
значение 0, когда буфер пуст:

;---проверка наличия символа в буфере
   MOV  AH,0BH           ;номер функции
   INT  21H              ;вызываем прерывание 21H
   CMP  AL,0FFH          ;сравниваем с 0FFH
   JE   GET_KEYSTROKE    ;переход если буфер не пуст

   Функция 1 прерывания BIOS 16H предоставляет ту же возможность,
но, кроме того, показывает какой символ  в буфере. Флаг нуля (ZF)
сбрасывается,  если буфер пуст, и устанавливается, если в  буфере
имеется символ.  В последнем случае копия символа, находящегося в
голове буфера, помещается в AX, но символ из буфера не удаляется.
В AL возвращается код  символа  для  однобайтных  символов ASCII,
иначе ASCII 0 для расширенных кодов, и тогда номер кода - в AH.

;---проверяем наличие символа в буфере
   MOV  AH,1             ;номер функции
   INT  16H              ;проверка наличия символа
   JZ   NO_CHARACTER     ;переход если ZF = 1
;---имеется символ - смотрим какой
   CMP  AL,0             ;это расширенный код?
   JE   EXTENDED_CODE    ;если да, то на другую ветку

   Низкий уровень.


   Как и в примере высокого уровня просто сравниваем указатели:

;---сравниваем указатели на голову и хвост
   MOV  AX,0           ;устанавливаем добавочный сегмент
   MOV  ES,AX          ;на начало памяти
   MOV  AL,ES:[41AH]   ;берем один указатель
   MOV  AH,ES:[41CH]   ;берем другой указатель
   CMP  AH,AL          ;сравниваем их
   JNE  GET_KEYSTROKE  ;если неравны, то к процедуре ввода