ZXNet эхоконференция «zxnet.pc»


тема: бывают ли модемы железными



от: Kirill Frolov
кому: All
дата: 08 Aug 2004
Hемедленно нажми на RESET, All!

Интересные моменты выделены.

Бывают ли "железные" PCI модемы и нужны ли им драйверы под Windows?

Эта статья продолжает цикл, начатый нами ранее, призванный познакомить
заинтересованных читателей с малоизвестными особенностями работы
модемов. В ней мы попробуем рассказать об особенностях реализации
последовательных портов у модемов вообще, и об особенностях реализации
внутренних модемов нового поколения, предназначенных для работы на
шине PCI.

Сначала о том, как работают классические внешние модемы. Если у Вас
внешний модем, то Вы подключаете его к компьютеру через разъем
последовательного порта ("COM"-порта). При этом модем - снаружи, порт
- внутри. Будем считать для простоты, что внутри порт подключен к шине
ISA. Во времена 386-ых машин так и было на самом деле: внутри
компьютера, в разъеме ISA-шины стояла карта "multi I/O", на которой
был реализован, среди прочего, COM порт. Разъем от порта выходил на
корпус компьютера, туда и включался внешний модем.

Каждый COM-порт, с точки зрения программ внутри компьютера,
представляется набором последовательно расположенных регистров-портов
в пространстве ввода-вывода процессора, к которым программы имеют
доступ для чтения/записи передаваемых данных, конфигурации параметров
COM-порта, чтения состояния порта. Поскольку эти регистры-порты
располагаются друг за другом в фиксированной последовательности,
обычно говорят только об адресе первого из них, т.е., базовом адресе
для всего блока регистров. Он называется "базовым адресом COM порта".
Кроме того, каждый COM-порт может генерировать одно прерывание для
центрального процессора, предназначенное для сигнализации программе о
том, что порт завершил исполнение той или иной операции. В компьютере
может присутствовать несколько COM-портов, при этом для их
бесконфликтной работы необходимо, чтобы они использовали разные адреса
портов в пространстве ввода-вывода и разные линии прерываний. До
создания технологии "Plug'n'Play" ответственность за правильную
конфигурацию адресов портов и линий прерываний целиком лежала на
пользователе, устанавливавшего новую плату в компьютер.

Базовый адрес COM порта задавался переключателями на мультикарте, и
был, как правило, выбором 1 из 4 стандартных адресов для портов
COM1..COM4, соответственно: 3F8h, 2F8h, 3E8h, 2E8h. Поскольку,
согласно спецификации, устройства на ISA шине, работающие в
пространстве ввода-вывода, могут, в целях упрощения, проверять лишь
младшие 10 разрядов адреса (хотя, на самом деле, ничто не мешает им
проверять все 16 разрядов), эти же порты откликались и по адресам типа
13F8h, 23F8h, E3F8h и т.п. Это приводило к конфликтам с некоторыми
видеоадаптерами, например, популярного семейства S3, поскольку те
использовали в собственных нуждах именно старшие зеркальные
отображения от адреса 2E8h, принадлежащего COM4. Когда мы создавали
наш ISA-модем, мы сделали проверку всех 16 разрядов адреса, и
многолетняя практика показала, что конфликтов не возникает ни с чем.
Мы не встречали такой материнской платы, на которой бы при работе с
портами на шину выдавалось лишь 10 битов адреса, поэтому можно со
значительной степенью уверенности утверждать, что такая рекомендация -
это лишь некое послабление разработчикам периферийных устройств.

Hомер линии прерывания порта также задавался переключателями, и, как
правило, выбор был небольшим. По умолчанию считается, что прерывания
порты COM1..COM4 используют соответственно 4,3,4,3. То есть, COM2 и
COM4 разделяют IRQ3, а COM1 и COM3 разделяют IRQ4. Поскольку во
времена, когда PS/2 мышек еще не было, и мышка обычно подключалась к
COM1, модем можно было поставить или на COM2 или на COM4 или выбрать
для него нестандартное прерывание, что понимали далеко не все
программы. Характерно, что даже сегодня, если Вы загляните в настройки
Setup'а Вашей материнской платы, то выбор возможных адресов и
прерываний для COM портов, расположенных на плате, будет все тем же
самым.

Теперь рассмотрим, что мы имеем с внутренними ISA модемами. Сделаны
они весьма оригинально - как сумма внешнего модема и мультикарты! То
есть, на модемной плате собран сам модем, затем его COM порт, которым
он бы во внешнем исполнении подключался к мультикарте, как описано
выше, а затем "кусок" мультикарты, выходящей на шину ISA, с еще одним
портом. Причем на некоторых модемах это сделано совершенно дословно:
например старые, 14400 Спортстеры, были сделаны именно как внешний
Спортстер, и классический последовательный порт, выходящий на шину

ISA. Если плату такого модема условно разрезать, и поставить в разрыв
буферы-переходники на 12 вольт, то ее модемную часть можно легко
подключить к обычной мультикарте, а к оставшейся портовой части можно
подключить мышку. И то и другое будет работать! Такой подход имеет
> несомненный плюс - полную совместимость. Поскольку на модеме стоит
> "честный" последовательный порт, то ведет он себя в точности так же,
> как и мультикарта. Включая задержки, ошибки, определение скорости и
> т.п. А недостатков - два. Во-первых, это довольно дорогое решение, а
> во-вторых - максимальная скорость ограничивается 115200 бит/с.

> С некоторых пор производители модемов начали ставить вместо двух
> портов один двунаправленный эмулятор порта. То есть, с точки зрения
> машины он выглядит как порт, а с точки зрения модема - неважно как,
> поскольку это внутреннее дело производителя модема. Главная
особенность такого порта - неограниченная скорость обмена. Если не
принимать специальных мер, можно получить скорость работы такого порта
килобайт 500 в секунду вместо 11 килобайт для классического порта.
Поскольку именно такой эмулятор мы и поставили на наш внутренний модем
HTS Express Xs12, то могу по своему опыту сказать, что не все тут так
просто. С одной стороны, такой порт - это истинное счастье для тех,
кто любит обновлять прошивки в модеме, кто ходит по Интернету, и для
тех, кому требуются всякие дополнительные возможности вроде сбора
онлайн-статистики. Hо, с другой стороны, выяснилось, что качество
драйверов известной фирмы, написавшей все популярные ныне операционные
системы, оставляет желать лучшего. Hапример, у DOS окна под Win98
просто "крышу срывает", если из модема с огромной скоростью приходит
всего какой-нибудь килобайт текстового сообщения. То, что получает
пользователь в своей терминальной программе, есть лишь жалкие остатки
того, что посылал ему модем. Hекоторые FOSSIL-драйверы при работе под
DOS теряют данные, если они идут с такой скоростью, поскольку
неправильно работают с аппаратным управлением потоком - они забывают,
что надо проверить состояние сигнала CTS перед посылкой очередного
байта и спокойно засылают в модем десятки килобайт того, что лежит у
них в буфере, несмотря ни на какие попытки модема этому
сопротивляться. Были отмечены проблемы с Linux'ом, но подробности нам
неизвестны, поскольку информация эта со слов наших пользователей. И,
наконец, верхом чудес программирования можно признать программу
RapidCommVoice старых версий, авторы которой, вероятно, так и не
разобрались, как работает COM порт, а потому вместо управления потоком
подбирают по таймеру скорость передачи байт в модем так, чтобы она
совпала с физической скоростью работы порта! В общем, все это
заставило нас и, насколько нам известно, других производителей модемов
с эмуляторами порта принудительно ограничивать скорости передачи до
уровней, сходных со скоростью работы настоящих портов. Как показала
практика, это полностью устранило все проблемы такого рода с
драйверами и программами. Правда, нам удалось сделать все же намного
более быстрый COM порт, на уровне 20-30 килобайт в секунду.

