2013-11-04 00:36:15 +00:00
|
|
|
|
using BizHawk.Common;
|
|
|
|
|
|
2013-11-14 13:15:41 +00:00
|
|
|
|
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
2011-03-21 04:23:55 +00:00
|
|
|
|
{
|
2011-09-26 08:05:17 +00:00
|
|
|
|
//AKA mapper 184
|
|
|
|
|
//Sunsoft-1 chips, EXCEPT for fantasy zone.
|
|
|
|
|
//this is confusing. see docs/sunsoft.txt
|
2013-08-25 01:08:17 +00:00
|
|
|
|
public sealed class Sunsoft1 : NES.NESBoardBase
|
2011-09-20 01:07:24 +00:00
|
|
|
|
{
|
|
|
|
|
int chr_mask;
|
|
|
|
|
int left_piece = 0;
|
|
|
|
|
int right_piece = 3;
|
2011-03-21 04:23:55 +00:00
|
|
|
|
|
2011-09-20 01:07:24 +00:00
|
|
|
|
public override bool Configure(NES.EDetectionOrigin origin)
|
|
|
|
|
{
|
|
|
|
|
//configure
|
2011-03-21 06:03:58 +00:00
|
|
|
|
switch (Cart.board_type)
|
|
|
|
|
{
|
2012-03-22 06:20:10 +00:00
|
|
|
|
case "MAPPER184":
|
|
|
|
|
break;
|
|
|
|
|
|
2011-03-21 06:03:58 +00:00
|
|
|
|
case "SUNSOFT-1":
|
2011-09-26 08:05:17 +00:00
|
|
|
|
//this will catch fantasy zone, which isn't emulated the same as the other SUNSOFT-1 boards
|
|
|
|
|
if (Cart.pcb == "SUNSOFT-4")
|
|
|
|
|
return false;
|
2011-03-21 06:03:58 +00:00
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2011-09-20 01:07:24 +00:00
|
|
|
|
chr_mask = (Cart.chr_size / 4) - 1;
|
|
|
|
|
SetMirrorType(Cart.pad_h, Cart.pad_v);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2011-03-21 04:23:55 +00:00
|
|
|
|
|
2011-09-26 08:05:17 +00:00
|
|
|
|
|
|
|
|
|
|
2011-09-20 01:07:24 +00:00
|
|
|
|
public override byte ReadPPU(int addr)
|
|
|
|
|
{
|
2011-03-21 04:23:55 +00:00
|
|
|
|
|
2011-09-20 01:07:24 +00:00
|
|
|
|
if (addr < 0x1000)
|
|
|
|
|
{
|
|
|
|
|
return VROM[(addr & 0xFFF) + (left_piece * 0x1000)];
|
|
|
|
|
}
|
|
|
|
|
else if (addr < 0x2000)
|
|
|
|
|
{
|
|
|
|
|
return VROM[(addr & 0xFFF) + (right_piece * 0x1000)];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return base.ReadPPU(addr);
|
|
|
|
|
}
|
2011-04-17 20:20:49 +00:00
|
|
|
|
|
2011-09-20 01:07:24 +00:00
|
|
|
|
public override void WriteWRAM(int addr, byte value)
|
|
|
|
|
{
|
|
|
|
|
left_piece = value & 7 & chr_mask;
|
|
|
|
|
right_piece = (value >> 4) & 7 & chr_mask;
|
|
|
|
|
}
|
2011-04-17 20:56:35 +00:00
|
|
|
|
|
2011-04-17 22:51:53 +00:00
|
|
|
|
public override void SyncState(Serializer ser)
|
2011-09-20 01:07:24 +00:00
|
|
|
|
{
|
2011-04-17 22:51:53 +00:00
|
|
|
|
base.SyncState(ser);
|
2011-09-20 01:07:24 +00:00
|
|
|
|
ser.Sync("left_piece", ref left_piece);
|
|
|
|
|
ser.Sync("right_piece", ref right_piece);
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-03-21 04:23:55 +00:00
|
|
|
|
}
|