Повседневная жизнь ретрогеймера: носитель данных для Рэмбо

Повседневная жизнь ретрогеймера: носитель данных для Рэмбо
Сегодня у нас будни не вполне обычного ретрогеймера, а продвинутого, оснащённого паяльной станцией и непреодолимым рвением к пайке микросхем в корпусе LQFP100.

Насущный вопрос, который будет решать этот прокачанный персонаж, волнует многих владельцев древнейшей игровой консоли Atari 2600 и её клонов типа «Рэмбо»: где взять Flash-картридж, чтобы запускать любые игры. Вещь эта достаточно редкая и дорогая, и в данном случае оказалось проще сделать её самостоятельно, чем покупать готовую.

Впрочем, помимо описанного в статье сложного пути с самостоятельным изготовлением устройства, я упомяну и известные мне более простые, сразу готовые решения. Углубляемся!

▍ Всем по флешке!

На случай если кто-то не понимает, о чём пойдёт речь, небольшой экскурс в довольно занимательную историю вопроса.

Старые игровые приставки, выходившие на рынок с начала времён и до середины 1990-х годов, использовали для хранения игровых программ такой носитель информации, как картридж — дедушку современных карт памяти. Прогресс исторического железа не коснулся, и по сей день действует принцип: если хочешь поиграть в игру на старой приставке — нужно где-то взять соответствующий, теперь уже дорогой и коллекционный, картридж с игрой. Никаких других опций производителем не предусмотрено.

Картриджи для разных игровых систем: Fairchild Channel F, Atari 2600, NES, Super Nintendo, Nintendo 64, Sega Genesis. Фото Museum of Obsolete Media

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

Однако этот носитель одноразовый: его технически невозможно перезаписать. Для удешевления производства в нём применяются микросхемы так называемого «масочного» ПЗУ, программируемого раз и навсегда сразу же в момент изготовления. Иначе говоря, в природе не существует «чистых», «незаписанных» картриджей, о которых ходила молва в детстве — отдельная операция для записи игр в процессе производства отсутствует, картриджи выходят со сборочного конвейера сразу с игрой внутри.

Картриджи могут быть очень сложными. Реплика игры Super Mario Bros для 8-битной NES на дискретной логике

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

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

Во-первых, в них нуждались разработчики игр, которым было нужно тестировать свои разработки на реальных консолях. Производство масочных ПЗУ стоит дёшево только в многотысячных тиражах и требует много времени для подготовки. Для штучного производства эта технология совершенно не подходит.

УФПЗУ активно применялись на прототипах игр для Sega в начале 1990-х годов. Фото из r/SEGA

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

Чуть позже появились картриджи на основе электрически стираемых ПЗУ (ЭСПЗУ), раннем предшественнике современной Flash-памяти. Это позволило немного упростить процесс загрузки игры, устранив вынимание микросхем и стиранием под УФ-лампой. Например, запись могла выполняться с использованием специального устройства-программатора, в который вставлялся специальный же картридж для загрузки в него программы.

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

Yoko Game Copier для картриджей Atari 2600

Первые коммерческие решения для копирования игровых картриджей появились уже в начале 1980-х годов. Они известны под названиями «game copier» (копировщик игр) или, несколько позже, чтобы избежать обвинений в пиратстве, «backup unit» (создаватель резервных копий). Состояли они из двух элементов: устройство для копирования с двумя разъёмами и специальный перезаписываемый картридж на основе ЭСПЗУ. В устройство вставлялись два картриджа — копируемый и перезаписываемый, нажималась кнопка, и происходило копирование игры из одного в другой.

Professor SF для Super Nintendo

Более поздние решения, предназначенные для 16-битных приставок, имели трёхдюймовый дисковод. Они могли быть выполнены в формате гигантского картриджа, в который можно было вставить оригинальный картридж, а также дискету. Устройство считывало содержимое картриджа в своё ОЗУ, и позволяло запускать игру уже из него, а также сохранять его содержимое на дискету. Наличие дискет открыло пользователям новую опцию, обмена «дампами» (электронными копиями) игр — здесь берут начало пресловутые коллекции ROM’ов из сети, которые начали создаваться ещё до появления эмуляторов.

