Итак, приступим к самому магическому действу, а именно, исследованию прошивки нашего подопытного накопителя. Для этого будем использовать IDA disassembler.
Запускаем сей продукт, выбираем «открыть файл» и указываем файл считанный из ПЗУ(см. часть 3 данного опуса). Далее появляется вот такое окно:
Изменяем тип процессора на «Intel 80196NP». Хотя на нашей плате стоит версия NU, однако, с точки зрения разбора кода программы эти процессоры не отличаются. Нажимаем «ОК».
Теперь появляется страница с настройками места загрузки указанного файла:
Задаем все настройки, как показано на рисунке. Нажимаем «ОК».
Дизассемблер разберет все процедуры, которые явно вызываются от места старта программы. Но, как видно, довольно большое количество кода получается не опознано ни как код, ни как данные. На рисунке ниже показан пример такого неизвестного участка кода, начинающейся с адреса 3635. Чтобы его преобразовать в код нужно встать на него и нажать кнопку «c», что означает «понимать как код». Далее, автор обычно проходит весь загруженный код, находит неизвестные участки (поиск: Ctrl-u) и «открывает» их.
Теперь попробуем что-нибудь в этом коде найти. Запускаем PC-3000, открываем ATA-commander и подаем команду чтения идентификационных данных, как показано на рисунке:
Подключаем диск, подаем питание, запускаем команду кнопкой «play» и получаем данные идентификации:
Видно, что они начинаются со слова 427Ah. Теперь попробуем в листинге дизассемблера найти текст (Alt-t) «427A» так, чтобы он был в параметрах какой-нибудь ассемблерной инструкции. Оказывается такое место в коде всего одно:
По адресу 3ED4h в регистр dword_1C загружается константа #427Ah. Далее по тексту видны и другие константы, которые присутствуют в полученном идентификационном секторе.
По адресу 3F35h видно, как в регистр dword_1C загружается адрес места в ПЗУ, где перечислены все модели, которые может иметь семейство данного накопителя. Вот это место:
При попытке прочитать логику выдачи названия модели можно определить: в строке 3F35h в регистр dword_24 загружается некое число, после этого оно умножается на длину строки модели равную 12 и прибавляется к адресу начала таблицы моделей. Стоит заметить, что нулевая позиция таблицы содержит какие-то данные, совсем не похожие на строку модели. Это, видимо, связано с тем, что переменная с номером модели не может принимать нулевое значение. Получается, что ее значение лежит в диапазоне от 1 до 6. Это соответствует количеству головок, которые возможно установить в гермоблок.
На сегодня все. Продолжение следует.
Посты серии:
Изобретаем жесткий диск. Часть 1. (https://blog.rlab.ru/izobretaem-zhestkiy-disk-chast-1-442.html)
Изобретаем жесткий диск. Часть 2. Чтение ПЗУ. (https://blog.rlab.ru/izobretaem-zhestkiy-disk-chast-2-chtenie-pzu-483.html)
Изобретаем жесткий диск. Часть 3. Удалось прочитать ПЗУ. (https://blog.rlab.ru/izobretaem-zhestkiy-disk-chast-3-udalos-prochitat-pzu-500.html)
Изобретаем жесткий диск. Часть 4. Документация на микросхемы. (https://blog.rlab.ru/izobretaem-zhestkiy-disk-chast-4-dokumentatsiya-na-mikroshemi-507.html)