На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 6 / Команды INPUT и OUTPUT Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Команды INPUT и OUTPUT

Команды INPUT, OUTPUT и OUTPUT & VERIFY (команды 4, 8 и 9 - "Ввод", "Вывод" и "Вывод с проверкой", соответственно) всегда требуются для всех драйверов. При помощи этих команд выполняется передача данных между MS-DOS и устройством.


Команды IOCTL INPUT и IOCTL OUTPUT (коды 3 и 12 - "Ввод команд управления" и "Вывод команд управления", соответственно) являются дополнительными, требующимися только при установленном IOCTL атрибуте (бит 14 слова атрибутов драйвера). Эти команды применяются как с блоковыми так и с символьными драйверами и обеспечивают передачу данных между MS-DOS и драйвером.


Команда OUTPUT UNTIL BUSY (код 16 - "Вывод пока не занято") является необязательной командой и используется исключительно для символьных драйверов, имеющих атрибут NONIBM/OTB (бит 13). Эта команда обеспечивает передачу данных от MS-DOS к устройству. Заметьте также, что эта команда не документирована в IBM Technical Reference Manual для PC-DOS версии 3.30.


Команды OUTPUT и OUTPUT & VERIFY устанавливаются комбинацией пятого бита IOCTL (бит 5 - подготовленный/неподготовленный режим) и опцией VERIFY. Если установлен режим проверки, то весь вывод данных обеспечивается командой OUTPUT & VERIFY. Если режим проверки не установлен, то используется обычная команда OUTPUT. Перевод драйвера в неподготовленный режим (при установке IOCTL бита 5) позволяет осуществлять многобайтные передачи.


Существует комбинация режимов, которая должна была бы вызвать использование команды OUTPUT UNTIL BUSY, но не делает этого. Эта комбинация включает режим без проверки (так что команда OUTPUT & VERIFY не будет использоваться), неподготовленный режим (позволяющий многобайтные передачи) и устройство, поддерживающее команду OUTPUT UNTIL BUSY. Однако, при тестировании этого режима обнаружилось, что команда OUTPUT UNTIL BUSY не выдается никогда, чем и объясняется, наверное, почему IBM опустила эту команду в своей документации.


      ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»
      є                                                                  є
      є Команды INPUT и OUTPUT (3,4,8,9,12,16)                           є
      є                                                                  є
      є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД         ЪДДДї                   є
      є +00 : 22                   Длина         і X і Блок. драйверы    є
      є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД         АДДДЩ                   є
      є +01 : номер           Устройство         ЪДДДї                   є
      є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД         і X і Симв. драйверы    є
      є +02 : команда            Команда         АДДДЩ                   є
      є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД                                 є
      є +03 :                     Статус     ЪДДДДДДДДДДДДДДДДДДДДДДДДДДїє
      є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД     і  Команды :               іє
      є                  Зарезервировано     і                          іє
      є                                      і  03 : IOCTL INPUT        іє
      є                                      і  04 : INPUT              іє
      є                                      і  08 : OUTPUT             іє
      є                                      і  09 : OUTPUT & VERIFY    іє
      є                                      і  12 : IOCTL OUTPUT       іє
      є                                      і  16 : OUTPUT UNTIL BUSY  іє
      є                                      АДДДДДДДДДДДДДДДДДДДДДДДДДДЩє
      є                                                                  є
      є                                           ЧТЕНИЕ      ЗАПИСЬ     є
      є                                                                  є
      є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ЪДДДї ДДДДД ЪДДДї ДДДДДє
      є +13 :        Описатель  носителя          і X і       і   і      є
      є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДДє
      є +14 :               Адрес буфера          і X і       і   і      є
      є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДДє
      є +18 : Количество байтов/секторов          і X і       і X і      є
      є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДДє
      є +20 :           Начальный сектор          і X і       і   і      є
      є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДДє
      є +22 :      Указатель на имя тома          і   і       і X і      є
      є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД АДДДЩ ДДДДД АДДДЩ ДДДДДє
      є                                                                  є
      є Поле  по смещению  18 от начала  блока запроса содержит на  входеє
      є требуемое количество байтов/секторов.  Драйвер должен поместить вє
      є это поле фактическое количество переданных секторов или байтов.  є
      є Указатель на имя тома возвращается только в MS-DOS версии  3.00 иє
      є выше  при условии,  что возвращается ошибка  0FH -- "Недопустимаяє
      є замена диска".                                                   є
      є                                                                  є
      ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј

