2.4.2. Проверка буфера на наличие в нем символов



2.4.2. Проверка буфера на наличие в нем символов

На входе: AH = 01h. На выходе: ZF = 0, если в буфере имеется код нажатой на клавиатуре клавиши; ZF = 1, если буфер клавиатуры пуст; AL = ASCII-код символа или 0, если AH содержит расширенный ASCII-код символа; AH = скан-код или расширенный ASCII-код символа, если AL=0.

Функция 01h поможет вам проверить состояние буфера клавиатуры - есть там коды нажатых клавиш или нет. При этом программа не переводится в состояние ожидания, даже если буфер клавиатуры пуст. В этом случае в регистре флагов устанавливается в единицу флаг ZF и управление возвращается программе.

Эту функцию удобно использовать во время выполнения какого-либо длительного процесса (например, форматирования диска или передачи данных по линии связи) для прерывания этого процесса по запросу оператора.

Кроме того, функцию можно использовать вместе с функцией 00h для сброса содержимого клавиатурного буфера. Для этого в цикле повторяют вызов функции 01h, вслед за которым идет вызов функции 00h при условии, что буфер клавиатуры не пуст. Сброс клавиатурного буфера полезно выполнять перед вводом ответственной информации, так как из-за случайного двойного или тройного нажатия на клавишу в буфере клавиатуры могут оказаться лишние символы.

Приведем текст программы, выводящей на экран в цикле символ '*'. При нажатии на любую клавишу, кроме ESC, программа выводит на экран строку текста - инструкцию для завершения работы программы. Если нажать на клавишу ESC, работа программы будет завершена. #include <stdio.h> #include <dos.h> void main(void); void main(void) { union REGS rg; int i, zflag; for(;;) { // Выводим в цикле символ '*' putchar('*'); // Небольшая задержка во времени for(i=0; i<1000; i++); // Вызываем прерывание INT 16h для проверки буфера клавиатуры // Устанавливаем флаг, который будет сброшен при нажатии на // любую клавишу zflag = 1; _asm { mov ax, 0100h int 16h // Если нажатия не было, // продолжаем выполнение программы jz nokey // При нажатии на любую клавишу // сбрасываем флаг mov zflag, 0 nokey: } if(zflag == 0) { // Если флаг сброшен, читаем код нажатой клавиши из буфера // при помощи функции 01h прерывания INT 16h rg.h.ah = 0; int86(0x16, &rg, &rg); // Если была нажата клавиша ESC, завершаем работу программы if(rg.h.ah == 1) { // Выводим на экран содержимое регистров AH и AL, // содержащих, соответственно, скан-код и ASCII-код // нажатой клавиши. printf("\nScan = %02.2X Ascii = %02.2X", rg.h.ah, rg.h.al); break; } else printf("\nДля завершения нажмите ESC\n"); } } }



- Начало - - Назад - - Вперед -