Простой советский геймдев: многокадровый, цветной

в 13:00, , рубрики: 8080, MSX, ruvds_статьи, zx spectrum, видеоигры, городки, игры, Игры и игровые приставки, конёк горбунок, кр580ви53, кр580вм80, кр580ик80, Музей советских игровых автоматов, советские игровые автоматы, советские игры, ТИА-МЦ-1

Простой советский геймдев: многокадровый, цветной - 1


Около года назад, в одной из прошлых своих публикаций, я уже вскользь касался темы самой совершенной советской видеоигровой аркадной платформы, ТИА-МЦ1. Недавно поступило предложение рассказать про это поподробнее: какое я имею к ней отношение, как и когда удалось создать её эмулятор для современных ПК, как она устроена, в конце концов. Приступаем!

▍ История ТИА-МЦ

Точную историю создания этого величайшего достижения советской видеоигровой промышленности до сих пор не удалось реконструировать полностью. Все попытки это сделать, так или иначе, компилируют сведения из нескольких известных источников, формируя свою версию. Не буду в этом оригинален и составлю своё предположение, основываясь на словах разработчиков платформы и игр для неё, не претендуя, впрочем, на полную историческую достоверность.

Простой советский геймдев: многокадровый, цветной - 2

Аттракцион-71. Фото: РИА Новости

В 1971 году в СССР прошла международная выставка «Аттракцион-71», на которой были продемонстрированы новейшие достижения в области высокотехнологичных развлечений: как больших аттракционов, так и малых развлекательных машин типа пинболов. Показанные там успехи на этом поприще со стороны США и Японии нельзя было оставить без внимания: нужно было показать, что и в СССР есть вещи не хуже.

Министерство культуры СССР поручило решить эту задачу созданной немного ранее организации «Союзаттракцион». По её заказу различные радиотехнические предприятия страны в рамках программы производства товаров народного потребления начали создавать аналоги продемонстрированных зарубежных развлекательных устройств — в том числе памятный всем «Морской Бой», повторяющий идею и дизайн американского «Sea Raider» 1969 года.

Простой советский геймдев: многокадровый, цветной - 3

Не близнецы, но преемственность заметна: Sea Raider и Морской Бой

Отзвуком этих событий стал тендер на разработку темы телевизионных игр, объявленный Министерством приборостроения в начале 1980-х годов. Его выиграло Винницкое НПО «Терминал», уже имеющее базу по разработке и производству хоть сколько-то подобного оборудования — Винница в те годы была мощным средоточием предприятий электронной промышленности, своего рода Силиконовой долиной.

Тема была спущена в подчинённый Терминалу НИИ ВТТ (видеотерминальной техники), сформированный тогда же, в начале 1980-х. Уже в 1982-1984 годах в его стенах были разработаны первые игровые автоматы: чёрно-белые «Городки», «Центр-1000», «Истребители» двух версий (на микропроцессоре и без) и «Мотогонки-Т».

Простой советский геймдев: многокадровый, цветной - 4

Первые, памятные очень многим чёрно-белые «Городки»

Среди разработчиков этой ранней аппаратуры — Анатолий Хаимович Цесис и Дмитрий Иванович Захаров. В работе над последующим проектом, ТИА-МЦ, они непосредственного участия не принимали, но над первыми игровыми автоматами вместе с ними работал Александр Иосифович Гоноровский, будущий разработчик аппаратуры ТИА-МЦ1.

Сохранился занимательный исторический артефакт, связанный с этой предыдущей работой: авторское свидетельство (патент) СССР № 1139453 на устройство для проведения телеигр — фактически способ формирования динамических спрайтов, использующийся в игре «Городки». Оно до сих пор хранится в базе Google Patents (SU1526709A1), в том числе его скан-копия. И хотя оно едва ли имело практическую ценность даже тогда, в конце 80-х, теперь мы имеем уникальную возможность проникнуться духом эпохи.

Простой советский геймдев: многокадровый, цветной - 5

Первая страница авторского свидетельства

Примерно в 1986 году работы по теме были поручены НИО-40, отделу НИИ ВТТ, где собрались все ключевые фигуры, принявшие участие в разработке платформы ТИА-МЦ:

  • Василий Борисович Герасимов — руководитель отдела НИО-40 и темы.
  • Александр Иосифович Гоноровский — разработка оригинальной аппаратной части.
  • Сергей Чернов — разводка плат.
  • Игорь Кулик — пиксельная графика в нескольких первых играх (Коньке, Коте, S.O.S).
  • Людмила Коломиец — код Конька-Горбунка и графического редактора.
  • Альберт Ойрих — дополнительный код Конька-Горбунка, игра Бильярд.
  • Владимир Гласов — код Кота-Рыболова и S.O.S.
  • Владимир Джуган — аппаратная часть версии ODN-16.
  • Олег Дударь — пиксельная графика всех более поздних игр.

Василий Герасимов руководил отделом и занимался производственными вопросами. В разработке он непосредственного участия не принимал: коллектив перешёл под его руководство с уже готовой платформой и первой игрой.

Игорь Кулик пришёл на «Терминал», имея профильное образование инженера. Однако, для решения задачи был нужен художник, и выяснилось, что Игорь умеет неплохо рисовать. С помощью краткой консультации по основам анимации у неназванного известного киевского аниматора он стал мощнейшим пиксельным художником, создавшим графику к первым играм для ТИА-МЦ, включая всю графику в «Коньке-Горбунке».

Примерно после создания «Кота-Рыболова» коллектив разработчиков под руководством Герасимова сформировал кооператив «Программист», куда была передана вся документация и оборудование, и дальнейшей разработкой игр занимались вновь набранные программисты и художники. Все последующие игры создавались в рамках деятельности этого кооператива.

Параллельно с этим ещё какое-то время шла деятельность в оригинальной организации, где Гоноровский разрабатывал 16-битную версию автомата на процессоре «1816», как он назвал его в интервью — предположительно, имелся в виду КР1810ВМ86 (8086). Эта разработка была завершена, но не пошла в производство, и о её существовании известно только со слов Гоноровского.

В 1992 тема была закрыта: СССР закончился, в залах игровых автоматов сначала распространились более дешёвые и доступные самоделки на базе ZX Spectrum, а вскоре появились и гораздо более продвинутые оригинальные западные аркады.

В 1994 году бывший кооператив «Программист» сменил название на «Экстрема-Украина» и в течение последующего десятилетия занимался более привлекательной с коммерческой точки зрения разработкой азартных игровых устройств: видео-покеров и видео-слотов.

▍ Создание железа

Аппаратная часть ТИА-МЦ1 разрабатывалась на базе серийного видеотерминала ВТА, выпускавшегося НПО «Терминал», однако, существенно дополненного новым оборудованием. Этот терминал в версии ВТА-2000 применялся в составе комплекта Микро-ЭВМ СМ-1800, компьютера на 8-битном микропроцессоре КР580ВМ80.

