ROM для теста Chip ‘n Dale Rescue Rangers (U) [!].nes
ЧАСТЬ 2. Устройство уровней.
Вместо просмотра дампов памяти можно открыть ROM картриджа и попробовать найти в нём описания блоков для уровня. Делать это проще всего методом коррапта, основного инструмента начинающих ромхакеров - случайным образом менять значения байт и смотреть, что сломалось в игре.
Описания уровней идут начиная с 16 байта, сразу после заголовка NES. Экраны рисуются “строками” из блоков по 8 элементов, занимают 40 байт и расположены в памяти последовательно с нумерацией снизу вверх слева направо. Элементы являются индексами массива блоков размером 16x16 (то есть 2x2 игровых объекта).
Описания объектов хранятся отдельно и сами состоят из 4х байт, кодирующих номера тайлов в видеопамяти, и дополнительного байта, который кодирует старшие биты цвета для выбора из палитры (по 2 бита на каждый тайл). При скролле из игры каждый шаг игрока отрисовываются следующие 2 больших блока, а раз в 4 шага происходит скролл, как раз когда готов вертикальный столбец из 8 блоков. Всего в игре 278 экранов и несколько дополнительных (бонусный, глобальная карта, полет в космос между стадиями).
Чтобы было понятнее, тайл видеопамяти /объект уровня/строительный блок уровня: //
Дальше надо разобраться с алгоритмом вытаскивания старших бит цветов. Это место уже нашлось в ходе реверса функции горизонтального скроллинга - в отрисовке большого блока есть выборка 4х байт, для каждого из маленьких блоков по одному.
Начало таблицы маппится на адрес $BEE0 в памяти.
Палитру уровня можно взять из fceud (Tools->PPU viewer) и написать функцию замены цветов тайла по палитре, чтобы подмешать полученные цвета в уровень. Результат: остальные картинки
ЧАСТЬ 3. Описание объектов
$70 - счетчик активных предметов (враги, предметы в ящиках, скрытые бонусы и специальные объекты типа яблок или сундуков).
Ставим брейкпоинт на первое чтение при запуске уровня и останавливаемся на считывании кода врага.