我正在开发一个汇编语言乒乓球游戏,即使在释放按键后,左侧玩家的球拍也会继续移动。右侧玩家的拨片工作正常,未按下琴键时会停止。这是我的代码的相关部分:
; Left Player's Paddle Movement
proc keys_p2
pusha
mov [x_surface_p2],40
mov ah,1h
int 16h
cmp al,27 ; ESC
je endGame
cmp al,77h; Up
jne skip3_p2
sub [y0_p2],2
call the_cleaner_buffer
jmp skip4_p2
skip3_p2:
cmp al,73h ; Down
jne skip4_p2
add [y0_p2],2
call the_cleaner_buffer
jmp skip4_p2
skip4_p2:
;call the_cleaner_buffer
push [y0_p2]
pop [y_surface_p2]
CALL printPakman_p2
popa
ret
endp keys_p2
我预计当没有按键时桨会停止移动。然而,它会无限期地继续移动。我尝试调试按键处理逻辑,但没有找到问题的原因。
KeyboardBIOS 函数 01h 返回 BIOS 键盘缓冲区的状态。状态通过零标志返回。如果 ZF 清晰,则某个键可用,并且您还可以预览该键在 AL 中的 ASCII 代码和在 AH 中的扫描代码。但如果设置了 ZF,则没有可用的键 并且您不应该像您正在做的那样解释 AL 寄存器。
mov ah, 01h ; BIOS.TestKeystroke
int 16h ; -> AX ZF
jz noKey
mov al, 00h ; BIOS.GetKeystroke
int 16h ; -> AX
右侧玩家的拨片工作正常,未按下键时停止。
看看工作桨如何发挥作用是最有趣的。
和其他的桨有什么不同吗?