Простой советский геймдев: многокадровый, цветной - 6

Терминал ВТА-2000 снаружи и корзина плат внутри

В наследство от ВТА достался конструктив с корзиной для плат и блок питания, остальная аппаратура была создана заново. Применялись новейшие на тот момент технические средства: платы разводились уже не вручную, а в программе P-CAD на 286-ом компьютере.

Простой советский геймдев: многокадровый, цветной - 7

Внутри корпуса: блок питания по центру, корзина плат справа

Существовало не менее четырёх версий платформы. Первая, оригинальная ТИА-МЦ1, состояла из четырёх отдельных больших плат. Её версия с минимальными изменениями — добавлен ёмкостный рычаг вместо джойстика и его плата АЦП, отсутствует один из таймеров 580ВИ53 для звука — применяется в «Городках».

Ещё одна модификация оригинальной аппаратуры, но с другим корпусом и четырьмя рулями, применяется в «Автогонках», но о ней до сих пор мало что известно. Возможно, она имеет какое-то отношение к игровым автоматам «Авторалли-М» и «Чемпион-М». Последний как раз имеет четыре руля и похожий по описанию игровой процесс.

Простой советский геймдев: многокадровый, цветной - 8

Оригинальная версия ТИА-МЦ1 от «Терминала» слева, версия «Сигмы» справа

Также существует более заметно отличающаяся версия игрового автомата в другом корпусе и с другой аппаратурой, производившаяся литовским НПО «Сигма». В 1988 году к разработчикам обратился представитель «Сигмы» с предложением разработать аппаратуру и игры для игровых автоматов их собственного производства. Было решено адаптировать уже имеющееся решение, и в результате была создана одноплатная версия ТИА-МЦ, предположительно (по воспоминаниям Дударя) называющаяся ODN-16. Она несколько отличается архитектурно, поэтому игры для неё не совместимы с оригинальной ТИА-МЦ.

Важной частью процесса разработки было создание не только железа самого игрового автомата, но и аппаратуры для создания игр. Дело в том, что на тот момент разработчикам ТИА-МЦ не были доступны готовые платформы, позволяющие создавать цветную пиксельную графику, и они были вынуждены изобрести своё собственное решение: двухэкранную рабочую станцию.

Простой советский геймдев: многокадровый, цветной - 9

Единственные фотографии родственной техники: комплекса СМ-1803 (1980)

Это устройство было построено на основе комплекса ИВТ: целый стол с компьютером СМ-1800, работающем на таком же процессоре, как и ТИА-МЦ — советском клоне Intel 8080. Терминал сохранил свой штатный чёрно-зелёный алфавитно-цифровой дисплей (вероятно, тот же самый ВТА), а также был добавлен цветной экран, на который выводилось изображение с разработанного блока формирования цветного изображения. Неизвестно, был это блок из ТИА, или какой-то иной.

После создания железа для этой шайтан-машины был разработан графический редактор, позволяющий рисовать графику, готовить и просматривать последовательности кадров анимации. Рабочие станции были размножены в нескольких экземплярах, и далее разработчики игр могли действовать автономно. Неизвестно, какой именно ассемблер, текстовый редактор и прочие средства применялись при создании кода, но, вероятнее всего, что-то из существующей экосистемы СМ-1800. Сохранялись рабочие файлы на 8-дюймовых дискетах.

Процесс разработки оригинального железа и рабочей станции для создания игр занял около года.

▍ Создание игр

Разные участники по-разному описывают подход к разработке игр, свою ознакомленность с играми и интерес к ним.

Гоноровский упоминает, что в то время они видели поставленный в СССР в рамках введения информатики в общее школьное образование класс компьютеров Yamaha КУВТ (платформа MSX) — но только чтобы ознакомиться с достижениями в области цветной экранной графики, а игр не видели, и придумывали всё сами.

Олег Дударь вспоминает, что ко времени его прихода в тему ТИА-МЦ в НИИ начали поступать новые зарубежные компьютеры — 286-ые ПК с CGA и EGA графикой, и с ними, конечно, проникли и игры, которыми они и вдохновлялись.

Простой советский геймдев: многокадровый, цветной - 10

«Конёк-Горбунок» и Athletic Land от Konami, 1984

Так или иначе, нельзя отрицать очень явное концептуальное сходство игры «Конёк-Горбунок» с игрой «Athletic Land» 1984 года для компьютеров MSX, которая наверняка попалась на глаза кому-то из разработчиков, благо такие компьютеры в СССР были.

Простой советский геймдев: многокадровый, цветной - 11

«Кот-Рыболов» и Yie Ar Kung-Fu от Konami, 1985

Да и в «S.O.S» также читается знакомство с парой хитов с набирающего тогда огромную популярность в наших краях компьютера ZX Spectrum (Exolon и Venom Strikes Back), а в «Коте-Рыболове» при очень большом желании можно разглядеть и влияние Yie Ar Kung-Fu с той же MSX.

Простой советский геймдев: многокадровый, цветной - 12

«S.O.S» и Venom Strikes Back от Gremlin Interactive, 1988

Последующие игры уже не имеют таких явных прототипов, хотя Дударь вспоминает, что на (ныне утерянный) «Истребитель» его вдохновила игра Flying Shark для ZX Spectrum, и делалась игра по его лекалам.

Разумеемся, я указываю на эти возможные источники вдохновения не для принижения заслуг разработчиков. Но история о советских инженерах, изобретающих заново видеоигры с чистого листа без оглядки на мировой опыт — это всё-таки лишь красивая легенда. Копирование и постепенное улучшение самых удачных предыдущих решений — закономерное развитие в индустрии видеоигр, и разработчики справились с этим действительно хорошо.

Со слов участников этих событий можно предположить, что раньше с видеоиграми они не сталкивались и впервые узнали про это явление в рамках работы над ТИА-МЦ. Кто-то наигрался за время проекта на всю жизнь и к играм больше не возвращался, кто-то втянулся и задержался в индустрии на годы, в той же «Экстреме».

Главное, что можно сказать про сами игры — они крайне, невыносимо сложны. Если первые пару экранов проходятся даже слишком легко, дальше начинается настоящий игровой ад, почище этой вашей Макаимуры или Соулс. И это не случайность и не (только) недостаток опыта, а последствие поставленной задачи: для окупаемости игровых автоматов один игровой сеанс должен был длиться не более двух минут.

Для ТИА-МЦ всех версий были разработаны следующие игры, в очень приблизительном хронологическом порядке:

  • Конёк-Горбунок.
  • Бильярд.
  • Кот-Рыболов.
  • Снежная Королева.
  • Автогонки.
  • S.O.S.
  • Городки.
  • Остров Дракона (1990).
  • Остров Сокровищ.
  • Истребитель (1991).
  • Котигорошко.
  • Звёздный рыцарь.

Также была нарисована, но не реализована как минимум ещё одна игра:

  • ШтурмРейд (1992)

