From 3c5d6fce77b0121f80c9cb978590efebfc17406f Mon Sep 17 00:00:00 2001 From: Nathaniel Walizer Date: Mon, 3 Feb 2025 22:21:45 -0600 Subject: [PATCH] Fix MMC1 PRG/CHR bank swap limits --- src/map/mmc1.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/map/mmc1.c b/src/map/mmc1.c index abc5e8b..7da9522 100644 --- a/src/map/mmc1.c +++ b/src/map/mmc1.c @@ -59,13 +59,15 @@ static void mmc1_update_vram(mmc1_mapper* map) { } static void mmc1_update_chr(mmc1_mapper* map) { + int n_banks = map->chr_rom_banks; + if (n_banks <= 0) n_banks = 32; int banks[2] = {0}; if (!(map->reg_control & 0b10000)) { - banks[0] = (map->reg_chr_0 & 0b11110); + banks[0] = (map->reg_chr_0 & 0b11110) % n_banks; banks[1] = banks[0] + 1; } else { - banks[0] = map->reg_chr_0; - banks[1] = map->reg_chr_1; + banks[0] = map->reg_chr_0 % n_banks; + banks[1] = map->reg_chr_1 % n_banks; } MAP_LOG("CHR: %d + %d", banks[0], banks[1]); @@ -80,7 +82,7 @@ static void mmc1_update_chr(mmc1_mapper* map) { static void mmc1_update_prg(mmc1_mapper* map) { // PRG ROM selection int mode = (map->reg_control >> 2) & 3; - int bank_0 = (map->reg_prg & 0b01111); + int bank_0 = (map->reg_prg & 0b01111) % map->prg_rom_banks; int bank_1 = bank_0; if (!(mode & 0b10)) { bank_0 = (bank_0 & 0b01110); @@ -115,7 +117,7 @@ static void* mmc1_init(nes_mapper* nes_map, nes_cart* cart) { if (NULL != map) { map->prg_rom = cart->prg_rom; map->prg_rom_banks = cart->prg_rom_banks; - map->chr_rom_banks = cart->chr_rom_banks / 2; + map->chr_rom_banks = cart->chr_rom_banks; if (map->chr_rom_banks > 0) { map->chr_rom = cart->chr_rom; map->chr = map->chr_rom;