AxibugEmuOnline/References/VirtuaNESex_src_191105/NES/Mapper/BoardKS7030.cpp
2024-08-05 17:58:53 +08:00

97 lines
2.7 KiB
C++

//////////////////////////////////////////////////////////////////////////
// BoardKS7030 //
//////////////////////////////////////////////////////////////////////////
//code by CaH4e3 from fceumm
void BoardKS7030::Reset()
{
reg0 = reg1 = 0x1F;
SetBank();
}
void BoardKS7030::ExWrite( WORD addr, BYTE data )
{
if(addr==0x4025)
if(data&0x08) SetVRAM_Mirror( VRAM_HMIRROR );
else SetVRAM_Mirror( VRAM_VMIRROR );
}
BYTE BoardKS7030::ReadLow( WORD addr )
{
if((addr>=0x6000)&&(addr<=0x7FFF))
{
if ((addr >= 0x6000) && (addr <= 0x6BFF)) {
return DRAM[addr - 0x6000];
} else if ((addr >= 0x6C00) && (addr <= 0x6FFF)) {
return CPU_MEM_BANK[(0xC800+(addr-0x6C00))>>13][(0xC800+(addr-0x6C00))&0x1FFF];
} else if ((addr >= 0x7000) && (addr <= 0x7FFF)) {
return CPU_MEM_BANK[(0xB800+(addr-0x7000))>>13][(0xB800+(addr-0x7000))&0x1FFF];
}
}
return Mapper::ReadLow( addr );
}
void BoardKS7030::WriteLow( WORD addr, BYTE data )
{
if((addr>=0x6000)&&(addr<=0x7FFF))
{
if ((addr >= 0x6000) && (addr <= 0x6BFF)) {
DRAM[addr - 0x6000] = data;
} else if ((addr >= 0x6C00) && (addr <= 0x6FFF)) {
CPU_MEM_BANK[(0xC800+(addr-0x6C00))>>13][(0xC800+(addr-0x6C00))&0x1FFF] = data;
} else if ((addr >= 0x7000) && (addr <= 0x7FFF)) {
CPU_MEM_BANK[(0xB800+(addr-0x7000))>>13][(0xB800+(addr-0x7000))&0x1FFF] = data;
}
}
}
BYTE BoardKS7030::Read( WORD addr)
{
if((addr>=0xB800)&&(addr<=0xD7FF))
{
if ((addr >= 0xB800) && addr <= 0xBFFF) {
return DRAM[0x0C00 + (addr - 0xB800)];
} else if ((addr >= 0xC000) && addr <= 0xCBFF) {
return CPU_MEM_BANK[(0xCC00+(addr-0xC000))>>13][(0xCC00+(addr-0xC000))&0x1FFF];
} else if ((addr >= 0xCC00) && addr <= 0xD7FF) {
return DRAM[0x1400 + (addr - 0xCC00)];
}
}
return CPU_MEM_BANK[addr>>13][addr&0x1FFF];
}
void BoardKS7030::Write( WORD addr, BYTE data )
{
if((addr>=0x8000)&&(addr<=0x8FFF))
{
reg0 = addr & 0x07;
SetBank();
}
else if((addr>=0x9000)&&(addr<=0x9FFF))
{
reg1 = addr & 0x0F;
SetBank();
}
else if((addr>=0xB800)&&(addr<=0xD7FF))
{
if ((addr >= 0xB800) && (addr <= 0xBFFF)) {
DRAM[0x0C00 + (addr - 0xB800)] = data;
} else if ((addr >= 0xC000) && (addr <= 0xCBFF)) {
CPU_MEM_BANK[(0xCC00+(addr-0xC000))>>13][(0xCC00+(addr-0xC000))&0x1FFF] = data;
} else if ((addr >= 0xCC00) && (addr <= 0xD7FF)) {
DRAM[0x1400 + (addr - 0xCC00)] = data;
}
}
}
void BoardKS7030::SetBank()
{
SetPROM_32K_Bank(3);
SetCRAM_8K_Bank(0);
memcpy( &CPU_MEM_BANK[5][0x1800], PROM+(0x1000*(reg0%0x20))+0x0000, 0x0800);
memcpy( &CPU_MEM_BANK[6][0x0000], PROM+(0x1000*(reg0%0x20))+0x0800, 0x0800);
memcpy( &CPU_MEM_BANK[6][0x0800], PROM+(0x1000*((reg1+8)%0x20)), 0x1000);
}