Поздние игры, начиная с «Острова Дракона», до сих пор не обнаружены. Об их существовании и содержании известно со слов Олега Дударя, который рисовал для них графику.

Простой советский геймдев: многокадровый, цветной - 13

Игры «Конёк-Горбунок» и «Снежная Королева»

История появления идеи главного хита платформы, игры «Конёк-Горбунок», в версии Александра Гоноровского звучит так: из Министерства культуры поступило пожелание, что неплохо бы разработать автомат по мотивам какой-нибудь известной сказки. Гоноровский в то время читал своему маленькому сыну одноимённую сказку Ершова, которому она очень нравилась. В процессе мозгового штурма участники проекта предлагали свои идеи, но в итоге утвердили предложение Гоноровского. Разработка «Конька-Горбунка» заняла около полугода.

Простой советский геймдев: многокадровый, цветной - 14

Игры «Кот-Рыболов» и «S.O.S»

Первой игрой для аппаратуры версии ODN-16 стал «Кот-Рыболов». Однако, похоже, что некоторое время версии существовали параллельно, и часть игр для оригинальной аппаратуры ТИА-МЦ1 выходила уже во время существования новой версии. На данный момент «Кот-Рыболов» является единственной вновь найденной игрой, работающей на одноплатной версии железа.

Простой советский геймдев: многокадровый, цветной - 15

Игры «Бильярд» и «Городки»

Так как по поводу точных дат и порядка разработки воспоминания участников расходятся, у меня есть гипотеза, что «Кот Рыболов» сначала был сделан для первой версии аппаратуры, а для одноплатной модификации он был адаптирован позже. Но никаких подтверждений для этого предположения пока не обнаружено.

▍ Пасхалки

Внутри игр есть несколько интересных моментов совершенно различной природы, которые я опишу общим словом «пасхалки».

Во-первых, что мог заметить каждый достаточно умелый игрок — в «Коньке-Горбунке» отсутствует один игровой экран. В верхней части экрана наглядно показано, как далеко продвинулся игрок, и в какой-то момент он переходит не на один, а сразу на два экрана. Почему так произошло, достоверно неизвестно, но, судя по всему, игровая программа написана не в формате «движка», как сказали бы сейчас, а каждая локация представляет собой обособленную программу.

Во-вторых, внутри корпуса игрового автомата скрыта кнопка «Тест». Её назначение двоякое: если нажать её сразу после сброса (включения) автомата, запустится встроенная тестовая программа, проверяющая функционирование различных блоков. Если же нажать кнопку во время уже начатой игры, в большинстве игр случится переход на следующую игровую локацию. Таким образом, можно увидеть, что же там дальше, за очередным абсолютно непроходимым экраном.

И, наконец, самое интересное для нас, любителей поковыряться внутри. В ПЗУ игры «Снежная Королева» сохранился небольшой фрагмент её исходного кода (в нём есть пропуски, которые я пометил многоточием):

    LXI H,T
...                
    INX H
    MOV D,M
    MOV A,E
    ...     ,D
    OUT ...
    MOV A,E
    OUT ZVUK2+1
    MOV A,D
    OUT ZVUK2+1
    POP D
    CALL   PAUSE
    INX B
    DCR E
    CALL   MOEBR
    JNZ ZMEL
    RET
MEL:    DB  1,3,5,6,8,10,12,1,0
TANOT:  DW  6,6688,6313,5959,5624,5309,5011
    DW  4729,4464,4213,3977,3754,3543
;
;p/p na~alxnoj inicializacii
INIT:    LXI    H,ERT00
    LXI D,ERT00+50
    MVI C,PRB
    CALL   SZAPK
    MVI A,0F2H
    STA ERT00+35
    MVI A,0FEH
    STA ERT00+49

Первая часть этого кода похожа на работу со звуком, после неё идут небольшие массивы данных, предположительно какая-то мелодия (список нот и таблица их частот), а далее собственно некая начальная инициализация, вероятно, выполняющаяся при старте программы.

Подобные истории происходили и с зарубежными играми. Дело в том, что у ассемблеров на компьютерах прошлых лет была особенность: они выделяли под собираемый бинарный файл место на диске, не очищая предыдущее его содержимое. А на том же диске в ходе рабочего процесса регулярно сохранялись редактируемые исходники, которые, в свою очередь, перезаписывались прошивками, и так по кругу.

Благодаря этой случайности мы можем удостовериться в том, что это был ассемблер, работающий в стандартных мнемониках Intel 8080, а также узнать, что в комментариях использовалась кириллическая кодировка-транслит (комментарий ‘П/П начальной инициализации’ перед меткой INIT), и что код в принципе имеет местное происхождение (метки ZVUKx).

▍ ТИА, эмуляция, и я

В начале 2000-х годов на давно уже не существующем форуме Romov.Net, посвящённом эмуляции различных игровых консолей и компьютеров, закономерно возникла тема про советские игровые автоматы.

Тогда ни один из них не только не эмулировался, но и не было даже хотя бы приблизительно известно их внутреннее устройство, кроме того, что какие-то автоматы не имеют микропроцессора, и там эмуляторщикам ловить нечего, а в других вроде бы есть процессор и ПЗУ. Например, в автомате с игрой «Конёк-Горбунок».

В те годы вся информация про эти автоматы, которая была доступна энтузиастам — историческая страничка на сайте компании «Экстрема-Украина». Там страждущие могли даже узнать название платформы — ТИА-МЦ-1 (с двумя дефисами), и узнать, что на ней было ещё немало игр, помимо «Конька». Неполный список игр даже был приведён на страничке. Её, к слову, до сих пор можно посмотреть через ВебАрхив, если кто-то хочет припасть к этому историческому первоисточнику.

В июле 2006 года на форуме нашёлся человек под ником Activator, впервые получивший доступ к телу — к аппарату с «Коньком-Горбунком» в ещё существующем на тот момент парке аттракционов, сохранившимся с советских времён. Вскоре ему удалось не только сделать фотографии внутренностей, но и считать содержимое основных ПЗУ аппарата, содержащих графику и код игры.

Простой советский геймдев: многокадровый, цветной - 16

Первая страница документации, в оригинальном качестве, прямиком из 2006 года

Что совсем уж невероятно, с автоматом обнаружилась оригинальная документация — в годы его разработки советскую электронную технику было принято снабжать принципиальной схемой на (весьма вероятный) случай ремонта. А тут для обслуживания на местах был написан целый сервисный мануал, подробно объясняющий принцип работы всех узлов.

И хотя документация была переснята на коленке, фотографии не отличались качеством, а сама документация не вполне соответствовала реальности (другие адреса некоторых портов), это было совершенное сокровище. К слову, из него же и было получено полное официальное наименование платформы: «автомат игровой телевизионный многокадровый цветной со сменными игровыми программами ТИА-МЦ1» (с одним дефисом).

