1 鼠标解读(1)(harib05a)

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

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

这次HariMain的修改部分

  1. unsigned char mouse_dbuf[3], mouse_phase;
  2. enable_mouse();
  3. mouse_phase = 0; /* 进入到等待鼠标的0xfa的状态 */
  4. for (;;) {
  5. io_cli();
  6. if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == 0) {
  7. io_stihlt();
  8. } else {
  9. if (fifo8_status(&keyfifo) != 0) {
  10. i = fifo8_get(&keyfifo);
  11. io_sti();
  12. sprintf(s, "%02X", i);
  13. boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31);
  14. putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s);
  15. } else if (fifo8_status(&mousefifo) != 0) {
  16. i = fifo8_get(&mousefifo);
  17. io_sti();
  18. if (mouse_phase == 0) {
  19. /* 等待鼠标的0xfa的状态 */
  20. if (i == 0xfa) {
  21. mouse_phase = 1;
  22. }
  23. } else if (mouse_phase == 1) {
  24. /* 等待鼠标的第一字节 */
  25. mouse_dbuf[0] = i;
  26. mouse_phase = 2;
  27. } else if (mouse_phase == 2) {
  28. /* 等待鼠标的第二字节 */
  29. mouse_dbuf[1] = i;
  30. mouse_phase = 3;
  31. } else if (mouse_phase == 3) {
  32. /* 等待鼠标的第三字节 */
  33. mouse_dbuf[2] = i;
  34. mouse_phase = 1;
  35. /* 鼠标的3个字节都齐了,显示出来 */
  36. sprintf(s, "%02X %02X %02X", mouse_dbuf[0], mouse_dbuf[1], mouse_dbuf[2]);
  37. boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 8 * 8 - 1, 31);
  38. putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s);
  39. }
  40. }
  41. }
  42. }

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

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

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

  1. if (mouse_phase == 0) {
  2. 各种处理;
  3. } else if (mouse_phase == 1) {
  4. 各种处理;
  5. } else if (mouse_phase == 2) {
  6. 各种处理;
  7. } else if (mouse_phase == 3) {
  8. 各种处理;
  9. }

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

■■■■■

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

1 鼠标解读(1)(harib05a) - 图1

显示出3个字节

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

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

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