在通过鼠标中断获取到鼠标数据后,想到的第一件事情应该是怎么去解析它。最终通过解析的数据实现鼠标指针的移动
经过调查,我们知道一下两点:
鼠标正确的数据从 0xfa 开始
鼠标数据是每3个一组循环
代码实现
unsigned char mouse_dbuf[3];
unsigned char mouse_phase = 0;
fifo8_init(&mousefifo, 128, mousebuf);
init_keyboard();
enable_mouse();
static int count = 0;
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);
putfont8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s);
} else if(fifo8_status(&mousefifo) != 0){
count++;
i = fifo8_get(&mousefifo);
io_sti();
if(mouse_phase == 0){
if(i == 0xfa){ //开始解析鼠标的数据
mouse_phase = 1;
}
} else if(mouse_phase == 1) {
//等待鼠标的第一个字节
mouse_dbuf[0] = i;
mouse_phase = 2;
} else if(mouse_phase == 2) {
//等待鼠标的第二个字节
mouse_dbuf[1] = i;
mouse_phase = 3;
} else if(mouse_phase == 3) {
//等待鼠标的第三个字节
mouse_dbuf[2] = i;
mouse_phase = 1;
}
sprintf(s, "%02x %02x %02x %d", mouse_dbuf[0], mouse_dbuf[1], mouse_dbuf[2], count);
boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 12 * 8 - 1, 31);
putfont8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s);
}
}
}
运行效果
遇到的问题
fifo8_init(&mousefifo, 128, mousebuf);
//键盘fifo的初始化,一定要在启用鼠标之前。否则解析数据出错
init_keyboard();
enable_mouse();