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