BizHawk/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/AxROM.cs

119 lines
2.4 KiB
C#
Raw Normal View History

2011-02-28 09:39:24 +00:00
using System;
2011-03-01 09:32:12 +00:00
using System.IO;
2011-02-28 09:39:24 +00:00
using System.Diagnostics;
namespace BizHawk.Emulation.Consoles.Nintendo.Boards
{
//generally mapper7
2011-03-01 09:32:12 +00:00
//Battletoads
//Time Lord
//Marble Madness
2011-02-28 09:39:24 +00:00
public class AxROM : NES.NESBoardBase
{
2011-03-01 09:32:12 +00:00
//configuration
2011-02-28 09:39:24 +00:00
bool bus_conflict;
int cram_byte_mask;
2011-02-28 09:39:24 +00:00
int prg_mask;
2011-03-01 09:32:12 +00:00
//state
byte[] cram;
2011-02-28 09:39:24 +00:00
int prg;
public override bool Configure(NES.BootGodDB.Cart cart)
2011-02-28 09:39:24 +00:00
{
//configure
switch (cart.board_type)
2011-02-28 09:39:24 +00:00
{
case "NES-ANROM":
BoardInfo.PRG_Size = 128;
bus_conflict = false;
break;
case "NES-AN1ROM":
BoardInfo.PRG_Size = 64;
bus_conflict = false;
break;
case "NES-AMROM":
BoardInfo.PRG_Size = 128;
bus_conflict = true;
break;
case "NES-AOROM":
case "HVC-AOROM":
Assert(cart.prg_size == 128 || cart.prg_size == 256);
BoardInfo.PRG_Size = cart.prg_size;
bus_conflict = true; //MAYBE. apparently it varies
break;
default:
return false;
2011-02-28 09:39:24 +00:00
}
//these boards always have 8KB of CRAM
BoardInfo.CRAM_Size = 8;
cram = new byte[BoardInfo.CRAM_Size * 1024];
cram_byte_mask = cram.Length - 1;
2011-02-28 09:39:24 +00:00
prg_mask = (BoardInfo.PRG_Size / 16) - 1;
2011-03-02 03:05:28 +00:00
//validate
Assert(cart.prg_size == BoardInfo.PRG_Size);
2011-03-02 03:05:28 +00:00
2011-02-28 10:16:07 +00:00
//it is necessary to write during initialization to set the mirroring
2011-02-28 09:39:24 +00:00
WritePRG(0, 0);
return true;
2011-02-28 09:39:24 +00:00
}
public override byte ReadPRG(int addr)
{
return ROM[addr + (prg << 14)];
2011-02-28 09:39:24 +00:00
}
public override void WritePRG(int addr, byte value)
{
if (ROM != null && bus_conflict) value = HandleNormalPRGConflict(addr,value);
2011-03-02 03:05:28 +00:00
prg = (value*2) & prg_mask;
2011-02-28 09:39:24 +00:00
if ((value & 0x10) == 0)
SetMirrorType(NES.EMirrorType.OneScreenA);
else
SetMirrorType(NES.EMirrorType.OneScreenB);
}
public override byte ReadPPU(int addr)
{
if (addr < 0x2000)
{
return cram[addr & cram_byte_mask];
2011-02-28 09:39:24 +00:00
}
else return base.ReadPPU(addr);
}
public override void WritePPU(int addr, byte value)
{
if (addr < 0x2000)
{
cram[addr & cram_byte_mask] = value;
2011-02-28 09:39:24 +00:00
}
else base.WritePPU(addr,value);
}
2011-03-01 09:32:12 +00:00
public override void SaveStateBinary(BinaryWriter bw)
{
base.SaveStateBinary(bw);
bw.Write(prg);
Util.WriteByteBuffer(bw, cram);
}
public override void LoadStateBinary(BinaryReader br)
{
base.LoadStateBinary(br);
prg = br.ReadInt32();
cram = Util.ReadByteBuffer(br, false);
}
2011-02-28 09:39:24 +00:00
}
}