我需要为 x86 开发程序,通过轮询 IRR 来处理键盘中断。程序应该在 ms-dos 下以实模式运行。我的主要问题是它不能像我认为的那样工作:即使没有按下任何键并且从端口 0x60 读取的值始终为 0x1c,相应的 IRR 位也具有非零值。有人可以解释我做错了什么吗?这是我的轮询循环:
in al,21h ; read old IMR value
or al,02h ; disable handling of interrupts from IRQ1
out 21h,al ; update IMR value
READ_LOOP:
mov al,0ah
out 20h,al
in al,20h ; read IRR value
and al, 02h ; check request from IRQ1
jz READ_LOOP
in al,60h ; read data from keyboard buffer
mov dl,al
and dl,7fh ; ignore most significant bit value
mov ah,2h ; print char
int 21h
jmp READ_LOOP
谢谢!
更新 我错过了键盘缓冲区包含扫描码的事实,所以 0x1c 似乎是返回键的扫描码。=)