gpt4 book ai didi

assembly - 第一次按下 int 16h/ah=1 按键后,我的游戏控件卡住

转载 作者:行者123 更新时间:2023-12-02 19:21:34 27 4
gpt4 key购买 nike

我正在用程序集 8086 编写游戏。我修复了游戏无法打开的问题,但无法修复控件。

ESC 键有效。当我按下它时,它会转到 _QUIT 功能,但如果在此之前按下任何其他键,控件将卡住并且不会对任何键使用react。

我的功能有问题吗?

我尝试将AL寄存器更改为AH,但没有成功。

_KEYCHECK:
mov ah,01h
int 16h

cmp al,1Bh ;ESC
je _QUIT
cmp al,48h ;UP
je _PLAYER.UP
cmp al,50h ;DOWN
je _PLAYER.DOWN
cmp al,4Bh ;LEFT
je _PLAYER.LEFT
cmp al,4Dh ;RIGHT
je _PLAYER.RIGHT
ret

最佳答案

您的_KEYCHECK函数正在使用BIOS.ReadKeyboardStatus函数。

如果没有可用的键,它将通过设置 ZeroFlag (ZF) 来通知您键盘键的可用性,或者如果有键正在等待,则通过清除 ZeroFlag 来通知您键盘键的可用性。在后一种情况下,您还将收到 key 的 ASCII 代码和扫描代码。
这里重要的是,报告可用的键保留在键盘缓冲区中。您在 ALAH 中获得的信息只是预览,而不是实际的 key (在某种意义上)。这解释了您的观察结果:

... but if any other key was pressed before that the controls frees ...

解决方案是从键盘缓冲区中删除该键。这就是 BIOS.ReadKeyboardCharacter 的作用。如果某个键正在等待,它将很快返回,并将该键从缓冲区中删除。如果没有可用的 key ,它将等待,直到有可用的 key ,然后返回并从缓冲区中删除该 key 。

_KEYCHECK:
mov ah, 01h ; BIOS.ReadKeyboardStatus
int 16h ; -> AX ZF
jz NoKeyAvailable
mov ah, 00h ; BIOS.ReadKeyboardCharacter
int 16h ; -> AX

cmp al, 1Bh ;ESC
je _QUIT
cmp ah, 48h ;UP
je _PLAYER.UP
cmp ah, 50h ;DOWN
je _PLAYER.DOWN
cmp ah, 4Bh ;LEFT
je _PLAYER.LEFT
cmp ah, 4Dh ;RIGHT
je _PLAYER.RIGHT
NoKeyAvailable:
ret

请注意:

  • 您实际上并没有检查 ZeroFlag 来确定 ALAH 中的信息是否有效。
  • 数字 1Bh (ESC) 是一个 ASCII 代码,必须从 AL 检查,但所有其他代码 48h (UP)、50h (DOWN)、4Bh (LEFT) 和 4Dh (右)是扫描码,因此必须从 AH 进行检查。

关于assembly - 第一次按下 int 16h/ah=1 按键后,我的游戏控件卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55927095/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com