Вот исправленный ром
Изменение mirroring - костыль. Проблема в очистке PPU с адреса $21A0, указан размер 0x360, а нужно 0x220. В файле изменить 210: 20 85 15 A9 02 (было 60 85 15 A9 03).
Всё равно нужно писать с нуля движок игры и это тривиальная задача, на ASM даже проще, чем на C, по-моему. Аудио движок взять от FamiStudio, нужно только правильно вставить. Текст и картинки импортировать отдельной программой (например, на Python). Трудности будут, если нужна сложная система текста с переменными, условиями и т. п.
Для примера, я как-то дорабатывал простую галерею для NES, прикладываю (
asm6f отсюда). MMC3 для переключения CHR банков. Для VN не хватает: аудио; разбор и отображение текста; шрифт в отдельном CHR банке; больше nametable для с переключением PRG банков; и другое. Дополнительно можно: переключение CHR банков шрифта
с палитрой в обработчике прерываний MMC3, чтобы у картинок остались все тайлы и палитры; двойная буферизация (запись в разные части PPU и переключение без отключения рендера), чтобы экран не мигал; отключать рендер перед NMI, чтобы записать больше байтов в PPU для меньшей задержки смены экранов; сжатие nametable, текста.
Сразу я нашёл такой кривой VN движок на C
https://github.com/NathanGuilhot/VNES_Engine, думаю, что есть лучше.
UPD: В моём кода явно не указано, но код Reset должен начинаться с CPU $E000, в начале данные, которые смещают Reset.