Клонируем 8-битную консоль из 80-х

в 13:00, , рубрики: 6502, 8-bit, creativision, ruvds_перевод, TMS9918A, консоли, старые консоли
Раньше я уже занимался клонированием систем на основе TI TMS99xx. В моей коллекции есть ColecoVision и Sega SG-1000. Но все они были на Z80, а я хочу немного разнообразить свой опыт. К счастью, в 1981 году VTech выпустила небольшую систему на основе 6502 под названием CreatiVision и опубликовала её схемы.

Как всегда, мы делаем что-то не потому, что это просто, а потому, что мы думаем, что это будет просто.

▍ Что такое CreatiVision?

Клонируем 8-битную консоль из 80-х - 1


Самое простое объяснение: CreatiVision — это видеоигровая консоль. Она была разработана компанией VTech и выпущена по всему миру под кучей разных названий:

  • Dick Smith Wizzard;
  • FunVision;
  • Hanimex Rameses;
  • VTech VZ2000;
  • Educat 2002;
  • Telefunken CreatiVision

Всё это PAL-системы, но в Японии была и NTSC-версия, предположительно под названием VTech CreatiVision. Dick Smith — это уже не работающая австралийская/новозеландская сеть магазинов электроники.

Семейное древо консоли очень ветвисто. Salora в Финляндии производила компьютер Manager, сама VTech превратила её в Laser 2001 и, похоже, ещё была версия, выпускавшаяся Sanyo.

Salora, Dick Smith и VTech уже имели ранее опыт выпуска систем под другой маркой, это был VTech Laser 200. Сам по себе это довольно интересный компьютер, и я надеюсь рано или поздно раздобыть его, но он никак не связан с CreatiVision.

Я не буду вдаваться в удивительную историю CreatiVision, чтобы сразу приступить к клонированию. Если я что-то упустил или где-то ошибся, то дайте мне знать.

▍ Схема управления

Пульты управления использовались ещё и как геймпады. Как и у ColecoVision, их нужно было держать в портретной ориентации, с джойстиком и двумя кнопками стрельбы. Кроме того, на пультах есть мембранные клавиатуры.

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

Клонируем 8-битную консоль из 80-х - 2

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

Клонируем 8-битную консоль из 80-х - 3

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

▍ Что интересного в этом оборудовании?

Для меня это новая машина, которая почти не продавалась в Северной Америке. Лично я точно никогда раньше не видел CreatiVision. А благодаря клавиатуре эта консоль напоминает компьютер, то есть она способна выполнять программы общего назначения на BASIC. Именно поэтому ранее я решил создать клон SG-1000, такой аргументации для меня вполне достаточно.

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

Однако все предыдущие системы были на Z80, а CreatiVision позволила мне поэкспериментировать с MOS. Мой единственный опыт работы 6502 заключался в написании на ассемблере нескольких программ для Apple II, и мне определённо раньше никогда не доводилось создавать схему для декодирования его странного машинного цикла Φ2.

▍ Во что хорошее можно на ней поиграть?

Отличный вопрос! Я понятия не имел, поэтому отправился на YouTube. По какой-то причине там нашлось не так уж много записей с играми системы. Плейлист с играми есть у Highretrogamelord. Многие из них кажутся клонами популярных игр с аркадных автоматов, что меня вполне устраивает. Во многих играх, например, в Auto Chase, присутствует плавный скроллинг, который сложно реализовать на TMS9918, что говорит о работе компетентных программистов.

По видео было сложнее понять, есть ли среди игр хорошие, поэтому я решил попробовать запустить в MAME напоминающую Pac-Man Crazy Chicky.

Клонируем 8-битную консоль из 80-х - 4

Неплохо. Что ж, давайте приступим.

▍ Зачем клонировать?

Изначально у меня не было консоли, и я сомневался, что смогу достать её. Насколько я понимаю, в Канаде она никогда не выпускалась, а цены на eBay, как и можно ожидать, просто безумные.

Клонируем 8-битную консоль из 80-х - 5

