Int 9h
,对吧?如果是这样,我打算链接到它,以便我的输入代码可以在新的扫描码准备好后立即做出反应。
This webpage说,"当按下某个键时,键盘会将相应的键盘扫描码发送给键盘控制器,键盘控制器会将其转换并中断CPU。"
这个pdf更详细地讨论了(在页面1155的顶部)。
"当扫描码到达PC时,第二个微控制器芯片接收扫描码,对扫描码进行转换,使扫描码在I / O端口60h可用,然后中断处理器并将其留给键盘ISR从I / O端口获取扫描码。"
它在讨论int 9h
ISR,对吧?
这是我的输入代码。 (它目前只是我主程序中的一个程序,它还没有与int 9h
相关联。)它从端口60h获取一个make代码,并使其在BP中全局可用。如果它与先前收集的make代码相对应,它只接受中断代码。
HANDLE_INPUT PROC
;CLEARS THE KEYBOARD TYPEHEAD BUFFER AND COLLECTS A SCANCODE
;ALTERS BP
push ax
push bx
push es
;Clear the type ahead buffer to prevent the annoying PC speaker beep.
mov ax, 40h
mov es, ax ;access keyboard data area via segment 40h
mov WORD PTR es:[1ah], 1eh ;set the kbd buff head to start of buff
mov WORD PTR es:[1ch], 1eh ;set the kbd buff tail to same as buff head
;the keyboard typehead buffer is now cleared
;Collect scancode from port 60h.
;Always accept a make code.
;Only accept a break code if it corresponds with collected make code.
xor ah, ah
in al, 60h ;al -> scancode
test al, 80h ;Is a break code in al?
jz ACCEPT_KEY ;If not, accept it.
;If so, check to see if it's the break code
;that corresponds with the make code in bp.
mov bx, bp ;bx -> make code
or bl, 80h ;change make code into it's break code
cmp bl, al ;Do the new and old break codes match?
je ACCEPT_KEY ;If so, accept the break code.
pop es ;If not, bp retains make code.
pop bx
pop ax
ret
ACCEPT_KEY:
mov bp, ax ;bp -> scancode, accessible globally
pop es
pop bx
pop ax
ret
HANDLE_INPUT ENDP
此代码的主要缺陷是make代码可以从端口60h出现和消失,而我的程序的其余部分仍在执行。在将手指从前一个按键抬起之前按下一个新的按键时,这是灾难性的。这会留下与最后检测到的生成代码相对应的中断代码,该代码在端口60h处等待,因此即使有新的生成代码可用,也会接受中断代码。
我希望如果我链接到int 9h
,我就不会错过那些分秒制作代码。
当然,在链接到中断之前,需要修改代码。最好通过内存变量而不是BP来提供扫描代码。