在MS-DOS中检查是否按下了某个键(C/C++) [英] Checking if a key is down in MS-DOS (C/C++)

查看:0
本文介绍了在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的子功能的站点。与您的使用相关的是01060708。这些基本上就是像getch这样的C标准库函数将在幕后执行的操作。我觉得这很难想象,但我听过一些报告说,以前的程序员发现直接调用DOS中断更快。我质疑这一点的原因是,我无法想象运行时库实现者会如此愚蠢,以至于提供不必要的缓慢实现。但或许他们确实是。

如果DOS中断对您来说仍然太慢,您最后的办法将是直接使用BIOS中断。这可能会在速度上产生明显的差异,因为您可以绕过所有可能的抽象层。但它确实会显著降低程序的可移植性,这就是DOS等操作系统提供这些更高级别的函数调用的原因。同样,在Ralf Brown的列表中查看与您的使用相关的中断。例如,INT 16 with the 01h sub-function

这篇关于在MS-DOS中检查是否按下了某个键(C/C++)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