c++ - 在 Turbo C++ 3.0 的 16 位 Dos 5 上使用 inp()

标签 c++ io dos

首先我想说我知道这是一个非常过时的问题。这可能就是为什么我无法通过谷歌找到任何信息的原因。 (或者我只是在搜索方面比我愿意承认的要差!哈哈。)所有结果几乎都告诉我 inp()outp() 是在现代系统上无用,因为内核处理所有输入和输出而不是程序。我在一台 486 机器上运行 16 位 Dos,我已经能够完美地将 outp() 与我的并行端口一起使用。我喜欢 16 位 Dos,我对学习在 NT 时代及更高版本的系统上执行此操作的“新的和改进的”方法不感兴趣(至少现在不是)。

随着清理——

我的问题是关于 inp() 的。我有一本旧的硬拷贝手册,上面说您将一个变量(端口地址)传递给 inp()。在这种情况下,我假设因为我使用 0x378 作为 outp() 的端口,所以我也会将它用于 inp() .因为我之前没有编程接受外部输入,所以我不确定我会从一个简单的开/关开关中获得什么类型的值,所以我写了这个快速代码来获取所有新值-

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <dos.h>

int main(void){
    clrscr();

    int input;
    int buff = 0;

    restart:

    input = inp(0x378);

        if(input != buff){
        cout<<input;
        buff = input;
        }

    goto restart;

}

我只是使用了“buff”,这样它就不会一遍又一遍地吐出“255”,并可能在输入引脚通电时掩盖不同的值。不用说,打印的唯一值是“255”。

当我编写一个程序将数据输出到并行端口上的“D”引脚时,我将一个十六进制代码发送到与所需输出相对应的端口......现在我正在处理“S”引脚在并行端口上输入。我应该将十六进制代码返回到程序中吗?

此外,我进入 BIOS 并确保并行端口的模式是 in/out,而不仅仅是 out。在发现我有两种模式后,我兴奋的浪潮很快被同样糟糕的“255”输出压垮了。

任何能为我指明正确方向的信息都会有所帮助。

谢谢!

最佳答案

这看起来很彻底:http://www.beyondlogic.org/spp/parallel.htm

此外,确保在 BIOS 中将并行端口配置为双向模式。其他可能性是仅输出、EPP 和 ECP 模式,但双向将最适合您尝试做的事情。您需要 0x37a 中的位 5 来控制端口的方向。此外,您使用的端口的基地址可能不是 0x378...内存中有一些位置可以获取 LPT1-LPT4 的基地址(BIOS 设置页面可能也会告诉您。)

关于c++ - 在 Turbo C++ 3.0 的 16 位 Dos 5 上使用 inp(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6539345/

相关文章:

c - 如何在dos中获取当前段

string - dos下如何删除某个字符之前的字符串?

c++ - 在 vs2015 的可变参数模板中找不到重载的成员函数

c++ - 无法访问类 'boost::asio::basic_io_object<IoObjectService> 中声明的私有(private)成员

c++ - wcout 没有按要求输出

c - scanf 和 getchar 处理流的方式不同吗?

java - 为什么 out.write() 会改变 Java 中的 int 值?

python - 我如何调试双语言程序?

c - 从文件中读取最后 20 个字节

c - 在C语言游戏中使用鼠标控制