30天自制操作系统第8天(共27页).docx





《30天自制操作系统第8天(共27页).docx》由会员分享,可在线阅读,更多相关《30天自制操作系统第8天(共27页).docx(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上操作系统实验日志学号姓名甘昆禄专业年级班级智能1601实验日期2018.11.14实验项目第8天:鼠标控制与32位模式切换一、实验主要内容1. 鼠标解读(1)已经能从鼠标取得数据了,紧接着的问题是要解读这些数据,调查鼠标是怎么移动的,然后结合鼠标的动作,让鼠标指针相应地动起来。首先对bootpack.c中的HariMain进行一些修改:for (;) io_cli(); if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) = 0) io_stihlt(); else if (fifo8_status(&keyfi
2、fo) != 0) i = fifo8_get(&keyfifo); io_sti(); sprintf(s, %02X, i); boxfill8(binfo-vram, binfo-scrnx, COL8_, 0, 16, 15, 31); putfonts8_asc(binfo-vram, binfo-scrnx, 0, 16, COL8_FFFFFF, s); else if (fifo8_status(&mousefifo) != 0) i = fifo8_get(&mousefifo); io_sti(); if (mouse_phase = 0) /*等待鼠标的0xfa的状态*/
3、 if (i = 0xfa) mouse_phase = 1; else if (mouse_phase = 1) /*等待鼠标的第一字节*/ mouse_dbuf0 = i; mouse_phase = 2; else if (mouse_phase = 2) /* 等待鼠标的第二字节 */ mouse_dbuf1 = i; mouse_phase = 3; else if (mouse_phase = 3) mouse_dbuf2 = i; mouse_phase = 1; /*鼠标的三个字节都齐了,显示出来*/ sprintf(s, %02X %02X %02X, mouse_dbuf0
4、, mouse_dbuf1, mouse_dbuf2); boxfill8(binfo-vram, binfo-scrnx, COL8_, 32, 16, 32 + 8 * 8 - 1, 31); putfonts8_asc(binfo-vram, binfo-scrnx, 32, 16, COL8_FFFFFF, s); 实际上是将HariMain中for循环部分进行修改,首先把最初读到的0xfa舍弃掉。之后,每次从鼠标那里送过来的数据都应该是3个字节一组的,所以每当数据累积到3个字节,就把他显示在屏幕上。变量mouse_phase用来记住接受鼠标数据的工作进展到了什么阶段(phase)。接
5、受到的数据放在mouse_dbuf02内。 if (mouse_phase = 0) /*等待鼠标的0xfa的状态*/ 各种处理; else if (mouse_phase = 1) /*等待鼠标的第一字节*/ 各种处理; else if (mouse_phase = 2) /* 等待鼠标的第二字节 */ 各种处理; else if (mouse_phase = 3) /*鼠标的三个字节都齐了,显示出来*/ 各种处理; 这部分就是对于不同的mouse_phase值,相应地做各种不同的处理。显示结果如下(鼠标移动过):屏幕上除了括号内的还有三字节数字,即mouse_dbuf0,mouse_dbu
6、f1,mouse_dbuf2里的数据。“08”部分0会在03的范围内变化,这里鼠标左移时显示1,下移时显示2,这是演讲的同学提出的,湛林莉她观察还真是厉害,不仅将上下左右,还把右下、坐下等也看了出来。“8”只有在点击鼠标时才会有变化,值在8F之间。第二个字节与鼠标的左右移动有关,第三个字节与鼠标的上下移动有关。这里的信息方便下面为鼠标的动作做出判断。2. 整理在HariMain函数中出现的unsigned char mouse_dbuf3, mouse_phase;声明可以放到函数前的结构体里:struct MOUSE_DEC unsigned char buf3, phase;123并在这句
7、话修改为:struct MOUSE_DEC mdec;1创建的这个结构体MOUSE_DEC,DEC是decode的缩写,用这个结构日把鼠标所需要的变量都归总到一块儿。 然后将鼠标的解读从函数HariMain的接受信息处理中剥离出来,放到了mouse_decode函数。3. 鼠标解读(2)struct MOUSE_DEC unsigned char buf3, phase; int x, y ,btn;int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat) if (mdec-phase = 0) /* 等待鼠标的0xfa的阶段 */
8、 if (dat = 0xfa) mdec-phase = 1; return 0; if (mdec-phase = 1) /* 等待鼠标第一字节的阶段 */ if (dat & 0xc8) = 0x08) /*如果第一字节正确*/ mdec-buf0 = dat; mdec-phase = 2; return 0; if (mdec-phase = 2) /* 等待鼠标第二字节的阶段 */ mdec-buf1 = dat; mdec-phase = 3; return 0; if (mdec-phase = 3) /* 等待鼠标第三字节的阶段 */ mdec-buf2 = dat; mde
9、c-phase = 1; mdec-btn = mdec-buf0 & 0x07; mdec-x = mdec-buf1; mdec-y = mdec-buf2; if (mdec-buf0 & 0x10) != 0) mdec-x |= 0xffffff00; if (mdec-buf0 & 0x20) != 0) mdec-y |= 0xffffff00; mdec-y = - mdec-y; /*鼠标的y方向与画面符号相反*/ return 1; return -1; /* 应该不可能到这里来 */结构体里增加的几个变量用于存放解读结果,这几个变量是x、y和btn,分别用于存放移动信息和
10、鼠标按键状态。if (mdec-phase = 1)这个语句用于判断第一字节对移动有反应的部分是否在03的范围内;同时还要判断第一字节对点击有反应的部分是否在8F的范围内,如果不在以上数据范围内就被舍去。这样做是因为鼠标连线可能会由接触不良,这样产生的数据就有错位,不能顺利解读。if (mdec-phase = 3)语句是解读处理的核心。鼠标键的状态放在buf0的低3位,我们只取出这3位。十六进制的0x07相当于二进制的0000 0111,通过与运算(&)取出低3位。x,y基本上直接使用buf1和buf2,但是需要使用第一字节中对鼠标移动有反应的几位,将x和y的第8位及第8位以后全部都设成1,
11、或全部都保留为0,就能正确解读x和y。解读最后对y符号进行了取反操作是因为鼠标与屏幕的y方向正好相反,为了配合画面方向,就对y符号进行了取反操作。鼠标数据解读完成之后接下来修改显示部分: else if (fifo8_status(&mousefifo) != 0) i = fifo8_get(&mousefifo); io_sti(); if (mouse_decode(&mdec, i) != 0) /*3字节都凑齐了,所以把它们显示出来*/ sprintf(s, lcr %4d %4d, mdec.x, mdec.y); if (mdec.btn & 0x01) != 0) s1 = L
12、; if (mdec.btn & 0x02) != 0) s3 = R; if (mdec.btn & 0x04) != 0) s2 = C; boxfill8(binfo-vram, binfo-scrnx, COL8_, 32, 16, 32 + 15 * 8 - 1, 31); putfonts8_asc(binfo-vram, binfo-scrnx, 32, 16, COL8_FFFFFF, s); 4. 移动鼠标指针现在就是让鼠标指针在屏幕上动起来啦,感觉好激动,终于能动了(白眼)。 else if (fifo8_status(&mousefifo) != 0) i = fifo8
13、_get(&mousefifo); io_sti(); if (mouse_decode(&mdec, i) != 0) /*3字节都凑齐了,所以把它们显示出来*/ sprintf(s, lcr %4d %4d, mdec.x, mdec.y); if (mdec.btn & 0x01) != 0) s1 = L; if (mdec.btn & 0x02) != 0) s3 = R; if (mdec.btn & 0x04) != 0) s2 = C; boxfill8(binfo-vram, binfo-scrnx, COL8_, 32, 16, 32 + 15 * 8 - 1, 31);
14、putfonts8_asc(binfo-vram, binfo-scrnx, 32, 16, COL8_FFFFFF, s); /*鼠标指针的移动*/ boxfill8(binfo-vram, binfo-scrnx, COL8_, mx, my, mx + 15 * 8 - 1, my + 15); /*隐藏鼠标*/ mx += mdec.x; my += mdec.y; if (mx x) mx = 0; if (my binfo-scrnx - 16) mx = binfo-scrnx - 16; if (my binfo-scrny - 16) my = binfo-scrny - 1
15、6; sprintf(s, (%sd, %3d), mx, my); boxfill8(binfo-vram, binfo-scrnx, COL8_, 0, 0, 79, 15); /*隐藏坐标*/ putfonts8_asc(binfo-vram, binfo-scrnx, 0, 0, COL8_FFFFFF, s); /*显示坐标*/ putfonts8_8(binfo-vram, binfo-scrnx, 16, 16, mx, my, mcursor, 16); /*描画鼠标*/ 先隐藏到鼠标指针,然后根据取得的鼠标数据解读得到的位移量,让鼠标显示在屏幕上。mx += mdec.x;m
16、y += mdec.y;是为了防止鼠标指针跑到屏幕外进行的调整。5. 通往32位模式之路这里讲解了asmhead.nas中的程序。; PIC关闭一切中断; 根据AT兼容机的规格,如果要初始化PIC,; 必须在CLI之前进行,否则有时会挂起,; 随后进行PIC的初始化 MOV AL,0xff OUT 0x21,AL NOP ; 如果连续执行OUT指令,有些机种会无法正常运行 OUT 0xa1,AL CLI ; 禁止CPU级别的中断这段程序等同于一下内容的C程序。io_out8(PIC0_IMR, 0xff ); /* 禁止主PIC的全部中断 */io_out8(PIC1_IMR, 0xff );
17、 /* 禁止从PIC的全部中断 */Io_cli(); /*禁止CPU级别的中断*/为了让CPU能够访问1MB以上的内存空间,设定A20GATE CALL waitkbdout MOV AL,0xd1 OUT 0x64,AL CALL waitkbdout MOV AL,0xdf ; enable A20 OUT 0x60,AL CALL waitkbdout这里的waitbdout等同于wait_KBC_sendread,等同于C语言中的:#define KEYCMD_WRITE_OUTPORT 0xd1#define KBC_OUTPORT_A20G_ENABLE 0xdf /* A20G
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 30 自制 操作系统 27

限制150内