Как перепрограммировать картридж для денди

Обновлено: 02.07.2024

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

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




Очень вероятно, что сейчас вы вспомнили свой первый картридж для Dendy и меню с романтическим сюжетом и приятной музыкой. На таких картриджах никогда не было «серьёзных» игр, и не глядя на громкие надписи типа 9999-in-1, их обычно было что-то около пяти. Но это меню… Разве это не шедевр китайской мысли? :) Мне с детства нравилась эта мелодия (Unchained Melody), а фоновые изображения сейчас навевают кучу ностальгических воспоминаний. Поэтому я взял IDA и дизассемблировал меню 300-in-1, вырезал всё лишнее, исправил ошибки, добавил фейдинг да немного приятных мелочей — и получилась демка Unchained Nostalgia (для запуска нужен эмулятор, например, Nestopia), есть запись на YouTube.

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

Архитектура, программирование и отладка

Раньше для процессора 6502 писали только на ассемблере, выбор инструментов был маленьким, документации было немного и поведение железа было плохо изучено. Сегодня же таких проблем нет. В последние годы были даже разработаны библиотеки для C и полноценные игры на них, которые при этом быстро работают на скромном железе NES.

    — популярный эмулятор с отличными отладочными функциями — руководство для начинающих, на русском языке — справочник на русском языке — главный англоязычный источник информации по внутренностям и программированию NES — компилятор на C и макроассемблер для процессора 6502 — хорошая статья на английском языке — моё окружение для компиляции примеров на C от Shiru и на ASM от blargg (извлеките всё содержимое в любой каталог без пробелов в пути, запускайте make.bat для компиляции) — для лучшего дизассемблера — отличный инструмент для редактирования тайлов и тайловых карт — интересная попытка создания «высокоуровневого» ассемблера для 6502 — полноценная среда разработки для NES — подмножество Python для NES (интересно, реально ли написать что-то серьёзное на этом?) — чумовой проект по детальнейшему изучению процессора 6502 по фотографиям под микроскопом — визуализатор работы процессора 6502 — флэш-картридж для тестирования ромов на реальном железе (есть и другие подобные проекты) исходных кодов различных игр для NES, и ещё
Современные разработки для NES

Если кто-то считает, что NES — мёртвая платформа, тот ошибается :) Достаточно регулярно выпускаются новые игры и демки. Понятно, что это не массовый рынок, и здесь крутятся, в основном, энтузиасты, но тем не менее… Различных релизов выходит достаточно много, я поделюсь самым интересным и забавным из того, что нашёл сам.

    (2000 год) — старая демка, с длинным ностальгическим текстом и даже скрытым посланием (2007 год) — наверное, лучшая демка для NES, стоит посмотреть (две части, 2009 и 2010 годы) — Guitar Hero для NES :) (2011 год) — симулятор секретарши, выполненный с хорошей долей чувства юмора (чего только стоит отвлекающий шеф!), написано отечественным разработчиком (Shiru) и имеются исходные коды на C (2011 год) — головоломка на сисадминскую тематику с атмосферным звуком, от Shiru, исходные коды (2011 год) — симулятор газонокосильщика, также от Shiru (талантливый разработчик, да), исходные коды (2011 год) — логический платформер, порт с ZX Spectrum от Shiru, исходные коды на C (2012 год) — это пример простой игры на C к соответствующей статье от Shiru, но вышло так хорошо, что даже жалко, что в игре всего пять уровней (обратите внимание на классные огромные надписи, нехарактерные для NES) (2012 год) — просто приятно выполненная игрушка (2012 год) — коммерческая игра для современных консолей, но внутри есть маленький секрет в виде игры для NES, посмотрите это видео о создании NES версии, посмотреть обзор и скачать ROM можно здесь (2013 год) — платформер-лабиринт от испанской группы разработчиков игр Mojon Twins, написано на C (2013 год) — демка стратегии (!) под NES, к сожалению, пока что заброшена, автор — русский (Ti_) (2013 год) — современная коммерческая (и не единственная!) игра для NES от японских разработчиков, цифровая копия для запуска в эмуляторе стоит ≈30$, настоящий картридж стоит ≈200$ (2013 год) — майним Bitcoin-ы на NES! :) (2011-2013 годы) — новые инструменты для написания музыки под NES на самой NES, от Neil Baldwin, который писал музыку для известных игр эпохи NES уже 20 лет назад
Тематические сайты
Зачем всё это?

