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

在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

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

  1. 30天自制操作系统——第一天制作一个Hello word操作系统

    入手一本<30天自制操作系统>,内容诙谐有趣,很适合对操作系统一窍不通的新手. 据作者所言,这本书的最终目标是从零开始编写一个五脏俱全的图形操作系统,不用什么基础,而且只需30天!! 没有 ...

  2. 为什么《30天自制操作系统》封面中的猫是两只尾巴

    刚刚在一社区,发了一贴,被指出一问题,询一高人,得一答案.这便是我没有关注到的封面上的那只猫,我想这也是很多读者没有关注到的.因为在我微博的200转发贴中,并没有人提到封面中的猫为何有两只尾巴.于是咨 ...

  3. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

    <30天自制操作系统>笔记(01)--hello bitzhuwei's OS! 最初的OS代码 1 ; hello-os 2 ; TAB=4 3 4 ORG 0x7c00 ; 指明程序的 ...

  4. 写在《30天自制操作系统》上市之前

       这本<30天自制操作系统>马上就要在各大书店和网上商城全面上架了,作为本书的4位译者之一,我负责翻译了本书约三分之二的内容.这是我参与翻译的第一本译著,我感到很激动也很紧张,因为我知 ...

  5. 30天自制操作系统——第二十三天窗口操作

    窗口及输入切换 我们先来实现用键盘切换窗口,按下F11键,将最下面的窗口移动到最上面,这里F11按键的编码为0x57. bootpack.c节选: void HariMain(void) {(略)fo ...

  6. 索骥馆-DIY操作系统之《30天自制操作系统》扫描版[PDF]

    内容简介: <30天自制操作系统>是一本兼具趣味性.实用性与学习性的操作系统图书.作者从计算机的构造.汇编语言.C语言开始解说,让读者在实践中掌握算法.在这本书的指导下,从零编写所有代码, ...

  7. 30天自制操作系统:第一天

    30天自制操作系统:第一天 趁着双十一采购了一大堆书,准备消化一下,不然就太浪费了. 书上推荐的二进制编辑器是bz ,界面和版本有点古老,还只有日语和英语版本. 不过直到最近一年还一直在维护,最新的版 ...

  8. 30天自制操作系统 - 取代软盘,用U盘写入引导扇区

    背景 作者是在2006年发布此书的(翻译版是在2012年在中国发售),当时可能还能找到带有软驱的计算机.但是时过境迁,现在已经不存在这种老古董东西了. 简单总结一下学习到第三天的一些更变. 更变 书籍 ...

  9. 30天自制操作系统——第二天

    30天自制操作系统--第二天 今天是该系列的第二天,继续昨天的开发,今天的任务主要有以下几项: 1.进一步的加工一下汇编程序(去除昨天的二进制代码) 2.对启动区进行制作 3.利用makefile简化 ...

  10. 30天自制操作系统——第2天

    操作系统实验日志 实验日期 2018/9/29 实验项目 第2天:汇编语言学习与Makefile入门 一.实验主要内容 (一)汇编 1.关键代码 运行结果: 2.相关汇编指令的解释 指令 格式 含义 ...

最新文章

  1. PyTorch 之 Datasets
  2. python 类和对象 atm_Python 类和对象
  3. 2.3.1 进程的同步与互斥
  4. 调用另一个cpp的变量_再谈条件变量—从入门到出家
  5. Oracle 19c 新特性:ADG的自动DML重定向增强读写分离
  6. android静态动画,LayoutAnimation给ListView中的item设置动态出场效果(实例)
  7. redis的简单安装和配置文件的参数
  8. Sqlite3修复数据库
  9. 21秋期末考试工程项目管理10324k2
  10. map赋值给另一个map_如何写出一个能让面试官直呼“666”的深拷贝?
  11. linux team 模式,linux 聚合口 team libteam 简介
  12. 江苏省泰州市谷歌高清卫星地图下载
  13. DANDELION 病毒
  14. 《“笨办法” 学C语言(Learn C The Hard Way)》
  15. 全国结婚率连续5年下降,这届年轻人,为什么不敢结婚?
  16. 2020程序员节有感
  17. Android5.1自定义闹钟铃声,vivo手机怎么添加自定义闹钟铃声
  18. 不需要密码卸载Symantec Endpoint Protection
  19. 快速聊天:不用QQ概念版 也能将将QQ好友放到桌面 针对所有windows系统
  20. libudev-dev安装错误libudev1 (= 241-7~deb10u7) but 241-7~deb10u6解决

热门文章

  1. shell脚本使用两个横杠接收外部参数
  2. 议题曝光!百位顶级讲师、20大论坛,总有一个话题吸引你
  3. 3.22全局参数的保存_补作业来啦~~
  4. php数组题目以及答案,PHP数组面试考题
  5. 新数据库必须要做一次完全备份之后才能保留日志,在做备份之前还原模式就是简单,不管你选什么!
  6. 系统架构设计方法论——IBM架构解决方案设计
  7. Java开发笔记(二)Java工程的帝国区划
  8. 【EagleEye】2020-ECCV-EagleEye: Fast Sub-net Evaluation for Efficient Neural Network Pruning-论文详解
  9. java判断是否英文_java如何判断字符串是否是英文
  10. Centos 7 | mariadb/mysql | [ERROR] InnoDB: Unable to lock ./ibdata1 error: 11