今天的任务是制作命令行窗口,那么命令行窗口应该是什么样呢?
在Windows系统里我们都使用过命令行窗口,它首先是黑底的,可以在里面输入各种字符、可以对输入的命令进行响应…
命令行窗口的制作用到的都是之前的知识点,难度并不大。修改的代码量较大,篇幅有限,就不把代码粘贴上来了,有兴趣的同学可以自行下载阅读。
这里主要记录一下制作命令窗口的关键步骤(本节没有什么新的知识点,可以直接跳过):
我们先在HariMain函数中画出一个命令行窗口的样子,命令行窗口一般就是黑底白字,可以对输入的命令做出响应。
将命令行窗口做成一个单独的新任务,这样可以很容易地创建多个命令行窗口。
按下“Tab”键时,将输入字符的窗口切换到命令行窗口中,当然切换的同时会改变窗口标题栏颜色。
使用key_to变量(bootpack.c)用于记录键盘输入的内容应该发送到哪里,为0则发送到任务A,为1则发送到命令行窗口。
实现命令行窗口的字符输入,只需要键盘被按下时向console_task的FIFO发送数据就可以了。
发送数据时需要知道struct FIFO的内存地址,由于几乎所有的任务都会使用FIFO,这里我们把struct FIFO放到struct TASK中。
bootpack.h节选:
struct TASK {
int sel, flags; /* sel代表GDT编号 */
int level, priority;
struct FIFO32 fifo;
struct TSS32 tss;
};
需要在HariMain函数中判断key_to的值,并向task_cons的FIFO发送数据。
现在可以在命令行中输入数字、英文了。
我们要实现“%”和“!”的输入,需要先处理shift键。
shift键的编码:
左Shift键 按下为0x2a 抬起为0xaa
右Shift键 按下为0x36 抬起为0xbb
我们准备一个key_shift变量,左shift变量按下时置为1,右shift变量按下时置为2,两者都不按时置为0。
我们要实现大写和小写字母的输入,需要同时判断Shift键状态以及CapsLock的状态。
Shift键为OFF 且 CapsLock为OFF -> 小写字母
Shift键为ON 且 CapsLock为ON -> 小写字母
Shift键为OFF 且 CapsLock为ON -> 大写字母
Shift键为ON 且 CapsLock为OFF -> 大写字母
Shift的状态我们已经知道如何获取了,但是CapsLock我们如何获得呢。
在asmhead.nas里我们获得了键盘的状态,保存在binfo->leds中,binfo->leds的第六位就是CapsLock的状态。
根据这个思路,我们就可以处理大小写字母的输入了。
我们发现目前的系统所有窗口的光标都会闪烁,在实际的系统中只有能够接受键盘输入的窗口光标才会闪烁。
那么如何实现这个效果呢?
我们使用FIFO,从任务A向console_task传递信息,告诉它不要闪烁了。
现在命令窗口是没法换行的,按下回车键毫无反应,我们需要让它对回车键进行响应。
由于用于控制换行的ASCII码是10,在按下回车键时向命令窗口发送10+256。
命令行换行已经实现了,我们发现换行到最后就不动了,实际的命令行窗口可不是这样。
这里我们来实现窗口滚动,这里只需要将窗口里的像素都向上移动一行就可以了。
现在我们让命令行窗口来执行命令吧,我们先来写一些简单的命令,后面有需要可以继续扩展。当输入我们没有预先设定的命令时,就提示命令输入有误。
(1)mem命令
mem(memory)命令,用它来显示内存的使用情况。
(2)cls命令
cls(clear screen)命令,用来清楚屏幕上的内容,windows命令行窗口也可以使用cls命令来清屏。
(3)dir命令
dir(directory)命令,除了会显示文件名,还会显示文件的大小,windows命令行窗口可以可以使用dir命令来查看当前目录的文件名,其中包括日期和大小。
后面的目标还是希望能通过命令行,打开自己制作的应用程序并运行的,今天就先到这里,明天来实现吧。
https://gitee.com/mint1993/myos.git