📄 pc_keyb.c
字号:
/* * 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 + -