KEY.C
上传用户:hanguang
上传日期:2007-04-01
资源大小:93k
文件大小:2k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /*
  2.   file: KEY.C
  3.   purpose:
  4.     new keyboard interrupt handler and various keyboard routines
  5.     based on code from ZKEY.ASM
  6.   date: 11/4/95
  7.   note:
  8.     the key interrupts are not passed down or "chained" to the previous
  9.     interrupt handler.
  10. */
  11. #include<f:smbkey.h>
  12. #include<f:smbxlib.h>
  13. #include<f:smbgamedefs.h>
  14. #define KEYBOARD_PORT     0x60
  15. #define KEYBOARD_XT_CLEAR 0x61
  16. void far interrupt new_int09_handler(void);
  17. void far interrupt (*old_int09_handler)();
  18. BYTER far *keybuf;
  19. static int new_key_handler_installed = FALSE;
  20. void install_new_key_handler(void)
  21. {
  22.   keybuf = farmalloc(KEY_WAS_PRESSED * 2);
  23.   clear_key_buffer();
  24.   old_int09_handler = getvect(9);
  25.   setvect(9, new_int09_handler);
  26.   new_key_handler_installed = TRUE;
  27. }
  28. void far interrupt new_int09_handler(void)
  29. {
  30.   BYTER scan_code;
  31.   BYTER temp;
  32.   /* read scan code */
  33.   scan_code = inportb(KEYBOARD_PORT);
  34.   /* clear keyboard controller on XT machines */
  35.   temp = inportb(KEYBOARD_XT_CLEAR);
  36.   outportb(KEYBOARD_XT_CLEAR, temp | 0x80);
  37.   outportb(KEYBOARD_XT_CLEAR, temp & 0x7F);
  38.   if (scan_code & 0x80) {
  39.     /* key up */
  40.     scan_code &= 0x7F;
  41.     keybuf[scan_code] = 0;
  42.   }
  43.   else {
  44.     /* key down */
  45.     keybuf[scan_code] = 1;
  46.     keybuf[KEY_WAS_PRESSED+scan_code] = 1;
  47.   }
  48.   outportb(PIC, NONSPECIFIC_EOI);
  49. }
  50. void clear_key_buffer(void)
  51. {
  52.   int i;
  53.   for (i = 0; i < KEY_WAS_PRESSED * 2; i++)
  54.     keybuf[i] = 0;
  55. }
  56. void uninstall_new_key_handler(void)
  57. {
  58.   if (new_key_handler_installed) {
  59.     farfree(keybuf);
  60.     setvect(9, old_int09_handler);
  61.   }
  62. }