Отладка меню довольно трудоемкая операция. Китайцы воровали и хачили меню друг у друга, писали меню сразу под несколько мапперов.
Вроде понятно как работает, написал lua скрипт, а оно не дампится
Подобным мозгоебством можно заниматься только из-за большой любви к конкретному рому.
Лучше начинать исследование с осмотра карика и микросхем его составляющих.
Нам повезло, маппер не на капле, а на стандартной логике.
Две микрухи ls161 и ls32. Сохранять данные, а значит переключать банки может только одна из них - ls161.
Качаем даташит на нее или ищем распиновку в интернете:
На входы 3,4,5,6 подается сигнал, запоминается и с выводов 14,13,12,11 снимается.
Вооружимся распиновкой карика
https://wiki.nesdev.com/w/index.php/Cartridge_connector, острым зрением и/или тестером,
отследим подается сигнал и куда уходит.
Сигнал подается с выводов 10,11,12,13 карика, это адресные линии процессора.
Уходит на адреса капель prg и chr. Какие именно адреса мы не знаем.
CPU A0 -> P0 161 -> CHR
CPU A1 -> P1 161 -> CHR
CPU A2 -> P2 161 -> CHR + PRG
CPU A3 -> P3 161 -> PRG
Получается что бы сдампить chr нам нужно в карик записать 2^3=8 значений по адресам с разными битами A0-A2.
Остальные биты значение не имеют. Как и записываемые данные. Переключение происходит только на основании адреса.
Данные которые надо записать мы прочитаем из этой же ячейки адреса, что бы избежать конфликта шин.
Получается на lua вот так:
WriteCpu(0x8000 + bank, ReadPrg(0x8000 + bank, 1))
Для дампа prg нужно записать 2^2=4 значений по адресам с разными битами A2-A3.
В lua нет битовых операций сдвига, но можно биты сдвинуть влево умножением на число 2 нужное количество раз.
WriteCpu(0x8000 + bank*2*2, ReadPrg(0x8000 + bank*2*2, 1))
Теперь разберемся с номером маппера.
Что бы преобразовать любой адрес в номер банка chr, нужно обнулить все биты кроме последних трех.
Для этого подходит логическое И над адресом и числом 7 или 0x07 или 0b00000111
A & 0x07
Для prg нужно обнулить биты кроме 2 и 3, а потом сдвинуть вправо на 3 бита.
(A & 0x0f) >> 2
или
(A >> 2) & 0x03
Скачиваем исходники fceux.
Все простенькие мапперы которые переключаются адресом собраны в файле fceux-2.2.2/src/boards/addrlatch.cpp.
Открываем его и ищем что-то подобное на математику выше.
Ура! Кажется такой маппер уже реализован
static void M217Sync(void) {
setprg32(0x8000, (latche >> 2) & 3);
setchr8(latche & 7);
}
Т.к. игры у нас на 32к prg то выбираем маппер 217, а не 214.
Еще можно поискать маппер на вики несдева, начинать копать вот отсюда
http://wiki.nesdev.com/w/index.php/MapperНо некоторые мапперы там не описаны, например наш
http://wiki.nesdev.com/w/index.php/INES_Mapper_217Итоговый lua файл:
--
-- Mapper # 217
-- addr latch: 74-161, 74-32
MapperName = "Mapper #217"
MapperNumber = 217
DefaultPrgSize = 4*0x8000
DefaultChrSize = 8*0x2000
function DumpPrg(size)
for b = 0, banks-1 do
WriteCpu(0x8000 + bank*2*2, ReadPrg(0x8000 + bank*2*2, 1))
print("Reading PRG bank #" .. tostring(b) .. "...")
ReadAddPrg(0x8000, 0x8000)
end
end
function DumpChr(size)
for b = 0, banks-1 do
WriteCpu(0x8000 + bank, ReadPrg(0x8000 + bank, 1))
print("Reading CHR bank #" .. tostring(b) .. "...")
ReadAddChr(0x0000, 0x2000)
end
end
function EnablePrgRam(size)
end
Файл нуждается в проверке, я его даже не запускал.