Страница 3 из 26
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 ;если неравны, то к процедуре ввода
|