BizHawk/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper015.cs

108 lines
2.8 KiB
C#
Raw Normal View History

using BizHawk.Common;
2014-07-03 17:23:03 +00:00
using BizHawk.Common.NumberExtensions;
2017-06-03 01:13:44 +00:00
using System;
2013-11-14 13:15:41 +00:00
namespace BizHawk.Emulation.Cores.Nintendo.NES
2012-06-19 21:23:24 +00:00
{
public sealed class Mapper015 : NES.NESBoardBase
2012-06-19 21:23:24 +00:00
{
//configuration
int prg_bank_mask_8k;
//state
ByteBuffer prg_banks_8k = new ByteBuffer(4);
public override bool Configure(NES.EDetectionOrigin origin)
{
//configure
switch (Cart.board_type)
{
case "MAPPER015":
break;
default:
return false;
}
2012-06-20 22:24:56 +00:00
prg_bank_mask_8k = (Cart.prg_size / 8) - 1;
2012-06-19 21:23:24 +00:00
2017-06-03 01:13:44 +00:00
// not a maskable size (BF=10111111)
// so just set mask to FF and hope for the best
if (Cart.prg_size==192)
{
prg_bank_mask_8k = 0xFF;
}
2012-06-19 21:23:24 +00:00
prg_banks_8k[0] = 0;
prg_banks_8k[1] = 1;
prg_banks_8k[2] = 2;
prg_banks_8k[3] = 3;
ApplyMemoryMapMask(prg_bank_mask_8k, prg_banks_8k);
2017-06-03 01:13:44 +00:00
SetMirrorType(EMirrorType.Horizontal);
2012-06-19 21:23:24 +00:00
return true;
}
public override void Dispose()
{
prg_banks_8k.Dispose();
base.Dispose();
}
2012-06-19 21:23:24 +00:00
public override byte ReadPRG(int addr)
{
addr = ApplyMemoryMap(13, prg_banks_8k, addr);
return ROM[addr];
}
public override void WritePRG(int addr, byte value)
{
int mode = addr & 3;
int prg_high = value & 0x3F;
bool prg_low = value.Bit(7);
2016-08-31 14:53:15 +00:00
int prg_low_val = 0;
if (mode==2)
prg_low_val = prg_low ? 1 : 0;
2012-06-19 21:23:24 +00:00
bool mirror = value.Bit(6);
2017-06-03 01:13:44 +00:00
SetMirrorType(mirror ? EMirrorType.Horizontal : EMirrorType.Vertical);
2012-06-19 21:23:24 +00:00
switch(mode)
{
case 0:
prg_banks_8k[0] = (byte)((prg_high * 2 + 0) ^ prg_low_val);
prg_banks_8k[1] = (byte)((prg_high * 2 + 1) ^ prg_low_val);
2016-08-31 14:53:15 +00:00
prg_high = prg_high | 0x01;
prg_banks_8k[2] = (byte)((prg_high * 2 + 0) ^ prg_low_val);
prg_banks_8k[3] = (byte)((prg_high * 2 + 1) ^ prg_low_val);
2012-06-19 21:23:24 +00:00
break;
case 1:
prg_banks_8k[0] = (byte)((prg_high*2+0) ^ prg_low_val);
prg_banks_8k[1] = (byte)((prg_high*2+1) ^ prg_low_val);
prg_banks_8k[2] = (byte)(0xFE);
prg_banks_8k[3] = (byte)(0xFF);
//maybe all 4?
break;
case 2:
prg_banks_8k[0] = (byte)((prg_high * 2 + 0) ^ prg_low_val);
prg_banks_8k[1] = (byte)((prg_high * 2 + 0) ^ prg_low_val);
prg_banks_8k[2] = (byte)((prg_high * 2 + 0) ^ prg_low_val);
prg_banks_8k[3] = (byte)((prg_high * 2 + 0) ^ prg_low_val);
break;
case 3:
prg_banks_8k[0] = (byte)((prg_high * 2 + 0) ^ prg_low_val);
prg_banks_8k[1] = (byte)((prg_high * 2 + 1) ^ prg_low_val);
prg_banks_8k[2] = (byte)((prg_high * 2 + 0) ^ prg_low_val);
prg_banks_8k[3] = (byte)((prg_high * 2 + 1) ^ prg_low_val);
break;
}
2012-06-20 22:24:56 +00:00
ApplyMemoryMapMask(prg_bank_mask_8k, prg_banks_8k);
}
2012-06-19 21:23:24 +00:00
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("prg_banks_8k", ref prg_banks_8k);
}
}
}