2 稍事整理(harib05b)
HariMain有点乱,我们来整理一下。
修改后的bootpack.c节选
struct MOUSE_DEC { unsigned char buf[3], phase; }; void enable_mouse(struct MOUSE_DEC *mdec); int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat); void HariMain(void) { (中略) struct MOUSE_DEC mdec; (中略) enable_mouse(&mdec); for (; ; ) { io_cli(); if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == 0) { io_stihlt(); } else { if (fifo8_status(&keyfifo) ! = 0) { i = fifo8_get(&keyfifo); io_sti(); sprintf(s, "%02X", i); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s); } else if (fifo8_status(&mousefifo) ! = 0) { i = fifo8_get(&mousefifo); io_sti(); if (mouse_decode(&mdec, i) ! = 0) { /* 3字节都凑齐了,所以把它们显示出来*/ sprintf(s, "%02X %02X %02X", mdec.buf[0], mdec.buf[1], mdec.buf[2]); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 8 * 8-1, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s); } } } } } void enable_mouse(struct MOUSE_DEC *mdec) { /* 鼠标有效 */ wait_KBC_sendready(); io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE); wait_KBC_sendready(); io_out8(PORT_KEYDAT, MOUSECMD_ENABLE); /* 顺利的话,ACK(0xfa)会被送过来 */ mdec->phase = 0; /* 等待0xfa的阶段 */ return; } int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat) { if (mdec->phase == 0) { /* 等待鼠标的0xfa的阶段 */ if (dat == 0xfa) { mdec->phase = 1; } return 0; } if (mdec->phase == 1) { /* 等待鼠标第一字节的阶段 */ mdec->buf[0] = dat; mdec->phase = 2; return 0; } if (mdec->phase == 2) { /* 等待鼠标第二字节的阶段 */ mdec->buf[1] = dat; mdec->phase = 3; return 0; } if (mdec->phase == 3) { /* 等待鼠标第二字节的阶段 */ mdec->buf[2] = dat; mdec->phase = 1; return 1; } return -1; /* 应该不可能到这里来 */ }
上面几乎没有任何新东西。我们创建了一个结构体MOUSE_DEC。DEC是decode的缩写。我们创建这个结构体,是想把解读鼠标所需要的变量都归总到一块儿。
在函数enable_mouse的最后,笔者附加了将phase归零的处理。之所以要舍去读到的0xfa,是因为鼠标已经激活了。因此我们进行归零处理也不错。
我们将鼠标的解读从函数HariMain的接收信息处理中剥离出来,放到了mouse_decode函数里,Harimain又回到了清晰的状态。3个字节凑齐后,mouse_decode函数执行“return 1; ”,把这些数据显示出来。
测试一下,运行“make run”,没有问题,能正常运行。太好了!