《30天自制操作系统》18_day_学习笔记
harib15a:
到这里为止,我们已经能实现窗口的切换了。我们发现所有的窗口都有光标闪烁,而我们只希望可以接受输入的窗口有光标闪烁。这里我们先来修改任务A中的光标闪烁,当按下TAB时,如果让A不现实光标,我们让cursor_c为负值。
void HariMain(void)
{ //......
for (;;) {
//.....
if ( <= i && i <= ) { /* 键盘数据 */
//.....
if (i == + 0x0f) { /* Tab键 */
if (key_to == ) { //向CMD任务窗口输入键盘的数据
key_to = ;
make_wtitle8(buf_win, sht_win->bxsize, "task_a", );//A窗口灰色标题
make_wtitle8(buf_cons, sht_cons->bxsize, "console", );//CMD窗口蓝色标题
cursor_c = -; /* 此时向CMD发送数据,任务A中没有闪烁图标 */
boxfill8(sht_win->buf, sht_win->bxsize, COL8_FFFFFF, cursor_x, , cursor_x + , );
} else { //向任务A窗口发送数据
key_to = ;
make_wtitle8(buf_win, sht_win->bxsize, "task_a", );//A窗口蓝色标题
make_wtitle8(buf_cons, sht_cons->bxsize, "console", );//CMD窗口灰色
cursor_c = COL8_000000; /* 此时A任务窗口会显示光标闪烁 */
}
//刷新窗口
sheet_refresh(sht_win, , , sht_win->bxsize, );
sheet_refresh(sht_cons, , , sht_cons->bxsize, );
}
//.....
if (cursor_c >= ) { //这里是显示闪烁图标的代码
//只对A任务窗口进行闪烁的判断
boxfill8(sht_win->buf, sht_win->bxsize, cursor_c, cursor_x, , cursor_x + , );
} //刷线任务A窗口
sheet_refresh(sht_win, cursor_x, , cursor_x + , );
} else if ( <= i && i <= ) { /* 鼠标的数据 */
//......
} else if (i <= ) { /* 光标定时器 */
if (i != ) {
timer_init(timer, &fifo, );/* 想定时器缓冲区中写入0 */
if (cursor_c >= ) {
cursor_c = COL8_000000;//设置光标背景颜色白色
}
} else {
timer_init(timer, &fifo, );/* 向定时器缓冲区写入1 */
if (cursor_c >= ) { //设置光标背景黑色
cursor_c = COL8_FFFFFF;
}
}
timer_settime(timer, ); //定时时间为count的50次中断计数的时间
if (cursor_c >= ) { //cursor_c>0表示窗口A为活动窗口,可以显示光标
//窗口A图层的填充和刷新
boxfill8(sht_win->buf, sht_win->bxsize, cursor_c, cursor_x, , cursor_x + , );
sheet_refresh(sht_win, cursor_x, , cursor_x + , );
}
}
}
}
}
harib15b:
1、实现CMD窗口的光标的控制,将光标开始闪烁定义为2,停止闪烁定义为3.
//HariMain节选
if (i == + 0x0f) { /* 按下的是TAB键 */
if (key_to == ) { //这是向CMD任务发送数据
key_to = ;
make_wtitle8(buf_win, sht_win->bxsize, "task_a", );
make_wtitle8(buf_cons, sht_cons->bxsize, "console", );
cursor_c = -; /* cursor_c管理的是任务A的光标的闪烁情况,A停止闪烁 */
boxfill8(sht_win->buf, sht_win->bxsize, COL8_FFFFFF, cursor_x, , cursor_x + , );
fifo32_put(&task_cons->fifo, ); /* 这个是CMD光标闪烁的情况,此时CMD闪烁打开 */
} else { //向任务A窗口发送数据
key_to = ;
make_wtitle8(buf_win, sht_win->bxsize, "task_a", );
make_wtitle8(buf_cons, sht_cons->bxsize, "console", );
cursor_c = COL8_000000; /* A开始闪烁 */
fifo32_put(&task_cons->fifo, ); /* CMD窗口闪烁关闭 */
} //刷新任务A和CMD窗口图层
sheet_refresh(sht_win, , , sht_win->bxsize, );
sheet_refresh(sht_cons, , , sht_cons->bxsize, );
}
2、对CMD任务窗口进行修改,刚开始时候将cursor_c置为-1,后面的处理和任务A一样
void console_task(struct SHEET *sheet)
{
//i是从CMD缓冲区取得的数据
if (i <= ) { /* 光标定时器超时 */
if (i != ) {
timer_init(timer, &task->fifo, ); /* 先向任务缓冲区写入0 */
if (cursor_c >= ) {
cursor_c = COL8_FFFFFF; //设置黑色
}
} else {
timer_init(timer, &task->fifo, ); /* 想任务缓冲区写入1 */
if (cursor_c >= ) {
cursor_c = COL8_000000; //设置白色
}
}
timer_settime(timer, ); //定时器时间
}
if (i == ) { /* CMD光标打开了 */
cursor_c = COL8_FFFFFF;
}
if (i == ) { /* CMD光标关闭 */
boxfill8(sheet->buf, sheet->bxsize, COL8_000000, cursor_x, , cursor_x + , );
cursor_c = -; //关闭之后,重新初始化为-1,回到if判断中间
}
if ( <= i && i <= ) { /* 获得了键盘的数据 */
if (i == + ) {
/* Backspace键 */
if (cursor_x > ) { //退格之前至少要16个像素的位置,一个字符+光标
//退格之后,光标的位置写“ ”
putfonts8_asc_sht(sheet, cursor_x, , COL8_FFFFFF, COL8_000000, " ", );
cursor_x -= ; //光标左移8个像素
}
} else {
/* 获得的是一般的字符 */
if (cursor_x < ) { //CMD窗口宽度最大为240个像素
/* 这里处理的是,每输入一个字符,在CMD中写入一个,光标后移8个像素 */
s[] = i - ;
s[] = ;
putfonts8_asc_sht(sheet, cursor_x, , COL8_FFFFFF, COL8_000000, s, );
cursor_x += ;
}
}
}
/* 重新显示光标 */
if (cursor_c >= ) { //如果在前面设置了光标的颜色,说明光标可以显示
boxfill8(sheet->buf, sheet->bxsize, cursor_c, cursor_x, , cursor_x + , );
}
sheet_refresh(sheet, cursor_x, , cursor_x + , );//刷新CMD图层
}
}
}
harib15c:
1、回车键的响应:这里我们要让CMD窗口的回车键进行响应。这是CMD中实现命令的第一步啊!具体做法就是对输入的回车键进行判断,接着进行相关操作。
if (i == + 0x1c) { /* 回车键的键值 */
if (key_to != ) { /* 表示向CMD窗口发送数据 */
fifo32_put(&task_cons->fifo, + );//在CMD任务的缓冲区中写入10+256(其他能够区分的数据也行)
}
}
2、回车键的操作:接下来我们要修改CMD任务函数console-task我们再其中创建一个cursor_y变量,当按下回车键的时候,cursor_y增加16个像素(一个字符宽8高16像素)
void console_task(struct SHEET *sheet)
{ //......
for (;;) {
//.....
if (i == + ) { /* 从缓冲区取得i的值为10+256.Enter */
if (cursor_y < + ) {
/* CMD高度最大为28+112个像素 */
//先用一个空格填充光标的位置
putfonts8_asc_sht(sheet, cursor_x, cursor_y, COL8_FFFFFF, COL8_000000, " ", );
cursor_y += ;//竖直方向向下移动16个像素,(换行)
/* 先显示第一个字符‘>’ */
putfonts8_asc_sht(sheet, , cursor_y, COL8_FFFFFF, COL8_000000, ">", );
cursor_x = ; //水平方向也向右移动一个字符的位置
}
} //.....
}
}
harib15d:
上一步我们虽然实现了CMD对回车键的判断和反应,但当到了CMD窗口的最后一行,下面就没有更多的行了(其实窗口最高为140个像素)。下面我们要实现简单的CMD的窗口的滚动,要实现这个,我们只需要将所有的像素向上移动一行(16个像素)然后把最后一行涂黑就行了。
void console_task(struct SHEET *sheet)
{ //.....
for (;;) {
//.....
if (i == + ) {
/* Enter */
/* 用空格将光标擦除 */
putfonts8_asc_sht(sheet, cursor_x, cursor_y, COL8_FFFFFF, COL8_000000, " ", );
if (cursor_y < + ) { //cursor_y小于140,还没有到最后一行,换行
cursor_y += ; /* 换行 */
} else {
/* 这个时候,cursor_y>140需要进行滚动了 */
for (y = ; y < + ; y++) { //从第二行开始,都往上移动一行
for (x = ; x < + ; x++) {
//把下一行y+16的,重写写到上一行y,x的值相对不变
sheet->buf[x + y * sheet->bxsize] = sheet->buf[x + (y + ) * sheet->bxsize];
}
}
for (y = + ; y < + ; y++) {//把最后一行涂黑
for (x = ; x < + ; x++) {
sheet->buf[x + y * sheet->bxsize] = COL8_000000;
}
}
sheet_refresh(sheet, , , + , + );
}
/* 显示字符 '>' */
putfonts8_asc_sht(sheet, , cursor_y, COL8_FFFFFF, COL8_000000, ">", );
cursor_x = ;
}
//.....
}
}
harib15e:
mem命令:到这里为止,我们已经对CMD进行了一些准备工作,下面我们来实现第一个命令:mem命令。这个命令用来显示内存的情况。这里我们还把背景图层上显示的内容全部去掉了。
void console_task(struct SHEET *sheet, unsigned int memtotal)
{
char s[], cmdline[];
//.....
for (;;) {
//......
if ( <= i && i <= ) { /* 键盘的数据 */
if (i == + ) { //backspace
if (cursor_x > ) {
/* cursor_x光标向后移动8个像素 */
putfonts8_asc_sht(sheet, cursor_x, cursor_y, COL8_FFFFFF, COL8_000000, " ", );
cursor_x -= ;
}
} else if (i == + ) { //enter
/* 用空格擦除光标 */
putfonts8_asc_sht(sheet, cursor_x, cursor_y, COL8_FFFFFF, COL8_000000, " ", );
cmdline[cursor_x / - ] = ; //这里进行命令的判断,必须是cmd
cursor_y = cons_newline(cursor_y, sheet); //回车键之后得到新的cursor_y
/* 从这里开始执行CMD命令 */
if (cmdline[] == 'm' && cmdline[] == 'e' && cmdline[] == 'm' && cmdline[] == ) {
//下面输出内存信息
sprintf(s, "total %dMB", memtotal / ( * ));
putfonts8_asc_sht(sheet, , cursor_y, COL8_FFFFFF, COL8_000000, s, );
cursor_y = cons_newline(cursor_y, sheet);
sprintf(s, "free %dKB", memman_total(memman) / );
putfonts8_asc_sht(sheet, , cursor_y, COL8_FFFFFF, COL8_000000, s, );
cursor_y = cons_newline(cursor_y, sheet);
cursor_y = cons_newline(cursor_y, sheet);
} else if (cmdline[] != ) {
/* 命令错误的判断 */
putfonts8_asc_sht(sheet, , cursor_y, COL8_FFFFFF, COL8_000000, "Bad command.", );
cursor_y = cons_newline(cursor_y, sheet);
cursor_y = cons_newline(cursor_y, sheet);
}
//.....
}
}
}
harib15f:
CLS命令:清空屏幕,在linux中是clear.这里我们使用C语言的字符串比较函strcmmp(#include <string.h>)函数来进行输入命令的判断
void console_task(struct SHEET *sheet, unsigned int memtotal)
{ //.....
for (;;) {
//.....
if ( <= i && i <= ) { /* 键盘数据(通过任务A) */
//.....
} else if (strcmp(cmdline, "cls") == ) {
/* cls命令 */
for (y = ; y < + ; y++) { //这里做的事就是把整个窗口涂成黑色的
for (x = ; x < + ; x++) {
sheet->buf[x + y * sheet->bxsize] = COL8_000000;
}
}
sheet_refresh(sheet, , , + , + );
cursor_y = ;
//.....
}
}
《30天自制操作系统》18_day_学习笔记的更多相关文章
- 《30天自制操作系统》学习笔记--Mac下工具的使用
现在来介绍官网上下的工具怎么用首先是官网地址,书上有个注释上有:hrb.osask.jp 翻译成中文大概是这个样子滴. 上面有两个文件可以下载,一个是工具,一个是工具的源代码,很好的学习资料 下面把工 ...
- 《30天自制操作系统》学习笔记--Mac环境搭建
弄了三天了,终于弄好了,先说结果,就是作者在网站上放了os x的工具(hrb.osask.jp,也有linux下的工具,可以自己去下载),也就是说我白忙活了三天... 再说一下这几天都干啥了,主要是想 ...
- 《30天自制操作系统》学习笔记--番外篇之Mac环境下的工具介绍
这几天又有点不务正业了,书也没看,一直在搞这个破环境,尝试各种做法,网上各种垃圾信息,浪费了很多时间,说的基本都是废话,不过还是找到了一些,赶紧写下来,不然这个过几天又忘了 首先是环境,我用的是Max ...
- 《30天自制操作系统》读书笔记(5) GDT&IDT
梳理项目结构 项目做到现在, 前头的好多东西都忘了, 还是通过Makefile重新理解一下整个项目是如何编译的: 现在我们拥有这么9个文件: ipl10.nas InitialProgramLo ...
- 《30天自制操作系统》读书笔记(3) 引入C语言
这一次的学习相当曲折, 主要是因为粗心, Makefile里面的错误导致了文件生成出现各种奇奇怪怪的问题, 弄得心力交瘁, 因此制作过程还是尽量按着作者的路子来吧. 作者提供的源码的注释在中文系统下是 ...
- 《30天自制操作系统》读书笔记(2)hello, world
让系统跑起来 要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是06年出版的,可惜那时候没有电脑,没想到作者用的还是软盘,现在的电脑谁有软驱?不得已我使用一张128M的SD卡来代替,而事实 ...
- 30天自制操作系统第九天学习笔记(u盘软盘双启动版本)
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078 ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第九天的课程已学完,确实有点不想写 ...
- 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078 ,更多学习中的问题.资料,群里分享 developing environment:ubuntu 关于u盘启动自己做的操 ...
- 30天自制操作系统第八天学习笔记(u盘软盘双启动版本)
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078 ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第八天的学习思考: 关于鼠标是怎么 ...
- 《30天自制操作系统》笔记(03)——使用Vmware
<30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...
随机推荐
- [IBM DB2] db2 terminate 和 db2 connect reset 有什么区别?
[IBM DB2] db2 terminate 和 db2 connect reset 有什么区别? 总结:如果是退出编辑器 quit :如果是断开数据库连接释放资源 connect reset : ...
- 初识GO语言——安装Go语言
本文包括:1)安装Go语言.2)运行第一个Go语言.3)增加vim中对Go语言的高亮支持. 1.安装Go语言 本文采用源码安装Go语言,Go语言的源代码在百度网盘 http://pan.baidu.c ...
- .NET易忘备留 ORACLE存储过程调用
1.Oracle存储过程调用[返回信息,单体或者列表] public IResult FundBuild(string partnerId,string userId, DateTime beginD ...
- Redis常用命令(一)
Redis::__construct描述:创建一个Redis客户端范例:$redis = new Redis(); connect, open描述:实例连接到一个Redis.参数:host: stri ...
- iOS - JSON 数据解析
iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...
- 李洪强漫谈iOS开发[C语言-047]-数列求和
// // main.c // 53 - 数列求和 - 李洪强 // // Created by vic fan on 16/10/15. // Copyright © 2016年 李洪强. ...
- ado.net 修改,查询
修改: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- 关于padding与margin的区别
代码一:全为padding. <!doctype html><html><head> <meta charset="UTF-8"&g ...
- javaweb实验五
product类: package com.lab;public class Product { private int id; // 商品编号 private S ...
- JavaScript入门篇 第一天
使用<script>标签在HTML网页中插入JavaScript代码.注意, <script>标签要成对出现,并把JavaScript代码写在<script>< ...