Если вы задаётесь этим вопросом, может быть это и не для вас. Но на самом деле это очень интересное и увлекательное занятие. Если у вас любимой приставкой была не Dendy, то может быть вам будет интереснее сделать что-то, например, для Sega Mega Drive. Вперёд! И обязательно расскажите о том, что у вас получилось.

Самодельные картриджи для Dendy/Famicom


После моей статьи про дампер картриджей (которую пока что оставили на Хабре почему-то), меня очень много раз просили рассказать, как собирать и записывать картриджи для Денди/Famicom самому. Да, это очень избитая тема, даже в древних номерах журнала «Радио» про это можно было почитать, но прогресс не стоит на месте. Рассмотрим эту тему с точки зрения современных компонентов. Тем более, по-моему, она идеально подходит для изучения азов работы с ПЛИС, именно на этом я и сам учился.


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

Видео:

Статья:

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

Напомню, что картридж включается прямо в шину CPU и в шину PPU, а соответственно в первую очередь содержит две микросхемы памяти с параллельным доступом: PRG — к ней обращается процессор, и она содержит непосредственно код игры, и CHR — с ней работает PPU (графический процессор), и она содержит изображения. При чём последняя запросто может быть не ПЗУ, а оперативной памятью, куда уже в процессе игры записываются данные.

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


Микросхемы просто подключаются напрямую к соответствующим выводам на разъёме картриджа. Ноги /RD можно припаять напрямую к земле, ведь консоль всегда будет только читать данные, но я записывал данные уже после сборки картриджа, с помощью всё того же дампера, поэтому подключил все выводы как положено. Биты адреса и данных при этом перепутаны местами, но это абсолютно не имеет значения. Внизу можно увидеть перемычку, которая определяет «mirroring» — как будет зеркалироваться видеопамять: горизонтально или вертикально. Это зависит от игры, и в простейших играх определялось именно перемычкой на картридже.

И ещё очень важный момент — активировать нашу память нужно только тогда, когда консоль обращается к картриджу, иначе будет возникать конфликт на шине. Для этого у микросхем есть вывод /CE (chip enable), который включает память. Тут в ход идёт достаточно простая математика. Программная (PRG) память картриджа начинается с адреса $8000 и заканчивается $FFFF, это два в пятнадцатой степени. Графическая (CHR) память картриджа начинается с адреса $0000 и заканчивается $1FFF, имея объём в 8 килобайт, а это два в тринадцатой степени. Соответственно включать нашу память надо пятнадцатым и тринадцатым контактом на адресной шине. На разъёме картриджа уже есть специальные выводы, которые выдают необходимый нам сигнал. Более того, в случае с PRG памятью нужный нам контакт так и называется — /ROMSEL — сокращённо от ROM Select. Туда консоль выдаёт 0 вольт, когда обращается к памяти картриджа в районе между $8000 и $FFFF. Всё проще некуда.

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

У памяти с параллельным доступом каждый бит адреса задаётся отдельным выводом у микросхемы. В разъёме для картриджа есть выводы A0-A14 (15 выводов) для PRG памяти. Это соответственно 15 бит адреса, которые дают 32768 комбинаций единиц и нолей, т.е. позволяют адресовать 32 килобайта. Для CHR памяти там соответственно выводы A0-A13, это 16384 комбинаций, т.е. 16 килобайт, но половина из них отдана памяти внутри консоли.

Уже в восьмидесятые годы таких объёмов стало не хватать. Конечно ничто не мешает поставить в картридж память бОльшего объёма, но у такой памяти и адресных выводов больше. Не трудно посчитать, что каждый дополнительный вывод увеличивает количество возможных адресов ровно в два раза. Но куда их подключать, если количество контактов в разъёме картриджа ограничено? Вот тут на помощь и приходят мапперы, именно они управляют дополнительными выводами в зависимости от различных условий. Почти всегда такими условиями является попытка запись в PRG-область памяти картриджа. Да, в ту, куда нельзя ничего записать.

Многие игры используют для этих целей простейшие логические микросхемы. Например, в картридже у Battletoads стоит четырёхбитный счётчик 74161, который используется как триггер. При записи по любому адресу от $8000 до $FFFF он запоминает записанное значение и выдаёт его на те самые дополнительные выводы у памяти, он же переключает мирроринг.

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


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

