Comments 117
Очень крутое исследование. Хабр снова торт :)
Очень ждал вашей статьи, честно. Очень хабратортно и невероятно круто.
По эмулятору можно прям отдельную статью написать, как же вы его разрабатывали. А то вопросов осталось больше, чем ответов на них :).
Транслятора этого кода не нашлось, чтобы поиграться самому и может какое-то описание архитектуры у вас появилось?
Спасибо! Вот даташит, а вот дизассемблированный код.
Спасибо за информацию!
Возможно я немного не внимательно читал даташит, но я не понял как там адресуется дисплей.
Кстати, восстанавливая карту сегментов, поразился, на сколько же они располагаются не однотипно: у одной цифры сегменты адресуются одним образом, у соседней другим, часть игрового поля так, другая сяк - не завидую программистам которые писали код для этого дисплея.
Каким образом удалось сопоставить какой сегмент дисплея приходит на процессор, просто прозвонкой? Особенно интересно всякие дополнительные символы справа.
При снятых поляризационных фильтрах и определенном угле освещения дорожки на стекле неплохо просматриваются:
Конечно не все сегменты получилось так локализовать, что-то выяснял методом тыка.
Вы меня просто восхищаете проделанной работой! Теперь можно написать свою игру для тетриса! И никогда не попробовать её реализовать в железе...
меня всегда интересовала индикация фруктов справа дисплея, по какой логике они работали...в моем тетрисе который был у меня я видел максимум 2 значка но их существенно больше... интересно были ли варианты где они както активно использовались?
Есть исходный код, эмулятор. Осталось написать транслятор и можно будет понять :)
Насколько я помню, фрукты заполнялись снизу вверх на основе набранного количества очков в одной конкретной игре. Затем они начинали исчезать, также снизу вверх. В самом тетрисе, естественно, тяжело набрать такое количество очков, но бывали игры, в которые можно было играть практически вечно.
Немного поискал по коду - не нашел вообще обращений к нибблам памяти, которые отвечают за эти сегменты, по всей видимости, в этом тетрисе фрукты полностью игнорировались.
Скорее всего, в моем тетрисе вообще о существовании каких либо фруктов не помню)
Адресация неудобная скорей всего из-за проблем с разводкой экрана и уменьшением количества проводников экрана.
Интересно, что у правых двух цифр нет перекладины — там всегда нули? Напомнило, как на поздних электромеханических пинболах вместо одного из разрядов счётчика был просто прибитый гвоздями сектор от оного с нулём %)
Труд монументальный, конечно. Ещё с тех пор как мы пересеклись на МК90 следил за вашим творчеством и тихо охреневал, а тут впечатления уже вообще цензура не пропустит :-)
Можно тупой вопрос? Вот эта капля - для чего она служит? Для защиты чипа от повреждений или это попытка запретить вам сделать то, что вы в статье делали?
Защита от повреждения и внешней среды. Использование такого монтажа сильно удешевляет производство.
Это просто один из видов самого дешманского корпуса для кристалла.
В первую очередь, конечно, механическая защита. В какой-то степени она также способствует ограничению в изучении и копировании, но тем, кто действительно хотел, получить доступ к кристаллу труда никогда не составляло.
Открытый кристалл на воздухе не очень долго проживет. Кислород, влага, абразивное действие пыли постепенно выводят его из строя. Поэтому бескорпусные микросхемы строго обязательно должны герметизироваться - либо индивидуально, либо на уровне микросборки или герметичного блока. Простейший способ такой герметизации - залить кристалл компаундом.
К тому же такие кристаллы обычно устанавливаются на плату путём разварки тонкими золотыми проволочками, соединяющими контактные площадки кристалла с соответствующими контактными площадками платы. Они очень нежные, без защиты на этапе сборки с платами пришлось бы обращаться с исключительной осторожностью.
Безумно приятно видеть работу действительно увлеченного человека с прямыми руками и головой на плечах. Очень круто!
Неистовая крутота.
Прошивки, кстати, вполне могут быть универсальными между несколькими моделями тетрисов. Когда я был маленьким, глупым, и мне было нечем заняться, я игрался со своими электронными игрушками, но не совсем по назначению. Точно помню, что у меня пару раз случайно получалось сделать так, чтобы тетрис показал не свою обычную заставку, а другую, от другой модели. Сейчас я взрослее и умнее, и понимаю, что то, что я тогда сделал, называется глитчинг по питанию и является вполне валидной техникой для, например, обхода всякой защиты. Даже модчип для Nintendo Switch работает по такому принципу.
Вполне может быть, что модель задаётся какими-нибудь перемычками на самой плате или подключением кристалла к ней. Правда, в дизассемблированной прошивке я вижу чтение только из тех портов, к которым подключены кнопки (PP и PS).
Я сравнивал прошивку из этой статьи с теми кусками ПЗУ, которые фотографировал в предыдущей и они не совпадают. Думаю, что универсальные прошивки появились позже, может как-раз не тех контроллерах, о которых я написал в начале.
Я таким же образом умудрился найти пару скрытых игр на каком-то картридже от Sega...
У меня не только заставка, но и новые игры появились. Представьте шок мелкого пацана. Если бы я это не показал другим, то всегда думал бы, что сам себе придумал или приснилось, потому что больше повторить это не удалось.
Кстати, восстанавливая карту сегментов, поразился, на сколько же они располагаются не однотипно: у одной цифры сегменты адресуются одним образом, у соседней другим, часть игрового поля так, другая сяк - не завидую программистам которые писали код для этого дисплея.
Думаю разработчики для этого дела приспособили макросы, тут проблема больше для реверс-инжениринга.
Блин, четырёхбитники меня прямо очаровывают своим минимализмом. Хочется что-нибудь даже поизобретать такое, с 16 командами, без регистров (всё на стеке, но с произвольным доступом на 16 ячеек вглубь), с общей памятью (сначала масочное ПЗУ с библиотеками сложения-умножения, потом NAND, потом DRAM), заточенное изначально архитектурой команд под построчную работу с DRAM, в общем, чтобы плотность кода и данных была как в нейтронной звезде :) Эдакий даже не микро-, а наноконтроллер :-D Можно SRAM для простоты, но DRAM соблазняет дополнительным паззлом по рефрешам :)
К сожалению вы не в тренде. Недавно мне отдали на разборку не работающую электро сигарету. Так там китайцы умудрились впихнуть 32 битный ARM (bat32g137) плюс ещё две специализированных микросхемы - зарядник usb-c и драйвер светодиодов на 16 выходов/256 уровней (aw9523b). У меня блин первый комп имел процессор попроще, а тут ...
Зачем там вообще микроконтроллер?
У меня где-то валяется электросигарета, так там даже rtc запихали (соотв, в ней есть часы). Еще видел в магазине аппарат с fm приемником. Извращались кто как умеет, я не удивлюсь если кто-то андроид туда вкорячивал.
Потому что заказчик пришел с "нужно вчера прототип и термоклея и отладочной платы из под стола", а потом "О, норм, в продакшн!". Если девайс мелкосерийный - сейчас никто не морочится... Потом если продается - соптимизируют, нет - ну нет, так нет...
Заказчик приходит к разработчику, озвучивает свои хотелки.
А у разработчика на складах завалялась неприятная партия железок от другого заказчика. Аппаратно они избыточны, но достаточно поставить мощный транзистор для включения спирали - и девайс готов за три дня, а не за месяц. А с заказчика слупить полную стоимость разработки, плюс далее раскрутить его на второй платеж - модификации текущей версии, благо аппаратные мощности позволяют.
Ковырял одну электросижку (бокс-мод), так там вообще стоял внешний 16-битный АЦП.
Не, в моей АЦП встроенный, всего 12 бит, зато на 1 Msps. Плакал когда увидел ...
боксмод и вообще "большие" вейпы это совсем другая тема, там например бывают никелевые койлы, которые имеют NTC, и это надо учитывать, обсчитывать и крутить выдаваемый ток соответственно. а вот то, что такой уровень дошел в условные "одноразки" - несколько удивляет, это какая ж там себестоимость у этих чипов с платами стала? еще пару лет назад все "мозги" были в прямом смысле таблеткой а-ля электретный микрофон.
Очень крутая статья. Проделана большая работа. Всем бы такие прямые руки и извилистые мозги.
Снимаю шляпу!
От простого любопытства, до готового симулятора. Это круто!
Теперь можно браться за "Ну погоди" и искать в дампе кода мультик)
Теперь отчетливо видны границы переходов от "нормальных" транзисторов …
Подскажите, пожалуйста, как вы это определили? Я смотрю на фотографию, и не могу понять, чем отмеченные на следующем фото транзисторы отличаются от неотмеченных.
Впечатляющая работа! В детстве мне родители было купили один из первых, видимо, Brick Game. Потому что в нем было всего 8 или 9 игр. И вот среди них были классные гонки. В которых нужно было не просто уворачиваться вправо-влево от препятствий. А еще и можно было собирать разные бонусы. Которые в процессе игры давали возможность машинке стрелять и пробивать себе дорогу сквозь препятствия. А может и не только это, не помню уже.
К сожалению, тот тетрис я было вывел из строя. Как и еще потом один в процессе сборки, разборки и всяческих опытов...
В более поздних моделях Brick Game, в которых была возможность поиграть таких гонок мне уже не попадалось.
del
Я одну глупую вещь спрошу, пытался тщетно запустить ваш эмулятор на разных платформах (Centos, Mint(читай Ubuntu), но потерпел фиаско. На убунте ставил:
sudo apt install python3-pyqt6.sip
pip3 install pyqt6
Но получаю всё равно:
python3 main.py
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.Available platform plugins are: xcb, minimalegl, vkkhrdisplay, linuxfb, wayland-egl, offscreen, wayland, eglfs, minimal, vnc.
Аварийный останов (образ памяти сброшен на диск)
Даже психанул и поставил qtcreator (будь он не ладен):
sudo apt install qtcreator
Те же проблемы. Библиотека xcb на которую ругается, у меня стоит:
sudo apt install libxcb-xinerama0
....
Уже установлен пакет libxcb-xinerama0 самой новой версии (1.14-3ubuntu3).
Что я делаю не так?
Сам спросил, сам ответил.
sudo apt install libxcb-cursor0
И всё заработало:
Отлично, рад, что все заработало! Я сам только на Win и MacOS тестировал.
а для совсем чайников, как установить?) Вот скачал пайтон, поставил. Открываю cmd от админа, пишу pip install libxcb-cursor0, выскакивает ошибка Could not find a version that satisfies the requirement libxcb-cursor0 (from versions: none)
Спасибо за статью, всегда интересно такое почитать!
Классный разбор и великолепная статья. Читаешь и наслаждаешься настоящим технотриллером в стиле кибернуар. И конечно же проделана филигранная и титаническая работа, моё почтение.
Большое спасибо!
Это вам спасибо! Если не секрет, то что следующее на очереди? Есть какие-то планы?
Отличная статья, пример реверсиженеринга
Статья супер! Чисто теоретически можно под эту платформу написать сокобан, обозначая игрока и точки разной частотой мигания
Для экрана 20 на 10: можно сапёра ещё, шашки (и игры на их основе, уголки, например), нарды, блэкджек, морской бой.
на счет шашек и.т.п наврятли, но сокобан вполне хватает 10х20
Только градаций серого нет.
ну я предположил что можно это реализовать частотой мигания как в некоторых играх ТЕТРИСА
По даташиту обновление дисплея 64 кадра в секунду и они с таймером завязаны на одну базовую частоту, так что в теории можно мигать сегментами получая еще комфортные 32 кадра и серый цвет без мерцания. Но конечно, проверить это можно только на физическом устройстве, то есть нельзя)
В первой половине девяностых существовала достаточно редкая модификация тетриса. Корпус выглядел как обычный Brick Game, но экран был сильно другим.
Вместо кубиков "квадрат в квадрате" были кубики "квадрат, внутри круг, внутри точка", которые могли включаться независимо. Таким образом кубики могли иметь аналог цвета (например, квадрат+круг+точка, квадрат+точка, только круг), игры вроде как это использовали, было что-то типа аналога игры Columns.
Точно помню, что квадрат и круг имели небольшие разрывы сверху и снизу скорее всего туда контакты выходили.
Видел эту модель всего несколько раз, поиграть не удавалось.
Нагуглил такую картинку https://www.vinted.co.uk/items/1318983524-tetris-column-brick-3-in-1-cb-615
Вполне возможно
Интересно увидеть реверс брик гейма у которого есть возможность подключения второго брик гейма для совместной игры, но как мне кажется, основная трудность это найти подобный экземпляр
Как говорили на одном несуществующем сайте: в карму не заходя в пост [x]
Правда, очень очень круто. Вот такие посты тут нужны.
Всегда удивляла распайка бескорпусного чипа на плату с кривой сверловкой переходных отверстий
А меандр для экрана софтово генерируют?
+++
лет 10 назад гуглил эмуляторы брик гейма и был огорчен, что ничего подобного даже не намечалось. Рад, что наконец-то это возможно)
Сам тэтрис в svg сами рисовали?
Кхм, я может быть что-то делаю, не так, можете подробно описать процесс запуска эмулятора?
Как заставить HT443A0 или аналоги выполнять произвольную команду? Кажется, что это невозможно, ведь эти микроконтроллеры имеют масочное ПЗУ, которое может быть задано только один раз на заводе при производстве. Но у нас есть дамп этого ПЗУ. Возможно ли заставить HT443A0 пропускать, проскакивать определенное количество команд? Например, управляя частотой тактирования (завышая ее выше разрешённого предела на необходимое количество тактов) или устраивая просадку напряжения питания во время выборки нежелательных инструкций? Если это возможно, тогда можно выполнять не совсем любую инструкцию, но любую инструкцию из содержимого ПЗУ, верно?
Так делают при прошивке Xbox, чтобы обойти защиту. А в этой игре что такого ценного, чтобы так заморачиваться? Цель должна оправдывать средства. Поэкспериментировать можно на эмуляторе.
Теоретически наверно возможно, но да, не очень понятен смысл. Если предполагается таким способом выполнять собственную программу, перескакивая на нужные инструкции, то думаю достаточной точности и стабильности "перескоков" добиться не удастся. Да и нормального выполнения последовательности инструкций все равно не получится, т.к. очевидно, кроме счетчика команд будут изменяться и другие регистры.
Процессоров так много разновидностей, что я бы хотел предложить объединить наши познания и составить классификацию процессоров в этом реестре
Это поможет всем нам понять из чего состоят процессоры, какой лучше и чем и как они отличаются между собой.
Так какой же процессор использовался в играх Brick Game? Часть 2