225 lines
3.9 KiB
C++
225 lines
3.9 KiB
C++
|
|
/////////////////////////////////////////////////////////////////////
|
|
// Mapper 160
|
|
void NES_mapper160::Reset()
|
|
{
|
|
// set CPU bank pointers
|
|
set_CPU_banks(0,1,num_8k_ROM_banks-2,num_8k_ROM_banks-1);
|
|
|
|
irq_enabled = 0;
|
|
irq_counter = 0;
|
|
irq_latch = 0;
|
|
refresh_type = 0;
|
|
}
|
|
|
|
void NES_mapper160::MemoryWrite(uint32 addr, uint8 data)
|
|
{
|
|
switch(addr)
|
|
{
|
|
case 0x8000:
|
|
{
|
|
set_CPU_bank4(data);
|
|
}
|
|
break;
|
|
|
|
case 0x8001:
|
|
{
|
|
set_CPU_bank5(data);
|
|
}
|
|
break;
|
|
|
|
case 0x8002:
|
|
{
|
|
set_CPU_bank6(data);
|
|
}
|
|
break;
|
|
|
|
case 0x9000:
|
|
{
|
|
if(data == 0x2B)
|
|
{
|
|
refresh_type = 1; // title
|
|
}
|
|
else if(data == 0xA8)
|
|
{
|
|
refresh_type = 2; // pass word
|
|
}
|
|
else if(data == 0x1F)
|
|
{
|
|
refresh_type = 3; // game over
|
|
}
|
|
else if(data == 0x7C)
|
|
{
|
|
refresh_type = 4; // continue
|
|
}
|
|
else if(data == 0x18)
|
|
{
|
|
refresh_type = 5; // roulette
|
|
}
|
|
else if(data == 0x60)
|
|
{
|
|
refresh_type = 6; // congratulation
|
|
}
|
|
else
|
|
{
|
|
refresh_type = 0;
|
|
}
|
|
set_PPU_bank0(data);
|
|
}
|
|
break;
|
|
|
|
case 0x9001:
|
|
{
|
|
set_PPU_bank1(data);
|
|
}
|
|
break;
|
|
|
|
case 0x9002:
|
|
{
|
|
if(refresh_type == 2 && data != 0xE8)
|
|
{
|
|
refresh_type = 0; // not pass word
|
|
}
|
|
set_PPU_bank2(data);
|
|
}
|
|
break;
|
|
|
|
case 0x9003:
|
|
{
|
|
set_PPU_bank3(data);
|
|
}
|
|
break;
|
|
|
|
case 0x9004:
|
|
{
|
|
set_PPU_bank4(data);
|
|
}
|
|
break;
|
|
|
|
case 0x9005:
|
|
{
|
|
set_PPU_bank5(data);
|
|
}
|
|
break;
|
|
|
|
case 0x9006:
|
|
{
|
|
set_PPU_bank6(data);
|
|
}
|
|
break;
|
|
|
|
case 0x9007:
|
|
{
|
|
set_PPU_bank7(data);
|
|
}
|
|
break;
|
|
|
|
case 0xC000:
|
|
{
|
|
irq_counter = irq_latch;
|
|
irq_enabled = irq_latch;
|
|
}
|
|
break;
|
|
|
|
case 0xC001:
|
|
{
|
|
irq_latch = data;
|
|
}
|
|
break;
|
|
|
|
case 0xC002:
|
|
{
|
|
irq_enabled = 0;
|
|
}
|
|
break;
|
|
|
|
case 0xC003:
|
|
{
|
|
irq_counter = data;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void NES_mapper160::HSync(uint32 scanline)
|
|
{
|
|
if(scanline == 0 || scanline == 239)
|
|
{
|
|
if(refresh_type == 1)
|
|
{
|
|
set_PPU_banks(0x58,0x59,0x5A,0x5B,0x58,0x59,0x5A,0x5B);
|
|
}
|
|
else if(refresh_type == 2)
|
|
{
|
|
set_PPU_banks(0x78,0x79,0x7A,0x7B,0x78,0x79,0x7A,0x7B);
|
|
}
|
|
else if(refresh_type == 3)
|
|
{
|
|
set_PPU_banks(0x7C,0x7D,0x7E,0x7F,0x7C,0x7D,0x7E,0x7F);
|
|
}
|
|
else if(refresh_type == 5)
|
|
{
|
|
set_PPU_banks(0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77);
|
|
}
|
|
else if(refresh_type == 6)
|
|
{
|
|
set_PPU_banks(0x5C,0x5D,0x5E,0x5F,0x7C,0x7D,0x7E,0x7F);
|
|
}
|
|
}
|
|
if(scanline == 64)
|
|
{
|
|
if(refresh_type == 4)
|
|
{
|
|
// face of lamp's spirit
|
|
if(parent_NES->ppu->PPU_VRAM_banks[8][32*10+16] == 0x0A)
|
|
{
|
|
set_PPU_bank0(0x68);
|
|
set_PPU_bank1(0x69);
|
|
set_PPU_bank2(0x6A);
|
|
set_PPU_bank3(0x6B);
|
|
}else{
|
|
set_PPU_bank0(0x6C);
|
|
set_PPU_bank1(0x6D);
|
|
set_PPU_bank2(0x6E);
|
|
set_PPU_bank3(0x6F);
|
|
}
|
|
}
|
|
}
|
|
if(scanline == 128)
|
|
{
|
|
if(refresh_type == 4)
|
|
{
|
|
set_PPU_bank0(0x68);
|
|
set_PPU_bank1(0x69);
|
|
set_PPU_bank2(0x6A);
|
|
set_PPU_bank3(0x6B);
|
|
}
|
|
else if(refresh_type == 5)
|
|
{
|
|
set_PPU_banks(0x74,0x75,0x76,0x77,0x74,0x75,0x76,0x77);
|
|
}
|
|
}
|
|
if(scanline == 160)
|
|
{
|
|
if(refresh_type == 6)
|
|
{
|
|
set_PPU_banks(0x60,0x61,0x5E,0x5F,0x7C,0x7D,0x7E,0x7F);
|
|
}
|
|
}
|
|
if(irq_enabled)
|
|
{
|
|
if(irq_counter == 0xFF)
|
|
{
|
|
parent_NES->cpu->DoIRQ();
|
|
irq_counter = 0;
|
|
irq_enabled = 0;
|
|
}
|
|
else
|
|
{
|
|
irq_counter++;
|
|
}
|
|
}
|
|
}
|
|
/////////////////////////////////////////////////////////////////////
|
|
|