diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesControllerDeck.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesControllerDeck.cs index 998d70a17e..46728237c5 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesControllerDeck.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesControllerDeck.cs @@ -219,6 +219,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES .SelectMany(i => Buttons .OrderBy(ButtonOrder) .Select(b => i + b)) + .Concat(new[] { "0Toggle Multitap" }) .ToList() }; @@ -226,6 +227,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES public short GetState(IController controller, int index, int id) { + if (id == 16) + { + return (short)(controller.IsPressed("0Toggle Multitap") ? 1 : 0); + } if (id >= 12) { return 0; diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.cs index 6dcf67fd22..9d8d18d815 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.cs @@ -177,8 +177,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES var bw = new BinaryWriter(ms); bw.Write(CoreSaveState()); bw.Write(true); // framezero, so no controller follows and don't frameadvance on load - // hack: write fake dummy controller info - bw.Write(new byte[536]); bw.Close(); _savestatebuff = ms.ToArray(); } diff --git a/libsnes/bsnes/snes/controller/multitap/multitap.cpp b/libsnes/bsnes/snes/controller/multitap/multitap.cpp index 4aeb6c6c4e..0f1e4d995b 100644 --- a/libsnes/bsnes/snes/controller/multitap/multitap.cpp +++ b/libsnes/bsnes/snes/controller/multitap/multitap.cpp @@ -1,8 +1,10 @@ #ifdef CONTROLLER_CPP uint2 Multitap::data() { - if(latched) return 2; //multitap detection - unsigned index, port1, port2; + if (latched) + return connected ? 2 : 0; + + unsigned index, port1, port2; if(iobit()) { index = counter1; @@ -25,6 +27,12 @@ uint2 Multitap::data() { void Multitap::latch(bool data) { if(latched == data) return; + bool newtoggleConnectedInput = interface()->inputPoll(port, Input::Device::Multitap, 0, 16); + if (newtoggleConnectedInput > toggleConnectedInput) + connected ^= true; + toggleConnectedInput = newtoggleConnectedInput; + + latched = data; counter1 = 0; counter2 = 0; @@ -37,11 +45,15 @@ void Multitap::serialize(serializer& s) { block[0] = latched ? 1 : 0; block[1] = counter1; block[2] = counter2; + block[3] = connected; + block[4] = toggleConnectedInput; s.array(block, Controller::SaveSize); if(s.mode() == nall::serializer::Load) { latched = (block[0] != 0); counter1 = block[1]; counter2 = block[2]; + connected = block[3]; + toggleConnectedInput = block[4]; } } @@ -50,6 +62,8 @@ Multitap::Multitap(bool port) : Controller(port) { latched = 0; counter1 = 0; counter2 = 0; + connected = true; + toggleConnectedInput = false; } #endif diff --git a/libsnes/bsnes/snes/controller/multitap/multitap.hpp b/libsnes/bsnes/snes/controller/multitap/multitap.hpp index 74000213b4..7aee454a89 100644 --- a/libsnes/bsnes/snes/controller/multitap/multitap.hpp +++ b/libsnes/bsnes/snes/controller/multitap/multitap.hpp @@ -4,6 +4,8 @@ struct Multitap : Controller { Multitap(bool port); void serialize(serializer& s); private: + bool connected; + bool toggleConnectedInput; bool latched; unsigned counter1; unsigned counter2; diff --git a/output/dll/libsneshawk-32-compatibility.dll b/output/dll/libsneshawk-32-compatibility.dll index 96222d41d3..8de2d15a40 100644 Binary files a/output/dll/libsneshawk-32-compatibility.dll and b/output/dll/libsneshawk-32-compatibility.dll differ diff --git a/output/dll/libsneshawk-32-performance.dll b/output/dll/libsneshawk-32-performance.dll index afe3d9c6bd..ec24a8e3ca 100644 Binary files a/output/dll/libsneshawk-32-performance.dll and b/output/dll/libsneshawk-32-performance.dll differ