С таким богатством удалось сделать эмулятор этой платформы за считанные часы. Проделали сразу два завсегдатая форума.

Dr.Titus сделал это первым, но опубликовал свою гораздо более проработанную версию эмулятора сильно позже. К слову, примерно тогда же он разработал эмулятор советского компьютера УКНЦ, а немного позже и эмулятор легендарного, полумифического Союз-Неон ПК-11/16. Насколько я понимаю, все эти платформы объединяются в эмуляторе под общим названием EmuStudio.

Простой советский геймдев: многокадровый, цветной - 17

Первый публичный эмулятор ТИА-МЦ1: просто окно SDL с игрой

Я сделал вторым, но выложил свой довольно сырой прототип эмулятора на радость публике сразу же, попутно снабдив его заметками, суммирующими результаты изучения схем и текстов оригинальной документации. Последние я также вручную перевёл с имеющихся фотографий в нормальный электронный вид. Вроде бы эта информация вскоре пригодилась Metallic’у, который разработал драйвер платформы для мультисистемного аркадного эмулятора MAME, таким образом сделав её наследие доступным уже всему миру.

Примерно тогда же я написал коротенькую статью про сам игровой автомат и «Конька-Горбунка» для входившей тогда в моду Википедии, на двух языках. С тех пор эти статьи были удалены или переделаны, но информация из их изначальных версий в различных вариациях всё ещё циркулирует по клонам Википедии и по всему интернету.

В 2007 году, не знаю точно кем и при каких обстоятельствах, но в только организовавшемся тогда Музее советских игровых автоматов, была сдамплена «Снежная Королева», а плата игры «S.O.S» с теми же целями почему-то была отправлена в Италию, Милан. Немного позже широко известный в узких кругах ромхакер CaH4e3, сделавший кучу всего полезного для эму-сцены, сделал в музее дамп «Бильярда».

Простой советский геймдев: многокадровый, цветной - 18

Публикация в Стране Игр

В 2008 году мой соратник по видеоигровым и историко-журналистским делам, Алексей Беспалько, написал для журнала «Страна Игр» пару статей про игры для ТИА-МЦ — «Откуда прискакал Конёк»? (№ 22, ноябрь) и «Снежная королева» (№24, декабрь). Эти статьи, а также их рабочие материалы, содержащие полученную от Олега Дударя информацию, стали одним из ключевых источников доступной ныне информации о платформе.

Примерно к 2008 году также всплыли цветные «Городки», но по каким-то причинам они тогда не были сдамплены. Проходили слухи об обнаружении «Кота-Рыболова» и «Истребителя». Первые оказались слухами, а «Истребитель» (в единственном числе) был перепутан с совершенно другой игрой «Истребители», более ранней разработкой того же «Терминала» на другом железе.

Простой советский геймдев: многокадровый, цветной - 19

Неопубликованная версия эмулятора

Я тем временем облагородил свой прототип эмулятора, сделав для него более человеческий интерфейс и поддержав все вновь найденные игры. Но он так и не был опубликован, так как появилась нормальная поддержка в MAME, а потом ТИА-МЦ был поддержан ещё и в мультисистемном эмуляторе советских компьютеров b2m (крайне замечательная разработка, не имеющая собственного названия), и смысл выпуска своего эмулятора был утрачен. Так как больше никакие игры не находились, тема, в общем-то, заглохла.

Простой советский геймдев: многокадровый, цветной - 20

Первое фото обнаруженного в Туле «Кота-Рыболова»

Летом 2016 года на форуме Old-Games.ru в вялотекущем ещё с 2008 года обсуждении появилась новая интересная информация, которую я очень удачно случайно заметил. Игровой автомат с игрой «Кот-Рыболов» был обнаружен где-то в окрестностях Тулы. Также было выложено фото с невиданной доселе версией платы.

Я порывался поехать на место событий и считать содержимое ПЗУ, но вскоре автомат был приобретён Музеем советских игровых автоматов и перевезён в Москву, и необходимость моего участия вроде как отпала — предполагалось, что уж у Музея-то наверняка есть кому считать ПЗУ (позже выяснилось, что нет).

Простой советский геймдев: многокадровый, цветной - 21

Первое фото платы «Кота-Рыболова»

Однако так совпало, что в июне 2016 музей вышел на меня сам, с просьбой рассказать про создание эмулятора. В результате я вместе с Алексеем Беспалько посетил музей, пообщался с организаторами, и мы договорились о принятии мер для сохранения наследия в цифровом виде.

Вскоре, уже вместе с IgorR76, автором самого настоящего эмулятора Электроники «Ну, Погоди», который также присутствовал на вышеупомянутом форуме и заинтересовался темой, нам удалось попасть в запасники музея, прикоснуться к реликвиям, и считать содержимое ПЗУ «Кота-Рыболова», а также внезапно нашедшихся там «Городков» в варианте для ТИА-МЦ1.

Игорь по итогам нашего визита застрял в музее на долгие годы и сделал много интересных вещей, в частности, разработал схемную реплику оригинальных «Городков» на FPGA и восстановил совершенно уникальный игровой автомат «Лело».

Простой советский геймдев: многокадровый, цветной - 22

Эмулятор с «Коньком» на стареньком ZTE

Чуть позже в том же 2016 году я сделал для музея эмулятор ТИА-МЦ1 и другого отечественного игрового автомата, «Фотон», сначала для веб-странички на тогда ещё живом Adobe Flash, потом для телефонов и планшетов на Android.

Ещё чуть позже, снова в 2016 году, Алексей Беспалько смог выйти на ещё одного из непосредственных разработчиков ТИА-МЦ1, Александра Гоноровского, который после института попал по распределению на «Терминал» и проработал там с 1979 по 1988 годы, приняв участие в разработке аппаратной части телевизионных игровых автоматов Городки (блоки индикации и звуковых эффектов), Центр-1000 (блок развёртки и отображения динамических объектов), Истребители, и собственно ТИА-МЦ1 (вся цифровая часть). Мы записали с ним большое аудиоинтервью, но по некоторым причинам оно ушло в стол.

В 2021 году YouTube-канал «Геймдев от первого лица» сделал новое, уже видеоинтервью с Гоноровским, в котором он раскрыл тему ещё подробнее и появился в кадре лично. По следам этого интервью была опубликована и наша аудио-версия, вместе с частичной расшифровкой. Эти две записи и есть главный нынешний публично доступный и наиболее детальный источник про историю создания платформы.

В прошлом году я переписал код моего эмулятора ТИА-МЦ-1 и Фотона (игровой автомат на базе компьютера ПК8000) на C и адаптировал для ESP32, разместив таким образом эмулятор в корпусе советского джойстика. Про это была написана статья для Хабра.

Наконец, совсем недавно Виктор Карасёв, автор YouTube канала «Уютный подвальчик», полюбопытствовал у меня про некоторые детали рассказанной выше истории для своего нового видео, посвящённого советским игровым автоматам, что и стало триггером для написания этой статьи.

