我已经规范了系统代码风格,类似于按照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 day10——实现shell(上)相关推荐

  1. 自制操作系统Antz(10)——实现shell(上)

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

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

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

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

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

  4. 自制操作系统Antz(9)——实现内核 (下) 实现图形化界面

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

  5. 自制操作系统Antz day08——实现内核 (中) 扩展内核

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

  6. 30天自制操作系统(day10)

    第10天:叠加处理 1.内容1:内存管理 因为bootpack.c太长了,所以创建一个memory.c,将bootpack里的一部分内容分到memory中,使bootpack.c的代码变短. 在之前的 ...

  7. 《操作系统真象还原》从零开始自制操作系统 全流程记录

    文章目录 前引 章节博客链接 实现源码链接 前引 这本<操作系统真象还原>里面一共有十五个章节 大约760页 这些系列博客也是我在做完哈工大操作系统Lab之后 觉得还是有些朦朦胧胧 毅然决 ...

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

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

  9. 发布在《30天自制操作系统》之前的帮助阅读贴

    说明:这是8月15日即将上市的一本新书,本文的摘选也可以命名为<30天自制操作系统>上市之前必读.本书幽默,有趣,可以说是技术书里的幽默书,让您读起来绝对不会感到乏味.在本书上市之前,您一 ...

最新文章

  1. 反客为主 ——浅议呼叫中心在网络营销4C策略中的角色与价值
  2. Entity Framework Core 2.0 使用入门
  3. from . import _arpack ImportError: DLL load failed
  4. 《Windows 8 权威指南》——1.5 版本对比
  5. Json.Net系列教程 3.Json.Net序列化和反序列化设置
  6. 【CF 1195】Basketball Exercise/Submarine in the Rybinsk Sea (hard edition)/OpenStreetMap+二维单调队列滑动窗口模板
  7. 161122、BOM 操作写法示例
  8. python设计模式11-享元模式
  9. 【UE】UE4下载安装及测试demo
  10. python实现的好玩的小程序--利用wxpy实现的微信可检测僵尸粉机器人
  11. JAVA经典算法题目
  12. java根据cookie统计uv,利用Cookie统计UV流量 | 学步园
  13. OSPF之区域间路由
  14. 渗透测试详解及爱加密加固使用及优势
  15. Charles工具使用-pc端
  16. 01【股票初级】-【找准入场时机】投资五大流派,好公司投资法,判断单只股票是否便宜?如何找准时机入场?
  17. jquery mobile mobiscroll 日期插件使 用mobiscroll
  18. IP地址分类及子网划分
  19. 表白神器:DIY舵机版无聊小盒 3D打印
  20. 流媒体加速服务的详细讲解

热门文章

  1. 安卓桌面软件哪个好_漂亮的桌面便签软件是哪个?怎么下载
  2. 史上最全最详细2014年初mac air 128G硬盘 4G内存 更换512G硬盘及更新最新操作系统macOS Big Sur操作手册
  3. java 二维码生成和加密base64压码
  4. 大数据——Flink dataStream 中窗口函数的使用
  5. 3G路由器在lan口ping不通wan口IP,但DMZ主机可用
  6. springboot 中动态切换数据源(多数据源应用设计)
  7. C# Sharp问题解决:System.FormatException 输入字符串的格式不正确
  8. 电脑数据迁移到新电脑:一键迁移数据方案详解
  9. canvas 模拟地球绕太阳转动 月球绕地球转动
  10. GPS时钟系统在综自变电站中的应用