BizHawk/quicknes/nes_emu/Mmc24.cpp

118 lines
2.5 KiB
C++

#include <cstring>
#include "Nes_Mapper.h"
#include "blargg_source.h"
#include "Mmc24.h"
class MMC2: public Nes_Mapper
{
byte regs[6]; // A,B,C,D,E,F
void mirror(byte val)
{
if (val & 1)
mirror_horiz();
else
mirror_vert();
}
public:
MMC2()
{
register_state(regs, sizeof(regs));
}
virtual void reset_state()
{
std::memset(regs, 0, sizeof(regs));
}
virtual void apply_mapping()
{
mirror(regs[5]);
set_prg_bank(0x8000, bank_8k, regs[0]);
set_prg_bank(0xa000, bank_8k, 13);
set_prg_bank(0xc000, bank_8k, 14);
set_prg_bank(0xe000, bank_8k, 15);
set_chr_bank(0x0000, bank_4k, regs[1]);
set_chr_bank(0x1000, bank_4k, regs[3]);
set_chr_bank_ex(0x0000, bank_4k, regs[2]);
set_chr_bank_ex(0x1000, bank_4k, regs[4]);
}
virtual void write(nes_time_t, nes_addr_t addr, int data)
{
switch (addr >> 12)
{
case 0xa: regs[0] = data; set_prg_bank(0x8000, bank_8k, data); break;
case 0xb: regs[1] = data; set_chr_bank(0x0000, bank_4k, data); break;
case 0xc: regs[2] = data; set_chr_bank_ex(0x0000, bank_4k, data); break;
case 0xd: regs[3] = data; set_chr_bank(0x1000, bank_4k, data); break;
case 0xe: regs[4] = data; set_chr_bank_ex(0x1000, bank_4k, data); break;
case 0xf: regs[5] = data; mirror(data); break;
}
}
};
class MMC4: public Nes_Mapper
{
byte regs[6]; // A,B,C,D,E,F
void mirror(byte val)
{
if (val & 1)
mirror_horiz();
else
mirror_vert();
}
public:
MMC4()
{
register_state(regs, sizeof(regs));
}
virtual void reset_state()
{
std::memset(regs, 0, sizeof(regs));
}
virtual void apply_mapping()
{
enable_sram();
mirror(regs[5]);
set_prg_bank(0x8000, bank_16k, regs[0]);
set_chr_bank(0x0000, bank_4k, regs[1]);
set_chr_bank(0x1000, bank_4k, regs[3]);
set_chr_bank_ex(0x0000, bank_4k, regs[2]);
set_chr_bank_ex(0x1000, bank_4k, regs[4]);
}
virtual void write(nes_time_t, nes_addr_t addr, int data)
{
switch (addr >> 12)
{
case 0xa: regs[0] = data; set_prg_bank(0x8000, bank_16k, data); break;
case 0xb: regs[1] = data; set_chr_bank(0x0000, bank_4k, data); break;
case 0xc: regs[2] = data; set_chr_bank_ex(0x0000, bank_4k, data); break;
case 0xd: regs[3] = data; set_chr_bank(0x1000, bank_4k, data); break;
case 0xe: regs[4] = data; set_chr_bank_ex(0x1000, bank_4k, data); break;
case 0xf: regs[5] = data; mirror(data); break;
}
}
};
void register_mmc24()
{
register_mapper<MMC2>(9);
register_mapper<MMC4>(10);
}