▍ Что внутри

Оригинальная версия аппаратуры ТИА-МЦ1 состоит из четырёх основных блоков — больших плат с великим множеством логических микросхем, вставляющихся в общую «корзину» и получающих киловатты электричества от мощного блока питания (про киловатты, конечно же, шутка). Называются блоки БЭИА: Блок Элементов Игрового Автомата.

Простой советский геймдев: многокадровый, цветной - 23

Все четыре платы ТИА-МЦ1 (версия для «Городков»)

БЭИА-100 — основной управляющий блок. Содержит 8-разрядный центральный процессор КР580ВМ80 (Intel 8080), работающий на частоте 1.575 МГц (по документации) или 1.78 МГц (по плате), звуковой генератор на двух таймерах КР580ВИ53, внешние интерфейсы на одной КР580ВВ55, ОЗУ палитры и видео ЦАП, формирующий аналоговые сигналы R,G,B.

БЭИА-101 — блок генерации синхросигналов и фонового изображения. Содержит множество счётчиков, 4 микросхемы ОЗУ объёмом 2 килобайта для программируемого знакогенератора и ещё одну такую же микросхему для хранения описания слоя фона.

БЭИА-102 — блок формирования подвижных изображений, то есть аппаратных спрайтов. Также в нём установлено ОЗУ атрибутов спрайтов (их положение и опции отображения) и ОЗУ растеризатора, содержащее три строки шириной в 256 пикселей: пока одна строка отображается, вторая обнуляется, а третья заполняется строками спрайтов с нужными смещениями.

БЭИА-103 — блок памяти. Содержит ПЗУ с кодом и графикой игры, а также основное ОЗУ. Замена игры производится заменой этого блока или ПЗУ в его панельках. В зависимости от игры в реальных автоматах могут быть заполнены не все панельки ПЗУ.

Простой советский геймдев: многокадровый, цветной - 24

Блок-схема архитектуры ТИА-МЦ1

Видеосистема построена по классической консольно-приставочной схеме. Изображение состоит из слоя фона, конструируемого из 16-ти цветных символов-тайлов размером 8 на 8 пикселей. По сути это текстовый экран размером 32 на 32 символа. Поверх него аппаратно накладываются также 16-ти цветные спрайты размером 16 на 16 пикселей.

На схеме, прилагающейся к игровому автомату с «Коньком», в качестве генератора звука присутствуют две микросхемы КР580ВИ53, включённые последовательно: выходы счёты первого таймера заведены на входы второго таймера. Выходы второго таймера объединяются через несколько логических элементов в общий монофонический выход.

Простой советский геймдев: многокадровый, цветной - 25

Схема звукового синтезатора в «Коньке» из оригинальной документации

Причина такого необычного технического решения не вполне понятна до сих пор. Потенциально оно даёт управление тембром или громкостью, но никакие известные игры не задействуют ничего, кроме одного канала таймера, который по сути работает как аналог PC Speaker. Последующие версии автомата планомерно упрощали этот узел.

Игровой автомат с «Городками» отличается по принципиальной схеме прежде всего в области звукового генератора: там указан только один таймер ВИ53, выходы которого соединяются вместе уже без лишних затей. Сама плата при этом по разводке не отличается от «Конька», просто одна микросхема не установлена и припаяны перемычки.

Простой советский геймдев: многокадровый, цветной - 26

Контроллер «Городков» и его плата АЦП

Игровой контроллер с аналоговой ручкой вместо джойстика для «Городков» построен на переменном конденсаторе типа КПВ и блоке АЦП — платы, расположенной непосредственно рядом с ручкой. Блок подключается вместо обычных кнопок управления и передаёт цифровое значение примерно в диапазоне 96..208, соответствующее отклонению ручки.

Одноплатная версия ТИА-МЦ близка по архитектуре к оригинальной версии, но, конечно, совершенно иная конструктивно: всего одна основная плата, гораздо меньше микросхем. На плату также интегрирован усилитель мощности звука. Игры располагаются на отдельной платке, которая не содержит ничего, кроме микросхем ПЗУ.

Простой советский геймдев: многокадровый, цветной - 27

Одноплатная версия ТИА

Главное архитектурное отличие одноплатной версии ТИА заключается в упразднении ОЗУ знакогенератора фона. Теперь символы хранятся в ПЗУ объёмом 32 килобайта (1024 символа). Спрайты работают точно так же, как прежде.

Звук окончательно деградировал: для него теперь используется всего один канал таймера ВИ53, а два оставшихся канала применяются для горизонтального и вертикального гашения при формировании видеосигнала.

Простой советский геймдев: многокадровый, цветной - 28

Плата ПЗУ для одноплатной версии ТИА, в ПЗУ записан «Кот-Рыболов»

Разумеется, в связи с произошедшими изменениями в одноплатной версии немного отличается карта адресного пространства и номера управляющих портов, что делает версии программно несовместимыми.

Достаточно интересно сравнить возможности ТИА-МЦ1 и современных ей зарубежных игровых консолей. Это будут наша любимая Денди (Famicom 1983, NES 1985) и Sega Master System (1986). Сделаем это в виде простой таблички с основными характеристиками.

Денди Master System ТИА-МЦ1
Процессор 6502 @ 1.78 МГц Z80 @ 3.58 МГц i8080 @ 1.575 МГц
Основное ОЗУ 2 КБ 8 КБ 8 КБ
Основное ПЗУ До 32 КБ (расширяется мапперами) До 48 КБ (расширяется мапперами) До 56 КБ
Разрешение 256x224 256x192 256x256
Общая палитра примерно 56 цветов 64 цветов 256 цветов
Цветов на экране 25 32 16
Тайлов на экране 256 256 256
Размер тайла 8 на 8 8 на 8 8 на 8
Размер карты тайлов Две 32x30 Две 32x32 Одна 32x32
Цветность тайла 4 цвета 16 цветов 16 цветов (общие со спрайтами)
Спрайтов в строке 8 8 16
Спрайтов на экране 64 64 16
Размер спрайта 8 на 8 или 8 на 16 8 на 8 или 8 на 16 16 на 16
Цветность спрайта 4 цвета 16 цветов 16 цветов (общие с фоном)
Видео ОЗУ 2 КБ (карта слоя фона) 16 КБ (графика тайлов, спрайтов, карта слоя фона) 10 КБ (256 тайлов фона и карта слоя фона)
ПЗУ графики До 8 КБ (без мапперов), графика тайлов и спрайтов нет До 32 КБ, графика спрайтов (тайлы в основном ПЗУ)
Звук 5 каналов
Прямоугольная волна разной скважности
Треугольная волна
Белый и периодический шум
Контроль громкости
Поддержка сэмплов
4 канала
Квадратная волна
Белый и периодический шум
Контроль громкости
3 канала
Только квадратная волна
Без контроля громкости
Возможность модуляции

