Аппаратное обеспечение персонального компьютера

Программа 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;

}



Содержание раздела