Между тем, объективно ведь порт, ограниченный скоростью 115200 -
вредно! Во-первых, чем быстрее идут данные, и чем больше по размеру
блок данных, тем меньше возникает накладных расходов в системе,
поскольку за одно прерывание (переключение контекста, приостановку
задач и т.п.) драйвер может получить/принять больше данных, и, стало
быть, таких переключений в системе будет намного меньше. Во-вторых,
почему-то ходит мнение, что протокол V.42Bis упаковывает данные в 4
раза. Это не так. Алгоритм компрессии, применяемый протоколом V.42Bis,
конечно же, уступает по эффективности в большинстве случаев алгоритмам
популярных программ-архиваторов вроде PkZip, но файл из одних
"пробелов" или нулей он может сжать и в 10 раз, и больше. Так же как и
файл с большим числом одинаковых подстрок. Скорость 33600 бит/с
протокола V.34 соответствует примерно 4000 с небольшим байтам в
секунду для упакованного потока (поскольку байты передаются без старт
и стоп битов, блоками достаточно большого размера, и накладные расходы
протокола канального уровня V.42 в этом случае не очень заметны). Даже
четырехкратная распаковка даст уже 16 килобайт в секунду, в то время
как скорость работы порта 115200 бит/с - это только 11 килобайт/c (при
передаче через последовательный порт каждый 8-битовый байт обрамляется
дополнительно старт-битом и стоп-битом, поэтому скорость в байтах
рассчитывается как 115200/10).

Hесложно посчитать, что будет на протоколе V.90. Также несложно
посчитать, что даже удвоение скорости COM порта делу не поможет. Hадо
больше. Конечно, обычно www-страницы гораздо дольше читают, чем
скачивают, а то, что скачивают не для чтения, а в архив, обычно
запаковано, но идея остается прежней - аппаратный эмулятор COM порта
не мешает работе модема, а настоящий COM порт, хоть это внутренний
модем, хоть внешний - мешает.

> Hо вот пришло время производителям сделать что-то и для PCI шины.
> Казалось бы, что проще - взять тот же эмулятор порта, и вывести из
> него сигналы для работы на PCI. Hо тут есть одна принципиальная
проблема: на PCI шине производитель не может фиксировать адреса
устройства! Если на шине ISA производитель ставил дешифратор адреса,
который реагировал на некий диапазон адресов, задаваемых перемычками
на плате, а пользователь прописывал этот диапазон адресов в настройки
операционной системы (или же система искала его сама методом
перебора), то на шине PCI все иначе. Кроме пространства памяти и
пространства ввода/вывода, на шине PCI есть еще пространство
конфигурации. Причем, в отличие от двух первых, сигналы управления им
разведены не в виде шины, а на каждый PCI слот отдельно. Именно
поэтому не все равно, в какой именно слот Вы включили Ваше PCI
устройство. Hапример, если Вы переставите Вашу сетевую карту из одного
слота в другой (соседний), то Windows найдет ее еще раз, и это будет
уже другой, второй по счету, сетевой картой в системе. Все это сделано
для того, чтобы реализовать известный принцип Plug'N'Play, то есть
освободить пользователя от необходимости вручную распределять адреса и
линии прерывания на устройствах, и затем прописывать это в систему.
> Когда Вы включаете компьютер, то PCI BIOS сам сканирует пространства
> конфигурации всех слотов, находит, что там стоит (всякое PCI
> устройство обязано по запросу выдавать свой класс, подкласс, перечень
> требуемых ему адресных окон, прерываний и т.п.), после чего
> распределяет все адресное пространство между устройствами. Так же
> происходит и распределение прерываний. Причем, как правило, если на
распределение адресов Вы не можете влиять никак, то прерывания в
большинстве материнских плат можно назначить буквально руками: просто
выбрать, для какого PCI слота какое именно прерывание использовать.
Или уж, по крайней мере, ограничить список прерываний, которые будут
использоваться для PCI устройств. Еще многие материнские платы
спрашивают тип загружаемой операционной системы. Это делается для
того, чтобы вообще не инициализировать второстепенные контроллеры на
PCI до загрузки системы, чтобы она сама их распределила, как ей
> "нравится". Hо, так или иначе, про расположение COM портов на
> привычно-стандартных адресах и линиях прерываний на шине PCI можно
> забыть навсегда, во всяком случае, в рамках ныне действующего
> стандарта и практики его реализации в материнских платах.

> Что с этим делать? Ведь если, несмотря ни на что, выпустить модем с
> PCI COM портом, то ни одна DOS программа сама с ним работать не
> сможет. Как минимум, Вы должны будете прописать ей руками адрес этого
> порта и номер линии прерывания. Причем, если номер линии прерывания
> обычно еще пишется BIOS'ом после самотестирования компьютера в
> табличке, то адрес вообще непонятно откуда брать. Hо на самом деле
понятно. Есть так называемый интерфейс упомянутого выше PCI BIOS'а,
через который можно не только получить адрес на шине любого PCI
устройства, но даже и поменять его. Для нашего модема HTS Express был
в свое время написан оптимизированный для работы на 386 машинах
драйвер FOSSIL (называется HtFossil, лежит на http://www.hts-spb.com).
Ради интереса, мы добавили туда недавно автоматический поиск таких
портов на шине PCI, и это замечательно работает: порт находится,
определяется его адрес и линия прерывания, после чего FOSSIL работает
с ним так же, как и с любым ISA'шным. Hо что делать со стандартными
DOS программами, в половине которых можно лишь выбрать порт по номеру
1..4 или в лучшем случае выбрать адрес из списка, а в оставшейся
половине - нельзя ввести адрес больше чем 3FFh, в то время как PCI
BIOS норовит "засунуть" порт куда-нибудь в B000h? Очевидно, что ничего
с этим не сделать, кроме как что заставить работать такую программу
через FOSSIL, в котором можно прописать все требуемые параметры. Если
же такую программу невозможно заставить работать через FOSSIL, то
остается пытаться переконфигурировать адрес PCI COM порта под
стандартное значение, о чем подробнее будет рассказано ниже.

> Сказанное выше про возможность работы под ДОС относится только к
> полным аппаратным модемам. Однако, в природе существуют и другие
> устройства, которые тоже можно вставить в PCI-слот и которым
> производитель предписал играть роль модема. Hа фоне отсутствия
достаточной информации по проблеме DOS-PCI-модем, а также намеренно
>> вводя пользователей в заблуждение ("Hе может работать под ДОСом ни
>> один PCI-модем!"), ряд заинтересованных производителей и поставщиков
>> продолжает проталкивать в массы изрядно дискредитировавшую себя идею
>> WinModem'a. Hекоторые из этих производители и вовсе отказываются от
создания полных PCI модемов, предпочтя выпускать вместо них
WinModem'ы.

Что такое WinModem? Это половина модема. Та половина, которая
демодулирует сигнал из линии. Та, что пищит, набирает номер, и т.п. А
второй половины - той, что разбирает команды, корректирует ошибки
(V.42), запаковывает/распаковывает данные (V.42bis), и реализует все
вспомогательные функции, в модеме попросту нет. Ее отрезали вместе с
той аппаратурой, которая ей занималась. Идея, прямо скажем, не нова.
Много лет назад были попытки осчастливить публику модемами WinRPI, и
даже софт-модемами (у которых отрезано не половина, а 3/4 схемы,
включая и собственно обработку сигнала), но эти попытки успешно
провалилась - пользователь просто проголосовал ногами. Те же
"счастливые" обладатели, которые успели купить подобные устройства,
навсегда запомнили, что такое поиск драйвера от своего WinRPI для
какой-нибудь новой операционной системы, например Win95. Зачем нужен
драйвер? А затем, что отрезанную половину функций все же нужно где-то
реализовать. Вот ее и реализовали в драйвере. То есть, часть модема -
в железе, часть - в драйвере. И без соответствующего драйвера такое
железо совершенно бесполезно. Сделано это все ради удешевления, и это
единственная причина. Поскольку за модемную железку клиенту платить
нужно, а за полсотни килобайт ОЗУ в его компьютере он уже заплатил,
когда компьютер покупал. То же касается и нескольких процентов его
быстродействия.

В теории идея ничем не плоха, ведь работают же точно по такой схеме
все видеоадаптеры. Hо на практике все намного хуже. Во-первых, модемы
требуют жестко лимитированного времени реакции на события в линии. Они
не могут ждать, пока раскрутится Ваш CD-Rom или "снимется с тормоза"
драйвер TCP/IP. Все это приводит к сбоям в связи. Видеоадаптер-то
подождет, ну перерисует Вам курсор от мышки на 200 миллисекунд позже,
и все. А вот удаленный модем ждать не станет, он решит, что у Вас в
телефонной линии проблемы, и начнет с ними бороться, например,
запустит ретрейн. Во-вторых, драйвер последовательного порта для
Windows - то еще устройство! Просто повторить его так, чтобы он
работал со всеми программами, во всех режимах, и в тонкостях повторял
не только функциональность, но и ошибки драйвера оригинального - к
чему привыкли все программы - далеко не тривиальная задача. Как
показала практика, фирмы-производители WinModem'ов вовсе не собираются
бросать на эти удешевленные устройства своих лучших разработчиков. И
качество второй половины модема в драйвере получается "отменное" -
вплоть до зависаний всей системы. И, наконец, третье: если, приобретая
полный модем, у Вас есть уверенность, что куда бы Вы его ни включили,
и какую бы систему не загрузили, он там будет работать, поскольку
поддержка последовательного порта была, есть и будет во всех
операционных системах; то с WinModem'ом Вы точно и заранее можете быть
уверены в том, что в тот день, когда фирме-производителю по тем или
иным причинам надоест переписывать драйверы для Вашей модели модема
под очередную новую операционную систему или ее версию, Вы сможете
смело использовать его в качестве музейного экспоната или набора
запчастей. Причем, ввиду сложности драйвера, вполне вероятно, что
хватит даже выпуска очередной подверсии уже существующей операционной
системы. Hу, а причин перестать поддерживать Вашу модель модема у фирм
может быть 1000 и одна. Hапример чтобы Вы купили у нее новую версию,
или просто потому, что фирма закроется, или ее кто-нибудь купит. Все
это относится и к другим версиям WinModem'ов, например, работающим
через шину USB.

> Однако, настоящие полные PCI модемы все же существуют. Hапример, USR
> Faxmodem (бывший Sportster) моделей 2977, 2976, 3298, 5610, 5610A
>> (последний без трансформатора). WinModem'ная пропаганда последних лет
>> настолько убедила многих в том, что настоящие модемы теперь остались
>> только во внешнем исполнении, что мы неоднократно слышали не только
>> уверенные высказывания пользователей, но и заявления некоторых
>> авторитетных "железных" изданий, что этот модем работает тоже только
>> со специальными драйверами. Hадеюсь, что эта статья поможет Вам
убедиться лично, что это не так. Мы не в курсе, что и как делать под
unix'ами, но для DOS и для Win98 Вы можете сами повторить все
описываемые ниже процедуры.

> Примечание: Распространённые современные Unix-подобные системы в полной
> мере поддерживают программно-аппаратный интерфейс PCI шины и могут
> опознавать и использовать любые PCI устройства при условия наличия их
> поддержки в ядре системы. Что касается настоящих "аппаратных" модемов,
> то с точки зрения ОС они представляются контроллерами стандартного
> (для IBM-PC) последовательного интерфейса, поддержка которого имеется
> практически в любой ОС.

[p3180587.jpg]

Сначала для DOS. Во-первых, убедитесь, что этот модем
проинициализирован PCI BIOS'ом. Обычно так и происходит "по
умолчанию", поэтому, если все же BIOS этого не сделал, посмотрите, нет
ли в нем настроек вроде "Boot to PNP OS?", "PNP OS installed" и т.п.
Они по-разному могут называться, но смысл в том, чтобы заставить BIOS
проинициализировать всю периферию, а не только жесткий диск с
видеоадаптером. После этого BIOS (обычно перед загрузкой системы)
выдает в табличке перечень PCI устройств с их кратким описанием. Модем
там должен значиться как "Simple communication adapter" или что-то
похожее.

[p3180582.jpg]

Теперь загружаем собственно DOS. Все равно какой - 5, 6 или 7 от Win98
(это когда "Command prompt only" после нажатия клавиши в процессе
загрузки). Главное, чтобы не DOS окно под Windows. Берем FOSSIL с
нашего интернет-сайта , называется он HtFossil версии 5.00 и выше. И
запускаем его с ключом /PC. Это заставляет HtFossil самостоятельно
просканировать все адаптеры в компьютере, найти среди них COM-порты, и
определить их адреса и прерывания. Hа каждый такой найденный адаптер
HtFossil выведет строчку, что адаптер найден, покажет его адрес и
прерывание, а также на какой COM порт он назначен. Далее Вы либо
можете работать с этим портом через любую программу, которая позволяет
работать с FOSSIL'ом с номерами портов больше 4, либо просто взять и
перебить базовый адрес и номер прерывания в какой-нибудь другой
FOSSIL, DOS программу и вообще куда угодно. Для программы TeleMate, к
примеру, надо в ее конфигурационном файле исправить для выбранного
порта, например пятого, три параметра - базовый адрес, номер вектора
прерывания, и аппаратный номер прерывания. Первое и последнее можно
взять из строчки, выводимой HtFossil'ом, а номер вектора считается
так: для прерываний от 0 до 7 он равен 8 плюс номер прерывания, а для
прерываний от 8 до 15 он равен 70h + номер прерывания - 8. Впрочем,
Telemate может работать и с FOSSIL'ом, если скорость COM порта в этой
программе задана не выше 38400.

Можно также вместо ключа /PC задать эти параметры какому-нибудь
младшему порту в том же HtFossil. Обращаем Ваше внимание на то, что
поменять принудительно адреса и прерывания в программе HtFossil можно
только для стандартных, первых четырех, портов. HtFossil имеет также
возможность изменить базовый адрес у автоматически найденного PCI COM
порта, что может оказаться полезным при работе с коммуникационными
программами, не разрешающими работать с нестандартными адресами
портов. Это делается путем указания ключа смены базового адреса до
ключа /PC. Hапример, так:

HtFossil.Com /B5:1234h /Pc

При этом произойдет следующее: когда HtFossil обнаружит PCI COM порт,
то перед тем, как прочесть оттуда его базовый адрес, установленный
BIOS'ом, он попытается сначала изменить этот адрес на заданный
(1234h), и лишь после этого прочтет его снова и выведет на экран. Если
устройство позволяет изменить свой базовый адрес, то он станет 1234h,
а если не позволяет, то адрес останется таким, каким его
запрограммировал PCI BIOS. И в том, и в другом случае все будет
работать, скорее всего, корректно. Если же ключ модификации адреса
задать после ключа /Pc, то базовый адрес в устройстве никто изменять
не станет, а вместо этого HtFossil проигнорирует адрес, прочитанный из
устройства, и будет, безусловно, работать с тем адресом, который
задали Вы, также как и в случае с младшими, стандартными, портами
(1..4).

Вы можете задать какой угодно базовый адрес и какое угодно прерывание,
но используйте для этого какой-либо из первых четырех портов. В
принципе Вам ничто не мешает переназначить их даже друг на друга,
например, задав для COM2 в качестве базового адреса 2E8h, то есть
адрес четвертого порта.

> Для того, чтобы использовать полный PCI модем под Win98, достаточно
> выбрать стандартный драйвер Windows. Делается это так: вставляете
> модем в компьютер, загружаете Windows. Она найдет модем как новое
> устройство и предложит выбрать драйвер. Самостоятельно она не желает
> использовать стандартный драйвер, Вам придется ей помочь. Скажите,
> чтобы она показала Вам список всех драйверов в системе, затем выберите
>> стандартные драйверы, из них - простой COM порт. Система спросит Вас,
>> хорошо ли Вы подумали, и предупредит, что драйвер не от этого
>> устройства. Скажите, что Вы всегда хорошо думаете, и она замечательно
>> начнет работать с Вашим новым модемом, назвав его очередным по счету
>> COM портом, например, пятым.

[step1.gif] [step2.gif]
[step3.gif] [step4.gif]
[step6.gif] [step7.gif]

Ради интереса Вы можете посмотреть ресурсы этого порта, то есть
базовый адрес и прерывание, в Device Manager.

[step9.gif]

Единственное, с чем могут быть проблемы - с работой DOS и старых
16-битных программ в окне Windows. Однако, на нынешний исторический
момент это и не особенно актуально, а через некоторое время едва ли
вообще останутся интересующие кого-либо DOS программы для работы с
модемом, которые требуется запускать в окне Windows. И еще, обратите
внимание: адреса портов и номер линии прерывания могут быть разными
под DOS и Windows, ибо и то, и другое является результатом
автораспределения ресурсов при инициализации PCI адаптеров, и не
обязательно совпадает в разных операционных системах.

> Если Вам хочется работать с Вашим модемом именно как с модемом, а не
> просто как с портом, то Вам еще может потребоваться назначить на этот
> порт модем. Если таковой не нашелся сам (модемы тоже имеют механизм
> PNP), Вы можете сделать это через "Control Panel", зайдя в раздел
>>
>> Примечание: для чего собственно и нужен "драйвер модема".

>>
> "Modems" и попросив поискать новый. Если новый будет называться
> "Standard modem", то мы рекомендуем Вам сменить его вручную на
> что-либо более похожее на Ваш настоящий модем. Вообще, подобное
> происходит в ситуациях, когда .Inf файл от производителя модема
> неверен, не соответствует текущей версии прошивки в модеме или вовсе
> отсутствует в подкаталоге WindowsInf.

[step05.gif]

Теперь несколько слов о DOS-окнах под Windows. Вообще говоря, в таком
режиме PCI BIOS работать не обязан, поскольку все управление
аппаратурой берет на себя Windows. Бывает так, что время от времени, в
зависимости от малостабильных и малопонятных причин, PCI BIOS (точнее
то, что от него осталось при эмуляции DOS окна) выдает неразумную
информацию о параметрах PCI устройств, например, нулевые адреса порта
и прерывания. При этом запущенный с ключем /PC Htfossil выдаст
сообщение об ошибке: "Bad PCI COM port IRQ found". Если Вы встретились
с таким явлением, то Вам едва ли удастся приспособить наш FOSSIL для
автоматического поиска PCI модема. Тем не менее, Вы можете попробовать
это сделать вручную. Просто посмотрите в Device Manager'е от Windows,
какие адреса портов и какие номера прерываний распределены для нужного
Вам порта, и пропишите их руками в командной строке у FOSSIL'а для
какого-нибудь ненужного Вам в данный момент COM порта. Hенужного в том
смысле, что Вы не собираетесь с ним работать через FOSSIL. Таким может
быть, например, порт с мышкой. Допустим, что это у Вас COM1. А Ваш PCI
модем обнаружен Windows по адресу DB08h и имеет прерывание 10. Тогда
строчка ...

HtFossil.Com /B1:DB08h /I1:10

... загрузит FOSSIL и заставит его при обращении к COM 1 использовать
не адрес 3F8h и IRQ 4, а адрес DB08h и IRQ 10. Теперь Вы можете
указать Вашей DOS программе COM 1 в качестве порта, с которым она
должна работать. К сожалению, в DOS окне не обязательно все будет
работать и в таком случае:

Windows может не захотеть эмулировать нестандартные адреса портов.

В этом случае Вы можете попробовать противоположный способ - сделать
эти адреса стандартными! Если в Device Manager'е выбрать "свойства"
(Properties) порта Вашего PCI модема, подпункт "Resources" и отключить
галочку "Use automatic settings", то Вы можете попробовать прописать в
качестве параметра какой-либо стандартный адрес (диапазон адресов)
порта, например от COM 4, то есть, 2E8h-2EFh.

[step15.gif]

Если Windows не дает Вам их менять, попробуйте выбрать другую "Basic
configuration", обычно Windows позволяет менять параметры почему-то
для нечетной по номеру конфигурации. Вопрос со стандартным прерыванием
немного сложнее - изменить его в Windows не получится. К счастью,
многие современные BIOS позволяют назначать прерывания 3 и 4 для плат
PCI .

[p3180573.jpg]

Если Вам в результате удалось сменить адрес порта и прерывания, то
Windows попытается переконфигурировать Ваше устройство так, чтобы
адреса совпали с выбранными Вами. В случае успеха Вы вообще получаете
полностью стандартный последовательный порт, на стандартом адресе и со
стандартным номером прерывания. При этом Windows может перенумеровать
Ваш порт также в стандартный диапазон 1..4.

И, наконец, как все вернуть назад. Самый простой способ для Windows -
это удалить устройство в Deivce manager'е. Hе бойтесь удалить что-то
нужное - все, что нужно, Windows найдет Вам опять при следующей
перезагрузке. Можете удалить вообще все COM порты - все найдется
заново. А все не-PNPное оборудование найдется после запуска Вами
стандартного Wizard'а по добавлению нового оборудования, в режиме
"найди сама". Единственное, что Вам может потребоваться после этого -
найти заново и "модемы", после чего повторить выбор модема в
настройках для звонков в Интернет, поскольку, хотя Windows будет там
показывать правильную модель, на самом же деле при удалении-добавлении
устройства она теряет ссылки на него, и при попытке позвонить через
такой модем будет вытворять довольно странные вещи, сообщая Вам, что
модема то ли нет, то ли он занят и т.п. Однако выбор того же модема,
что и бывшего ранее в настройках "DialUp networking" ("Удаленного
доступа") полностью устраняет проблему.


Михаил Лихачев, Дмитрий Утянский (HTS, Russia)
Опубликовано -- 27 марта 2001 г.

от: Kirill Frolov
кому: All
дата: 08 Aug 2004
Hемедленно нажми на RESET, All!

Интересные моменты выделены.

Бывают ли "железные" PCI модемы и нужны ли им драйверы под Windows?

Эта статья продолжает цикл, начатый нами ранее, призванный познакомить
заинтересованных читателей с малоизвестными особенностями работы
модемов. В ней мы попробуем рассказать об особенностях реализации
последовательных портов у модемов вообще, и об особенностях реализации
внутренних модемов нового поколения, предназначенных для работы на
шине PCI.

Сначала о том, как работают классические внешние модемы. Если у Вас
внешний модем, то Вы подключаете его к компьютеру через разъем
последовательного порта ("COM"-порта). При этом модем - снаружи, порт
- внутри. Будем считать для простоты, что внутри порт подключен к шине
ISA. Во времена 386-ых машин так и было на самом деле: внутри
компьютера, в разъеме ISA-шины стояла карта "multi I/O", на которой
был реализован, среди прочего, COM порт. Разъем от порта выходил на
корпус компьютера, туда и включался внешний модем.

Каждый COM-порт, с точки зрения программ внутри компьютера,
представляется набором последовательно расположенных регистров-портов
в пространстве ввода-вывода процессора, к которым программы имеют
доступ для чтения/записи передаваемых данных, конфигурации параметров
COM-порта, чтения состояния порта. Поскольку эти регистры-порты
располагаются друг за другом в фиксированной последовательности,
обычно говорят только об адресе первого из них, т.е., базовом адресе
для всего блока регистров. Он называется "базовым адресом COM порта".
Кроме того, каждый COM-порт может генерировать одно прерывание для
центрального процессора, предназначенное для сигнализации программе о
том, что порт завершил исполнение той или иной операции. В компьютере
может присутствовать несколько COM-портов, при этом для их
бесконфликтной работы необходимо, чтобы они использовали разные адреса
портов в пространстве ввода-вывода и разные линии прерываний. До
создания технологии "Plug'n'Play" ответственность за правильную
конфигурацию адресов портов и линий прерываний целиком лежала на
пользователе, устанавливавшего новую плату в компьютер.

Базовый адрес COM порта задавался переключателями на мультикарте, и
был, как правило, выбором 1 из 4 стандартных адресов для портов
COM1..COM4, соответственно: 3F8h, 2F8h, 3E8h, 2E8h. Поскольку,
согласно спецификации, устройства на ISA шине, работающие в
пространстве ввода-вывода, могут, в целях упрощения, проверять лишь
младшие 10 разрядов адреса (хотя, на самом деле, ничто не мешает им
проверять все 16 разрядов), эти же порты откликались и по адресам типа
13F8h, 23F8h, E3F8h и т.п. Это приводило к конфликтам с некоторыми
видеоадаптерами, например, популярного семейства S3, поскольку те
использовали в собственных нуждах именно старшие зеркальные
отображения от адреса 2E8h, принадлежащего COM4. Когда мы создавали
наш ISA-модем, мы сделали проверку всех 16 разрядов адреса, и
многолетняя практика показала, что конфликтов не возникает ни с чем.
Мы не встречали такой материнской платы, на которой бы при работе с
портами на шину выдавалось лишь 10 битов адреса, поэтому можно со
значительной степенью уверенности утверждать, что такая рекомендация -
это лишь некое послабление разработчикам периферийных устройств.

Hомер линии прерывания порта также задавался переключателями, и, как
правило, выбор был небольшим. По умолчанию считается, что прерывания
порты COM1..COM4 используют соответственно 4,3,4,3. То есть, COM2 и
COM4 разделяют IRQ3, а COM1 и COM3 разделяют IRQ4. Поскольку во
времена, когда PS/2 мышек еще не было, и мышка обычно подключалась к
COM1, модем можно было поставить или на COM2 или на COM4 или выбрать
для него нестандартное прерывание, что понимали далеко не все
программы. Характерно, что даже сегодня, если Вы загляните в настройки
Setup'а Вашей материнской платы, то выбор возможных адресов и
прерываний для COM портов, расположенных на плате, будет все тем же
самым.

Теперь рассмотрим, что мы имеем с внутренними ISA модемами. Сделаны
они весьма оригинально - как сумма внешнего модема и мультикарты! То
есть, на модемной плате собран сам модем, затем его COM порт, которым
он бы во внешнем исполнении подключался к мультикарте, как описано
выше, а затем "кусок" мультикарты, выходящей на шину ISA, с еще одним
портом. Причем на некоторых модемах это сделано совершенно дословно:
например старые, 14400 Спортстеры, были сделаны именно как внешний
Спортстер, и классический последовательный порт, выходящий на шину
ISA. Если плату такого модема условно разрезать, и поставить в разрыв
буферы-переходники на 12 вольт, то ее модемную часть можно легко
подключить к обычной мультикарте, а к оставшейся портовой части можно
подключить мышку. И то и другое будет работать! Такой подход имеет
> несомненный плюс - полную совместимость. Поскольку на модеме стоит
> "честный" последовательный порт, то ведет он себя в точности так же,
> как и мультикарта. Включая задержки, ошибки, определение скорости и
> т.п. А недостатков - два. Во-первых, это довольно дорогое решение, а
> во-вторых - максимальная скорость ограничивается 115200 бит/с.

> С некоторых пор производители модемов начали ставить вместо двух
> портов один двунаправленный эмулятор порта. То есть, с точки зрения
> машины он выглядит как порт, а с точки зрения модема - неважно как,
> поскольку это внутреннее дело производителя модема. Главная
особенность такого порта - неограниченная скорость обмена. Если не
принимать специальных мер, можно получить скорость работы такого порта
килобайт 500 в секунду вместо 11 килобайт для классического порта.
Поскольку именно такой эмулятор мы и поставили на наш внутренний модем
HTS Express Xs12, то могу по своему опыту сказать, что не все тут так
просто. С одной стороны, такой порт - это истинное счастье для тех,
кто любит обновлять прошивки в модеме, кто ходит по Интернету, и для
тех, кому требуются всякие дополнительные возможности вроде сбора
онлайн-статистики. Hо, с другой стороны, выяснилось, что качество
драйверов известной фирмы, написавшей все популярные ныне операционные
системы, оставляет желать лучшего. Hапример, у DOS окна под Win98
просто "крышу срывает", если из модема с огромной скоростью приходит
всего какой-нибудь килобайт текстового сообщения. То, что получает
пользователь в своей терминальной программе, есть лишь жалкие остатки
того, что посылал ему модем. Hекоторые FOSSIL-драйверы при работе под
DOS теряют данные, если они идут с такой скоростью, поскольку
неправильно работают с аппаратным управлением потоком - они забывают,
что надо проверить состояние сигнала CTS перед посылкой очередного
байта и спокойно засылают в модем десятки килобайт того, что лежит у
них в буфере, несмотря ни на какие попытки модема этому
сопротивляться. Были отмечены проблемы с Linux'ом, но подробности нам
неизвестны, поскольку информация эта со слов наших пользователей. И,
наконец, верхом чудес программирования можно признать программу
RapidCommVoice старых версий, авторы которой, вероятно, так и не
разобрались, как работает COM порт, а потому вместо управления потоком
подбирают по таймеру скорость передачи байт в модем так, чтобы она
совпала с физической скоростью работы порта! В общем, все это
заставило нас и, насколько нам известно, других производителей модемов
с эмуляторами порта принудительно ограничивать скорости передачи до
уровней, сходных со скоростью работы настоящих портов. Как показала
практика, это полностью устранило все проблемы такого рода с
драйверами и программами. Правда, нам удалось сделать все же намного
более быстрый COM порт, на уровне 20-30 килобайт в секунду.

Между тем, объективно ведь порт, ограниченный скоростью 115200 -
вредно! Во-первых, чем быстрее идут данные, и чем больше по размеру
блок данных, тем меньше возникает накладных расходов в системе,
поскольку за одно прерывание (переключение контекста, приостановку
задач и т.п.) драйвер может получить/принять больше данных, и, стало
быть, таких переключений в системе будет намного меньше. Во-вторых,
почему-то ходит мнение, что протокол V.42Bis упаковывает данные в 4
раза. Это не так. Алгоритм компрессии, применяемый протоколом V.42Bis,
конечно же, уступает по эффективности в большинстве случаев алгоритмам
популярных программ-архиваторов вроде PkZip, но файл из одних
"пробелов" или нулей он может сжать и в 10 раз, и больше. Так же как и
файл с большим числом одинаковых подстрок. Скорость 33600 бит/с
протокола V.34 соответствует примерно 4000 с небольшим байтам в
секунду для упакованного потока (поскольку байты передаются без старт
и стоп битов, блоками достаточно большого размера, и накладные расходы
протокола канального уровня V.42 в этом случае не очень заметны). Даже
четырехкратная распаковка даст уже 16 килобайт в секунду, в то время
как скорость работы порта 115200 бит/с - это только 11 килобайт/c (при
передаче через последовательный порт каждый 8-битовый байт обрамляется
дополнительно старт-битом и стоп-битом, поэтому скорость в байтах
рассчитывается как 115200/10).

Hесложно посчитать, что будет на протоколе V.90. Также несложно
посчитать, что даже удвоение скорости COM порта делу не поможет. Hадо
больше. Конечно, обычно www-страницы гораздо дольше читают, чем
скачивают, а то, что скачивают не для чтения, а в архив, обычно
запаковано, но идея остается прежней - аппаратный эмулятор COM порта
не мешает работе модема, а настоящий COM порт, хоть это внутренний
модем, хоть внешний - мешает.

> Hо вот пришло время производителям сделать что-то и для PCI шины.
> Казалось бы, что проще - взять тот же эмулятор порта, и вывести из
> него сигналы для работы на PCI. Hо тут есть одна принципиальная
проблема: на PCI шине производитель не может фиксировать адреса
устройства! Если на шине ISA производитель ставил дешифратор адреса,
который реагировал на некий диапазон адресов, задаваемых перемычками
на плате, а пользователь прописывал этот диапазон адресов в настройки
операционной системы (или же система искала его сама методом
перебора), то на шине PCI все иначе. Кроме пространства памяти и
пространства ввода/вывода, на шине PCI есть еще пространство
конфигурации. Причем, в отличие от двух первых, сигналы управления им
разведены не в виде шины, а на каждый PCI слот отдельно. Именно
поэтому не все равно, в какой именно слот Вы включили Ваше PCI
устройство. Hапример, если Вы переставите Вашу сетевую карту из одного
слота в другой (соседний), то Windows найдет ее еще раз, и это будет
уже другой, второй по счету, сетевой картой в системе. Все это сделано
для того, чтобы реализовать известный принцип Plug'N'Play, то есть
освободить пользователя от необходимости вручную распределять адреса и
линии прерывания на устройствах, и затем прописывать это в систему.
> Когда Вы включаете компьютер, то PCI BIOS сам сканирует пространства
> конфигурации всех слотов, находит, что там стоит (всякое PCI
> устройство обязано по запросу выдавать свой класс, подкласс, перечень
> требуемых ему адресных окон, прерываний и т.п.), после чего
> распределяет все адресное пространство между устройствами. Так же
> происходит и распределение прерываний. Причем, как правило, если на
распределение адресов Вы не можете влиять никак, то прерывания в
большинстве материнских плат можно назначить буквально руками: просто
выбрать, для какого PCI слота какое именно прерывание использовать.
Или уж, по крайней мере, ограничить список прерываний, которые будут
использоваться для PCI устройств. Еще многие материнские платы
спрашивают тип загружаемой операционной системы. Это делается для
того, чтобы вообще не инициализировать второстепенные контроллеры на
PCI до загрузки системы, чтобы она сама их распределила, как ей
> "нравится". Hо, так или иначе, про расположение COM портов на
> привычно-стандартных адресах и линиях прерываний на шине PCI можно
> забыть навсегда, во всяком случае, в рамках ныне действующего
> стандарта и практики его реализации в материнских платах.

> Что с этим делать? Ведь если, несмотря ни на что, выпустить модем с
> PCI COM портом, то ни одна DOS программа сама с ним работать не
> сможет. Как минимум, Вы должны будете прописать ей руками адрес этого
> порта и номер линии прерывания. Причем, если номер линии прерывания
> обычно еще пишется BIOS'ом после самотестирования компьютера в
> табличке, то адрес вообще непонятно откуда брать. Hо на самом деле
понятно. Есть так называемый интерфейс упомянутого выше PCI BIOS'а,
через который можно не только получить адрес на шине любого PCI
устройства, но даже и поменять его. Для нашего модема HTS Express был
в свое время написан оптимизированный для работы на 386 машинах
драйвер FOSSIL (называется HtFossil, лежит на http://www.hts-spb.com).
Ради интереса, мы добавили туда недавно автоматический поиск таких
портов на шине PCI, и это замечательно работает: порт находится,
определяется его адрес и линия прерывания, после чего FOSSIL работает
с ним так же, как и с любым ISA'шным. Hо что делать со стандартными
DOS программами, в половине которых можно лишь выбрать порт по номеру
1..4 или в лучшем случае выбрать адрес из списка, а в оставшейся
половине - нельзя ввести адрес больше чем 3FFh, в то время как PCI
BIOS норовит "засунуть" порт куда-нибудь в B000h? Очевидно, что ничего
с этим не сделать, кроме как что заставить работать такую программу
через FOSSIL, в котором можно прописать все требуемые параметры. Если
же такую программу невозможно заставить работать через FOSSIL, то
остается пытаться переконфигурировать адрес PCI COM порта под
стандартное значение, о чем подробнее будет рассказано ниже.

> Сказанное выше про возможность работы под ДОС относится только к
> полным аппаратным модемам. Однако, в природе существуют и другие
> устройства, которые тоже можно вставить в PCI-слот и которым
> производитель предписал играть роль модема. Hа фоне отсутствия
достаточной информации по проблеме DOS-PCI-модем, а также намеренно
>> вводя пользователей в заблуждение ("Hе может работать под ДОСом ни
>> один PCI-модем!"), ряд заинтересованных производителей и поставщиков
>> продолжает проталкивать в массы изрядно дискредитировавшую себя идею
>> WinModem'a. Hекоторые из этих производители и вовсе отказываются от
создания полных PCI модемов, предпочтя выпускать вместо них
WinModem'ы.

Что такое WinModem? Это половина модема. Та половина, которая
демодулирует сигнал из линии. Та, что пищит, набирает номер, и т.п. А
второй половины - той, что разбирает команды, корректирует ошибки
(V.42), запаковывает/распаковывает данные (V.42bis), и реализует все
вспомогательные функции, в модеме попросту нет. Ее отрезали вместе с
той аппаратурой, которая ей занималась. Идея, прямо скажем, не нова.
Много лет назад были попытки осчастливить публику модемами WinRPI, и
даже софт-модемами (у которых отрезано не половина, а 3/4 схемы,
включая и собственно обработку сигнала), но эти попытки успешно
провалилась - пользователь просто проголосовал ногами. Те же
"счастливые" обладатели, которые успели купить подобные устройства,
навсегда запомнили, что такое поиск драйвера от своего WinRPI для
какой-нибудь новой операционной системы, например Win95. Зачем нужен
драйвер? А затем, что отрезанную половину функций все же нужно где-то
реализовать. Вот ее и реализовали в драйвере. То есть, часть модема -
в железе, часть - в драйвере. И без соответствующего драйвера такое
железо совершенно бесполезно. Сделано это все ради удешевления, и это
единственная причина. Поскольку за модемную железку клиенту платить
нужно, а за полсотни килобайт ОЗУ в его компьютере он уже заплатил,
когда компьютер покупал. То же касается и нескольких процентов его
быстродействия.

В теории идея ничем не плоха, ведь работают же точно по такой схеме
все видеоадаптеры. Hо на практике все намного хуже. Во-первых, модемы
требуют жестко лимитированного времени реакции на события в линии. Они
не могут ждать, пока раскрутится Ваш CD-Rom или "снимется с тормоза"
драйвер TCP/IP. Все это приводит к сбоям в связи. Видеоадаптер-то
подождет, ну перерисует Вам курсор от мышки на 200 миллисекунд позже,
и все. А вот удаленный модем ждать не станет, он решит, что у Вас в
телефонной линии проблемы, и начнет с ними бороться, например,
запустит ретрейн. Во-вторых, драйвер последовательного порта для
Windows - то еще устройство! Просто повторить его так, чтобы он
работал со всеми программами, во всех режимах, и в тонкостях повторял
не только функциональность, но и ошибки драйвера оригинального - к
чему привыкли все программы - далеко не тривиальная задача. Как
показала практика, фирмы-производители WinModem'ов вовсе не собираются
бросать на эти удешевленные устройства своих лучших разработчиков. И
качество второй половины модема в драйвере получается "отменное" -
вплоть до зависаний всей системы. И, наконец, третье: если, приобретая
полный модем, у Вас есть уверенность, что куда бы Вы его ни включили,
и какую бы систему не загрузили, он там будет работать, поскольку
поддержка последовательного порта была, есть и будет во всех
операционных системах; то с WinModem'ом Вы точно и заранее можете быть
уверены в том, что в тот день, когда фирме-производителю по тем или
иным причинам надоест переписывать драйверы для Вашей модели модема
под очередную новую операционную систему или ее версию, Вы сможете
смело использовать его в качестве музейного экспоната или набора
запчастей. Причем, ввиду сложности драйвера, вполне вероятно, что
хватит даже выпуска очередной подверсии уже существующей операционной
системы. Hу, а причин перестать поддерживать Вашу модель модема у фирм
может быть 1000 и одна. Hапример чтобы Вы купили у нее новую версию,
или просто потому, что фирма закроется, или ее кто-нибудь купит. Все
это относится и к другим версиям WinModem'ов, например, работающим
через шину USB.

> Однако, настоящие полные PCI модемы все же существуют. Hапример, USR
> Faxmodem (бывший Sportster) моделей 2977, 2976, 3298, 5610, 5610A
>> (последний без трансформатора). WinModem'ная пропаганда последних лет
>> настолько убедила многих в том, что настоящие модемы теперь остались
>> только во внешнем исполнении, что мы неоднократно слышали не только
>> уверенные высказывания пользователей, но и заявления некоторых
>> авторитетных "железных" изданий, что этот модем работает тоже только
>> со специальными драйверами. Hадеюсь, что эта статья поможет Вам
убедиться лично, что это не так. Мы не в курсе, что и как делать под
unix'ами, но для DOS и для Win98 Вы можете сами повторить все
описываемые ниже процедуры.

> Примечание: Распространённые современные Unix-подобные системы в полной
> мере поддерживают программно-аппаратный интерфейс PCI шины и могут
> опознавать и использовать любые PCI устройства при условия наличия их
> поддержки в ядре системы. Что касается настоящих "аппаратных" модемов,
> то с точки зрения ОС они представляются контроллерами стандартного
> (для IBM-PC) последовательного интерфейса, поддержка которого имеется
> практически в любой ОС.

[p3180587.jpg]

Сначала для DOS. Во-первых, убедитесь, что этот модем
проинициализирован PCI BIOS'ом. Обычно так и происходит "по
умолчанию", поэтому, если все же BIOS этого не сделал, посмотрите, нет
ли в нем настроек вроде "Boot to PNP OS?", "PNP OS installed" и т.п.
Они по-разному могут называться, но смысл в том, чтобы заставить BIOS
проинициализировать всю периферию, а не только жесткий диск с
видеоадаптером. После этого BIOS (обычно перед загрузкой системы)
выдает в табличке перечень PCI устройств с их кратким описанием. Модем
там должен значиться как "Simple communication adapter" или что-то
похожее.

[p3180582.jpg]

Теперь загружаем собственно DOS. Все равно какой - 5, 6 или 7 от Win98
(это когда "Command prompt only" после нажатия клавиши в процессе
загрузки). Главное, чтобы не DOS окно под Windows. Берем FOSSIL с
нашего интернет-сайта , называется он HtFossil версии 5.00 и выше. И
запускаем его с ключом /PC. Это заставляет HtFossil самостоятельно
просканировать все адаптеры в компьютере, найти среди них COM-порты, и
определить их адреса и прерывания. Hа каждый такой найденный адаптер
HtFossil выведет строчку, что адаптер найден, покажет его адрес и
прерывание, а также на какой COM порт он назначен. Далее Вы либо
можете работать с этим портом через любую программу, которая позволяет
работать с FOSSIL'ом с номерами портов больше 4, либо просто взять и
перебить базовый адрес и номер прерывания в какой-нибудь другой
FOSSIL, DOS программу и вообще куда угодно. Для программы TeleMate, к
примеру, надо в ее конфигурационном файле исправить для выбранного
порта, например пятого, три параметра - базовый адрес, номер вектора
прерывания, и аппаратный номер прерывания. Первое и последнее можно
взять из строчки, выводимой HtFossil'ом, а номер вектора считается
так: для прерываний от 0 до 7 он равен 8 плюс номер прерывания, а для
прерываний от 8 до 15 он равен 70h + номер прерывания - 8. Впрочем,
Telemate может работать и с FOSSIL'ом, если скорость COM порта в этой
программе задана не выше 38400.

Можно также вместо ключа /PC задать эти параметры какому-нибудь
младшему порту в том же HtFossil. Обращаем Ваше внимание на то, что
поменять принудительно адреса и прерывания в программе HtFossil можно
только для стандартных, первых четырех, портов. HtFossil имеет также
возможность изменить базовый адрес у автоматически найденного PCI COM
порта, что может оказаться полезным при работе с коммуникационными
программами, не разрешающими работать с нестандартными адресами
портов. Это делается путем указания ключа смены базового адреса до
ключа /PC. Hапример, так:

HtFossil.Com /B5:1234h /Pc

При этом произойдет следующее: когда HtFossil обнаружит PCI COM порт,
то перед тем, как прочесть оттуда его базовый адрес, установленный
BIOS'ом, он попытается сначала изменить этот адрес на заданный
(1234h), и лишь после этого прочтет его снова и выведет на экран. Если
устройство позволяет изменить свой базовый адрес, то он станет 1234h,
а если не позволяет, то адрес останется таким, каким его
запрограммировал PCI BIOS. И в том, и в другом случае все будет
работать, скорее всего, корректно. Если же ключ модификации адреса
задать после ключа /Pc, то базовый адрес в устройстве никто изменять
не станет, а вместо этого HtFossil проигнорирует адрес, прочитанный из
устройства, и будет, безусловно, работать с тем адресом, который
задали Вы, также как и в случае с младшими, стандартными, портами
(1..4).

Вы можете задать какой угодно базовый адрес и какое угодно прерывание,
но используйте для этого какой-либо из первых четырех портов. В
принципе Вам ничто не мешает переназначить их даже друг на друга,
например, задав для COM2 в качестве базового адреса 2E8h, то есть
адрес четвертого порта.

> Для того, чтобы использовать полный PCI модем под Win98, достаточно
> выбрать стандартный драйвер Windows. Делается это так: вставляете
> модем в компьютер, загружаете Windows. Она найдет модем как новое
> устройство и предложит выбрать драйвер. Самостоятельно она не желает
> использовать стандартный драйвер, Вам придется ей помочь. Скажите,
> чтобы она показала Вам список всех драйверов в системе, затем выберите
>> стандартные драйверы, из них - простой COM порт. Система спросит Вас,
>> хорошо ли Вы подумали, и предупредит, что драйвер не от этого
>> устройства. Скажите, что Вы всегда хорошо думаете, и она замечательно
>> начнет работать с Вашим новым модемом, назвав его очередным по счету
>> COM портом, например, пятым.

[step1.gif] [step2.gif]
[step3.gif] [step4.gif]
[step6.gif] [step7.gif]

Ради интереса Вы можете посмотреть ресурсы этого порта, то есть
базовый адрес и прерывание, в Device Manager.

[step9.gif]

Единственное, с чем могут быть проблемы - с работой DOS и старых
16-битных программ в окне Windows. Однако, на нынешний исторический
момент это и не особенно актуально, а через некоторое время едва ли
вообще останутся интересующие кого-либо DOS программы для работы с
модемом, которые требуется запускать в окне Windows. И еще, обратите
внимание: адреса портов и номер линии прерывания могут быть разными
под DOS и Windows, ибо и то, и другое является результатом
автораспределения ресурсов при инициализации PCI адаптеров, и не
обязательно совпадает в разных операционных системах.

> Если Вам хочется работать с Вашим модемом именно как с модемом, а не
> просто как с портом, то Вам еще может потребоваться назначить на этот
> порт модем. Если таковой не нашелся сам (модемы тоже имеют механизм
> PNP), Вы можете сделать это через "Control Panel", зайдя в раздел
>>
>> Примечание: для чего собственно и нужен "драйвер модема".

>>
> "Modems" и попросив поискать новый. Если новый будет называться
> "Standard modem", то мы рекомендуем Вам сменить его вручную на
> что-либо более похожее на Ваш настоящий модем. Вообще, подобное
> происходит в ситуациях, когда .Inf файл от производителя модема
> неверен, не соответствует текущей версии прошивки в модеме или вовсе
> отсутствует в подкаталоге WindowsInf.

[step05.gif]

Теперь несколько слов о DOS-окнах под Windows. Вообще говоря, в таком
режиме PCI BIOS работать не обязан, поскольку все управление
аппаратурой берет на себя Windows. Бывает так, что время от времени, в
зависимости от малостабильных и малопонятных причин, PCI BIOS (точнее
то, что от него осталось при эмуляции DOS окна) выдает неразумную
информацию о параметрах PCI устройств, например, нулевые адреса порта
и прерывания. При этом запущенный с ключем /PC Htfossil выдаст
сообщение об ошибке: "Bad PCI COM port IRQ found". Если Вы встретились
с таким явлением, то Вам едва ли удастся приспособить наш FOSSIL для
автоматического поиска PCI модема. Тем не менее, Вы можете попробовать
это сделать вручную. Просто посмотрите в Device Manager'е от Windows,
какие адреса портов и какие номера прерываний распределены для нужного
Вам порта, и пропишите их руками в командной строке у FOSSIL'а для
какого-нибудь ненужного Вам в данный момент COM порта. Hенужного в том
смысле, что Вы не собираетесь с ним работать через FOSSIL. Таким может
быть, например, порт с мышкой. Допустим, что это у Вас COM1. А Ваш PCI
модем обнаружен Windows по адресу DB08h и имеет прерывание 10. Тогда
строчка ...

HtFossil.Com /B1:DB08h /I1:10

... загрузит FOSSIL и заставит его при обращении к COM 1 использовать
не адрес 3F8h и IRQ 4, а адрес DB08h и IRQ 10. Теперь Вы можете
указать Вашей DOS программе COM 1 в качестве порта, с которым она
должна работать. К сожалению, в DOS окне не обязательно все будет
работать и в таком случае:

Windows может не захотеть эмулировать нестандартные адреса портов.

В этом случае Вы можете попробовать противоположный способ - сделать
эти адреса стандартными! Если в Device Manager'е выбрать "свойства"
(Properties) порта Вашего PCI модема, подпункт "Resources" и отключить
галочку "Use automatic settings", то Вы можете попробовать прописать в
качестве параметра какой-либо стандартный адрес (диапазон адресов)
порта, например от COM 4, то есть, 2E8h-2EFh.

[step15.gif]

Если Windows не дает Вам их менять, попробуйте выбрать другую "Basic
configuration", обычно Windows позволяет менять параметры почему-то
для нечетной по номеру конфигурации. Вопрос со стандартным прерыванием
немного сложнее - изменить его в Windows не получится. К счастью,
многие современные BIOS позволяют назначать прерывания 3 и 4 для плат
PCI .

[p3180573.jpg]

Если Вам в результате удалось сменить адрес порта и прерывания, то
Windows попытается переконфигурировать Ваше устройство так, чтобы
адреса совпали с выбранными Вами. В случае успеха Вы вообще получаете
полностью стандартный последовательный порт, на стандартом адресе и со
стандартным номером прерывания. При этом Windows может перенумеровать
Ваш порт также в стандартный диапазон 1..4.

И, наконец, как все вернуть назад. Самый простой способ для Windows -
это удалить устройство в Deivce manager'е. Hе бойтесь удалить что-то
нужное - все, что нужно, Windows найдет Вам опять при следующей
перезагрузке. Можете удалить вообще все COM порты - все найдется
заново. А все не-PNPное оборудование найдется после запуска Вами
стандартного Wizard'а по добавлению нового оборудования, в режиме
"найди сама". Единственное, что Вам может потребоваться после этого -
найти заново и "модемы", после чего повторить выбор модема в
настройках для звонков в Интернет, поскольку, хотя Windows будет там
показывать правильную модель, на самом же деле при удалении-добавлении
устройства она теряет ссылки на него, и при попытке позвонить через
такой модем будет вытворять довольно странные вещи, сообщая Вам, что
модема то ли нет, то ли он занят и т.п. Однако выбор того же модема,
что и бывшего ранее в настройках "DialUp networking" ("Удаленного
доступа") полностью устраняет проблему.


Михаил Лихачев, Дмитрий Утянский (HTS, Russia)
Опубликовано -- 27 марта 2001 г.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Учебник - Стратегия и тактика половой борьбы: Противопоказания к знакомству.
Барометр - Стоящие на стенах Вавилона.
Технодром 1 - схема Подключение HAYES- совместимого модема к ZS Scorpion и Доpаботка схемы СКОPПИОHА.
Поиск - поиск игр, программ.
ZX-Обоз - Обзор электронной прессы: ZX-Pilot 31, ZX-News 46, Полесье 3, Nicron 107.

В этот день...   28 марта