Да ну, "элита"... Скажете тоже... Вон, Сергей - тот да, Человечище! А я - так, погулять вышел.
Вы уверены, что не спутали меня с дедом Морозом?
И каких же именно подарков Вы от него ждёте?
Добавлено: Ну а для топик-стартера приведу выдержку из описания, которое когда-то много лет назад уже выкладывал в сеть. Это описание неполное, урезанное, поэтому может читаться несколько сумбурно. Тут нет инструкции как нажимать ту или иную кнопку, но зато приведен общий принцип разлочки макстора. Если его понять, то становится неважно каким инструментом работать - хоть АТА-терминалом, хоть досовой лабой, хоть моей программой.
Итак...
Вообще процесс разлочки накопителя очень хорошо (с моей точки зрения) описан в документации ХРТ. Мой совет – скачайте и прочтите, а я постараюсь прокомментировать с добавлением кое-каких команд…
Все нижеследующее опирается на технологию разлочки, использованную в ХРТ.
Вкратце: залить в накопитель ЛЮБУЮ подходящую по версии прошивку, считать с блинов (если читается) образ ПЗУ и посмотреть в самом его хвосте контрольную сумму (КС), залить по той же методике прошивку с нужной КС. Далее можно переходить к правке модулей. А теперь поподробнее…
Для примера взят HDD Maxtor N40p.
Еще одно замечание: страницы конфигурации – CPxx в доке на ХРТ– и оверлеи в доке на PC3000 одно и то же. В цитируемом тексте ниже используется понятие CPxx, я же упоминаю про оверлеи. ОДНО И ТО ЖЕ.
Разлочка накопителей ATHENA и Romulus
Для накопителей ATHENA типовой алгоритм разлочки можно представить в виде
следующей последовательности действий:
1) Поставить перемычки в положение Safe.
Цитирую:
**Установка перемычек нужна не в 100% случаев. Иногда обходится и без них. Но
бывает так, что накопитель отвергает все посланные ему ресурсы. Кажется, в чём дело?
Версии и прочее совпадает… А оказывается, при инициализации просто накопитель просто заглотил с дисков что-то «несъедобное». Если же накопитель стартовал с SAFE перемычкой, то таких проблем не будет. В случае же, если накопитель стартует и тут же останавливает двигатель (попутно прилепляя головки на поверхность), то SAFE положение перемычек – единственное лекарство для него.**
2) Подать питание накопителя
3) Теперь посредством стандартной команды загрузки микрокода 92h загрузить в память винта любой образ ПЗУ из ресурса, у которого версия микропрограммы совпадает с версией, написанной на корпусе накопителя.
Внимание! Загружаем не лоадер целиком – он состоит из кучи оверлеев - а только один из них.
Почему именно любой? Да потому, что нам нужно хотя бы временно разлочить винт, чтобы получить доступ к служебке и посмотреть с какой именно КС нам нужна прошивка. Не исключено, что вам удастся «угадать» с прошивкой с первого раза.
Команда для загрузки микрокода -
01 nn nn 00 00 00 92,
где 01 – загрузка оверлея в память (есть еще загрузка на блины – 07),
nn nn – количество секторов в шестнадцатеричной системе счисления. Можно загрузить максимум 0FFFFh секторов, что равняется 33 553 920 байтам. Но на самом деле, столько и не нужно. Длина образа ПЗУ, например – 131072 байта, 0х100 секторов. Но послать в винт мы должны 0х101 сектор:
01 01 01 00 00 00 92
Первый передаваемый сектор (512 байт) имеет следующую структуру:
01 nn 00 00 kk kk kk kk mm mm mm mm 00 00 00 00
остальное – нули до 512 байт.
Где nn – номер оверлея. Находится по смещению +02 в теле самого оверлея.
mm – длина в байтах.
kk – адрес памяти для загрузки. Для оверлея 00 (образ ПЗУ) он равен 00 00 00 00, а для всех остальных – 00 С0 01 00 (N40p).
Для образа ПЗУ длиной 131072 (0х20000) первые 16 байт первого отсылаемого сектора будут иметь вид
01 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00
А для оверлея 0х1В длиной в 16 384 (0х4000) байт:
01 21 00 00 00 00 92
Затем отсылаем сектор:
01 1В 00 00 00 С0 01 00 00 40 00 00 00 00 00 00 + нули до 512.
А уже затем передаются сектора самого оверлея.
Кстати, все оверлеи присутствуют в лоадерах от досовской аси и начинаются с сигнатуры 4D 4F nn, где nn – их номер.
В этом пункте загружается только образ ПЗУ – оверлей 00!
4) Произведем Reset: в альтернативный порт (0x376 для Secondary IDE) выводится 0хС, затем 0х8. Или 4 и 0.
Как показывает практика, для Poker-ов лучше это сделать 2 раза.
Накопитель должен раскрутить блины и через некоторое время выйти в готовность.
5) Загрузим все остальные оверлеи (кроме 00!!). Их принцип загрузки я уже расписал выше – загружаются аналогично оверлею 00, только в другую область памяти (?).
6) Произвести Reset + рекалибровка + инициализация HDD.
Рекалибровка: 00 00 00 00 00 00 10
Инициализация: 00 3F 00 00 00 AF 91 (в PC3000).
7) Теперь нужно переинициализировать переменные.
Цитирую:
**К особенностям «разлочки» накопителей Maxtor следует отнести тот странный факт, что после заливки всех необходимых оверлеев, они начинают читать служебную область без каких-либо проблем, а вот пишут – со смещением. Смещение – не постоянное. Для разных UBA оно различно. Поэтому если «разлочить» накопитель, залив ему оверлеи и тут же броситься восстанавливать служебную область, то ничего хорошего из этого не выйдет. Вы можете затереть либо восстанавливаемые модули, либо их соседей. Чтобы привести смещение записи в норму, необходимо выбрать пункт меню Actions->Reinit Variables. Если накопитель не выдаст ошибки, значит всё прошло успешно, и он будет прекрасно читать и писать. Если же загорелся светодиод ERR, значит, скорее всего, Вы залили либо образ ПЗУ, либо оверлеи, несовместимые с микропрограммой текущей платы.**
Здесь стоит сделать небольшое лирическое отступление. Вся работа с вендор-командами у максторов идет через конфигурационные сектора. Сначала вводится команда:
00 01 01 FF FF A0 C0
Винт в ответ поднимает флаг DRQ – он готов принять конфигурационный сектор. Оный состоит стандартно из 512 байт, но используются для передачи данных только самые первые байты. Сколько – зависит от самой команды.
Итак, для реинициализации переменных вводим 00 01 01 FF FF A0 C0.
Видим DRQ и отправляем сектор (512 байт), у которого первые 2 байта – Command и Valid – равны 8C 73, а остальные - нули.
8С 73 00 00 00 00 00……
Если индикатор ERR не загорится, то вы угадали с прошивкой и можете сразу переходить к правке модулей. В противном случае идем дальше.
8) Теперь нужно попробовать считать с блинов образ ПЗУ от этого накопителя, или хотя бы его последний модуль для того, чтобы узнать с какой КС нам нужна прошивка. Как? Готовим новый конфигурационный сектор:
53 AC 00 00 00 00 head 00 UBAL UBAH SecCount 00 00 00…
Первые 2 байта – команда чтения/записи служебной области – зависит от третьего байта: 00 – читать, 01 – писать. Head – головка служебной SA. UBAL и UBAH – номер начального сектора модуля в UBA (кто не знает что такое UBA – срочно читать любую доку от максторов). Ну и SecCount – количество читаемых секторов. По какой-то причине максимальное количество секторов при чтении не может быть больше 3. Почему – не знаю, видимо так решили разработчики. Это значит, что вам придется читать максимум по 1536 байт.  Напомню, вы читаете образ ПЗУ длиной 131072 байта.  Но так как интерес представляет только конец модуля, то вздохните с облегчением – весь читать не нужно, достаточно в поле UBA указать конечный адрес модуля и делов-то. 
На N40p образ ПЗУ – модуль с ID=39.
Еще одно лирическое отступление.
Как же микропрограмма винчестера разбирается в том количестве модулей, что есть на нем? Как она помнит, что, скажем, Р-лист находится именно там, а не в другом месте? Или где у нее логи СМАРТа? Или еще что-ндь? Да просто она для поиска обращается к таблице модулей. По-другому Road Map. В ней все и описано: где лежит данный модуль – голова, цилиндр, сектор, какую длину имеет, его ID и тд. То есть своего рода досье. Есть такая таблица и у максторов. Считать ее можно только с разлоченного винта. Таблица содержится в 15 оверлее.
Конфигурационный сектор:
06 F9 00 00 00 00 ….
Ввести команду мало, это была только подготовка к считыванию данных. Если все это дело отправите винту, то увидите, что он снял DRQ и молчит, как рыба об лед. На самом деле он готов отдать вам данные, но очень хочет чтобы его попросили об этом. Подкрепим просьбу командой:
00 01 01 FF FF A0 C1
После ее ввода увидите, что винт смилостивится и поднимет DRQ.
Дальше читать обычными методами пока DRQ не упадет. Если вы пользуетесь всеми любимым hddl, то жмите кнопку «Получить». Если пишете свою программу, то читайте из 0х170 (для Secondary IDE) пока DRQ не упадет.
Итак, вы считали таблицу модулей.
2 байта со смещения 0х20 – количество описанных модулей.
По смещению 0х28 находится именно то, что нам нужно – карта распределения. Нумерация у максторовских модулей сквозная. Это значит, что номера у них чисто условные. Нумеруются они по порядку их упоминания в карте распределения. Но описание каждого модуля отводится 4 байта. Рассмотрим пример:
000028 A0 45 02 00 A2 45 02 00 54 46 00 00 A4 45 01 00 A6 45 78 00 34 46 01 00 …
Условный модуль №0: UBA=45А0, длина=2 сектора.
Условный модуль №1: UBA=45А2, длина=2 сектора.
Условный модуль №2: UBA=4654, длина=0 секторов, не существует, во внимание можно не брать.
Условный модуль №3: UBA=45А4, длина=1 сектор.
Условный модуль №4: UBA=45А6, длина=78 секторов.
Условный модуль №5: UBA=4634, длина=1 сектор.
Ну и так далее…
Первые 2 байта в описании – начальный UBA модуля.
Третий и младшая тетрада (4 бита) четвертого – длина модуля в секторах.
Назначение старшей тетрады четвертого байта пока не раскопал.
Но вернемся к нашим баранам.
Зная теперь из Road Map начальный сектор по UBA и зная длину модуля-образа ПЗУ, можно вычислить и считать именно его конечный сектор. В моем случае оверлей 00 начинался по UBA с 0х4В8 сектора.
0х4B8 + 0x100 – 1 = 0x5B7
Значит, конфигурационный модуль готовим так:
53 AC 00 00 00 00 03 00 В7 05 01 00 00 00…
Отсылаем все это безобразие и взамен получаем последний сектор образа ПЗУ. Самые последние байты в нем – это и есть КС ПЗУ.
Оговорюсь сразу: считать удастся только в том случае, если это возможно. Если в служебке, например, нет бэда на этом месте. Или если головки в полном порядке. Или…
Какое бы вы количество секторов не читали – 1, 2 или 3 – накопитель все равно возвращает 4 сектора. Первый сектор можно смело отбросить, а со второго и будут переданы нужные. Если вы читаете один сектор, то считываемые вами данные находятся во втором. Если читаете 2 сектора, то во втором и третьем. Если три – во втором, третьем и четвертом.
При записи передавать как обычно – только записываемые данные.
9) Передернуть питание винта.
10) Повторить вышеописанную процедуру но уже с ПОДОБРАННЫМ по КС комплектом.
11) Произвести Reset + рекалибровка + инициализация HDD.
12) Переинициализировать переменные. См п. 7.
После выполнения указанных действий, накопитель разлочен и можно переходить
к правке служебной области.
Разлочка накопителей FB3, DMP8, DMP9.
1) Залить в память накопителя по той же методике, что и для Athena, 0x1B, 0x1C и 00 оверлеи и именно в такой последовательности.
2) Сбросить накопитель. См п. 4 описания на Athena и Romulus
3) Залить ВСЕ оверлеи кроме 00.
В большинстве случаев после описанных действий винчестер даст доступ к служебной области.
Структура файла .LDR от PC3000.
[начало лоадера]
512 байт – таблица распределения №1
Оверлей №00
512 байт – таблица распределения №2
Оверлеи в порядке возрастания номеров.
[конец лоадера]
Первые 512 байт – таблица распределения оверлеев в файле лоадера. Ее формат следующий:
01 nn 00 00 00 00 00 00 mm mm mm mm 00 00 00 00
Где nn – номер оверлея, mm – длина его.
Первая таблица, как правило, состоит из описания размещения одного-единственного оверлея – за номером 00, образа ПЗУ. Например:
01 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00
……….
Остальное – нули до 512 байт.
За этой таблицей идет, собственно, сам образ ПЗУ. Длина – 131072 или 0х20000 байта. После него есть еще одна таблица распределения, вторая, тоже длиной 512 байт, в которой расписаны остальные оверлеи. Структура их точно такая же, как и у первой. Только записей будет побольше.
Например:
01 03 00 00 00 00 00 00 00 40 00 00 00 00 00 00
01 04 00 00 00 00 00 00 00 40 00 00 00 00 00 00
01 05 00 00 00 00 00 00 00 40 00 00 00 00 00 00
…………………….
Из нее мы видим, что оверлей номер 03 имеет длину 16 К, номер 04 – столько же, и номер 05 по размеру от них не отстал.
Нужно нам, к примеру, найти оверлей за номером 05 в файле. Высчитываем адрес его начала:
512 (длина первой таблицы распределения) + длина образа ПЗУ + 512 (длина второй таблицы распределения) + сумма длин предыдущих оверлеев.
Оверлеи, кстати, идут подряд, один за одним, без какого-либо перерыва.