⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pc_keyb.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * PC/HW routine collection v1.3 for DOS/DJGPP * *  Copyright (C) 2002 - Daniel Borca *  Email : dborca@yahoo.com *  Web   : http://www.geocities.com/dborca */#include <pc.h>#include <sys/exceptn.h>#include <sys/farptr.h>#include "pc_hw.h"#define KEYB_IRQ 1#define KEY_BUFFER_SIZE 64#define KB_MODIFIERS (KB_SHIFT_FLAG | KB_CTRL_FLAG | KB_ALT_FLAG | KB_LWIN_FLAG | KB_RWIN_FLAG | KB_MENU_FLAG)#define KB_LED_FLAGS (KB_SCROLOCK_FLAG | KB_NUMLOCK_FLAG | KB_CAPSLOCK_FLAG)static int keyboard_installed;static volatile struct {   volatile int start, end;   volatile int key[KEY_BUFFER_SIZE];} key_buffer;static volatile int key_enhanced, key_pause_loop, key_shifts;static int leds_ok = TRUE;static int in_a_terrupt = FALSE;static volatile char pc_key[KEY_MAX];/* convert Allegro format scancodes into key_shifts flag bits */static unsigned short modifier_table[KEY_MAX - KEY_MODIFIERS] = {   KB_SHIFT_FLAG,    KB_SHIFT_FLAG,    KB_CTRL_FLAG,   KB_CTRL_FLAG,     KB_ALT_FLAG,      KB_ALT_FLAG,   KB_LWIN_FLAG,     KB_RWIN_FLAG,     KB_MENU_FLAG,   KB_SCROLOCK_FLAG, KB_NUMLOCK_FLAG,  KB_CAPSLOCK_FLAG};/* lookup table for converting hardware scancodes into Allegro format */static unsigned char hw_to_mycode[128] = {   /* 0x00 */  0,              KEY_ESC,        KEY_1,          KEY_2,    /* 0x04 */  KEY_3,          KEY_4,          KEY_5,          KEY_6,   /* 0x08 */  KEY_7,          KEY_8,          KEY_9,          KEY_0,    /* 0x0C */  KEY_MINUS,      KEY_EQUALS,     KEY_BACKSPACE,  KEY_TAB,   /* 0x10 */  KEY_Q,          KEY_W,          KEY_E,          KEY_R,    /* 0x14 */  KEY_T,          KEY_Y,          KEY_U,          KEY_I,   /* 0x18 */  KEY_O,          KEY_P,          KEY_OPENBRACE,  KEY_CLOSEBRACE,    /* 0x1C */  KEY_ENTER,      KEY_LCONTROL,   KEY_A,          KEY_S,   /* 0x20 */  KEY_D,          KEY_F,          KEY_G,          KEY_H,    /* 0x24 */  KEY_J,          KEY_K,          KEY_L,          KEY_COLON,   /* 0x28 */  KEY_QUOTE,      KEY_TILDE,      KEY_LSHIFT,     KEY_BACKSLASH,    /* 0x2C */  KEY_Z,          KEY_X,          KEY_C,          KEY_V,   /* 0x30 */  KEY_B,          KEY_N,          KEY_M,          KEY_COMMA,    /* 0x34 */  KEY_STOP,       KEY_SLASH,      KEY_RSHIFT,     KEY_ASTERISK,   /* 0x38 */  KEY_ALT,        KEY_SPACE,      KEY_CAPSLOCK,   KEY_F1,    /* 0x3C */  KEY_F2,         KEY_F3,         KEY_F4,         KEY_F5,   /* 0x40 */  KEY_F6,         KEY_F7,         KEY_F8,         KEY_F9,    /* 0x44 */  KEY_F10,        KEY_NUMLOCK,    KEY_SCRLOCK,    KEY_7_PAD,   /* 0x48 */  KEY_8_PAD,      KEY_9_PAD,      KEY_MINUS_PAD,  KEY_4_PAD,    /* 0x4C */  KEY_5_PAD,      KEY_6_PAD,      KEY_PLUS_PAD,   KEY_1_PAD,   /* 0x50 */  KEY_2_PAD,      KEY_3_PAD,      KEY_0_PAD,      KEY_DEL_PAD,    /* 0x54 */  KEY_PRTSCR,     0,              KEY_BACKSLASH2, KEY_F11,   /* 0x58 */  KEY_F12,        0,              0,              KEY_LWIN,    /* 0x5C */  KEY_RWIN,       KEY_MENU,       0,              0,   /* 0x60 */  0,              0,              0,              0,    /* 0x64 */  0,              0,              0,              0,   /* 0x68 */  0,              0,              0,              0,    /* 0x6C */  0,              0,              0,              0,   /* 0x70 */  KEY_KANA,       0,              0,              KEY_ABNT_C1,    /* 0x74 */  0,              0,              0,              0,   /* 0x78 */  0,              KEY_CONVERT,    0,              KEY_NOCONVERT,    /* 0x7C */  0,              KEY_YEN,       0,              0};/* lookup table for converting extended hardware codes into Allegro format */static unsigned char hw_to_mycode_ex[128] = {   /* 0x00 */  0,              KEY_ESC,        KEY_1,          KEY_2,   /* 0x04 */  KEY_3,          KEY_4,          KEY_5,          KEY_6,   /* 0x08 */  KEY_7,          KEY_8,          KEY_9,          KEY_0,   /* 0x0C */  KEY_MINUS,      KEY_EQUALS,     KEY_BACKSPACE,  KEY_TAB,   /* 0x10 */  KEY_CIRCUMFLEX, KEY_AT,         KEY_COLON2,     KEY_R,   /* 0x14 */  KEY_KANJI,      KEY_Y,          KEY_U,          KEY_I,   /* 0x18 */  KEY_O,          KEY_P,          KEY_OPENBRACE,  KEY_CLOSEBRACE,   /* 0x1C */  KEY_ENTER_PAD,  KEY_RCONTROL,   KEY_A,          KEY_S,   /* 0x20 */  KEY_D,          KEY_F,          KEY_G,          KEY_H,   /* 0x24 */  KEY_J,          KEY_K,          KEY_L,          KEY_COLON,   /* 0x28 */  KEY_QUOTE,      KEY_TILDE,      0,              KEY_BACKSLASH,   /* 0x2C */  KEY_Z,          KEY_X,          KEY_C,          KEY_V,   /* 0x30 */  KEY_B,          KEY_N,          KEY_M,          KEY_COMMA,   /* 0x34 */  KEY_STOP,       KEY_SLASH_PAD,  0,              KEY_PRTSCR,   /* 0x38 */  KEY_ALTGR,      KEY_SPACE,      KEY_CAPSLOCK,   KEY_F1,   /* 0x3C */  KEY_F2,         KEY_F3,         KEY_F4,         KEY_F5,   /* 0x40 */  KEY_F6,         KEY_F7,         KEY_F8,         KEY_F9,   /* 0x44 */  KEY_F10,        KEY_NUMLOCK,    KEY_PAUSE,      KEY_HOME,   /* 0x48 */  KEY_UP,         KEY_PGUP,       KEY_MINUS_PAD,  KEY_LEFT,   /* 0x4C */  KEY_5_PAD,      KEY_RIGHT,      KEY_PLUS_PAD,   KEY_END,   /* 0x50 */  KEY_DOWN,       KEY_PGDN,       KEY_INSERT,     KEY_DEL,   /* 0x54 */  KEY_PRTSCR,     0,              KEY_BACKSLASH2, KEY_F11,   /* 0x58 */  KEY_F12,        0,              0,              KEY_LWIN,   /* 0x5C */  KEY_RWIN,       KEY_MENU,       0,              0,   /* 0x60 */  0,              0,              0,              0,   /* 0x64 */  0,              0,              0,              0,   /* 0x68 */  0,              0,              0,              0,   /* 0x6C */  0,              0,              0,              0,   /* 0x70 */  0,              0,              0,              0,   /* 0x74 */  0,              0,              0,              0,   /* 0x78 */  0,              0,              0,              0,   /* 0x7C */  0,              0,              0,              0};/* default mapping table for the US keyboard layout */static unsigned short standard_key_ascii_table[KEY_MAX] = {   /* start */       0,   /* alphabet */    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',   /* numbers */     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',   /* numpad */      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',   /* func keys */   0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,   /* misc chars */  27, '`', '-', '=', 8, 9, '[', ']', 13, ';', '\'', '\\', '\\', ',', '.', '/', ' ',   /* controls */    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,   /* numpad */      '/', '*', '-', '+', '.', 13,   /* modifiers */   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};/* capslock mapping table for the US keyboard layout */static unsigned short standard_key_capslock_table[KEY_MAX] = {   /* start */       0,   /* alphabet */    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',   /* numbers */     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',   /* numpad */      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',   /* func keys */   0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,   /* misc chars */  27, '`', '-', '=', 8, 9, '[', ']', 13, ';', '\'', '\\', '\\', ',', '.', '/', ' ',   /* controls */    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,   /* numpad */      '/', '*', '-', '+', '.', 13,   /* modifiers */   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};/* shifted mapping table for the US keyboard layout */static unsigned short standard_key_shift_table[KEY_MAX] = {   /* start */       0,   /* alphabet */    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',   /* numbers */     ')', '!', '@', '#', '$', '%', '^', '&', '*', '(',   /* numpad */      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',   /* func keys */   0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,   /* misc chars */  27, '~', '_', '+', 8, 9, '{', '}', 13, ':', '"', '|', '|', '<', '>', '?', ' ',   /* controls */    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,   /* numpad */      '/', '*', '-', '+', '.', 13,   /* modifiers */   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};/* ctrl+key mapping table for the US keyboard layout */static unsigned short standard_key_control_table[KEY_MAX] = {   /* start */       0,   /* alphabet */    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,   /* numbers */     2, 2, 2, 2, 2, 2, 2, 2, 2, 2,   /* numpad */      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',   /* func keys */   0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,   /* misc chars */  27, 2, 2, 2, 127, 127, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 2,   /* controls */    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,   /* numpad */      2, 2, 2, 2, 2, 10,   /* modifiers */   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};/* convert numeric pad scancodes into arrow codes */static unsigned char numlock_table[10] = {   KEY_INSERT, KEY_END,    KEY_DOWN,   KEY_PGDN,   KEY_LEFT,   KEY_5_PAD,  KEY_RIGHT,  KEY_HOME,   KEY_UP,     KEY_PGUP};/* kb_wait_for_write_ready: *  Wait for the keyboard controller to set the ready-for-write bit. */static __inline intkb_wait_for_write_ready (void){   int timeout = 4096;   while ((timeout > 0) && (inportb(0x64) & 2)) timeout--;   return (timeout > 0);}/* kb_wait_for_read_ready: *  Wait for the keyboard controller to set the ready-for-read bit. */static __inline intkb_wait_for_read_ready (void){   int timeout = 16384;   while ((timeout > 0) && (!(inportb(0x64) & 1))) timeout--;   return (timeout > 0);}/* kb_send_data: *  Sends a byte to the keyboard controller. Returns 1 if all OK. */static __inline intkb_send_data (unsigned char data){   int resends = 4;   int timeout, temp;   do {      if (!kb_wait_for_write_ready())         return 0;      outportb(0x60, data);      timeout = 4096;      while (--timeout > 0) {         if (!kb_wait_for_read_ready())            return 0;         temp = inportb(0x60);         if (temp == 0xFA)            return 1;         if (temp == 0xFE)            break;      }   } while ((resends-- > 0) && (timeout > 0));   return 0;}static voidupdate_leds (int leds){   if (leds_ok) {      if (!in_a_terrupt)         DISABLE();      if (!kb_send_data(0xED)) {         kb_send_data(0xF4);         leds_ok = FALSE;      } else if (!kb_send_data((leds >> 8) & 7)) {         kb_send_data(0xF4);         leds_ok = FALSE;      }      if (!in_a_terrupt)         ENABLE();   }} ENDOFUNC(update_leds)static voidinject_key (int scancode){   unsigned short *table;   if ((scancode >= KEY_0_PAD) && (scancode <= KEY_9_PAD)) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -