int 9h是否在端口60h处可以使用新的扫描码?

时间:2018-02-05 23:01:46

标签: assembly dos x86-16

在端口60h提供新的中断/中断代码后,总是立即调用{p> 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来提供扫描代码。

0 个答案:

没有答案