方法1:
procedure SetKey(SCanCode: byte);
begin
asm
//无论向0x60,还是0x64写东西前都要等状态寄存器OBF变0
@Loop1:
in al, $64
and al, 10b
jnz @Loop1
//向$64端口写命令
mov al, $D2//写键盘输出缓存命令
//mov al, $D3//写鼠标输出缓存命令
out $64, al
//无论向0x60,还是0x64写东西前都要等状态寄存器OBF变0
@Loop2:
in al, $64
and al, 10b
jnz @Loop2
//向$60端口写参数
mov al, SCanCode
out $60, al
end;
end;
方法2:
BOOLEAN
WaitForKeyboardWrite(VOID)
{
INT i;
UCHAR c;
for (i = 0; i < 1000; ++i)
{
KeStallExecutionProcessor(50);
c = READ_PORT_UCHAR(defI8042_CTRL_PORT);
if ((c & defOBUFFER_FULL) == defOBUFFER_FULL)
break;
}
return i ? TRUE : FALSE;
}
VOID PressKeyByScanCode(
IN CONST BYTE ScanCode
)
{
WRITE_PORT_UCHAR(defI8042_CTRL_PORT, 0xd2);
WaitForKeyboardWrite();
WRITE_PORT_UCHAR(defI8042_DATA_PORT, ScanCode);
}
为什么比较状态位的时候,前面那个与10b比较,后面的与1比较?
到底哪个是正确的?第一种方法 的注释是不是写错了?我觉得它
比较的是IBF
8042的输入缓冲区和输出缓冲区是什么关系,有什么用?
不是很清楚啊
比如我按了键盘的"A",那它的扫描码是不是同时在输入缓冲区和输出缓冲区
都存在?
那样的话只要一个不就够了,又可读又可写。
http://www.biosren.com/viewthread.php?tid=40
这个很详细。似乎明白了。试验一下。
咋没人回复,不能给自己结帖呀
看代码实在有点烦,而且无语法加亮显示,所以估计都不愿意回了