[自制简单操作系统] 2、鼠标及键盘中断处理事件[PIC\GDT\IDT\FIFO]
1、大致介绍:
>_<" 大致执行顺序是:ipl10.nas->asmhead.nas->bootpack.c
PS: 这里bootpack.c要调用graphic.c、dsctbl.c、fifo.c、int.c实现功能,其中有些函数还必须汇编来写,所以单独写一个汇编文件naskfunc.nas,为了方便看全部函数和结构体,所以写一个bootpack.h来写一些结构体和函数声明~
>_<" 下面是编译图解:最终生成的haribote.img可放在软盘来启动电脑,加载操作系统~
>_<" 此外还需要一个make.bat的脚本程序,这样把相应的编译器和上面的文件放到对应的位置(参看Makefile文件),运行DOS窗口输入:make run就能直接编译,打包,导入,运行在虚拟机上了~为了在UE上调试方便,我把make run命令也写成了脚本.bat,这样可在UE中直接调试运行~
2、代码详解:
PS: 负责读盘到内存,读完盘之后跳转到0xc200处,即asmhead.nas
PS: 负责显示模式及分辨率设置及从16位转换为32位保护模式,是c语言和汇编语言的桥梁,所以称为asmhead文件,执行到最后就转到bootpack.c的主函数
PS: 主函数在此,做好初始化各种操作然后接收键盘和鼠标信息,并对鼠标信息进行解析,呈现在屏幕上,此外还有文字显示(字库),鼠标显示,鼠标位置计算...这里用到了GDT和IDT,对消息的接收要用中断,对消息的保存要用到FIFO缓冲区...
PS: GDT IDT分段及中断相关,这里的分段和调色板的分段有异曲同工之妙~
PS: 设置调色板,显示字符串,绘制矩形,绘制鼠标,绘制窗口,总之和VRAM相关的函数
PS: 中断句柄函数,但是这些并不是中断真正入口,真正入口是对应汇编函数,这些函数只是对应汇编函数要调用的~这些函数包括鼠标中断和键盘中断,因为为了加速,所以要把收到的数据放进FIFO缓冲区,防止因为在中断中进行大量的处理而影响速度~
PS: 就是个简单的用数组的形式建立的FIFO循环链表,建议看一下那个经典的黑色的数据结构的书,上面讲的很好,甚至有自动增加大小的循环链表,这个数据结构主要用来存放鼠标和键盘的信息~
PS: 这就是个字库,对于硬件级工程,字库是必须的!为什么我们编辑器里选择字形时英文这么多,汉字这么少,是因为设计中文字库的人少,一方面劳动量大,另一方面没钱赚,所以我们有着丰富的书法文化却只有几个可怜的字形可以选择!
PS: 一些不能用c语言来完成的函数还得用汇编,于是就都放在这个文件里了~
3、效果说明:
>_<" 这里已经实现了文字显示,鼠标显示,键盘和鼠标信息的读取,其中涉及的知识有:GDT,IDT,中断,FIFO,VRAM,字库等,最终效果如下:
PS: 最上面显示鼠标当前位置,第二行左边显示按键信息,右边lcr显示鼠标点击事件(如果左边被点击l就变大写L,其他相同道理),后面两个数据是鼠标此次移动距离~
PS: 该系统的内存分布图:在文件asmhead.nas有详细注释
146 ;----------------------------------------------------------------------------------------------------
147 ;内存分配:
148 ; 0x00000000-0x000fffff:虽然在启动中会多次使用,但之后就会变空(1M)
149 ; 0x00100000-0x00267fff:用于保存软盘的内容(1440KB)
150 ; 0x00268000-0x0026f7ff:空(30KB)
151 ; 0x0026f800-0x0026ffff:IDT(2KB)
152 ; 0x00270000-0x0027ffff:GDT(64KB)
153 ; 0x00280000-0x002fffff:bootpack.hrb(512KB)
154 ; 0x00300000-0x003fffff:栈及其他(1MB)
155 ; 0x00400000- :空
156 ;----------------------------------------------------------------------------------------------------
LZ:http://www.cnblogs.com/zjutlitao/
本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/3961048.html,如需转载请自行联系原作者