Tasm KeyPress 似乎不起作用
Tasm KeyPress does not seem to be working
:D
我知道我今天早些时候也已经 post 编辑了另一个关于 Tasm 的问题,但这个问题是关于不同主题的,所以我想 post 一个新问题 :D.
基本上,我检查是否按下某个键然后查看它是否是 WASD 键的功能似乎无法正常工作。
代码:
'''proc KeyPress ;function which gets key press from WASD and will change var 'Direction' according to it.
push ax
cmp [KeyPressed], 0
jne EndKeyPress
startofCheck:
mov ah, 0bh
int 21h;returns AL=0 - NO KEY PRESSED, AL!=0 - KEY PRESSED.
cmp al, 0
je startofCheck
;PROCESS KEY.
mov ah, 0
int 16h ;get the key.
Wait_for_Data:
cmp al, 87;'W'
je MovingUp
cmp al, 65;'A'
je MovingLeft
cmp al, 83;'S'
je MovingDown
cmp al, 68;'D'
je MovingRight
jmp startofCheck
MovingUp:
mov [Direction], 2d
jmp EndKeyPress
MovingLeft:
mov [Direction], 3d
jmp EndKeyPress
MovingDown:
mov [Direction], 4d
jmp EndKeyPress
MovingRight:
mov [Direction], 1d
jmp EndKeyPress
EndKeyPress:
inc [KeyPressed]
pop ax
ret
endp KeyPress '''
我想做的基本上是检查是否按下了键,如果按下了则检查它是否是 WASD。根据按下的键,我会改变蛇的方向。
任何帮助或建议将不胜感激=D
如果您需要畅通按键检查,请不要混用 DOS 和 Bios 键盘服务。
最好阅读 key-scan code 而不是 ASCII 字符,这样你就不必为字符大小写(如果 CapsLock 不小心 ON/OFF)或国家密钥而烦恼映射。
Int 16/AH=01h and Int 16/AH=00h的组合最适合你:
startofCheck:
MOV AH,01h
INT 16h ; CHECK FOR KEYSTROKE
JZ NothingPressed
MOV AH,00h
INT 16h ; KEYBOARD - GET KEYSTROKE
CMP AH,11h ; W
JE MovingUp
CMP AH,1Eh ; A
JE MovingLeft
CMP AH,1Fh ; S
JE MovingDown
CMP AH,20h ; D
JE MovingRight
CMP AH,01h ; Esc
JE Escape
JMP EndKeyPress
您的程序的用户可能更喜欢普通的 curson 箭头,而不是 WASD 键,它们的扫描码分别为 48h、4Bh、50h、4Dh,分别代表上、左、下、右方向。
:D 我知道我今天早些时候也已经 post 编辑了另一个关于 Tasm 的问题,但这个问题是关于不同主题的,所以我想 post 一个新问题 :D.
基本上,我检查是否按下某个键然后查看它是否是 WASD 键的功能似乎无法正常工作。
代码:
'''proc KeyPress ;function which gets key press from WASD and will change var 'Direction' according to it.
push ax
cmp [KeyPressed], 0
jne EndKeyPress
startofCheck:
mov ah, 0bh
int 21h;returns AL=0 - NO KEY PRESSED, AL!=0 - KEY PRESSED.
cmp al, 0
je startofCheck
;PROCESS KEY.
mov ah, 0
int 16h ;get the key.
Wait_for_Data:
cmp al, 87;'W'
je MovingUp
cmp al, 65;'A'
je MovingLeft
cmp al, 83;'S'
je MovingDown
cmp al, 68;'D'
je MovingRight
jmp startofCheck
MovingUp:
mov [Direction], 2d
jmp EndKeyPress
MovingLeft:
mov [Direction], 3d
jmp EndKeyPress
MovingDown:
mov [Direction], 4d
jmp EndKeyPress
MovingRight:
mov [Direction], 1d
jmp EndKeyPress
EndKeyPress:
inc [KeyPressed]
pop ax
ret
endp KeyPress '''
我想做的基本上是检查是否按下了键,如果按下了则检查它是否是 WASD。根据按下的键,我会改变蛇的方向。
任何帮助或建议将不胜感激=D
如果您需要畅通按键检查,请不要混用 DOS 和 Bios 键盘服务。
最好阅读 key-scan code 而不是 ASCII 字符,这样你就不必为字符大小写(如果 CapsLock 不小心 ON/OFF)或国家密钥而烦恼映射。
Int 16/AH=01h and Int 16/AH=00h的组合最适合你:
startofCheck:
MOV AH,01h
INT 16h ; CHECK FOR KEYSTROKE
JZ NothingPressed
MOV AH,00h
INT 16h ; KEYBOARD - GET KEYSTROKE
CMP AH,11h ; W
JE MovingUp
CMP AH,1Eh ; A
JE MovingLeft
CMP AH,1Fh ; S
JE MovingDown
CMP AH,20h ; D
JE MovingRight
CMP AH,01h ; Esc
JE Escape
JMP EndKeyPress
您的程序的用户可能更喜欢普通的 curson 箭头,而不是 WASD 键,它们的扫描码分别为 48h、4Bh、50h、4Dh,分别代表上、左、下、右方向。