Я имею практический опыт работы со всеми тремя платформами (делал эмуляторы и игры), и на мой взгляд, ТИА-МЦ1 показывает себя очень достойно в этом ряду. Будь эта платформа выполнена в формате игровой консоли, она вполне бы могла конкурировать с названными платформами.

Но нужно быть осторожнее со своими желаниями: пока я писал эту статью, на просторах интернета появился проект, как раз адаптирующий архитектуру ТИА-МЦ к формату ретро-игровой консоли. Жаль, что он опоздал на почти четыре десятилетия, но тем не менее затея интересная.

▍ Для программиста

Главное, что нужно знать программисту для работы с платформами тех лет — это тип и рабочая частота основного процессора, карта его адресного пространства, и специфика работы с периферийными устройствами, в нашем случае это прежде всего видеосистемы. Про процессор мы уже знаем, про остальное излагаю кратко.

В основном адресном пространстве процессора представлены только ПЗУ, основное ОЗУ и видео-ОЗУ, расположенные очень понятным и эффективным образом:

Простой советский геймдев: многокадровый, цветной - 29

Карта памяти оригинальной версии ТИА-МЦ

Хотя на плате игрового автомата предусмотрен контроллер прерываний, в системе он никак не используется. В реальных играх первой же командой идёт запрет прерываний, и далее они никогда не разрешаются.

Все устройства, в том числе видеосистема управляются через порты ввода-вывода. Их довольно много:

Простой советский геймдев: многокадровый, цветной - 30

Карта портов ввода-вывода оригинальной версии ТИА-МЦ

На первый взгляд, такая реализация кажется красивой и удобной. Однако есть подвох: у процессора 8080 нет команд для косвенной адресации портов. А значит, чтобы обратиться к нужной ячейке палитры или нужному атрибуту спрайта, нужно каждый раз использовать абсолютное значение номера регистра, что сильно увеличивает объём кода. И даже самомодификацию кода применить не так-то просто, ведь штатно исполняемый код размещается в ПЗУ.

Простой советский геймдев: многокадровый, цветной - 31

Все слои изображения и палитра

Видеосистема состоит из двух отдельных сущностей: слоя фона и спрайтов, а также общей для них программируемой палитры, задающей список из 16 цветов, выбранных из общей палитры в 256 цветов.

Цвет в палитре задаётся в формате G3R3B2, то есть по три бита на красную и зелёную составляющие, и два бита на синюю:

Простой советский геймдев: многокадровый, цветной - 32

Палитра всех версий ТИА-МЦ

Изображение на слое фона определяется содержимым видео-ОЗУ, в которое по мере необходимости загружаются изображения 6-ти цветных символов, до 256 штук, а также карта символов. Спрайты хранятся в физически полностью отдельном от процессора ПЗУ, доступа к этим данным у процессора нет.

Организация видео-ОЗУ напоминает видеоадаптер EGA. Она позволяет писать данные одновременно в несколько ОЗУ, расположенные по одним и тем же адресам в памяти. Состоит это ОЗУ из пяти битовых плоскостей объёмом 2 килобайта каждая. Четыре битовых плоскости содержат графику знакогенератора, а пятая — карту тайлов, то есть массив с номерами символов, определяющую содержание слоя фона на экране.

Простой советский геймдев: многокадровый, цветной - 33

Битовые плоскости и итоговый цветной набор символов

Битовая плоскость с описанием слоя фона имеет простой линейный формат, две переключаемые страницы размером 32 на 32 байта, идущие одна за другой. Байт в этой памяти — просто номер тайла для отображения на экране.

Графика символов в ОЗУ знакогенератора имеет следующий формат: каждый байт содержит горизонтальную линию из восьми соседних пикселей. В первом битплане в этом байте лежат младшие биты, во втором — следующие, и так далее. Изображение одного символа занимает последовательные 8 байт. Младший бит — крайняя правая точка, старший — крайняя левая.

Видеосистема предусматривает прокрутку слоя фона, но в реальных играх эта возможность не задействована. Увидеть работу прокрутки можно только в тестовой программе, и её реализация до конца не ясна. Судя по работе теста на реальном автомате, слой фона не зацикливается на себя, как принято на игровых консолях, но это не точно.

Простой советский геймдев: многокадровый, цветной - 34

Полное декодированное содержимое ПЗУ спрайтов «Конька-Горбунка»

Графика спрайтов в их персональном ПЗУ также хранится в формате битпланов. Каждое из четырёх 8-килобайтных ПЗУ содержит один битплан. Аналогично тайлам, в одном байте хранятся биты восьми пикселей, соседствующих по горизонтали. Хотя спрайты имеют размер 16 на 16 пикселей, фактически они хранятся половинками в формате 8x16, по 16 байт каждого спрайта подряд. В младшей половине каждого ПЗУ хранятся левые половинки, в старшей половине — правые.

Другими словами, 13-битный адрес спрайта в ПЗУ имеет следующий формат:

HNNNN NNNNLLLL

Где L номер строки спрайта, N порядковый номер изображения спрайта, H номер половинки спрайта.

Код цвета 15 (все биты установлены) у спрайтов считается прозрачным, через него видны нижележащие спрайты и слой фона. Приоритет спрайтов считается просто по номеру слота: чем старше номер слота, тем выше спрайт. Есть возможность отзеркаливания спрайтов по горизонтали и вертикали.

Нужно отметить, что есть ряд расхождений между документацией и фактической реализацией: менялись некоторые адреса портов и назначения бит. Также тестовая программа обращается к портам #D8, #D9, #DB, которые не упоминаются в документации. Их назначение неизвестно, но сигнатура намекает на ещё один порт ввода-вывода ВВ55.

В одноплатной версии для «Кота-Рыболова», не имеющей ОЗУ знакогенератора, отличается карта адресного пространства процессора:

Простой советский геймдев: многокадровый, цветной - 35

Карта памяти одноплатной версии ТИА-МЦ

Наборы символов в ПЗУ переключаются группами по 256 штук. Спрайты работают точно так же. Для звука используется всего один канал таймера ВИ53. Номера портов также немного иные:

Простой советский геймдев: многокадровый, цветной - 36

Карта портов ввода-вывода одноплатной версии ТИА-МЦ

▍ Hello!

Закончим повествование выходом силы: сделаем первую в мире homebrew-программу для оригинальной версии ТИА-МЦ1, выводящую практически классическую строчку текста на экран. Потому что можем!

Чтобы провернуть такой трюк с помощью современных инструментов, нам понадобится какой-то кросс-ассемблер для Intel 8080, позволяющий собирать бинарные блоки. С такими ассемблерами не очень густо, так как наибольшую популярность процессор имел не на Западе, а в наших краях, и весьма давно, поэтому основные разработки в этом направлении относятся к эпохе MS-DOS.

