112 lines
2.7 KiB
C#
112 lines
2.7 KiB
C#
using System.IO;
|
|
|
|
namespace MyNes.Core
|
|
{
|
|
[BoardInfo("VRC3", 73)]
|
|
internal class Mapper073 : Board
|
|
{
|
|
private bool irq_mode_8;
|
|
|
|
private bool irq_enable;
|
|
|
|
private bool irq_enable_on_ak;
|
|
|
|
private int irq_reload;
|
|
|
|
private int irq_counter;
|
|
|
|
internal override void HardReset()
|
|
{
|
|
base.HardReset();
|
|
Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000);
|
|
irq_mode_8 = false;
|
|
irq_enable = false;
|
|
irq_enable_on_ak = false;
|
|
irq_reload = 0;
|
|
irq_counter = 0;
|
|
}
|
|
|
|
internal override void WritePRG(ref ushort address, ref byte data)
|
|
{
|
|
switch (address & 0xF000)
|
|
{
|
|
case 32768:
|
|
irq_reload = (irq_reload & 0xFFF0) | (data & 0xF);
|
|
break;
|
|
case 36864:
|
|
irq_reload = (irq_reload & 0xFF0F) | ((data & 0xF) << 4);
|
|
break;
|
|
case 40960:
|
|
irq_reload = (irq_reload & 0xF0FF) | ((data & 0xF) << 8);
|
|
break;
|
|
case 45056:
|
|
irq_reload = (irq_reload & 0xFFF) | ((data & 0xF) << 12);
|
|
break;
|
|
case 49152:
|
|
irq_mode_8 = (data & 4) == 4;
|
|
irq_enable = (data & 2) == 2;
|
|
irq_enable_on_ak = (data & 1) == 1;
|
|
if (irq_enable)
|
|
{
|
|
irq_counter = irq_reload;
|
|
}
|
|
NesEmu.IRQFlags &= -9;
|
|
break;
|
|
case 53248:
|
|
irq_enable = irq_enable_on_ak;
|
|
NesEmu.IRQFlags &= -9;
|
|
break;
|
|
case 61440:
|
|
Switch16KPRG(data & 0xF, PRGArea.Area8000);
|
|
break;
|
|
}
|
|
}
|
|
|
|
internal override void OnCPUClock()
|
|
{
|
|
if (!irq_enable)
|
|
{
|
|
return;
|
|
}
|
|
if (irq_mode_8)
|
|
{
|
|
irq_counter = (irq_counter & 0xFF00) | (byte)((irq_counter & 0xFF) + 1);
|
|
if ((byte)(irq_counter & 0xFF) == byte.MaxValue)
|
|
{
|
|
NesEmu.IRQFlags |= 8;
|
|
irq_counter = (irq_counter & 0xFF00) | (irq_reload & 0xFF);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
irq_counter++;
|
|
if (irq_counter == 65535)
|
|
{
|
|
NesEmu.IRQFlags |= 8;
|
|
irq_counter = irq_reload;
|
|
}
|
|
}
|
|
}
|
|
|
|
internal override void WriteStateData(ref BinaryWriter stream)
|
|
{
|
|
base.WriteStateData(ref stream);
|
|
stream.Write(irq_mode_8);
|
|
stream.Write(irq_enable);
|
|
stream.Write(irq_enable_on_ak);
|
|
stream.Write(irq_reload);
|
|
stream.Write(irq_counter);
|
|
}
|
|
|
|
internal override void ReadStateData(ref BinaryReader stream)
|
|
{
|
|
base.ReadStateData(ref stream);
|
|
irq_mode_8 = stream.ReadBoolean();
|
|
irq_enable = stream.ReadBoolean();
|
|
irq_enable_on_ak = stream.ReadBoolean();
|
|
irq_reload = stream.ReadInt32();
|
|
irq_counter = stream.ReadInt32();
|
|
}
|
|
}
|
|
}
|