📄 keyboard.c
字号:
/** Snixos Project version 1.0, 2003.6* (C) Copyright 2003,2004,2005 Jockeyson,KeqiangGao <Snallie@tom.com>* All Rights Reserved.* Distributed under the terms of the GNU General Public License.** This program is a free and open source software and you can redistribute * it and/or modify it under the terms of the GNU General Public License as* published by the Free Software Foundation. As no any liability is assumed * for any incidental or consequential damages in connection with the * information or program fragments contained herein,so any exception arised* is at your own risk. It is ABSOLUTELY WITHOUT ANY WARRANTY.* Bug report please send to Snallie@tom.com .*//* keyboard.c: keyboard interrupt handler in C Author : snallie@tom.com Time : 2004.3 $Id: keyboard.c,v 1.3 2004/06/11 22:42:56 root Exp root $ built : $Date: 2004/06/11 22:42:56 $ $Revision: 1.3 $*/#include "keyboard.h"#include "io.h"#include "stdio.h"#include "keybd.h"/*keyBdHandle() read keyboard and store scancode and ascii code to keyboard queue, lit up keyboard LEDS when capsLock,numLock,scrollLock alternated ,etc...*/void keyBdHandle(){ unsigned char scanCode; scanCode = inb(KBDATAPORT); switch (scanCode) { /* function and control key */ case 1: printf("<Esc>"); goto bye; break; case 59: printf("<F1>"); goto bye; break; case 60: printf("<F2>"); goto bye; break; case 61: printf("<F3>"); goto bye; break; case 62: printf("<F4>"); goto bye; break; case 63: printf("<F5>"); goto bye; break; case 64: printf("<F6>"); goto bye; break; case 65: printf("<F7>"); goto bye; break; case 66: printf("<F8>"); goto bye; break; case 67: printf("<F9>"); goto bye; break; case 68: printf("<F10>"); goto bye; break; case 87: printf("<F11>"); goto bye; break; case 88: printf("<F12>"); goto bye; break; case 0x2a: /* left shift pressed */ ks.LeftShift = PRESSED; goto bye; break; case 0x36: /* right shift pressed */ ks.RightShift = PRESSED; goto bye; break; case 0xaa: /* left shift released */ ks.LeftShift = RELEASED; goto bye; break; case 0xb6: /* right shift released */ ks.RightShift = RELEASED; goto bye; break; case 0x1d: /* left Ctrl pressed */ ks.LeftCtrl = PRESSED; goto bye; break; case 0x9d: /* left ctrl released */ ks.LeftCtrl = RELEASED; goto bye; break; case 0x38: /* left Alt pressed */ ks.LeftAlt = PRESSED; goto bye; break; case 0xb8: /* Left Alt released */ ks.LeftAlt = RELEASED; goto bye; break; case 58: /* alternate CapsLock bit */ kbdLEDS = kbdLEDS ^ 4; kbdLedOnOff(kbdLEDS); ks.CapsLock = (ks.CapsLock + 1) % 2; goto bye; break; case 69: /* alternate NumLock bit */ kbdLEDS = kbdLEDS ^ 2; kbdLedOnOff(kbdLEDS); ks.NumLock = (ks.NumLock + 1) % 2; goto bye; break; case 70: /* alternate ScrollLock bit */ kbdLEDS = kbdLEDS ^ 1; kbdLedOnOff(kbdLEDS); ks.ScrollLock = (ks.ScrollLock + 1) % 2; goto bye; break; case 0xe0: /* extended scanCode */ ks.ScanExtE0 = 1; goto bye; break; } if (ks.ScanExtE0 == 1) { /* e0 1c e0 9c */ switch (scanCode) { case 0x1d: /* RightCtrl pressed */ ks.RightCtrl = PRESSED; break; case 0x9d: /* RightCtrl released */ ks.RightCtrl = RELEASED; break; case 0x38: /* RightAlt pressed */ ks.RightAlt = PRESSED; break; case 0xb8: /* RightAlt released */ ks.RightAlt = RELEASED; break; case 0x1c: /* Enter on keypad */ ks.ScanExtE0 = 0; goto sendToBuffer; break; case 0x35: /* / on keypad */ goto sendToBuffer; break; case 82: /* Insert */ case 83: /* Delete */ case 71: /* Home */ case 79: /* End */ case 73: /* PageUp */ case 81: /* PageDown */ case 72: /* Up */ case 75: /* Left */ case 80: /* Down */ case 77: /* Right */ ks.ScanExtE0 = 0; goto sendToBuffer; break; } ks.ScanExtE0 = 0; goto bye; } if ((ks.NumLock != LOCKED)) { switch (scanCode) { case 82: printf("<Insert>"); goto bye; break; case 83: printf("<Delete>"); goto bye; break; case 71: printf("<Home>"); goto bye; break; case 79: printf("<End>"); goto bye; break; case 73: printf("<PageUp>"); goto bye; break; case 81: printf("<PageDown>"); goto bye; break; case 72: printf("<Up>"); goto bye; break; case 75: printf("<Left>"); goto bye; break; case 80: printf("<Down>"); goto bye; break; case 77: printf("<Right>"); goto bye; break; } } if ((ks.NumLock == LOCKED) && (ks.ScanExtE0 == 0)) { /* enable keypad */ switch (scanCode) { case 71: /*ch='7'; */ scanCode = 8; break; case 72: /*ch='8'; */ scanCode = 9; break; case 73: /*ch='9'; */ scanCode = 10; break; case 75: /*ch='4'; */ scanCode = 5; break; case 76: /*ch='5'; */ scanCode = 6; break; case 77: /*ch='6'; */ scanCode = 7; break; case 79: /*ch='1'; */ scanCode = 2; break; case 80: /*ch='2'; */ scanCode = 3; break; case 81: /*ch='3'; */ scanCode = 4; break; case 82: /*ch='0'; */ scanCode = 11; break; case 83: /*ch='.'; */ scanCode = 0x34; break; } } else { /* disable keypad */ switch (scanCode) { case 82: printf("<Insert>"); goto bye; break; case 83: printf("<Delete>"); goto bye; break; case 71: printf("<Home>"); goto bye; break; case 79: printf("<End>"); goto bye; break; case 73: printf("<PageUp>"); goto bye; break; case 81: printf("<PageDown>"); goto bye; break; case 72: printf("<Up>"); goto bye; break; case 75: printf("<Left>"); goto bye; break; case 80: printf("<Down>"); goto bye; break; case 77: printf("<Right>"); goto bye; break; } } sendToBuffer: if (scanCode >= 0x80) /* released or pressed (bit7=0 means pressed) */ goto bye; if ((keyTail + 1) % KBSIZE == keyHead) { printf("keyboard buffer full\n"); goto bye; } keybdTail->scan = scanCode; keybdTail->ascii = (ks.LeftShift == PRESSED || ks.RightShift == PRESSED || ks.CapsLock == LOCKED) ? shiftMap[scanCode] : ascTab[scanCode]; moveTail(); bye: /* send reset signal to keyboard */ scanCode = inb(KBCTRLPORT); scanCode || 0x80; outb(scanCode, KBCTRLPORT); scanCode = inb(KBCTRLPORT); scanCode && 0x7f; outb(scanCode, KBCTRLPORT); /* send EOI to 8259 */ outb(0x20, 0x20); /* EOI , without this keyborad may hang up! */}static void moveHead(){ keyHead = (keyHead + 1) % KBSIZE;}static void moveTail(){ keyTail = (keyTail + 1) % KBSIZE;}/* if keyborad buffer emtpy then return 1, else return 0 */int keyEmpty(){ return ((keyHead % KBSIZE) == keyTail ? 1 : 0);}/* return ascii key */char getKey(){ char a; while (1) { if (!keyEmpty()) break; } a = keybdHead->ascii; moveHead(); return a;}/* return scan key */char getScan(){ char a; while (1) { if (!keyEmpty()) break; } a = keybdHead->scan; moveHead(); return a;}/* return both ascii and scan key */void readKeybd(char *ascii, char *scan){ while (1) { if (!keyEmpty()) break; } *ascii = keybdHead->ascii; *scan = keybdHead->scan; moveHead();}/* return 1 pressed, return 0 released */int getLeftCtrl(){ return ks.LeftCtrl;}/* port 60h b0 is ScrollLock, b1 is NumLock, b2 is CapsLock */void kbdLedOnOff(unsigned char i){ unsigned int a = 0; outb(0xed, 0x60); while (a < 0xfffff) a++; /* delay */ outb(i & 7, 0x60);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -