如何在 Assembly 中获取实时按键?
How to get realtime key presses in Assembly?
我有一个用 emu8086 编写的简单 EXE 代码,它在屏幕上移动一个字符(目前):
那个黄色的“*”用方向键移动。
问题是模拟器得到 16 个按键。我的意思是,当我如此快速地按键(或按住一个键)时,它会将按键保持在一个堆栈中,并根据它们移动“*”。例如:
在上图中,“*”根据我之前按下的键移动了14次!
我不希望它把我的按键压成一堆。我怎样才能根据最后按下的键而不是堆栈做出 real-time 反应?
P.S.: 这是我从用户那里得到按键的部分,在当前位置打印一个空字符并将“*”移动到新位置:
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
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
这使得您的代码每次需要一个键时都读取 entire 缓冲区,因此它实际上只作用于 last 检查密钥时输入的密钥。
我有一个用 emu8086 编写的简单 EXE 代码,它在屏幕上移动一个字符(目前):
那个黄色的“*”用方向键移动。
问题是模拟器得到 16 个按键。我的意思是,当我如此快速地按键(或按住一个键)时,它会将按键保持在一个堆栈中,并根据它们移动“*”。例如:
在上图中,“*”根据我之前按下的键移动了14次!
我不希望它把我的按键压成一堆。我怎样才能根据最后按下的键而不是堆栈做出 real-time 反应?
P.S.: 这是我从用户那里得到按键的部分,在当前位置打印一个空字符并将“*”移动到新位置:
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
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
这使得您的代码每次需要一个键时都读取 entire 缓冲区,因此它实际上只作用于 last 检查密钥时输入的密钥。