📄 dcget.cc
字号:
/*
* Copyright (c) 1995-1994 The University of Utah and
* the Computer Systems Laboratory at the University of Utah (CSL).
* All rights reserved.
*
* Permission to use, copy, modify and distribute this software is hereby
* granted provided that (1) source code retains these copyright, permission,
* and disclaimer notices, and (2) redistributions including binaries
* reproduce the notices in supporting documentation, and (3) all advertising
* materials mentioning features or use of this software display the following
* acknowledgement: ``This product includes software developed by the
* Computer Systems Laboratory at the University of Utah.''
*
* THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS
* IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF
* ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* CSL requests users of this software to return to csl-dist@cs.utah.edu any
* improvements that they make and grant CSL redistribution rights.
*/
#include <flux/base_critical.h>
#include <flux/x86/pio.h>
#include <flux/x86/pc/direct_cons.h>
#include <flux/x86/pc/keyboard.h>
#define SHIFT -1
static char keymap[128][2] = {
{0}, /* 0 */
{27, 27}, /* 1 - ESC */
{'1', '!'}, /* 2 */
{'2', '@'},
{'3', '#'},
{'4', '$'},
{'5', '%'},
{'6', '^'},
{'7', '&'},
{'8', '*'},
{'9', '('},
{'0', ')'},
{'-', '_'},
{'=', '+'},
{8, 8}, /* 14 - Backspace */
{'\t', '\t'}, /* 15 */
{'q', 'Q'},
{'w', 'W'},
{'e', 'E'},
{'r', 'R'},
{'t', 'T'},
{'y', 'Y'},
{'u', 'U'},
{'i', 'I'},
{'o', 'O'},
{'p', 'P'},
{'[', '{'},
{']', '}'}, /* 27 */
{'\r', '\r'}, /* 28 - Enter */
{0, 0}, /* 29 - Ctrl */
{'a', 'A'}, /* 30 */
{'s', 'S'},
{'d', 'D'},
{'f', 'F'},
{'g', 'G'},
{'h', 'H'},
{'j', 'J'},
{'k', 'K'},
{'l', 'L'},
{';', ':'},
{'\'', '"'}, /* 40 */
{'`', '~'}, /* 41 */
{SHIFT, SHIFT}, /* 42 - Left Shift */
{'\\', '|'}, /* 43 */
{'z', 'Z'}, /* 44 */
{'x', 'X'},
{'c', 'C'},
{'v', 'V'},
{'b', 'B'},
{'n', 'N'},
{'m', 'M'},
{',', '<'},
{'.', '>'},
{'/', '?'}, /* 53 */
{SHIFT, SHIFT}, /* 54 - Right Shift */
{0, 0}, /* 55 - Print Screen */
{0, 0}, /* 56 - Alt */
{' ', ' '}, /* 57 - Space bar */
{0, 0}, /* 58 - Caps Lock */
{0, 0}, /* 59 - F1 */
{0, 0}, /* 60 - F2 */
{0, 0}, /* 61 - F3 */
{0, 0}, /* 62 - F4 */
{0, 0}, /* 63 - F5 */
{0, 0}, /* 64 - F6 */
{0, 0}, /* 65 - F7 */
{0, 0}, /* 66 - F8 */
{0, 0}, /* 67 - F9 */
{0, 0}, /* 68 - F10 */
{0, 0}, /* 69 - Num Lock */
{0, 0}, /* 70 - Scroll Lock */
{'7', '7'}, /* 71 - Numeric keypad 7 */
{'8', '8'}, /* 72 - Numeric keypad 8 */
{'9', '9'}, /* 73 - Numeric keypad 9 */
{'-', '-'}, /* 74 - Numeric keypad '-' */
{'4', '4'}, /* 75 - Numeric keypad 4 */
{'5', '5'}, /* 76 - Numeric keypad 5 */
{'6', '6'}, /* 77 - Numeric keypad 6 */
{'+', '+'}, /* 78 - Numeric keypad '+' */
{'1', '1'}, /* 79 - Numeric keypad 1 */
{'2', '2'}, /* 80 - Numeric keypad 2 */
{'3', '3'}, /* 81 - Numeric keypad 3 */
{'0', '0'}, /* 82 - Numeric keypad 0 */
{'.', '.'}, /* 83 - Numeric keypad '.' */
};
int
direct_cons_getchar(void)
{
static unsigned shift_state;
unsigned status, scan_code, ch;
base_critical_enter();
retry:
/* Wait until a scan code is ready and read it. */
do status = inb(0x64);
while ((status & K_OBUF_FUL) == 0);
scan_code = inb(0x60);
/* Handle key releases - only release of SHIFT is important. */
if (scan_code & 0x80) {
scan_code &= 0x7f;
if (keymap[scan_code][0] == SHIFT)
shift_state = 0;
goto retry;
}
/* Translate the character through the keymap. */
ch = keymap[scan_code][shift_state];
if (ch == SHIFT) {
shift_state = 1;
goto retry;
} else if (ch == 0)
goto retry;
base_critical_leave();
return ch;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -