Завершил исследования маппера KJ10A, обновил инфу выше. Он таки нормально шьется дампером, нужно только активировать прошивку через регистр (см. пост выше).
По итогу к сожалению ничего кроме MMC3 он не может, по сути просто аналог SMD133. Свободной PRG RAM у меня нет чтоб проверить нормально она работает или глючит как с SMD133.
В отличие от SMD133, который стартует в MMC3 режиме, этот стартует в своем NROM8K, по этому нормально не дампился как MMC3. Также у него нет поддержки NROM16K/NROM32K, но их можно сделать конфигурацией регистров MMC3. Также нельзя залочить запись в регистры маппера, одна надежда что игры не будут туда ничего писать. По прошивке видно, что китайцы типа пытались его лочить и включать NROM как в SMD133 записью 0x80/0x90 в R3, но по факту это бесполезно, в MMC3 режиме R3 вообще не используется, а режим устанавливается в R0.
Add: Закончил с тулзами, прошивается и работает
Изменения кода дампера:
const ushort RegBaseV1 = 0x4800;
public void DumpPrg(IFamicomDumperConnection dumper, List<byte> data, int size)
{
dumper.Reset();
version = DetectVersion(dumper);
UInt16 baseReg = (UInt16)(version == 2 ? 0x5000 : RegBaseV1);
int banks = size / 0x4000;
dumper.WriteCpu(baseReg, 0xa0);
dumper.WriteCpu(0x8000, 0x06, 0);
dumper.WriteCpu(0x8000, 0x07, 1);
for (var bank = 0; bank < banks; bank++)
{
var r0 = (byte)0xa0; // 16k PRG page
var r1 = (byte)((bank << 1) & 0xff);
var r2 = (byte)(bank >> 7);
var r3 = (byte)0;
dumper.WriteCpu(baseReg, r0, r1, r2, r3);
Console.Write("Reading PRG bank #" + bank + "/" + banks + "... ");
data.AddRange(dumper.ReadCpu(0x8000, 0x4000));
Console.WriteLine("OK");
}
}
И прошивальщика:
public static void SetCoolboyBank(IFamicomDumperConnectionExt dumper, int bank, ushort coolboyReg)
{
dumper.WriteCpu(coolboyReg, 0xA0); //enable MMC3 access
dumper.WriteCpu(0xA001, 0x00); //enable write signal
dumper.WriteCpu(0x8000, 0x06, 0);
dumper.WriteCpu(0x8000, 0x07, 1);
var r0 = (byte)0xE0; // 16k PRG page, block MMC3 access
var r1 = (byte)((bank << 1) & 0xff);
var r2 = (byte)(bank >> 7);
var r3 = (byte)0x0;
dumper.WriteCpu(coolboyReg, r0, r1, r2, r3);
}
Сборщик ромов в аттаче, иструкция в readme.txt
Upd: багфикс.