// =====================================================
// Демонстрация способа проверки буфера клавиатуры
//
// (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;
}
