MR.*_*cia 1 assembly x86-16 emu8086
我有一个用emu8086编写的简单EXE代码,它在屏幕上移动一个字符(现在):
黄色的"*"用箭头键移动.
问题是模拟器获得16次按键.我的意思是当我如此快速地按下按键(或按住一个按键)时,它会按住按键并按下它们移动"*".例如:
在上图中,"*"根据我之前按下的键移动了14次!
我不希望它把我的按键按在堆栈中.如何根据按下的最后一个键而不是堆栈进行实时反应?
PS:这是我从用户那里按下按键的部分,在当前位置打印一个空字符并将"*"移动到新位置:
check_for_key:
; === check for player commands:
mov ah, 01h
int 16h
jz no_key
mov ah, 00h
int 16h
mov cur_dir, ah
; print ' ' at the location:
mov al, ' '
mov ah, 09h
mov bl, 0eh ; attribute.
mov cx, 1 ; single char.
int 10h
call move_star
Run Code Online (Sandbox Code Playgroud)
BIOS始终在缓冲区中处理键盘输入.您可以通过安装自己的中断处理程序来规避这一点,但这可能有点过分.
您还可以确保您的例程比密钥重复延迟更快.
但作为快速修复,您可以像这样更改输入检查:
check_for_key:
; === check for player commands:
mov ah, 01h
int 16h
jz no_key
check_for_more_keys:
mov ah, 00h
int 16h
push ax
mov ah, 01h
int 16h
jz no_more_keys
pop ax
jmp check_for_more_keys
no_more_keys:
pop ax
mov cur_dir, ah
Run Code Online (Sandbox Code Playgroud)
这使得您的代码在每次需要密钥时都会读取整个缓冲区,因此它实际上只对检查密钥时输入的最后一个密钥起作用.
| 归档时间: |
|
| 查看次数: |
2501 次 |
| 最近记录: |