Всем здравствуйте! Захотелось мне поиграть в игру Pier Solar на приставке. Но оригинальный картридж стоит что-то около 200$ на ебее, мой евердрайв X5 эту игру не поддерживает, и у китайцев я тоже этого картриджа не видел. Мне стало интересно попробовать собрать картридж самому, а заодно и потренироваться в проектировании цифровых схем
. Картриджи для SMD обычно простые, это просто микросхема ROM с игрой и иногда еще SRAM с батарейкой для сейвов. Но этот картридж сделан на ПЛИС, у него свой маппер, защита от копирования, а для сейвов используется Serial EEPROM. Ну очевидно, что защита как таковая не нужна, если только в минимальном объеме, необходимом для прохождения внутренних проверок игры
Конечно, можно было бы взять за основу чип Altera MAXII EPM240T на котором и собран оригинал, но может быть, можно вообще обойтись стандартной логикой?
Итак, вот мое “ТЗ”:
- Не использовать ПЛИС (если только не выясниться, что иначе никак)
- Не вносить изменения в ROM с игрой
- Плата должна помещаться в “стандартный” сеговский корпус, который можно купить (например на Алиэкспресс)
- Все должно быть технически правильно (например, если используются компоненты на напряжение 3.3V значит уровни сигналов должны быть согласованы, должны соблюдаться рекомендуемые режимы работы компонентов, рекомендации по разводке цифровых схем и т.д. и т.п.)
- Платы буду заказывать на производстве, технологические нормы должны быть минимальные, но без повышения стоимости изготовления.
- В наличии программатор TL866A с полным набором переходников, использовать его для прошивки образа игры.
Теперь надо разобраться в том, как работает защита и переключение банков памяти (маппер). Основной источник инфы - исходники эмулятора Genesis Plus GX. Ну и обсуждения на форуме той поры, когда игру пытались взломать
Объем образа игры - 64 Мбит (8 МБайт), он разбит на 16 частей (банков) по 512 КБайт. SMD может адресовать всего 4 МБайта памяти картриджа (адреса 0x000000 - 0x3FFFFF), данные в диапазоне адресов 0x000000 - 0x27FFFF фиксированы, а в каждом из трех старших диапазонах 0x280000 - 0x2FFFFF, 0x300000 - 0x37FFFF, 0x380000 - 0x3FFFFF можно выбрать один из этих 16 банков.
Таким образом, значения старших адресных линий картриджа (A21,A20,A19):
0xx - фиксированный диапазон 0x180000 - 0x1FFFFF
100 - фиксированный диапазон 0x200000 - 0x27FFFF
101 - переключаемый диапазон 0x280000 - 0x2FFFFF
110 - переключаемый диапазон 0x300000 - 0x37FFFF
111 - переключаемый диапазон 0x380000 - 0x3FFFFF
Переключение банков памяти и работа с EEPROM (сейвами) осуществляется записью/чтением по адресам 0xA130xx, при этом операция чтения используется только для чтения данных EEPROM. При обращении к этому диапазону адресов на разъеме картриджа сигнал TIME# принимает низкий (активный) уровень.
0xA13001 (...’0000’0001b) - только запись, перед и после обращения по другим адресам, игра пишет сюда. Можно проигнорировать.
0xA13003 (...’0000’0011b) - только запись, выбор номера банка (0-15) в диапазоне 0x280000 - 0x2FFFFF.
0xA13005 (...’0000’0101b) - только запись, выбор номера банка (0-15) в диапазоне 0x300000 - 0x37FFFF.
0xA13007 (...’0000’0111b) - только запись, выбор номера банка (0-15) в диапазоне 0x380000 - 0x3FFFFF.
0xA13009 (...’0000’1001b) - только запись, обращение к EEPROM, используются только младшие 4 бита: бит 0 - сигнал DATA, бит 1 - сигнал CLOCK, бит 2 - сигнал HOLD, бит 3 - сигнал CS.
0xA1300B (...’0000’1011b) - только чтение, чтение данных EEPROM, используется только младший бит, остальные игнорируются.
Также, в качестве защиты от эмуляции, игра иногда производит запись по следующим адресам (такие операции нужно игнорировать).
0xA130F1 (...’1111’0001b)
0xA130F3 (...’1111’0011b)
0xA130F9 (...’1111’1001b)
0xA130FF (...’1111’1111b)
Защита от копирования (снятия дампа) заключается в том, что при включении (или сбросе по кнопке) картриджа данные читаются только в первых 32 КБайт (0x000000 - 0x007FFF). По всем остальным адресам возвращаются отзеркаленные первые 32 КБайт (т.е. значения адресных линий A15-A21 игнорируются). Защита отключается после того как игра прочитает данные по трем определенным адресам (0x181C8, 0x18104, 0x181C9). К сожалению, игра должна получить при этом “неправильные” значения, иначе она не заработает. Так что для этих трех чтений нужно вернуть данные по адресами 0x1С8, 0x104, 0x1С9 соответственно (значения адресных линий A15, A16 должны быть приняты равными 0).
Вообщем, после многочисленных экспериментов и неудач, появилась вот такая схема:
А вот мой прототип
Оно даже работает
Тестировал на моей MD2 PAL ASIA VA1.8 переведенной в US NTSC. Дошел в игре до города Оазиса, вроде все ОК, зависаний и глюков не замечено, сейвы работают. Единственное, что меня смущает: бегающие разноцветные точки при смене сцен (при выходе / входе на локацию, еще на главной заставке довольно заметно). Но я где-то читал, что это вроде как особенности работы VDP (при динамической смене палитры?). Если у кого-нибудь вдруг есть этот картридж, можете посмотреть есть ли на нем этот эффект?
Собственно, к чему смысл этой темы: хотелось бы чтобы прежде, чем я закажу платы, разбирающиеся в теме господа высказали свое мнение. Правильно ли я все сделал? Может, можно сделать как-то еще проще? Или может я где-то не прав и оно работает, хотя и не должно?
P.S. Еще у меня одна большая просьба: воздержаться от комментариев в стиле “Эта игра - говно!”, “Играй на эмуляторе!”, “Купи картридж / Everdrive X7!”. Если нечего сказать по делу, лучше промолчать
.