【问题标题】:Is there a way to set keyboard repetition delay to zero in assembly?有没有办法在汇编中将键盘重复延迟设置为零?
【发布时间】:2020-02-03 02:13:42
【问题描述】:

我正在编写一个汇编程序,根据按下的键在屏幕上移动一个像素。

根据here修改重复延迟的方式是使用

mov ah, 03h 
mov al, 05h ;set typematic rate/delay
mov bh, 00h ;repeat delay: 250ms <-- this has to be 0
mov bl, 00h ;typematic rate: 30
int 16h

这是完整的代码

cmp [keypress], 'a'
je left
cmp [keypress], 'A'
je left
cmp [keypress], 'd'
je right
cmp [keypress], 'D'
je right
jmp endMove
left:
    dec xpos
    jmp endMove
right:
    inc xpos
    jmp endMove
endMove:
call drawPixel
input:
mov keypress, 0
mov ah, 01h
int 16h
jnz animLoop
mov ah, 00h
int 16h
mov keypress, al
jmp animLoop

它工作正常,除了键盘重复延迟使像素移动一次,然后停止 250 毫秒,然后重新开始连续移动而没有问题。 如何消除重复延迟?

【问题讨论】:

  • 这是您可以设置的最短时间。我猜你可能需要实现自己的键盘处理而不是使用 BIOS。
  • @EuroMicelli:这个问题是关于初始延迟,而不是重复周期。 (通常这是根据每秒的速率定义的,而不是周期 = 反速率)。延迟 = 0 / 速率 = 50 意味着 1 秒的按键恰好给出 50 个字符,而不是 1 + 0.75 * 50 = ~38(在最初的 250 毫秒内只有 1 个字符,然后是 50Hz)。对于使用重复键而不是本身向上/向下跟踪键的游戏,延迟 = 0 将是您想要的。
  • @PeterCordes 你是对的。删除。谢谢

标签: assembly input keyboard dos x86-16


【解决方案1】:

可以在 BIOS 选项中配置此延迟(以及重复率)。如果你想绕过它,你不应该使用BIOS功能,而是直接访问keyboard controller。

在你的代码中

mov bh, 00h ;repeat delay: 250ms <-- this has to be 0

尝试设置重复延迟的值,值0 代表250ms,可以在BIOS 中/通过BIOS 中断设置的最小值。您可以在Ralph Brown's interrupt list 上验证这一点。

【讨论】:

  • 键盘控制器不能设置小于 250 毫秒的重复延迟,至少通过所有键盘支持的标准 PS/2 命令。所以直接访问键盘控制器是不够的。必须实现对键盘的完全自定义处理:忽略自动重复,而是跟踪键盘状态(哪些键按下)并使用自定义计时器生成自动重复事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 2018-10-17
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
相关资源
最近更新 更多