Advertisement
Nuppiz

Keyb

Mar 19th, 2023
817
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.28 KB | None | 0 0
  1. #define KB_ARRAY_LENGTH     256
  2. #define KB_QUEUE_LENGTH     256
  3.  
  4. typedef struct
  5. {
  6.     uint8_t keycode;
  7.     uint8_t type;
  8.     uint32_t time;
  9. } KeyEvent_t;
  10.  
  11. typedef struct
  12. {
  13.     KeyEvent_t queue[KB_QUEUE_LENGTH];
  14.     uint8_t keystates[KB_ARRAY_LENGTH];
  15.     uint8_t queue_head;
  16.     uint8_t queue_tail;
  17. } Keyboard_t;
  18.  
  19. Keyboard_t Keyboard = {0};
  20.  
  21. static void interrupt (far *old_Keyhandler_ISR)(void);
  22.  
  23. void pushKeyEvent(KeyEvent_t event)
  24. {
  25.     if ((uint8_t)(Keyboard.queue_tail+1) != Keyboard.queue_head)
  26.         Keyboard.queue[Keyboard.queue_tail++] = event;
  27. }
  28.  
  29. static void handleScanCode(uint8_t scan)
  30. {
  31.     KeyEvent_t event;
  32.     static uint8_t status = 0;
  33.  
  34.     if (scan == KEY_SPECIAL_CODE)
  35.     {
  36.         status = 0x80;
  37.         return;
  38.     }
  39.  
  40.     event.keycode = (scan & ~KEY_RELEASED_FLAG) | status;
  41.  
  42.     if (scan & KEY_RELEASED_FLAG)
  43.     {
  44.         // Clear key down flag, set key released flag
  45.         Keyboard.keystates[event.keycode] &= ~KEY_PRESSED_FLAG;
  46.         Keyboard.keystates[event.keycode] |= KEY_RELEASED_FLAG;
  47.         event.type = KEY_RELEASED_FLAG;
  48.         pushKeyEvent(event);
  49.     }
  50.     else if (!(Keyboard.keystates[event.keycode] == KEY_PRESSED_FLAG))
  51.     {
  52.         // Key newly pressed (not a repeat); set key down and key struck flags
  53.         Keyboard.keystates[event.keycode] |= KEY_PRESSED_FLAG|KEY_HIT_FLAG;
  54.         event.type = KEY_HIT_FLAG;
  55.         pushKeyEvent(event);
  56.     }
  57.     status = 0;
  58. }
  59.  
  60. void interrupt far Keyhandler()
  61. {
  62.     while (inportb(0x64) & 1)
  63.         handleScanCode(inportb(0x60));
  64.     outportb(0x20, 0x20);
  65. }
  66.  
  67. void initKeyboard()
  68. {
  69.     uint8_t far *bios_key_state;
  70.     asm cli
  71.     // save address of current keyhandler interrupt function
  72.     old_Keyhandler_ISR = _dos_getvect(KEYHANDLER_INT);
  73.     // caps lock & num lock off
  74.     bios_key_state = MK_FP(0x040, 0x017);
  75.     *bios_key_state &= (~(32|64));
  76.     old_Keyhandler_ISR();
  77.     // replace old keyhandler with new keyhandler function
  78.     _dos_setvect(9, Keyhandler);
  79.     asm sti
  80. }
  81.  
  82. void deinitKeyboard()
  83. {
  84.     // restore old keyhandler
  85.     asm cli
  86.     _dos_setvect(KEYHANDLER_INT, old_Keyhandler_ISR);
  87.     asm sti
  88. }
  89.  
  90. void clearKeys()
  91. {
  92.     int i;
  93.     for (i = 0; i < KB_ARRAY_LENGTH; i++)
  94.         Keyboard.keystates[i] &= KEY_PRESSED_FLAG;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement