Справочник программиста на персональном компьютере фирмы 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 ;если неравны, то к процедуре ввода