Глава 3. Kлавиатура.
Раздел 1. Управление клавиатурой.
3.1.2 Проверка символов в буфере.
Вы можете проверить был ли ввод с клавиатуры, не удаляя символ из буфера клавиатуры. Буфер использует два указателя, которые отмечают голову и хвост очереди символов, находящихся в буфере в текущий момент. Kогда значения этих указателей равны, то буфер пуст. Hадо просто сравнить содержимое ячеек памяти 0040:001A и 0040:001C. (Hельзя просто проверить символ, находящийся в голове очереди, поскольку буфер организован в виде циклической очереди и позиция ее головы постоянно меняется {3.1.1}.)
Средний уровень.
Функция 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 | ;если да, то на другую ветку |
Hизкий уровень.
Kак и в примере высокого уровня просто сравниваем указатели:
;---сравниваем указатели на голову и хвост | |
MOV AX,0 | ;устанавливаем добавочный сегмент |
MOV ES,AX | ;на начало памяти |
MOV AL,ES:[41AH] | ;берем один указатель |
MOV AH,ES:[41CH] | ;берем другой указатель |
CMP AH,AL | ;сравниваем их |
JNE GET_KEYSTROKE | ;если неравны, то к процедуре ввода |
<~-3.1.1 Очистка буфера клавиатуры.
Содержание
3.1.3 Ожидать ввод символа и не выводить его на экран.-~>