我已经规范了系统代码风格,类似于按照linux分包,把各部分功能区分开了

Antz系统更新地址

Linux内核源码分析地址

Github项目地址

在之前的任务中,我们已经通过直接操作显卡驱动完成了简单的图形化。

需要了解之前的部分:

直接操作显卡请参考day03

简单图形化的实现请参考day09

Makefile

项目目录

console的图形化实现与规则均在main/bootpack.c中完成

interrupt/int.c 中实现了键盘中断处理,按键会中断两次,一次按下,一次弹起,在响应处理中,只需要处理第一次按下即可。

一 . 键盘按键

如何来判断中断来自于键盘?(代码如下)

    // gdt初始化操作...
// fifo加载操作...
if (fifo8_status(&keyfifo) != 0) { // True则说明中断来自于键盘
i = fifo8_get(&keyfifo);
io_sti();
// i 就是中断返回的值,分析他即可得到按键信息, 在下面我把它转换为了16进制存储在了一个char array s中
sprintf(s, "%02X", i);
// 把两次中断变为一次,看下文
}

得到了s,就是得到了键盘按键的信息。

开头说了,按下一次,会有两次中断发生,那么我们是否可以使用一个flag来区分按下和弹起呢?

	if (flag){
keyshow(); // 显示这次按键,把按下的中断当作一个键位的信息,把弹起的中断用下面flag的方法屏蔽掉
}
// 屏蔽
if(flag==1){
flag = 0 ;
}else {
flag = 1 ;
}

这是一个很拙略的实现方法,而且我测试了几次之后发现有一个bug,就是同时按下两个键位时,屏蔽的方法就会变成另一种。

比如开始是用按下识别一个键位,那么同时按下两个键位之后就是以弹起的方法来识别键位了。

这个情况留在之后再考虑。

二 . 按键识别

上文中已经将按键返回的数据存储到了char数组s,只需要在屏幕上显示s的数据就可以了。

int write_x = 55 ; //按键显示位置的x,y坐标
int write_y = 57 ; void key(struct BOOTINFO *binfo,char s[40]){
//在指定位置显示数据
showkeys(binfo->vram, binfo->scrnx, write_x, write_y, COL8_FFFFFF, s);
// 显示之后光标右移
write_x += 19 ;
// 如果超出右边界,换行
if(write_x>155){
write_x = 55 ;
write_y += 19 ;
}
// 如果超出下边界,刷新清理本页,开启新的一页
if(write_y>180){
new_pe(binfo);
} }

结果:

很明显,我们需要编写一种转换机制,将表示16进制的数据对应成为键盘按键。

键盘上需要显示的有字母和特殊符号,还有一些功能性的按键shift,backspace等。

测试记录了几个按键的按下数据

键盘 按下

F1 3B

F2 3C

F3 3D

F4 3E

A 1E

B 30

Backspace OE

空格 39

既然已经知道了对应关系,那么很容易就可以建立一种对应。

先来实现这几个特殊按键功能

我打算将 F1 实现为 clear 功能,实现页面刷新 。 Backspace 实现回退功能。Enter实现确定以及回车功能。

void showkey(struct BOOTINFO *binfo,char s[40]){
// 回车键
if(strcmp(s,"1C")==0){
write_x = 55 ; // 光标移动至下一行起始位置。
write_y += 19 ;
showkeys(binfo->vram, binfo->scrnx, 0, write_y, COL8_FFFFFF, "AntzOS>");
}
// F1 刷新本页
else if(strcmp(s,"3B")==0){
new_pe(binfo);
}
// 空格 光标后移一位
else if(strcmp(s,"39")==0){
showkeys(binfo->vram, binfo->scrnx, write_x, write_y, COL8_FFFFFF, " ");
write_x += 19 ;
}
// Backspace 删除退格
else if(strcmp(s,"0E")==0){
// 回退
write_x -= 19 ;
//重新覆盖这片区域
area_flash(binfo->vram, binfo->scrnx , COL8_000000, write_x, write_y, write_x+19, write_y+19);
}
// 其他按键
else {
showkeys(binfo->vram, binfo->scrnx, write_x, write_y, COL8_FFFFFF, s);
write_x += 19 ;
}
if(write_x>155){
write_x = 55 ;
write_y += 19 ;
//putfonts8_asc(binfo->vram, binfo->scrnx, 4, 57, COL8_FFFFFF, "AntzOS>");
}
if(write_y>180){
new_pe(binfo);
} }

字母识别同理,当然可以比上面实现的更加完善更加简洁,但我仓促之下就只能先做到这一步。

三 . Bug引发的思考

这里开始就和AntzOs实现没有多少联系了,不过在我测试按键中断时候发现了很多奇怪的小问题。

