home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_08_08 / 8n08085a < prev    next >
Text File  |  1990-07-18  |  2KB  |  97 lines

  1.  
  2.  
  3. /* KB_TEST - Read Scan Codes from Keyboard */
  4. #include <stdio.h>
  5. #include <dos.h>
  6.  
  7. #define KB_BUF_SIZ 32         /* ring buffer size */
  8.  
  9. unsigned short int kb_buff[KB_BUF_SIZ];
  10.                               /* char output buffer */
  11.  
  12. unsigned char kb_front=0, kb_back=0;
  13.                               /* queue pointers */
  14.  
  15. #define PORT_A      0x60      /* 8255 PIC Port A */ 
  16. #define PORT_B      0x61      /* 8255 PIC Port B */
  17. #define ICR         0x20      /* Interrupt Command Register */
  18. #define H_ENABLE    0x20      /* Enable hardware interrupts */
  19. #define ACK_BIT     0x80      /* ACK bit for PORT B */
  20. #define BRK_BIT     0x80      /* Scan code break bit */
  21. #define CH_BITS     0x7F      /* Scan code key number */
  22.  
  23. void interrupt kb_interrupt(void)
  24.  
  25.      {
  26.      unsigned char scan_code, ack;
  27.  
  28.      /* Read scan code and send ACK to keyboard */
  29.  
  30.      scan_code = inportb(PORT_A);
  31.      ack = inportb(PORT_B);
  32.      outportb(PORT_B, ack | ACK_BIT);
  33.      outportb(PORT_B, ack);
  34.  
  35.      kb_buff[kb_back] = scan_code;
  36.      kb_back = (kb_back + 1) % KB_BUF_SIZ;
  37.  
  38.      /* Re-enable hardware interrupts (and exit ISR) */
  39.  
  40.      outportb(ICR,H_ENABLE);
  41.      }
  42.  
  43. /* Install the ISR */
  44.  
  45. #define KB_VECTOR (0x9)
  46.  
  47. static void interrupt (*old_interrupt)(); /* DOS interrupt vector */
  48.  
  49. void kb_install(void)
  50.      {
  51.      old_interrupt = getvect(KB_VECTOR);
  52.      setvect(KB_VECTOR,kb_interrupt);
  53.      }
  54.  
  55. /* Restore DOS ISR */
  56.  
  57. void kb_restore(old_interrupt)
  58.      {
  59.      setvect(KB_VECTOR,old_interrupt);
  60.      }
  61.  
  62. /* Read a char (with wait) */
  63.  
  64. int kb_read(void)
  65.  
  66.      {
  67.      int ch;
  68.      while (kb_front == kb_back)
  69.           ;
  70.      ch = kb_buff[kb_front];
  71.      kb_front = (kb_front + 1) % KB_BUF_SIZ;
  72.      return(ch);
  73.      }
  74.  
  75. int main()
  76.      {
  77.      int scan_code;
  78.  
  79.      kb_install();
  80.      printf("\nPress ESC to Quit\n\n");
  81.      
  82.      while ( (scan_code = kb_read()) != 1)  /* ESC key scan code */
  83.           {
  84.           if (scan_code & BRK_BIT)
  85.                printf(" ^%d\n", (scan_code & 127));
  86.                                         /* break code */
  87.           else
  88.                printf(" %d",scan_code); /* made code */
  89.           }
  90.  
  91.      kb_restore();
  92.      return 0;                          /* for lint */
  93.      }
  94.  
  95. **********
  96.  
  97.