- 30天自制操作系統(tǒng)
- (日)川合秀實(shí)
- 809字
- 2020-03-11 14:01:53
7 從鼠標(biāo)接受數(shù)據(jù)(harib04g)
既然中斷已經(jīng)來了,現(xiàn)在就讓我們?nèi)〕鲋袛鄶?shù)據(jù)吧。前面已經(jīng)說過,鼠標(biāo)和鍵盤的原理幾乎相同,所以程序也就非常相似。
int.c節(jié)選
struct FIFO8 mousefifo; void inthandler2c(int *esp) /* 來自PS/2鼠標(biāo)的中斷 */ { unsigned char data; io_out8(PIC1_OCW2, 0x64); /* 通知PIC1 IRQ-12的受理已經(jīng)完成 */ io_out8(PIC0_OCW2, 0x62); /* 通知PIC0 IRQ-02的受理已經(jīng)完成 */ data = io_in8(PORT_KEYDAT); fifo8_put(&mousefifo, data); return; }
不同之處只有送給PIC的中斷受理通知。IRQ-12是從PIC的第4號(hào)(從PIC相當(dāng)于IRQ-08~I(xiàn)RQ-15),首先要通知IRQ-12受理已完成,然后再通知主PIC。這是因?yàn)橹?從PIC的協(xié)調(diào)不能夠自動(dòng)完成,如果程序不教給主PIC該怎么做,它就會(huì)忽視從PIC的下一個(gè)中斷請求。從PIC連接到主PIC的第2號(hào)上,這么做OK。
■■■■■
下面的鼠標(biāo)數(shù)據(jù)取得方法,居然與鍵盤完全相同。這不是筆者的失誤,而是事實(shí)。也許是因?yàn)殒I盤控制電路中含有鼠標(biāo)控制電路,才造成了這種結(jié)果。至于傳到這個(gè)設(shè)備的數(shù)據(jù),究竟是來自鍵盤還是鼠標(biāo),要靠中斷號(hào)碼來區(qū)分。
取得數(shù)據(jù)的程序如下所示:
bootpack.c節(jié)選
fifo8_init(&mousefifo, 128, mousebuf); for (; ; ) { io_cli(); if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == 0) { io_stihlt(); } else { if (fifo8_status(&keyfifo) ! = 0) { i = fifo8_get(&keyfifo); io_sti(); sprintf(s, "%02X", i); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s); } else if (fifo8_status(&mousefifo) ! = 0) { i = fifo8_get(&mousefifo); io_sti(); sprintf(s, "%02X", i); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 47, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s); } } }
因?yàn)槭髽?biāo)往往會(huì)比鍵盤更快地送出大量數(shù)據(jù),所以我們將它的FIFO緩沖區(qū)增加到了128字節(jié)。這樣,就算是一下子來了很多數(shù)據(jù),也不會(huì)溢出。
取得數(shù)據(jù)的程序中,如果鍵盤和鼠標(biāo)的FIFO緩沖區(qū)都為空了,就執(zhí)行HLT。如果不是兩者都空,就先檢查keyinfo,如果有數(shù)據(jù),就取出一個(gè)顯示出來。如果keyinfo是空,就再去檢查mouseinfo,如果有數(shù)據(jù),就取出一個(gè)顯示出來。很簡單吧。
到底能不能執(zhí)行呢?好緊張呀。我們來測試一下。運(yùn)行“make run”。

就像上面那樣,最初只顯示鼠標(biāo)發(fā)送過來的數(shù)據(jù),且內(nèi)容的確是FA。
隨便滾動(dòng)鼠標(biāo)一下,就會(huì)像下面這樣顯示出各種各樣的數(shù)據(jù)來。

如果按下鍵盤,當(dāng)然會(huì)像以前一樣,正常響應(yīng)。

看,運(yùn)行得很正常很不錯(cuò)呀。
好了,今天我們做的事已經(jīng)不少了,就先到這吧。明天我們來解讀鼠標(biāo)數(shù)據(jù),讓鼠標(biāo)指針在屏幕上動(dòng)起來。真期待呀。啊,今天就不要再往下讀了哦。先睡覺,明天再繼續(xù),好吧?
- Modern Web Testing with TestCafe
- Google系統(tǒng)架構(gòu)解密:構(gòu)建安全可靠的系統(tǒng)
- 大學(xué)計(jì)算機(jī)應(yīng)用基礎(chǔ)實(shí)踐教程(Windows 7+Office 2013)
- 蘋果電腦玩全攻略 OS X 10.8 Mountain Lion
- Linux網(wǎng)絡(luò)操作系統(tǒng)與實(shí)訓(xùn)(第三版)
- 精解Windows 8
- SharePoint 2013 應(yīng)用開發(fā)實(shí)戰(zhàn)
- Extending Bootstrap
- 深入理解eBPF與可觀測性
- 數(shù)據(jù)中心系統(tǒng)工程及應(yīng)用
- 移動(dòng)應(yīng)用UI設(shè)計(jì)模式(第2版)
- 8051軟核處理器設(shè)計(jì)實(shí)戰(zhàn)
- 一學(xué)就會(huì):Windows Vista應(yīng)用完全自學(xué)手冊
- Hands-On UX Design for Developers
- Red Hat Enterprise Linux 6.4網(wǎng)絡(luò)操作系統(tǒng)詳解