Плата контроллера выполняет функции формирователя интерфейсных сигналов, дешифратора адресов для регистров НЖМД, имеет свое ПЗУ (160000-167777) со слегка модифицированной 326-прошивкой и базовым драйвером НЖМД и статическое ОЗУ (170000-176777).
ДЛЯ ГУРМАНОВ: драйвер расширенной арифметики в 326-ой прошивке оставлен, но, в целях экономии места, заменен на более короткий (старая длина - 2400, новая - 776 байт, но без поддержки FIS). Существует возможность подключения пользовательского драйвера арифметики, например, поддерживающего FIS или более оптимального по быстродействию.
Существующая идеология позволяет подключать любые IDE-накопители емкостью до 2 ГБайт (63. сектора, 16. головок, 4095. дорожек). Накопитель может быть разбит не более, чем на 124. логических диска произвольного об'ема (от 5 кБ до 32 МБ каждый).
РЕГИСТРЫ НЖМД
Адрес регистра Назначение
(чтение/запись)
177740 статус/команда
177742 выбор НЖМД и головки
177744 ст.байт номера дорожки
177746 мл.байт номера дорожки
177750 номер сектора
177752 счетчик секторов
177754 код ошибки/не используется
177756 данные чтения/записи
177741 адрес накопителя/не используется
177743 2-й статус/сброс
ЗАМЕЧАНИЯ:1. 177741 не старший байт 177740, а самостоятельный регистр, расположенный по нечетному адресу (аналогично и 177743).
2. Ввиду того, что у НЖМД и БК разные понятия 0 и 1 на шине (единице на шине БК соответствует низкий уровень напряжения, а на шине НЖМД - высокий), под фразой "бит установлен" следует понимать его отсутствие, т.е. все данные представлены в инверсном коде.
3. Все коды ошибок, команды и константы, относящиеся к регистрам НЖМД, даны в восьмеричном коде и проинвертированы (т.е. "готовы для употребления").
4. ДЛЯ ПРОГРАММИСТОВ: Байтовые команды записи в ОЗУ платы контроллера НЕ РАБОТАЮТ.
Регистр данных (177756) используется для обмена данными с НЖМД. Передача данных осуществляется словами. При выполнении длинных операций байты ЕСС передаются байтами.
Регистр ошибок (177754) определяет состояние НЖМД после выполнения операции. Состояние этого регистра действительно:
1) после выполнения команд, если установлен бит ERR регистра состояния;
2) после выполнения внутренней диагностики НЖМД при включении питания.
В диагностическом режиме и после выполнения команды "Внутренняя диагностика" содержимое регистра ошибок указывает на следующее:
- 376 - нет ошибки;
- 375 - ошибка микроконтроллера;
- 374 - ошибка буферного ОЗУ;
- 373 - ошибка аппаратуры ECC;
- 372 - ошибка микропроцессора НЖМД;
Остальные коды говорят о полной неисправности накопителя.
Значения битов регистра ошибок после выполнения других команд:
- Бит 0 (AMNF) Data Adress Mark Not Found - устанавливается во время выполнения команды "Чтение секторов", если адресный маркер данных соответствующего сектора не найден после правильного нахождения идентификатора.
- Бит 1 (T0NF) Track 0 Not Found - устанавливается только в команде "Рекалибровка", если не обнаружена Дорожка 0.
- Бит 2 (ABRT) Aborted Command - устанавливается при получении из НЖМД состояния "Write fault", "Not seek complete", "Drive not ready" или когда была загружена недействительная команда. Причина ошибки может быть определена при помощи регистров состояния и ошибки.
- Бит 3 - не используется.
- Бит 4 (IDNF) ID Not Found - требуемый цилиндр, головка, сектор не могут быть обнаружены или же произошла ошибка ECC в поле идентификатора.
- Бит 5 - не используется.
- Бит 6 (UNC) Uncorrect Data - ошибка ECC в поле данных. Устанавливается в случае некорректируемой ошибки.
- Бит 7 (BBK) Bad Mark Block - в идентификаторе обнаружена метка дефектного сектора.
Регистр счетчика секторов (177752) содержит количество секторов, требующееся для операции. Передача одного сектора происходит при значении 376, двух - при значении 375 и т.д.. Если при выполнении передачи произошла ошибка записи или чтения очередного сектора, то передача прекращается и в регистре находится количество не переданных секторов, оставшееся после обнаружения ошибки. При успешном завершении команды содержимое этого регистра равно 377.
Регистр номера сектора (177750) содержит стартовый номер сектора. После обработки каждого сектора содержимое этого регистра корректируется. После выполнения команды в данном регистре находится номер последнего обработанного сектора или номер сектора, в котором произошла ошибка. Нумерация секторов производится, начиная с 1 (т.е. 376 - 1-й сектор, 375 - 2-й и т.д.). Максимальный номер стартового сектора (а также максимальный номер головки) определяется при конфигурации НЖМД.
Регистр младшего (177746) и старшего (177744) байтов номера дорожки определяют номер начальной дорожки для которой будет выполняться команда.
Регистр выбора НЖМД/номера головки (177742) имеет следующий вид:
- Биты 0-3 - двоичный код выбранной головки.
- Бит 4 - выбор НЖМД, (DRV = 0 выбран НЖМД 0, DRV = 1 выбран НЖМД 1.)
Например: 377 - головка 0, привод 0; 376 - головка 1, привод 0 и т.д..
ПРИМЕЧАНИЕ: Базовый драйвер, размещенный в ПЗУ платы контроллера поддерживает только один привод. Для двух накопителей, а также для других нужд существует возможность размещения в ОЗУ платы контроллера драйвера пользователя.
Регистр состояния (177740 по чтению) отображает текущее состояние НЖМД. Значение этого регистра обновляется после выполнения каждой команды. Если установлен бит BSY этого регистра, то любые обращения к НЖМД запрещены и значения остальных битов недействительны.
Значения битов регистра состояния:
- Бит 0 (ERR) Error - указывает, что предыдущая команда закончилась с ошибкой, и что в регистре ошибок установлены один или несколько битов. Используется для быстрой проверки успешного завершения команды. Сбрасывается при записи кода новой команды.
- Бит 1 (INX) Index - этот бит устанавливается при каждом обороте магнитного диска. В современных моделях не используется.
- Бит 2 (CORR) Corrected Data - индицирует, что при считывании данных произошла ошибка, которая была успешно скорректирована аппаратурой ECC. Корректируемые ошибки не прекращают мультисекторную передачу.
- Бит 3 (DRQ) Data Request - этот бит показывает, что имеется запрос на обмен данными с буфером сектора НЖМД. По этому запросу необходимо прочитать буфер или записать в него данные, в зависимости от команды.
- Бит 4 (DCS) Drive Seek Complete - индицирует, что головки чтения/записи завершили операцию поиска.
- Бит 5 (WFT) Write Fault - указывает на неисправность в накопителе или попытку выполнения команды "Запись секторов" с некорректными параметрами.
- Бит 6 (DRDY) Drive Ready - устанавливается, когда НЖМД готов к выполнению команды.
- Бит 7 (BSY) Busy - устанавливается во время выполнения команды или диагностики НЖМД. Когда этот бит установлен, никакие другие биты регистра состояния не являются действительными.
Регистр команд (177740 по записи) используется для загрузки кода выполняемой команды. Перед записью кода команды необходимо поместить нужные данные в регистры 177742-177752, когда НЖМД находится в состоянии не занято (BSY сброшен). Команда начинает выполняться сразу же после записи кода в регистр.
Регистр альтернативного состояния (177743 по чтению) содержит такую же информацию, как и регистр состояния. Различие заключается в том, что чтение этого регистра не сбрасывает установленное прерывание IRQ14 от НЖМД (в БК не используется).
Регистр сброса (177743 по записи) содержит следующие управляющие биты:
- Бит 0 - не используется.
- Бит 1 - Interrupt Enable - бит разрешения прерывания от НЖМД (в БК не используется).
- Бит 2 - Soft Reset - программный сброс. Для выполнения сброса необходимо сначала установить, а затем сбросить этот бит.
- Бит 3 - Heads 3 Enable - используется для разрешения выбора головок с 8 по 15 (как правило, не используется).
- Биты 4-7 - не используются.
Регистр адреса накопителя (177741 по чтению) содержит номер головки и НЖМД, выбранные в предыдущей операции.
- Биты 0-1 - биты выбора накопителя 0 или 1.
- Биты 2-5 - содержат двоичный код выбранной головки.
- Бит 6 - Write Gate - активен во время операции записи.
- Бит 7 - не используется.
КОМАНДЫ НЖМД
Команды записываются в регистр команд. Если биты DRDY и BSY регистра состояния указывают, что НЖМД готов для приема следующей команды, то вначале должны быть правильно установлены все необходимые параметры в регистрах 177742-177754. Команда начинает выполняться сразу же после ее записи в регистр. После выполнения начальной фазы команды бит BSY сбрасывается, и DRQ-бит указывает на необходимость приема/передачи данных. При установленном DRQ программа принимает 256. слов из буфера сектора через регистр данных или передает их туда. НЖМД сбрасывает DRQ-бит и продолжает выполнение команды, до тех пор, пока значение счетчика секторов не уменьшится до 0.
Коды команд (восьмеричные, даны уже в инверсном виде):
Рекалибровка 357
Чтение секторов 33X
X=7 - с повторами при ошибках
X=6 - без повторов при ошибках
X=5 - длинное с повторами при ошибках
X=4 - длинное без повторов при ошибках
Запись секторов 31X
X=7 - с повторами при ошибках
X=6 - без повторов при ошибках
X=5 - длинная с повторами при ошибках
X=4 - длинная без повторов при ошибках
Верификация 27X
X=7 - с повторами при ошибках
X=6 - без повторов при ошибках
Форматирование дорожки 257
Позиционирование 217
Внутренняя диагностика 157
Инициализация параметров НЖМД 156
Чтение буфера сектора 033
Запись буфера сектора 027
Идентификация НЖМД 023
- Рекалибровка (357) - по этой команде головки НЖМД устанавливаются на нулевую дорожку. Если она не распознана, команда заканчивается установкой бита ERR в регистре состояния и бита T0NF в регистре ошибок.
- Чтение секторов (33X) - по этой команде читаются от 1 до 256. секторов в зависимости от значения регистра счетчика секторов, начиная с назначенного сектора. Если ID сектора или адресный маркер не могут быть считаны, а повторы запрещены (X=6,4), то формируется ошибка IDNF или AMNF. Если повторы разрешены (X=7,5), то соответствующая ошибка формируется после некоторого количества безуспешных повторов. Если при повторе адресный маркер и идентификатор считаны успешно, то операция продолжается и ошибка не фиксируется. После нахождения адресного маркера и идентификатора считывается поле данных и чтение сектора заканчивается безошибочно, с корректируемой или некорректируемой ошибкой данных. Если во время мультисекторного чтения выявлена ошибка, то чтение заканчивается на секторе, где она обнаружена. Таким образом можно определить место ошибки. При выявлении корректируемой ошибки данных устанавливается бит CORR регистра состояния и после его считывания продолжается выполнение команды, если операция не закончена. Если ошибка в данных является некорректируемой, дефектные данные передаются в систему, но выполнение команды прекращается и устанавливается бит UNC регистра ошибок.
Длинное чтение выполняется аналогично обычному, только после передачи в систему 256. слов передаются еще 4 байта ECC. Ошибка ECC поля данных при выполнении этой команды не фиксируется. Передача данных осуществляется словами, а кода ECC - байтами. - Запись секторов (31X) - по этой команде записывается от 1 до 256. секторов (выполняется аналогично команде "Чтение секторов"). После записи в соответствующий сектор полученных данных записываются 4 байта ECC, сформированных НЖМД, если запись обычная, или 4 байта, переданных системой, если запись длинная.
- Верификация (27X) - по этой команде проверяется формат указанной дорожки. Команда выполняется аналогично команде "Чтение секторов", но не передает данных.
- Форматирование (257) - по этой команде производится низкоуровневое форматирование заданной дорожки НЖМД. При выполнении этой команды необходимо записать соответствующие данные в регистры номера головки и дорожки, а затем послать команду в регистр команд. После этого в НЖМД через регистр данных передается буфер, размером в один сектор, подобно тому, как это делается в команде "Запись секторов". В этом буфере первые N слов (где N - число секторов на дорожке) содержат информацию о секторах (мл.байт: 0 - сектор хороший, 200 - сектор плохой; ст.байт: физический номер сектора). Значения остальных байтов буфера безразличны. Не следует забывать об инверсии данных!
Для современных моделей накопителей низкоуровневое форматирование никакой опасности (в смысле выхода из строя) не представляет, многие же ранние версии "Гибли от Low Lewel'a", если их форматировали не программой с завода изготовителя. Но, все таки, форматировать НЖМД лучше под контролем специалиста (если вообще необходимо, т.к. BAD блоки у IDE-накопителей - явление довольно редкое). В некоторых случаях, конечно, форматирование необходимо. - Позиционирование (217) - по этой команде головки НЖМД устанавливаются на указанную дорожку.
- Внутренняя диагностика (157) - выполняется внутренняя диагностика НЖМД, по окончании которой в регистре ошибок формируется код завершения (376, если ошибок не произошло). Расшифровку кодов ошибок см. в файле, описывающем регистры накопителя.
- Инициализация параметров НЖМД (156) - по этой команде НЖМД настраивается на параметры, задаваемые накопителю извне. Данная команда должна выполняться после "сброса" НЖМД. Регистры номера головки (177742) и счетчика секторов (177752) должны содержать максимальный номер головки (счет от 0) и максимальное количество секторов на дорожке (счет от 1) соответственно. Следует учитывать, что НЖМД не может содержать более 16. головок и 63. секторов на дорожке (физическое ограничение всех IDE накопителей).
- Чтение буфера (033) - по этой команде устанавливается запрос DRQ в регистре состояния. Драйвер может прочитать содержимое буфера сектора (256. слов) через регистр данных.
- Запись буфера (027) - по этой команде устанавливается запрос DRQ в регистре состояния, после этого драйвер должен переслать 256. слов в буфер сектора через регистр данных.
- Идентификация НЖМД (023) - по этой команде в секторный буфер считывается паспорт диска и формируется запрос DRQ в регистре состояния. Паспорт диска - справочная информация о конфигурации и характеристиках НЖМД. Паспорт занимает один сектор (256. слов) и, обычно, зашит в ПЗУ на плате НЖМД, хотя в некоторых старых моделях накопителей он располагался на одной из рабочих поверхностей магнитных дисков.
СТРУКТУРА ПАСПОРТА НЖМД
Смещение Назначение
0 Главное слово конфигурации
2 Количество дорожек
4 Зарезервировано
6 Количество головок
10 Количество байт на дорожке
12 Количество байт в секторе
14 Количество секторов на дорожке
16-23 Спецификация продавца
24-47 Серийный номер (ASCII)
50 Тип контроллера
52 Емкость буфера НЖМД в секторах
54 Количество байт ЕСС
56-65 Версия рабочих программ (ASCII)
66-135 Модель (ASCII)
ЗАМЕЧАНИЕ: При обработке полей 24-47, 56-65 и 66-135 следует делать операцию SWAB. Не забывайте также об инверсии.
Помимо этих команд существуют и другие: например, выключающие двигатель НЖМД для уменьшения потребляемой мощности (так называемые "Power Save" команды), блокирующие внутренний кэш-буфер накопителя, читающие список дефектных блоков, читающие несколько секторов как один блок и др.. Но у фирм-изготовителей НЖМД нет единого стандарта на эти команды, поэтому здесь приведен только общий набор команд, выполняемых ЛЮБЫМИ IDE накопителями.
ЗАПРОСЫ К ДРАЙВЕРУ НЖМД
БЛОК ПАРАМЕТРОВ
Структура блока параметров драйвера НЖМД полностью идентична структуре блока параметров драйвера дисковода. Соответствующими остаются и точки входа для чтения/записи.
Под номером привода теперь следует понимать: 0-1 - дисководы (A:, B:), остальное - логические диски НЖМД (C:, D:, ...).
НЖМД может быть разбит не более чем на 124 логических диска произвольного об'ема.
Записи о логических дисках находятся в таблице разделов, к которой предусмотрен программный доступ (см. ниже). Нумерация логических дисков производится, начиная с нуля (устройству C: соответствует логический диск с номером 0 и т.д.).
Не рекомендуется разбивать накопитель на слишком большое количество логических дисков, потому, что в этом случае затрудняется доступ к ним из операционных систем (не хватает букв), немного замедляется доступ при поблочном чтении через 160004 (т.к. каждый раз пересчитывается CRC таблицы разделов и области конфигурации), да и разобраться в таком обилии информации довольно тяжело.
ЗАМЕЧАНИЕ: Здесь и далее не следует путать логические диски операционных систем (RT11, MKDOS и др.) с логическими дисками НЖМД.
ТОЧКИ ВХОДА В ДРАЙВЕР
160000 Автоматическая загрузка
Параметры отсутствуют.
Алгоритм загрузки описан ниже.
160002 Загрузка с выбранного привода
R0 - номер привода.
Алгоритм загрузки описан ниже.
160004 Чтение/запись по номеру блока
R0 - номер начального блока;
R1 - длина пересылаемого массива данных (слов): положи-
тельная - чтение, отрицательная - запись;
R2 - адрес массива данных;
R3 - адрес начала блока параметров;
34(R3) - номер привода (0-124.).
Если номер начального блока находится вне пределов логического диска, то драйвером генерится ошибка 5 и обмен данными с системой не производится. Если при чтении/записи пересекается граница логического диска, также выдается ошибка 5, но передается максимально возможное количество данных. Если логический диск не определен, выдается ошибка 3. Если НЖМД не подключен или не выдает сигнал готовности в течение определенного промежутка времени, выдается ошибка 6.
При каждом новом обращении к НЖМД производится подсчет CRC таблицы разделов и области конфигурации (простое сложение без учета переноса) и сравнение ее с эталоном, находящимся в области служебной информации. В случае несовпадения таблица разделов и конфигурация повторно считываются в память, заново вычисляются контрольная сумма и количество доступных логических дисков, выполняется программный сброс накопителя, переустановка его параметров (как при загрузке) и выдается ошибка 13(8). Обмен данными не производится. Последующие обращения к НЖМД происходят нормально.
Ошибка 13(8) является сигналом порчи таблицы разделов или области конфигурации и позволяет выявить программу, которая умышленно или неумышленно это сделала.
ЗАМЕЧАНИЕ: Под областью конфигурации понимаются поля HD$TRK, HD$HEA, HD$SEC и HD$LOG области служебной информации.
160006 Чтение/запись по номеру сектора, головки и дорожки
R3 - адрес начала блока параметров;
26(R3) - адрес массива данных;
30(R3) - длина пересылаемого массива данных (слов): по-
ложительная - чтение, отрицательная - запись;
32(R3) - мл. 4 бита - номер головки (0-15.),
ст. 4 бита - 0-3 биты номера дорожки;
33(R3) - 4-11 биты номера дорожки;
34(R3) - номер привода (0-124.);
35(R3) - номер начального сектора.
Номер привода при чтении никакой существенной роли не играет, необходимо только, чтобы он был больше или равен 2. Запись же возможна лишь при номере привода, равном 377 (octal), при попытке записи с номером привода от 2 до 376 выдается ошибка 1. Чтение и запись возможны в пределах всего накопителя, разбиение на логические диски не анализируется. При выходе за пределы конфигурации НЖМД, выдается ошибка 5.
ЗАМЕЧАНИЕ: после окончания работы подпрограмм драйвера, связанных с передачей информации (160000-160006, 160012), в R4 помещается адрес регистра ошибок с целью нейтрализации действий программ, которые заносят 0 (и не только) в @R4.
160010 Инициализация блока параметров.
R3 - адрес блока парамеров.
160012 Форматирование
R3 - адрес блока параметров;
32(R3) - мл. 4 бита - номер головки (0-15.),
ст. 4 бита - 0-3 биты номера дорожки;
33(R3) - 4-11 биты номера дорожки;
34(R3) - номер привода (0-124.).
При обращении к дисководам производится форматирование текущей дорожки с текущей стороны. Для НЖМД выполняется команда 'Верификация дорожки'.
160016 Точка входа эмулятора расширенной арифметики
Эмулируются команды EIS: MUL, DIV, ASH и ASHC.
Чтобы подключить эмулятор, занесите адрес его начала в вектор 10(8). При прерывании по резервной команде происходит обращение к эмулятору. Если код команды, вызвавшей прерывание, не является кодом одной из вышеперчисленных команд, происходит выход по вектору 4 с установленным битом C (стандарт RT11), иначе - выполняется программная эмуляция команды.
Имеется возможность подключения пользовательского драйвера расширенной арифметики (см. ниже).
ТАБЛИЦА РАЗДЕЛОВ И СЛУЖЕБНАЯ ИНФОРМАЦИЯ
Статическое ОЗУ расположено по адресам 170000-176777. При работе базового драйвера используются следующие области памяти:
HD$TRK (176776) - число дорожек НЖМД;
HD$HEA (176774) - число головок НЖМД;
HD$SEC (176772) - число секторов на дорожке;
HD$LOG (176770) - всего логических дисков (1-124.), в старшем
байте - номер привода, с которого производится
загрузка по умолчанию;
HD$SPD (176000) - признак повышенной скорости обмена с накопите-
лем (рекомендуется для современных моделей,
повышает скорость чтения/записи в 2 и более
раз, за счет отсутствия ожидаания готовности
при чтении сектора; на старых накопителях мо-
жет привести к сбоям и потере информации!, по-
этому сначала проконсультируйтесь со специа-
листами), признак установлен, если значение
этой ячейки равно 125252;
HD$USR (175776) - указатель на начало драйвера пользователя;
HD$EIS (175774) - указатель на начало пользовательского драйвера
расширенной арифметики (первой командой драй-
вера должна быть NOP, управление передается по
JMP @175774);
Таблица разделов НЖМД начинается с адреса 176766 и имеет стековую структуру (растет вниз). Каждая запись о логическом диске занимает 2 слова и имеет следующий формат:
- слово с большим адресом содержит номер дорожки и головки начала логического диска (мл. 4 бита - номер головки, остальные 12 бит - номер дорожки). Если это слово отрицательно (инверсия по COM), то считается установленной защита записи и при попытке записи выдается ошибка 1;
- слово с меньшим адресом содержит длину логического диска в блоках (максимум: 65535 блоков - 32 Мб).
В слове, следующем за последней записью таблицы разделов, находится CRC таблицы разделов и области конфигурации.
В базовом драйвере НЖМД предусмотрен доступ к таблице разделов. Для общей совместимости с последующими версиями рекомендуется пользоваться им, а не обращаться напрямую к области дополнительного ОЗУ. Итак:
если при вызове 160004 (при 160006 не работает!) указать в R1 число слов для пересылки равное нулю, драйвер возвратит следующую информацию: R0 - размер данного логического диска в блоках (номер привода берется из 34(R3)); R1 - номер дорожки/головки начала логического диска в формате, описанном выше; в область памяти, начиная с адреса из R2 (если R2 не равно нулю) передается следующее:
Смещение Содержимое
0 число дорожек НЖМД;
2 число головок НЖМД;
4 число секторов нв дорожке;
6 число логических дисков.
Кроме того, вычисляются координаты (дорожка, головка, сектор) блока, который был указан в R0 на входе. Если номер блока находится за пределами логического диска, вычисляются координаты последнего доступного блока данного диска. Вычисленные параметры помещаются в соответствующее место блока параметров (см. описание точки входа 160006). После выполнения операции R2 портится.
БУДЬТЕ ВНИМАТЕЛЬНЫ! При подключенном драйвере пользователя эта функция не работает, если последний ее, конечно, не выполняет.
Под служебные нужды отводится нулевая сторона (головка 0) нулевой дорожки. Первые 7 блоков этой области занимает основной загрузчик (Master Boot Record - MBR), который при каждой загрузке с винчестера считывается в ОЗУ с адреса 10000 и запускается, если его первая команда - NOP.
Каждая перезагрузка с НЖМД вызывает обновление в памяти копии таблицы разделов, области конфигурации и проверку их CRC.
В седьмом блоке (восьмом секторе) хранится копия области ОЗУ 176000-177000.
АЛГОРИТМ ЗАГРУЗКИ
Алгоритм загрузки следующий:
- Если НЖМД подключен, то при любой загрузке (в т.ч. с дисководов) с адреса 176000 считывается 8-й сектор.
- Проверяется CRC. Если нужно, то конфигурация считывается из паспорта НЖМД, а таблица разделов инициализируется.
- Выполняется программный сброс накопителя и команда "Инициализация параметров".
- Если номер привода не был указан явно, берется номер привода по умолчанию (из HD$LOG+1). Если в итоге номер привода меньше 2, производится переход к стандартной загрузке.
- С адреса 10000 считывается MBR (первичная загрузка). Если его первая команда - NOP, то управление передается на нее (CALL @#10000); MBR, произведя необходимые действия (например: переконфигурация области со служебной информацией, установка драйверов пользователя и т.д.), возвращает управление драйверу (по RTS PC).
- В основную память с адреса 1000 считывается нулевой блок устройства с номером из 34(R3) и загрузка продолжается по стандартному алгоритму драйверa дисковода (вторичная загрузка).
В случае ошибки загрузка продолжается с дисководов A и B, если загрузка автоматическая, или, в противном случае, прекращается.
ПОДКЛЮЧАЕМЫЙ ДРАЙВЕР ПОЛЬЗОВАТЕЛЯ
Подключаемый драйвер пользователя может располагаться в любом месте ОЗУ. Чтобы его подключить, необходимо по адресу 175776 записать адрес его начала. Первой командой драйвера должна быть NOP, далее идут:
1) точка входа по 160004;
2) точка входа по 160006;
3) точка входа по 160012.
Предполагается, что драйвер пользуется тем же блоком параметров, что и базовый.
Управление драйверу пользователя передается сразу же после вызова базового драйвера, никаких действий по обработке параметров не производится, номер привода не анализируется, контрольная сумма на считается.
Драйвер пользователя возвращает управление базовому, признак ошибки должен находиться в блоке параметров (57(R3)). Коды ошибок стандартные, бит C роли не играет. Управление может возвращаться несколькими способами:
- RTS PC -обычный возврат управления, после которого происходит выход из базового драйвера с установкой бита C и номера ошибки, если 57(R3) содержит ненулевое значение;
- ADD #2,@SP
RTS PC - управление передается драйверу ДИСКОВОДА (напрямую). - ADD #6,@SP
RTS PC - управление передается базовому драйверу, как будто драйвер пользователя не подключен;
Если RTS PC заменить на JSR PC,@(SP)+ (естественно, в первом случае этого делать не следует), то управление от драйверов дисковода или НЖМД будет, по окончании, возвращено в драйвер пользователя.
Существующая система подключаемых драйверов позволяет создавать уникальные драйверы на любой вкус!
Например, можно "отключить" дисководы, "переместив" все логические диски вниз (чтобы не "пропадали" буквы, если вы работаете без дисководов); можно сделать "дырку" для работы с электронным диском.
РАСПРЕДЕЛЕНИЕ ДОП.ОЗУ 170000-175770
В процессе работы программы могут занимать участки доп.ОЗУ и освобождать их в произвольной последовательности. Для бесконфликтной работы программ необходимо придерживаться следующих требований:
- резиденты, размещаемые в доп. ОЗУ, должны быть перемещаемыми;
- программа, которой необходим участок доп. ОЗУ, должна захватывать свободную область, начиная с первой же свободной ячейки. Первое слово свободного участка равно 0;
- в первое слово занимаемого участка вписывается длина этого участка в байтах, в ячейку над этим участком заносится 0. Со второго слова участка начинается список адресов ячеек-указателей, через которые производится адресация к данному участку памяти, список оканчивается нулем. Со следующего адреса располагается тело резидентной программы.
В случае, если какая-либо программа будет освобождать участок доп. ОЗУ ниже рассматриваемого, она должна будет переместить вниз каждый расположенный выше резидент, но перед этим вычесть величину смещения из содержимого тех ячеек-указателей, адреса которых находятся в списке перед телом каждого резидента.
ПРИМЕР:
170000: .WORD TOP1-170000
.WORD ANDOS+654,0 ;ну, к примеру
...
TOP1: .WORD TOP2-TOP1 ;первый драйвер пользователя
.WORD JMP2TO1,0
...
START1: ...
RTS PC
TOP2: .WORD TOP3-TOP2 ;драйвер польз.,установл. вторым
.WORD HD$USR ;=175776
.WORD TOP1+2,0
...
START2: ...
JMP @(PC)+
JMP2TO1:.WORD START1
TOP3: .WORD 0
HD$USR: .WORD START2
В этом примере после, например, переименования логических дисков драйвером-2 (часто бывает нужно для непонятливых программ переименовывать диски в A: или B:), управление будет передано драйверу-1, о предназначении которого автору драйвера-2 скорее всего и неизвестно. Причем не составляет труда удалить драйвер-2 и скорректировать HD$USR...
ПРИЛОЖЕНИЕ
НАЗНАЧЕНИЕ ВЫВОДОВ IDE-ИНТЕРФЕЙСА
Все сигналы IDE-интерфейса является TTL-совместимыми.
I/O указывает направление сигнала. "I" означает вход жесткого диска, "O" - выход. Сигналы, начинающиеся с "/", при низком уровне имеют свое активное состояние.
────────┬────────┬─────┬────────────────────────────────────────
N │ сигнал │ I/O │ Описание
контакта│ │ │
────────┼────────┼─────┼────────────────────────────────────────
2,19,22,│ GND │ │ Общий провод.
24,26, │ │ │
30,40 │ │ │
────────┼────────┼─────┼────────────────────────────────────────
1 │ RES │ I │ Сигнал сброса от процессора.
────────┼────────┼─────┼────────────────────────────────────────
18, 3 │ D15,D7 │ I/O │ Двунаправленная шина данных между
16, 5 │ D14,D6 │ I/O │ процессором и жестким диском для пере-
14, 7 │ D13,D5 │ I/O │ дачи данных, информации о состоянии и
12, 9 │ D12,D4 │ I/O │ управляющей информации. Линии переклю-
10, 11 │ D11,D3 │ I/O │ чаются в высокоомное состояние, если
8, 13 │ D10,D2 │ I/O │ жесткий диск не выбран.
6, 15 │ D9, D1 │ I/O │
4, 17 │ D8, D0 │ I/O │
────────┼────────┼─────┼────────────────────────────────────────
20 │ │ │ Удаленный контакт. Используется в
│ │ │ качестве ключа против переворачивания
│ │ │ кабеля.
────────┼────────┼─────┼────────────────────────────────────────
21 │ │ │ Не используется.
────────┼────────┼─────┼────────────────────────────────────────
23 │ /IOWR │ I │ Сигнал записи для адресов портов
│ │ │ ввода-вывода.
────────┼────────┼─────┼────────────────────────────────────────
25 │ /IORD │ I │ Сигнал чтения для адресов портов
│ │ │ ввода-вывода.
────────┼────────┼─────┼────────────────────────────────────────
27 │/IOCHRDY│ O │ Процессор при доступе к жесткому
│ │ │ диску должен ожидать до тех пор, пока
│ │ │ этот сигнал станет неактивен (у некото-
│ │ │ рых изготовителей не используется).
────────┼────────┼─────┼────────────────────────────────────────
28 │ /ALE │ I │ Address Latch Enable: не использу-
│ │ │ ется для существующих накопителей (до-
│ │ │ бавлен на основании совместимости).
────────┼────────┼─────┼────────────────────────────────────────
29 │ │ │ Не используется.
────────┼────────┼─────┼────────────────────────────────────────
31 │ /IRQ14 │ O │ Interrupt Request: требование пре-
│ │ │ рывания к процессору.
────────┼────────┼─────┼────────────────────────────────────────
32 │ /IO16 │ O │ Указатель на 16-битную передачу
│ │ │ данных.
────────┼────────┼─────┼────────────────────────────────────────
34 │ /PDIAG│ I/O │ Passed Diagnostics: Slave-диск со-
│ │ │ общает Master-диску, что отработала
│ │ │ внутренняя диагностика (отсутствует в
│ │ │ некоторых накопителях).
────────┼────────┼─────┼────────────────────────────────────────
33 │ A1 │ I │ Биты адреса для выбора регистров.
35 │ A0 │ I │
36 │ A2 │ I │
────────┼────────┼─────┼────────────────────────────────────────
37 │ /CS0 │ I │ Card Select: сигнал выбора регист-
38 │ /CS1 │ I │ ров накопителя.
────────┼────────┼─────┼────────────────────────────────────────
39 │ /ACT │ I/O │ Может управлять светодиодом, чтобы
│ │ │ указывать активность накопителя.
────────┴────────┴─────┴────────────────────────────────────────
ВЫБОР РЕГИСТРОВ ВВОДА/ВЫВОДА IDE-ИНТЕРФЕЙСА
──────────────────┬─────┬─────┬─────┬─────┬─────
Выбираемый адрес │/CS0 │/CS1 │ A0 │ A1 │ A2
──────────────────┼─────┼─────┼─────┼─────┼─────
177756 │ 0 │ 1 │ 0 │ 0 │ 0
──────────────────┼─────┼─────┼─────┼─────┼─────
177754 │ 0 │ 1 │ 0 │ 0 │ 1
──────────────────┼─────┼─────┼─────┼─────┼─────
177752 │ 0 │ 1 │ 0 │ 1 │ 0
──────────────────┼─────┼─────┼─────┼─────┼─────
177750 │ 0 │ 1 │ 0 │ 1 │ 1
──────────────────┼─────┼─────┼─────┼─────┼─────
177746 │ 0 │ 1 │ 1 │ 0 │ 0
──────────────────┼─────┼─────┼─────┼─────┼─────
177744 │ 0 │ 1 │ 1 │ 0 │ 1
──────────────────┼─────┼─────┼─────┼─────┼─────
177742 │ 0 │ 1 │ 1 │ 1 │ 0
──────────────────┼─────┼─────┼─────┼─────┼─────
177740 │ 0 │ 1 │ 1 │ 1 │ 1
──────────────────┼─────┼─────┼─────┼─────┼─────
177743 │ 1 │ 0 │ 1 │ 1 │ 0
──────────────────┼─────┼─────┼─────┼─────┼─────
177741 │ 1 │ 0 │ 1 │ 1 │ 1
──────────────────┴─────┴─────┴─────┴─────┴─────
ПРИМЕЧАНИЕ: 0 - низкий уровень сигнала, 1 - высокий.
ОБОБЩЕННЫЙ АЛГОРИТМ РАБОТЫ НЖМД IDE
После подачи питающего напряжения на НЖМД или активизации интерфейсного сигнала /RES, схема сброса накопителя подает сигнал RESET на управляющий микропроцессор, который отрабатывая свою микропрограмму, инициализирует состояние портов ввода/вывода (из-за этого, как правило, останавливается шпиндельный двигатель), очищает рабочую область памяти, программирует однокристальный микроконтроллер и все программируемые микросхемы находящиеся на внутренней шине данных НЖМД. После этого управляющий микропроцессор опрашивает внутренние сигналы работы накопителя и подает сигнал на запуск шпиндельного двигателя. Следующий этап работы микропрограммы - проведение внутреннего теста НЖМД, при котором проверяются: ОЗУ буфера данных, однокристальный микроконтроллер и состояние входных сигналов микроконтроллера со стороны порта НЖМД. После этого управляющий микропроцессор, анализируя период следования импульсов индекс, ожидает, пока шпиндельный двигатель не наберет заданных оборотов и, как только это произойдет, микропроцессор, управляя схемой позиционирования и однокристальным микроконтроллером, перемещает магнитные головки в зону где записана служебная информация и пересылает ее в буферное ОЗУ для дальнейшей работы. После этого управляющий микропроцессор устанавливает биты DRDY и DSC, сбрасывает бит BSY в регистре состояния НЖМД, а в регистр ошибок пересылается код "ошибок не обнаружено" (данные регистры находятся в однокристальном микроконтроллере). Накопитель в таком состоянии может находиться сколь угодно долго ожидая, пока не произойдет запись в регистр команд.
Управление НЖМД IDE производиться с помощью программно доступных регистров 177740-177756, 177741 и 177743 со стороны компьютера. Перед записью команды необходимо проверить бит BSY регистра состояния НЖМД, он должен быть сброшен. После этого подготавливается так называемый файл задания - заполняются регистры, которые участвуют в выполняемой команде (регистр номера сектора, регистр накопителя/головки и т.д.) и в регистр 177740 пересылается команда.
После записи в регистр команд однокристальный микроконтроллер формирует запрос прерывания к управляющему микропроцессору MCINT (Micro Controller Interupt) не следует путать с IRQ14. Обрабатывая процедуру прерывания, управляющий микроконтроллер накопителя устанавливает в регистре состояния НЖМД бит BSY, считывает и интерпретирует содержимое регистра команд. Если ошибочно была подана несуществующая команда, то в регистре ошибок устанавливается бит ABRT, а в регистре состояния устанавливается бит ERR и сбрасывается бит BSY, после чего НЖМД готов к приему следующей команды. Если код команды распознан, то управляющий микропроцессор считывает из микроконтроллера содержимое регистров, участвующих в выполнении данной команды и управление передается на процедуру обработки этой команды, по завершении которой сбрасывается бит BSY регистра состояния. При возникновении ошибки дополнительно формируется регистр ошибок и устанавливается бит ERR в регистре состояния.
ЛИТЕРАТУРА
- Л.В.Букчин, Ю.Л.Безрукий "Дисковая система IBM-совместимых персональных компьютеров", М.: МП "БИНОМ", 1993г.
- В.Морозов, А.Тарахтелюк "Bинчестеры IDE AT, их диагностика и ремонт".
Н. Подкопаев, В. Новак 1994-1995