From ef656a9f5d6f8f33e1290026b4c99386c3e5291d Mon Sep 17 00:00:00 2001 From: adelikat Date: Sun, 9 Aug 2015 13:41:45 -0400 Subject: [PATCH] Implement Mapper 244 (Decathlon) --- .../BizHawk.Emulation.Cores.csproj | 1 + .../Consoles/Nintendo/NES/Boards/Mapper244.cs | 78 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper244.cs diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 8a2ecc281d..489158fce0 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -558,6 +558,7 @@ + diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper244.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper244.cs new file mode 100644 index 0000000000..f8a15ec954 --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper244.cs @@ -0,0 +1,78 @@ +using System.Collections.Generic; +using BizHawk.Common; + +namespace BizHawk.Emulation.Cores.Nintendo.NES +{ + public class Mapper244 : NES.NESBoardBase + { + public override bool Configure(NES.EDetectionOrigin origin) + { + switch (Cart.board_type) + { + case "MAPPER244": + break; + default: + return false; + } + + return true; + } + + private List> prg_perm = new List> + { + new List { 0, 1, 2, 3, }, + new List { 3, 2, 1, 0, }, + new List { 0, 2, 1, 3, }, + new List { 3, 1, 2, 0, }, + }; + + private List> chr_perm = new List> + { + new List { 0, 1, 2, 3, 4, 5, 6, 7, }, + new List { 0, 2, 1, 3, 4, 6, 5, 7, }, + new List { 0, 1, 4, 5, 2, 3, 6, 7, }, + new List { 0, 4, 1, 5, 2, 6, 3, 7, }, + new List { 0, 4, 2, 6, 1, 5, 3, 7, }, + new List { 0, 2, 4, 6, 1, 3, 5, 7, }, + new List { 7, 6, 5, 4, 3, 2, 1, 0, }, + new List { 7, 6, 5, 4, 3, 2, 1, 0, } + }; + + private int _chrRegister = 0; + private int _prgRegister = 0; + + public override void SyncState(Serializer ser) + { + base.SyncState(ser); + ser.Sync("chrRegister", ref _chrRegister); + ser.Sync("prgRegister", ref _prgRegister); + } + + public override byte ReadPPU(int addr) + { + if (addr < 0x2000) + { + return VROM[(_chrRegister * 0x2000) + (addr & 0x1FFF)]; + } + + return base.ReadPPU(addr); + } + + public override byte ReadPRG(int addr) + { + return ROM[(_prgRegister * 0x8000) + (addr & 0x7FFF)]; + } + + public override void WritePRG(int addr, byte value) + { + if ((value & 0x08) > 0) + { + _chrRegister = chr_perm[(value >> 4) & 7][value & 7]; + } + else + { + _prgRegister = prg_perm[(value >> 4) & 3][value & 3]; + } + } + } +}