Разумеется, я мог бы ещё поохотиться, чтобы постараться найти рабочее устройство, но это оборудование было не лучшего качества. Creativision — это бюджетная машина, собиравшаяся на дешёвой фабрике, поэтому на её материнской плате было много изъянов: плохие переходные отверстия, низкокачественные разъёмы, тонкий материал платы, рвущий дорожки, слабый блок питания, винты корпуса, которые замыкали линии данных при слишком сильной затяжке. У владельца консоли Cheshire Noir было множество таких проблем, и в том числе поэтому он попросил меня взглянуть на неё.

Проблемы у него возникали и с самими контроллерами: вместе они превращались в раздельную клавиатуру, а по сути были огромной мембраной. Эта мембрана от десятков лет использования истиралась, поэтому родился клон печатной платы контроллера.

В качестве бонуса скажу, что я не первый человек, достаточно глупый, чтобы попробовать сделать это. Кто-то уже клонировал Funvision на макетной плате, воспользовавшись теми же схемами и CMOS 65c02. Похоже, у него получилось очень хорошо, значит, и у меня получится, так ведь?

▍ Декодирование 6502

Я предполагал, что 6502 похож на Z80. Для декодирования деталей на плате Z80 нужно подключить их к контактам RD, WR, MEMREQ и так далее, а затем к адресным шинам. Когда настаёт время доступа к внешним устройствам, Z80 активирует эти шины.

В случае 6502 мне было не особо очевидно, как это должно работать. Хотя у него был контакт чтения/записи, ничто не давало понять мне, что выполняется доступ к внешним устройствам. У 6502 была куча странных контактов с названиями типа Φ0, Φ1 и Φ2. Что с ними происходит?

Чтобы разобраться, я провёл исследование. К счастью, найти ответ оказалось довольно просто, потому что 6502 был и остаётся очень популярным CPU. Эти контакты «фи» (Φ) обозначают машинный цикл CPU. Φ1 и Φ2 — это выводы, производные от входного тактового импульса на Φ0: Φ2, по сути, является тем же (усиленным) сигналом, что и входной тактовый импульс, а Φ1 — это инвертированный вид входного тактового импульса.

При чтении Φ1 имеет высокий сигнал, когда 6502 контролирует шину данных, а внешние устройства могут считывать адрес, контакт контроля чтения/записи и шину данных, управляемые CPU. Φ2 имеет высокий сигнал, когда внешнему устройству позволено контролировать шину данных. Они никогда не имеют высокий сигнал одновременно, а это значит, что Φ1 можно использовать для выбора периферийных устройств с активным низким сигналом наподобие VDP, потому что этот контакт является логически обратным Φ2.

Я уверен, что ситуация становится чуть сложнее, если углубляться в подробности таймингов или реализовывать какую-нибудь систему DMA для случаев, когда 6502 «занят», но консоль CreatiVision, похоже, не стремилась ни к чему особо амбициозному, так что с этим разбираться мне пока не пришлось.

CreatiVision делает декодирование чуть более странным, чем большинство систем на основе картриджей, поскольку даже доступ к BIOS ROM на плате управляется картриджем. Все три сигнала выбора банков (ROM0, ROM1 и ROM2) передаются картриджу, и от картриджа ожидается, что он задействует контакт выбора BIOS на плате ROM_RD, обычно закорачивая его на ROM0.

Клонируем 8-битную консоль из 80-х - 6

Не уверен, действительно ли какое-то ПО пользуется этим для перераспределения или отключения декодирования BIOS во время исполнения, чтобы предоставить больше пространства памяти для игровых ROM, но такая возможность есть.

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

▍ Изготавливаем клон

Создать структуру платы-клона по схемам было довольно просто. У меня возникла одна довольно неоднозначная вещь, которую я ошибочно реализовал при преобразовании в KiCad, но мы поговорим об этом чуть позже.

Клонируем 8-битную консоль из 80-х - 7

Я спросил у Cheshire, можно ли проверить клон на чём-нибудь, и он отправил мне картридж Sonic Invaders.