Первым делом читаем, как происходит взаимодействием с ним. А происходит оно через запись по определённым адресам, их 8 групп: $8000-$9FFE (чётные), $8001-$9FFF (нечётные), $A000-$BFFE (чётные), $A001-$BFFF (нечётные), $C000-$DFFE (чётные), $C001-$DFFF (нечётные), $E000-$FFFE (чётные) и $E001-$FFFF (нечётные). Запись по любому адресу внутри группы равнозначна. Видите закономерность? Регистр выбирается с помощью трёх адресных бит: A0, A13 и A14, остальные же значения не имеют.

Попробуем же имитировать работу маппера с помощью ПЛИС. Код я пишу на языке Verilog. Он тут не подсвечивается, прошу прощения за это.
Сначала описываем наши регистры, которые хранят текущее состояние:


Описываем реакцию на запись по соответствующим адресам. Возрастающий сигнал /ROMSEL говорим о том что было обращение к памяти картриджа, т.е. по адресам $8000-$FFFF, нам надо реагировать именно в этот момент.


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



Теперь CHR. Там такая схема:



Режим зеркалирования описывается всего одной строкой. В зависимости от него мы замыкаем вывод картриджа CIRAM A10 либо на A10, либо на A11:


Дальше сложнее. MMC3 умеет генерировать прерывания, когда на экране рисуется определённая строка. Это весьма полезно, и игры часто это используют. Строки на экране считаются с помощью обращений к A12 у PPU. При типичных настройках сигнал на A12 переходит из логического 0 в логическую 1 ровно один раз за строку, если не считать кратковременные переходы в 0. А их надо не считать, это всё немного усложняет:

Ах да, MMC3 поддерживает ещё подключение дополнительной оперативной памяти по адресу $6000-$7FFF! Надо не забыть и это описать:

На самом деле собрать картридж для какой-то одной определённой игры весьма просто, ведь нужно будет установить только необходимые компоненты. А вот сделать универсальный картридж гораздо сложнее.Если установить ПЛИС на 128 макроячеек, flash на 512 килобайт для PRG, flash на 512 килобайт для CHR, SRAM на 32 килобайта для CHR, SRAM на 32 килобайта в качестве дополнительной памяти, питание которой поддерживается батарейкой для игр, которые умеют сохраняться, то на нём пойдёт уже около 90%-95% игр. Схема получается весьма замороченная, я долго вручную рисовал плату под всё это дело. Кстати, при выборе компонентов не стоит забывать, что у Famicom/Dendy пятивольтовые уровни. Китайцы сейчас очень часто это игнорируют.

Первая ревизия моего универсального картриджа выглядела как-то так:


Ну и программу для записи игр написал конечно же:


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

Флеш-картридж для Famicom/Денди


1.JPG" />

Приветствую комрады!
Хочу рассказать о недавнем приобретении, флеш-картридж для Famicom/Денди. Штука скажем прямо для ценителей и со своими особенностями, подробнее под катом.

Не так давно, во время уборки в гараже, приятель обнаружил старую 8ибитную приставку Subor SB-225. С приставкой в коробке нашелся картридж «9999999 в 1» 95 года выпуска. В ностальгическом приступе приставка была приведена в порядок, подключена к телевизору и опробована. Несколько обеденных перерывов прошли в забегах в «Контру» и «Танчики». Все было хорошо, но ностальгическое настроение ни как не развеивалось, а наоборот начали вспоминаться другие любимые в детстве игры и возникло желание снова в них поиграть.

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

Но выход был найден, флеш-картридж! Эта чудесная штукуевина позволяет сделать собственную подборку любимых игр, при чем качество ромов ты можешь контролировать сам. Т.е. хочешь записывай на карточку памяти официальные ромы игры, хаки или переведенные на Русский язык версии :) Во вторых такой картридж поддерживает чит коды! А это значит что в любимые с детства игрушки можно просто играть и получать удовольствие, не беспокоясь о запредельной сложности некоторых экземпляров.

Встал вопрос выбора картриджа. На рынке существуют несколько вариантов:
Проект от RetroUsb ценой в 135 баксов
EverDrive от krikzz ценой 118 баксов
И собственно все. При чем первый вариант был только в NES версии т. е. Нам понадобился бы переходник с NES на Famicom.
Однако отдавать 118 баксов за такую по большому счету мало полезную вещь не очень хотелось и начались поиски на Али :)

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

Теперь подробнее о картридже, описание от продавца:

