[第8天] 鼠标控制

      其实现在已经第10天也已经完成。但是只记录到第8天,这不太好啊。第8天,作者讲了怎么控制鼠标以及填了GDT这个坑。总体来说还是轻松简单的,因为GDT基本在之前搞明白了。

鼠标数据:

      鼠标初始化之后,会传送一个字节”FA”。当接受到这个字节后就表示鼠标已经准备好了。在这之后鼠标的数据都是3个字节一组,但是会分3次传送。所以要处理这3个阶段。这3个字节有各自的意义。见OSDev。鼠标还可以进行一些设置, 我直接按作者的来,没有进行其他测试。

Y overflowX overflowY sign bitX sign bitAlways 1Middle BtnRight BtnLeft Btn
X movement
Y movement

数据解读:

      既然得到了鼠标的数据,就要对其进行处理。首要目的就是能移动鼠标。就要获取鼠标的位置。根据第2字节和第3字节就可以知道移动情况。但是Y的移动方向相反,要处理如下:(然后通过 mx += mdec.x; my += mdec.y; 就可以更新鼠标位置)

鼠标移动:

      在这里,鼠标移动还很简单,只要重新绘制鼠标的图像就好了,详细见github。因此也有不足的地方,就是会覆盖图层,如下图所示。这个问题,在第10天解决。姑且就放着不管。

mouse-move
Mouse Move With Error

32位解读:

      作者在这天解释了gdt的载入和程序的跳转。以及作者系统的内存分布。作者的系统从0x00280000开始,我从0xc400开始。但是我以后应该也会往后移。所以来用bochs来看一下gdtr吧。首先bochs指示gdtr在内存0x270000的位置,大小为0xffff。

gdtr-idtr
gdtr in bochs

      所以看看0x00270000位置的内存放着什么吧。因为我只定义了2个gdt,外加一个空gdt,所以一共3个记录。截图显示无误。早发现bochs,我估计我已经到13天了。

gdtr0x270000
0x270000 GDT

注意:

      作者介绍的是PS2鼠标,虽然说USB鼠标模拟了PS2,但在处理上还是存在一定差别,因为在真机上鼠标处理会有问题。鼠标的反映会不正常。

 链接:

  1. bochs debugger