4 移动鼠标指针(harib05d)

鼠标的解读部分已经完成了,我们再改一改图形显示部分,让鼠标指针在屏幕上动起来。

HariMain节选

} else if (fifo8_status(&mousefifo) ! = 0) {
    i = fifo8_get(&mousefifo);
    io_sti();
    if (mouse_decode(&mdec, i) ! = 0) {
        /* 数据的3个字节都齐了,显示出来  */
        sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);
        if ((mdec.btn & 0x01) ! = 0) {
            s[1] = 'L';
        }
        if ((mdec.btn & 0x02) ! = 0) {
            s[3] = 'R';
        }
        if ((mdec.btn & 0x04) ! = 0) {
            s[2] = 'C';
        }
        boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 15 * 8-1, 31);
        putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s);
        /* 鼠标指针的移动 */
        boxfill8(binfo->vram, binfo->scrnx, COL8_008484, mx, my, mx + 15, my + 15); /* 隐藏鼠标 */
        mx += mdec.x;
        my += mdec.y;
        if (mx < 0) {
            mx = 0;
        }
        if (my < 0) {
            my = 0;
        }
        if (mx > binfo->scrnx -16) {
            mx = binfo->scrnx -16;
        }
        if (my > binfo->scrny -16) {
            my = binfo->scrny -16;
        }
        sprintf(s, "(%3d, %3d)", mx, my);
        boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 0, 79, 15); /* 隐藏坐标  */
        putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, s); /* 显示坐标 */
        putblock8_8(binfo->vram, binfo->scrnx, 16, 16, mx, my, mcursor, 16); /* 描画鼠标 */
    }
 }

这次修改的程序,到/* 鼠标指针的移动 */之前为止,与以前相同,不再解释大家应该也明白。

■■■■■

至于其以后的部分,则是先隐藏掉鼠标指针,然后在鼠标指针的坐标上,加上解读得到的位移量。“mx += mdec.x; ”是“mx = mx + mdec.x; ”的省略形式。因为不能让鼠标指针跑到屏幕外面去,所以进行了调整,调整后重新显示鼠标坐标,鼠标指针也会重新描画。

好了,我们来测试一下,运行“make run”。然后晃一晃鼠标,结果如下:

鼠标指针总算动起来了!经过长期的艰苦奋战,终于胜利了。为了让鼠标指针能动起来,我们从第5天的下午就开始准备,到第8天下午才完成。

但也正是因为经过这番苦战,我们既完成了GDT/IDT/PIC的初始化,又学会了自由使用栈和FIFO缓冲区,还学会了处理键盘中断。接下来就会轻松很多。

心里实在很高兴,于是多动了几下鼠标。嗯?

只要鼠标一接触到装饰在屏幕下部的任务栏,就会变成下页图那样。这是因为我们没有考虑到叠加处理,所以画面就出问题了。这个话题留到以后再说,今天剩下的时间,笔者想解说一下asmhead.nas。