From e2ccff1c821f93371bc9666b15c7b02b0d00f355 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 5 Jan 2019 08:23:16 -0600 Subject: [PATCH] GBHawk: CGB double speed linking --- .../Consoles/Nintendo/GBHawk/SerialPort.cs | 28 +++++++++++++++++-- .../GBHawkLink/GBHawkLink.IEmulator.cs | 8 +++--- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/SerialPort.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/SerialPort.cs index 4aa700268c..f5e0150c61 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/SerialPort.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/SerialPort.cs @@ -49,7 +49,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk if ((value & 1) > 0) { clk_internal = true; - clk_rate = 512; + if (((value & 2) > 0) && Core.GBC_compat) + { + clk_rate = 256; + } + else + { + clk_rate = 512; + } serial_clock = clk_rate; } else @@ -64,7 +71,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk if ((value & 1) > 0) { clk_internal = true; - clk_rate = 512; + if (((value & 2) > 0) && Core.GBC_compat) + { + clk_rate = 256; + } + else + { + clk_rate = 512; + } serial_clock = clk_rate; } else @@ -75,7 +89,15 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk } } - serial_control = (byte)(0x7E | (value & 0x81)); // middle six bits always 1 + if (Core.GBC_compat) + { + serial_control = (byte)(0x7C | (value & 0x83)); // extra CGB bit + } + else + { + serial_control = (byte)(0x7E | (value & 0x81)); // middle six bits always 1 + } + break; } } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink/GBHawkLink.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink/GBHawkLink.IEmulator.cs index 0a95188026..48ce21972b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink/GBHawkLink.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawkLink/GBHawkLink.IEmulator.cs @@ -105,7 +105,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink R.do_single_step(); // the signal to shift out a bit is when serial_clock = 1 - if (L.serialport.serial_clock == 1) + if ((L.serialport.serial_clock == 1) || (L.serialport.serial_clock == 2)) { if (LinkConnected) { @@ -113,7 +113,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink if ((R.serialport.clk_rate == -1) && R.serialport.serial_start) { - R.serialport.serial_clock = 1; + R.serialport.serial_clock = L.serialport.serial_clock; R.serialport.send_external_bit((byte)(R.serialport.serial_data & 0x80)); R.serialport.coming_in = L.serialport.going_out; } @@ -121,7 +121,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink L.serialport.coming_in = R.serialport.going_out; } } - else if (R.serialport.serial_clock == 1) + else if ((R.serialport.serial_clock == 1) || (R.serialport.serial_clock == 2)) { if (LinkConnected) { @@ -129,7 +129,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink if ((L.serialport.clk_rate == -1) && L.serialport.serial_start) { - L.serialport.serial_clock = 1; + L.serialport.serial_clock = R.serialport.serial_clock; L.serialport.send_external_bit((byte)(L.serialport.serial_data & 0x80)); L.serialport.coming_in = R.serialport.going_out; }