3 对回车键的支持(harib15c)
既然大家精神振奋,那就让我们一鼓作气继续前进吧。
现在的命令行窗口里面,按下回车键是完全没有反应的,我们得让它对回车键进行响应才行。具体应该如何响应呢?暂且只要简单地换个行就好了。实际上,这里应该对输入的字符进行判断,然后执行相应的命令才对,不过一上来就搞这个也太难了点,笔者的讲解会跟不上的,因此我们还是先不管什么命令了,全部直接忽略掉吧。
■■■■■
我们先修改一下HariMain,使其在按下回车键时向命令行窗口发送10+256这个值。之所以用10,是因为用于控制换行的ASCII码就是10,我们在这里照搬一下而已。当然,如果你喜欢用别的值,也是完全没有问题的哦。
本次的bootpack.c节选
void HariMain(void)
{
(中略)
for (;;) {
(中略)
if (fifo32_status(&fifo) == 0) {
(中略)
} else {
(中略)
if (256 <= i && i <= 511) { /*键盘数据*/
(中略)
/*从此开始*/ if (i == 256 + 0x1c) { /*回车键*/
if (key_to != 0) { /*发送至命令行窗口*/
fifo32_put(&task_cons->fifo, 10 + 256);
}
/*到此结束*/ }
(中略)
} else if (512 <= i && i <= 767) { /*鼠标数据*/
(中略)
} else if (i <= 1) { /*光标用定时器*/
(中略)
}
}
}
}
然后我们还要修改用来接收数据的console_task。之前我们已经有了一个cursor_x变量,按照这个样子再创建一个cursor_y变量,当按下回车键时,将cursor_y加1就可以了。
本次的bootpack.c节选
void console_task(struct SHEET *sheet)
{
struct TIMER *timer;
struct TASK *task = task_now();
int i, fifobuf[128], cursor_x = 16, cursor_y = 28, cursor_c = -1; /*这里!*/
(中略)
for (;;) {
io_cli();
if (fifo32_status(&task->fifo) == 0) {
(中略)
} else {
i = fifo32_get(&task->fifo);
io_sti();
(中略)
if (256 <= i && i <= 511) { /*键盘数据(通过任务A)*/
if (i == 8 + 256) {
/*退格键*/
(中略)
/*从此开始*/ } else if (i == 10 + 256) {
/*回车键*/
if (cursor_y < 28 + 112) {
/*用空格将光标擦除*/
putfonts8_asc_sht(sheet, cursor_x, cursor_y, COL8_FFFFFF, COL8_000000, " ", 1);
cursor_y += 16;
/*显示提示符*/
putfonts8_asc_sht(sheet, 8, cursor_y, COL8_FFFFFF, COL8_000000, ">", 1);
cursor_x = 16;
/*到此结束*/ }
} else {
/*一般字符*/
(中略)
}
}
/*重新显示光标*/
if (cursor_c >= 0) {
/*这里! */ boxfill8(sheet->buf, sheet->bxsize, cursor_c, cursor_x, cursor_y, cursor_x + 7, cursor_y + 15);
}
sheet_refresh(sheet, cursor_x, cursor_y, cursor_x + 8, cursor_y + 16); /*这里!*/
}
}
}
好,改成这样差不多了,到底能不能成功呢?我们还是照常“make run”一下。
换行成功了哦!
我们又成功了,耶!