我们返回有关如何创建自己的操作系统的系列教程。 我想您会非常喜欢本章,因为我们最终可以与我们的操作系统进行交互。 今天,我们将阅读键盘输入。 为此,该方案类似于计时器的方案。 无论如何,我们都必须使用IRQ,因此我们将与计时器一样开始。
ND_IRQ_InstallHandler(1,和ND_Keyboard_Handler);
但是,我们的键盘处理程序要复杂一些,因为我们正在读取按键并将其存放在缓冲区中。
extern“ C” void ND_Keyboard_Handler(struct regs * r){unsigned char scancode = ND :: Keyboard :: GetChar(); if(scancode!= 255){ND ::屏幕:: PutChar(scancode); stringBuffer [stringPos] =扫描码; stringPos ++; }}
http://gist.github.com/634afddcb3e977ea202d
我们可以检查一下如何调用名为ND :: Keyboard :: GetChar的函数。 在那里我们获得了字符,然后如果它不是一个空字符(在这里我使用了255,我们将不得不使用一个更好的系统),我们将该字符放在屏幕上,并将其存储在简单的char缓冲区中(这也是易于改进,当前系统可能会溢出)。
nsigned char ND ::键盘:: GetChar(){unsigned char scancode; scancode =(unsigned char)ND ::端口:: InputB(0x60); 如果(scancode和ND_KEYBOARD_KEY_RELEASE){返回255; } else {返回en_US [scancode]; }} char * ND ::键盘:: GetString(){while(stringBuffer [stringPos-1]!='\ n'){} stringPos = 0; 返回stringBuffer; }
http://gist.github.com/2d4f13e0b1a281c66884
在这里,我们可以看到如何获得已按下的键。 在0x60处,总是会按下最后一个键。 实际上,可以直接读取它,而不必使用IRQ,但是,我们将不知道如何识别何时发生更改。 在那里,我们使用AND操作检查我们获得的代码是否对应于已释放的密钥。
在这种情况下,我们返回255(因为稍后将忽略它),否则按下了该键。 在这种情况下,我们返回称为en_US的数组的位置。 该数组包含哪些信息? 这个数组就是我们所谓的键盘映射或字符映射。 如您所知,不同的语言具有不同的键盘,并且不支持它们,因为它们会覆盖按键。 因此,en_US将为我们提供与每个代码相对应的键,并且可以在美国键盘上使用。
unsigned char en_US [128] = {0,27,'1','2','3','4','5','6','7','8','9','0 ','-','=','\ b','\ t','q','w','e','r','t','y','u','i ','o','p','[',']','\ n',0,/ * Ctrl * /'a','s','d','f','g', 'h','j','k','l',';','\'',''',0,/ *左移* /'\\','z','x', 'c','v','b','n','m',',','。','/',0,/ *右移* /'*',0,/ * Alt * /'',0,/ *大写锁定* / 0,0,0,0,0,0,0,0,0,0,/ * F1-F10键* / 0,/ *数字锁定* / 0, / *滚动锁定* / 0,/ *主页键* / 0,/ *向上箭头* / 0,/ *页面向上* /'-',0,/ *左箭头* / 0,0,/ *右箭头* /'+',0,/ *结束键* / 0,/ *向下箭头* / 0,/ *向下翻页* / 0,/ *插入键* / 0,/ *删除键* / 0,0,0, 0,0,11,/ * F12-F0键* / XNUMX};
http://gist.github.com/bf52085aec05f3070b65
还有一个定义的函数,带有一个短语。 目的只是为了更轻松地从需要它的应用程序(目前只有一个)访问字符串。 我说的是NextShellLite,它是NextDivel可能的未来Shell的简化版本。 NextShellLite的目的仅仅是提供一种精简的外壳,以逐步测试新功能。 我不会将shell代码放在这里,而是将其包含在NextDivel代码中。
目前,它不能作为单独的程序运行,而是作为内核调用的函数运行,主要是因为我们尚未添加运行可执行程序的选项。 当然,还有一些有关外壳如何与新的键盘输入功能一起工作的图片。