From a05e7f28241d5338b0f3b214ad51c3b926f72a3f Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 19 Jul 2017 19:19:37 -0400 Subject: [PATCH] A7800Hawk: Start Super Game mappers --- .../Atari/A7800Hawk/Mappers/MapperSG.cs | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs new file mode 100644 index 0000000000..db327c8312 --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs @@ -0,0 +1,113 @@ +using BizHawk.Common; +using BizHawk.Common.NumberExtensions; +using System; + +namespace BizHawk.Emulation.Cores.Atari.A7800Hawk +{ + // Default mapper with no bank switching + // Just need to keep track of high score bios stuff + public class MapperSG : MapperBase + { + public byte bank = 0; + + 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; + } + else if (addr < 0x4000) + { + // could be either RAM mirror or ROM + if (addr >= 0x3000 && Core._hsbios != null) + { + return Core._hsbios[addr - 0x3000]; + } + else + { + return Core.RAM[0x800 + addr & 0x7FF]; + } + } + else + { + // cartridge and other OPSYS + if (addr >= (0x10000 - Core._bios.Length) && !Core.A7800_control_register.Bit(2)) + { + return Core._bios[addr - (0x10000 - Core._bios.Length)]; + } + else + { + if (addr >=0xC000) + { + // bank 7 is fixed + return Core._rom[Core._rom.Length - (0x10000 - addr)]; + } + else if (addr >= 0x8000) + { + // reutrn whatever bank is there + int temp_addr = addr - 0x8000; + + return Core._rom[temp_addr + bank * 0x4000]; + } + else + { + // return bank 6 + int temp_addr = addr - 0x4000; + return Core._rom[temp_addr + 6 * 0x4000]; + } + } + } + } + + public override byte PeekMemory(ushort addr) + { + return ReadMemory(addr); + } + + 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 + { + // cartridge and other OPSYS + if (addr>=0x8000) + { + bank = value; + } + } + } + + public override void PokeMemory(ushort addr, byte value) + { + WriteMemory(addr, value); + } + + public override void SyncState(Serializer ser) + { + ser.Sync("Bank", ref bank); + } + } +}