BizHawk/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperFractalus.cs

97 lines
2.0 KiB
C#

using BizHawk.Common;
using BizHawk.Common.NumberExtensions;
namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
{
// Rescue on Fractalus has unique RAM mapping
public sealed class MapperFractalus : MapperBase
{
private byte[] RAM = new byte[0x800];
public override byte ReadMemory(ushort addr)
{
if (addr >= 0x1000 && addr < 0x1800)
{
//could be hsbios RAM here
if (Core._hsbios != null)
{
return Core._hsram[addr - 0x1000];
}
return 0xFF;
}
if (addr < 0x4000)
{
// could be either RAM mirror or ROM
if (addr >= 0x3000 && Core._hsbios != null)
{
return Core._hsbios[addr - 0x3000];
}
return Core.RAM[0x800 + addr & 0x7FF];
}
// cartridge and other OPSYS
if (Core._rom.Length >= 0x10000 - addr
&& Core.A7800_control_register.Bit(2))
{
return Core._rom[Core._rom.Length - (0x10000 - addr)];
}
if (addr >= 0x10000-Core._bios.Length && !Core.A7800_control_register.Bit(2))
{
return Core._bios[addr - (0x10000 - Core._bios.Length)];
}
if (addr >= 0x4000 && addr <0x5000)
{
int tempRet1 = ((addr >> 8) & 0xE) >> 1;
int tempRet2 = addr & 0xFF;
return RAM[(tempRet1 << 8) + tempRet2];
}
return 0x00;
}
public override void WriteMemory(ushort addr, byte value)
{
if (addr >= 0x1000 && addr < 0x1800)
{
//could be hsbios RAM here
if (Core._hsbios != null)
{
Core._hsram[addr - 0x1000] = value;
}
}
else if (addr < 0x4000)
{
// could be either RAM mirror or ROM
if (addr >= 0x3000 && Core._hsbios != null)
{
}
else
{
Core.RAM[0x800 + addr & 0x7FF] = value;
}
}
else
{
if (addr >= 0x4000 && addr < 0x5000)
{
int tempRet1 = ((addr >> 8) & 0xE) >> 1;
int tempRet2 = addr & 0xFF;
RAM[(tempRet1 << 8) + tempRet2] = value;
}
}
}
public override void SyncState(Serializer ser)
{
ser.Sync(nameof(RAM), ref RAM, false);
}
}
}