我需要为x86开发程序,它将通过轮询IRR来处理键盘中断。程序应该在ms-dos下以实模式工作。我的主要问题是它不起作用,因为我认为它应该工作:即使没有按下任何键,适当的IRR位也具有非零值,并且从端口0x60读取的值始终为0x1c。 有人可以解释一下我做错了什么吗? 这是我的投票循环:
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似乎是返回键的扫描码。 =)