Клонируем 8-битную консоль из 80-х - 8

Этот картридж очень похож на картриджи Intellivision, вплоть до странной створки внизу.

Разобравшись со всеми вопросами, я отправил заказ на изготовление платы клона Creativision, которая оказалась самой широкой из моих работ, почти 220 мм. Я думал, что смог бы оптимальнее использовать имевшееся пространство, но и так уже мучился кошмарами, пытаясь провести шины картриджа через все диоды и резисторы разъёмов клавиатуры/контроллеров. Она такая длинная и тонкая в основном благодаря простоте разводки. К счастью, мне удалось легко установить с ней в корпус и клавиатуру.

Клонируем 8-битную консоль из 80-х - 9

После прибытия плат мне ещё долго пришлось ждать PIA 6821 с AliExpress. Когда он наконец пришёл, я наконец осознал, что Western Design Center по-прежнему изготавливает новые 6821 (и CMOS, и NMOS!). К тому же у меня постоянно заканчивались стандартные расходники, например, 40-контактные разъёмы и нагрузочные конденсаторы на 33 пФ.

Клонируем 8-битную консоль из 80-х - 10

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

Небольшие проблемы у меня возникли с BIOS ROM. Изначально я сделал схему, использующую EPROM 27c256. Однако после экспериментов с аркадными автоматами они начали у меня заканчиваться, поэтому мне пришлось потратить часть дня на стирание некоторых EPROM, чтобы запрограммировать BIOS ROM и попробовать проверить систему. Можно было бы использовать 27c64, которых у меня целые кучи, но для этого бы пришлось отрезать контакт P 27C64 от заземления, которого он касался. Во второй версии клона я заменил эту систему перемычкой, чтобы этот контакт по умолчанию имел высокий сигнал, что не повлияет на 27C256 в этой позиции, потому что BIOS ROM Creativision на 2K всё равно дублируется в пространстве памяти.

▍ Первый запуск

Ничего не заработало! И ничего не завелось даже частично, что было бы хотя бы интересно. Светодиод один раз тускло мигнул, а после этого пропало питание на тестовых разъёмах, осталось всего 0,15 В. Я вытащил детали с AliExpress из их разъёмов, чтобы убедиться в отсутствии короткого замыкания, но безуспешно. Последовательный вольтметр на разъёме USB сообщал о нуле ампер номинального тока при нагрузке, поэтому, похоже было, что блок питания платы… не подаёт питание.

Клонируем 8-битную консоль из 80-х - 11

Мне стоило заметить это раньше, но лишь показав скриншот в Discord, я осознал, в чём была проблема. Последовательный конденсатор блокировал постоянный, а не переменный ток, а мне нужно было совсем противоположное. Мне подсказали это ZephyrZ80 и YesterGearPC. Спасибо!

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

Подозревая наличие проблемы с декодированием, я добавил тестовые подключения и воспользовался своим надёжным логическим щупом. Оказалось, что при сбросе BIOS ROM выбиралась на короткое время, а потом больше никогда.

Насколько я мог понять, тактовый сигнал работал, и до определённого момента присутствовала активность на адресной шине и на шине данных. Спустя несколько секунд исполнения D0 и D1 навсегда переходили на низкий сигнал. То же самое происходило с контактом чтения/записи. Я решил, что это странно. Они должны менять состояние чаще всего.

TMS9918A в своём уголке был доволен жизнью, занимаясь своим ОЗУ, несмотря на то, что в нём не выполнялись ни чтение, ни запись.

Просто чтобы убедиться, что проблема не в CPU, я вставил ещё один UM6502A с AliExpress, но его работа оказалась такой же. Я проверил расположение контактов, чтобы убедиться в отсутствии небольших различий в расположении контактов шины данных между UMC и MOS, но их не было.

Поворчав и поизучав схему в KiCad, я понял, что неправильно прочитал схему оригинала.

Клонируем 8-битную консоль из 80-х - 12

