30天自制操作系统
上QQ阅读APP看书,第一时间看更新

第8天 鼠标控制与32位模式切换

1 鼠标解读(1)(harib05a)

好,现在我们已经能从鼠标取得数据了。紧接着的问题是要解读这些数据,调查鼠标是怎么移动的,然后结合鼠标的动作,让鼠标指针相应地动起来。这说起来简单,但做起来呢……事实上编起程序来,也很简单。(笑)

我们要先来对bootpack.c的HariMain函数进行一些修改。

这次HariMain的修改部分

unsigned char mouse_dbuf[3], mouse_phase;

enable_mouse();
mouse_phase = 0; /* 进入到等待鼠标的0xfa的状态 */

for (; ; ) {
    io_cli();
    if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == 0) {
        io_stihlt();
    } else {
        if (fifo8_status(&keyfifo) ! = 0) {
            i = fifo8_get(&keyfifo);
            io_sti();

            sprintf(s, "%02X", i);
            boxfill8(binfo->vram, binfo->scrnx, COL8_008484,  0, 16, 15, 31);
            putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s);
        } else if (fifo8_status(&mousefifo) ! = 0) {
            i = fifo8_get(&mousefifo);
            io_sti();
            if (mouse_phase == 0) {
                /* 等待鼠标的0xfa的状态 */
                if (i == 0xfa) {
                    mouse_phase = 1;
                }
            } else if (mouse_phase == 1) {
                /* 等待鼠标的第一字节 */
                mouse_dbuf[0] = i;
                mouse_phase = 2;
            } else if (mouse_phase == 2) {
                /* 等待鼠标的第二字节 */
                mouse_dbuf[1] = i;
                mouse_phase = 3;
            } else if (mouse_phase == 3) {
                /* 等待鼠标的第三字节 */
                mouse_dbuf[2] = i;
                mouse_phase = 1;
                /* 鼠标的3个字节都齐了,显示出来 */
                sprintf(s, "%02X %02X %02X", mouse_dbuf[0], mouse_dbuf[1], mouse_dbuf[2]);
                boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 8 * 8-1, 31);
                putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s);
            }
        }
    }
}

这段程序要做什么事情呢?首先要把最初读到的0xfa舍弃掉。之后,每次从鼠标那里送过来的数据都应该是3个字节一组的,所以每当数据累积到3个字节,就把它显示在屏幕上。

变量mouse_phase用来记住接收鼠标数据的工作进展到了什么阶段(phase)。接收到的数据放在mouse_dbuf[0~2]内。

其他地方没有什么难点。不过为了让大家看得更清楚,还是在这里写一下。

if (mouse_phase == 0) {
    各种处理;
} else if (mouse_phase == 1) {
    各种处理;
} else if (mouse_phase == 2) {
    各种处理;
} else if (mouse_phase == 3) {
    各种处理;
}

对于不同的mouse_phase值,相应地做各种不同的处理。

■■■■■

我们赶紧运行一下试试看吧。“make run”,然后点击鼠标或者是滚动鼠标,可以看到各种反应。

屏幕上会出现类似于“08 12 34”之类的3字节数字。如果移动鼠标,这个“08”部分(也就是mouse_dbuf[0])的“0”那一位,会在0~3的范围内变化。另外,如果只是移动鼠标,08部分的“8”那一位,不会有任何变化,只有当点击鼠标的时候它才会变化。不仅左击有反应,右击和点击中间滚轮时都会有反应。不管怎样点击鼠标,这个值会在8~F之间变化。

上述“12”部分(mouse_dbuf[1])与鼠标的左右移动有关系,“34”部分(mouse_dbuf[2])则与鼠标的上下移动有关系。

趁着这个机会,请大家仔细观察一下数字与鼠标动作的关系。我们要利用这些知识去解读这3个字节的数据。