目录
微信关注《猿小龙》获取源码和电子版书籍
今日成果
1.获取按键编码(hiarib04a)
上次鼠标不能移动的主要原因是设定不到位。
我们需要做的就是让程序按下一个键后不结束,而是把所有键的编码显示出来,这样就算是完成了中断处理程序
"io-out8(PIC0_ocw2,0x61)”用来通知PIC已经知道发生了IRQ1中断哦。如果是IRQ3,则写成0x63。也就是说将0x60+IRQ号码输出给OCW2即可。执行完这句话后,PIC继续时刻监视IRQ1是否中断
,否则系统将感知不到。
从编号为0x0060的输入的设备8位信息是按键编码,它就是键盘
计算机不但知道按下什么键了,并且知道松开了什么键。
2.加快中断处理(hiarib04b)
这里有一个问题就是字符显示的内容被放在了中断处理程序中。
如果处理键盘的中断速度太慢,就会出现鼠标的运动不连贯,不能从网上接受数据等
字符显示也需要花费大量的时间的处理。仅仅画一个字符就要执行128次if语句,来判定是否往VRAM中描画该像素,还要执行内存写入指令。而且往内存的哪个地方写,还要进行地址计算。
解决方案:就是先将那件的编码接受下来,保存到变量里,然后有HariMain偶尔去查看这个变量,如果发现有了数据,就把它显示出来。
考虑到剪短输入需要缓冲区,我们定义一个结构体,命名为keybuf,其中的flag变量用于表示该缓冲区是否为空,如果缓冲区中有数据,而这时来了一个中断,那该怎么办呢,这没办法,需要扔掉。
HariMain函数中首先先用io_cli指令屏蔽中断,为什么要屏蔽中断呢?因为在后面的处理中,如果有中断进来,将会造成混乱,需要先屏蔽中断,然后看一看keybuf.flag的值是什么
如果为0,说明按键没有被按下,keybuf.data中没有值保存进来,在keybuf.data里有值被保存进来之前,先进行屏蔽。这样,即使执行HLT指令,同时有有什么按键被按下,程序也不会有任何反应。所以STI和HLT指令都要执行,而执行这两个指令的函数是io_stihlt,执行完HLT指令之后,如果收到了PIC的通知,CPU将会被唤醒,这样,CPU首先是处理中断程序。中断程序执行完之后,又回到for语句开头,再执行io_lci函数
当按键按下时,keybuf.data中有了数据,存入了按键编码,先将这个按键编码值保存的变量i里面,然后将flag清空,最后再使用io_sti语句放开中断。最后,放开中断后,就可以显示字符了。
3.制作FIFO缓冲区(hiarib04c)
前边程序只能存储一个字节
输入ABC,需要输出ABC,而不是CBA,所以需要制作栈
如果next不是0,则说明至少有一个数据,最开始的一个数据肯定是放在data[0]中的。
全部往前挪
实现了一个栈的数据结构,但是该种实现方式不尽人意,最坏效率需要挪动所有数据
4.优化FIFO缓冲区(hiarib04d)
优化思路是采用两个下标指针,而不需要对数本身进行移动,移动的是下标,当两个下标相等时,就是数据为空了。
但是还是有问题
5.整理FIFO缓冲区(hiarib04e)
鼠标的移动是类似的,只不过数据量较多
6.鼠标(hiarib04f)
7.从鼠标接受数据(hiarib04g)