Русская локализация Final Fantasy V для консоли SNES

Русская локализация Final Fantasy V для консоли SNES
Заводская плата картриджа до модификации

Картридж ревизии SHVC-F5 базируется на печатной плате SHVC-2J3B-01. В заводском исполнении на ней размещены две микросхемы масочного ПЗУ (MASKROM) общим объемом 2048 КБ, функционирующие в режиме HiROM. Также на борту присутствует статическое ОЗУ (SRAM) для сохранения игрового прогресса, запитанное от литиевой батарейки CR2032. Управление логикой выбора чипов реализовано на дешифраторах: 74LS139 отвечает за SRAM, а 74LS00 — за выборку ROM.

Схема декодирования ROM P0 и P1
Логическая схема декодера для чипов P0 и P1

Алгоритм работы декодера предельно прост: при обращении к адресам в пределах первого мегабайта (когда на линии A20 удерживается низкий уровень) активируется микросхема P0. Если адрес попадает в диапазон от 1 до 2 МБ (линия A20 в высоком состоянии), управление переходит к чипу P1.

Особенности подготовки ROM-файла

Процесс репро-программирования имеет свои тонкости. Локализованная версия игры (английский или русский перевод) значительно превосходит по объему японский оригинал. Если чистый образ «Final Fantasy V (Japan).sfc» занимает ровно 2048 КБ, то модифицированный файл с переводом разрастается до 2560 КБ. Кроме того, данная аппаратная конфигурация платы не поддерживается дампером Sanni Cardreader «из коробки», что требует внесения изменений в его прошивку.

Для корректной адресации 2,5 МБ данных мы применим техническую хитрость. Вместо штатной P0 будет установлена Flash-память 29F1610 (2 МБ), при этом ее адресную линию A20 необходимо соединить с линией A21 на слоте картриджа (удобнее всего это сделать через 14-й вывод микросхемы U4). Место P1 займет чип 29F800 объемом 1 МБ.

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

  1. P0.bin (1536 КБ): включает блоки данных из исходного файла по смещениям (0x000000 — 0x0FFFFF) и (0x200000 — 0x27FFFF).
  2. P1.bin (1024 КБ): включает блок данных (0x100000 — 0x1FFFFF).

Модификация ПО программатора (Sanni Cardreader)

Для работы с нестандартной распиновкой воспользуемся механизмом маппинга. Внесем изменения в исходный код файла Cart_Reader\FLASH.ino.

В тело функций writeByte_Flash и readByte_Flash добавим новые маппинги (221 и 223) для корректной записи P1 и P0 соответственно:

// Обработка A0-A7
PORTF = myAddress & 0xFF;
...
// Маппинг для SNES HiRom (2MB+1MB) — прошивка чипа P1
else if (mapping == 221) {
  PORTK = (myAddress >> 8) & 0xFF;  // A8-A15
  PORTL = (myAddress >> 16) & 0xFF; // A16-A23
  PORTL ^= (1 << 4);                // Переключение BA5(PL5) для выбора второго ROM
  PORTL |= (1 << 6);                // Деактивация SRAM через BA6(PL6)
}
// Маппинг для SNES ExHiRom (2MB+1MB) — прошивка чипа P0
else if (mapping == 223) {
  PORTK = (myAddress >> 8) & 0xFF;  // A8-A15
  PORTL = (myAddress >> 16) & 0xFF; // A16-A22
  // Программная коммутация A20 и A21
  if ((((myAddress >> 16) & 0xFF) & 0x10)) {
    PORTL |= (1 << 5);              // Активация A21
    PORTL &= ~(1 << 4);             // Сброс A20 для работы с P0
  } else {
    PORTL &= ~(1 << 5);             // Сброс A21
  }
}

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

Подготовка и запись чипа P0

Процесс прошивки первого чипа
Монтаж и подготовка чипа P0 к записи
  1. Изолируем вывод OE# (31) микросхемы MASKROM P0 от платы и подтягиваем его к Vcc.
  2. Соединяем технологическую площадку WE# с 27-м контактом SRAM.
  3. Вывод 43 (A20) микросхемы 29F1610 подключаем к 14-му выводу дешифратора U4 (74LS139).
  4. В интерфейсе Cardreader выбираем маппинг 223. В разделе "Flashrom Programmer" -> "8bit Flash" выполняем последовательно Erase, Blankcheck и Write (файл P0.bin).
  5. Верифицируем данные через операцию Read. Если контрольные суммы совпадают, возвращаем WE# на Vcc.

Подготовка и запись чипа P1

Процесс прошивки второго чипа
Нюансы подключения Flash-памяти 29F800
  1. Аналогично первой микросхеме, отключаем OE# (31) и соединяем с питанием.
  2. Стоит учесть, что распиновка 29F800 в части сигналов WE# и RST# отличается от 29F1610, поэтому штатные площадки адаптера не подойдут.
  3. Соединяем RST# (вывод 44) с Vcc.
  4. Линию WE# (вывод 43) временно подключаем к 27-му контакту SRAM.
  5. В настройках программатора устанавливаем маппинг 221 и прошиваем P1.bin.
  6. После успешной проверки (Read) фиксируем вывод 43 на линии Vcc.

Финальная сборка и тестирование

Модернизированная плата в сборе
Вид готовой платы после завершения всех паяльных работ
  1. Выполняем полный дамп картриджа для финальной сверки с образом.
  2. Проверяем напряжение на батарейке и при необходимости устанавливаем новый элемент CR2032.
  3. Собираем корпус и закручиваем фиксирующие винты.
Запуск на реальной консоли
Тестирование работоспособности на оригинальном железе SNES
Проверка перевода
Демонстрация корректной работы локализованной версии

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

 

Источник

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