Връщаме се към поредицата уроци за това как да създадем наша собствена операционна система. Предполагам, че тази глава ще ви хареса много, защото най-накрая можем да взаимодействаме с нашата операционна система. Днес ще прочетем въвеждането от клавиатурата. За това схемата е подобна на тази на таймера. Все пак трябва да използваме 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 :: Screen :: PutChar (scancode); stringBuffer [stringPos] = код за сканиране; stringPos ++; }}
http://gist.github.com/634afddcb3e977ea202d
Можем да проверим как извикваме функция, наречена ND :: Keyboard :: GetChar. Там получаваме символа и след това, ако той не е празен знак (тук съм използвал 255, ще трябва да използваме по-добра система), поставяме символа на екрана и го съхраняваме в обикновен буфер от символи (това също е податливо на подобрение, текущата система може да прелее).
nsigned char ND :: Клавиатура :: GetChar () {неподписан код за сканиране на char; scancode = (неподписан знак) ND :: Ports :: InputB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {return 255; } else {връщане en_US [scancode]; }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; връщане stringBuffer; }
http://gist.github.com/2d4f13e0b1a281c66884
Тук можем да видим как се получава клавишът, който е бил натиснат. При 0x60 винаги ще има последния натиснат бутон. Всъщност може да се чете директно, без да се налага да се използва IRQ, но тогава няма да знаем как да идентифицираме кога е настъпила промяна. Там проверяваме с операцията И, че полученият от нас код съответства на ключ, който е бил освободен.
В този случай връщаме 255 (защото ще го игнорираме по-късно) и в противен случай клавишът е бил натиснат. В този случай връщаме позицията на масив, наречен en_US. Каква информация съдържа този масив? Този масив е това, което бихме нарекли карта на клавишите или карта на символите. Както знаете, различните езици имат различни клавиатури и не се поддържат, тъй като те презаписват клавишите. Така че en_US ще ни даде ключа, съответстващ на всеки код, и ще работи на американска клавиатура.
неподписан 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, / * Ляв Shift * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Дясна смяна * / '*', 0, / * Alt * / ", 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10 бутони * / 0, / * Num lock * / 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 би имал. Целта на NextShellLite е само да осигури намалена обвивка за постепенно тестване на нови функционалности. Няма да поставя кода на черупката тук, но съм го включил в кода на NextDivel.
В момента тя не работи като отделна програма, а като функция, извикана от ядрото, главно защото все още не сме добавили опцията за стартиране на изпълними файлове. И разбира се, няколко снимки на това как черупката работи с новите функции за въвеждане на клавиатура.