Драйвер 800 не работает с БСВВ фирмы QUADTEL ! альтернатива: драйвер DRV 720

Предлагая вниманию читателей эту статью, авторы ставили перед собой следующие цели: поделиться сведениями о логике работы .драйвера 800, предупредить о его несовместимости с некоторыми типами базовых систем ввода-вывода (БСВВ - BIOS) компьютера и сообщить о драйвере собственной разработки, который можно использовать именно с такими БСВВ.
Коротко о драйвере 800
Драйвер 800 Альберто Паскуале (Alberto Pasquale) давно пользуется заслуженной популярностью у советских пользователей IBM-совместимых компьютеров типа AT. Этому способствовали, на наш взгляд, относительная дороговизна и недостаточная доступность дискет HD (High Density). Дело в том, что среди многочисленных форматов, реализуемых этим драйвером, есть два - 720 и 800 Кбайт, пригодных для дешевых широко распространенных дискет DD (Double Density) и позволяющих радикально повысить объем записываемых данных. При радиальной плотности записи 96 TPI (дорожек на дюйм), по крайней мере, первый из них обеспечивает высокую сохранность информации (практически такую же, как на дискетах 360 Кбайт). Что касается других форматов, с которыми работает драйвер 800, то они не дают столь ощутимого экономического эффекта и, по сведениям авторов, используются значительно реже.
Драйвер 800 - постоянно резидентная программа, расширяющая возможности БСВВД  компьютера. Принцип его действия основан на подмене вектора I3H, благодаря чему он перехватывает все обращения к БСВВД и иногда вмешивается в выполнение функций "Прочесть сектор" (АН=02Н) и "Установить среду" (АН=18Н) [1,3].
Рассмотрим, к чему сводятся действия драйвера 800 при перехвате запросов, посылаемых драйвером НГМД DOS. Распознав обращение к функции "Прочесть сектор", драйвер определяет, не является ли оно запросом на считывание первого сектора  на нулевом цилиндре и нулевой поверхности (сектор начальной загрузки - НЗ), характеризуемым следующими значениями регистров: CH=0, CL=1, DH=0.
Если это так, драйвер считывает сектор с помощью вызова стандартного обработчика прерывания 13Н с возвратом. Затем он определяет количество секторов на дорожках установленной дискеты из расширения блока параметров дискеты (Base parameter block, ВРВ), находящегося в секторе НЗ по смещению 11 [ 1 ]. В противном случае управление передается стандартному обработчику без возврата. Определив число секторов на дорожке, драйвер изменяет таблицу параметров дискеты (указатель на нее он подставляет в вектор 1ЕН вместо указателя стандартной таблицы DOS). Модификации подвергаются поле числа секторов и размеры межсекторного промежутка (GAP) для чтения/записи (в соответствии с таблицей), которая используется БСВВД для настройки контроллера НГМД. Кроме того, для форматов 720 и 800 Кбайт, требующих одинарного перемещения головок (что обеспечивает на дисководах емкостью 1,2 Мбайт работу с 80-дорожечньми дискетами), драйвер 800 заносит в байт состояния дисковода по адресу 40Н:90Н 4- drv, где drv - дисковод (0 иди 1), "магический байт" 54Н, означающий, что скорость передачи данных - 300 Кбит/с, шаг перемещения - одинарный, признак - "Среда установлена" и что дискета 360 Кбайт помещена в дисковод 1,2 Мбайт [4]. Благодаря этому обеспечиваются чтение и запись дискет с нестандартными форматами.
Для работы с дискетами, разумеется, недостаточно операций чтения/записи, необходима также возможность их нестандартного форматирования. С этой целью драйвер 800 обрабатывает функцию "Установить среду" [1,3], которая запрашивается драйвером НГМД DOS перед началом выполнения этой операции, чтобы известить БСВВД о желаемом формате дискеты. При этом в БСВВД передается число цилиндров, поверхностей и секторов на дорожке. БСВВД проверяет эти параметры на допустимость и, если они верны, (т.е. такой формат поддерживается БСВВД и дисководом), устанавливает требуемую скорость передачи данных (500, 300 или 250 Кбит/с) и шат перемещения головок (двойной или одинарный). Затем БСВВД возвращает в ES:DI указатель на таблицу параметров дискеты , подходящую для этого формата, а в регистр АН - нуль.
Межсекторный промежуток (GAP)при различных скоростях передачи данных.Обычно БСВВД содержит несколько таких таблиц, в которых для конкретного формата дискеты специфичны число секторов на дорожке и GAP для форматирования. Из них обычно только три предназначены для дискет 5,25 дюйма и соответствуют трем стандартным форматам - 320 Кбайт, 360 Кбайт и 1,2 Мбайт. Если параметры неверны, БСВВД возвращает в регистр АН отличный от нуля код.
Чтобы получить дискеты с нестандартным форматом, драйвер 800 вносит коррективы в выполнение функции "Установить среду", которую он обрабатывает, не привлекая стандартную БСВВД, возвращая при этом в ES:DI указатель на собственную таблицу параметров дискеты, предварительно модифицированную в соответствии с запрошенным форматом. Дополнительно изменяется уже упомянутый выше байт состояния дисковода, куда заносится 74Н (для 40-дорожечных дискет, скорости передачи данных 300 Кбит/с, формата 360 Кбайт и менее), 54Н (для 80-дорожечных дискет, такой же скорости передачи, формата 720 и 800 Кбайт) и 15Н (для 80- дорожечных дискет, скорости 500 Кбит/с, формата 1,2 Мбайт и более).
Как видно, описанные выше (несколько упрощенно для краткости изложения) действия достаточно просты, что позволило автору (Alberto Pasquale) уместить код драйвера в весьма небольшой объем, составляющий (для широко распространенных его версий) всего 864 байт. Основная нагрузка при этом по чтению/записи и форматированию лежит на БСВВД. Однако успешность этих на первый взгляд универсальных действий оказывается зависимой от типа примененной в компьютере БСВВ. Как показывает практика, драйвер 800 оказывается неработоспособным с некоторыми ее типами, но об этом ниже.
Драйвер 800 и БСВВ фирмы Quadtel
В 1991 г. на советский рынок хлынуло огромное количество компьютеров производства Сингапура, в их числе оказались 12-МГц IBM-совместимые компьютеры типа AT, обладающие относительно неплохими параметрами при сравнительной дешевизне. Неудивительно, что их охотно приобретали. Однако вскоре выяснилось, что с ними не работает любимый многими драйвер 800. Дело в том, что в этих компьютерах была применена БСВВ фирмы Quadtel, Corp., датированная мартом 1990 г., с которой драйвер 800 не совместим. Это обстоятельство огорчило большинство владельцев вновь приобретенных компьютеров. (Есть сведения о невозможности его использования и с некоторыми другими типами БСВВ.) Ориентируясь главным образом на этих пользователей, мы создали свой собственный драйвер, основанный на принципах, гарантирующих его совместимость с любыми БСВВ.
Драйвер DRV720
Предлагаемый драйвер радикально отличается от драйвера 800 наличием собственной БСВВД, способной самостоятельно выполнять такие функции, как чтение, запись, верификация и форматирование. Она, тем не менее, не дублирует полностью БСВВД компьютера. Некоторые сервисные функции стандартной БСВВД (например, определение скорости передачи данных, шага перемещения головок, проверка дисковода на 80-до- рожечность, а также распознавание открытия замка дисковода
-    смены дискеты) не реализуются. Для их выполнения строятся обращения к основной БСВВД компьютера. Благодаря такому подходу удалось получить достаточно компактный драйвер (его размер немногим превосходит 2 Кбайт). Этому способствовал также отказ от поддержки данной версией драйвера ряда форматов, обеспечиваемых драйвером 800. При опросе пользователей выяснилась значительная заинтересованность в таком драйвере. DRV720 может функционировать на любом IBM-совместимом компьютере типа AT с тактовой частотой 12
-    16 МГц, однако его применение, разумеется, оправданно в тех случаях, когда не работает драйвер 800.
Некоторые вопросы реализации DRV720
Особенности драйвера DRV720, упомянутые выше, исключают использование для его взаимодействия с драйвером НГМД DOS непосредственно вектора 13Н. Это вызвано тем, что первичная обработка прерывания INT 13Н осуществляется не стандартной БСВВД, a DOS .
Первичный обработчик DOS INT 13Н выполняет коррекцию указателя на буфер, передаваемого БСВВД драйвером НГМД DOS в ES:BX. Без этой коррекции невозможны операции по обмену данными с файлами (чтение/запись) большими торциями из-за пересечения границ 64-Кбайт физических сегментов буферами. По этой причине DRV720 использует вектор ЮН (обработчик обращения к БСВВД компьютера) [1,31, шагодаря чему драйвер получает на входе уже скорректиро- ишные адреса буферов.
Рассмотрим, как осуществляется распознавание формата ;искеты драйвером DRV720, основанное на взаимодействии ;вух БСВВД. Перед выполнением операций чтения/записи )OS вызывает функцию "Проверить среду" (Test media) 121, ля того чтобы гарантировать перенастройку внутренних труктур DOS в том случае, если пользователь сменил дискету.
На этот запрос драйвер НГМД откликается обращением к БСВВД компьютера для выполнения команды "Прочесть статус замены диска" (Read change-of-disk status, АН=16Н) [1,3]. В ответ на него БСВВД возвращает в регистр АН либо О (если замок дисковода не открывался - дискета не была заменена) , либо 6 (дискета установлена заново).
В зависимости от полученного сообщения БСВВД драйвер НГМД DOS отвечает; "Среда изменена" или "Среда не изменена". В первом случае файловая система инициирует считывание сектора НЗ, содержащего ВРВ, послав запрос драйверу НГМД DOS "Построить ВРВ" (Build ВРВ), во втором - считается, что дискета не заменялась, и вышеописанных действий не производится.
Функция АН=Т6Н положена в основу механизма узнавания DRV720 "своих" форматов 720 и 800 Кбайт. Распознав функцию АН=16Н, обработчик 1NT -ЮН этого драйвера передает управление подпрограмме определения формата дискеты, в результате деятельности которой либо взводится, либо сбрасывается флажок, определяющий, кому будут переданы последующие обращения, стандартной или встроенной БСВВД.
Свою работу подпрограмма начинает с вызова функции АН=1бН стандартной БСВВД, если ответ нулевой (дискета не менялась), управление возвращается запросившей данную функцию программе (обычно драйверу НГМД DOS), в противном случае выполнение подпрограммы продолжается. Затем она пытается определить, не является ли дискета отформатированной на 1,2 Мбайт. Для этого стандартная БСВВД выполняет операцию "Верифицировать сектор" (Verify sector, АН=4) для сектора 1 на нулевой поверхности нулевого цилиндра. Эта функция удобна тем, что не инициирует обмена между контроллером дисковода и оперативной памятью, благодаря чему не требуется буфер. Если при этом будет возвращен ненулевой код, предпринимается еще одна попытка ее выполнения с предварительным сбросом контроллера посредством операции "Рекалибровать" (Recalibrate, АНЮ). Если она также неудачна, встроенная БСВВД DRV720 не включается (сбрасывается флажок обработки обращений встроенной БСВВД), а дискета считается либо поврежденной, либо неформатированной.
Реагировать на эту ситуацию при последующих обращениях предоставляется стандартной БСВВД, и управление возвращается запросившей функцию АН=16Н программе. Выполнение команды "Верифицировать сектор" означает, что стандартная БСВВД уже определила, с какой скоростью передачи данных была записана информация на дискету (500 или 300 Кбит/с), контроллер настроен на эту скорость, а также установлен шаг перемещения головок (верный для дискет 360 Кбайт и 1,2 Мбайт).
Теперь можно выяснить, соответствует ли формат дискеты 1,2 Мбайт. Для этого достаточно проверить уже упомянутый ранее байт состояния дисковода. Наличие в нем 15Н говорит о формате дискеты 1,2 Мбайт, в этом случае флажок обработки обращений встроенной БСВВД сбрасывается и управление возвращается обратившейся программе. Присутствие в этом байте другой информации (обычно 74Н) означает возможность форматов 360, 720 или 800 Кбайт и подпрограмме распознавания предстоит выяснить, с каким из них мы имеем дело. Сначала она определяет, не является ли дискета отформатированной на 360 Кбайт. С этой целью выполняется функция "Верифицировать сектор" для сектора 1 на нулевой поверхности цилиндра 2, однако для выполнения этой операции применяется теперь встроенная БСВВД DRV720, работающая только с одинарным шагом перемещения головок. Поэтому, если дискета 360 Кбайт, т.е. 40-дорожечная, головки окажутся неправильно спозиционированными (для таких дискет на дисководах 1,2 Мбайт необходим двойной шаг перемещения). В результате сектор с идентификатором 02000102Н (второй цилиндр, нулевая поверхность, первый сектор, размер сектора 512 байт [1]) не будет найден, поскольку головки спозиционированы на цилиндр, соответствующий первому цилиндру дискеты 360 Кбайт. Таким образом, для формата 360К код возврата - 4 (сектор не найден), в этом случае флажок обработки обращений со стороны встроенной БСВВД сбрасывается и управление отдается вызвавшей функцию АН=16Н программе.
Если код возврата нулевой, следовательно, формат дискеты - 720 или 800 Кбайт, и осталось понять, какой именно из двух. Для этого подпрограмма распознавания устанавливает в вектор 1ЕН указатель на собственную (драйвера DRV720) таблицу параметров дискеты, предварительно настроенную на 10 секторов на дорожке (согласно табл.). Затем подается команда "Верифицировать сектор" для 10-го сектора на нулевой поверхности нулевого цилиндра дискеты. Для ее выполнения также используется встроенная БСВВД. Если сектор не найден (АН=4>, значит, формат - 720 Кбайт и подпрограмма перенастраивает таблицу параметров дискеты на 9 секторов на дорожке. Если найден (АН=0), формат - 800 Кбайт и изменение таблицы не требуется. И в том и другом случаях флажок обработки обращений встроенной БСВВД взводится и управление возвращается вызвавшей функцию АН=16Н программе.
В случае распознавания команды "Установить среду" (Set media, АН=18Н) управление передается подпрограмме эмуляции этой функции (в том смысле, что эта подпрограмма в большинстве случаев запрашивает выполнение данной функции у стандартной БСВВД и только для форматов 720 и 800 Кбайт выполняет ее самостоятельно). Она проверяет поступившие к ней параметры (число цилиндров, поверхностей и секторов на дорожке). Если они не соответствуют форматам 720 и 800 Кбайт, управление передается стандартной БСВВД. Если параметры оценены как верные, подпрограмма устанавливает скорость передачи данных 300 Кбит/с, что достигается непосредственным обращением к порту контроллера дисковода 3F7H:
MOV DX,3F7H
MOV AL, 1
OUT DX,AL
После этого таблица параметров дискеты DRV720 настраивается либо на 9, либо на 10 секторов на дорожке в соответствии с таблицей, а указатель на нее возвращается обратившейся программе (при использовании программы FORMAT это драйвер НГМД DOS) в ES:DI, которая затем установит этот указатель в вектор 1ЕН. Распознанный или установленный формат высвечивается в верхнем левом углу экрана компьютера: "720К", "800К" или "None". Если обработчик прерывания INT 40Н DRV720 распознает запросы функций начиная с АНЮ по АН=5, он отдает управление либо встроенной, либо стандартной БСВВД.
Завершая рассмотрение взаимодействия двух БСВВД, следует отметить, что встроенная БСВВД использует переменные стандартной БСВВД и ее обработчик прерываний. Помимо векторов 40Н и 1ЕН драйвер DRV720 употребляет вектор 16Н, благодаря применению которого драйвер включается и отключается нажатием некоторых клавиш на клавиатуре (в описываемой версии - сочетание SHIFT+F12). При отключении драйвера он восстанавливает первоначальное содержимое вектора 1ЕН и сбрасывает флажок обработки обращений к вектору 40Н (не встроенной БСВВД, а самого драйвера), в результате чего перестает влиять на работу БСВВД компьютера. В этом случае первоначальное содержимое вектора 40Н не восстанавли вается.
Драйвер DRV720 был испытан как с БСВВД фирмы Quadtel, Corp., так и с другими в средах MS-DOS 3.30 и 4.01. Он неплохо показал себя и может быть рекомендован широкому кругу пользователей. Авторы предполагают в ближайшее время подготовить новую версию драйвера, отличающуюся от предыдущей некоторыми усовершенствованиями, в числе которых следует назвать расширение поддерживаемых форматов и
возможность настройки на любое удобное сочетание клавиш для включения/отключения драйвера.

 


Обсудить вопрос в студенческом форуме

 

Сайт содержит информацию о учебном заведении и студенческой общине и не является официальным