diff --git a/src/cart.c b/src/cart.c index 7de9313..7ed84b9 100644 --- a/src/cart.c +++ b/src/cart.c @@ -44,6 +44,8 @@ int nes_cart_init_mem(nes_cart* cart, void* mem, int len) { if (NULL == cart->mapper) { INES_ERR("No mapper found for type %d", index); status = -1; + } else if (NULL != cart->mapper->name) { + INES_INFO("Mapper: %s\n", cart->mapper->name); } } diff --git a/src/ines.h b/src/ines.h index f69c4cf..e12a0bb 100644 --- a/src/ines.h +++ b/src/ines.h @@ -9,7 +9,8 @@ #define INES_LOG(tag, fmt, ...) \ fprintf(stderr, tag ": iNES: " fmt "\n" __VA_OPT__(,) __VA_ARGS__) -#define INES_ERR(...) INES_LOG("E", __VA_ARGS__) +#define INES_ERR(...) INES_LOG("E", __VA_ARGS__) +#define INES_INFO(...) INES_LOG("I", __VA_ARGS__) #define ines_trainer_size (0x200U) diff --git a/src/map/cnrom.c b/src/map/cnrom.c index 5095152..e9c63ba 100644 --- a/src/map/cnrom.c +++ b/src/map/cnrom.c @@ -85,6 +85,7 @@ static void cnrom_chr_write(nes_mapper* nes_map, } nes_mapper mapper_cnrom = { + .name = "CNROM", .init = cnrom_init, .reset = cnrom_reset, .done = cnrom_done, diff --git a/src/map/mmc1.c b/src/map/mmc1.c index 0c51be6..24ce9ee 100644 --- a/src/map/mmc1.c +++ b/src/map/mmc1.c @@ -4,9 +4,10 @@ typedef struct { - // TODO: Does this even support CHR ROM? uint8_t* prg_rom; int prg_rom_banks; + uint8_t* chr_rom; + int chr_rom_banks; uint8_t reg_shift; uint8_t reg_n_shift; @@ -19,8 +20,10 @@ typedef struct { uint8_t* vram_bank[4]; uint8_t* prg_bank[2]; + uint8_t* chr_ram; + uint8_t* chr; + uint8_t vram[2][nes_vram_page_size]; - uint8_t chr[32][nes_chr_page_size]; uint8_t wram[nes_mem_wram_size]; } mmc1_mapper; @@ -54,12 +57,16 @@ static void mmc1_update_chr(mmc1_mapper* map) { if (!(map->reg_control & 0b10000)) { int bank = (map->reg_chr_0 & 0b11110); MAP_LOG("CHR: 8 KB: %d + %d", bank, bank + 1); - map->chr_bank[0] = map->chr[bank]; - map->chr_bank[1] = map->chr[bank + 1]; + map->chr_bank[0] = &map->chr[ bank * + nes_chr_page_size]; + map->chr_bank[1] = &map->chr[ (bank + 1) * + nes_chr_page_size]; } else { MAP_LOG("CHR: %d + %d", map->reg_chr_0, map->reg_chr_1); - map->chr_bank[0] = map->chr[map->reg_chr_0]; - map->chr_bank[1] = map->chr[map->reg_chr_1]; + map->chr_bank[0] = &map->chr[ map->reg_chr_0 * + nes_chr_page_size]; + map->chr_bank[1] = &map->chr[ map->reg_chr_1 * + nes_chr_page_size]; } } @@ -106,13 +113,27 @@ static int 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; + if (map->chr_rom_banks > 0) { + map->chr_rom = cart->chr_rom; + map->chr_ram = NULL; + map->chr = map->chr_rom; + } else { + map->chr_rom = NULL; + map->chr_ram = calloc(32, nes_chr_page_size); + map->chr = map->chr_ram; + } + mmc1_reset(nes_map); } return (NULL == map ? -1 : 0); } static void mmc1_done(nes_mapper* nes_map) { - free(nes_map->data); + if (NULL != nes_map->data) { + free(((mmc1_mapper*)nes_map->data)->chr_ram); + free(nes_map->data); + } } static inline uint8_t* mmc1_prg_addr(mmc1_mapper* map, @@ -148,7 +169,7 @@ static void mmc1_write(nes_mapper* nes_map, map->reg_control |= 0b01100; mmc1_update_prg(map); } else { - // TODO: Handle consective-cycle writes? + // TODO: Handle consecutive-cycle writes? int done = (map->reg_shift & 1); map->reg_shift = (map->reg_shift >> 1) | ((val & 1) << 4); @@ -192,8 +213,9 @@ static uint8_t* mmc1_chr_addr(nes_mapper* nes_map, static void mmc1_chr_write(nes_mapper* nes_map, uint16_t addr, uint8_t val) { - // TODO: Check if this is ROM? - *(mmc1_chr_addr(nes_map, addr)) = val; + if (NULL != ((mmc1_mapper*)nes_map->data)->chr_ram) { + *(mmc1_chr_addr(nes_map, addr)) = val; + } } static uint8_t* mmc1_vram_addr(nes_mapper* nes_map, @@ -206,6 +228,7 @@ static uint8_t* mmc1_vram_addr(nes_mapper* nes_map, nes_mapper mapper_mmc1 = { + .name = "MMC1", .init = mmc1_init, .reset = mmc1_reset, .done = mmc1_done, diff --git a/src/map/mmc3.c b/src/map/mmc3.c index 4dcb5d2..90babcb 100644 --- a/src/map/mmc3.c +++ b/src/map/mmc3.c @@ -308,6 +308,7 @@ static void mmc3_chr_write(nes_mapper* map, } nes_mapper mapper_mmc3 = { + .name = "MMC3", .init = mmc3_init, .reset = mmc3_reset, .done = mmc3_done, diff --git a/src/map/nrom.c b/src/map/nrom.c index 7859094..be83916 100644 --- a/src/map/nrom.c +++ b/src/map/nrom.c @@ -85,6 +85,7 @@ static void nrom_chr_write(nes_mapper* map, } nes_mapper mapper_nrom = { + .name = "NROM", .init = nrom_init, .reset = nrom_reset, .done = nrom_done, diff --git a/src/map/uxrom.c b/src/map/uxrom.c index d420fa5..3986a34 100644 --- a/src/map/uxrom.c +++ b/src/map/uxrom.c @@ -85,6 +85,7 @@ static void uxrom_chr_write(nes_mapper* nes_map, } nes_mapper mapper_uxrom = { + .name = "UxROM", .init = uxrom_init, .reset = uxrom_reset, .done = uxrom_done, diff --git a/src/mapper.h b/src/mapper.h index 8d415bc..2e66892 100644 --- a/src/mapper.h +++ b/src/mapper.h @@ -14,6 +14,8 @@ struct nes_cart_t; typedef struct nes_mapper_t { void* data; + const char* name; + int (*init)(struct nes_mapper_t*, struct nes_cart_t* cart); void (*reset)(struct nes_mapper_t*); void (*done)(struct nes_mapper_t*);