30天自制操作系统——第十七天制作命令行窗口
今天的任务是制作命令行窗口,那么命令行窗口应该是什么样呢?
在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天自制操作系统——第十七天制作命令行窗口相关推荐
- 30天自制操作系统——第一天制作一个Hello word操作系统
入手一本<30天自制操作系统>,内容诙谐有趣,很适合对操作系统一窍不通的新手. 据作者所言,这本书的最终目标是从零开始编写一个五脏俱全的图形操作系统,不用什么基础,而且只需30天!! 没有 ...
- 为什么《30天自制操作系统》封面中的猫是两只尾巴
刚刚在一社区,发了一贴,被指出一问题,询一高人,得一答案.这便是我没有关注到的封面上的那只猫,我想这也是很多读者没有关注到的.因为在我微博的200转发贴中,并没有人提到封面中的猫为何有两只尾巴.于是咨 ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)--hello bitzhuwei's OS! 最初的OS代码 1 ; hello-os 2 ; TAB=4 3 4 ORG 0x7c00 ; 指明程序的 ...
- 写在《30天自制操作系统》上市之前
这本<30天自制操作系统>马上就要在各大书店和网上商城全面上架了,作为本书的4位译者之一,我负责翻译了本书约三分之二的内容.这是我参与翻译的第一本译著,我感到很激动也很紧张,因为我知 ...
- 30天自制操作系统——第二十三天窗口操作
窗口及输入切换 我们先来实现用键盘切换窗口,按下F11键,将最下面的窗口移动到最上面,这里F11按键的编码为0x57. bootpack.c节选: void HariMain(void) {(略)fo ...
- 索骥馆-DIY操作系统之《30天自制操作系统》扫描版[PDF]
内容简介: <30天自制操作系统>是一本兼具趣味性.实用性与学习性的操作系统图书.作者从计算机的构造.汇编语言.C语言开始解说,让读者在实践中掌握算法.在这本书的指导下,从零编写所有代码, ...
- 30天自制操作系统:第一天
30天自制操作系统:第一天 趁着双十一采购了一大堆书,准备消化一下,不然就太浪费了. 书上推荐的二进制编辑器是bz ,界面和版本有点古老,还只有日语和英语版本. 不过直到最近一年还一直在维护,最新的版 ...
- 30天自制操作系统 - 取代软盘,用U盘写入引导扇区
背景 作者是在2006年发布此书的(翻译版是在2012年在中国发售),当时可能还能找到带有软驱的计算机.但是时过境迁,现在已经不存在这种老古董东西了. 简单总结一下学习到第三天的一些更变. 更变 书籍 ...
- 30天自制操作系统——第二天
30天自制操作系统--第二天 今天是该系列的第二天,继续昨天的开发,今天的任务主要有以下几项: 1.进一步的加工一下汇编程序(去除昨天的二进制代码) 2.对启动区进行制作 3.利用makefile简化 ...
- 30天自制操作系统——第2天
操作系统实验日志 实验日期 2018/9/29 实验项目 第2天:汇编语言学习与Makefile入门 一.实验主要内容 (一)汇编 1.关键代码 运行结果: 2.相关汇编指令的解释 指令 格式 含义 ...
最新文章
- PyTorch 之 Datasets
- python 类和对象 atm_Python 类和对象
- 2.3.1 进程的同步与互斥
- 调用另一个cpp的变量_再谈条件变量—从入门到出家
- Oracle 19c 新特性:ADG的自动DML重定向增强读写分离
- android静态动画,LayoutAnimation给ListView中的item设置动态出场效果(实例)
- redis的简单安装和配置文件的参数
- Sqlite3修复数据库
- 21秋期末考试工程项目管理10324k2
- map赋值给另一个map_如何写出一个能让面试官直呼“666”的深拷贝?
- linux team 模式,linux 聚合口 team libteam 简介
- 江苏省泰州市谷歌高清卫星地图下载
- DANDELION 病毒
- 《“笨办法” 学C语言(Learn C The Hard Way)》
- 全国结婚率连续5年下降,这届年轻人,为什么不敢结婚?
- 2020程序员节有感
- Android5.1自定义闹钟铃声,vivo手机怎么添加自定义闹钟铃声
- 不需要密码卸载Symantec Endpoint Protection
- 快速聊天:不用QQ概念版 也能将将QQ好友放到桌面 针对所有windows系统
- libudev-dev安装错误libudev1 (= 241-7~deb10u7) but 241-7~deb10u6解决
热门文章
- shell脚本使用两个横杠接收外部参数
- 议题曝光!百位顶级讲师、20大论坛,总有一个话题吸引你
- 3.22全局参数的保存_补作业来啦~~
- php数组题目以及答案,PHP数组面试考题
- 新数据库必须要做一次完全备份之后才能保留日志,在做备份之前还原模式就是简单,不管你选什么!
- 系统架构设计方法论——IBM架构解决方案设计
- Java开发笔记(二)Java工程的帝国区划
- 【EagleEye】2020-ECCV-EagleEye: Fast Sub-net Evaluation for Efficient Neural Network Pruning-论文详解
- java判断是否英文_java如何判断字符串是否是英文
- Centos 7 | mariadb/mysql | [ERROR] InnoDB: Unable to lock ./ibdata1 error: 11