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。