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) if (_cableconnected_UD | _cableconnected_LR | _cableconnected_X | _cableconnected_4x)
{ {
_cableconnected_UD = _cableconnected_LR = _cableconnected_X = _cableconnected_4x = false; _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")) else if (controller.IsPressed("Toggle Cable UD"))
{ {
@ -655,47 +656,45 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x
if (_cableconnected_UD) if (_cableconnected_UD)
{ {
// the signal to shift out a bit is when serial_clock = 1 // 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); 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; B.serialport.serial_clock = A.serialport.serial_clock;
C.serialport.going_out = (byte)(C.serialport.serial_data >> 7); B.serialport.going_out = (byte)(B.serialport.serial_data >> 7);
C.serialport.coming_in = A.serialport.going_out; 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; 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.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; B.serialport.coming_in = A.serialport.going_out;
C.serialport.can_pulse = false; 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 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 // 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); 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)) 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); 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.coming_in = C.serialport.going_out;
D.serialport.can_pulse = false; 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 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 // 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); A.serialport.going_out = (byte)(A.serialport.serial_data >> 7);
if ((D.serialport.clk_rate == -1) && D.serialport.serial_start && A.serialport.can_pulse) 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.coming_in = D.serialport.going_out;
A.serialport.can_pulse = false; 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 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_LR), ref _cableconnected_LR);
ser.Sync(nameof(_cableconnected_X), ref _cableconnected_X); ser.Sync(nameof(_cableconnected_X), ref _cableconnected_X);
ser.Sync(nameof(_cableconnected_4x), ref _cableconnected_4x); 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(A_controller), ref A_controller);
ser.Sync(nameof(B_controller), ref B_controller); ser.Sync(nameof(B_controller), ref B_controller);
ser.Sync(nameof(C_controller), ref C_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_X = false;
private bool _cableconnected_4x = true; 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 // 4 player adapter variables
public bool is_pinging, is_transmitting; public bool is_pinging, is_transmitting;