![](https://habrastorage.org/webt/li/lk/he/lilkheaggnhxqyfckdwl5v-hmx0.jpeg)
Около года назад, в одной из прошлых своих публикаций, я уже вскользь касался темы самой совершенной советской видеоигровой аркадной платформы, ТИА-МЦ1. Недавно поступило предложение рассказать про это поподробнее: какое я имею к ней отношение, как и когда удалось создать её эмулятор для современных ПК, как она устроена, в конце концов. Приступаем!
▍ История ТИА-МЦ
Точную историю создания этого величайшего достижения советской видеоигровой промышленности до сих пор не удалось реконструировать полностью. Все попытки это сделать, так или иначе, компилируют сведения из нескольких известных источников, формируя свою версию. Не буду в этом оригинален и составлю своё предположение, основываясь на словах разработчиков платформы и игр для неё, не претендуя, впрочем, на полную историческую достоверность.
![](https://habrastorage.org/webt/bk/sp/ua/bkspuasks3_hyc9u3hskegpka_8.jpeg)
В 1971 году в СССР прошла международная выставка «Аттракцион-71», на которой были продемонстрированы новейшие достижения в области высокотехнологичных развлечений: как больших аттракционов, так и малых развлекательных машин типа пинболов. Показанные там успехи на этом поприще со стороны США и Японии нельзя было оставить без внимания: нужно было показать, что и в СССР есть вещи не хуже.
Министерство культуры СССР поручило решить эту задачу созданной немного ранее организации «Союзаттракцион». По её заказу различные радиотехнические предприятия страны в рамках программы производства товаров народного потребления начали создавать аналоги продемонстрированных зарубежных развлекательных устройств — в том числе памятный всем «Морской Бой», повторяющий идею и дизайн американского «Sea Raider» 1969 года.
![](https://habrastorage.org/webt/5v/km/lf/5vkmlfc6g_sihqnshtnvnswlpzm.jpeg)
Отзвуком этих событий стал тендер на разработку темы телевизионных игр, объявленный Министерством приборостроения в начале 1980-х годов. Его выиграло Винницкое НПО «Терминал», уже имеющее базу по разработке и производству хоть сколько-то подобного оборудования — Винница в те годы была мощным средоточием предприятий электронной промышленности, своего рода Силиконовой долиной.
Тема была спущена в подчинённый Терминалу НИИ ВТТ (видеотерминальной техники), сформированный тогда же, в начале 1980-х. Уже в 1982-1984 годах в его стенах были разработаны первые игровые автоматы: чёрно-белые «Городки», «Центр-1000», «Истребители» двух версий (на микропроцессоре и без) и «Мотогонки-Т».
![](https://habrastorage.org/webt/52/pq/px/52pqpxa-tzs0-8tdapga-kzvtqi.jpeg)
Среди разработчиков этой ранней аппаратуры — Анатолий Хаимович Цесис и Дмитрий Иванович Захаров. В работе над последующим проектом, ТИА-МЦ, они непосредственного участия не принимали, но над первыми игровыми автоматами вместе с ними работал Александр Иосифович Гоноровский, будущий разработчик аппаратуры ТИА-МЦ1.
Сохранился занимательный исторический артефакт, связанный с этой предыдущей работой: авторское свидетельство (патент) СССР № 1139453 на устройство для проведения телеигр — фактически способ формирования динамических спрайтов, использующийся в игре «Городки». Оно до сих пор хранится в базе Google Patents (SU1526709A1), в том числе его скан-копия. И хотя оно едва ли имело практическую ценность даже тогда, в конце 80-х, теперь мы имеем уникальную возможность проникнуться духом эпохи.
![](https://habrastorage.org/webt/jt/z4/at/jtz4atpuodnxcu4phmwf0rfuz6s.jpeg)
Примерно в 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.
![](https://habrastorage.org/webt/x4/qf/jc/x4qfjcdv8ymdzprsn4ennlwx7hy.jpeg)
В наследство от ВТА достался конструктив с корзиной для плат и блок питания, остальная аппаратура была создана заново. Применялись новейшие на тот момент технические средства: платы разводились уже не вручную, а в программе P-CAD на 286-ом компьютере.
![](https://habrastorage.org/webt/2g/ko/6a/2gko6aeummho7d7lcwkb0egjnos.jpeg)
Существовало не менее четырёх версий платформы. Первая, оригинальная ТИА-МЦ1, состояла из четырёх отдельных больших плат. Её версия с минимальными изменениями — добавлен ёмкостный рычаг вместо джойстика и его плата АЦП, отсутствует один из таймеров 580ВИ53 для звука — применяется в «Городках».
Ещё одна модификация оригинальной аппаратуры, но с другим корпусом и четырьмя рулями, применяется в «Автогонках», но о ней до сих пор мало что известно. Возможно, она имеет какое-то отношение к игровым автоматам «Авторалли-М» и «Чемпион-М». Последний как раз имеет четыре руля и похожий по описанию игровой процесс.
![](https://habrastorage.org/webt/5v/bw/e4/5vbwe4mbsff3woecly6xtknz_ag.jpeg)
Также существует более заметно отличающаяся версия игрового автомата в другом корпусе и с другой аппаратурой, производившаяся литовским НПО «Сигма». В 1988 году к разработчикам обратился представитель «Сигмы» с предложением разработать аппаратуру и игры для игровых автоматов их собственного производства. Было решено адаптировать уже имеющееся решение, и в результате была создана одноплатная версия ТИА-МЦ, предположительно (по воспоминаниям Дударя) называющаяся ODN-16. Она несколько отличается архитектурно, поэтому игры для неё не совместимы с оригинальной ТИА-МЦ.
Важной частью процесса разработки было создание не только железа самого игрового автомата, но и аппаратуры для создания игр. Дело в том, что на тот момент разработчикам ТИА-МЦ не были доступны готовые платформы, позволяющие создавать цветную пиксельную графику, и они были вынуждены изобрести своё собственное решение: двухэкранную рабочую станцию.
![](https://habrastorage.org/webt/nu/31/rd/nu31rdqyoizrhwbwpaa_5j8s5y4.jpeg)
Это устройство было построено на основе комплекса ИВТ: целый стол с компьютером СМ-1800, работающем на таком же процессоре, как и ТИА-МЦ — советском клоне Intel 8080. Терминал сохранил свой штатный чёрно-зелёный алфавитно-цифровой дисплей (вероятно, тот же самый ВТА), а также был добавлен цветной экран, на который выводилось изображение с разработанного блока формирования цветного изображения. Неизвестно, был это блок из ТИА, или какой-то иной.
После создания железа для этой шайтан-машины был разработан графический редактор, позволяющий рисовать графику, готовить и просматривать последовательности кадров анимации. Рабочие станции были размножены в нескольких экземплярах, и далее разработчики игр могли действовать автономно. Неизвестно, какой именно ассемблер, текстовый редактор и прочие средства применялись при создании кода, но, вероятнее всего, что-то из существующей экосистемы СМ-1800. Сохранялись рабочие файлы на 8-дюймовых дискетах.
Процесс разработки оригинального железа и рабочей станции для создания игр занял около года.
▍ Создание игр
Разные участники по-разному описывают подход к разработке игр, свою ознакомленность с играми и интерес к ним.
Гоноровский упоминает, что в то время они видели поставленный в СССР в рамках введения информатики в общее школьное образование класс компьютеров Yamaha КУВТ (платформа MSX) — но только чтобы ознакомиться с достижениями в области цветной экранной графики, а игр не видели, и придумывали всё сами.
Олег Дударь вспоминает, что ко времени его прихода в тему ТИА-МЦ в НИИ начали поступать новые зарубежные компьютеры — 286-ые ПК с CGA и EGA графикой, и с ними, конечно, проникли и игры, которыми они и вдохновлялись.
![](https://habrastorage.org/webt/44/yg/jh/44ygjhyfyjpawubw8kmh5peiav4.png)
Так или иначе, нельзя отрицать очень явное концептуальное сходство игры «Конёк-Горбунок» с игрой «Athletic Land» 1984 года для компьютеров MSX, которая наверняка попалась на глаза кому-то из разработчиков, благо такие компьютеры в СССР были.
![](https://habrastorage.org/webt/4z/q1/hc/4zq1hck1ogw9rcjim0rfgz_iay4.png)
Да и в «S.O.S» также читается знакомство с парой хитов с набирающего тогда огромную популярность в наших краях компьютера ZX Spectrum (Exolon и Venom Strikes Back), а в «Коте-Рыболове» при очень большом желании можно разглядеть и влияние Yie Ar Kung-Fu с той же MSX.
![](https://habrastorage.org/webt/2e/al/o-/2ealo-rjf0erjbhk6-its3ksijq.png)
Последующие игры уже не имеют таких явных прототипов, хотя Дударь вспоминает, что на (ныне утерянный) «Истребитель» его вдохновила игра Flying Shark для ZX Spectrum, и делалась игра по его лекалам.
Разумеемся, я указываю на эти возможные источники вдохновения не для принижения заслуг разработчиков. Но история о советских инженерах, изобретающих заново видеоигры с чистого листа без оглядки на мировой опыт — это всё-таки лишь красивая легенда. Копирование и постепенное улучшение самых удачных предыдущих решений — закономерное развитие в индустрии видеоигр, и разработчики справились с этим действительно хорошо.
Со слов участников этих событий можно предположить, что раньше с видеоиграми они не сталкивались и впервые узнали про это явление в рамках работы над ТИА-МЦ. Кто-то наигрался за время проекта на всю жизнь и к играм больше не возвращался, кто-то втянулся и задержался в индустрии на годы, в той же «Экстреме».
Главное, что можно сказать про сами игры — они крайне, невыносимо сложны. Если первые пару экранов проходятся даже слишком легко, дальше начинается настоящий игровой ад, почище этой вашей Макаимуры или Соулс. И это не случайность и не (только) недостаток опыта, а последствие поставленной задачи: для окупаемости игровых автоматов один игровой сеанс должен был длиться не более двух минут.
Для ТИА-МЦ всех версий были разработаны следующие игры, в очень приблизительном хронологическом порядке:
- Конёк-Горбунок.
- Бильярд.
- Кот-Рыболов.
- Снежная Королева.
- Автогонки.
- S.O.S.
- Городки.
- Остров Дракона (1990).
- Остров Сокровищ.
- Истребитель (1991).
- Котигорошко.
- Звёздный рыцарь.
Также была нарисована, но не реализована как минимум ещё одна игра:
- ШтурмРейд (1992)
Поздние игры, начиная с «Острова Дракона», до сих пор не обнаружены. Об их существовании и содержании известно со слов Олега Дударя, который рисовал для них графику.
![](https://habrastorage.org/webt/vl/sd/dc/vlsddcsyf_lrqrbkh9jo6b_wv1c.png)
История появления идеи главного хита платформы, игры «Конёк-Горбунок», в версии Александра Гоноровского звучит так: из Министерства культуры поступило пожелание, что неплохо бы разработать автомат по мотивам какой-нибудь известной сказки. Гоноровский в то время читал своему маленькому сыну одноимённую сказку Ершова, которому она очень нравилась. В процессе мозгового штурма участники проекта предлагали свои идеи, но в итоге утвердили предложение Гоноровского. Разработка «Конька-Горбунка» заняла около полугода.
![](https://habrastorage.org/webt/-g/xb/n9/-gxbn9xbbt9p-dpuygmrohbswuo.png)
Первой игрой для аппаратуры версии ODN-16 стал «Кот-Рыболов». Однако, похоже, что некоторое время версии существовали параллельно, и часть игр для оригинальной аппаратуры ТИА-МЦ1 выходила уже во время существования новой версии. На данный момент «Кот-Рыболов» является единственной вновь найденной игрой, работающей на одноплатной версии железа.
![](https://habrastorage.org/webt/zc/hk/7e/zchk7e-ykgcwborsl93ttgqgfle.png)
Так как по поводу точных дат и порядка разработки воспоминания участников расходятся, у меня есть гипотеза, что «Кот Рыболов» сначала был сделан для первой версии аппаратуры, а для одноплатной модификации он был адаптирован позже. Но никаких подтверждений для этого предположения пока не обнаружено.
▍ Пасхалки
Внутри игр есть несколько интересных моментов совершенно различной природы, которые я опишу общим словом «пасхалки».
Во-первых, что мог заметить каждый достаточно умелый игрок — в «Коньке-Горбунке» отсутствует один игровой экран. В верхней части экрана наглядно показано, как далеко продвинулся игрок, и в какой-то момент он переходит не на один, а сразу на два экрана. Почему так произошло, достоверно неизвестно, но, судя по всему, игровая программа написана не в формате «движка», как сказали бы сейчас, а каждая локация представляет собой обособленную программу.
Во-вторых, внутри корпуса игрового автомата скрыта кнопка «Тест». Её назначение двоякое: если нажать её сразу после сброса (включения) автомата, запустится встроенная тестовая программа, проверяющая функционирование различных блоков. Если же нажать кнопку во время уже начатой игры, в большинстве игр случится переход на следующую игровую локацию. Таким образом, можно увидеть, что же там дальше, за очередным абсолютно непроходимым экраном.
И, наконец, самое интересное для нас, любителей поковыряться внутри. В ПЗУ игры «Снежная Королева» сохранился небольшой фрагмент её исходного кода (в нём есть пропуски, которые я пометил многоточием):
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, впервые получивший доступ к телу — к аппарату с «Коньком-Горбунком» в ещё существующем на тот момент парке аттракционов, сохранившимся с советских времён. Вскоре ему удалось не только сделать фотографии внутренностей, но и считать содержимое основных ПЗУ аппарата, содержащих графику и код игры.
![](https://habrastorage.org/webt/eq/zi/8s/eqzi8s1zy7gd-km1zpxno7ltrde.jpeg)
Что совсем уж невероятно, с автоматом обнаружилась оригинальная документация — в годы его разработки советскую электронную технику было принято снабжать принципиальной схемой на (весьма вероятный) случай ремонта. А тут для обслуживания на местах был написан целый сервисный мануал, подробно объясняющий принцип работы всех узлов.
И хотя документация была переснята на коленке, фотографии не отличались качеством, а сама документация не вполне соответствовала реальности (другие адреса некоторых портов), это было совершенное сокровище. К слову, из него же и было получено полное официальное наименование платформы: «автомат игровой телевизионный многокадровый цветной со сменными игровыми программами ТИА-МЦ1» (с одним дефисом).
С таким богатством удалось сделать эмулятор этой платформы за считанные часы. Проделали сразу два завсегдатая форума.
Dr.Titus сделал это первым, но опубликовал свою гораздо более проработанную версию эмулятора сильно позже. К слову, примерно тогда же он разработал эмулятор советского компьютера УКНЦ, а немного позже и эмулятор легендарного, полумифического Союз-Неон ПК-11/16. Насколько я понимаю, все эти платформы объединяются в эмуляторе под общим названием EmuStudio.
![](https://habrastorage.org/webt/kq/oq/fo/kqoqfo6ojqpcbzxbko1bfit-1j8.png)
Я сделал вторым, но выложил свой довольно сырой прототип эмулятора на радость публике сразу же, попутно снабдив его заметками, суммирующими результаты изучения схем и текстов оригинальной документации. Последние я также вручную перевёл с имеющихся фотографий в нормальный электронный вид. Вроде бы эта информация вскоре пригодилась Metallic’у, который разработал драйвер платформы для мультисистемного аркадного эмулятора MAME, таким образом сделав её наследие доступным уже всему миру.
Примерно тогда же я написал коротенькую статью про сам игровой автомат и «Конька-Горбунка» для входившей тогда в моду Википедии, на двух языках. С тех пор эти статьи были удалены или переделаны, но информация из их изначальных версий в различных вариациях всё ещё циркулирует по клонам Википедии и по всему интернету.
В 2007 году, не знаю точно кем и при каких обстоятельствах, но в только организовавшемся тогда Музее советских игровых автоматов, была сдамплена «Снежная Королева», а плата игры «S.O.S» с теми же целями почему-то была отправлена в Италию, Милан. Немного позже широко известный в узких кругах ромхакер CaH4e3, сделавший кучу всего полезного для эму-сцены, сделал в музее дамп «Бильярда».
![](https://habrastorage.org/webt/ui/xi/-x/uixi-xsiygenjyu7-qoj5itpqrw.jpeg)
В 2008 году мой соратник по видеоигровым и историко-журналистским делам, Алексей Беспалько, написал для журнала «Страна Игр» пару статей про игры для ТИА-МЦ — «Откуда прискакал Конёк»? (№ 22, ноябрь) и «Снежная королева» (№24, декабрь). Эти статьи, а также их рабочие материалы, содержащие полученную от Олега Дударя информацию, стали одним из ключевых источников доступной ныне информации о платформе.
Примерно к 2008 году также всплыли цветные «Городки», но по каким-то причинам они тогда не были сдамплены. Проходили слухи об обнаружении «Кота-Рыболова» и «Истребителя». Первые оказались слухами, а «Истребитель» (в единственном числе) был перепутан с совершенно другой игрой «Истребители», более ранней разработкой того же «Терминала» на другом железе.
![](https://habrastorage.org/webt/xs/2v/3y/xs2v3yg7bawq0j3c2rka4b6gos0.png)
Я тем временем облагородил свой прототип эмулятора, сделав для него более человеческий интерфейс и поддержав все вновь найденные игры. Но он так и не был опубликован, так как появилась нормальная поддержка в MAME, а потом ТИА-МЦ был поддержан ещё и в мультисистемном эмуляторе советских компьютеров b2m (крайне замечательная разработка, не имеющая собственного названия), и смысл выпуска своего эмулятора был утрачен. Так как больше никакие игры не находились, тема, в общем-то, заглохла.
![](https://habrastorage.org/webt/ag/pw/jg/agpwjgqgabel1tfpvpnkxy4rsgq.jpeg)
Летом 2016 года на форуме Old-Games.ru в вялотекущем ещё с 2008 года обсуждении появилась новая интересная информация, которую я очень удачно случайно заметил. Игровой автомат с игрой «Кот-Рыболов» был обнаружен где-то в окрестностях Тулы. Также было выложено фото с невиданной доселе версией платы.
Я порывался поехать на место событий и считать содержимое ПЗУ, но вскоре автомат был приобретён Музеем советских игровых автоматов и перевезён в Москву, и необходимость моего участия вроде как отпала — предполагалось, что уж у Музея-то наверняка есть кому считать ПЗУ (позже выяснилось, что нет).
![](https://habrastorage.org/webt/jt/ph/t9/jtpht9iz4bgy4vauydaej6y5usi.jpeg)
Однако так совпало, что в июне 2016 музей вышел на меня сам, с просьбой рассказать про создание эмулятора. В результате я вместе с Алексеем Беспалько посетил музей, пообщался с организаторами, и мы договорились о принятии мер для сохранения наследия в цифровом виде.
Вскоре, уже вместе с IgorR76, автором самого настоящего эмулятора Электроники «Ну, Погоди», который также присутствовал на вышеупомянутом форуме и заинтересовался темой, нам удалось попасть в запасники музея, прикоснуться к реликвиям, и считать содержимое ПЗУ «Кота-Рыболова», а также внезапно нашедшихся там «Городков» в варианте для ТИА-МЦ1.
Игорь по итогам нашего визита застрял в музее на долгие годы и сделал много интересных вещей, в частности, разработал схемную реплику оригинальных «Городков» на FPGA и восстановил совершенно уникальный игровой автомат «Лело».
![](https://habrastorage.org/webt/yn/d1/94/ynd194j0mcvs4xp0kjtrad98hse.jpeg)
Чуть позже в том же 2016 году я сделал для музея эмулятор ТИА-МЦ1 и другого отечественного игрового автомата, «Фотон», сначала для веб-странички на тогда ещё живом Adobe Flash, потом для телефонов и планшетов на Android.
Ещё чуть позже, снова в 2016 году, Алексей Беспалько смог выйти на ещё одного из непосредственных разработчиков ТИА-МЦ1, Александра Гоноровского, который после института попал по распределению на «Терминал» и проработал там с 1979 по 1988 годы, приняв участие в разработке аппаратной части телевизионных игровых автоматов Городки (блоки индикации и звуковых эффектов), Центр-1000 (блок развёртки и отображения динамических объектов), Истребители, и собственно ТИА-МЦ1 (вся цифровая часть). Мы записали с ним большое аудиоинтервью, но по некоторым причинам оно ушло в стол.
В 2021 году YouTube-канал «Геймдев от первого лица» сделал новое, уже видеоинтервью с Гоноровским, в котором он раскрыл тему ещё подробнее и появился в кадре лично. По следам этого интервью была опубликована и наша аудио-версия, вместе с частичной расшифровкой. Эти две записи и есть главный нынешний публично доступный и наиболее детальный источник про историю создания платформы.
В прошлом году я переписал код моего эмулятора ТИА-МЦ-1 и Фотона (игровой автомат на базе компьютера ПК8000) на C и адаптировал для ESP32, разместив таким образом эмулятор в корпусе советского джойстика. Про это была написана статья для Хабра.
Наконец, совсем недавно Виктор Карасёв, автор YouTube канала «Уютный подвальчик», полюбопытствовал у меня про некоторые детали рассказанной выше истории для своего нового видео, посвящённого советским игровым автоматам, что и стало триггером для написания этой статьи.
▍ Что внутри
Оригинальная версия аппаратуры ТИА-МЦ1 состоит из четырёх основных блоков — больших плат с великим множеством логических микросхем, вставляющихся в общую «корзину» и получающих киловатты электричества от мощного блока питания (про киловатты, конечно же, шутка). Называются блоки БЭИА: Блок Элементов Игрового Автомата.
![](https://habrastorage.org/webt/vb/_m/ir/vb_mir-5smjy2egpwdovl0mbdoo.jpeg)
БЭИА-100 — основной управляющий блок. Содержит 8-разрядный центральный процессор КР580ВМ80 (Intel 8080), работающий на частоте 1.575 МГц (по документации) или 1.78 МГц (по плате), звуковой генератор на двух таймерах КР580ВИ53, внешние интерфейсы на одной КР580ВВ55, ОЗУ палитры и видео ЦАП, формирующий аналоговые сигналы R,G,B.
БЭИА-101 — блок генерации синхросигналов и фонового изображения. Содержит множество счётчиков, 4 микросхемы ОЗУ объёмом 2 килобайта для программируемого знакогенератора и ещё одну такую же микросхему для хранения описания слоя фона.
БЭИА-102 — блок формирования подвижных изображений, то есть аппаратных спрайтов. Также в нём установлено ОЗУ атрибутов спрайтов (их положение и опции отображения) и ОЗУ растеризатора, содержащее три строки шириной в 256 пикселей: пока одна строка отображается, вторая обнуляется, а третья заполняется строками спрайтов с нужными смещениями.
БЭИА-103 — блок памяти. Содержит ПЗУ с кодом и графикой игры, а также основное ОЗУ. Замена игры производится заменой этого блока или ПЗУ в его панельках. В зависимости от игры в реальных автоматах могут быть заполнены не все панельки ПЗУ.
![](https://habrastorage.org/webt/gk/ju/uw/gkjuuwrqag_ppbybjcp88twbxg0.png)
Видеосистема построена по классической консольно-приставочной схеме. Изображение состоит из слоя фона, конструируемого из 16-ти цветных символов-тайлов размером 8 на 8 пикселей. По сути это текстовый экран размером 32 на 32 символа. Поверх него аппаратно накладываются также 16-ти цветные спрайты размером 16 на 16 пикселей.
На схеме, прилагающейся к игровому автомату с «Коньком», в качестве генератора звука присутствуют две микросхемы КР580ВИ53, включённые последовательно: выходы счёты первого таймера заведены на входы второго таймера. Выходы второго таймера объединяются через несколько логических элементов в общий монофонический выход.
![](https://habrastorage.org/webt/nx/xa/cy/nxxacyej6yjge3swa_zbcdjwjwc.jpeg)
Причина такого необычного технического решения не вполне понятна до сих пор. Потенциально оно даёт управление тембром или громкостью, но никакие известные игры не задействуют ничего, кроме одного канала таймера, который по сути работает как аналог PC Speaker. Последующие версии автомата планомерно упрощали этот узел.
Игровой автомат с «Городками» отличается по принципиальной схеме прежде всего в области звукового генератора: там указан только один таймер ВИ53, выходы которого соединяются вместе уже без лишних затей. Сама плата при этом по разводке не отличается от «Конька», просто одна микросхема не установлена и припаяны перемычки.
![](https://habrastorage.org/webt/x8/j7/51/x8j751bfcsrk8lplg40u6pwelis.jpeg)
Игровой контроллер с аналоговой ручкой вместо джойстика для «Городков» построен на переменном конденсаторе типа КПВ и блоке АЦП — платы, расположенной непосредственно рядом с ручкой. Блок подключается вместо обычных кнопок управления и передаёт цифровое значение примерно в диапазоне 96..208, соответствующее отклонению ручки.
Одноплатная версия ТИА-МЦ близка по архитектуре к оригинальной версии, но, конечно, совершенно иная конструктивно: всего одна основная плата, меньше микросхем (примерно на два десятка). На плату также интегрирован усилитель мощности звука. Игры располагаются на отдельной платке, которая не содержит ничего, кроме микросхем ПЗУ.
![](https://habrastorage.org/webt/tm/go/fx/tmgofxkj5ymakfvj0iszh9spptu.jpeg)
Главное архитектурное отличие одноплатной версии ТИА заключается в упразднении ОЗУ знакогенератора фона. Теперь символы хранятся в ПЗУ объёмом 32 килобайта (1024 символа). Спрайты работают точно так же, как прежде.
Звук окончательно деградировал: для него теперь используется всего один канал таймера ВИ53, а два оставшихся канала применяются для горизонтального и вертикального гашения при формировании видеосигнала.
![](https://habrastorage.org/webt/d3/hm/nx/d3hmnxqmjwdb5rzvl7tirrds8b8.jpeg)
Разумеется, в связи с произошедшими изменениями в одноплатной версии немного отличается карта адресного пространства и номера управляющих портов, что делает версии программно несовместимыми.
Достаточно интересно сравнить возможности ТИА-МЦ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 канала Только квадратная волна Без контроля громкости Возможность модуляции |
Но нужно быть осторожнее со своими желаниями: пока я писал эту статью, на просторах интернета появился проект, как раз адаптирующий архитектуру ТИА-МЦ к формату ретро-игровой консоли. Жаль, что он опоздал на почти четыре десятилетия, но тем не менее затея интересная.
▍ Для программиста
Главное, что нужно знать программисту для работы с платформами тех лет — это тип и рабочая частота основного процессора, карта его адресного пространства, и специфика работы с периферийными устройствами, в нашем случае это прежде всего видеосистемы. Про процессор мы уже знаем, про остальное излагаю кратко.
В основном адресном пространстве процессора представлены только ПЗУ, основное ОЗУ и видео-ОЗУ, расположенные очень понятным и эффективным образом:
![](https://habrastorage.org/webt/hf/cc/lt/hfcclt8wvus4exzhaoa0hdb68gk.png)
Хотя на плате игрового автомата предусмотрен контроллер прерываний, в системе он никак не используется. В реальных играх первой же командой идёт запрет прерываний, и далее они никогда не разрешаются.
Все устройства, в том числе видеосистема управляются через порты ввода-вывода. Их довольно много:
![](https://habrastorage.org/webt/qk/ae/j4/qkaej4e37-vktet9nvs-rkw4vf8.png)
На первый взгляд, такая реализация кажется красивой и удобной. Однако есть подвох: у процессора 8080 нет команд для косвенной адресации портов. А значит, чтобы обратиться к нужной ячейке палитры или нужному атрибуту спрайта, нужно каждый раз использовать абсолютное значение номера регистра, что сильно увеличивает объём кода. И даже самомодификацию кода применить не так-то просто, ведь штатно исполняемый код размещается в ПЗУ.
![](https://habrastorage.org/webt/-s/sx/99/-ssx99-svob58x8cxdwqhisbkec.png)
Видеосистема состоит из двух отдельных сущностей: слоя фона и спрайтов, а также общей для них программируемой палитры, задающей список из 16 цветов, выбранных из общей палитры в 256 цветов.
Цвет в палитре задаётся в формате G3R3B2, то есть по три бита на красную и зелёную составляющие, и два бита на синюю:
![](https://habrastorage.org/webt/ie/cm/rq/iecmrqp_umqa7hbrym-qyulzvma.png)
Изображение на слое фона определяется содержимым видео-ОЗУ, в которое по мере необходимости загружаются изображения 6-ти цветных символов, до 256 штук, а также карта символов. Спрайты хранятся в физически полностью отдельном от процессора ПЗУ, доступа к этим данным у процессора нет.
Организация видео-ОЗУ напоминает видеоадаптер EGA. Она позволяет писать данные одновременно в несколько ОЗУ, расположенные по одним и тем же адресам в памяти. Состоит это ОЗУ из пяти битовых плоскостей объёмом 2 килобайта каждая. Четыре битовых плоскости содержат графику знакогенератора, а пятая — карту тайлов, то есть массив с номерами символов, определяющую содержание слоя фона на экране.
![](https://habrastorage.org/webt/ri/ea/2f/riea2fhff9lpka0gdxw5rtxsjh8.png)
Битовая плоскость с описанием слоя фона имеет простой линейный формат, две переключаемые страницы размером 32 на 32 байта, идущие одна за другой. Байт в этой памяти — просто номер тайла для отображения на экране.
Графика символов в ОЗУ знакогенератора имеет следующий формат: каждый байт содержит горизонтальную линию из восьми соседних пикселей. В первом битплане в этом байте лежат младшие биты, во втором — следующие, и так далее. Изображение одного символа занимает последовательные 8 байт. Младший бит — крайняя правая точка, старший — крайняя левая.
Видеосистема предусматривает прокрутку слоя фона, но в реальных играх эта возможность не задействована. Увидеть работу прокрутки можно только в тестовой программе, и её реализация до конца не ясна. Судя по работе теста на реальном автомате, слой фона не зацикливается на себя, как принято на игровых консолях, но это не точно.
![](https://habrastorage.org/webt/nv/vd/zq/nvvdzq8atpnslogrlvwkcvyxwow.png)
Графика спрайтов в их персональном ПЗУ также хранится в формате битпланов. Каждое из четырёх 8-килобайтных ПЗУ содержит один битплан. Аналогично тайлам, в одном байте хранятся биты восьми пикселей, соседствующих по горизонтали. Хотя спрайты имеют размер 16 на 16 пикселей, фактически они хранятся половинками в формате 8x16, по 16 байт каждого спрайта подряд. В младшей половине каждого ПЗУ хранятся левые половинки, в старшей половине — правые.
Другими словами, 13-битный адрес спрайта в ПЗУ имеет следующий формат:
HNNNN NNNNLLLL
Где L номер строки спрайта, N порядковый номер изображения спрайта, H номер половинки спрайта.
Код цвета 15 (все биты установлены) у спрайтов считается прозрачным, через него видны нижележащие спрайты и слой фона. Приоритет спрайтов считается просто по номеру слота: чем старше номер слота, тем выше спрайт. Есть возможность отзеркаливания спрайтов по горизонтали и вертикали.
Нужно отметить, что есть ряд расхождений между документацией и фактической реализацией: менялись некоторые адреса портов и назначения бит. Также тестовая программа обращается к портам #D8, #D9, #DB, которые не упоминаются в документации. Их назначение неизвестно, но сигнатура намекает на ещё один порт ввода-вывода ВВ55.
В одноплатной версии для «Кота-Рыболова», не имеющей ОЗУ знакогенератора, отличается карта адресного пространства процессора:
![](https://habrastorage.org/webt/hf/w9/jp/hfw9jps_8olnkjixlmzybwakrpq.png)
Наборы символов в ПЗУ переключаются группами по 256 штук. Спрайты работают точно так же. Для звука используется всего один канал таймера ВИ53. Номера портов также немного иные:
![](https://habrastorage.org/webt/qn/ro/_n/qnro_n22qailpimm6kejwnw0hry.png)
▍ 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.
![](https://habrastorage.org/webt/jx/-o/ei/jx-oeiqpfdut5mlf8cjs6gtw0pg.png)
Для музыки я традиционно задействовал свой VST-плагин PCSPE, о котором уже много раз рассказывал, поэтому повторяться не буду. Полученные данные были экспортированы в файл music.bin. Я поленился дорабатывать плагин для работы с нестандартной тактовой частотой таймера (1.575 МГц вместо 1.18 МГц), и просто понизил высоту получаемого звука вдвое. Также я решил поэкспериментировать и сделал небольшую расстройку каналов звука для более интересной его окраски вместо обычного «квадратного» звучания.
Код самой демки написан на ассемблере в мнемониках 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.
К сожалению, надежд обнаружить следы прочих игр, помимо уже найденных, с каждым годом становится всё меньше, и возможно, что эта самая яркая часть истории позднего советского и раннего украинского геймдева утрачена навсегда.
Telegram-канал со скидками, розыгрышами призов и новостями IT ?
![](https://habrastorage.org/webt/tp/sk/z-/tpskz-7w7a8e74isoowuep40xeg.png)
Комментарии (17)
SGordon123
20.08.2024 13:37а можно где то прочитать патент на изобретение?
shiru8bit Автор
20.08.2024 13:37В тексте статьи есть ссылка на базу, там можно прочитать документ полностью.
SGordon123
20.08.2024 13:37а да , нашел, но ничего не понял, за счет чего растет эффективность, в общих чертах?
shiru8bit Автор
20.08.2024 13:37+4За счёт оформления авторского свидетельства инженеры получили премию и таким образом немного увеличили эффективность оплаты своего труда. Это вполне серьёзный ответ.
AnyKey80lvl
20.08.2024 13:37+1Т.е. в 1971-м увидели готовые аппараты и, т. к. "нужно было показать, что и в СССР есть вещи не хуже", в начале 1980-х объявили тендер на разработку...
shiru8bit Автор
20.08.2024 13:37+2Увидели другие готовые аппараты, электромеханические, и в начале 1970-х сделали их аналоги. Телевизионные (видео) игры - это другая тема. В 1971-ом до их появления в принципе оставался ещё год. Первая аркада с цветной графикой появилась в 1978-ом.
Alti27
20.08.2024 13:37+1На счёт того, что программа (не обязательно игра) по разному работает на эмуляторе и реальном железе...
В своё время, в начале 90х разрабатывалась некая программно-электронная система (Система управления воздушным движением). В её основе был процессор 80186. Разрабатывалась она в двух видах: сначала на обычной рассыпухе, как это было принято ещё в СССР. А потом было принято решение перенести её на ПЛИС ALTERA.
Так, вот, при попытке перенести всё это на ПЛИС, разработчики неожиданно столкнулись с тем, что собранная на ПЛИС система не заработала! После долгих поисков с помощь анализатора сигналов причина неработоспособности была найдена. И заключалась она в некой рассинхронизации управляющих сигналов. Виной этому была различная скорость работы «виртуальных» компонентов в ПЛИС и физических микросхем. В итоге пришлось переписывать управляющую программу.
Подозреваю, что и с эмуляторами возможны похожие проблемы.
remingthon
20.08.2024 13:37+1В эти игры и автоматы играл в детском лагере. Это изменило мою жизнь. Я влюбился в игры. Потом занялся программированием. А следом и сам стал разработчиком игр. Эх были времена. Как вспомню, прям тепло на душе.
Alyoshka1976
20.08.2024 13:37+1"ИстребителИ" - это гоняющиеся друг за другом два самолета (управляемые двумя игроками) с ЭЛТ зеленого (если память не изменяет) свечения?
shiru8bit Автор
20.08.2024 13:37+1Да, они. Не совсем зелёного, там в зависимости от износа экраны то голубоватые, то зеленоватые. Та же самая история с Мотогонками и оригинальными Городками.
Скрытый текст
Alyoshka1976
20.08.2024 13:37+1Спасибо, играл в них в клубе в/ч 25522 давным-давно и далеко-далеко на востоке :-)
shiru8bit Автор
20.08.2024 13:37+1Мы с IgorR76 считали и ПЗУ Истребителей тоже, сделали эмулятор, и сейчас есть их поддержка в MAME. А вот Мотогонки, кажется, так пока и не осилили, там гибридная конструкция — часть микропроцессорная и часть графики формируется жёсткой логикой.
Скрытый текст
checkpoint
20.08.2024 13:37+3"Аж олдскулы свело" (с)
Сам в детстве приложил не мало усилий для повышения окупаимости аппарата "Конёк-Горбунок" - просадил жмэню 15-ти копеечных монет, но дальше третьего экрана пройти не смог. После чего родители перестали давать мне деньги на игровые автоматы, но я всё равно ходил в парк смотреть как другие играют. :)
mig_25
20.08.2024 13:37+2В Виннице на "Терминале", кстати, делали цветной терминал, СМ 7238:
У него RGB выход был.
http://www.leningrad.su/museum/show_calc.php?n=295&lang=1&test=0
А ещё рядом буквально, на ЦКБИТ Инфраконе делали цветной терминал Электроника МС 7105.
Оба терминала VT240, просто разных министерств.
Javian
Как-то летом гулял по Евпатории и набрел на местный Детский парк, где обнаружился зал с действующими советскими игровыми автоматами. Было удивление граничащее с шоком.
PS по-моему это здание - https://yandex.ru/maps/-/CDgl6V5J