在MS-DOS中检查是否按下了某个键(C/C++)
是的,我指的是真正的MS-DOS,而不是Windows的cmd.exe
外壳控制台。
有没有办法检查MS-DOS中的某个键是否按下,类似于WinAPI中的GetAsyncKeyState()
函数?
我目前使用的是kbhit()
和getch()
,但速度很慢,第一个字符后有延迟,不允许同时按多个键等。
我使用的是Turbo C++3.1。有人能帮忙吗?
(顺便说一句,不要问我为什么要在这么古老的系统上编写游戏代码)
解决方案
为什么要在su-hellip上编写游戏代码;我只是在开玩笑!
在MS-DOS中,"API"函数被实现为中断服务程序。在x86汇编语言中,您可以使用INT
instruction并指定要执行的中断的数量。大多数中断要求在执行INT
之前在某些寄存器中设置它们的"参数"。INT
指令将控制权返回给您的代码后,其结果将被放置在某些寄存器和/或标志中,如中断调用的文档所定义。
我不知道Turbo C++如何实现中断,因为这早在我从事编程之前,但我知道它允许您执行它们。在谷歌上搜索语法,或查阅Turbo C++文档。
知道这些是中断将使您在搜索时获得90%的解决方案。Ralf Brown compiled and published a famous list of DOS and BIOS interrupt codes.它们也应该出现在任何关于DOS编程的书中--如果你对复古编程是认真的,你绝对应该考虑尝试一下。在亚马逊上买一本二手书应该只会花你几美元。如今,大多数人认为这些东西毫无价值。 Here是列出可用于DOS中断21h的子功能的站点。与您的使用相关的是01
、06
、07
和08
。这些基本上就是像getch
这样的C标准库函数将在幕后执行的操作。我觉得这很难想象,但我听过一些报告说,以前的程序员发现直接调用DOS中断更快。我质疑这一点的原因是,我无法想象运行时库实现者会如此愚蠢,以至于提供不必要的缓慢实现。但或许他们确实是。
如果DOS中断对您来说仍然太慢,您最后的办法将是直接使用BIOS中断。这可能会在速度上产生明显的差异,因为您可以绕过所有可能的抽象层。但它确实会显著降低程序的可移植性,这就是DOS等操作系统提供这些更高级别的函数调用的原因。同样,在Ralf Brown的列表中查看与您的使用相关的中断。例如,INT 16
with the 01h
sub-function。
相关文章