Программа CHKBUF
Приведем исходный текст программы CHKBUF, выводящей на экран в цикле символ '*' (листинг 2.3). Если нажать любую клавишу, кроме <Esc>, программа выводит на экран строку текста - инструкцию для завершения работы программы. Если же нажать на клавишу <Esc>, работа программы будет завершена.
Листинг 2.3. Файл chkbuf\chkbuf.c
// =====================================================
// Демонстрация способа проверки буфера клавиатуры
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW: http://www.glasnet.ru/~frolov
// или
// http://www.dials.ccas.ru/frolov
// =====================================================
#include <stdio.h>
#include <dos.h>
int main(void)
{
union REGS rg;
int i, zflag;
printf("CHKBUF, (c) A. Frolov, 1997\n");
for(;;)
{
// Выводим в цикле символ '*'
putchar('*');
// Небольшая задержка во времени
for(i=0; i<30000; 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("\nPress <ESC> to exit\n");
}
}
return 0;
}