[Hardware] Делаем моды SNES. Устранение региональной защиты и переключение 50/60 Гц
Сразу предупреждаю, как делать моды было подсмотрено здесь. Также предупреждаю насчет фото — делал китайфоном и даже не старался.
Не секрет, что региональная блокировка игр надоедает и хочется от нее избавиться. Можно это сделать четырьмя способами:
— флешкартридж
— переходник-адаптер
— моды
— покупка приставок всех регионов
Все варианты кроме модов — дорогие. Однако, моды не решают самой главной проблемы — картридж американского региона не вставляется физически в слоты других приставок. Решается также двумя способами: вырезанием отверстия под USA картридж или ваяние переходника (снизу PAL-JAP вверху слот)
Ну кто выбрал путь модов (не важно по каким причинам), тот может прочитать как это делается ниже.
_________________________________________________________
Что нам понадобится:
— сопротивления на 2.2 кОм (можно самые дешевые)
— два переключателя (у меня шестиконтактные)
— провода тонкие (если не запутаетесь, то можно из IDE шлейфа выдрать)
— инструменты: паяльник, отвертка SNES, крестовая отвертка
— сама приставка (у меня под рукой японская версия, Super Famicom)
Итак, выскрываем приставку. Под крышкой помимо кучи пыли японской видим отсоединяемую плату контроллеров. Ну и отсоединяем ее. Также механизм вытаскивания картриджа.
И по порядочку начинаем разбирать всю начинку. Если будете фоткать процесс — не запутаетесь потом при сборке. Ну можете не фоткать
Далее мы придумываем место для установки этих самых переключателей. У меня были не очень удачные переключатели — они громоздкие, лучше найти меньше по размеру. Или по крайней мере найти место получше, т.к. с переключателями как у меня закрепиться было неудобно.
Для большей прочности помимо штатного крепления я еще залил клеем.
Далее нам придется работать с самой платой SNES. С нее тоже надо снять весь обвес.
Для начала припаяем сопротивление вот таким макаром:
Первые провода, какие будем «тянуть» — питание 5v и «землю». Обычно берут с регулятора напряжения. Он расположен снизу платы. O — 5v, G — «земля».
Пока припаивать к переключателем не будем эти провода. Начнем более сложный процесс: поднятие ножек процессоров. Нам нужны такие вот:
1. чип F431A или F411 (чип блокировки как раз там) и ножка №4 (считаем внимательно, там в принципе все подписано)
2. чип PPU1 и ножка №24
3. чип PPU2 и ножка №30 (тут не надо считать, она крайняя)
Я пока пользовался таким способом поднятия (бюджетный и опасный вариант) — беру заточенную скрепку, паяльником нагреваю место и аккуратно скрепкой отодвигаю в сторону и вверх.
Есть и другие варианты, но оборудования у меня нет (паяльный фен и т.п.).
Дальше обязательно заизолировать остальные ножки и припаяться к поднятой.
Далее плату вставляем уже обратно и начинаем манипуляции с припайкой проводов к переключателям
1. первый провод от питания 5v припаиваем к верхнему первому переключателю к сопротивлению. (верхний переключатель — будет переключателем регионов: NTSC-PAL).
2. следующий провод «земля» припаивается к дальним контактам верхнего переключателя и таким же нижнего переключателя (дальние от сопротивления). К нижнему можно просто бросить мостик.
3. провод от чипа с региональной блокировкой (напомню F431A или F411) припаиваем к срединному контакту верхнего переключателя.
4. провода от чипов PPU1 и PPU2 припаиваем к срединной ножке нижнего переключателя.
Далее все прости изолируем и закрепляем так, чтобы провода не двигались и не были зажаты радиаторами.
Все! Собираем аккуратно приставку, чтобы ничего не зажать и не оторвать.
Теперь осталось только потестировать и подписать переключатели.
PS: дальше будем думать что еще можно модифицировать своими руками в приставке SNES. Первым в голову конечно приходит модернизация слота для картриджа под USA картриджи, которые имеют хоть и NTSC регион, но форму совершенно другую, не подходящую.
Источник
Самодельные картриджи для 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 он запоминает записанное значение и выдаёт его на те самые дополнительные выводы у памяти, он же переключает мирроринг.
Но большинство игр использует для этого более сложные микросхемы, которые разработаны специально для этих целей.
Они, как правило, умеют уже переключать разные банки для разных областей памяти, управлять дополнительной памятью, генерировать прерывания, а иногда даже расширять вычислительные мощности консоли.
В качестве примера возьмём самый популярный маппер — MMC3. О нём во всех подробностях можно почитать тут: wiki.nesdev.com/w/index.php/MMC3
Первым делом читаем, как происходит взаимодействием с ним. А происходит оно через запись по определённым адресам, их 8 групп: $8000-$9FFE (чётные), $8001-$9FFF (нечётные), $A000-$BFFE (чётные), $A001-$BFFF (нечётные), $C000-$DFFE (чётные), $C001-$DFFF (нечётные), $E000-$FFFE (чётные) и $E001-$FFFF (нечётные). Запись по любому адресу внутри группы равнозначна. Видите закономерность? Регистр выбирается с помощью трёх адресных бит: A0, A13 и A14, остальные же значения не имеют.
Попробуем же имитировать работу маппера с помощью ПЛИС. Код я пишу на языке Verilog. Он тут не подсвечивается, прошу прощения за это.
Сначала описываем наши регистры, которые хранят текущее состояние:
Описываем реакцию на запись по соответствующим адресам. Возрастающий сигнал /ROMSEL говорим о том что было обращение к памяти картриджа, т.е. по адресам $8000-$FFFF, нам надо реагировать именно в этот момент.
Теперь же опишем, какой должен выбираться банк при обращении к соответствующей части памяти в зависимости от наших регистров.
Переключаются они в соответствии с такой таблицей:
Где $8000 & #$40 — это у нас prg_mode, а -2 и -1 — это предпоследний и последний банк соответственно. Получается такой код:
Теперь CHR. Там такая схема:
Где $8000 & #$40 — это chr_mode. Получается так:
Режим зеркалирования описывается всего одной строкой. В зависимости от него мы замыкаем вывод картриджа CIRAM A10 либо на A10, либо на A11:
Дальше сложнее. MMC3 умеет генерировать прерывания, когда на экране рисуется определённая строка. Это весьма полезно, и игры часто это используют. Строки на экране считаются с помощью обращений к A12 у PPU. При типичных настройках сигнал на A12 переходит из логического 0 в логическую 1 ровно один раз за строку, если не считать кратковременные переходы в 0. А их надо не считать, это всё немного усложняет:
Ах да, MMC3 поддерживает ещё подключение дополнительной оперативной памяти по адресу $6000-$7FFF! Надо не забыть и это описать:
Вот и всё, наш MMC3 готов! Полный код можно посмотреть тут: https://github.com/ClusterM/nes_mappers/blob/master/4%20(MMC3)/MMC3.v
В том же репозитории есть коды многих других мапперов.
На самом деле собрать картридж для какой-то одной определённой игры весьма просто, ведь нужно будет установить только необходимые компоненты. А вот сделать универсальный картридж гораздо сложнее.Если установить ПЛИС на 128 макроячеек, flash на 512 килобайт для PRG, flash на 512 килобайт для CHR, SRAM на 32 килобайта для CHR, SRAM на 32 килобайта в качестве дополнительной памяти, питание которой поддерживается батарейкой для игр, которые умеют сохраняться, то на нём пойдёт уже около 90%-95% игр. Схема получается весьма замороченная, я долго вручную рисовал плату под всё это дело. Кстати, при выборе компонентов не стоит забывать, что у Famicom/Dendy пятивольтовые уровни. Китайцы сейчас очень часто это игнорируют.
Первая ревизия моего универсального картриджа выглядела как-то так:
Ну и программу для записи игр написал конечно же:
Как видите, всё не так сложно, если немного посидеть и разобраться в принципах работы.
Источник