Именно о подобных приборах доходили слухи до отечественных любителей видеоигр в начале 1990-х годов, которые делились друг с другом многократно пересказанными и искажёнными подробностями о таких технических диковинах и принципах их работы, дополняя их убедительными фактами формата «мне дядя брата привозил, но потом он уехал жить на Луну».

Doctor V64 для Nintendo 64

Более поздние решения для Nintendo 64 содержали уже целый CD-дисковод и были ориентированы не на копирование физических картриджей, а на загрузку образов игр с заранее записанных CD-дисков.

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

PowerPak, первый популярный Flash-картридж для Nintendo Entertainment System

Наконец, в конце 1990-х и начале 2000-х годов начали появляться устройства в привычном нам сегодня формате Flash-картриджа — единственное устройство-картридж вполне обычного размера, созданное на основе Flash-памяти, программа в которое загружается через кабель или карту памяти с домашнего ПК, который к тому времени таки пробрался в каждый дом.

Примерно в это же время сформировалась и третья группа пользователей перезаписываемых картриджей, на этот раз совершенно законная: разработчики-любители, желающие запускать свои разработки, так называемое «homebrew» (допустим, что оно — оно, потому что оно ПО), на настоящих консолях. Особенно актуально это явление именно для Atari 2600: homebrew-сцена для этой платформы существует около тридцати лет, она по сей день весьма активна, а накопленный за десятилетия опыт позволяет энтузиастам выжимать из платформы все соки и творить невиданные доселе чудеса.

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

Комплект XG-Flash 128M для Game Boy Advance из начала 2000-х годов. Использует устройство-программатор

Но прогресс шагал вперёд, цены на компоненты снижались, и постепенно появились более доступные решения. Создавались и производились подобные устройства в основном энтузиастами, а также, в эпоху актуальности платформы Game Boy Advance, разнообразными китайскими компаниями — времена, когда на проблему существования Flash-картриджей начали обращать внимание юристы Nintendo, что, вероятно, только подстегнуло развитие таких устройств.

Некоторые оригинальные версии Everdrive образца 2020 года. Фото с официального сайта

Наиболее преуспел в создании Flash-картриджей Krikkz, разработчик из Украины. С начала 2010-х, за годы упорной работы, он разработал целую линейку всё более продвинутых Flash-картриджей под общим названием Everdrive практически для всех популярных ретро-консолей: Famicom и NES, Sega Genesis и Master System, Super Nintendo и Nintendo 64, Game Boy и Advance, TurboGrafx-16. Это действительно крутые и удобные устройства, закрывшие любые потребности.

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

▍ Flash для Atari 2600

Одну простыню текста спустя мы, наконец, приблизились к завязке сегодняшней истории.

Куча-мала Рэмбо и их собратьев из предыдущей статьи

Недавно я подарил друзьям три Рэмбо-подобных консоли, и, конечно, сам владею такой — о доработках этих консолей я рассказывал в предыдущих буднях ретрогеймера. Набор встроенных игр в этих клонах очень ограничен, а оригинальные картриджи для Atari 2600 в наших краях достать крайне сложно, тем более PAL-версии (это PAL-клоны). К тому же есть тысяча и одна homebrew-игра, на которые интересно было бы посмотреть «вживую», а не на эмуляторе. Поэтому всем нам очень нужен Flash-картридж, позволяющий запускать любые образы игр с обычной SD-карты.

Однако, если для большинства платформ можно просто пойти и купить соответствующий Everdrive или его клон, с Atari 2600 такой номер не пройдёт: Everdrive для неё нет. Эта платформа уже слишком древняя и не настолько популярна среди нынешних ретрогеймеров, поэтому даже китайские производители успешно её игнорируют.

Конечно, энтузиасты Atari 2600 придумали некоторое количество Flash-картриджей и для своей любимой платформы. Главным образом это версии одного и того же устройства под названием Harmony, включая максимально упрощённую Melody, а также Concerto для Atari 7800, обладающую обратной совместимостью с играми для 2600.

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

