79 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			79 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								// Mapper 51
							 | 
						||
| 
								 | 
							
								void NES_mapper51::Reset()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  bank = 0;
							 | 
						||
| 
								 | 
							
								  mode = 1;
							 | 
						||
| 
								 | 
							
								  Sync_Prg_Banks();
							 | 
						||
| 
								 | 
							
								  parent_NES->ppu->vram_write_protect = 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void NES_mapper51::MemoryWriteSaveRAM(uint32 addr, uint8 data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  mode = ((data & 0x10) >> 3) | ((data & 0x02) >> 1);
							 | 
						||
| 
								 | 
							
								  Sync_Prg_Banks();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void NES_mapper51::MemoryWrite(uint32 addr, uint8 data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  bank = (data & 0x0f) << 2;
							 | 
						||
| 
								 | 
							
								  if(0xC000 <= addr && addr <= 0xDFFF)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    mode = (mode & 0x01) | ((data & 0x10) >> 3);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  Sync_Prg_Banks();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void NES_mapper51::Sync_Prg_Banks()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  switch(mode)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    case 0:
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        set_mirroring(NES_PPU::MIRROR_VERT);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank3(bank | 0x2c | 3);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank4(bank | 0x00 | 0);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank5(bank | 0x00 | 1);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank6(bank | 0x0c | 2);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank7(bank | 0x0c | 3);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    case 1:
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        set_mirroring(NES_PPU::MIRROR_VERT);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank3(bank | 0x20 | 3);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank4(bank | 0x00 | 0);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank5(bank | 0x00 | 1);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank6(bank | 0x00 | 2);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank7(bank | 0x00 | 3);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    case 2:
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        set_mirroring(NES_PPU::MIRROR_VERT);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank3(bank | 0x2e | 3);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank4(bank | 0x02 | 0);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank5(bank | 0x02 | 1);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank6(bank | 0x0e | 2);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank7(bank | 0x0e | 3);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    case 3:
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        set_mirroring(NES_PPU::MIRROR_HORIZ);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank3(bank | 0x20 | 3);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank4(bank | 0x00 | 0);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank5(bank | 0x00 | 1);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank6(bank | 0x00 | 2);
							 | 
						||
| 
								 | 
							
								        set_CPU_bank7(bank | 0x00 | 3);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      break;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								
							 |