30天自制操作系统:第八天 鼠标控制与32位模式切换

1 鼠标解读(1)(harib05a)

现在已经从鼠标取得数据了,现在的问题是要解读这些数据,观察鼠标的移动动作,让鼠标指针相应地移动起来。看一下对bootpack.cHariMain函数的一些修改。
在这里插入图片描述在这里插入图片描述
程序要做的事情很简单,首先把最初读到的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休息一个时钟长的时间。

继续向下分析:
在这里插入图片描述
后续内容大都是作者的剖析,这里就先放上原书截图(笔者理解力有限,暂时没有太多想法)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

感受

今天的内容还是比较多,刚学起来难度有点大,希望过几天再回头能够有更深的理解,先消化一段时间吧,学习嘛,不能着急,循序渐进就好啦。(每天发博客确实有点累,上午看完书,下午捋着思路边看边写,还是挺花时间的,不过还是得继续坚持!)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nepu_bin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值