上QQ阅读APP看书,第一时间看更新
第8天 鼠标控制与32位模式切换
1 鼠标解读(1)(harib05a)
好,现在我们已经能从鼠标取得数据了。紧接着的问题是要解读这些数据,调查鼠标是怎么移动的,然后结合鼠标的动作,让鼠标指针相应地动起来。这说起来简单,但做起来呢……事实上编起程序来,也很简单。(笑)
我们要先来对bootpack.c的HariMain函数进行一些修改。
这次HariMain的修改部分
unsigned char mouse_dbuf[3], mouse_phase; enable_mouse(); mouse_phase = 0; /* 进入到等待鼠标的0xfa的状态 */ 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_phase == 0) { /* 等待鼠标的0xfa的状态 */ 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; /* 鼠标的3个字节都齐了,显示出来 */ sprintf(s, "%02X %02X %02X", mouse_dbuf[0], mouse_dbuf[1], mouse_dbuf[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); } } } }
这段程序要做什么事情呢?首先要把最初读到的0xfa舍弃掉。之后,每次从鼠标那里送过来的数据都应该是3个字节一组的,所以每当数据累积到3个字节,就把它显示在屏幕上。
变量mouse_phase用来记住接收鼠标数据的工作进展到了什么阶段(phase)。接收到的数据放在mouse_dbuf[0~2]内。
其他地方没有什么难点。不过为了让大家看得更清楚,还是在这里写一下。
if (mouse_phase == 0) { 各种处理; } else if (mouse_phase == 1) { 各种处理; } else if (mouse_phase == 2) { 各种处理; } else if (mouse_phase == 3) { 各种处理; }
对于不同的mouse_phase值,相应地做各种不同的处理。
■■■■■
我们赶紧运行一下试试看吧。“make run”,然后点击鼠标或者是滚动鼠标,可以看到各种反应。
屏幕上会出现类似于“08 12 34”之类的3字节数字。如果移动鼠标,这个“08”部分(也就是mouse_dbuf[0])的“0”那一位,会在0~3的范围内变化。另外,如果只是移动鼠标,08部分的“8”那一位,不会有任何变化,只有当点击鼠标的时候它才会变化。不仅左击有反应,右击和点击中间滚轮时都会有反应。不管怎样点击鼠标,这个值会在8~F之间变化。
上述“12”部分(mouse_dbuf[1])与鼠标的左右移动有关系,“34”部分(mouse_dbuf[2])则与鼠标的上下移动有关系。
趁着这个机会,请大家仔细观察一下数字与鼠标动作的关系。我们要利用这些知识去解读这3个字节的数据。