Все поддерживается.
— Корзину Поддерживает NES и FDS ROM изображений.
— Автоматический Диск стороне замены для fds.
— Расширение аудио. **
— Сохранить государственной функции
— Игры Genie чит-код поддержка.
— Автоматически спиной-Сохраняет MicroSD карты. Нет необходимости нажмите сброс перед выключением системы.***
— OS v9.1 Файлы копируются в 4 г микро sd, он может воспроизводить, можете обновить нашу игры каталог.
— Жира/fat16/fat32 файловой системы форматы поддерживаются.
— Поддержка MicroSD (sd и sdhc) карты до 32 ГБ.
— Быстрая загрузка файлов игры (прибл. 4-8 секунд)
Оборудование:
Мощный циклон II fpga.
2x512 Кбайт SRAM для PRG и CHR данных.
128 Кбайт батареи поддержаны памяти. Запись Сохранить данные MicroSD.
MAX II CPLD обрабатывать FPGA реконфигурации, bios, SD и USB интерфейсы.
1 Мбайт флэш-bios.
Напряжение сдвига буферов на ППУ и шины процессора для сопоставления уровней 5 В РЭШ автобус и 3.3, Гораздо лучше, чем простой резистор буферов снижения шума и энергопотребление.

Что из этого можно понять:
— Поддерживаются ромы для NES и Famicom Disk System
— Есть Функция автоматической смены стороны дискеты для FDS
— Есть возможность сохранять прогресс средствами самого картриджа, но поддерживается и родная для фамиком игр процедура сохранения. (были такие грушки в которых можно было сохраняться)
— Поддержка чит-кодов Game Genie


Пришел картридж в пупырчатом пакете, маленьком полиэтиленовом пакете и с картой памяти, что приятно т. к. в описании товара про нее не было сказано. Картридж пришел с наклейкой на корпусе, которая копирует картриджи EverDrive N8 от krikzz, в описании товара корпус картриджа был без наклеек.


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





Про саму плату ничего дельного не скажу, не понимаю в этом ничего. Однако и на плате присутствуют упоминания о том что это якобы EverDrive N8 от krikzz. Но об этом немного позже.

Перейдем к описанию операционной системы картриджа и его возможностей.


После включения мы попадаем в корневой каталог SD карты. Управление в основном меню: «А» открыть/запустить, «В» — назад/отменить, кнопкой «Select» вызывается меню настроек.









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







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


2. Не работает функция сохранения, что сильно снижает полезность данного картриджа. Т.е. можно настроить горячие клавиши, но по их нажатию совершенно ничего не происходит.
3. Данный картридж не запустится на новодельных приставках, со слабыми блоками питания. Для нормальной работы ему мало 350 мили ампер которыми питается приставка Симбас ждуниор. На нашем Сюборе питание происходит от 9V и 850МА.


Выводы:
Довольно дорогой и бестолковый способ окунуться в ностальгию. Существенно проще и дешевле играть на эмуляторе с USB геймпадом. К покупке не рекомендую, тем более за эту цену. Мы деньги за товар вернули т. к. он явно не соответствовал описанию.
Но черт возьми, что-то в этом все таки есть :) Сесть перед телевизором и как когда-то вставить в приставку картридж и взять в руки «ждойстик» :) Стоит ли оно этих денег — решать Вам :)

Самодельный картридж для 8 битной приставки типа денди


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

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

И вот настал момент записать память 27С040, это 512кбайт память. И тут я выясняю, что программатор Willem, купленный за недорого, малость подпаленный :(. Благо при сборке EzoFlash я разобрался с тестированием данного программатора и быстро нашел выгоревший смд транзистор на плате, он коммутировал питание микросхемы памяти, после его замены все стало записывать нормально и можно было приступать к созданию платы картриджа.

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

В моем случае я создавал картридж для игры Battletoads & Double Dragon, она в качестве маппера использует логику HC161, это бинарный счетчик. Игре необходимо 256кбайт памяти, но если мы берем ПЗУ на 512кбайт памяти и просто перемычкой переключаем старший бит адреса в 0 или 1, то получаем возможность выбрать с какой половиной памяти работать. Таким образом можно в одну ПЗУ записать 2 игры и выбирать в какую хотим играть. Также выбор игры можно сделать по нажатию на ресет, но эта опция требует одну дополнительную микросхему и не всегда корректно отрабатывает, на разных приставках может работать по разному.

Схему брал ТУТ, HC02 выкинул из схемы, и поставил перемычку на адрес А18, печатку перерисовывал сам, брал ТУТ.



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

Денди у меня 2018 года выпуска, видео показывает плохо, вертикальные линии ломанные, и цвета перенасыщены, видимо нужно дорабатывать. Лучше искать старые консоли, их проще дорабатывать.

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