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;
|
2011-03-07 10:41:46 +00:00
|
|
|
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;
|
|
|
|
|
2011-03-07 10:41:46 +00:00
|
|
|
public override bool Configure(NES.BootGodDB.Cart cart)
|
2011-02-28 09:39:24 +00:00
|
|
|
{
|
2011-03-07 10:41:46 +00:00
|
|
|
//configure
|
|
|
|
switch (cart.board_type)
|
2011-02-28 09:39:24 +00:00
|
|
|
{
|
2011-03-07 10:41:46 +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
|
|
|
}
|
|
|
|
|
2011-03-07 10:41:46 +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
|
|
|
|
2011-03-07 10:41:46 +00:00
|
|
|
prg_mask = (BoardInfo.PRG_Size / 16) - 1;
|
2011-03-02 03:05:28 +00:00
|
|
|
|
2011-03-07 10:41:46 +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);
|
2011-03-07 10:41:46 +00:00
|
|
|
|
|
|
|
return true;
|
2011-02-28 09:39:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public override byte ReadPRG(int addr)
|
|
|
|
{
|
2011-03-07 10:41:46 +00:00
|
|
|
return ROM[addr + (prg << 14)];
|
2011-02-28 09:39:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public override void WritePRG(int addr, byte value)
|
|
|
|
{
|
2011-03-07 10:41:46 +00:00
|
|
|
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)
|
|
|
|
{
|
2011-03-07 10:41:46 +00:00
|
|
|
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)
|
|
|
|
{
|
2011-03-07 10:41:46 +00:00
|
|
|
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
|
|
|
}
|
|
|
|
}
|