[第10天]叠加处理

      终于到1/3了。今天作者介绍如何处理上次出现的鼠标覆盖的问题。主要原理是把窗口分层。确定图层的相对位置。然后根据位置,从底至上刷新像素。

图层控制:

      以下是图层的主要控制部分。SHEET代表了每个图层的信息,含义如注释。SHTCTL保存控制所有图层的信息。一共支持256个图层。这里的col_inv还不是很理解。大致的作用就是看是否要进行刷新。起到的作用就是透明色效果。比如指定透明色为99,鼠标设定的背景色为99,那么在刷新是遇到99就不刷新。

控制函数:

      不仅为了解决这个问题,还为后面的窗口做准备。作者一下子把窗口相对高度(sheet_updown())也搞定了。最简单的方法是刷新所有的区域。但这样效率不高,画面还闪。因此作者的做法是只刷新窗口移动前后位置的像素。如sheet_refreshsub()的功能。这些函数的实现还是需要进行思考的。

初始化显示:

      因为不是在一个vram上显示,我们要做的是把一个个图层添加到屏幕。同时要分配内存,内存是额外增加的,所以之前的内存管理就在这里起到了很好的作用。但貌似作者没有很好的处理这里的内存释放。

后续:

      这个版本的刷新还不是最完善的。比如没有必要从底到上全部刷新。这些问题在下一天解决。今天成果和代码:

mouse

[第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