1 鼠标解读(1)(harib05a)
现在已经从鼠标取得数据了,现在的问题是要解读这些数据,观察鼠标的移动动作,让鼠标指针相应地移动起来。看一下对bootpack.c中HariMain函数的一些修改。
程序要做的事情很简单,首先把最初读到的0xfa舍弃掉(改变mouse_phase变量进入下一个阶段),之后,每次从鼠标那里送过来的数据应该都是3个字节一组的,所以每当数据累积到3个字节,就把它显示到屏幕上。
变量mouse_phase用来记住接收鼠标数据的工作进展到了什么阶段(phase),接收到的数据放在mouse_dbuf[0 ~ 2]内。
运行一下:
显示出3个字节:08 00 01,如果移动鼠标,这个08部分(也就是mouse_dbuf[0])的’0’那一位,会在0 ~ 3的范围内变化。另外,如果只是移动鼠标,08部分的’8’那一位不会发生任何变化,只有当点击鼠标它才会变化,不仅左击有反应,右击和点击中间滚轮时都会有反应。不管怎样点击鼠标,这个值会在8 ~ F之间变化。
第二个字节00部分(mouse_dbuf[1])与鼠标的左右移动有关系,第三个字节01部分(mouse_dbuf[2])与鼠标的上下移动有关系。
2 稍事整理(harib05b)
整理HariMain:
以上代码主要是创建了一个结构体MOUSE_DEC。DEC是decode的缩写,这样做是为了把解读鼠标所需要的变量都归总到一块儿。
enable_mouse函数最后添加了phase归零的操作,之所以要舍读到的0xfa,是因为鼠标已经激活了。因此我们进行归零处理也不错。
将鼠标的解读从函数HariMain的接收信息处理中剥离出来,放到了mouse_decode函数中,3个字节凑齐后,函数返回1,HariMain将会将鼠标信息显示出来。
3 鼠标解读(2)(harib05c)
程序大体上已经比较清晰了,对 mouse_decode 函数略加修改。
结构体里增加的几个变量用于存放解读结果:x、y、btn分别用于存放移动信息和鼠标按键状态。
另外对if(mdec->phase == 1)语句体内有了一些判断:
用于判断第一字节对移动有反应的部分是否在0 ~ 3 的范围内;同时还要判断第一字节对点击有反应的部分是否在8 ~ F范围内。
如果这个数据不满足这个要求,那么就会被舍去。
这么做的目的是为了防止鼠标在某些情况下(比如接触不良、即将断线)产生数据丢失后造成的数据错位,这样的数据是被能被顺利解读的,这个判断也就是对其检查(数据是否合法),排除了这些极端情况。
最后的if(mdec->phase == 3)部分,是解读处理的核心,鼠标键的状态,放在buf[0]的低三位,我们只取出这三位,十六进制的0x07相当于二进制0000 0111,因此通过位与运算(&),可以顺利取得。
↑if(mdec->phase == 3)部分代码
x和y,基本上是直接使用buf[1]和buf[2],但是需要使用第一字节中对鼠标有反应的几位(第一节最后的一部分内容有提及),将x和y的第八位及第八位以后全部都设成1,或全部都保留为0,这样就能正确地解读x和y。
在解读处理的最后部分,对y的符号进行了取反操作,这是因为鼠标与屏幕的y方向正好相反,为了配合画面方向所以需要取反。
这段程序应该不陌生,调用的还是之前的那些个显示字符串的函数,只是前面加了一些判断语句,默认字符串s中的字符内容是小写的“lcr”,但是如果检测到状态位对应第1位、第2位、第3位为1,就将l、r、c改成大写形式。
运行效果
↑点击鼠标左键的效果
↑点击鼠标滚轮的效果
4 移动鼠标指针(harib05d)
通过改变图形显示部分,让鼠标指针在屏幕上动起来。
这次修改的程序,到/* 鼠标指针的移动 */之前为止,与以前相同,不再解释大家应该也明白。
至于其后的部分,则是先隐藏掉鼠标指针,然后在鼠标指针的坐标上,加上解读得到的位移量。再加上了一些判断,防止鼠标跑到屏幕外面去。
5 通往32位模式之路
这一章节都是对asmhead.nas文件中的汇编代码进行剖析。
如果当CPU进行模式转换时进来了中断信号,那可就麻烦了。而且后来还要进行PIC的初始化,初始化时也不允许有中断发生,所以,这里将中断全部屏蔽掉。
注:NOP指令什么都不做,它只是让CPU休息一个时钟长的时间。
继续向下分析:
后续内容大都是作者的剖析,这里就先放上原书截图(笔者理解力有限,暂时没有太多想法)
感受
今天的内容还是比较多,刚学起来难度有点大,希望过几天再回头能够有更深的理解,先消化一段时间吧,学习嘛,不能着急,循序渐进就好啦。(每天发博客确实有点累,上午看完书,下午捋着思路边看边写,还是挺花时间的,不过还是得继续坚持!)