如何同时读取用户的多个键盘输入?

时间:2017-02-20 09:19:20

标签: assembly input x86 tasm

我正在构建乒乓球,我想从两个用户那里获得输入以移动球拍但是当我使用int 16h ah1(以及ah0来检测是否按下了全部按键)时,它一次移动一个角色。 / p>

我找到了一些解决方案,但因为我不是一个天生的英语演讲者,我无法理解它们。

1 个答案:

答案 0 :(得分:1)

Int 16/AH=01h用于检查进行击键 虽然Int 16/AH=00h用于获取击键。

请注意,你已经反过来了。

这是一个非常简单的程序,用于轮询按键 A D Q
A 增加第1行的玩家1蓝色字符。
D 增加第2行的玩家2红色字符。
Q 退出程序。

如果同时按下 A D ,两个字符都会递增。

它使用一个简单的Lookup table来为其处理程序分配一个键,以便在程序具有很多功能时避免使用Spaghetti code
使用更适合您需求的调度方法,提供一般的有效解决方案超出了本问题的范围。

BITS 16
ORG 100h

 mov ax, 0003h
 int 10h                            ;Set a known screen mode

 mov ax, 0b800h
 mov es, ax                         ;Set ES to access textual video buffer


 ;Write two 'A's (Blue and red)

 mov WORD [es:0000h], 0941h
 mov WORD [es:160], 0c41h

 ;We need BH zero for later
 xor bx, bx

_poll_key:

 ;CHECK FOR A KEY

 mov ah, 01h
 int 16h
jz _poll_key

 ;REMOVE THE KEY FROM THE BUFFER

 xor ah, ah
 int 16h

 mov bl, al
 call dispatch_key
jmp _poll_key



;
; D I S P A T C H E R
;

;BX = Key to dispatch
dispatch_key:
 push bx


 sub bx, 'a'
 jb _dk_end

 cmp bx, 26
 jae _dk_end


 shl bx, 1
 mov bx, WORD [dispatch_table + bx]

 test bx, bx
 jz _dk_end


 call bx

_dk_end:
 pop bx
 ret

dispatch_table:
        ;A
        dw _key_a
        ;B
        dw 0
        ;C
        dw 0
        ;D
        dw _key_d
        ;E
        dw 0
        ;F
        dw 0
        ;G
        dw 0
        ;H
        dw 0
        ;I
        dw 0
        ;J
        dw 0
        ;K
        dw 0
        ;L
        dw 0
        ;M
        dw 0
        ;N
        dw 0
        ;O
        dw 0
        ;P
        dw 0
        ;Q
        dw _key_q
        ;R
        dw 0
        ;S
        dw 0
        ;T
        dw 0
        ;U
        dw 0
        ;V
        dw 0
        ;W
        dw 0
        ;X
        dw 0
        ;Y
        dw 0
        ;Z
        dw 0

;
; K E Y   H A N D L E R S
;

;EXIT

_key_q:
 mov ax, 4c00h
 int 21h

;INCREMENT PLAYER 2 LETTER

_key_d:
 inc BYTE [es:160]
 ret

;INCREMENT PLAYER 1 LETTER

_key_a:
 inc BYTE [es:0000h]
 ret 

代码用于NASM,以生成COM文件。