一、鼠标控制
1、从FIFO中取数据
void inthandler2c(int *esp)
/* PS/2マウスからの割り込み */
{
unsigned char data;
io_out8(PIC1_OCW2, 0x64); /* IRQ-12受付完了をPIC1に通知 */
io_out8(PIC0_OCW2, 0x62); /* IRQ-02受付完了をPIC0に通知 */
data = io_in8(PORT_KEYDAT);
fifo8_put(&mousefifo, data);
return;
}
fifo8_get(&mousefifo);
2、组织和处理取得的数据
三个字节组成一组,即buf[0]、buf[1]、buf[2]。
buf[1]、buf[2]与X、Y坐标相关的,基本可以直接使用。buf[0]是与鼠标状态相关的内容
int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat)
{
if (mdec->phase == 0) {
/* マウスの0xfaを待っている段階 */
if (dat == 0xfa) {
mdec->phase = 1;
}
return 0;
}
if (mdec->phase == 1) {
/* マウスの1バイト目を待っている段階 */
if ((dat & 0xc8) == 0x08) {
/* 正しい1バイト目だった */
mdec->buf[0] = dat;
mdec->phase = 2;
}
return 0;
}
if (mdec->phase == 2) {
/* マウスの2バイト目を待っている段階 */
mdec->buf[1] = dat;
mdec->phase = 3;
return 0;
}
if (mdec->phase == 3) {
/* マウスの3バイト目を待っている段階 */
mdec->buf[2] = dat;
mdec->phase = 1;
mdec->btn = mdec->buf[0] & 0x07;
mdec->x = mdec->buf[1];
mdec->y = mdec->buf[2];
if ((mdec->buf[0] & 0x10) != 0) {
mdec->x |= 0xffffff00;
}
if ((mdec->buf[0] & 0x20) != 0) {
mdec->y |= 0xffffff00;
}
mdec->y = - mdec->y; /* マウスではy方向の符号が画面と反対 */
return 1;
}
return -1; /* ここに来ることはないはず */
}
3、实现鼠标移动
/* マウスカーソルの移動 */
boxfill8(binfo->vram, binfo->scrnx, COL8_008484, mx, my, mx + 15, my + 15); /* マウス消す */
mx += mdec.x;
my += mdec.y;
sprintf(s, "(%3d, %3d)", mx, my);
boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 0, 79, 15); /* 座標消す */
putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, s); /* 座標書く */
putblock8_8(binfo->vram, binfo->scrnx, 16, 16, mx, my, mcursor, 16); /* マウス描く */
二、32位
16位和32位是指计算机系统中数据的长度。它们表示了处理器的寄存器和内存地址的位数。具体来说,16位系统使用16位的寄存器和内存地址来处理数据,而32位系统则使用32位的寄存器和内存地址。 16位内存地址和32位的计算机内存地址分别占用2个字节和4个字节。
相同的数据类型在16位和32位计算机中占的数据长度也可能不同,比如int类型在16位计算机中占用两个字节,在32位计算机占用四个字节。
这两种位数的区别在于其能够处理的数据量大小。16位系统最大可以表示2^16个不同的数值,而32位系统则可以表示2^32个不同的数值。因此,32位系统相比于16位系统具有更大的寻址空间和更高的计算能力。
到此为止的内存分布图为: