Дамп видеосигнала в PPUPlayer

Как получить дамп видеосигнала PPU с помощью PPUPlayer и Nintendulator

Требования:

Первый запуск PPUPlayer

Запустить PPUPlayer:

Первый запуск PPUPlayer

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

Выбор ревизии PPU

Запустить PPUPlayer в «свободный полёт» (Run PPU). Перейти на вкладку Current Scan и убедиться, что PPU живой:

Вкладка Current Scan

Дамп состояния PPU в Nintendulator

Запустить какую-нибудь игру в Nintendulator, желательно без сложного маппера.

Открыть отладчик и сдампить всю память PPU:

Сохранение памяти PPU в Nintendulator

Получится файл с расширением .ppumem, который можно найти где-то в недрах вашей папки Users/AppData.

Загружаем состояние PPU в PPUPlayer

В меню PPU Dumps выбрать пункт Load Nintendulator PPU Dump и загрузить полученный в Nintendulator дамп памяти PPU.

Получится примерно такое:

Состояние PPU загружено

Но упс. Что-то не так.

Дело в том, что Nintendulator сохраняет только память PPU, но не сохраняет текущие значения регистров $2000 и $2001.

Особенно важен регистр $2000, в котором задаются адреса pattern table и размер спрайтов.

Чтобы это исправить, переходим на вкладку Debug и меняем значение регистра $2000 (для Contra нужно установить значение 0x30):

Установка регистра $2000

Получилось такое:

Исправленная картинка

Включить дамп видеосигнала

Осталось за малым.

В меню PPU Dumps нужно выбрать пункт Start video signal dump, указать файл — и после этого автоматически начнётся дамп в файл видеовыхода микросхемы PPU.

RAW-дамп

Есть возможность вместо видеосигнала PPU получать значение пикселей до схемы ЦАП:

Опция RAW-дампа

В этом случае будут дампиться значения uint16_t следующего формата:

/// <summary>
/// Raw PPU color, which is obtained from the PPU circuits BEFORE the video signal generator.
/// The user can switch the PPUSim video output to use "raw" color, instead of the original (Composite/RGB).
/// </summary>
union RAWOut
{
    struct
    {
        unsigned CC0 : 1;   // Chroma (CB[0-3])
        unsigned CC1 : 1;
        unsigned CC2 : 1;
        unsigned CC3 : 1;
        unsigned LL0 : 1;   // Luma (CB[4-5])
        unsigned LL1 : 1;
        unsigned TR : 1;    // "Tint Red", $2001[5]
        unsigned TG : 1;    // "Tint Green", $2001[6]
        unsigned TB : 1;    // "Tint Blue", $2001[7]
        unsigned Sync : 1;  // 1: Sync level
    };
    uint16_t raw;
} RAW;

Заключение

PPUPlayer стал мощным инструментом в изучении PPU. Внутри него живёт настоящий живой PPU.

Не стесняйтесь тыкать разные кнопочки в PPUPlayer и экспериментировать. Если что — имеется также презентация.

Источник: Wiki/DumpVideoSignalRus.md · по теме: Инструменты, PPUSim