| @@ -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 = { | |||