4 移动鼠标指针(harib05d)

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

HariMain 节选

  1. } else if (fifo8_status(&mousefifo) != 0) {
  2. i = fifo8_get(&mousefifo);
  3. io_sti();
  4. if (mouse_decode(&mdec, i) != 0) {
  5. /* 数据的3个字节都齐了,显示出来 */
  6. sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);
  7. if ((mdec.btn & 0x01) != 0) {
  8. s[1] = 'L';
  9. }
  10. if ((mdec.btn & 0x02) != 0) {
  11. s[3] = 'R';
  12. }
  13. if ((mdec.btn & 0x04) != 0) {
  14. s[2] = 'C';
  15. }
  16. boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 15 * 8 - 1, 31);
  17. putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s);
  18. /* 鼠标指针的移动 */
  19. boxfill8(binfo->vram, binfo->scrnx, COL8_008484, mx, my, mx + 15, my + 15); /* 隐藏鼠标 */
  20. mx += mdec.x;
  21. my += mdec.y;
  22. if (mx < 0) {
  23. mx = 0;
  24. }
  25. if (my < 0) {
  26. my = 0;
  27. }
  28. if (mx > binfo->scrnx - 16) {
  29. mx = binfo->scrnx - 16;
  30. }
  31. if (my > binfo->scrny - 16) {
  32. my = binfo->scrny - 16;
  33. }
  34. sprintf(s, "(%3d, %3d)", mx, my);
  35. boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 0, 79, 15); /* 隐藏坐标 */
  36. putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, s); /* 显示坐标 */
  37. putblock8_8(binfo->vram, binfo->scrnx, 16, 16, mx, my, mcursor, 16); /* 描画鼠标 */
  38. }
  39. }

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

■■■■■

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

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

4 移动鼠标指针(harib05d) - 图1
动起来了! 太棒了!

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

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

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

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

4 移动鼠标指针(harib05d) - 图2

啊,糟糕!