Однако поиск довольно быстро показал, что меня опередили, и недавно, каких-то лет восемь назад, уже сделали практически точно такую же конструкцию, которую я задумал. Это обещало сильно упростить задачу: достаточно взять и повторить готовый проект. Было решено пойти именно по этому пути. К станку!

▍ UnoCart-2600

Проект, о котором идёт речь, называется UnoCart-2600. Технически это довольно занимательная вещь, и о его устройстве стоит рассказать подробнее.

Меню UnoCart-2600 на экране телевизора. Фото его автора

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

UnoCart-2600 содержит всего одну высокотехнологичную деталь — микроконтроллер STM32F407, с минимально необходимой для его работы обвязкой. Больше в нём ничего нет. Подобный минималистичный вариант стал возможен благодаря появлению достаточно быстродействующих микроконтроллеров, впервые он был осуществлён в 2014 году для эмуляции картриджа Game Boy.

Дело в том, что игры для Atari 2600 имеют очень небольшой объём, в среднем до 4 килобайт, а наиболее продвинутые 16-64 килобайт, а тактовая частота процессора консоли составляет всего 1.78 мегагерц. STM32F407 работает почти в сто раз быстрее, чем консоль 1978 года, а также обладает 192 килобайтами встроенного ОЗУ. Этих вычислительных ресурсов хватает, чтобы в реальном времени чисто программно перехватывать сигналы системной шины и эмулировать работу ПЗУ и любого дополнительного железа, выставляя на шину нужные данные из внутреннего ОЗУ, куда загружается образ игры.

Схема UnoCart-2600, моя версия в KiCad

Аппаратная часть представляет собой просто соединение ША и ШД консоли с GPIO портами микроконтроллера, которые к тому же обладают пятивольтовой совместимостью и не требуют преобразования уровней. Остальные элементы — стабилизатор на 3.3 вольта для питания контроллера и SD-карты. Используется встроенный тактовый генератор STM32 без внешнего кварца — стабильность тактовой частоты не требуется.

Довольно интересным моментом является цикл эмуляции ПЗУ. Он не использует никаких прерываний и анализа управляющих сигналов. Дело в том, что на слоте картриджа Atari 2600 нет сигнала записи-чтения, и вообще каких-либо других сигналов, кроме шины адреса и данных. Нужно лишь ловить изменения ША и достаточно быстро выставлять на ШД содержание ячейки памяти для текущего состояния ША.

    __disable_irq();    // прерывания всегда запрещены
    uint16_t addr, addr_prev = 0;
    while (1)
    {
   	 while ((addr = ADDR_IN) != addr_prev)
   		 addr_prev = addr;
   	 // ожидание стабилизации состояния шины адреса
   	 if (addr & 0x1000)
   	 { // A12 high
   		 DATA_OUT = ((uint16_t)cart_rom[addr&0x7FF])<<8; 
   		 SET_DATA_MODE_OUT //выставляется байт на шину данных

   		 while (ADDR_IN == addr) ;	//ожидание начала изменения состояния шины адреса
   		 SET_DATA_MODE_IN
   	 }
    }

Для картриджей разных типов, содержащих мапперы (схемы управления расширенной памятью), предусмотрены разные циклы выдачи байт, учитывающие специфику каждой известной конфигурации, благо их не так много, около десятка. Нужная конфигурация определяется при загрузке образа игры довольно хитрым образом, по размеру файла и сигнатурам обращений к мапперу, после чего запускается соответствующий цикл. Загрузкой с SD-карты, конечно, занимается сам STM32.

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

В принципе, собирать картридж самостоятельно было не обязательно: на Али сейчас доступен уже собранный, готовый вариант примерно за 5000 рублей с доставкой. Но это довольно дорого, а главное, далеко не так интересно, как делать свой. К тому же, он продаётся без корпуса.

▍ Корпус

Сделать свой Flash-картридж хотелось красиво, а для этого, конечно, нужен корпус.

За рубежом корпуса для подобных конструкций просто берут от какой-нибудь ненужной игры. Но в наших краях избытка каких-нибудь ненужных игр для Atari 2600 нет, и в принципе совершенно любые игры редки и стоят приличных денег.

