forked from sin365/AxibugEmuOnline
72 lines
1.6 KiB
C#
72 lines
1.6 KiB
C#
using System.IO;
|
|
|
|
namespace MyNes.Core
|
|
{
|
|
[BoardInfo("FDS-Port - Alt. Levels", 50)]
|
|
internal class Mapper050 : Board
|
|
{
|
|
private int prg_page;
|
|
|
|
private int irq_counter;
|
|
|
|
private bool irq_enabled;
|
|
|
|
internal override void HardReset()
|
|
{
|
|
base.HardReset();
|
|
Switch08KPRG(15, PRGArea.Area6000);
|
|
Switch08KPRG(8, PRGArea.Area8000);
|
|
Switch08KPRG(9, PRGArea.AreaA000);
|
|
Switch08KPRG(11, PRGArea.AreaE000);
|
|
}
|
|
|
|
internal override void WriteEX(ref ushort address, ref byte data)
|
|
{
|
|
switch (address & 0x4120)
|
|
{
|
|
case 16416:
|
|
prg_page = (data & 8) | ((data & 1) << 2) | ((data >> 1) & 3);
|
|
Switch08KPRG(prg_page, PRGArea.AreaC000);
|
|
break;
|
|
case 16672:
|
|
irq_enabled = (data & 1) == 1;
|
|
if (!irq_enabled)
|
|
{
|
|
irq_counter = 0;
|
|
NesEmu.IRQFlags &= -9;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
internal override void OnCPUClock()
|
|
{
|
|
if (irq_enabled)
|
|
{
|
|
irq_counter++;
|
|
if (irq_counter == 4096)
|
|
{
|
|
NesEmu.IRQFlags |= 8;
|
|
irq_counter = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
internal override void WriteStateData(ref BinaryWriter stream)
|
|
{
|
|
base.WriteStateData(ref stream);
|
|
stream.Write(prg_page);
|
|
stream.Write(irq_counter);
|
|
stream.Write(irq_enabled);
|
|
}
|
|
|
|
internal override void ReadStateData(ref BinaryReader stream)
|
|
{
|
|
base.ReadStateData(ref stream);
|
|
prg_page = stream.ReadInt32();
|
|
irq_counter = stream.ReadInt32();
|
|
irq_enabled = stream.ReadBoolean();
|
|
}
|
|
}
|
|
}
|