Что с памятью моею стало
Запомним на века: Повесть о работе с ПЗУ
Помню, ещё в детстве, когда у меня появился первый компьютер, там на материнской плате была магическая микросхема с окошком, сквозь которое было видно кристалл. «Мудрые» взрослые меня пугали, что если посветить солнечным светом на неё, то она быстро сотрётся.
С тех пор у меня было большое желание разобраться, что же это за мистические микросхемы ПЗУ (постоянное запоминающее устройство), как же они работают, как их программировать и стирать. И всё как-то не было повода, да и возможностей аппаратных. А тут, благодаря «Волшебному чемодану» появилась реальная задача, когда необходимо было прочитать прошивку, написать свою и прошить ПЗУ, а также научится стирать микросхемы. И тут я познал как глубока кроличья нора, что есть куча типов ПЗУ с УФ стиранием, что у них разные напряжения работы, разные режимы стирания микросхемы и многое-многое другое. Вопрос, какой программатор выбрать, как стереть микросхему, как её записать, какие сложности при этом.
Несмотря на то, что микросхемы давным-давно в ходу, информация ровным слоем размазана по интернету и головам, приходилось собирать всё в кучу, проходя хоть местами очевидный, но тернистый путь.
▍ Постановка задачи
Как вы помните из предыдущего поста, я столкнулся с необходимостью достать оригинальную прошивку своего устройства. А также, мне хотелось иметь возможность запускать свои программы, которые набирать и компилировать на обычном компьютере, потому что вручную каждый раз набирать программу в хекс-кодах достаточно быстро надоедает.
Если же вдруг придётся сделать интерфейс ввода прошивки с помощью какого-либо интерфейса, то всё равно придётся писать некий драйвер, и его уже размещать в пользовательском ПЗУ чемодана. Поэтому всё равно встанет необходимость разобраться, как читать и прошивать различные типы ПЗУ.
В этой статье не хочу много внимания уделять УМК-80, она о другом, но всё же поясню, что же происходит. Для того чтобы добраться до ПЗУ, пришлось его полностью разобрать и снять процессорную плату.
Разобранный УМК-80.
Можно даже крупным планом рассмотреть платы этого аппарата, которые ставятся на общую шину.
Прошу не судить строго за качество фото, они сделаны скорее для справки.
Плата порта ввода-вывода, с микросхемой КР580ВВ55А, служит для вывода изображения на дисплей и работы с клавиатурой.
Плата ввода-вывода.
Процессорная плата. Справа видны микросхемы ПЗУ К573РФ1 — 1024×8 бит. Которая с буквой «М» — это основная ПЗУ, содержащая программу монитор. Слева большая микросхема — это ОЗУ, та самая которая расположена с адреса 0×0800 и занимает 1 кБ. Посередине можно увидеть большую микросхему микропроцессора КР580ИК80А.
Процессорная плата.
Если вам интересно посмотреть более качественные фотографии аналогичного чемодана, я настоятельно рекомендую посмотреть ЖЖ пользователя xlat8086. У неё потрясающие фотографии:
Хочу сразу отметить, что её устройство схемотехнически и программно отличается от моего, но в общем случае многие решения аналогичные.
В любом случае, если вы интересуетесь историей айти и старой техникой, настоятельно рекомендую её ЖЖ.
Попутно, раз уж разобрал чемодан, решил заменить конденсатор, который пал смертью храбрых при первом включении. Благодаря многочисленным комментариям под предыдущей статьёй, выбрал и поставил нужный.
Обновлённый конденсатор.
Самое крутое, что процессорную плату можно вынуть и вставить сверху как дочернюю плату (шина же общая), таким образом можно легко осуществлять замену ПЗУ, и не требуется каждый раз разбирать устройство.
Установленная процессорная плата, в гнездо дочерней, и всё работает.
Ну что же, теперь предстоит квест по чтению ПЗУ, содержащую программу «Монитор» от УМК-80, и как оказалось, это не такая простая задача, как может показаться на первый взгляд.
▍ Не все ПЗУ одинаково полезны
В данной статье говорю о микросхемах EPROM (Erasable Programmable Read Only Memory) или проще говоря ПЗУ с ультрафиолетовым стиранием. Этакие мистические микросхемы с окошком для стирания ультрафиолетом, которые наверняка многие из вас видели их на старых материнских платах, либо в картриджах от игровых приставок, так как игры записывались именно на подобные ПЗУ. На хабре даже были статьи, как делать свои картриджи, и простейший картридж представляет из себя просто прошитую ПЗУ с программой игры.
Как правило, окошко у ПЗУ заклеено каким-то непрозрачным материалом, чтобы от солнечных лучей данные не были стёрты, хотя, как показала личная практика, стереть их не так-то просто.
Мистические микросхемы с окошком.
Для того чтобы стереть микросхему, необходим жёсткий ультрафиолет. И, на самом деле, солнечной радиации будет недостаточно чтобы стереть ПЗУ. Она будет стёрта, но далеко не за один день. Об этом я подробнее остановлюсь ниже.
Для того, чтобы прошить микросхему нужен специальный программатор, который выдаёт высокое напряжение для прошивки. А для старых микросхем, к которому относится К573РФ1 (аналог 2708), ещё и необходимо подать напряжения питания отрицательное напряжение минус 5В, +5 и +12 В (три напряжения питания). И это без учёта подачи напряжения программирования.
Приведу одну замечательную картинку, которая позволяет оценить чем отличаются одна от другой версии ПЗУ микросхем, и по ней можно легко сопоставить схему взаимозамены.
Сопоставление различных типов микросхем ПЗУ.
Так как на отечественные микросхемы не так просто найти документацию, в отличие от западных оригиналов, то я далее буду приводить отсылки к импортной документации. Микросхема К573РФ1 — это полный аналог 2708, а микросхемы КР573РФ2 и КР573РФ5 — полный аналог 2716. Другие нас пока не интересуют, в рамках этой статьи. В принципе, в своём чемодане использовал и 2716, так что это всё одно и то же.
Для того чтобы прошить микросхему, на неё кроме питания требуется ещё подать высокое напряжение на вывод VPP. Для микросхемы 2708 и 2716 — это 26 В!
Поскольку микросхема К573РФ1 aka 2708 для своей работы требует отрицательного и положительного напряжения, то ей требуется специальный программатор, чтобы её прочитать. Пытался найти готовый программатор за вменяемые деньги, который мог бы решить данную проблему, но, увы, не смог. Подобные программаторы стоят больше 50 тысяч рублей, что явно выходит за бюджеты хобби выходного дня. Поэтому придётся думать о переходнике.
Итак, резюмируя, для дальнейшей работы с ПЗУ нам необходимо:
- Ультрафиолетовый стиратель, для стирания ранее записанной информации.
- Программатор для чтения и записи микросхем.
- Переходник для 2708, чтобы её можно было прочитать в обычном программаторе.
▍ Программатор №1
Вообще, предел мечтаний в качестве программатора иметь »Beeprog+», но если вы увидите сколько он стоит, вы, гм…, будете очень неприятно удивлены. Хотя этот программатор без проблем бы смог прочитать и записать любые ПЗУ, без лишних телодвижений. Поэтому пришлось выбирать из более доступных, с достаточными возможностями для моих задач.
На рынке давно есть великолепный китайский программатор »TL866II Plus Universal» который умеет читать и писать множество микросхем. И в комплекте с ним идёт огромное количество различных переходников, с учётом его стоимости — это практически даром. Заказал со всеми возможными панельками и экстрактором, на будущее, вдруг пригодится.
Программатор TL866II Plus Universal.
Набор переходных панелек.
Он прекрасно подойдёт для всяких эпизодических случаев программирования микросхем, в том числе восстановление микроконтроллеров после неудачного программирования FUSE-битов. Штука конечно тоже с характером, но если шить от случая к случаю, то отличная.
Успешное чтение микросхемы 2764.
Программатор умеет работать с ПЗУ, начиная с 2716 (где требуется одно напряжение питания), а вот работать с 2708 aka К573РФ1, где хранится программа монитор, он работать не умеет. Потому что для работы с этой памятью требуется три различных напряжения, одно из которых отрицательной полярности.
Но поскольку голова нам дана не только чтобы шляпу носить, то можно разработать и сделать переходник, который будет питать микросхему К573РФ1 всеми нужными напряжениями, а читать её как микросхему 2716, просто оба килобайта будут заполнены одними и теми же данными. Осталось только сообразить схему, как это будет выглядеть.
▍ Переходник для чтения ПЗУ К573РФ1 aka 2708
Схема переходника достаточно простая: необходимо сделать так, чтобы микросхема 2708 вставала в панельку микросхемы 2716, при этом были поданы на неё питание +12 и минус 5 В, при этом надо следить, чтобы эти напряжения не пошли в программатор. Самая большая загвоздка в том, что напряжения должны подаваться на микросхему при запросе от программатора, поэтому нужна какая-никакая схема коммутации.
Подумал, что всё хорошее придумано за нас, немного поискал и нашёл вполне достойное готовое решение на реле.
Схема переходника для чтения ПЗУ 2708.
Обращаю внимание, что адаптер предназначен именно для чтения микросхем, для того чтобы прошить микросхему, нужно будет его доработать. Но лично я смысла воевать с микросхемами 2708 не вижу, сильно проще использовать вместо них ПЗУ 2716.
На том же сайте приводится схема блока питания, но поскольку операция чтения будет однократной, то и делать блок питания не буду. Вместо него подойдёт обычный компьютерный блок питания, там как раз есть напряжение +12 и минус 5 В.
Распиновка разъёма ATX блока питания. Обратите внимание, что ATX2 уже не подходит для данной задачи.
- Белый провод — это минус 5 В;
- жёлтый +12 В;
- чёрный — общий;
- зелёный PS_ON, замкнуть на землю.
Будьте внимательны: в новых блоках питания ATX2 минус пяти вольт уже нет. AT блок питания тоже подходит для данной задачи.
Распиновка АТ-блока питания.
В результате небольших пассов с паяльником получился такой замечательный переходник.
Готовый переходник.
Вставляю его в программатор, подключаю компьютерный блок питанию, каюсь, до конца не был уверен в успехе. Жму прочитать, щелчки реле, и о чудо, мне удалось прочитать это ПЗУ!
Счастью моему не было предела! Да, оно сработало. И наконец-то я имею нормальный дамп, который можно использовать для своих целей! Кому интересно, вот дамп прошивки чемодана. Из забавного, что вся эта прошивка влезает в экран монитора, там всего 1024 символа.
Прошивка своими глазами.
Следующий этап — это залить данную прошивку на другую ПЗУ и стартануть чемодан с неё.
▍ Переходник для прошивки 2716
Что? Ещё один переходник? На самом деле это особенность программатора TL866 II Plus, он не может выдавать напряжение больше 18 вольт. А для прошивки микросхем 2716 необходимо напряжение 26 В! Поэтому необходимо городить внешний блок питания и схему её коммутации.
Есть отличный проект доработки программатора TL866 II Plus, для прошивки микросхем. У автора этого проекта я также закупаюсь микросхемами ПЗУ, за что ему большое спасибо!
Решил немного облагородить схему, потому что у меня схема на сайте вызывала некоторые вопросы.
Схема переходника программатора.
В качестве источника высокого напряжения использовал USB Buck-Boost, он уже на своём борту имеет вольтметр и удобные способы подключения, как через USB, так и microUSB. Разъём microUSB рекомендую дополнительно пропаять, потому что я быстро оторвал его от платы. Питать блок питания 25 В нужно от отдельного блока питания, например от зарядного устройства для телефона, иначе фокус не удастся.
Поскольку схема всё же какая-никакая есть, долго думал, как размещать все элементы на макетной плате. Даже по малодушию подумал, что стоило сделать отдельную плату и заказать её производство. Но всё же изделие штучное, поэтому взял листок в клетку, разметил точки согласно расположению отверстий и разрисовал расположение элементов, быть может это будет кому-то полезно.
Расположение компонентов (вид снизу), каждое пересечение клеток — это отверстие в макетке.
Делаем несколько волшебных пассов паяльником; путаем расположение коллектора-базы-эмитера у транзисторов; делаем новые пассы паяльником. Десять раз всё проверяем-перепроверяем и получаем замечательный результат.
Готовая плата, вид сверху.
Вид снизу.
После всех проверок, убеждаемся что напряжение включается и подаётся туда куда нужно, радостно пытаемся прошить микросхему.
Включённый переходник.
И получаем всё равно облом, а всё почему? А потому, что микросхему перед прошивкой надо стереть. И стереть её можно только ультрафиолетом.
▍ Стиратель ультрафиолетовых ПЗУ
Первое что приходит в голову, что раз микросхема стирается ультрафиолетом, то положу-ка я её на подоконник и она сотрётся. Но нет, в северных городах даже не стоит этим развлекаться, а в южных это займёт не один день. Энергии нашего светила недостаточно чтобы стереть микросхему быстро.
Второе и самое очевидное — использовать УФ лампу для ногтей. Их просто море отдаётся бесплатно на всевозможных площадках, лично я купил там за 50 рублей (пятьдесят рублей). Вообще, миф использования лапы для ногтей ходит давно, и однозначного ответа можно ли её использовать я не получил, хотя сделал опрос в нескольких телеграмовских чатах. Поэтому всё приходится испытывать самому и делиться с вами уникальной информацией.
В качестве испытуемой микросхемы взял ПЗУ 2764, которая содержала в себе какие-то данные. По-честному обернул ноги фольгой и положил прямо под лампу. Включил лампу на два часа.
Микросхема прямо под лампой, окошком к лампе.
Аппарат честно вонял озоном, делая вид, что он ультрафиолетом безжалостно жжёт микросхему. Два часа она страдала, но каково же было моё удивление, когда спустя два часа я смог без проблем прочитать всю информацию, которая была в ней. Миф разрушен:
Лампы, используемые для отверждения лака на ногтях, применять для стирания ПЗУ нельзя!
Поэтому не занимайтесь ерундой и закажите себе »UV EPROM Eraser». Стоит он не таких уж безумных денег, но сэкономит вам кучу времени и сил. Слышал много советов использовать расколотую лампу ДРЛ, но я не рекомендую так делать. В своё время сам делал мощную УФ лампу из лампы ДРЛ, но это не компактное решение, всё равно придётся делать какой-то ящик для защиты себя от ультрафиолетового излучения, плюс всё это потребует кучу вашего времени. Да и учитывая стоимость ламп ДРЛ, а также баластного трансформатора, экономия сомнительная. А риски работать со ртутными лампами дома достаточно большие.
EPROM стиратель.
Ручной таймер задаёт время стирания в десятках минут. Лично моя практика показала, что 20 минут более чем достаточно, чтобы полностью стереть микросхему. Меньшие цифры я не пробовал.
Обращаю внимание, что этот ультрафиолетовый стиратель весьма опасная штука. Жёсткий ультрафиолет оставляет ожоги на глазах и может привести к слепоте. Также внутри стоит ртутная лампа, с ней надо быть осторожнее, чтобы не разбить, дабы в будущем не дышать парами ртути.
Для того чтобы стереть микросхему нужно ножки микросхемы объединить между собой. Делается это для того, чтобы убрать потенциал при воздействии УФ излучения, поскольку в момент стирания микросхема работает как солнечная батарея, и напряжение, вырабатываемое на ней, может привести к пробою кристалла и выходу устройства из строя.
Всё готово к большой стирке.
Включаем и сквозь отверстие видим выходящее голубое свечение, которое говорит что работа пошла. Долго на это свечение смотреть не стоит, во избежание поражения глаз.
Голубое свечение.
По прошествии 20 минут, можно с успехом попробовать прошить микросхему.
▍ Прошивка микросхемы 2716 и тестирование её в чемодане
Итак, момент истины, не напрасны ли все мои усилия. Ставлю микросхему КМ573РФ2 в программатор через переходник, загружаю считанные ранее данные и прошиваю. Программатор говорит: полный успех.
Успешная прошивка микросхемы.
Теперь попробуем установить КМ573РФ2 вместо микросхемы К573РФ1, для этого сделаем ещё один переходник. Больше переходников богу переходников!
Но он достаточно простой, буквально несколько раз ткнуть паяльником и откусить лишние ноги.
Переходник для установки КМ573РФ2 вместо К573РФ1.
Но факир был пьян и фокус не удался, советские панели имеют очень большие отверстия, пришлось дополнительно делать проставку из текстолита и иголок.
Доработка переходника.
Внимательные заметили, что тут стоит импортная микросхема, но это всё взаимозаменяемо, и как я уже сказал, одно и то же.
Ставим эту порнографию вместо родной микросхемы и пробуем запуститься. И о чудо, полный успех и всё работает.
Далее решил попробовать заливать свои прошивки в данные ПЗУ и столкнулся с тем, что программатор TL866 начал ругаться на отсутствие контакта, то не мог записать ПЗУ, то ещё что-то. И в какой-то момент мне это всё надоело. Тем более совершенно неясно, что же не работает: программатор, мой переходник, либо я плохо стираю ПЗУ.
И захотелось мне иметь другой программатор, который будет работать с 2716 без дополнительных танцев с бубном и переходников. И тут начинается второй квест — подключи программатор на LPT-порт в 2022 году.
▍ Программатор №2 на LPT
Как я уже сказал, у меня возникли проблемы с прошивкой микросхем, и было непонятно кто виноват. Поэтому было принято непопулярное решение, приобрести другой программатор. Очень не хотелось связываться с портом LPT, но все более-менее вменяемые программаторы на USB стоили просто неадекватных денег, для хобби экспериментов. Поэтому решил остановиться на программаторах на LPT-порт, хотя и понимал сколько проблем это вызовет.
В принципе есть суперуниверсальный, чуть ли не Open Source программатор Willem. Его можно найти за сущие копейки, но я боялся что буду иметь множество проблем с установкой ПО для работы с ним, а приобретать дополнительный компьютер мне не хотелось.
Поэтому остановился на более универсальном программаторе »ChipProg-2 Pyton».
Программатор ChipProg-2.
Мне удалось его купить достаточно быстро и с доставкой. Но главная особенность этих программаторов, что они давным-давно сняты с производства и подключение их превращается в незамысловатый квест. Плюс, если учесть, что, я, как и все нормальные люди (сарказм), использую linux, то предстоит настоящий windows way.
Первоначально мне пришлось подобрать операционную систему, которая без проблем встанет на виртуальную машину Virtualbox, не будет падать с синим экраном, и на которой будет работать без проблем ПО программатора. Эмпирическим путём было установлено, что данный программатор может работать только на 32-х разрядных версиях Windows. В результате остановился на 32-битной версии Windows 7.
Следующий этап — железо. В моём компьютере нет LPT-порта, поэтому пришлось докупать дополнительную плату. Какую плату брать, совершенно не имеет значения. Прикупил, что меня устроило по цене, плюс решил, пускай будет два дополнительных СОМ-порта.
Платка LPT-порта.
Одна из неприятных задач будет пробросить аппаратный порт в виртуальную машину с Windows.
После того как установили плату в компьютер, надо посмотреть какие же ресурсы она использует. Нас интересуют порты ввода-вывода и прерывание. Вводим команду:
lspci -v
И получаем вот такой вывод:
Как я понял, что 0xd100 относится к LPT порту, а не COM-портам? Никак, только опытным путём.
Далее нужно будет пробросить эти порты в виртуальную машину. Для этого ещё нужно будет выгрузить драйвер linux, который автоматом подтянулся для работы с LPT-портом, иначе машина не запустится. Выгружаем драйвер:
sudo rmmod lp
И далее пробрасываем ресурсы LPT-порта в виртуальную машину:
VBoxManage modifyvm win7 --lptmode1 "/dev/parport0"
VBoxManage modifyvm win7 --lpt1 0xd100 16
Где win7
— имя вашей виртуальной машины.
Если вы всё сделали правильно, то после запуска виртуальной машины в диспетчере устройств появится LPT-порт. Если виртуальная машина не запускается, то вероятнее всего, вы забыли выгрузить драйвер, и происходит конфликт.
После всех манипуляций устанавливаем на виртуальную машину самое последнее ПО для программатора ChipProg LPT (от 2015 года). Если версия Windows будет правильная, то ошибок запуска быть не должно. На 64-х битной будут проблемы с драйверами и программа работать не будет. После запуска выбираем диапазон портов нашей платы, который мы узнали из lspci
.
И пробую записать микросхему ПЗУ. Полный успех говорит нам, что мы всё сделали правильно.
Работа программатора ChipProg-2.
Благодаря этому программатору было установлено, что парочку микросхем я таки угробил своими варварскими экспериментами. На них он давал ошибку по току, тогда как китайский программатор «tl866» ничего внятного не говорил, просто что нет контакта по ногам.
На данный момент использую ChipProg-2 как более надёжный способ прошивки, без дополнительных переходников. Плюс, мне значительно больше нравится интерфейс программы для работы с программатором.
▍ Выводы
Микросхемы ПЗУ с ультрафиолетовым стиранием не так просты, как кажутся на первый взгляд, и работа с ними требует определённого оборудования и понимания, что же там происходит. С другой, это уже история, хотя ещё много оборудования используют подобные решения.
Скажу сразу, что программатор «TL866 II Plus» просто однозначно стоит иметь, если вы работаете с микроконтроллерами ПЗУ, FLASH и т.д. Тем более, что его переходники подходят и для других программаторов. Микросхему 2764 этот программатор прошивал без особых проблем. Если работаете с чем-то более серьёзным, то стоит смотреть в сторону программаторов «Beeprog+», «ChipProg-48» или аналогичных в зависимости от вашего бюджета. В любом случае они должны быть на USB.
Стоит ли развлечение с LPT портом потраченных сил? Ну так, для собственного удовольствия вполне. Для меня это было вполне достойное и бюджетное решение. Всё равно программатор «TL866 II Plus» у меня точно так же работает на виртуальной машине.
Стиратель лучше всего купить, по деньгам в пересчёте вашего времени, он обойдётся дешевле.
▍ В качестве постскриптума
Так удачно совпало, что покуда я разбирался, как достать прошивку из ПЗУ чемодана, xlat8086выложила скан документации от своего УМК-80, за что, от всех владельцев УМК, ей большое спасибо.
Чтение документации и сравнение hex моей прошивки с прошивкой, приведённой в документации, установили отличия моего устройства от её, хоть и не очень значительные. Но некоторые функции лежат на своих местах, одна из самых ценных — функция задержки, которая делает задержку ровно 10 мС.
Таким образом, если мы 100 раз вызовем эту функцию, мы получим задержку в 1 секунду. Да, написано 10 микросекунд, но на деле это 10 милисекунд. Видимо опечатка. Функция обитает по адресу 0×35B, и в моём чемодане она тоже обитает по тому же адресу.
Набросаю небольшую функцию, которая будет зажигать и гасить символ с задержкой.
ORG 0400h
start:
mvi A, 01h
out 0F8h
m1:
mvi a, 0ffh;Зажигаем символ
out 0F9h
call delay_1s
mvi a, 0h;Гасим символ
out 0F9h
call delay_1s
jmp m1
delay_1s:
lxi b, 100; Вызываем 100 раз.
delay_1s_c:
call 035bh; вызов функции из ПЗУ
DCX B
mov a, b
ora c
jnz delay_1s_c;выполняем цикл 100 раз
ret
Компилируем и прошиваем полученный rom в микросхему 2716, и ставим её в панельку ПЗУ пользователя.
2716 установлено в панель пользовательского ПЗУ.
Даже записал небольшое кинцо, как же это всё работает в живом чемодане.
Таким образом, наконец-то можно переносить свои программы в чемодан, минуя перенабор программ вручную. Чего и требовалось достичь.
▍ Полезные ссылки
- Беглый справочник по микросхемам ПЗУ.
- Переходник для чтения ПЗУ 2708.
- Доработка программатора TL866IIPlus для прошивки к573рф2,5,4,6.
- Содержимое ПЗУ моего УМК.
- Официальная документация на УМК-80.