89 lines
2.3 KiB
C#
89 lines
2.3 KiB
C#
using BizHawk.Common;
|
|
|
|
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|
{
|
|
//generally mapper7
|
|
|
|
[NES.INESBoardImplPriority]
|
|
public sealed class AxROM : NES.NESBoardBase
|
|
{
|
|
//configuration
|
|
bool bus_conflict;
|
|
int prg_mask_32k;
|
|
|
|
//state
|
|
int prg;
|
|
|
|
public override bool Configure(NES.EDetectionOrigin origin)
|
|
{
|
|
//configure
|
|
switch (Cart.board_type)
|
|
{
|
|
case "MAPPER007":
|
|
bus_conflict = false;
|
|
Cart.vram_size = 8;
|
|
break;
|
|
|
|
case "NES-ANROM": //marble madness
|
|
AssertPrg(128); AssertChr(0); AssertVram(8); AssertWram(0);
|
|
bus_conflict = false;
|
|
break;
|
|
|
|
case "NES-AN1ROM": //R.C. Pro-Am
|
|
AssertPrg(64); AssertChr(0); AssertVram(8); AssertWram(0);
|
|
bus_conflict = false;
|
|
break;
|
|
|
|
case "NES-AMROM": //time lord
|
|
case "HVC-AMROM":
|
|
//http://forums.nesdev.com/viewtopic.php?p=95438
|
|
//adding 723 cycles to FrameAdvance_ppudead() does indeed fix it
|
|
AssertPrg(128); AssertChr(0); AssertVram(8); AssertWram(0);
|
|
bus_conflict = false;
|
|
break;
|
|
|
|
case "NES-AOROM": //battletoads
|
|
case "HVC-AOROM":
|
|
AssertPrg(128, 256); AssertChr(0); AssertVram(8); AssertWram(0);
|
|
bus_conflict = false; //adelikat: I could not find an example of a game that needs bus conflicts, please enlightening me of a case where a game fails because of the lack of conflicts!
|
|
break;
|
|
|
|
case "ACCLAIM-AOROM": // wizards and warriors 3
|
|
AssertPrg(256); AssertChr(0); AssertVram(8); AssertWram(0);
|
|
bus_conflict = true; // not enough chips on the pcb to disable bus conflicts?
|
|
break;
|
|
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
prg_mask_32k = Cart.prg_size / 32 - 1;
|
|
SetMirrorType(NES.NESBoardBase.EMirrorType.OneScreenA);
|
|
|
|
return true;
|
|
}
|
|
|
|
public override byte ReadPRG(int addr)
|
|
{
|
|
return ROM[addr | prg << 15];
|
|
}
|
|
|
|
public override void WritePRG(int addr, byte value)
|
|
{
|
|
if (ROM != null && bus_conflict)
|
|
value = HandleNormalPRGConflict(addr,value);
|
|
prg = value & prg_mask_32k;
|
|
if ((value & 0x10) == 0)
|
|
SetMirrorType(NES.NESBoardBase.EMirrorType.OneScreenA);
|
|
else
|
|
SetMirrorType(NES.NESBoardBase.EMirrorType.OneScreenB);
|
|
}
|
|
|
|
public override void SyncState(Serializer ser)
|
|
{
|
|
base.SyncState(ser);
|
|
ser.Sync("prg",ref prg);
|
|
}
|
|
|
|
}
|
|
} |