Как собрать дампер для картриджей NES/Famicom своими руками

Создание и эксплуатация кастомного дампера для картриджей NES/Famicom

Свой первый программатор для картриджей NES/Famicom я реализовал на базе открытого проекта famicom-dumper от известного разработчика @clusterM. Я сознательно отдал предпочтение одной из ранних ревизий устройства: она привлекла меня своей схемотехнической простотой и доступностью компонентов. В частности, у меня в запасах более десяти лет дожидались своего часа микроконтроллеры ATMEGA64, которые идеально вписались в этот проект.

Стоит отметить, что в ранних версиях отсутствует полноценная генерация сигнала phi2, что критично для корректного считывания некоторых специфических мапперов. Чтобы расширить возможности устройства, в собственном форке на GitHub я реализовал постоянную генерацию phi2 в режиме ожидания (idle). Это позволило успешно работать с рядом современных многоигровок, которые ранее не поддавались дампингу.

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

Как собрать дампер для картриджей NES/Famicom своими руками
Вид устройства спереди
Внутренняя компоновка дампера, вид сзади
Вид устройства сзади

Архитектура и функциональные возможности

Ключевое преимущество данного проекта — клиент-серверная архитектура. Логика работы с мапперами вынесена в отдельные компилируемые модули на языке C#. Для исследовательских задач это гораздо удобнее, чем, например, популярный проект cartreader, где весь код исполняется непосредственно на Arduino. Возможность оперативно править код на стороне ПК существенно ускоряет процесс реверс-инжиниринга.

Помимо основной функции, устройство обладает рядом дополнительных возможностей:

  • запись образов в китайские флеш-картриджи (например, CoolBoy);
  • работа с дисковой системой Famicom Disk System (FDS);
  • диагностика микросхем статической памяти (SRAM).
Процесс работы с дампером

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

Практические примеры: Bandai DATACH

Дампер отлично справляется и с лицензионной «экзотикой». В качестве примера можно привести систему DATACH от Bandai. Несмотря на необычный внешний вид, технически она базируется на 157-м маппере. Написание программного модуля на C# по существующим спецификациям занимает считанные минуты.

// Модуль для работы с Bandai DATACH Joint ROM System
class BANDAI_LZ93D50_BARCODE : IMapper
{
    public string Name { get => "BANDAI BARCODE"; }
    public int Number { get => 157; }
    public int DefaultPrgSize { get => 256 * 1024; }
    public int DefaultChrSize { get => 0; }

    public void DumpPrg(IFamicomDumperConnection dumper, List<byte> data, int size)
    {
        var banks = size / 0x4000;
        for (var bank = 0; bank < banks; bank++)
        {
            Console.Write($"Reading PRG bank #{bank}/{banks}... ");
            dumper.WriteCpu(0x8008, (byte)(bank & 0xFF));
            data.AddRange(dumper.ReadCpu(0x8000, 0x4000));
            Console.WriteLine("OK");
        }
    }
    public MirroringType GetMirroring(IFamicomDumperConnection dumper)
    {
        return MirroringType.MapperControlled;
    }
}

Результат работы консольного клиента при считывании DATACH:

famicom-dumper.exe dump --port COM3 --mapper 157 --chr-size 0k --prg-size 256k --chr-ram-size 8k --file datach.nes
Dumper initialization... OK
Compiling mappers...
Using 157.cs as mapper file
Using mapper: #157 (BANDAI BARCODE)
Dumping...
PRG memory size: 256KB
Reading PRG bank #0/16... OK
...
Saving ROM as NES 2.0 file: datach.nes... OK
Done.
Проверка полученного дампа в эмуляторе
Проверка работоспособности дампа в эмуляторе

Редкие мапперы: Famicom Jump II

Еще один интересный кейс — игра Famicom Jump II — Saikyou no 7 Nin. Она использует уникальный маппер 153, который не встречается в других проектах. Ниже представлен код для работы с этим специфическим железом:

// Маппер для игры Famicom Jump II - Saikyou no 7 Nin
class BANDAI_LZ93D50_WRAM_CHRRAM_PRGROM : IMapper
{
    public string Name { get => "153 BANDAI SRAM"; }
    public int Number { get => 153; }
    public int DefaultPrgSize { get => 512 * 1024; }
    public int DefaultChrSize { get => 0; }

    public void DumpPrg(IFamicomDumperConnection dumper, List<byte> data, int size)
    {
        var banks = size / 0x4000;
        for (var bank = 0; bank < banks; bank++)
        {
            Console.Write($"Reading PRG bank #{bank}/{banks}... ");
            var outerBank = (byte)((bank & 0x10) >> 4);
            dumper.WriteCpu(0x8000, outerBank);
            dumper.WriteCpu(0x8001, outerBank);
            dumper.WriteCpu(0x8002, outerBank);
            dumper.WriteCpu(0x8003, outerBank);

            dumper.WriteCpu(0x8008, (byte)(bank & 0xF));
            data.AddRange(dumper.ReadCpu(0x8000, 0x4000));
            Console.WriteLine("OK");
        }
    }
    public MirroringType GetMirroring(IFamicomDumperConnection dumper)
    {
        return MirroringType.MapperControlled;
    }
}
Запуск дампа Famicom Jump II в эмуляторе Mesen
Успешный запуск дампа в эмуляторе Mesen

Подводя итог, могу сказать, что текущая реализация полностью перекрывает мои потребности в исследовании ретро-железа. Если вы ищете функциональный и простой в сборке инструмент для работы с картриджами NES, проект ClusterM — отличный выбор.

Полезные ресурсы:

 

Источник

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