int 16h/ah=1 repeatedly gives the same key press even after user presses another key

牧云@^-^@ 提交于 2019-12-20 05:49:04

问题


I am writing code of a game in assembly language where the movement of the dinosaur depends on the key pressed from user. I have implemented my code in a way that if the user presses space bar the program should terminate and the dinosaur should move in a right direction on pressing "a". But I am facing a problem that after pressing any key for the first time the program doesn't look for any other key which is pressed after that which shows it is taking the first pressed key again and again. How to fix it?

I am using the function of mov ah, 01h and int 16h which returns ascii of pressed key in al register. after this I compare this with required ascii keys but this 16h is doing well only when any key is pressed for the first time.

label2: 
        mov ah, 1h
    int 16h
    mov keyboardkey, al        ;keyboardkey is variable for storing ascii of key pressed

    .IF( keyboardkey == 32 )
        ret
    .ENDIF

    .IF( keyboardkey == 97 )
            mov bx, startingXaxis
            add bx, 10
            mov startingXaxis, bx
            call drawdinosaour
    .ENDIF

    .IF (keyboardkey == 98 )
        mov bx, startingXaxis
        sub bx, 10
        mov startingXaxis, bx
        call drawdinosaur
    .ENDIF  

        call delay              ;this function passes the program for 1/4 second
        jmp label2

I was expecting that whenever i press spacebar the program will terminate but it only picks the key pressed for the first time and after that it keeps on acting according to that first key and doesn't look for any key that is pressed afterwards


回答1:


The int 0x16, ah =0x01 doesn't remove the key from the buffer, and (if no key was pressed) doesn't wait until the user presses a key.

The int 0x16, ah =0x00 does remove the key from the buffer, and (if no key was pressed) does wait until the user presses a key.

If you want to remove the key from the buffer but don't want to wait until a key is pressed; then you have to use both functions, sort of like:

    mov ah,0x01
    int 0x16
    jz .doneKeypress
    mov ah,0x00
    int 0x16
    call handleKeypress
.doneKeypress:

For what you're doing (with a delay, where the user could press multiple keys while you're doing the delay); you probably want something more like:

mainLoop:

;Handle all keypresses

.nextKey:
    mov ah,0x01
    int 0x16
    jz .doneKeypresses
    mov ah,0x00
    int 0x16
    call handleKeypress
    jmp .nextKey
.doneKeypresses:

;Update the screen

     call updateScreen

;Do the delay

    call delay

;Keep doing the loop while the game is running (and stop when the game stops)

    cmp byte [isRunning],0
    je mainLoop
    ret


来源:https://stackoverflow.com/questions/58822549/int-16h-ah-1-repeatedly-gives-the-same-key-press-even-after-user-presses-another

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!