Все эти команды имеют общую структуру блока запроса, но отличаются типом запрашиваемой операции ввода/вывода и типом драйвера устройства. Ниже перечислены основные параметры, используемые при вызове команд ввода/вывода :


* Сама команда определяет источник и получатель при передаче данных. Важно отметить, что операции управления вводом/выводом предназначены для передачи драйверу различных директив и управляющей информации, а не для передачи данных непосредственно на устройство. Приведем возможные комбинации источника и получателя данных :


                КОМАНДЫ                        ИСТОЧНИК      ПОЛУЧАТЕЛЬ

                INPUT                          Устройство    Буфер
                OUTPUT                         Буфер         Устройство
                OUTPUT VERIFY                  Буфер         Устройство
                OUTPUT UNTIL BUSY              Буфер         Устройство
                IOCTL INPUT                    Драйвер       Буфер
                IOCTL OUTPUT                   Буфер         Драйвер

* Адрес источника или получателя со стороны MS-DOS представляет собой адрес буфера, который либо содержит данные для вывода (команды OUTPUT), либо будет заполнен данными (команды INPUT).


* "Количество байт/секторов" определяет сколько байт (для символьных устройств и в командах IOCTL) или секторов (команды INPUT, OUTPUT и OUTPUT&VERIFY) будет (или было) передано.


* Только для блоковых драйверов задаются параметры "Устройство" и "Начальный сектор", уточняющие местонахождение источника (для INPUT) или получателя (для OUTPUT).


* Параметр "Байт описателя носителя" (только для блоковых устройств) может быть использован для определения формата диска или того факта, что носитель был заменен.


Как только драйвер определил источника и получателя, он выполняет передачу данных. После выполнения передачи драйвер должен вернуть фактическое количество переданных байтов или секторов. Даже если возникла ошибка и установлен индикатор ошибки в возвращаемом слове состояния, MS-DOS считает, что возвращаемое значение параметра "Количество байтов/секторов" корректно. Если драйверу не удалось обновить этот параметр, то возвращаемое значение будет таким же как и переданное драйверу на входе. Вы должны также знать, что даже если передача прошла успешно, счетчик все-таки может иметь неверное значение. Это происходит при возникновении т.н. "перекрытия".


Перекрытие (для блоковых драйверов) возникает в том случае, если передается большее количество байт, чем то которое можно адресовать с помощью сегментного адреса буфера. Приведем следующий пример. Пусть драйвер пересылает 64 сектора по 512 байт каждый из буфера начиная со смещения 8000H. Таким образом, общее количество байт, которые требуется передать, составит 32768 (8000H). Так как начальное смещение в буфере равно 8002H, то смещение последнего байта будет иметь заведомо некорректное значение 10002H. В подобных случаях, т.е. при возникновении перекрытий, драйвер не должен пытаться передавать недостижимую порцию данных.


Каждая команда имеет свои особенные требования для выполнения передачи и отличаются возвращаемым значением статуса и счетчика. Эти требования описаны ниже для каждой из команд.


КОМАНДЫ CTL INPUT и CTL OUTPUT (3 и 12). Это простейшие команды, обычно требуемые только для передачи данных самому драйверу (не устройству) или получения данных от него. Для MS-DOS эти данные не имеют никакого значения, и, более того, могут быть проигнорированы самим драйвером, если ему так захочется. Ответственность за обработку переданных таким образом данных лежит только на драйвере и прикладной программе. Как правило, используются для изменения режимов работы драйвера и/или устройства, хотя возможны и другие варианты. Важно только, чтобы драйвер не забывал правильно устанавливать возвращаемое значение счетчика переданных байтов.


КОМАНДЫ INPUT OUTPUT (4 и 8). Для большинства символьных драйверов логика обработки команд INPUT и OUTPUT весьма незамысловата. Если передача прошла успешно, то устанавливается бит DONE в слове состояния драйвера и драйвер возвращает управление. Если возникла какая-либо проблема, то в слово состояния записывается код соответствующей ошибки (см.табл.6-3), устанавливается счетчик и возвращается управление.


