В прошлом выпуске была реализована плата-переходник для подключения ПЗУ к плате Arduino MEGA2560. С тех пор удалось протестировать плату, написать и запустить программу чтения данных из ПЗУ.
На рисунке ниже показан основной цикл программы. Полностью программу можно скачать с репозитория проекта на GitHub.
Основной цикл void loop() обрабатывает две команды, подаваемые от ПК к устройству чтения ПЗУ платы Arduino: „d“ и „r“.
Команда „d“ считывает одно слово wData (2 байта) из ПЗУ по текущему адресу в переменной romAddress, выполняет инкремент romAddress и передает через последовательный порт в компьютер прочитанное слово в виде текстовой строки с шестнадцатиричным представлением значения. Еще программа следит за тем, чтобы возвращаемая строка была всегда одного и того же размера. Например, вместо считанного значения 0 будет сформирована строка «0000».
Команда „r“ сбрасывает romAddress в 0.
Со стороны ПК программа чтения реализована при помощи библиотеки Qt и идущей вместе с ней системой разработки программ Qt Creator. Полностью программу можно скачать с репозитория проекта на GitHub (https://github.com/rlabru/WD21000/tree/master/060_WDromRead).
На рисунке ниже показаны две процедуры, отвечающие за подачу команды чтения данных и накоплением считанных слов ПЗУ.
Процедура slotReadRom() вызывается по нажатию кнопки «Play». Подает команду „r“ для сброса счетчика адреса, команду „d“ для инициирования чтения первого слова из ПЗУ и запускает таймер для информирования пользователя в случае, когда в течении 5 секунд не будет получен ответ от Arduino.
Процедура handleReadyRead() вызывается при получении данных от Arduino. Вначале, производится добавление всех полученных данных в буфер m_readData. Далее, проверяем, что данных пришло более 5 байт и если это так, то останавливаем таймер выдачи ошибки, добавляем в буфер результата полученное слово и проверяем значение счетчика адреса. Если адрес меньше необходимого размера чтения из 32768 слов, то выполняем инкремент адреса, подаем следующую команду чтения и обновляем отображение прогресса чтения. Как только адрес достигает 32768, передаем все прочитанные данные из в шестнадцатиричный редактор и сбрасываем отображение прогресса чтения.
Итак, данные прочитаны. О корректности чтения можно судить по строке «Copyright 1995» и последующим списком возможных моделей диска.
Для проверки качества чтения ПЗУ считываем несколько раз.
У автора в первые разы получались отличающиеся данные. Дело оказалось в плохом контакте микросхемы ПЗУ в панельке. После того, как контакт был исправлен, различий между несколькими попытками чтения не появлялось — значит, скорее всего, все заработало хорошо!
Файл с результатом так же выложен на GitHub (https://github.com/rlabru/WD21000/blob/master/WD21000_rom_62-602111-064.bin).
Дальше будем разбирать ПЗУ и связывать заложенную там программу с аппаратурой.
Посты серии:
Изобретаем жесткий диск. Часть 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)