Revenim la seria de tutoriale despre cum să ne creăm propriul sistem de operare. Presupun că vă va plăcea mult acest capitol, deoarece putem interacționa în cele din urmă cu sistemul nostru de operare. Astăzi vom citi introducerea tastaturii. Pentru aceasta, schema este similară cu cea a temporizatorului. Trebuie să folosim oricum IRQ-uri, așa că vom începe la fel ca și cu temporizatorul.
ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);
Cu toate acestea, dispozitivul nostru de gestionare a tastaturii este ceva mai complex, deoarece citim tastele și le depunem într-un buffer.
extern "C" void ND_Keyboard_Handler (struct regs * r) {unsigned char scancode = ND :: Keyboard :: GetChar (); if (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = cod de cod; stringPos ++; }}
http://gist.github.com/634afddcb3e977ea202d
Putem verifica modul în care numim o funcție numită ND :: Keyboard :: GetChar. Acolo obținem caracterul și apoi dacă nu este un caracter gol (aici am folosit 255, ar trebui să folosim un sistem mai bun), așezăm caracterul pe ecran și îl stocăm într-un buffer simplu de caractere (acesta este și susceptibil de îmbunătățire, sistemul actual se poate revărsa).
nsigned char ND :: Tastatura :: GetChar () {cod de cod de caractere nesemnat; scancode = (caractere nesemnate) ND :: Porturi :: InputB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {return 255; } else {return en_US [scancode]; }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; returnează stringBuffer; }
http://gist.github.com/2d4f13e0b1a281c66884
Aici putem vedea cum se obține tasta care a fost apăsată. La 0x60 va exista întotdeauna ultima tastă apăsată. De fapt, poate fi citit direct fără a fi nevoie să utilizați IRQ, dar atunci nu vom ști cum să identificăm când a avut loc o modificare. Acolo verificăm cu operațiunea ȘI dacă codul pe care l-am obținut corespunde unei chei care a fost eliberată.
În acest caz, returnăm 255 (pentru că îl vom ignora mai târziu) și în caz contrar, tasta a fost apăsată. În acest caz, returnăm poziția unui tablou numit en_US. Ce informații conține această matrice? Această matrice este ceea ce am numi o hartă de taste sau o hartă de caractere. După cum știți, diferite limbi au tastaturi diferite și nu sunt acceptate deoarece suprascriu tastele. Deci en_US ne va da cheia corespunzătoare fiecărui cod și va funcționa pe o tastatură americană.
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, / * Stânga Shift * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Shift dreapta * / '*', 0, / * Alt * / '', 0, / * Blocare majuscule * / 0,0,0,0,0,0,0,0,0,0, / * Taste F1-F10 * / 0, / * Num lock * / 0, / * Blocare defilare * / 0, / * Tasta Acasă * / 0, / * Săgeată sus * / 0, / * Pagină sus * / '-', 0, / * Săgeată stânga * / 0, 0, / * Săgeată dreapta * / '+', 0, / * Tasta de terminare * / 0, / * Săgeata în jos * / 0, / * Pagină în jos * / 0, / * Tasta Insert * / 0, / * Tasta Delete * / 0,0,0, 0, 0, 11, / * Taste F12-F0 * / XNUMX};
http://gist.github.com/bf52085aec05f3070b65
A existat, de asemenea, o funcție definită care a primit o frază. Scopul este pur și simplu să accesați mai ușor șirurile din aplicațiile care au nevoie de el, momentan doar unul. Vorbesc despre NextShellLite, o versiune redusă a posibilului viitor shell pe care ar avea NextDivel. Scopul NextShellLite este doar de a oferi un shell redus pentru a testa treptat funcționalități noi. Nu am de gând să pun codul shell aici, dar l-am inclus în codul NextDivel.
În acest moment nu funcționează ca un program separat, ci ca o funcție numită de kernel, în principal pentru că nu am adăugat încă opțiunea de a rula executabile. Și, desigur, câteva imagini despre modul în care funcționează shell-ul cu noile funcții de intrare de la tastatură.