STL-файл корпуса UnoCart-2600. Восемь часов печати

Вручную моделировать свой корпус для последующей 3D печати было бы сложно и непрактично, за отсутствием у меня образца, который можно было бы измерить. Поэтому я поискал готовый проект в виде STL-файлов, и нашёл его — специально предназначенный для UnoCart-2600, с вырезом под большую SD-карту и перемычку режима работы меню.

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

Напечатанные детали корпуса

Хотя в моём арсенале есть личный 3D-принтер, он не оснащён термокамерой, и печать таких больших (10 на 8 на 2 сантиметра) предметов, состоящих из ровных плоскостей, у меня получается так себе. Поэтому мы обратились к Максиму, который напечатал три экземпляра с гораздо лучшим качеством, а также сразу оснастил их вплавляемыми гайками для последующей сборки на винтах.

Гравировка в LaserGRBL

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

Лазер жжёт

Тогда я решил задействовать технологии 21-ого века: лазерную гравировку. Благо простенький лазерный гравёр на базе CNC 3018 и пятиваттного диодного лазера пылится без дела у меня дома, и эта технология как раз удобна своей повторяемостью — мне надо было повторить процесс три раза для трёх корпусов.

Результат гравировки и подкраски

Сделал простенький рисунок в векторе и выгравировал контуры двумя проходами на 600 мм/мин, 50% мощности. Весь процесс с созданием проекта и выполнением работы занял менее получаса. Это был мой первый опыт именно гравировки, а не резки, и получилось не очень хорошо. Удалось немного улучшить вид за счёт закраски «пикселей» гравировки тем же самым маркером.

▍ Плата

Чтобы собрать UnoCart-2600, да ещё в четырёх экземплярах, нужна печатная плата — ведь для подключения к консоли нужен краевой разъём, а микроконтроллер STM32F407 доступен только в корпусе LQFP100, для поверхностного монтажа и с очень маленьким шагом выводов, и на макетку его не припаяешь.

UnoCart-2600 в исполнении автора. Фото тоже его

Оригинальный автор проекта UnoCart ограничился сборкой на основе довольно дорогой (в наших краях) отладочной платы STM32F407 DISCOVERY со множеством проводов, подключаемых к платке с краевым разъёмом, и не предложил свой вариант печатной платы для сборки картриджа в формате самостоятельного устройства.

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

Превью заказа «маленькой» платы

Однако, в виде файлов проекта, которые можно было бы отдать в производство, удалось найти только одну плату — ту самую, которая в собранном виде продаётся на Али.

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

Прибытие готовых плат и микроконтроллеров

Мелких проблем с этой мелкой платой оказалось море. Все детали поверхностного монтажа, очень мелкого типоразмера. Используется разъём MicroSD довольно необычного типа, с верхним расположением выводов — я долго гадал, зачем автор выбрал такой редкоземельный вариант, пока на собственном опыте не выяснил, что это просто единственный более-менее подходящий вариант в стандартных библиотеках элементов KiCad.

Площадка для подключения программатора на маленькой плате

Также, разъём для программирования выполнен в виде микроскопических контактных площадок под опциональный фирменный кабель для ST-LINK, которого у меня нет и который стоит космических денег (10 тысяч в Чип и Дипе).

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

Маленькая плата в большом корпусе

Конечно, все существующие игры для Atari 2600 легко помещаются на одну даже самую маленькую SD-карту, которую можно вставить один раз и забыть. Но если хочется запускать свежие homebrew или отлаживать собственный код (а мне надо) — этот вариант не годится.

Проект моей «большой» платы в KiCad

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

В своём варианте я сделал плату размером во весь корпус, расположил контроллер так, чтобы он ничему не мешал, и сделал все прочие элементы выводными. Стабилизатор питания развёл как 78L33, а не MCP1700-33. Он слабее по нагрузочной способности и отличается по распиновке, но дешевле, а главное, его оказалось проще купить. Если не хватит мощности, всегда можно впаять правильный «враскоряку», благо выводные детали легко позволяют проделывать подобные выкрутасы.

Большая и маленькая плата рядом