Если символьное устройство не имеет готовых данных на момент выдачи команды INPUT, драйвер может либо подождать или вернуть ошибку "Устройство не готово". При выводе данных, если устройство не может их принять, драйвер также может вернуть эту ошибку. Однако ошибка "Устройство не готово" обычно используется для указа- ния того, что устройство выключено или по каким-либо причинам недоступно. Использование этой ошибки всего лишь для индикации неготовности данных является не слишком хорошим решением, так как получив ошибку "Устройство не готово", MS-DOS запросто может выдать оператору запрос на вмешательство.


Логика работы блоковых драйверов при выполнении операций ввода/вывода более сложная. Как правило, драйвер должен выполнять преобразование номера начального сектора в координаты физического сектора, обычно состоящие из номера цилиндра (дорожки), номера головки и номера физического сектора на дорожке. Возможно, что драйверу придется выполнить операцию перевода головки чтения/записи на соответствующую дорожку перед началом передачи и, может быть, в процессе самой передачи секторов. Более подробно устройство диска описано в главе 11.


Более того, устройства, подобные дисководам, являются источником множества ошибок (см.табл.6-3), таких как "Запись на устройство запрещена", "Неверно переданы данные (ошибка CRC)", "Ошибка при установке головки", "Ошибка при чтении", "Ошибка при записи", и даже такая звучная как "Общая ошибка". Обычно при возникновении ошибки драйвер фиксирует код ошибки в слове состояния, устанавливает счетчик успешно переданных секторов и возвращает управление. Однако одна ошибка требует дальнейшего анализа и обработки - это "Недопустимая смена диска".


Ошибка "Недопустимая смена диска" воспринимается MS-DOS версии 3.0 и выше и только в том случае, когда MS-DOS знает что она имеет дело с устройством, поддерживающем замену носителя (установлен атрибут OCRM в слове атрибутов драйвера). Отличие этой ошибки от остальных заключается в том, что если драйвер информирует MS-DOS о недопустимой замене носителя, MS-DOS должна знать с каким, собственно, диском намеревался работать драйвер. Эта информация определяется именем тома ожидаемого диска, указатель на которое должен вернуть драйвер. Как и в команде MEDIA CHECK, если соответствующее имя драйверу не известно, он должен вернуть адрес строки "NO NAME".


Как узнает драйвер о недопустимой замене носителя? Если драйвер ведет счетчик количества открытий и закрытий, выполненных на устройстве (командами 13 и 14) и диск заменяется пользователем (что определяется другим форматом, другим описателем носителя и т.п.) при количестве открытий превышающем количество закрытий, то делается вывод о том, что замена носителя была недопустимой и формируется ошибка "Недопустимая смена диска".


КОМАНДА OUTPUT & VERIFY (9). Команда OUTPUT & VERIFY(вывод с проверкой) применяется только для тех устройств, в которых возможно считывание данных после их записи на устройство для того, чтобы убедиться в корректности вы- полненной операции. Для таких устройств (например для дисков) драйвер должен выводить данные (также как и по команде OUTPUT), считывать их обратно (так же как по INPUT) и сравнить считанные данные с теми, которые были записаны. Если обнаружена ошибка, то драйверу следует не пытаться повторить неудавшуюся операцию, а сообщить об этой ситуации MS-DOS, вернув соответствующий код ошибки (см.табл.6-3) и количество успешно переданных байтов/секторов.


Как и в случае команды BUILD BPB, обработка команды OUTPUT & VERIFY требует наличия у драйвера внутреннего буфера для считывания проверяемых данных. Если устройство не позволяет считывать данные обратно, то данная команда должна обрабатываться также как и команда OUTPUT (команда 8).


КОМАНДА OUTPUT UNTIL BUSY (16). Команда OUTPUT UNTIL BUSY представляет еще одну разновидность команды OUTPUT. Эта команда, которая используется только с символьными устройствами, драйверы которых имеют атрибут OTB (бит 13 слова атрибутов), позволяет программам передавать большие порции данных устройствам, которые имеют внутренние буфера (таких как принтеры). Драйвер такого устройства должен посылать данные либо до тех пор пока они не кончатся, либо пока устройство в состоянии их принять. Очень важно, чтобы такой драйвер корректно устанавливал счетчик переданных байтов, так чтобы MS-DOS знала какое количество данных уже передано. Обратите внимание, что для этой команды не является ошибочной ситуация, когда передано меньше данных, чем было запрошено.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz