Browse Source

Add CHR RAM support to MMC3

master
Nathaniel Walizer 11 months ago
parent
commit
4f24086385
1 changed files with 24 additions and 8 deletions
  1. +24
    -8
      src/map/mmc3.c

+ 24
- 8
src/map/mmc3.c View File

@@ -6,6 +6,7 @@ typedef enum {
mmc3_Flag_Horizontal = 0b00000001,
mmc3_Flag_IRQ_Enabled = 0b00000010,
mmc3_Flag_IRQ_Reload = 0b00000100,
mmc3_Flag_CHR_RAM = 0b00001000,
mmc3_Flag_WRAM_Protect = 0b01000000,
mmc3_Flag_WRAM_Enabled = 0b10000000,
} mmc3_Flag;
@@ -157,12 +158,18 @@ static int mmc3_init(nes_mapper* nes_map, nes_cart* cart) {
mmc3_mapper* map = calloc(1, sizeof(mmc3_mapper));
nes_map->data = map;
if (NULL != map) {
map->prg_rom = cart->prg_rom;
map->prg_rom_banks = cart->prg_rom_banks * 2;
map->chr_rom = cart->chr_rom;
map->chr_rom_banks = cart->chr_rom_banks * 4;
map->flags = (cart->flags & Cart_Flag_Horizontal) ?
mmc3_Flag_Horizontal : 0;
map->prg_rom = cart->prg_rom;
map->prg_rom_banks = cart->prg_rom_banks * 2;
if (cart->chr_rom_banks <= 0) {
map->chr_rom = calloc(1024, 256);
map->chr_rom_banks = 256;
map->flags |= mmc3_Flag_CHR_RAM;
} else {
map->chr_rom = cart->chr_rom;
map->chr_rom_banks = cart->chr_rom_banks * 4;
}
map->bank_select = mmc3_Bank_Select_PRG |
mmc3_Bank_Select_CHR;
mmc3_reset(nes_map);
@@ -171,7 +178,13 @@ static int mmc3_init(nes_mapper* nes_map, nes_cart* cart) {
}

static void mmc3_done(nes_mapper* nes_map) {
free(nes_map->data);
mmc3_mapper* map = (mmc3_mapper*)nes_map->data;
if (NULL != map) {
if (map->flags & mmc3_Flag_CHR_RAM) {
free(map->chr_rom);
}
free(nes_map->data);
}
}

static inline uint8_t* mmc3_prg_addr(mmc3_mapper* map,
@@ -301,10 +314,13 @@ static uint8_t* mmc3_vram_addr(nes_mapper* nes_map,
return &map->vram_bank[(addr >> 10) & 3][addr & 0x3FFU];
}

static void mmc3_chr_write(nes_mapper* map,
static void mmc3_chr_write(nes_mapper* nes_map,
uint16_t addr, uint8_t val) {
// ROM only.
printf("CHR ROM Write: $%04x < %02x\n", addr, val);
mmc3_mapper* map = (mmc3_mapper*)nes_map->data;
if (map->flags & mmc3_Flag_CHR_RAM) {
*(mmc3_chr_addr(nes_map, addr)) = val;
}
// MAP_LOG("CHR ROM Write: $%04x < %02x\n", addr, val);
}

nes_mapper mapper_mmc3 = {


Loading…
Cancel
Save