发布于 

30天自制操作系统(18)

DAY18_dir命令

1.控制光标闪烁(1)

  • 在Windows中,只有可以接受键盘输入的窗口有光标闪烁,而其他的窗口中是不显示光标的。
  • 对HariMain进行改写
    /*从此开始*/ if (cursor_c >= 0) { 
boxfill8(sht_win->buf, sht_win->bxsize, cursor_c, cursor_x, 28, cursor_x + 7, 43);
/*到此结束*/ }
sheet_refresh(sht_win, cursor_x, 28, cursor_x + 8, 44);
} else if (512 <= i && i <= 767) { /*鼠标数据*/
(中略)
} else if (i <= 1) { /*光标用定时器*/
/*从此开始*/ if (i != 0) {
timer_init(timer, &fifo, 0); /*下次置0 */
if (cursor_c >= 0) {
cursor_c = COL8_000000;
}
} else {
timer_init(timer, &fifo, 1); /*下次置1 */
if (cursor_c >= 0) {
cursor_c = COL8_FFFFFF;
}
}
timer_settime(timer, 50);
if (cursor_c >= 0) {
boxfill8(sht_win->buf, sht_win->bxsize, cursor_c, cursor_x, 28, cursor_x +
7, 43);
sheet_refresh(sht_win, cursor_x, 28, cursor_x + 8, 44);
/*到此结束*/ }
}
}
}
}

2.控制光标闪烁(2)

  • 实现命令行窗口中光标闪烁的控制。
  • 像传递按键编码一样,我们可以使用FIFO来实现。
  • 我们先将光标开始闪烁定义为2,停止闪烁定义为3。

3.对回车键的支持

  • 应该对输入的字符进行判断,然后执行相应的命令

    /*从此开始*/ if (i == 256 + 0x1c) { /*回车键*/
    if (key_to != 0) { /*发送至命令行窗口*/
    fifo32_put(&task_cons->fifo, 10 + 256);
    }
    /*到此结束*/ }

4.对窗口滚动的支持

void console_task(struct SHEET *sheet) 
{
(中略)
int x, y;
(中略)
for (;;) {
io_cli();
if (fifo32_status(&task->fifo) == 0) {
(中略)
} else {
(中略)
if (256 <= i && i <= 511) { /*键盘数据(通过任务A) */
if (i == 8 + 256) {
/*退格键*/
(中略)
} else if (i == 10 + 256) {
/* Enter */
/*用空格将光标擦除*/
putfonts8_asc_sht(sheet, cursor_x, cursor_y, COL8_FFFFFF, COL8_000000, " ", 1);
/*从此开始 */ if (cursor_y < 28 + 112) {
cursor_y += 16; /*换行*/
} else {
/*滚动*/
for (y = 28; y < 28 + 112; y++) {
for (x = 8; x < 8 + 240; x++) {
sheet->buf[x + y * sheet->bxsize] = sheet->buf[x + (y + 16) *
sheet->bxsize];
}
}
for (y = 28 + 112; y < 28 + 128; y++) {
for (x = 8; x < 8 + 240; x++) {
sheet->buf[x + y * sheet->bxsize] = COL8_000000;
}
}
sheet_refresh(sheet, 8, 28, 8 + 240, 28 + 128);
}
/*显示提示符*/
putfonts8_asc_sht(sheet, 8, cursor_y, COL8_FFFFFF, COL8_000000, ">", 1);
/*到此为止*/ cursor_x = 16;
} else {
/*一般字符*/
(中略)
}
}
(中略)
}
}
}

5.mem命令

我们已经实现了屏幕滚动,现在该是到了让它执行命令的时候了。
mem命令就是memeory的缩写,也就是用来显示内存使用情况的命令。


  • 介绍一下重点。首先我们添加了memtotal和memman两个变量,它们是执行mem命令所必需的。关于memtotal,我们采用和sheet相同的方法从HariMain传递过来,因此我们还要改写一下HariMain。
  • 我们还添加了一个cmdline变量,也就是“命令行”(command line)的缩写。这个变量用来记录通过键盘输入的内容,在“键盘数据”处理的“一般字符”部分,将输入的内容顺次累积起来。

6.cls命令

  • 这个命令的作用是清除屏幕上的内容,也就是“clear screen”(清屏)的缩写。顺便补充个小知识,在Linux中清屏命令是“clear”。
    代码精简:
    if (c[0] == 'm' && c[1] == 'e' && c[2] == 'm' && c[3] == 0) {
    改成:
    if (strcmp(cmdline, "mem") == 0) {
    strcmp这个函数,只要声明#include即可使用,因此在bootpack.c中我们也要用它。

7. dir命令

  • 我们的目标是制作可执行文件(比如.exe)来让它运行。
  • 过在此之前,我们先来制作一个显示磁盘内文件名称的命令吧。
  • dir指令除了会显示文件名,还会显示文件的日期和大小。