官术网_书友最值得收藏!

第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”鍵,按下回車鍵等。鍵按下去之后,隨即就會顯示出一個數字(十六進制)來,鍵松開之后也會顯示出一個數字。所以,計算機不光知道什么時候按下了鍵,還知道什么時候把鍵松開了。這種特性最適合于開發游戲了。不錯不錯,心滿意足。

主站蜘蛛池模板: 凌云县| 毕节市| 钟山县| 拉孜县| 阜康市| 昌江| 沙坪坝区| 边坝县| 新闻| 香格里拉县| 平遥县| 神木县| 温泉县| 德化县| 体育| 内黄县| 土默特左旗| 卢龙县| 新干县| 新闻| 开化县| 江北区| 乾安县| 湖南省| 泽州县| 启东市| 南召县| 关岭| 康马县| 故城县| 海阳市| 甘泉县| 桐乡市| 镇赉县| 广州市| 天水市| 盐津县| 宜兰市| 乌兰察布市| 同江市| 通辽市|