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

📄 keyhelp.c

📁 操作系统试验!通过这个试验
💻 C
字号:
/** * The 15-410 reference kernel. * * @author Steve Muckle <smuckle@andrew.cmu.edu> * * Edited by zra for the 2003-2004 season. * * Functions for turning keyboard scancodes * into chars. *//*@{*/#include <keyhelp.h>#define SHIFT_KEY_ON       0x01#define CAPS_LOCK_ON       0x02#define CONTROL_KEY_ON     0x04#define ALT_KEY_ON         0x08#define EXTENDED_KEY_PRESS 0x10/** *  key_state flags: *  Bit 1: Shift key. *  Bit 2: Caps lock on. *  Bit 3: Control key. *  Bit 4: Alt key. *  Bit 5: Extended key press (0xE0 extension). */static int key_state = 0;/** * Queries status of shift key. * * @return 1 if shift is down. 0 o/w. */__inline int shift() {  if (SHIFT_KEY_ON & key_state) return 1;  else return 0;}/** * Queries status of caps lock. * * @return 1 if caps lock is on. 0 o/w. */__inline int caps_lock() {  if (CAPS_LOCK_ON & key_state) return 1;  else return 0;}/** * This function performs the mapping * from simple scancodes to chars. * * @param scancode a simple scancode. * * @return the corresponding character. */int scan_to_ascii(int scancode) {  if (scancode == 0xE1)     /* Pause key. */    return '?';      switch(scancode) {  case 0x1:    /* Escape key. */    return 0x1B;  case 0x2:    /* 1 or ! */    if(shift()) return '!';    else return '1';  case 0x3:    /* 2 or @ */    if (shift()) return '@';    else return '2';  case 0x4:    /* 3 or # */    if (shift()) return '#';    else return '3';  case 0x5:    /* 4 or $ */    if (shift()) return '$';    else return '4';  case 0x6:    /* 5 or % */    if (shift()) return '%';    else return '5';  case 0x7:    /* 6 or ^ */    if (shift()) return '^';    else return '6';  case 0x8:    /* 7 or & */    if (shift()) return '&';    else return '7';  case 0x9:    /* 8 or * */    if (shift()) return '*';    else return '8';  case 0xA:    /* 9 or ( */    if (shift()) return '(';    else return '9';  case 0xB:    /* 0 or ) */    if (shift()) return ')';    else return '0';  case 0xC:    /* - or _ */    if (shift()) return '_';    else return '-';  case 0xD:    /* = or + */    if (shift()) return '+';    else return '=';  case 0xE:    /* Backspace key. */    return 0x8;  case 0xF:    /* Tab key. */    return '\t';  case 0x10:    /* q or Q. */    if (shift() || caps_lock()) return 'Q';    else return 'q';  case 0x11:    /* w or W. */    if (shift() || caps_lock()) return 'W';    else return 'w';  case 0x12:    /* e or E. */    if (shift() || caps_lock()) return 'E';    else return 'e';  case 0x13:    /* r or R. */    if (shift() || caps_lock()) return 'R';    else return 'r';  case 0x14:    /* t or T. */    if (shift() || caps_lock()) return 'T';    else return 't';  case 0x15:    /* y or Y. */    if (shift() || caps_lock()) return 'Y';    else return 'y';  case 0x16:    /* u or U. */    if (shift() || caps_lock()) return 'U';    else return 'u';  case 0x17:    /* i or I. */    if (shift() || caps_lock()) return 'I';    else return 'i';  case 0x18:    /* o or O. */    if (shift() || caps_lock()) return 'O';    else return 'o';  case 0x19:    /* p or P. */    if (shift() || caps_lock()) return 'P';    else return 'p';  case 0x1A:    /* [ or {. */    if (shift()) return '{';    else return '[';  case 0x1B:    /* ] or }. */    if (shift()) return '}';    else return ']';  case 0x1C:    /* Enter key. */    return '\n';  case 0x1D:    /* Left control key, should not be processed       in here. */    return '?';  case 0x1E:    /* a or A. */    if (shift() || caps_lock()) return 'A';    else return 'a';  case 0x1F:    /* s or S. */    if (shift() || caps_lock()) return 'S';    else return 's';  case 0x20:    /* d or D. */    if (shift() || caps_lock()) return 'D';    else return 'd';  case 0x21:    /* f or F. */    if (shift() || caps_lock()) return 'F';    else return 'f';  case 0x22:    /* g or G. */    if (shift() || caps_lock()) return 'G';    else return 'g';  case 0x23:    /* h or H. */    if (shift() || caps_lock()) return 'H';    else return 'h';  case 0x24:    /* j or J. */    if (shift() || caps_lock()) return 'J';    else return 'j';  case 0x25:    /* k or K. */    if (shift() || caps_lock()) return 'K';    else return 'k';  case 0x26:    /* l or L. */    if (shift() || caps_lock()) return 'L';    else return 'l';  case 0x28:    /* ; or :. */    if (shift()) return ':';    else return ';';  case 0x29:    /* ' or " */    if (shift()) return '\'';    else return '~';  case 0x2A:    /* Left shift key, should not be processed in here. */    return '?';  case 0x2B:    /* \ or |. */    if (shift()) return '|';    else return '\\';  case 0x2C:    /* z or Z. */     if (shift() || caps_lock()) return 'Z';    else return 'z';  case 0x2D:    /* x or X. */    if (shift() || caps_lock()) return 'X';    else return 'x';  case 0x2E:    /* c or C. */    if (shift() || caps_lock()) return 'C';    else return 'c';  case 0x2F:    /* v or V. */    if (shift() || caps_lock()) return 'V';    else return 'v';  case 0x30:    /* b or B. */    if (shift() || caps_lock()) return 'B';    else return 'b';  case 0x31:    /* n or N. */    if (shift() || caps_lock()) return 'N';    else return 'n';  case 0x32:    /* m or M. */    if (shift() || caps_lock()) return 'M';    else return 'm';  case 0x33:    /* , or <. */    if (shift()) return '<';    else return ',';  case 0x34:    /* . or >. */    if (shift()) return '>';    else return '.';  case 0x35:    /* / or ? */    if (shift()) return '?';    else return '/';  case 0x36:    /* Right shift key, should not be processed in here. */    return '?';  case 0x37:    /* Print screen key. */    return '?';  case 0x38:    /* Left alt key, should not be processed in here. */    return '?';  case 0x39:    /* Space bar. */    return ' ';  case 0x3A:    /* Caps lock, should not be processed in here. */    return '?';  case 0x3B:    /* F1 key. */    return '?';  case 0x3C:    /* F2 key. */    return '?';  case 0x3D:    /* F3 key. */    return '?';  case 0x3E:    /* F4 key. */    return '?';    case 0x3F:    /* F5 key. */    return '?';  case 0x40:    /* F6 key. */    return '?';    case 0x41:    /* F7 key. */    return '?';  case 0x42:    /* F8 key. */    return '?';  case 0x43:    /* F9 key. */    return '?';  case 0x44:    /* F10 key. */    return '?';  case 0x48:    /* UP */    return CUR_UP;  case 0x4b:    /* LEFT */    return CUR_LEFT;  case 0x4d:    /* RIGHT */    return CUR_RIGHT;  case 0x50:    /* DOWN */    return CUR_DOWN;  case 0x57:    /* F11 key. */    return '?';  case 0x58:    /* F12 key. */    return '?';  default:    return '?';  }  return '?';}/** * Processes some special scancodes for * Control and Alt. * * @param keypress the extended scancode. * @param 0 if released. non-zero if pressed. * * @return -1 if we recognized the press. *         '?' otherwise. */int extended_scan_to_ascii(int keypress, int pressed) {  key_state &= ~EXTENDED_KEY_PRESS;  if (keypress == 0x1D) {    /* Right control key. */    if (pressed) key_state |= CONTROL_KEY_ON;    else key_state &= ~CONTROL_KEY_ON;    return -1;  } else if (keypress == 0x38) {    /* Right alt key. */    if (pressed) key_state |= ALT_KEY_ON;    else key_state &= ~ALT_KEY_ON;    return -1;  }  if (!pressed) return -1;  return '?';}/** * Converts keyboard scan codes into ascii chars * by calling scan_to_ascii and extended_scan_to_ascii. * Keeps track of shift, caps lock etc. * * @param keypress the scancode. * * @return the corresponding character. */int process_scancode(int keypress) {  int pressed = !(keypress & 0x80);  keypress &= 0x7F;    if (key_state & EXTENDED_KEY_PRESS)    return extended_scan_to_ascii(keypress, pressed);  if (keypress == 0x36 || keypress == 0x2A) {    /* Shift key. */    if (pressed)      key_state |= SHIFT_KEY_ON;    else      key_state &= ~SHIFT_KEY_ON;    return -1;  } else if (keypress == 0x1D) {    /* Left control key. */    if (pressed) key_state |= CONTROL_KEY_ON;    else key_state &= ~CONTROL_KEY_ON;    return -1;  } else if (keypress == 0x38) {    /* Left alt key. */    if (pressed) key_state |= ALT_KEY_ON;    else key_state &= ~ALT_KEY_ON;    return -1;  } else if (keypress == 0x3A) {    /* Caps lock. */    if (pressed) {      if (key_state & CAPS_LOCK_ON)	key_state &= ~CAPS_LOCK_ON;      else key_state |= CAPS_LOCK_ON;    }    return -1;  } else if (keypress == 0xE0) {    /* Extended key code. Set extended marker. */    key_state |= EXTENDED_KEY_PRESS;    return -1;  } else {    /* It's just a normal key. If it's a release,       we don't care about it. */    if (!pressed) return -1;    else return scan_to_ascii(keypress);  }     /* Should never be here! */  return -1;}/*@}*/

⌨️ 快捷键说明

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