חיקוי לינוס טורבלדס: צור מערכת הפעלה משלך מאפס (VIII)

אנו חוזרים לסדרת ההדרכות כיצד ליצור מערכת הפעלה משלנו. אני מניח שתאהב מאוד את הפרק הזה כי סוף סוף נוכל לקיים אינטראקציה עם מערכת ההפעלה שלנו. היום נקרא את קלט המקלדת. לשם כך התוכנית דומה לזו של הטיימר. עלינו להשתמש ב- IRQ בכל מקרה אז נתחיל כמו עם הטיימר.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

המטפל במקלדת שלנו, לעומת זאת, מורכב מעט יותר מכיוון שאנו קוראים את המקשים ומפקידים אותם במאגר.

חיצוני "C" בטל ND_Keyboard_Handler (struct regs * r) {char scancode לא חתום = ND :: מקלדת :: GetChar (); אם (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = scancode; stringPos ++; }}

http://gist.github.com/634afddcb3e977ea202d

אנו יכולים לבדוק כיצד אנו קוראים לפונקציה הנקראת ND :: מקלדת :: GetChar. שם אנו משיגים את הדמות ואז אם לא מדובר בתו ריק (כאן השתמשתי ב- 255, היינו צריכים להשתמש במערכת טובה יותר) שמנו את הדמות על המסך ואחסנו אותה במאגר פשוט של תווים (זה גם רגישים לשיפור, המערכת הנוכחית עשויה לעלות על גדותיהם).

nsigned char ND :: מקלדת :: GetChar () {scancode char לא חתום; scancode = (char לא חתום) ND :: יציאות :: InputB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {return 255; } אחר {return 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 ייתן לנו את המפתח המתאים לכל קוד והוא יעבוד על מקלדת אמריקאית.

לא חתום 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 Left * /' \\ ',' 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, / * נעילת מספר * / 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.

כרגע זה לא עובד כתוכנית נפרדת אלא כפונקציה שנקראת על ידי הליבה, בעיקר בגלל שעדיין לא הוספנו את האפשרות להריץ הפעלות. וכמובן, כמה תמונות של איך הקליפה עובדת עם פונקציות קלט המקלדת החדשות.

NextShellLite


הוסף כמקור מועדף בגוגל