Использование inp () в 16Bit Dos 5 с Turbo C ++ 3.0 - PullRequest
0 голосов
/ 30 июня 2011

Прежде всего, я хотел бы сказать, что я знаю, что это действительно устаревший вопрос. Вероятно, поэтому я не могу найти какую-либо информацию через Google. (или я просто хуже в поиске, чем хотелось бы признать! ха-ха.) Все результаты в значительной степени говорят мне, что inp() & outp() бесполезны в современных системах, потому что ядро ​​обрабатывает все ввод и вывод, а не программа. Я использую 16-битные Dos с машины 486, и я смог отлично использовать 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».

Любая информация, которая укажет мне правильное направление, будет полезна.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 30 июня 2011

Это выглядит так: http://www.beyondlogic.org/spp/parallel.htm

Также убедитесь, что вы настроили параллельный порт в BIOS для двунаправленного режима.Другие возможности - режимы «Только выход», «EPP» и «ECP», но двунаправленный режим будет работать лучше всего для того, что вы пытаетесь сделать.Вам понадобится бит 5 в 0x37a, чтобы контролировать направление порта.Кроме того, базовый адрес порта, который вы используете, может быть не 0x378 ... В памяти есть места для получения базовых адресов LPT1-LPT4 (страница настройки BIOS также может сообщить вам об этом).

1 голос
/ 30 июня 2011

В этом случае я предполагаю, что, поскольку я использую 0x378 как порт для outp ()

Не. Порты могут быть однонаправленными (хотя для LPT это не так для моей памяти).

В любом случае трудно понять, в чем проблема, не зная, что подключено к порту. В общем, есть управляющий регистр (порт + 2) и регистр состояния (порт +1), который вы должны использовать для управления фактическим контроллером и считывания его состояния. Я действительно годами не занимался программированием в реальном режиме для ПК, но для встроенных устройств, на которых я работаю, порты ввода / вывода должны использоваться вместе с регистрами управления / состояния, а не вслепую.

0 голосов
/ 30 июня 2011

Чего вы пытаетесь достичь в первую очередь? Параллельный порт не является хорошим двунаправленным каналом. Если вам нужна двухточечная связь между компьютерами (или произвольным устройством с компьютером), последовательный порт с нуль-модемным кабелем будет гораздо лучшим выбором. Или USB. Или сеть. Вы знаете, тип Ethernet.

Тем не менее, предположение о том, что один порт ввода-вывода (в смысле inp () / outp ()) соответствует одному физическому порту (последовательный / параллельный / любой другой), имеет значение WRONG, WRONG, WRONG. В частности, для параллельной работы есть регистр данных и регистр управления, а передача включает в себя помещение байта в регистр данных и переключение битов в регистр управления. Не уверен, как работает прием - посмотрите спецификации. Для сериала протокол еще более сложный.

Существует причина, по которой современные ОС с их моделью драйверов / пользователей эволюционировали. Даже в DOS существуют прерывания, которые отвлекают внимание от взаимодействия портов. Читайте о прерываниях BIOS.

...