/* 已经在halibote中测试通过,系统修改过程如下 */
/* 第一步,在bootpack.h中在console.c段添加如下头文件内容 */
#define CMDHIS_NR 32
#define CMDBUF 1024
struct CMDHISTORY {
int first, last, head, tail, now;
char ** argv;
char *buf;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
/*第二步,修改console.c,在开头的定义中添加结构cmdhis及对应的缓冲区cmd_buf 定义 */
/*对结构体cmdhis进行初始化 */
/* 代码中略*/
struct CMDHISTORY cmdhis;
char cmd_buf[CMDBUF];
/* 代码中略*/
cmdhis.buf = cmd_buf;
cmdhis.argv = (char **)cmd_buf;
*cmdhis.argv = cmdhis.buf;
cmdhis.first = 0;
cmdhis.last = 0;
cmdhis.head = CMDHIS_NR * 4;
cmdhis.tail = 0; /* not use but we reserving it */
cmdhis.now = 0;
/* 代码中略 */
/* 在处理键盘接收数据的键盘值-回车键 */
} else if (i == 10 + 256) {
cons_putchar(&cons, ' ', 0);
cmdline[cons.cur_x / 8 - 2] = 0;
/* 在以下添加如下代码 */
if (cmdline[0] != 0) {
if (cmdhis.head+strlen(cmdline)+1 >= CMDBUF) {
cmdhis.head = CMDHIS_NR << 2;
}
if ((unsigned int)(cmdhis.buf + cmdhis.head) <=
(unsigned int)*(cmdhis.argv + cmdhis.last) &&
cmdhis.first != cmdhis.last) {
while ((unsigned int)(cmdhis.buf + cmdhis.head) +
strlen(cmdline) + 1 >
(unsigned int)*(cmdhis.argv + cmdhis.last)) {
if (++cmdhis.last == CMDHIS_NR) cmdhis.last = 0;
if (cmdhis.last == cmdhis.first) break;
}
}
strcpy(cmdhis.buf + cmdhis.head, cmdline);
*(cmdhis.argv + cmdhis.first) = cmdhis.buf + cmdhis.head;
cmdhis.head = cmdhis.head + strlen(cmdline) + 1;
cmdhis.now = cmdhis.first;
if(++cmdhis.first == CMDHIS_NR) cmdhis.first = 0;
if(cmdhis.last == cmdhis.first) {
if(++cmdhis.last == CMDHIS_NR) cmdhis.last = 0;
}
*(cmdhis.argv + cmdhis.first) = 0;
}
/* 回车键功能添加语句到此结束
cons_newline(&cons);
cons_runcmd(cmdline, &cons, fat, memtotal);
cons_putchar(&cons, '>', 1);
/* 下面的两个分支就是添加的处理向上方向键及向下方向键语句 */
/* 语句模仿console中回车键的处理,即由bootpack.c中将接收到的向上方向键、向下方向键
转化为,18和20后然后再在下面的语句中对18和20进行分别处理 */
} else if (i == 18 + 256 && (*(cmdhis.argv+cmdhis.now) != 0)) {
cmdhis.now--;
if(cmdhis.first < cmdhis.last && cmdhis.now < 0)
cmdhis.now = CMDHIS_NR-1;
if(cmdhis.now < cmdhis.last)
cmdhis.now = cmdhis.last;
if(*(cmdhis.argv+cmdhis.now) != 0) {
while(cons.cur_x > 16) {
cons_putchar(&cons, ' ', 0);
cons.cur_x -= 8;
}
cons_putstr0(&cons, *(cmdhis.argv + cmdhis.now));
strcpy(cmdline, *(cmdhis.argv+cmdhis.now));
}
} else if (i == 20 + 256 && (*(cmdhis.argv+cmdhis.now) != 0)) {
cmdhis.now++;
if(cmdhis.now == cmdhis.first) cmdhis.now--;
if(cmdhis.now == CMDHIS_NR){
if(cmdhis.first == 0) {
cmdhis.now--;
}else {
cmdhis.now = 0;
}
}
if(*(cmdhis.argv+cmdhis.now) != 0) {
while(cons.cur_x > 16) {
cons_putchar(&cons, ' ', 0);
cons.cur_x -= 8;
}
cons_putstr0(&cons, *(cmdhis.argv + cmdhis.now));
strcpy(cmdline, *(cmdhis.argv+cmdhis.now));
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
/* 第三步,修改 bootpack.c文件
首先就是修改键盘编码。不知道诸位在之前使用过程中发现没有,书上给出的键盘处理有些键盘值和
我们现在使用的稍微有所不同。因为作者使用的日文键盘的缘故吧,于是我对照我的键盘改了下。
其实对于键盘修改,如果只需要实现向上向下方向键调出历史命令的话。
那么只需要将static char keytable0[0x80] 中的第0x48位及0x50位改为0即可。
keytable1都不用改,毕竟我们这里只是实验而已。这里如果不改的话也可以,只是显示。。。
不改键盘码也可以,只是显示的时候稍微有点问题,在显示命令的前面会有数字。
当然此次对应键盘编码不只是方向键还有一些之前日文键盘对应字符我也改了一下位置。
*/
static char keytable0[0x80] = {
0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 0, 0,
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '[', ']', 0, 0, 'A', 'S',
'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', '\'', '`', 0, '\\', 'Z', 'X', 'C', 'V',
'B', 'N', 'M', ',', '.', '/', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, '7', 0, '9', '-', '4', '5', '6', '+', '1',
0, '3', '0', '.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0x5c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x5c, 0, 0,
};
static char keytable1[0x80] = {
0, 0, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 0, 0,
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', 0, 0, 'A', 'S',
'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '~', 0, '|', 'Z', 'X', 'C', 'V',
'B', 'N', 'M', '<', '>', '?', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1',
'2', '3', '0', '.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, '_', 0, 0, 0, 0, 0, 0, 0, 0, 0, '|', 0, 0
};
/* 代码中略*/
/* 在处理键盘数据中*/
if (i == 256 + 0x46) {/* ScrollLokc */
key_leds ^= 1;
fifo32_put(&keycmd, KEYCMD_LED);
fifo32_put(&keycmd, key_leds);
}
/* 在处理 ScrollLokc 键的后面添加如下两个键盘处理分支语句即可 */
if (i == 256 + 0x48) {
if (key_to != 0) fifo32_put(&task_cons->fifo, 18 + 256);
}
if (i == 256 + 0x50) {
if (key_to != 0) fifo32_put(&task_cons->fifo, 20 + 256);
}
/* 代码中略*/
/* 如上处理后即可使用命令历史记录了 ,当然基本功能有了。还需要改进,加油 */