其实现在已经第10天也已经完成。但是只记录到第8天,这不太好啊。第8天,作者讲了怎么控制鼠标以及填了GDT这个坑。总体来说还是轻松简单的,因为GDT基本在之前搞明白了。
鼠标数据:
鼠标初始化之后,会传送一个字节”FA”。当接受到这个字节后就表示鼠标已经准备好了。在这之后鼠标的数据都是3个字节一组,但是会分3次传送。所以要处理这3个阶段。这3个字节有各自的意义。见OSDev。鼠标还可以进行一些设置, 我直接按作者的来,没有进行其他测试。
Y overflow | X overflow | Y sign bit | X sign bit | Always 1 | Middle Btn | Right Btn | Left Btn |
X movement |
Y movement |
数据解读:
既然得到了鼠标的数据,就要对其进行处理。首要目的就是能移动鼠标。就要获取鼠标的位置。根据第2字节和第3字节就可以知道移动情况。但是Y的移动方向相反,要处理如下:(然后通过 mx += mdec.x; my += mdec.y; 就可以更新鼠标位置)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | if (mdec->phase == 3){ mdec->buf[2] = dat; mdec->phase = 1; mdec->btn = mdec->buf[0] & 0x07; mdec->x = mdec->buf[1]; mdec->y = mdec->buf[2]; if ((mdec->buf[0] & 0x10) != 0) { mdec->x |= 0xffffff00; } if ((mdec->buf[0] & 0x20) != 0) { mdec->y |= 0xffffff00; } mdec->y = - mdec->y; return 1; } |
鼠标移动:
在这里,鼠标移动还很简单,只要重新绘制鼠标的图像就好了,详细见github。因此也有不足的地方,就是会覆盖图层,如下图所示。这个问题,在第10天解决。姑且就放着不管。

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

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

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