Browse Source

Fix CHR ROM support in MMC1

master
Nathaniel Walizer 11 months ago
parent
commit
f1348367b6
8 changed files with 43 additions and 11 deletions
  1. +2
    -0
      src/cart.c
  2. +2
    -1
      src/ines.h
  3. +1
    -0
      src/map/cnrom.c
  4. +33
    -10
      src/map/mmc1.c
  5. +1
    -0
      src/map/mmc3.c
  6. +1
    -0
      src/map/nrom.c
  7. +1
    -0
      src/map/uxrom.c
  8. +2
    -0
      src/mapper.h

+ 2
- 0
src/cart.c View File

@@ -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);
}
}



+ 2
- 1
src/ines.h View File

@@ -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)


+ 1
- 0
src/map/cnrom.c View File

@@ -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,


+ 33
- 10
src/map/mmc1.c View File

@@ -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,


+ 1
- 0
src/map/mmc3.c View File

@@ -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,


+ 1
- 0
src/map/nrom.c View File

@@ -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,


+ 1
- 0
src/map/uxrom.c View File

@@ -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,


+ 2
- 0
src/mapper.h View File

@@ -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*);


Loading…
Cancel
Save