В этой части изучения жесткого диска WD21000 несколько отойдем от плана и немного дополним принципиальную схему и дизассемблер. В прошлой модификации схемы оставались не тронутыми две дискретные микросхемы: инвертор 74LS05 с обозначением U7 и компаратор LM339 с обозначением U8. Хорошо бы уточнить их функции (напоминаю, текущая версия срисованной схемы выложена тут).
Отдельные элементы этих микросхем участвуют в реализации функции выбора магнитной головки. В процессе «прозвона» схемы, я вспомнил, что когда-то в далеком 2000-ом году на заре становления комплекса PC-3000 написал программу, помогающую отключать головки на этих дисках. Такая программа нужна была потому, что на плате не использовалось флэш-пзу и конфигурацию головок нельзя было просто записать в виде таблицы некой карты. Поэтому, вариантов отключения головок было ровно два: модифицировать код в ПЗУ или спаять схему изменения кода выбора головки (на жаргоне тогдашних ремонтников это называлось «перекоммутация»). Собственно, моя программа — это генератор таких схем в зависимости от уже привычной нам в современном мире карты физических головок в виде галочек.
Вот так выглядит интерфейс программы:
Слева карта голов, правее по центру схема выбора головки. Когда все головки включены, то отображается оригинальная схема, реализованная на плате жесткого диска.
В созданной автором реверсированной KiCad схеме эта схема из программы выглядит так:
Для некоторых вариантов карты схема «перекоммутации» простая:
Для отключения головки 2 достаточно поменять проводники местами.
Однако, есть схемы, где требуется припаять дополнительную логическую микросхему «И», что делает «перекомутацию» затейливым трюком с проводками и паяльником:
Микропрограмма определяет количество установленных головок в гермоблоке по номиналу резистора между 16-ым выводом разъема J1 и GND, установленного внутри гермоблока.
На элементе компаратора U8A реализована функция определения, какой номинал резистора установлен в гермоблоке. Для этого при помощи PWM выхода P4.0 устанавливается пробное напряжение и смотрится, срабатывает ли компаратор или нет. Как это выглядит в микропрограмме автор пока не искал.
Таблица соответствия моделей семейства и номиналов резистора в гермоблоке:
Встроенный хелп выглядел так:
Написание хэлпа, помнится заняло больше времени, чем написание самой программы, так как хотелось разложить все по полочкам.
Обращение к выбору головки в дизассемблере выглядит так:
word_56 содержит нормальный номер головки, но мы помним, что его нужно преобразовать к инверсному виду и сместить в биты 5,6 и 7 регистра выдачи данных порта. В коде это делается через таблицу по адресу 0xA2B4:
Видимо, так быстрее, чем использовать битовые операции и сдвиг.
Не забывайте делать бэкап. До новых встреч!
PS. Все публикации этой серии доступны по метке «WD21000».