Assembler для начинающих






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


    Области данных дискового драйвера BIOS начинаются у смещения 3EH в
    сегменте DATA.  Первые четыре байта поля данных хранят информацию
    состояния дисководов между операциями.  Семибайтовый буфер с именем
    NEC_STATUS хранит информацию о состоянии контроллера, возвращаемую
    контроллером дисководов фирмы NEC после операций чтения и записи.
    Как видно из управляющих программ, этот буфер позволяет BIOS
    расшифровывать любую ошибку и предоставлять все ошибки в виде
    простого набора кодов ошибок.  Эти коды ошибок программа BIOS
    помещает в байт с именем DISKETTE_STATUS, одновременно возвращая
    его в вызывающую программу в регистре AH после выполнения операций
    ввода-вывода.  Операторы ассемблера после имени DISKETTE_STATUS
    перечисляют все коды ошибок, которые может получить вызывающая
    программа.
 
      Контроллер дисковода фирмы NEC знает положение головки
    чтения-записи в каждом из четырех дисководов, которые он может
    обслуживать. Но для этого контроллер должен войти в синхронизацию с
    этими механизмами до того, как он начнет точно отслеживать текущее
    положение головок; синхронизация нужна потому, что после включения
    питания или после сброса контроллер фирмы NEC не знает, где
    находятся головки. Байт SEEK_STATUS использует младшие 4 бита, по
    одному биту на механизм, чтобы указать, известно ли контроллеру
    текущее положение головок или нет. Когда BIOS посылает сигнал
    сброса в контроллер, он заносит нуль в этот байт. Перед каждой
    операцией обмена данными с дисководами BIOS проверяет этот байт
    установки. Если содержимое бита, соответствующего механизму, с
    которым идет работа, равно 0, BIOS посылает команду рекалибровки
    перед командой установки. На этапе рекалибровки головка
    чтения-записи устанавливается на дорожку 0, и теперь контроллер и
    механизм согласованы в смысле положения головки. Все последующие
    операции установки делаются без предварительной рекалибровки.
 
      Операция рекалибровки играет важную роль и при обычной работе
    для устранения условий появления ошибки. После любой ошибки
    рекомендуется сбросить контроллер. Этим обеспечивается сброс
    условия появления ошибки в контроллере. Байт SEEK_STATUS при этом
    устанавливается равным нулю. Поэтому перед тем, как прикладная
    программа повторит операцию (неудачную операцию нужно повторять по
    крайней мере три раза, так как большинство таких ошибок устранимы и
    не повторяются), выполнится рекалибровка механизма. Это
    автоматически устраняет ошибку, вызванную неправильной установкой,
    когда головка не попала на нужную дорожку. В обычных случаях
    рекалибровка и повторная установка на эту же дорожку устраняет
    ошибку.
 
      Байты MOTOR_STATUS и MOTOR_COUNT управляют двигателем
    дисковода. Адаптер дисковода имеет управляющий регистр, который
    позволяет выбрать двигатель дисковода, который включается в двнное
    время. В этот управляющий регистр можно только записывать данные,
    читать из него нельзя, и байт MOTOR_STATUS является его образом в
    памяти. Перед тем, как выполнить операцию записи-чтения на дискете,
    вы должны дать возможность двигателю разогнаться до необходимой
    скорости, подождав некоторое время - около половины секунды. Если
    двигатель уже работает, ждать не нужно. Чтение конкретного бита в
    этом байте состояния позволяет определить, нужно ли ожидание.
 
      Далее после выполнения операции важно оставить двигатель
    включенным. Есть вероятность, что доступ к дискете вскоре
    повторится; однако здесь нужно выбирать между износом дискеты и
    увеличением времени доступа. BIOS не допускает непрерывного
    вращения двигателей дисководов, для этого в ячейке MOTOR_COUNT
    находится уменьшающийся счетчик. При каждом прерывании от таймера
    этот счетчик уменьшается, и когда счетчик достигает нуля, все
    двигатели выключаются. Обычно временные параметры установлены так,
    что двигатель работет примерно две секунды после завершения
    операции.
 
      В тексте программы обслуживания дисководов BIOS можно увидеть,
    что величина MOTOR_COUNT на одном из первых шагов устанавливается
    равной 255. Тем самым гарантируется, что прерывание от таймера не
    выключит двигатель дисковода в течение операции. Текущее значение,
    представляющее две секунды, записывается в байт счетчика перед
    возвратом из BIOS в вызывающую программу.
 
      На Фиг.9.4 приведены команды управления дисководом. Команда
    сброса пересылает в контроллер параметры механизма, такие как режим
    работы ПДП и скорость предачи. Команда сброса также выполняет
    аппаратный сброс контроллера. Фирма IBM рекомендует выполнять это
    действие после любой ошибки. Это необходимо, так как некоторые
    ошибки (в частности, ошибка по исчерпыванию времени операции,
    получающаяся, если в дисководе нет дискеты) ставят контроллер в
    затруднительное положение. После таких ошибок вернуть контроллер к
    нормальной работе можно только с помощью сброса.