第7天 FIFO與鼠標控制
1 獲取按鍵編碼(harib04a)
今天我們繼續加油吧。鼠標不動的原因已經大體弄清楚了,主要是由于設定不到位。但是,在解決鼠標問題之前,還是先利用鍵盤多練練手,這樣更易于鼠標問題的理解。
現在,只要在鍵盤上按一個鍵,就會在屏幕上顯示出信息,其他的我們什么都做不了。我們將程序改善一下,讓程序在按下一個鍵后不結束,而是把所按鍵的編碼在畫面上顯示出來,這樣就可以切實完成中斷處理程序了。
我們要修改的,是int.c程序中的inthandler21函數,具體如下:
int.c節選
#define PORT_KEYDAT 0x0060 void inthandler21(int *esp) { struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; unsigned char data, s[4]; io_out8(PIC0_OCW2, 0x61); /* 通知PIC"IRQ-01已經受理完畢" */ data = io_in8(PORT_KEYDAT); sprintf(s, "%02X", data); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s); return; }
■■■■■
首先請把目光轉移到“io_out8(PIC0_OCW2, 0x61); ”這句話上。這句話用來通知PIC“已經知道發生了IRQ1中斷哦”。如果是IRQ3,則寫成0x63。也就是說,將“0x60+IRQ號碼”輸出給OCW2就可以。執行這句話之后,PIC繼續時刻監視IRQ1中斷是否發生。反過來,如果忘記了執行這句話,PIC就不再監視IRQ1中斷,不管下次由鍵盤輸入什么信息,系統都感知不到了。
相關內容在最下面的“致偷懶者”(ものぐさなあなたのために)附近。

下面我們應該注意,從編號為0x0060的設備輸入的8位信息是按鍵編碼。編號為0x0060的設備就是鍵盤。為什么是0x0060呀?要想搞懂這個問題,還是得問IBM的大叔們這都是他們定的,筆者也不太清楚原因。
■■■■■
程序所完成的,是將接收到的按鍵編碼顯示在畫面上,然后結束中斷處理。這里沒什么難點……那好,我們運行一下“make run”。然后按下“A”鍵,哦,按鍵編碼乖乖地顯示出來了!

大家可以做各種嘗試,比如按下“B”鍵,按下回車鍵等。鍵按下去之后,隨即就會顯示出一個數字(十六進制)來,鍵松開之后也會顯示出一個數字。所以,計算機不光知道什么時候按下了鍵,還知道什么時候把鍵松開了。這種特性最適合于開發游戲了。不錯不錯,心滿意足。
- Linux設備驅動開發詳解(第2版)
- Linux網絡管理與配置(第2版)
- Linux內核完全注釋(20周年版·第2版)
- 大學計算機應用基礎實踐教程(Windows 7+Office 2013)
- VMware Horizon View 6 Desktop Virtualization Cookbook
- Ubuntu Linux操作系統
- SharePoint 2013 WCM Advanced Cookbook
- 深入理解eBPF與可觀測性
- Instant Optimizing Embedded Systems using Busybox
- 嵌入式系統原理及開發
- CentOS 6 Linux Server Cookbook
- 分布式高可用架構之道
- 統信UOS應用開發進階教程
- OpenVZ Essentials
- Windows10開發入門經典