2 稍事整理(harib05b)

HariMain有点乱,我们来整理一下。

修改后的bootpack.c节选

  1. struct MOUSE_DEC {
  2. unsigned char buf[3], phase;
  3. };
  4. void enable_mouse(struct MOUSE_DEC *mdec);
  5. int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat);
  6. void HariMain(void)
  7. {
  8. (中略)
  9. struct MOUSE_DEC mdec;
  10. (中略)
  11. enable_mouse(&mdec);
  12. for (;;) {
  13. io_cli();
  14. if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == 0) {
  15. io_stihlt();
  16. } else {
  17. if (fifo8_status(&keyfifo) != 0) {
  18. i = fifo8_get(&keyfifo);
  19. io_sti();
  20. sprintf(s, "%02X", i);
  21. boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31);
  22. putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s);
  23. } else if (fifo8_status(&mousefifo) != 0) {
  24. i = fifo8_get(&mousefifo);
  25. io_sti();
  26. if (mouse_decode(&mdec, i) != 0) {
  27. /* 3字节都凑齐了,所以把它们显示出来*/
  28. sprintf(s, "%02X %02X %02X", mdec.buf[0], mdec.buf[1], mdec.buf[2]);
  29. boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 8 * 8 - 1, 31);
  30. putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s);
  31. }
  32. }
  33. }
  34. }
  35. }
  36. void enable_mouse(struct MOUSE_DEC *mdec)
  37. {
  38. /* 鼠标有效 */
  39. wait_KBC_sendready();
  40. io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE);
  41. wait_KBC_sendready();
  42. io_out8(PORT_KEYDAT, MOUSECMD_ENABLE);
  43. /* 顺利的话,ACK(0xfa)会被送过来 */
  44. mdec->phase = 0; /* 等待0xfa的阶段 */
  45. return;
  46. }
  47. int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat)
  48. {
  49. if (mdec->phase == 0) {
  50. /* 等待鼠标的0xfa的阶段 */
  51. if (dat == 0xfa) {
  52. mdec->phase = 1;
  53. }
  54. return 0;
  55. }
  56. if (mdec->phase == 1) {
  57. /* 等待鼠标第一字节的阶段 */
  58. mdec->buf[0] = dat;
  59. mdec->phase = 2;
  60. return 0;
  61. }
  62. if (mdec->phase == 2) {
  63. /* 等待鼠标第二字节的阶段 */
  64. mdec->buf[1] = dat;
  65. mdec->phase = 3;
  66. return 0;
  67. }
  68. if (mdec->phase == 3) {
  69. /* 等待鼠标第二字节的阶段 */
  70. mdec->buf[2] = dat;
  71. mdec->phase = 1;
  72. return 1;
  73. }
  74. return -1; /* 应该不可能到这里来 */
  75. }

上面几乎没有任何新东西。我们创建了一个结构体MOUSE_DEC。DEC是decode的缩写。我们创建这个结构体,是想把解读鼠标所需要的变量都归总到一块儿。

在函数enable_mouse的最后,笔者附加了将phase归零的处理。之所以要舍去读到的0xfa,是因为鼠标已经激活了。因此我们进行归零处理也不错。

我们将鼠标的解读从函数HariMain的接收信息处理中剥离出来,放到了mouse_decode函数里, Harimain又回到了清晰的状态。3个字节凑齐后,mouse_decode函数执行“return 1;”,把这些数据显示出来。

测试一下,运行“make run”,没有问题,能正常运行。太好了!