From e87a0edb01ee2ff7e742e321dadfb0e37b280c79 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 29 Feb 2020 09:05:28 -0500 Subject: [PATCH] GBHawk 4x: cleaan up the 2x2 connections --- .../GBHawkLink4x/GBHawkLink4x.IEmulator.cs | 203 ++++++++++++++---- .../GBHawkLink4x/GBHawkLink4x.IStatable.cs | 3 +- .../Nintendo/GBHawkLink4x/GBHawkLink4x.cs | 3 +- 3 files changed, 163 insertions(+), 46 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink4x/GBHawkLink4x.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink4x/GBHawkLink4x.IEmulator.cs index 28670a965e..57b76319e3 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink4x/GBHawkLink4x.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink4x/GBHawkLink4x.IEmulator.cs @@ -110,7 +110,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x if (_cableconnected_UD | _cableconnected_LR | _cableconnected_X | _cableconnected_4x) { _cableconnected_UD = _cableconnected_LR = _cableconnected_X = _cableconnected_4x = false; - do_2_next = false; + do_2_next_1 = false; + do_2_next_2 = false; } else if (controller.IsPressed("Toggle Cable UD")) { @@ -655,47 +656,45 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x if (_cableconnected_UD) { // the signal to shift out a bit is when serial_clock = 1 - if (((A.serialport.serial_clock == 1) || (A.serialport.serial_clock == 2)) && (A.serialport.clk_rate > 0) && !do_2_next) + if (((A.serialport.serial_clock == 1) || (A.serialport.serial_clock == 2)) && (A.serialport.clk_rate > 0) && !do_2_next_1) { A.serialport.going_out = (byte)(A.serialport.serial_data >> 7); - if ((C.serialport.clk_rate == -1) && C.serialport.serial_start && A.serialport.can_pulse) + if ((B.serialport.clk_rate == -1) && B.serialport.serial_start && A.serialport.can_pulse) { - C.serialport.serial_clock = A.serialport.serial_clock; - C.serialport.going_out = (byte)(C.serialport.serial_data >> 7); - C.serialport.coming_in = A.serialport.going_out; + B.serialport.serial_clock = A.serialport.serial_clock; + B.serialport.going_out = (byte)(B.serialport.serial_data >> 7); + B.serialport.coming_in = A.serialport.going_out; } - A.serialport.coming_in = C.serialport.going_out; + A.serialport.coming_in = B.serialport.going_out; A.serialport.can_pulse = false; } - else if (((C.serialport.serial_clock == 1) || (C.serialport.serial_clock == 2)) && (C.serialport.clk_rate > 0)) + else if (((B.serialport.serial_clock == 1) || (B.serialport.serial_clock == 2)) && (B.serialport.clk_rate > 0)) { - do_2_next = false; + do_2_next_1 = false; - C.serialport.going_out = (byte)(C.serialport.serial_data >> 7); + B.serialport.going_out = (byte)(B.serialport.serial_data >> 7); - if ((A.serialport.clk_rate == -1) && A.serialport.serial_start && C.serialport.can_pulse) + if ((A.serialport.clk_rate == -1) && A.serialport.serial_start && B.serialport.can_pulse) { - A.serialport.serial_clock = C.serialport.serial_clock; + A.serialport.serial_clock = B.serialport.serial_clock; A.serialport.going_out = (byte)(A.serialport.serial_data >> 7); - A.serialport.coming_in = C.serialport.going_out; + A.serialport.coming_in = B.serialport.going_out; } - C.serialport.coming_in = A.serialport.going_out; - C.serialport.can_pulse = false; + B.serialport.coming_in = A.serialport.going_out; + B.serialport.can_pulse = false; - if (C.serialport.serial_clock == 2) { do_2_next = true; } + if (B.serialport.serial_clock == 2) { do_2_next_1 = true; } } else { - do_2_next = false; + do_2_next_1 = false; } - } - else if (_cableconnected_LR) - { + // the signal to shift out a bit is when serial_clock = 1 - if (((C.serialport.serial_clock == 1) || (C.serialport.serial_clock == 2)) && (C.serialport.clk_rate > 0) && !do_2_next) + if (((C.serialport.serial_clock == 1) || (C.serialport.serial_clock == 2)) && (C.serialport.clk_rate > 0) && !do_2_next_2) { C.serialport.going_out = (byte)(C.serialport.serial_data >> 7); @@ -711,7 +710,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x } else if (((D.serialport.serial_clock == 1) || (D.serialport.serial_clock == 2)) && (D.serialport.clk_rate > 0)) { - do_2_next = false; + do_2_next_2 = false; D.serialport.going_out = (byte)(D.serialport.serial_data >> 7); @@ -725,34 +724,18 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x D.serialport.coming_in = C.serialport.going_out; D.serialport.can_pulse = false; - if (D.serialport.serial_clock == 2) { do_2_next = true; } + if (D.serialport.serial_clock == 2) { do_2_next_2 = true; } } else { - do_2_next = false; + do_2_next_2 = false; } } - else if (_cableconnected_X) + else if (_cableconnected_LR) { // the signal to shift out a bit is when serial_clock = 1 - if (((D.serialport.serial_clock == 1) || (D.serialport.serial_clock == 2)) && (D.serialport.clk_rate > 0) && !do_2_next) + if (((A.serialport.serial_clock == 1) || (A.serialport.serial_clock == 2)) && (A.serialport.clk_rate > 0) && !do_2_next_1) { - D.serialport.going_out = (byte)(D.serialport.serial_data >> 7); - - if ((A.serialport.clk_rate == -1) && A.serialport.serial_start && D.serialport.can_pulse) - { - A.serialport.serial_clock = D.serialport.serial_clock; - A.serialport.going_out = (byte)(A.serialport.serial_data >> 7); - A.serialport.coming_in = D.serialport.going_out; - } - - D.serialport.coming_in = A.serialport.going_out; - D.serialport.can_pulse = false; - } - else if (((A.serialport.serial_clock == 1) || (A.serialport.serial_clock == 2)) && (A.serialport.clk_rate > 0)) - { - do_2_next = false; - A.serialport.going_out = (byte)(A.serialport.serial_data >> 7); if ((D.serialport.clk_rate == -1) && D.serialport.serial_start && A.serialport.can_pulse) @@ -764,12 +747,144 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x A.serialport.coming_in = D.serialport.going_out; A.serialport.can_pulse = false; + } + else if (((D.serialport.serial_clock == 1) || (D.serialport.serial_clock == 2)) && (D.serialport.clk_rate > 0)) + { + do_2_next_1 = false; - if (A.serialport.serial_clock == 2) { do_2_next = true; } + D.serialport.going_out = (byte)(D.serialport.serial_data >> 7); + + if ((A.serialport.clk_rate == -1) && A.serialport.serial_start && D.serialport.can_pulse) + { + A.serialport.serial_clock = D.serialport.serial_clock; + A.serialport.going_out = (byte)(A.serialport.serial_data >> 7); + A.serialport.coming_in = D.serialport.going_out; + } + + D.serialport.coming_in = A.serialport.going_out; + D.serialport.can_pulse = false; + + if (D.serialport.serial_clock == 2) { do_2_next_1 = true; } } else { - do_2_next = false; + do_2_next_1 = false; + } + + // the signal to shift out a bit is when serial_clock = 1 + if (((B.serialport.serial_clock == 1) || (B.serialport.serial_clock == 2)) && (B.serialport.clk_rate > 0) && !do_2_next_2) + { + B.serialport.going_out = (byte)(B.serialport.serial_data >> 7); + + if ((C.serialport.clk_rate == -1) && C.serialport.serial_start && B.serialport.can_pulse) + { + C.serialport.serial_clock = B.serialport.serial_clock; + C.serialport.going_out = (byte)(C.serialport.serial_data >> 7); + C.serialport.coming_in = B.serialport.going_out; + } + + B.serialport.coming_in = C.serialport.going_out; + B.serialport.can_pulse = false; + } + else if (((C.serialport.serial_clock == 1) || (C.serialport.serial_clock == 2)) && (C.serialport.clk_rate > 0)) + { + do_2_next_2 = false; + + C.serialport.going_out = (byte)(C.serialport.serial_data >> 7); + + if ((B.serialport.clk_rate == -1) && B.serialport.serial_start && C.serialport.can_pulse) + { + B.serialport.serial_clock = C.serialport.serial_clock; + B.serialport.going_out = (byte)(B.serialport.serial_data >> 7); + B.serialport.coming_in = C.serialport.going_out; + } + + C.serialport.coming_in = B.serialport.going_out; + C.serialport.can_pulse = false; + + if (C.serialport.serial_clock == 2) { do_2_next_2 = true; } + } + else + { + do_2_next_2 = false; + } + } + else if (_cableconnected_X) + { + // the signal to shift out a bit is when serial_clock = 1 + if (((C.serialport.serial_clock == 1) || (C.serialport.serial_clock == 2)) && (C.serialport.clk_rate > 0) && !do_2_next_1) + { + C.serialport.going_out = (byte)(C.serialport.serial_data >> 7); + + if ((A.serialport.clk_rate == -1) && A.serialport.serial_start && C.serialport.can_pulse) + { + A.serialport.serial_clock = C.serialport.serial_clock; + A.serialport.going_out = (byte)(A.serialport.serial_data >> 7); + A.serialport.coming_in = C.serialport.going_out; + } + + C.serialport.coming_in = A.serialport.going_out; + C.serialport.can_pulse = false; + } + else if (((A.serialport.serial_clock == 1) || (A.serialport.serial_clock == 2)) && (A.serialport.clk_rate > 0)) + { + do_2_next_1 = false; + + A.serialport.going_out = (byte)(A.serialport.serial_data >> 7); + + if ((C.serialport.clk_rate == -1) && C.serialport.serial_start && A.serialport.can_pulse) + { + C.serialport.serial_clock = A.serialport.serial_clock; + C.serialport.going_out = (byte)(C.serialport.serial_data >> 7); + C.serialport.coming_in = A.serialport.going_out; + } + + A.serialport.coming_in = C.serialport.going_out; + A.serialport.can_pulse = false; + + if (A.serialport.serial_clock == 2) { do_2_next_1 = true; } + } + else + { + do_2_next_1 = false; + } + + // the signal to shift out a bit is when serial_clock = 1 + if (((B.serialport.serial_clock == 1) || (B.serialport.serial_clock == 2)) && (B.serialport.clk_rate > 0) && !do_2_next_2) + { + B.serialport.going_out = (byte)(B.serialport.serial_data >> 7); + + if ((D.serialport.clk_rate == -1) && D.serialport.serial_start && B.serialport.can_pulse) + { + D.serialport.serial_clock = B.serialport.serial_clock; + D.serialport.going_out = (byte)(D.serialport.serial_data >> 7); + D.serialport.coming_in = B.serialport.going_out; + } + + B.serialport.coming_in = D.serialport.going_out; + B.serialport.can_pulse = false; + } + else if (((D.serialport.serial_clock == 1) || (D.serialport.serial_clock == 2)) && (D.serialport.clk_rate > 0)) + { + do_2_next_2 = false; + + D.serialport.going_out = (byte)(D.serialport.serial_data >> 7); + + if ((B.serialport.clk_rate == -1) && B.serialport.serial_start && D.serialport.can_pulse) + { + B.serialport.serial_clock = D.serialport.serial_clock; + B.serialport.going_out = (byte)(B.serialport.serial_data >> 7); + B.serialport.coming_in = D.serialport.going_out; + } + + D.serialport.coming_in = B.serialport.going_out; + D.serialport.can_pulse = false; + + if (D.serialport.serial_clock == 2) { do_2_next_2 = true; } + } + else + { + do_2_next_2 = false; } } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink4x/GBHawkLink4x.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink4x/GBHawkLink4x.IStatable.cs index eaeb00ed84..6f25841243 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink4x/GBHawkLink4x.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink4x/GBHawkLink4x.IStatable.cs @@ -50,7 +50,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x ser.Sync(nameof(_cableconnected_LR), ref _cableconnected_LR); ser.Sync(nameof(_cableconnected_X), ref _cableconnected_X); ser.Sync(nameof(_cableconnected_4x), ref _cableconnected_4x); - ser.Sync(nameof(do_2_next), ref do_2_next); + ser.Sync(nameof(do_2_next_1), ref do_2_next_1); + ser.Sync(nameof(do_2_next_2), ref do_2_next_2); ser.Sync(nameof(A_controller), ref A_controller); ser.Sync(nameof(B_controller), ref B_controller); ser.Sync(nameof(C_controller), ref C_controller); diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink4x/GBHawkLink4x.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink4x/GBHawkLink4x.cs index 42d07504f9..f4b2c0ca8f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink4x/GBHawkLink4x.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink4x/GBHawkLink4x.cs @@ -23,7 +23,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x private bool _cableconnected_X = false; private bool _cableconnected_4x = true; - private bool do_2_next = false; + private bool do_2_next_1 = false; + private bool do_2_next_2 = false; // 4 player adapter variables public bool is_pinging, is_transmitting;