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

Using inp() on 16Bit Dos 5with Turbo C++ 3.0

本文关键字:inp Dos C++3 Turbo 16位      更新时间:2023-10-16

首先我想说,我知道这是一个非常过时的问题。这可能就是为什么我在谷歌上找不到任何信息的原因。(或者我只是比我想承认的更不善于搜索!哈哈。(所有的结果都告诉我,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,确保并行端口的模式是输入/输出,而不仅仅是输出。在发现我有两种模式后,我的兴奋很快就被同样糟糕的"255"输出压垮了。

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

谢谢!

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

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

在这种情况下,我认为由于我使用0x378作为outp((的端口

不要。端口可能是单向的(尽管对于LPT来说,就我的最佳内存而言,情况并非如此(。

在任何情况下,如果不知道端口上连接了什么,就很难知道问题出在哪里。通常,有一个控制寄存器(端口+2(和状态寄存器(端口+1(,您应该使用它们来控制实际控制器并读取其状态。我真的已经好几年没有处理过真实模式的PC编程了,但对于我工作的嵌入式设备,输入/输出端口必须与控制/状态寄存器结合使用,而不是盲目使用。

您首先想完成什么?并行端口不是一个好的双向通道。如果你想在计算机之间(或任意设备到计算机(进行点对点通信,带零调制解调器电缆的串行端口将是一个更好的选择。或者USB。或者,嗯,网络。你知道,以太网类型。

也就是说,假设一个I/O端口(在in((/outp((意义上(对应于一个物理端口(串行/并行/任何(是错误的,错误的,错的。特别是对于并行,有一个数据寄存器和一个控制寄存器,传输包括将字节放在数据寄存器上,并翻转控制寄存器中的一位。不知道收货是怎么回事——查一下规格。对于串行,协议甚至更为复杂。

现代操作系统及其驱动程序/用户模式的发展是有原因的。即使在DOS下,也有一些中断抽象了端口交互的实质。读取BIOS中断。

我假设您的意思是如何通过LPT1输入信号?首先,你应该阅读一个接口教程。。。LPT1接口样本你会发现引脚11与输入相关。引脚11与寄存器0x378+1有关。

关于代码,您必须导入这些库并使用该命令导入

    #include<conio.h>
    #include<bios.h>
    #include<stdio.h>
    #include<dos.h>
    #define LPT1      0x378
    void main (){
...
    unsigned int x = inportb(LPT1+1);
...
}