На это небольшое исследование меня натолкнула опубликованная недавно на Хабре статья, в которой автор предположил, что в знаменитых «Тетрисах» из 90-х мог использоваться 4-битный микроконтроллер Holtek HT1130. Меня сильно удивило (и мотивировало), что, по всей видимости, до сих пор не снят дамп ПЗУ и, соответственно, не написан эмулятор для этой линейки игр..
У предположения, что Brick Game построен на Holtek HT1130 есть одна слабая сторона — у HT1130 драйвер дисплея может управлять только 128 сегментами, а в типичном Brick Game только игровое поле состояло из 200 (10×20) сегментов. Откуда же появилась вообще информация про Holtek HT1130? Немного погуглив, я нашел первоисточник, это статья 2015 года, в которой автор рассказывает, что нашел даташит на одну из вариаций Brick Game — «Super Brickcal 9 in 1» работающую на HT113LA и отличающуюся от классических меньшим игровым полем. Он отмечает, что Holtek HT113LA является частным вариантом Holtek HT1130, на котором кроме Super Brickcal строится еще множество простых портативных игр с ЖК экраном.
Но меня интересуют более распространенные версии Brick Game — в узнаваемом корпусе с изгибом посередине, обычно маркируемые буквой E и несколькими цифрами. Например, ES-118 и E-88 как на фото ниже:
Эти видавшие виды экземпляры я специально купил для препарирования. E-88 была заявлена продавцом как неисправная, к тому же она в узких кругах ценителей Brick Game является одной из самых классических версий, поэтому начну с него.
1 час 5 рублей 🙂 это шутка, или кто-то действительно был готов платить за почасовую игру в Тетрис?!
У-у-х. Внутри неожиданно открывается вид на богатый внутренний мир предыдущего владельца. Punk not dead!
А вот и интересующий меня кристалл просвечивается под текстолитом:
Черная капля компаунда надежно защищает кристалл микроконтроллера от окружающей действительности и освободить его довольно нетривиальная задача. Надежней всего было бы растворить ее в азотной кислоте, но такие методы в домашних условиях меня не очень вдохновляют. Поэтому я выбрал более простой, но менее надежный метод декапсуляции — термический.
Декапсуляция
Суть такова — отделяем всю каплю вместе с кристаллом от текстолита, затем нагреваем ее на открытом огне, в результате чего компаунд становится хрупким, и от основной его части можно избавиться механически. Остатки компаунда с поверхности кристалла удаляются дихлорэтаном (который обычно продается в качестве клея для пластика).
Как я уже упоминал, этот метод не очень надежный (плюс отсутствие у меня практики) и, к сожалению, в процессе отделения компаунда кристалл треснул, развалившись на две части 🙁 К тому же основные повреждения «удачно» пришлись на область с ПЗУ, поэтому снять дамп в этот раз у меня не получилось. Итак, вот он, мозг Brick Game E-88 (в полном разрешении):
Сразу бросается в глаза маркировка кристалла HT-943E5 с датой изготовления маски 1994 г. и небольшой чип-арт в виде логотипа Holtek.
Получается, можно подтвердить, что классический Brick Game середины 90-х работает на микроконтроллере Holtek. Осталось выяснить на каком именно.
Естественно, я сразу загуглил HT-943. И ближайшее, что я нашел, был 8-битный HT-948, но уж больно он не совпадает с тем, что мы видим на DIE-фото — 16 кБ ПЗУ против 4, 3328 бит ОЗУ против 640, опять не совпадает количество управляемых сегментов ЖК, да и 4-битность Super Brickcal наводит на мысль, что и здесь мы имеем дело с 4-битным процессором. Вообще, наверно, кто-то более опытный без труда смог бы определить разрядность АЛУ по фотографии, но я в микроэлектронике полный профан.
В конце концов, я пошел в лоб и скачал все даташиты на 4-битные микроконтроллеры Holtek которые я только смог найти (благо их в открытом доступе всего пара десятков), и все же отыскал идеально подходящий вариант это HT443A0.
Судите сами: количество сегментов (40) и общих выводов (8) драйвера ЖК совпадает с тем, что можно распознать на фото кристалла, 160 нибблов ОЗУ плюс 80 ОЗУ ЖК тоже. И самое главное — в документации изображены позиции выводов кристалла и его размер, что в точности совпадает с нашим экземпляром.
Теперь я попробую побыть в роли доморощенного Кена Ширрифа, и подписать то, что я распознал на кристалле. Еще раз напомню, что я очень поверхностно разбираюсь в микроэлектронике и мог допустить ошибки в своих предположениях (было бы здорово, если разбирающиеся в теме люди меня поправили и дополнили в комментариях).
Рассмотрим ПЗУ подробнее:
На сетке транзисторов хорошо различимы неоднородности, которые и кодируют отдельные биты ПЗУ. Простыми словами, там, где горизонтальную линию (легированный слой) пересекает розовый участок вертикальной линии (слой поликремния) — 1, там где зеленоватый участок — 0. Слева виден дешифратор 6 старших бит адреса (дешифратор 6 младших бит находится между верхней и нижней частью ПЗУ в поврежденном месте и на фото его не видно). Если присмотреться, все горизонтальные линии сходятся в верхнем левом углу — отсюда на шину данных уходит один бит расположенного по определенному адресу байта. Т.е. каждый участок ПЗУ подобный вырезанному выше (всего их 8) и его зеркальное отражение справа содержат каждый n-ый бит всех 4096 байт ПЗУ. И это на самом деле плохо, т.к. получается, что разрушены биты из середины каждого байта ПЗУ. Даже часть дампа снять с этого кристалла не выйдет.
А пока ко мне едут новые доноры для декапсуляции, у нас есть совершенно целое ПЗУ мелодий, попробуем расшифровать хотя бы его.
ПЗУ Мелодий
Из документации можно узнать, что HT443A0 поддерживает 16 отдельных мелодий, каждая из которых может быть набором тонов, шумов или ударов. Мелодии 1-12 поддерживают до 32 нот, а 13-16 до 64. К сожалению, не сказано, какая разрядность у нот, но мы можем ее легко вычислить: визуально можно насчитать 4480 бит в ПЗУ мелодий, а всего хранимых нот по документации 640, получается 4480 / 640 = 7 бит на ноту.
Чтобы прочитать ПЗУ, надо определить, как биты соотносятся с конкретными нотами, а ноты с мелодиями. Для этого можно попробовать проанализировать дешифраторы, которые управляют выборкой нот и мелодий.
Красным отмечен 5-разрядный дешифратор выбирающий одну из 32 пар вертикальных линий. Логично предположить, что каждая из 32 нот хранится в одной паре вертикальных линий. Синим выделен 4-разрядный дешифратор, который выбирает 1 из 16 наборов по 7 (количество бит в ноте) горизонтальных линий. И еще один 1-разрядный дешифратор, выделенный зеленым, позволяет адресовать дополнительные 32 ноты мелодий двойного размера.
Попробую проиллюстрировать это сбивчивое объяснение, прочитав первую ноту первой мелодии. Для начала, нужно стравить металлизацию, так как она скрывает от нас часть ПЗУ. Для этого я использовал некий флюс для низкотемпературной пайки алюминия (состав его неизвестен). К сожалению, травление влияет и на другие слои интегральной схемы, что приводит к неоднородному изменению цвета (который зависит от толщины слоя) и прочитать ПЗУ становится довольно сложно. Никакой автоматизации, все 4480 бит нужно отметить вручную 🙁
На фото отмечены значения бит первой ноты первой мелодии, порядок чтения от старшего к младшему отмечен стрелками.
А вот вся первая мелодия:
1010110
1101011
0110101
1011010
1101101
1110110
1111011
0111101
1011110
1101111
0110111
0011011
0001101
1000110
1100011
0110001
1011000
0101100
0010110
1001011
0100101
1010101
1101001
1110100
0111010
1011010
1101110
1110111
0111011
0011101
1001110
1100111
Примечательная последовательность, ожидал увидеть здесь просто числа для делителя частоты, но это похоже на выход регистра сдвига с линейной обратной связью. Смутно вспомнил, что у упомянутого уже Кена Ширрифа есть реверс музыкальной микросхемы открытки с мелодией, проверил — действительно, там полностью аналогичное представление нот. Так что подробности можно почитать по ссылке, а кратко — делитель частоты определяется количеством шагов работы РСЛОС до получения значения 1000000.
Например, нота 1111111 сдвигается за 8 шагов:
1111111
0111111
0011111
0001111
0000111
0000011
0000001
1000000
Базовая частота звука определяется делителем тактовой частоты, который задается маской на заводе, и его точное значение мне неизвестно. Но я измерил частоту звучания этой ноты на живом экземпляре и она получилась равной ~4200Гц. Так что нам подходит базовая частота 32768Гц — при таком значении нота 1111111 будет соответствовать 4096Гц (некоторое расхождение объясняется неточностью резистора задающего тактовую частоту HT443A0)
Теперь можно понять, какой звук содержит первая мелодия — это звук, который воспроизводится при горизонтальном перемещении фигуры в тетрисе.
А что же Коробейники? Она занимает сразу две 64-нотных мелодии 13-ю и 14-ю. Вот начало всем известной мелодии с подписанными частотами:
0111010 - 1092Гц
0111010 - 1092Гц
0111010 - 1092Гц
0111010 - 1092Гц
1100011 - 819Гц
1100011 - 819Гц
0101100 - 886Гц
0101100 - 886Гц
1010010 - 993Гц
1010010 - 993Гц
1010010 - 993Гц
1010010 - 993Гц
0101100 - 886Гц
0101100 - 886Гц
1100011 - 819Гц
1100011 - 819Гц
1101111 - 728Гц
1101111 - 728Гц
1101111 - 728Гц
0000000
1101111 - 728Гц
1101111 - 728Гц
0101100 - 886Гц
0101100 - 886Гц
0111010 - 1092Гц
0111010 - 1092Гц
0111010 - 1092Гц
0111010 - 1092Гц
1010010 - 993Гц
1010010 - 993Гц
0101100 - 886Гц
0101100 - 886Гц
Видно, что длительность ноты задается простым дублированием, а отсутствие звука нулем.
Кроме ПЗУ мелодий есть еще одно, поменьше, тоже относящееся к музыкальной схеме:
Я еще с ним не разбирался, но, по-видимому, здесь содержится делитель задающий темп для каждой мелодии, тип «инструмента» и наверно что-то еще.
В ближайшее время постараюсь все же извлечь целый кристалл из-под компаунда и снять дамп прошивки. А там уже и до эмулятора недалеко.