Как читать несколько клавиатурных вводов от пользователя одновременно?

Я строю понг и хочу получить информацию от двух пользователей для перемещения ракеток, но когда я использую int 16h ah1 (и ah0, чтобы определить, была ли нажата клавиша wt все), он перемещает по одному символу за раз.

Я нашел некоторые решения, но, поскольку я не являюсь носителем английского языка, я не мог их понять.

1 ответ

Int 16/AH=01h используется для проверки нажатия клавиши.
В то время как Int 16/AH=00h используется для получения нажатия клавиши.

Обратите внимание, что вы получили их наоборот.


Здесь очень простая программа, которая опрашивает нажатия клавиш A, D и Q.
Увеличивает игрока 1 синий символ в строке 1.
D увеличивает игрока 2 красным персонажем в строке 2.
Q выходит из программы.

Если вы нажмете A и D вместе, оба символа будут увеличены.

Он использует простую таблицу поиска для отправки ключа своему обработчику, чтобы избежать спагетти-кода, когда в программе много функций.
Используйте тот способ диспетчеризации, который больше соответствует вашим потребностям, а общее эффективное решение выходит за рамки этого вопроса.

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.

Другие вопросы по тегам