Эта линия не выходила из A14 к контакту MODE TMS99181; она выходила из адресной шины и на самом деле подсоединялась к A0. Не знаю точно, что это означало для корректности программы, но предположу, что A14 всегда имеет низкий сигнал при записи или чтении в VDP, и поэтому этот контакт никогда не становится высоким во время исполнения. А это может вызывать проблемы, особенно если вы хотите, например, сообщить TMS9918, в какой адрес нужно выполнять запись.

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

Клонируем 8-битную консоль из 80-х - 13

Система оказалась неидеальной, но мне удалось запустить её на моей тестовой PVM. Игра заработала!

Изображение было читаемым, но, к сожалению, имело сильное размытие. Возможно, это вызвано тем, что у меня закончились ферритовые кольца, и я не использовал их для видео и звука, а может быть, проблемы заключались в этом конкретном TMS9918, или же умирающая PVM решила умереть совершенно новым образом. Тем не менее, это была победа. Теперь у нас есть клон Creativision, работающий достаточно хорошо для того, чтобы запустить Sonic Invaders.

Клонируем 8-битную консоль из 80-х - 14

Ферритовые кольца наконец-то добрались до меня, поэтому я решил их попробовать. Не совсем было понятно, какие конкретно характеристики видео я пытаюсь исправить этим ферритом, но, по крайней мере, я надеялся избавиться от размытия, которое каким-то образом добавил между версиями клона Soggy и Derivavision v1.

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

Разумеется, поскольку я не подключил контроллер, в видео показан автоматизированный демо-режим. Этот игрок не очень хорошо справляется с Sonic Invaders.

▍ Заключение

Я очень рад, что этот клон удалось запустить, однако без контроллеров это пока не очень интересно. В процессе работы над проектом я много узнал о 6502, о композитном видео, и ещё немного о жизни.

Скачать файлы KiCad для DerivaVision можно с GitHub. Когда будет готов интерфейс контроллеров, я выпущу формальный «релиз» с файлами Gerber.

▍ Дальнейшие шаги

Можно было бы подумать, что установка разъёма контроллера не будет сложной задачей, однако у машины VTech есть свои хитрости. Эти клавиатурные устройства изготовлены из сложной пассивной матрицы, похожей на матрицу ColecoVision. Общение с ними, чтобы можно было играть в Sonic Invaders, потребует кучи монотонной работы и немного гениальности. Некоторые кнопки джойстика реализованы одновременным закорачиванием более чем двух контактов!

В следующей части этой статьи я создам интерфейс клавиатуры/контроллеров клона, который будет подключаться к разъёмам на уже имеющейся плате v1. Он будет довольно рудиментарным, достаточным для игры в Sonic Invaders и ещё нескольких игр на картриджах, не использующих клавиатуру.

После этого у меня будет план получше: я хочу заметить 6821 на Raspberry Pi Pico2 и использовать этот Pico для работы с клавиатурой PS/2 и контроллерами SNES. Хотя для реверс-инжиниринга 6821 потребуется много труда, особенно если игры/BIOS быстро обращаются к портам, но в результате мы получим интегрированную одноплатную консоль Derivavision, запускающую игры без необходимости дополнительных плат или дорогих специальных клавиатур.

  1. Контакт MODE используется во время передачи CPU-VDP, чтобы показать, какая часть команды выполняется. Например, контакт MODE имеет высокий сигнал во время записи в VDP, чтобы сообщить ему, что мы отправляем ему адреса, а затем низкий, чтобы отправлять данные. Концепция этого контакта сбивала меня с толку, потому что в процессе разработки ПО она была скрыта. На SG-1000 я выполнял запись, например, в $80 для данных и в $81 для адресов, и здесь задействовался A0.
  2. Я практически уверен, что в этом случае достаточно неплохо справилось что-то меньшее, например, PIC, но вся плата разработки Pico примерно равна ему по цене, плюс имеет преимущество в виде ускорения PIO; к тому же у меня уже есть несколько Pico в наличии.

Автор:
ru_vds

Источник

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


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