diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 2661109f08..bab896a280 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -623,6 +623,7 @@ + diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper162.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper162.cs new file mode 100644 index 0000000000..e1ac55fc65 --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper162.cs @@ -0,0 +1,79 @@ +using BizHawk.Common; + +namespace BizHawk.Emulation.Cores.Nintendo.NES +{ + public sealed class Mapper162 : NES.NESBoardBase + { + private ByteBuffer reg = new ByteBuffer(8); + private int prg_bank_mask_32k; + + public override bool Configure(NES.EDetectionOrigin origin) + { + switch (Cart.board_type) + { + case "MAPPER162": + case "UNIF_UNL-FS304": + break; + default: + return false; + } + + prg_bank_mask_32k = Cart.prg_size / 32 - 1; + + reg[0] = 3; + reg[3] = 7; + + return true; + } + + public override void Dispose() + { + reg.Dispose(); + base.Dispose(); + } + + public override void SyncState(Serializer ser) + { + ser.Sync("regs", ref reg); + base.SyncState(ser); + } + + public override void WriteEXP(int addr, byte value) + { + if (addr >= 0x1000) + { + reg[(addr >> 8) & 3] = value; + } + else + { + base.WriteEXP(addr, value); + } + } + + public override byte ReadPRG(int addr) + { + int bank = 0; + switch (reg[3] & 7) + { + case 0: + case 2: + bank = (reg[0] & 0xc) | (reg[1] & 2) | ((reg[2] & 0xf) << 4); + break; + case 1: + case 3: + bank = (reg[0] & 0xc) | (reg[2] & 0xf) << 4; + break; + case 4: + case 6: + bank = (reg[0] & 0xe) | ((reg[1] >> 1) & 1) | ((reg[2] & 0xf) << 4); + break; + case 5: + case 7: + bank = (reg[0] & 0xf) | ((reg[2] & 0xf) << 4); + break; + } + + return ROM[((bank & prg_bank_mask_32k) << 15) + addr]; + } + } +}