Vraciame sa k sérii návodov, ako vytvoriť náš vlastný operačný systém. Predpokladám, že sa vám táto kapitola bude veľmi páčiť, pretože konečne môžeme komunikovať s našim operačným systémom. Dnes si prečítame vstup z klávesnice. Z tohto dôvodu je schéma podobná schéme časovača. IRQ musíme aj tak použiť, takže začneme rovnako ako s časovačom.
ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);
Náš ovládač klávesnice je však o niečo zložitejší, pretože čítame kľúče a ukladáme ich do medzipamäte.
extern "C" void ND_Keyboard_Handler (struct regs * r) {unsigned char scancode = ND :: Keyboard :: GetChar (); if (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = skenovací kód; stringPos ++; }}
http://gist.github.com/634afddcb3e977ea202d
Môžeme skontrolovať, ako voláme funkciu s názvom ND :: Keyboard :: GetChar. Tam získame znak a potom, ak nejde o prázdny znak (tu som použil 255, museli by sme použiť lepší systém), vložíme znak na obrazovku a uložíme ho do jednoduchej vyrovnávacej pamäte znakov (aj to je možné vylepšiť, súčasný systém môže pretekať).
nsigned char ND :: Keyboard :: GetChar () {unsigned char scancode; scancode = (nepodpísaný znak) ND :: Porty :: InputB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {návrat 255; } else {return en_US [scancode]; }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; return stringBuffer; }
http://gist.github.com/2d4f13e0b1a281c66884
Tu vidíme, ako sa získa stlačený kláves. Pri 0x60 bude vždy posledné stlačené tlačidlo. V skutočnosti sa dá prečítať priamo bez nutnosti použitia IRQ, ale potom nebudeme vedieť, ako identifikovať, keď došlo k zmene. Tam pomocou operácie AND skontrolujeme, či kód, ktorý sme získali, zodpovedá uvoľnenému kľúču.
V takom prípade vrátime 255 (pretože to budeme neskôr ignorovať) a inak bola klávesa stlačená. V takom prípade vrátime pozíciu poľa s názvom en_US. Aké informácie obsahuje toto pole? Toto pole by sme nazvali mapa kláves alebo mapa znakov. Ako viete, rôzne jazyky majú rôzne klávesnice a nie sú podporované, pretože klávesy prepisujú. Takže en_US nám dá kľúč zodpovedajúci každému kódu a bude fungovať na americkej klávesnici.
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, / * Ľavý posun * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * pravý posun * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * klávesy F1-F10 * / 0, / * Num lock * / 0, / * Scroll lock * / 0, / * kláves Home * / 0, / * šípka hore * / 0, / * stránka nahor * / '-', 0, / * šípka doľava * / 0, 0, / * šípka doprava * / '+', 0, / * kláves Koniec * / 0, / * šípka nadol * / 0, / * stránka nadol * / 0, / * kláves Vložiť * / 0, / * kláves Delete * / 0,0,0, 0, 0, 11, / * klávesy F12-F0 * / XNUMX};
http://gist.github.com/bf52085aec05f3070b65
Existovala tiež definovaná funkcia, ktorá dostala frázu. Účelom je jednoducho uľahčiť prístup k reťazcom z aplikácií, ktoré to potrebujú, v súčasnosti iba k jednému. Hovorím o NextShellLite, zmenšenej verzii možného budúceho shellu, ktorý by NextDivel mal. Účelom NextShellLite je iba poskytnúť zmenšený shell na postupné testovanie nových funkcií. Nebudem sem dávať shell kód, ale zahrnul som ho do kódu NextDivel.
Momentálne to nefunguje ako samostatný program, ale ako funkcia volaná jadrom, hlavne preto, že sme ešte nepridali možnosť spúšťať spustiteľné súbory. A samozrejme niekoľko obrázkov toho, ako shell pracuje s novými vstupnými funkciami klávesnice.