Qianyu Operating System for future

我们把命令行窗口单独做成一个新的任务。 要实现字符输入,只要在键盘被按下的时候向console_task(命令行窗口任务)的FIFO发送数据即可。但要发送数据必须要知道struct FIFO的内存地址才行。 把 struct FIFO 放到 struct TASK里面。基本上没有什么任务是完全用不到FIFO的,,因此我们把它们绑定起来。

struct TASK {int sel, flags; // sel is used to save the index of GDTint priority;struct FIFO32 fifo;struct TSS32 tss;};

当前切换到命令行窗口时,系统会向命令行窗口任务发送键盘数据,支持一般的字符输入和退格键。由于在命令行窗口中也使用了定时器等,为了不与键盘数据冲突,我们在写入FIFO的时候将键盘数据的值加上256。

实现符号“!”和 “%”的输入。 我们要处理Shift键,Shift的按键编码为

Shift 按下 抬起

左 0x2a 0xaa

右 0x36 0xb6

我们准备一个 key_shift 变量, 当左Shift按下时置为1,右Shift按下时置为2,两个都不按时置为0,两个都按下时置为3。

(i == 256 + 0x2a) { // left Shift ONkey_shift |= 1;}if (i == 256 + 0x36) { // right Shift ONkey_shift |= 2;}if (i == 256 + 0xaa) { // left Shift OFFkey_shift &= ~1;}if (i == 256 + 0xb6) { // right Shift OFFkey_shift &= ~2;}if (key_shift == 0) {s[0] = keytable[i – 256];} else {s[0] = keytable1[i – 256];}

按下Shift键进行符号输入时,我们启用另一套键盘符号表。

再一个要实现小写字母的输入。

CapsLock 为 OFF & Shift 键为 OFF —— 小写英文字母 CapsLock 为 OFF & Shift 键为 ON —— 大写英文字母 CapsLock 为 ON & Shift 键为 OFF —— 大写英文字母 CapsLock 为 OFF & Shift 键为 ON —— 小写英文字母

所以需要我们知道CapsLock键的状态,我们已经在asmhead.nas中从BIOS获取到了键盘状态保存到了binfo->leds:

binfo->leds的第4位 —— ScrollLock状态 binfo->leds的第5位 —— NumLock状态

struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO;int key_leds = (binfo->leds >> 4) & 7; if (‘A’ <= s[0] && s[0] <= ‘Z’) { /* when the inputed char is English character */if (((key_leds & 4) == 0 && key_shift == 0) ||((key_leds & 4) != 0 && key_shift != 0)) {s[0] += 0x20; //change uppercase to lowercase}}

活在当下,别在怀念过去或者憧憬未来中浪费掉你现在的生活。

Qianyu Operating System for future

相关文章:

你感兴趣的文章:

标签云: