Продолжаем исследование из цикла изобретения жесткого диска. За время с прошлой публикации было несколько попыток разобраться в коде подопытного кролика в тему стартовой инициализации. Оказалось, что подробно изучить код написанный на чистом ассемблере и отсутствии описания для двух важных микросхем (WD61C28C и WD61C13A) на практике не получилось. Поэтому, было принято решение пойти вобход. А именно, заполучить возможность инструментации кода программы управления диском. Проще говоря, в каких-то местах внедрить свой код, который лампочкой мигает на не использованной ножке процессора или еще что-нибудь. А как такое сделать, если код программы записан в однократном ПЗУ?
В принципе, можно вместо однократной ПЗУ установить совместимую Flash ПЗУ и ее на программаторе переписывать. Но, более продвинутой методикой является реализация эмулятора 16-и битного ПЗУ, что как бы удобнее, но трудно в реализации. Еще хотелось бы изучить HDD других фирм середины 90-х, что и WD21000, например Fujitsu MPA.
На текущий момент придумана схема эмулятора ПЗУ и выложена на гитхаб:
https://github.com/rlabru/HDD_ROM_Emulator
Печатная плата еще в процессе разработки. Собственно, следующее включение по теме, надеюсь, будет по завершению разработки платы.
Центром эмулятора являются две микросхемы 8-и битной статической память IS61C512, которые со стороны процессора платы жесткого диска видны как 16-и битное ПЗУ, а со стороны персонального компьютера видна как ОЗУ через плату STM32 NUCLEO64.
Переход с уровней 3.3 вольта платы NUCLEO64 на логические уровни 5 вольт памяти и платы HDD выполнен на микросхеме 74LVC4245.
Не забывайте делать бэкап. До новых встреч.
ЗЫ. В теории, производительности NUCLEO64 хватит, чтобы наблюдать, по каким адресам «ходит» программа процессора HDD.
ЗЫ. ЗЫ. Обновлена схема WD21000 на гитхабе https://github.com/rlabru/WD21000/tree/master/sch.
В процессе доработки схемы была найдена библиотека со старыми (эпохи до изобретения даташитов в pdf-формате) каталогами микросхем для жестких дисков:
http://www.bitsavers.org/components
Выделил описание микросхемы VM71110 и загрузил на гитхаб, как дополнение к схеме WD21000.
А Вы пробовали преобразовать ассемблер в Си с помощью декомпилятора (Гидра напрмер) и попытаться разобраться уже в Си-коде?
Преобразовать дизассемблер-текст в СИ хорошо получается, если код собран каким-либо компилятором. Это хорошо работает с современными HDD на основе процессоров ARM, где используют СИ и С++ код. Использую ИДА дизассемблер для этого. А вот в старых дисках разделение на подпрограммы хоть и есть, но его мало и само оформление подпрограмм в одной прошивке может быть в нескольких стилях. Основной цикл написан одним большим куском с кучей переходов. Еще в те времена, очень сильно заморачивались про компактность кода, что приводит к большому количеству табличных вызовов. Т.е. адреса переходов собраны в таблицу и по какому-то правилу вызываются.
Еще с довольно древних дисков есть что-то вроде DLL библиотек, которые подгружаются по мере необходимости в специально отведенную страницу памяти. С механизмами их работы тоже очень много проблем.
Да, мысли как автоматизировать реверсирование такого кода есть… собственно, для этого я и изучаю древние HDD. Дело в том, что в новых дисках есть довольно сложные защиты от реверсирования кода китайцами (США не хочет, чтобы они у них скопировали технологию магнитной записи) и автоматизация реализованная на старых дисках, уверен, существенно поможет проламывать новые.