96 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								// Mapper 43
							 | 
						||
| 
								 | 
							
								void NES_mapper43::Reset()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  set_CPU_banks(2,1,0,4,9);
							 | 
						||
| 
								 | 
							
								  set_PPU_banks(0,1,2,3,4,5,6,7);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  //set_mirroring(NES_PPU::MIRROR_VERT);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  irq_enabled = 1;
							 | 
						||
| 
								 | 
							
								  irq_counter = 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint8 NES_mapper43::MemoryReadLow(uint32 addr)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  if(0x5000 <= addr && addr < 0x6000)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    return ROM_banks[0x2000*8 + 0x1000 + (addr - 0x5000)];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return (uint8)(addr >> 8);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void NES_mapper43::MemoryWriteLow(uint32 addr, uint8 data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  if((addr & 0xF0FF) == 0x4022)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    switch(data & 0x07)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      case 0x0:
							 | 
						||
| 
								 | 
							
								      case 0x2:
							 | 
						||
| 
								 | 
							
								      case 0x3:
							 | 
						||
| 
								 | 
							
								      case 0x4:
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          set_CPU_bank6(4);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      case 0x1:
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          set_CPU_bank6(3);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      case 0x5:
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          set_CPU_bank6(7);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      case 0x6:
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          set_CPU_bank6(5);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      case 0x7:
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          set_CPU_bank6(6);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void NES_mapper43::MemoryWrite(uint32 addr, uint8 data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  if(addr == 0x8122)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    if(data & 3)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      irq_enabled = 1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      irq_counter = 0;
							 | 
						||
| 
								 | 
							
								      irq_enabled = 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void NES_mapper43::HSync(uint32 scanline)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  if(irq_enabled)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    irq_counter += 114;
							 | 
						||
| 
								 | 
							
								    if(irq_counter >= 4096)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      irq_counter -= 4096;
							 | 
						||
| 
								 | 
							
								      parent_NES->cpu->DoIRQ();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								
							 |