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