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++;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								
							 |