文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>lab1:kern/console.c: kbd_proc_data

lab1:kern/console.c: kbd_proc_data

时间:2009-02-27  来源:朝花夕拾

    */

        if (data == 0xE0) {
                // E0 escape character,扩展按键,扫描码为2字节;E0后面还跟有一个字节值

                shift |= E0ESC;
                return 0;
        } else if (data & 0x80) {    
                // Key released,除去E0,最高位为1(+0x80)的,应该是键释放的扫描码

         // 如果该扫描码是E0 escape的,那么保持值不变;否则清除最高位的1,其值

         // 变为建按下是的码值。这么做的目的就是为了处理左右ctrl,alt和shift键,

         // 即在建释放时清除其shiftcode值,因为它们的shiftcode值会影响其他字符

         // 的解析

                data = (shift & E0ESC ? data : data & 0x7F);
                shift &= ~(shiftcode[data] | E0ESC);    // 清除之前的shiftcode,表示

                                // 释放了ctrl,alt或者shift

                                // 如果该扫描码是E0 escape的

                                // 清除E0 escape标记

                return 0;
        } else if (shift & E0ESC) {
                 // Last character was an E0 escape; or with 0x80

         // 上一个字节值为E0,那么该字节应该是键被按下时扫描码的第二字节,

         // 让其与上0x80,用以后面处理时区分单字节扫描码

                data |= 0x80;
                shift &= ~E0ESC;    // 清除E0 escape

        }

        shift |= shiftcode[data];    // 键被按下时,置ctrl,alt和shift键被按下的状态

        shift ^= togglecode[data];    // CAPSLOCK,NUMLOCK,SCROLLLOCK这三个键没按一次,

                    // 它们的状态就改变(0,1变化),这里用异或巧妙的实现

                    // 它们的状态也会影响后面按键字符的解析


     // static uint8_t *charcode[4] = {normalmap,shiftmap,ctlmap,ctlmap};

     // CTL = 1 (01); SHIFT = 2 (10). CTL | SHIFT = 3 (11)

     // CTL和SHIFT二者组合值为0~3, 对应charcode里面的四个不同字符值map

        c = charcode[shift & (CTL | SHIFT)][data];
        if (shift & CAPSLOCK) {    // CAPSLOCK 影响字母字符解析

                if ('a' <= c && c <= 'z')    // 小写->大写

                        c += 'A' - 'a';
                else if ('A' <= c && c <= 'Z')    // 大写(shift键按下时)->小写

                        c += 'a' - 'A';
        }

        // Process special keys

        // Ctrl-Alt-Del: reboot

        if (!(~shift & (CTL | ALT)) && c == KEY_DEL) {
                cprintf("Rebooting!\n");
                outb(0x92, 0x3); // courtesy of Chris Frost

        // PS/2 POS, 0092: bit 1 = 1 indicates A20 active

        // bit 0 = 0 system reset or write

        //      1 pulse alternate reset pin (alternate CPU reset)

        }
        return c;
}

相关阅读 更多 +
排行榜 更多 +
爱是小事最新版

爱是小事最新版

休闲益智 下载
悬案2刹那惊颤游戏

悬案2刹那惊颤游戏

冒险解谜 下载
几何飞行内购修改版

几何飞行内购修改版

飞行射击 下载