Разъём большой SD-карты и перемычку режима я расположил точно там, где в корпусе предусмотрены вырезы под них. Футпринта под имеющиеся в продаже «большие» разъёмы SD-карт в стандартных библиотеках KiCad не было, но был вариант, зеркальный по отношению к реальному разъёму. Я сделал свой, отзеркалив имеющийся, и, забегая вперёд, это стало проблемой.

Большая плата в корпусе

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

▍ Сборка и наладка

Собранная плата

Изготовление плат заняло приличное время, и когда они наконец-то прибыли, я сразу же собрал пробный экземпляр.

Хотя я много раз успешно паял довольно мелкие многовыводные микросхемы поверхностного монтажа обычным паяльником, это был мой первый опыт пайки настолько многовыводного чипа. LQFP100 — на 36 ножек больше предыдущего максимума. И на этот раз всё прошло не вполне гладко.

Чип готовится к экзекуции

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

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

Чип кое-как присрапаян на своё место

Помимо многовыводного чипа, всё остальное на плате — детские игрушки, припаял и забыл.

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

ST-LINK и проводок для удобной прошивки

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

Так как прошивка была не в исходниках, а уже собранная в elf.hex, прошивал через STM32 ST-LINK Utility. На удивление, загрузка прошивки с первой же попытки прошла без проблем.

ST-LINK Utility выглядит сложно, но для прошивки контроллера достаточно нажать пару кнопок

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

Ошибка CANT READ SD

Но порядок оказался неполным: картридж не видел SD-карту, выдавая сообщение CANT READ SD. А значит, предстояла отладка.

Я решил начать поиск проблемы с более внимательной инспекции, чего я там напаял. Под лупой с 4-кратным увеличением всё выглядело вполне неплохо, но 10х увеличение на телефоне показало загиб выводов STM32, как раз вывода для данных SD-карты — он почти касался своего соседа. Вероятность, что проблема заключается именно в этом, была высока, и хотя проделать этот трюк паяльником было непросто, я всё же поправил ситуацию, и заодно ещё раз пропаял этот край микросхемы.

Дефекты монтажа чипа

Но это не помогло: сообщение осталось. Попутно я заметил странное: если вставить карту в слот, по экрану идёт помеха и слышен гул, а если вынуть — то этого нет. Выглядит как просадка по питанию, но непонятного характера: ведь если бы просаживалась линия 3.3 вольта, переставал бы работать контроллер, и меню пропадало бы. На всякий случай я заменил конденсатор на 4.7 мкФ по питанию на 100 мкФ — никакого эффекта это не дало.

Я предположил, что не вытягивает стабилизатор 78L33, всё-таки его номинальный ток 100 мА, а карты памяти могут потреблять и больше. Но эксперимент показал, что простая вставка пустого адаптера-переходника карты памяти, без самой карты, вызывает ровно такой же эффект.

Установленный дублирующий разъём MicroSD

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

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

Пробное включение показало список игр на карте, и я почти было обрадовался, что всё заработало. Но рано: попытка загрузить любую игру приводила к сообщению BAD ROM FILE.

Ошибка BAD ROM FILE

Это было странно: если каталог читается, значит, обмен с картой происходит, и теперь уже с линиями и пайкой чипа точно всё в порядке. Опыт работы с разнообразными электронными самоделками, использующими SD-карту, подсказывал, в чём может быть дело: несовместимость с самой картой или с её форматом. Самоделкам иногда требуется особая карточка, например, малого объёма, а иногда её нужно отформатировать особым образом, не через стандартное форматирование в Windows.

И действительно, я откопал в закромах древнюю MicroSD на 128 мегабайт, и с ней всё заработало. Это, конечно, выявило большой минус конструкции — она работает не с любой картой, но, по крайней мере, показало, что картридж работает, и чип припаян нормально, и питания от 78L33 хватает.

Позже в отзывах на собранную плату на Али я увидел замечания об аналогичных проблемах совместимости с картами памяти, а значит, это ожидаемая ситуация. Но ещё позже выяснилось, что проблема с самой картой. Я купил три таких новых, Kingston Canvas Select 8GB, на Озоне, с хорошими отзывами. Упаковка выглядит совершенно как оригинальная. Карты успешно форматируются всеми способами, включая FAT32 Format и SD Card Formatter, сообщают корректные параметры, пишутся, читаются, показывают каталог, но в читаемых файлах возвращаются нули.

