64 lines
1.6 KiB
C#
64 lines
1.6 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Diagnostics;
|
|
|
|
namespace BizHawk.Emulation.Consoles.Nintendo
|
|
{
|
|
//http://wiki.nesdev.com/w/index.php/INES_Mapper_044
|
|
public class Mapper044 : MMC3Board_Base
|
|
{
|
|
public override bool Configure(NES.EDetectionOrigin origin)
|
|
{
|
|
//analyze board type
|
|
switch (Cart.board_type)
|
|
{
|
|
case "MAPPER044":
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
BaseSetup();
|
|
|
|
return true;
|
|
}
|
|
|
|
public override void SyncState(Serializer ser)
|
|
{
|
|
base.SyncState(ser);
|
|
ser.Sync("block_select", ref block_select);
|
|
}
|
|
|
|
int block_select;
|
|
|
|
public override void WritePRG(int addr, byte value)
|
|
{
|
|
base.WritePRG(addr, value);
|
|
|
|
switch (addr & 0x6001)
|
|
{
|
|
case 0x2001: //$A001
|
|
block_select = value & 0x7;
|
|
break;
|
|
}
|
|
}
|
|
|
|
static readonly int[] PRG_AND = new int[] {0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0f };
|
|
static readonly int[] PRG_OR = new int[] { 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x60 };
|
|
static readonly int[] CHR_AND = new int[] { 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7f };
|
|
static readonly int[] CHR_OR = new int[] { 0x000, 0x080, 0x100, 0x180, 0x200, 0x280, 0x300, 0x300 };
|
|
|
|
protected override int Get_PRGBank_8K(int addr)
|
|
{
|
|
int bank_8k = mapper.Get_PRGBank_8K(addr);
|
|
return (bank_8k & PRG_AND[block_select]) | PRG_OR[block_select];
|
|
}
|
|
|
|
protected override int Get_CHRBank_1K(int addr)
|
|
{
|
|
int bank_1k = base.Get_CHRBank_1K(addr);
|
|
return (bank_1k & CHR_AND[block_select]) | CHR_OR[block_select];
|
|
}
|
|
|
|
}
|
|
} |