Можно задействовать более распространённые кросс-ассемблеры для Z80, просто не применяя никакие расширенные возможности этого процессора — бинарный код основного набора инструкций у 8080 и Z80 полностью совпадает. Но есть вариант получше: кросс-ассемблер SjAsmPlus для Z80, уже имеющий опцию автоматического ограничения набора опкодов для 8080. Это снижает вероятность случайной ошибки.

Чтобы не усложнять код, мы не будем трогать слой фона и загружать символы в ОЗУ знакогенератора. Вместо этого выведем буквы спрайтами, пошатаем и раскрасим их разными цветами, и даже (я же мастер этих ваших чиптюнов!) пропищим небольшую мелодию.

Первым делом нужно как-то сконвертировать графику спрайтов. Для этого я написал программку на Питоне:

Код конвертера. Осторожно, Питон!

from image256c import *
import sys

picture_src=Image()
picture_src.load(sys.argv[1])

rom_0=bytearray(8192)
rom_1=bytearray(8192)
rom_2=bytearray(8192)
rom_3=bytearray(8192)

for sprite_y in range(0,16):

	for sprite_x in range(0,16):

		sprite_num=sprite_y*16+sprite_x
		
		for pixel_y in range(0,16):

			for pixel_x in range(0,16):
			
				bmp_x=sprite_x*16+pixel_x
				bmp_y=sprite_y*16+pixel_y
				
				color_id=picture_src.get(bmp_x,bmp_y)
			
				offset=sprite_num*16+pixel_y		
				
				if pixel_x>=8:
					offset+=4096
					
				bitmask=128>>(pixel_x&7)
				
				if color_id&1:
					rom_0[offset]|=bitmask
				if color_id&2:
					rom_1[offset]|=bitmask
				if color_id&4:
					rom_2[offset]|=bitmask
				if color_id&8:
					rom_3[offset]|=bitmask

with open('00.2a', 'wb') as file:
    file.write(rom_0)
	
with open('01.3a', 'wb') as file:
    file.write(rom_1)
	
with open('02.5a', 'wb') as file:
    file.write(rom_2)
	
with open('03.6a', 'wb') as file:
    file.write(rom_3)

Программка использует мою старую библиотечку для работы с 256-цветными файлами формата BMP, которая часто пригождается мне для написания подобных конвертеров.

На входе у нас изображение размером 256 на 256 точек — это матрица 16 на 16 спрайтов, то есть все возможные 256 спрайтов для ТИА. На выходе получаем набор бинарных файлов с названиями, соответствующими системе, принятой в эмуляторе MAME.

Простой советский геймдев: многокадровый, цветной - 37

Исходные изображения спрайтов (фрагмент)

Для музыки я традиционно задействовал свой VST-плагин PCSPE, о котором уже много раз рассказывал, поэтому повторяться не буду. Полученные данные были экспортированы в файл music.bin. Я поленился дорабатывать плагин для работы с нестандартной тактовой частотой таймера (1.575 МГц вместо 1.18 МГц), и просто понизил высоту получаемого звука вдвое. Также я решил поэкспериментировать и сделал небольшую расстройку каналов звука для более интересной его окраски вместо обычного «квадратного» звучания.

Код самой демки написан на ассемблере в мнемониках Z80. Кода относительно много, зато он весь в комментариях:

Код на ассемблере Z80

    device NOSLOT64K

;PRG ROM

	org #0000

code:

	;запрещаем прерывания, устанавливаем стек
	
	di
	
	ld sp,0
	
	;устанавливаем чёрную палитру на время инициализации
	
	ld a,#ff
	cpl					;большинство бит управляющих портов инверсные, включая палитру
	
PAL_PORT=#a0			;при работе с портами используем макросы для сокращения исходного текста
	dup 16
	out (PAL_PORT),a