Сравнение распиновок и планирование исправлений на бумаге

Оставалось только разобраться, что же не так со слотом для большой SD-карты. Я сравнил распиновку в моём проекте с распиновкой разъёма на плате UzeBox, ещё одного ретро-игрового устройства, которое я сейчас собираю (спойлер!), и нашёл отличия: линии выборки и команды у меня подключены не туда. Оказалось, что нумерация пинов в исходном «зеркальном» разъёме отличается от схемного символа.

Исправление ошибок разводки на плате

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

▍ It’s Alive!

Картридж заработал.

Готовый картридж и Рэмбо

Работает он, правда, не очень стабильно: иногда не включается сразу, иногда не видит SD-карту, и нужно выключить и снова включить. Причины неясны: возможно всё же не очень качественная сборка (если где-то на фото есть флюс, после наладки я его отмыл, не помогло). Может быть, UnoCart не очень любит клоны, а может и сам по себе не слишком надёжный, судя по прочим проблемам. Но в целом, если запустился — то запустился.

Игры кладутся на карту в стандартном формате, простым копированием, без конвертирования. Поддерживаются длинные имена файлов, при отображении они обрезаются. Также поддерживаются папки. Правда, в одной папке может быть около 60 файлов, остальные не отображаются.

Идут все интересные мне игры. Упомяну лишь парочку из них — эти игры довольно затруднительно увидеть на реальной консоли без применения Flash-картриджа.

Во-первых, это игра Commando. Забавный факт: на приставке Рэмбо нет игры про Рэмбо. Зато для Atari 2600 выходила игра по культовому боевику со Шварценеггером. Это одна из поздних игр, 1985 года выпуска. Она имеет внушительный по меркам системы 16 килобайт, и напоминает ранние игры для Денди — довольно неплохая стрелялка, и самое похожее на Рэмбо из того, что можно запустить на Рэмбо.

Во-вторых, это homebrew-игра AVGN K.O. Boxing. По сути это аналог Punch Out, созданный в 2009 году по мотивам одноимённого популярного шоу на YouTube, с персонажами из эпизодов тех лет — Нёрдом, Багсом Банни и другими. Данная игра имеет объём 32 килобайта и ещё более продвинутую по меркам платформы графику.

Помимо этих игр, на платформе есть ещё сотни других занимательных вещей. Я не буду удлинять текст их обзором — думаю, в скором времени за меня это гораздо лучше сделают в видео-формате получатели ещё двух экземпляров картриджа, авторы YouTube-каналов «Саня, Тащи» и «Хижина Джедая».

▍ Затраты

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

Весьма примерная раскладка себестоимости одного экземпляра такова:

300 печать корпуса
200 изготовление платы
250 контроллер STM32F407
100 разъём SD-карты
200 прочая мелочь

Итого около тысячи, что сильно дешевле готовых решений. Впрочем, фактические затраты оказались выше: платы разных видов заказывались дважды и их было по десять штук в каждом заказе, было куплено несколько разных типов разъёмов SD карт, также присутствовали различные расходы на доставку. Если учесть всё, выгода уже не такая явная. Зато интересно и весело!

▍ Заключение

Сборка UnoCart-2600 — вполне реальный вариант решения задачи запуска игр и homebrew на реальной приставке. Но всё же народным этот проект назвать сложно: далеко не все могут пройти квест с заказом плат и уже ставших редкими контроллеров, монтажом и прошивкой. Впрочем, если не жалко денег и не нужен корпус, можно купить собранный вариант на базе упомянутой выше «маленькой» платы.

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

Ну а если навыки и умения вам позволяют — вы всегда можете повторить UnoCart-2600 на чужой маленькой или моей большой плате.

© 2025 ООО «МТ ФИНАНС»

Telegram-канал со скидками, розыгрышами призов и новостями IT 💻


 

Источник

Читайте также