30天自制操作系统——第十七天制作命令行窗口

今天的任务是制作命令行窗口,那么命令行窗口应该是什么样呢?

在Windows系统里我们都使用过命令行窗口,它首先是黑底的,可以在里面输入各种字符、可以对输入的命令进行响应…

命令行窗口的制作用到的都是之前的知识点,难度并不大。修改的代码量较大,篇幅有限,就不把代码粘贴上来了,有兴趣的同学可以自行下载阅读。

这里主要记录一下制作命令窗口的关键步骤(本节没有什么新的知识点,可以直接跳过):

一、绘制命令行窗口

我们先在HariMain函数中画出一个命令行窗口的样子,命令行窗口一般就是黑底白字,可以对输入的命令做出响应。

将命令行窗口做成一个单独的新任务,这样可以很容易地创建多个命令行窗口。

30天自制操作系统——第十七天制作命令行窗口_第1张图片

二、切换输入窗口

按下“Tab”键时,将输入字符的窗口切换到命令行窗口中,当然切换的同时会改变窗口标题栏颜色。

使用key_to变量(bootpack.c)用于记录键盘输入的内容应该发送到哪里,为0则发送到任务A,为1则发送到命令行窗口。

30天自制操作系统——第十七天制作命令行窗口_第2张图片

三、字符输入

实现命令行窗口的字符输入,只需要键盘被按下时向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发送数据。

现在可以在命令行中输入数字、英文了。

30天自制操作系统——第十七天制作命令行窗口_第3张图片

四、特殊符号输入

我们要实现“%”和“!”的输入,需要先处理shift键。

shift键的编码:

左Shift键 按下为0x2a 抬起为0xaa

右Shift键 按下为0x36 抬起为0xbb

我们准备一个key_shift变量,左shift变量按下时置为1,右shift变量按下时置为2,两者都不按时置为0。

30天自制操作系统——第十七天制作命令行窗口_第4张图片

五、区分大小写

我们要实现大写和小写字母的输入,需要同时判断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的状态。

根据这个思路,我们就可以处理大小写字母的输入了。

30天自制操作系统——第十七天制作命令行窗口_第5张图片

六、控制光标闪烁

我们发现目前的系统所有窗口的光标都会闪烁,在实际的系统中只有能够接受键盘输入的窗口光标才会闪烁。

那么如何实现这个效果呢?

我们使用FIFO,从任务A向console_task传递信息,告诉它不要闪烁了。

30天自制操作系统——第十七天制作命令行窗口_第6张图片

七、命令换行

现在命令窗口是没法换行的,按下回车键毫无反应,我们需要让它对回车键进行响应。

由于用于控制换行的ASCII码是10,在按下回车键时向命令窗口发送10+256。

30天自制操作系统——第十七天制作命令行窗口_第7张图片

八、窗口滚动

命令行换行已经实现了,我们发现换行到最后就不动了,实际的命令行窗口可不是这样。

这里我们来实现窗口滚动,这里只需要将窗口里的像素都向上移动一行就可以了。

30天自制操作系统——第十七天制作命令行窗口_第8张图片

九、命令响应

现在我们让命令行窗口来执行命令吧,我们先来写一些简单的命令,后面有需要可以继续扩展。当输入我们没有预先设定的命令时,就提示命令输入有误。

(1)mem命令

mem(memory)命令,用它来显示内存的使用情况。

30天自制操作系统——第十七天制作命令行窗口_第9张图片

(2)cls命令

cls(clear screen)命令,用来清楚屏幕上的内容,windows命令行窗口也可以使用cls命令来清屏。

30天自制操作系统——第十七天制作命令行窗口_第10张图片

(3)dir命令

dir(directory)命令,除了会显示文件名,还会显示文件的大小,windows命令行窗口可以可以使用dir命令来查看当前目录的文件名,其中包括日期和大小。

30天自制操作系统——第十七天制作命令行窗口_第11张图片

后面的目标还是希望能通过命令行,打开自己制作的应用程序并运行的,今天就先到这里,明天来实现吧。
https://gitee.com/mint1993/myos.git

你可能感兴趣的:(操作系统,windows,操作系统)