PAL_PORT=PAL_PORT+1
	edup
	
	;инициализируем звук
	
	ld a,#38			;все каналы таймера 1 в Mode 4 (не используется)
	out (#d7),a
	ld a,#78
	out (#d7),a
	ld a,#b8
	out (#d7),a
	ld a,#07			;устанавливаем gate всех таймеров
	out (#da),a
	ld a,#36			;все каналы таймера 0 в Mode 3, загрузка lsb/msb
	out (#c3),a
	ld a,#76
	out (#c3),a
	ld a,#b6
	out (#c3),a
		
	;заранее устанавливаем спрайты в нужные позиции
	
SPR_PORT_X=#50
SPR_PORT_N=#60
SPR_PORT_A=#70

	ld b,0				;начальный номер изображения в ПЗУ спрайтов
	ld c,32				;начальная X-координата
	
	dup 11
	ld a,c
	cpl					;все атрибуты спрайтов инверсные
	out (SPR_PORT_X),a
	ld a,c
	add a,18
	ld c,a
	ld a,b
	cpl
	out (SPR_PORT_N),a
	inc b
	ld a,#01			;атрибуты, установлен флаг отображения
	cpl
	out (SPR_PORT_A),a
SPR_PORT_X=SPR_PORT_X+1
SPR_PORT_N=SPR_PORT_N+1
SPR_PORT_A=SPR_PORT_A+1
	edup
	
	;зануляем ОЗУ
	
	ld a,0
	out (#be),a		;разрешаем запись во все слои видео-ОЗУ, чтобы очистить его тоже
	
	ld hl,#b000		;заполняем область #b000..ffff нулём
	
.ram_clear

	ld a,0
	ld (hl),a
	inc hl
	ld a,h
	or a
	jp nz,.ram_clear

	;устанавливаем переменные
	
	ld hl,music_data
	ld (music_ptr),hl
	ld (music_loop),hl
	
	ld a,#0
	ld (color_shift),a
	
	ld hl,sprite_y
	ld de,sprite_dy
	ld a,1
	ld c,120
	ld b,11
	
.set_sprites:

	ld (de),a
	inc de
	ld (hl),c
	inc hl
	inc c
	dec b
	jp nz,.set_sprites
	


	;цикл анимации
	
main_loop:
	
	;ожидаем начало кадра

.wait1:
	in a,(#d2)
	and #80
	jp nz,.wait1

.wait2:
	in a,(#d2)
	and #80
	jp nz,.wait2

	;устанавливаем палитру, чередуя индексы
	;цвет 0 всегда остаётся одинаковым, это цвет фона
	;цвет 1 также остаётся одинаковый, это цвет тени букв

	ld a,#7f
	cpl
	out (#a0),a
	ld a,#ff
	cpl
	out (#a1),a
	
	ld a,(color_shift)
	ld c,a

PAL_PORT=#a2
	dup 11
	call color_by_id
	cpl
	out (PAL_PORT),a
	call color_id_inc
PAL_PORT=PAL_PORT+1
	edup

	;обновляем вертикальную позицию спрайтов
	
	ld hl,sprite_y
	
SPR_PORT_Y=#40
	dup 11
	ld a,(hl)
	inc hl
	cpl
	out (SPR_PORT_Y),a
SPR_PORT_Y=SPR_PORT_Y+1
	edup

	;шевелим спрайты по вертикали
	
	ld b,11
	ld hl,sprite_dy
	ld de,sprite_y
	
.move_sprites:

	ld a,(de)
	add a,(hl)
	ld (de),a
	
.check_top:

	cp 104
	jp nc,.check_bottom
	ld a,1
	ld (hl),a
	jp .next_sprite

.check_bottom:

	cp 136
	jp c,.next_sprite
	ld a,-1
	ld (hl),a

.next_sprite:

	inc hl
	inc de
	dec b
	jp nz,.move_sprites
	
	;играем мелодию
	
.music_update:

	ld a,(music_delay)
	or a
	jp z,.music_fetch
	dec a
	ld (music_delay),a
	jp nz,.music_skip

.music_fetch:
	
	ld hl,(music_ptr)
	
	ld a,(hl)
	or a
	jp nz,.music_no_loop
	ld hl,(music_loop)
	ld (music_ptr),hl
	jp .music_fetch
	
.music_no_loop:

	inc hl
	ld (music_delay),a
	
	ld c,(hl)
	inc hl
	ld b,(hl)
	inc hl
	ld (music_ptr),hl
	
	ld a,b
	or c
	jp z,.music_mute
	
.music_tone:

	ld a,c				;понижение на октаву, чтобы не модифицировать музыкальный плагин
	add a,c
	ld c,a
	ld a,b
	adc a,b
	ld b,a
	ld b,a

	ld a,#36			;Mode 3, квадратная волна
	out (#c3),a
	ld a,#76
	out (#c3),a
	ld a,c				;один делитель выводится в два канала таймера одновременно
	out (#c0),a
	ld a,b
	out (#c0),a
	
	ld a,c				;расстройка второго канала для дополнительного окраса в звуке
	add a,25
	ld c,a
	ld a,b
	adc a,0
	ld b,a
	
	ld a,c
	out (#c1),a
	ld a,b
	out (#c1),a
	jp .music_skip
	
.music_mute:

	ld a,#38			;Mode 4, одиночный импульс, для заглушения звука
	out (#c3),a
	ld a,#78
	out (#c3),a
	
.music_skip:

	;раз в несколько кадров сдвигаем цвета букв

	ld a,(frame_cnt)
	and #03
	jp nz,.next_frame
	
	ld hl,color_shift
	ld c,(hl)
	call color_id_inc
	ld (hl),c
	
.next_frame:

	;счётчик кадров
	
	ld hl,frame_cnt
	inc (hl)
	
	;дополнительная задержка, без неё проскакивает ожидание кадра в MAME
	
	ld bc,1000
.delay:
	dec bc
	ld a,b
	or c
	jp nz,.delay

	jp main_loop

	

color_by_id:

	ld hl,color_rainbow
	add a,l
	ld l,a
	ld a,h
	adc a,0
	ld h,a
	ld a,(hl)
	ret
	
;циклическое изменение значения цвета, чтобы получить радугу из ярких цветов

color_id_inc:

	ld a,c
	inc a
	and 15
	ld c,a
	ret
	
	
	
	;палитра полной радуги из 16 шагов, подобрана вручную

color_rainbow:

	db #c7,#c3,#c0,#c8,#d8,#e8,#b8,#78,#39,#3b,#3e,#2e,#27,#07,#47,#87
	
	;данные музыки (байт длительности в кадрах и два байта частоты звука)
	
music_data:

	incbin "music.bin"
	
	;пустой кусок памяти для сохранения в качестве неиспользуемых фрагментов ПЗУ

_null:

	ds #2000,0
	
	

;PRG RAM

	org #e000

frame_cnt:		db 0
color_shift:	db 0
sprite_y:		ds 11
sprite_dy:		ds 11
music_ptr:		dw 0
music_loop:		dw 0
music_delay:	db 0



	;save program ROMs
	
	savebin "04.1g",code,#2000
	savebin "05.2g",_null,#2000
	savebin "06.3g",_null,#2000
	savebin "07.4g",_null,#2000
	savebin "08.5g",_null,#2000
	savebin "10.7g",_null,#2000

Компилируем и с помощью директив кросс-ассемблера сразу получаем нужный набор бинарных файлов с кодом:

sjasmplus --i8080 tiatest.asm

Чтобы запустить результат, мимикрируем под одну из существующих игр: помещаем все файлы в zip-архив с именем игры. Например, будем изображать из себя королеву:

7z a -tzip koroleva.zip 00.2a 01.3a 02.5a 03.6a 04.1g 05.2g 06.3g 07.4g 08.5g 10.7g

Запускаем! Берём любую достаточно свежую версию MAME, кладём архив в папку /roms/. Из оболочки запустить нашу программу не удастся, так как эмулятор проверяет контрольную сумму. Но это ограничение легко обходится запуском через командную строку:

mame koroleva

Результат налицо:

Важный момент, о котором нужно сказать: работа программы в эмуляторе вовсе не гарантирует её работу на реальном устройстве. Даже напротив, скорее всего при запуске этой демки на реальном автомате обнаружатся какие-то нюансы. Например, совершенно не факт, что музыка будет звучать именно так.

Дело в том, что в реальном железе есть различные особенности, которые можно (случайно или по незнанию) проигнорировать при создании эмулятора, но игры всё равно будут нормально запускаться. Чаще всего это касается таймингов, например, времени доступа к видеопамяти, но также могут быть и другие нетривиальные моменты.

Изучить эти особенности только по схемам и документации не так-то просто. Даже анализ кода игр не помогает, ведь они тоже задействуют далеко не все возможности и не упираются в пограничные случаи. Чтобы изучить и учесть всё это, необходимы множественные тесты на железе. В случае с ТИА-МЦ таких тестов пока никто не делал. И поэтому в понимании устройства этой платформы до сих пор остаются значительные пробелы.

Полный исходный код проекта вместе со скомпилированной программой можно скачать в открытом посте моего блога на Бусти (ну а что поделать: пишу там много интересного, но никто не читает).

▍ Заключение

Только коллективные усилия множества энтузиастов, прилагаемые на протяжении пары десятилетий, позволили сохранить частичку этого уникального наследия для истории видеоигр.

Часть игровых автоматов в рабочем состоянии сейчас находится в Музее советских игровых автоматов, который имеет два филиала в Москве и один в Питере, и там к ним всё ещё можно прикоснуться своими руками. Живёт наследие и в других формах: так, в 2019 году энтузиасты сделали улучшенную версию игры «Конёк-Горбунок» для современного 8-битного хобби-компьютера ZX Evolution.

К сожалению, надежд обнаружить следы прочих игр, помимо уже найденных, с каждым годом становится всё меньше, и возможно, что эта самая яркая часть истории позднего советского и раннего украинского геймдева утрачена навсегда.

Автор: shiru8bit

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js