30天自制操作系统
上QQ阅读APP看书,第一时间看更新

第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”键,按下回车键等。键按下去之后,随即就会显示出一个数字(十六进制)来,键松开之后也会显示出一个数字。所以,计算机不光知道什么时候按下了键,还知道什么时候把键松开了。这种特性最适合于开发游戏了。不错不错,心满意足。