BizHawk/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper040.cs

84 lines
1.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Consoles.Nintendo
{
// smb2j (us pirate)
public class Mapper040 : NES.NESBoardBase
{
int prg = 0;
int irqcnt = 0;
bool irqactive = false;
public override bool Configure(NES.EDetectionOrigin origin)
{
switch (Cart.board_type)
{
case "MAPPER040":
AssertChr(8); AssertPrg(64); AssertVram(0); AssertWram(0);
break;
default:
return false;
}
SetMirrorType(Cart.pad_h, Cart.pad_v);
return true;
}
public override byte ReadWRAM(int addr)
{
// bank 6 fixed
return ROM[addr + 0xc000];
}
public override byte ReadPRG(int addr)
{
if ((addr & 0x6000) == 0x4000)
addr += prg;
return ROM[addr + 0x8000];
}
public override void WritePRG(int addr, byte value)
{
switch (addr & 0x6000)
{
case 0x0000:
irqcnt = 0;
IRQSignal = false;
irqactive = false;
break;
case 0x2000:
irqactive = true;
break;
case 0x6000:
prg = value & 7; // bank number
// adjust for easy usage
prg *= 0x2000;
prg -= 0xc000;
break;
}
}
public override void ClockCPU()
{
if (irqactive)
{
irqcnt++;
if (irqcnt >= 4096)
{
irqcnt = 4096;
IRQSignal = true;
}
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("prg", ref prg);
ser.Sync("irqcnt", ref irqcnt);
ser.Sync("irqactive", ref irqactive);
}
}
}