Caps Lock(大小写键) 是否开启并不会影响中断对你一个按键的返回信息,也就是所谓的大小写中断其实是无法区分的,那么现代系统如何区分呢? 同理于上面我们区分按下和弹起两次中断,我们可以将Caps Lock键的状态获取到,从而对当前按键进行所谓的大小写区分。

按下两次导致规则置换,会不会是因为中断响应的时间导致的。

自制操作系统Antz(10)——实现shell(上)的更多相关文章

  1. 自制操作系统Antz(11)——实现shell(下)命令响应

    我已经规范了系统代码风格,类似于按照linux分包,把各部分功能区分开了 Antz系统更新地址 Linux内核源码分析地址 Github项目地址 在之前的任务中,我们已经通过直接操作显卡驱动完成了简单 ...

  2. 自制操作系统Antz(7)——实现内核 (上)

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...

  3. 自制操作系统Antz -- 系列文章

    自制操作系统Antz day10——实现shell(上) AntzUhl 2018-10-10 16:25 阅读:192 评论:0   Linux内核源码分析 day01——内存寻址 AntzUhl ...

  4. 自制操作系统Antz(13) 显示图片

    显示图片只是在多媒体课上看着bmp格式图片的突发奇想,然后就实现在了我自己的操作系统 Antz系统更新地址 Linux内核源码分析地址 Github项目地址 效果图: 显示图片的原理 在之前显卡操作时 ...

  5. 自制操作系统Antz(2)——进入保护模式 (上) jmp到保护模式

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.htm Linux内核源码分析地址:https://www.cnblogs.c ...

  6. 自制操作系统Antz(1)——Boot Sector

    0.引子 最近在看操作系统底层方面的东西,最开始的为什么是07c00h这个问题就让我对操作系统有了很大的兴趣.所以准备在看书之余顺便写一个操作系统(Anz).至于为什么这个系统会被叫做Antz,可以参 ...

  7. 自制操作系统Antz(12)——承上启下

    我已经规范了系统代码风格,类似于按照linux分包,把各部分功能区分开了 Antz系统更新地址 Linux内核源码分析地址 Github项目地址 在之前的工作中,AntzOS已经从单调的界面,变得逐渐 ...

  8. 自制操作系统Antz(5)——深入理解保护模式与进入方法

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...

  9. 自制操作系统Antz(3)——进入保护模式 (中) 直接操作显存

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...

随机推荐

  1. [dev] Go的协程切换问题

    子标题:runtime.Gosched() 是干嘛用的? 1. go程序都有一个环境变量,做线程数设置 GOMAXPROCS 2. 当协程数小于等于线程数的时候,程序行为上与多线程没有区别. 3. 当 ...

  2. 理解npm run

    引言 ReactNative 开发中经常用到一些npm run的命令来打包.最近在这上面踩了一个坑,所以研究了一下. 在阅文做了两个ReactNative混合开发的项目,都用npm run bundl ...

  3. 树莓派与Linux系统之间文件传输

    最近因为要学习Python,于是把放在家里接了一年灰的树莓派又给搜出来了,刚买那会也捣鼓了好一阵子, 基本操作都学会了,但现在又忘光了,只能又从头开始搞了,首先第一个要解决的是怎么把文件从电脑传输到树 ...

  4. 发现了一个比较有意思的url参数

    今天登录阿里云发现需要二次验证了,手机号不是我的很麻烦,然后就看到有个手机app快捷登录的方式,点进去一看,链接地址是这样的http://qd.alibaba.com/onekey.htm?spm=0 ...

  5. python练习题-day17

    1.计算n!,例如n=3(计算321=6), 求10! 2.已知一个数列:1.1.2.3.5.8.13.....的规律为从3开始的每一项都等于其前两项的和,这是斐波那契数列.求满足规律的100以内的所 ...

  6. jstack命令

    先是有jps查看进程号: hollis@hos:~$ jps 29788 JStackDemo1 29834 Jps 22385 org.eclipse.equinox.launcher_1.3.0. ...

  7. 数据库主库从库宕机重启后binlog数据同步

    由于阿里云经典网络迁移到专用网络,一不小心没有先预备方案调整网段, 导致实例无法以内网IP形式访问数据库,被迫进行数据库停机后网络网段调整,导致宕机了几个小时...被客户各种投诉爆了.. 基于这次数据 ...

  8. Extjs6 grid 导出excel功能类,支持renderer

    /* grid 导出excel扩展(纯客户端,提交到后台再导的可以自己改改代码也在) 参考自 https://blog.csdn.net/tianxiaode/article/details/4596 ...

  9. springboot引入AOP

    AOP是Aspect Oriented Programming的缩写,意为面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是spring框架的一个重要内容,她通过对 ...

  10. jupyter notebook + frp 实现内容穿透

    服务器上找到frps.ini 配置如下 [common] bind_port = 7000 vhost_http_port = 8890 要穿透的笔记本的frpc.ini配置 [common] ser ...