110 lines
2.6 KiB
C#
110 lines
2.6 KiB
C#
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
// Mapper051 11-in-1 //
|
|||
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
using static VirtualNes.MMU;
|
|||
|
using static VirtualNes.Core.CPU;
|
|||
|
using INT = System.Int32;
|
|||
|
using BYTE = System.Byte;
|
|||
|
using System;
|
|||
|
using Codice.CM.Client.Differences;
|
|||
|
|
|||
|
namespace VirtualNes.Core
|
|||
|
{
|
|||
|
public class Mapper051 : Mapper
|
|||
|
{
|
|||
|
int mode, bank;
|
|||
|
public Mapper051(NES parent) : base(parent)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
public override void Reset()
|
|||
|
{
|
|||
|
bank = 0;
|
|||
|
mode = 1;
|
|||
|
|
|||
|
SetBank_CPU();
|
|||
|
SetCRAM_8K_Bank(0);
|
|||
|
}
|
|||
|
|
|||
|
//void Mapper051::WriteLow(WORD addr, BYTE data)
|
|||
|
public override void WriteLow(ushort addr, byte data)
|
|||
|
{
|
|||
|
if (addr >= 0x6000)
|
|||
|
{
|
|||
|
mode = ((data & 0x10) >> 3) | ((data & 0x02) >> 1);
|
|||
|
SetBank_CPU();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//void Mapper051::Write(WORD addr, BYTE data)
|
|||
|
public override void Write(ushort addr, byte data)
|
|||
|
{
|
|||
|
bank = (data & 0x0f) << 2;
|
|||
|
if (0xC000 <= addr && addr <= 0xDFFF)
|
|||
|
{
|
|||
|
mode = (mode & 0x01) | ((data & 0x10) >> 3);
|
|||
|
}
|
|||
|
SetBank_CPU();
|
|||
|
}
|
|||
|
|
|||
|
void SetBank_CPU()
|
|||
|
{
|
|||
|
switch (mode)
|
|||
|
{
|
|||
|
case 0:
|
|||
|
SetVRAM_Mirror(VRAM_VMIRROR);
|
|||
|
SetPROM_8K_Bank(3, (bank | 0x2c | 3));
|
|||
|
SetPROM_8K_Bank(4, (bank | 0x00 | 0));
|
|||
|
SetPROM_8K_Bank(5, (bank | 0x00 | 1));
|
|||
|
SetPROM_8K_Bank(6, (bank | 0x0c | 2));
|
|||
|
SetPROM_8K_Bank(7, (bank | 0x0c | 3));
|
|||
|
break;
|
|||
|
case 1:
|
|||
|
SetVRAM_Mirror(VRAM_VMIRROR);
|
|||
|
SetPROM_8K_Bank(3, (bank | 0x20 | 3));
|
|||
|
SetPROM_8K_Bank(4, (bank | 0x00 | 0));
|
|||
|
SetPROM_8K_Bank(5, (bank | 0x00 | 1));
|
|||
|
SetPROM_8K_Bank(6, (bank | 0x00 | 2));
|
|||
|
SetPROM_8K_Bank(7, (bank | 0x00 | 3));
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
SetVRAM_Mirror(VRAM_VMIRROR);
|
|||
|
SetPROM_8K_Bank(3, (bank | 0x2e | 3));
|
|||
|
SetPROM_8K_Bank(4, (bank | 0x02 | 0));
|
|||
|
SetPROM_8K_Bank(5, (bank | 0x02 | 1));
|
|||
|
SetPROM_8K_Bank(6, (bank | 0x0e | 2));
|
|||
|
SetPROM_8K_Bank(7, (bank | 0x0e | 3));
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
SetVRAM_Mirror(VRAM_HMIRROR);
|
|||
|
SetPROM_8K_Bank(3, (bank | 0x20 | 3));
|
|||
|
SetPROM_8K_Bank(4, (bank | 0x00 | 0));
|
|||
|
SetPROM_8K_Bank(5, (bank | 0x00 | 1));
|
|||
|
SetPROM_8K_Bank(6, (bank | 0x00 | 2));
|
|||
|
SetPROM_8K_Bank(7, (bank | 0x00 | 3));
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//void Mapper051::SaveState(LPBYTE p)
|
|||
|
public override void SaveState(byte[] p)
|
|||
|
{
|
|||
|
p[0] = (byte)mode;
|
|||
|
p[1] = (byte)bank;
|
|||
|
}
|
|||
|
|
|||
|
//void Mapper051::LoadState(LPBYTE p)
|
|||
|
public override void LoadState(byte[] p)
|
|||
|
{
|
|||
|
mode = p[0];
|
|||
|
bank = p[1];
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public override bool IsStateSave()
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|