GBHawk 4x: cleaan up the 2x2 connections

This commit is contained in:
alyosha-tas 2020-02-29 09:05:28 -05:00
parent c9621eff19
commit e87a0edb01
3 changed files with 163 additions and 46 deletions

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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;