| @@ -6,6 +6,7 @@ typedef enum { | |||||
| mmc3_Flag_Horizontal = 0b00000001, | mmc3_Flag_Horizontal = 0b00000001, | ||||
| mmc3_Flag_IRQ_Enabled = 0b00000010, | mmc3_Flag_IRQ_Enabled = 0b00000010, | ||||
| mmc3_Flag_IRQ_Reload = 0b00000100, | mmc3_Flag_IRQ_Reload = 0b00000100, | ||||
| mmc3_Flag_CHR_RAM = 0b00001000, | |||||
| mmc3_Flag_WRAM_Protect = 0b01000000, | mmc3_Flag_WRAM_Protect = 0b01000000, | ||||
| mmc3_Flag_WRAM_Enabled = 0b10000000, | mmc3_Flag_WRAM_Enabled = 0b10000000, | ||||
| } mmc3_Flag; | } 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)); | mmc3_mapper* map = calloc(1, sizeof(mmc3_mapper)); | ||||
| nes_map->data = map; | nes_map->data = map; | ||||
| if (NULL != 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) ? | map->flags = (cart->flags & Cart_Flag_Horizontal) ? | ||||
| mmc3_Flag_Horizontal : 0; | 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 | | map->bank_select = mmc3_Bank_Select_PRG | | ||||
| mmc3_Bank_Select_CHR; | mmc3_Bank_Select_CHR; | ||||
| mmc3_reset(nes_map); | 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) { | 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, | 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]; | 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) { | 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 = { | nes_mapper mapper_mmc3 = { | ||||