我們將返回有關如何創建自己的操作系統的系列教程。 我想您會非常喜歡本章,因為我們最終可以與我們的操作系統進行交互。 今天,我們將閱讀鍵盤輸入。 為此,該方案類似於計時器的方案。 無論如何,我們都必須使用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); if(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代碼中。
目前,它不能作為單獨的程序運行,而是作為內核調用的函數運行,主要是因為我們尚未添加運行可執行程序的選項。 當然,還有一些有關外殼如何與新的鍵盤輸入功能一起工作的圖片。