GBHawk: Link Cable work
This commit is contained in:
parent
42764f0019
commit
12ad2d5b36
|
@ -351,7 +351,9 @@
|
||||||
this.SaturnPreferencesMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.SaturnPreferencesMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.DGBSubMenu = new System.Windows.Forms.ToolStripMenuItem();
|
this.DGBSubMenu = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.DGBsettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.DGBsettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.GenesisSubMenu = new System.Windows.Forms.ToolStripMenuItem();
|
this.DGBHawkSubMenu = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.DGBHawksettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.GenesisSubMenu = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.vDPViewerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.vDPViewerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.GenesisGameGenieECDC = new System.Windows.Forms.ToolStripMenuItem();
|
this.GenesisGameGenieECDC = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripSeparator26 = new System.Windows.Forms.ToolStripSeparator();
|
this.toolStripSeparator26 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
|
@ -503,7 +505,8 @@
|
||||||
this.N64SubMenu,
|
this.N64SubMenu,
|
||||||
this.SaturnSubMenu,
|
this.SaturnSubMenu,
|
||||||
this.DGBSubMenu,
|
this.DGBSubMenu,
|
||||||
this.GenesisSubMenu,
|
this.DGBHawkSubMenu,
|
||||||
|
this.GenesisSubMenu,
|
||||||
this.wonderSwanToolStripMenuItem,
|
this.wonderSwanToolStripMenuItem,
|
||||||
this.AppleSubMenu,
|
this.AppleSubMenu,
|
||||||
this.C64SubMenu,
|
this.C64SubMenu,
|
||||||
|
@ -3177,10 +3180,25 @@
|
||||||
this.DGBsettingsToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
|
this.DGBsettingsToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
|
||||||
this.DGBsettingsToolStripMenuItem.Text = "Settings...";
|
this.DGBsettingsToolStripMenuItem.Text = "Settings...";
|
||||||
this.DGBsettingsToolStripMenuItem.Click += new System.EventHandler(this.DgbSettingsMenuItem_Click);
|
this.DGBsettingsToolStripMenuItem.Click += new System.EventHandler(this.DgbSettingsMenuItem_Click);
|
||||||
//
|
//
|
||||||
// GenesisSubMenu
|
// DGBHawkSubMenu
|
||||||
//
|
//
|
||||||
this.GenesisSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
this.DGBHawkSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.DGBHawksettingsToolStripMenuItem});
|
||||||
|
this.DGBHawkSubMenu.Name = "DGBHawkSubMenu";
|
||||||
|
this.DGBHawkSubMenu.Size = new System.Drawing.Size(59, 19);
|
||||||
|
this.DGBHawkSubMenu.Text = "&GB Link";
|
||||||
|
//
|
||||||
|
// DGBHawksettingsToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.DGBHawksettingsToolStripMenuItem.Name = "DGBHawksettingsToolStripMenuItem";
|
||||||
|
this.DGBHawksettingsToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
|
||||||
|
this.DGBHawksettingsToolStripMenuItem.Text = "Settings...";
|
||||||
|
this.DGBHawksettingsToolStripMenuItem.Click += new System.EventHandler(this.DgbHawkSettingsMenuItem_Click);
|
||||||
|
//
|
||||||
|
// GenesisSubMenu
|
||||||
|
//
|
||||||
|
this.GenesisSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
this.vDPViewerToolStripMenuItem,
|
this.vDPViewerToolStripMenuItem,
|
||||||
this.GenesisGameGenieECDC,
|
this.GenesisGameGenieECDC,
|
||||||
this.toolStripSeparator26,
|
this.toolStripSeparator26,
|
||||||
|
@ -4504,6 +4522,8 @@
|
||||||
private System.Windows.Forms.ToolStripMenuItem FdsEjectDiskMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem FdsEjectDiskMenuItem;
|
||||||
private System.Windows.Forms.ToolStripMenuItem DGBSubMenu;
|
private System.Windows.Forms.ToolStripMenuItem DGBSubMenu;
|
||||||
private System.Windows.Forms.ToolStripMenuItem DGBsettingsToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem DGBsettingsToolStripMenuItem;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem DGBHawkSubMenu;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem DGBHawksettingsToolStripMenuItem;
|
||||||
private System.Windows.Forms.ToolStripMenuItem GenesisSubMenu;
|
private System.Windows.Forms.ToolStripMenuItem GenesisSubMenu;
|
||||||
private System.Windows.Forms.ToolStripMenuItem GenesisSettingsToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem GenesisSettingsToolStripMenuItem;
|
||||||
private System.Windows.Forms.ToolStripMenuItem AtariSettingsToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem AtariSettingsToolStripMenuItem;
|
||||||
|
|
|
@ -2350,6 +2350,11 @@ namespace BizHawk.Client.EmuHawk
|
||||||
DGBPrefs.DoDGBPrefsDialog(this);
|
DGBPrefs.DoDGBPrefsDialog(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void DgbHawkSettingsMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
GenericCoreConfig.DoDialog(this, "Gameboy Settings");
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region GEN
|
#region GEN
|
||||||
|
|
|
@ -24,6 +24,7 @@ using BizHawk.Emulation.Cores.Nintendo.GBA;
|
||||||
using BizHawk.Emulation.Cores.Nintendo.NES;
|
using BizHawk.Emulation.Cores.Nintendo.NES;
|
||||||
using BizHawk.Emulation.Cores.Nintendo.SNES;
|
using BizHawk.Emulation.Cores.Nintendo.SNES;
|
||||||
using BizHawk.Emulation.Cores.Nintendo.N64;
|
using BizHawk.Emulation.Cores.Nintendo.N64;
|
||||||
|
using BizHawk.Emulation.Cores.Nintendo.GBHawkLink;
|
||||||
|
|
||||||
using BizHawk.Client.EmuHawk.WinFormExtensions;
|
using BizHawk.Client.EmuHawk.WinFormExtensions;
|
||||||
using BizHawk.Client.EmuHawk.ToolExtensions;
|
using BizHawk.Client.EmuHawk.ToolExtensions;
|
||||||
|
@ -1720,6 +1721,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
N64SubMenu.Visible = false;
|
N64SubMenu.Visible = false;
|
||||||
SaturnSubMenu.Visible = false;
|
SaturnSubMenu.Visible = false;
|
||||||
DGBSubMenu.Visible = false;
|
DGBSubMenu.Visible = false;
|
||||||
|
DGBHawkSubMenu.Visible = false;
|
||||||
GenesisSubMenu.Visible = false;
|
GenesisSubMenu.Visible = false;
|
||||||
wonderSwanToolStripMenuItem.Visible = false;
|
wonderSwanToolStripMenuItem.Visible = false;
|
||||||
AppleSubMenu.Visible = false;
|
AppleSubMenu.Visible = false;
|
||||||
|
@ -1802,7 +1804,14 @@ namespace BizHawk.Client.EmuHawk
|
||||||
SaturnSubMenu.Visible = true;
|
SaturnSubMenu.Visible = true;
|
||||||
break;
|
break;
|
||||||
case "DGB":
|
case "DGB":
|
||||||
DGBSubMenu.Visible = true;
|
if (Emulator is GBHawkLink)
|
||||||
|
{
|
||||||
|
DGBHawkSubMenu.Visible = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DGBSubMenu.Visible = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case "WSWAN":
|
case "WSWAN":
|
||||||
wonderSwanToolStripMenuItem.Visible = true;
|
wonderSwanToolStripMenuItem.Visible = true;
|
||||||
|
|
|
@ -168,6 +168,89 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
vblank_rise = false;
|
vblank_rise = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void do_single_step()
|
||||||
|
{
|
||||||
|
// These things do not change speed in GBC double spped mode
|
||||||
|
audio.tick();
|
||||||
|
ppu.tick();
|
||||||
|
if (Use_MT) { mapper.Mapper_Tick(); }
|
||||||
|
|
||||||
|
if (!HDMA_transfer)
|
||||||
|
{
|
||||||
|
// These things all tick twice as fast in GBC double speed mode
|
||||||
|
ppu.DMA_tick();
|
||||||
|
timer.tick_1();
|
||||||
|
serialport.serial_transfer_tick();
|
||||||
|
cpu.ExecuteOne(ref REG_FF0F, REG_FFFF);
|
||||||
|
timer.tick_2();
|
||||||
|
|
||||||
|
if (double_speed)
|
||||||
|
{
|
||||||
|
ppu.DMA_tick();
|
||||||
|
timer.tick_1();
|
||||||
|
serialport.serial_transfer_tick();
|
||||||
|
cpu.ExecuteOne(ref REG_FF0F, REG_FFFF);
|
||||||
|
timer.tick_2();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
timer.tick_1();
|
||||||
|
timer.tick_2();
|
||||||
|
cpu.TotalExecutedCycles++;
|
||||||
|
if (double_speed)
|
||||||
|
{
|
||||||
|
timer.tick_1();
|
||||||
|
timer.tick_2();
|
||||||
|
cpu.TotalExecutedCycles++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_vblank && !in_vblank_old)
|
||||||
|
{
|
||||||
|
vblank_rise = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
in_vblank_old = in_vblank;
|
||||||
|
REG_FF0F_OLD = REG_FF0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void do_controller_check()
|
||||||
|
{
|
||||||
|
// check if new input changed the input register and triggered IRQ
|
||||||
|
byte contr_prev = input_register;
|
||||||
|
|
||||||
|
input_register &= 0xF0;
|
||||||
|
if ((input_register & 0x30) == 0x20)
|
||||||
|
{
|
||||||
|
input_register |= (byte)(controller_state & 0xF);
|
||||||
|
}
|
||||||
|
else if ((input_register & 0x30) == 0x10)
|
||||||
|
{
|
||||||
|
input_register |= (byte)((controller_state & 0xF0) >> 4);
|
||||||
|
}
|
||||||
|
else if ((input_register & 0x30) == 0x00)
|
||||||
|
{
|
||||||
|
// if both polls are set, then a bit is zero if either or both pins are zero
|
||||||
|
byte temp = (byte)((controller_state & 0xF) & ((controller_state & 0xF0) >> 4));
|
||||||
|
input_register |= temp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
input_register |= 0xF;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for interrupts
|
||||||
|
if (((contr_prev & 8) > 0) && ((input_register & 8) == 0) ||
|
||||||
|
((contr_prev & 4) > 0) && ((input_register & 4) == 0) ||
|
||||||
|
((contr_prev & 2) > 0) && ((input_register & 2) == 0) ||
|
||||||
|
((contr_prev & 1) > 0) && ((input_register & 1) == 0))
|
||||||
|
{
|
||||||
|
if (REG_FFFF.Bit(4)) { cpu.FlagI = true; }
|
||||||
|
REG_FF0F |= 0x10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Switch Speed (GBC only)
|
// Switch Speed (GBC only)
|
||||||
public int SpeedFunc(int temp)
|
public int SpeedFunc(int temp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,9 +4,11 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
using BizHawk.Emulation.Cores.Nintendo.GBHawk;
|
||||||
|
|
||||||
namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
{
|
{
|
||||||
public partial class GBHawkLink : IEmulator, IVideoProvider
|
public partial class GBHawkLink : IEmulator, IVideoProvider, ISoundProvider
|
||||||
{
|
{
|
||||||
public IEmulatorServiceProvider ServiceProvider { get; }
|
public IEmulatorServiceProvider ServiceProvider { get; }
|
||||||
|
|
||||||
|
@ -20,6 +22,37 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
public void FrameAdvance(IController controller, bool render, bool rendersound)
|
public void FrameAdvance(IController controller, bool render, bool rendersound)
|
||||||
{
|
{
|
||||||
//Console.WriteLine("-----------------------FRAME-----------------------");
|
//Console.WriteLine("-----------------------FRAME-----------------------");
|
||||||
|
//Update the color palette if a setting changed
|
||||||
|
if (linkSettings.Palette_L == GBHawk.GBHawk.GBSettings.PaletteType.BW)
|
||||||
|
{
|
||||||
|
L.color_palette[0] = color_palette_BW[0];
|
||||||
|
L.color_palette[1] = color_palette_BW[1];
|
||||||
|
L.color_palette[2] = color_palette_BW[2];
|
||||||
|
L.color_palette[3] = color_palette_BW[3];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
L.color_palette[0] = color_palette_Gr[0];
|
||||||
|
L.color_palette[1] = color_palette_Gr[1];
|
||||||
|
L.color_palette[2] = color_palette_Gr[2];
|
||||||
|
L.color_palette[3] = color_palette_Gr[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (linkSettings.Palette_R == GBHawk.GBHawk.GBSettings.PaletteType.BW)
|
||||||
|
{
|
||||||
|
R.color_palette[0] = color_palette_BW[0];
|
||||||
|
R.color_palette[1] = color_palette_BW[1];
|
||||||
|
R.color_palette[2] = color_palette_BW[2];
|
||||||
|
R.color_palette[3] = color_palette_BW[3];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
R.color_palette[0] = color_palette_Gr[0];
|
||||||
|
R.color_palette[1] = color_palette_Gr[1];
|
||||||
|
R.color_palette[2] = color_palette_Gr[2];
|
||||||
|
R.color_palette[3] = color_palette_Gr[3];
|
||||||
|
}
|
||||||
|
|
||||||
if (_tracer.Enabled)
|
if (_tracer.Enabled)
|
||||||
{
|
{
|
||||||
L.cpu.TraceCallback = s => _tracer.Put(s);
|
L.cpu.TraceCallback = s => _tracer.Put(s);
|
||||||
|
@ -36,6 +69,16 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
HardReset();
|
HardReset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool cablediscosignalNew = controller.IsPressed("Toggle Cable");
|
||||||
|
if (cablediscosignalNew && !_cablediscosignal)
|
||||||
|
{
|
||||||
|
_cableconnected ^= true;
|
||||||
|
Console.WriteLine("Cable connect status to {0}", _cableconnected);
|
||||||
|
LinkConnected = _cableconnected;
|
||||||
|
}
|
||||||
|
|
||||||
|
_cablediscosignal = cablediscosignalNew;
|
||||||
|
|
||||||
_islag = true;
|
_islag = true;
|
||||||
|
|
||||||
GetControllerState(controller);
|
GetControllerState(controller);
|
||||||
|
@ -52,8 +95,27 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
|
|
||||||
public void do_frame()
|
public void do_frame()
|
||||||
{
|
{
|
||||||
L.do_frame();
|
L.do_controller_check();
|
||||||
R.do_frame();
|
R.do_controller_check();
|
||||||
|
|
||||||
|
// advance one full frame
|
||||||
|
for (int i = 0; i < 70224; i++)
|
||||||
|
{
|
||||||
|
L.do_single_step();
|
||||||
|
R.do_single_step();
|
||||||
|
|
||||||
|
// if we hit a frame boundary, update video
|
||||||
|
if (L.vblank_rise)
|
||||||
|
{
|
||||||
|
buff_L = L.GetVideoBuffer();
|
||||||
|
L.vblank_rise = false;
|
||||||
|
}
|
||||||
|
if (R.vblank_rise)
|
||||||
|
{
|
||||||
|
buff_R = R.GetVideoBuffer();
|
||||||
|
R.vblank_rise = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void GetControllerState(IController controller)
|
public void GetControllerState(IController controller)
|
||||||
|
@ -65,7 +127,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
|
|
||||||
public int Frame => _frame;
|
public int Frame => _frame;
|
||||||
|
|
||||||
public string SystemId => "GB";
|
public string SystemId => "DGB";
|
||||||
|
|
||||||
public bool DeterministicEmulation { get; set; }
|
public bool DeterministicEmulation { get; set; }
|
||||||
|
|
||||||
|
@ -89,15 +151,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
public int _frameHz = 60;
|
public int _frameHz = 60;
|
||||||
|
|
||||||
public int[] _vidbuffer = new int[160 * 2 * 144];
|
public int[] _vidbuffer = new int[160 * 2 * 144];
|
||||||
public int[] buff_L;
|
public int[] buff_L = new int[160 * 144];
|
||||||
public int[] buff_R;
|
public int[] buff_R = new int[160 * 144];
|
||||||
|
|
||||||
public int[] GetVideoBuffer()
|
public int[] GetVideoBuffer()
|
||||||
{
|
{
|
||||||
// combine the 2 video buffers from the instances
|
// combine the 2 video buffers from the instances
|
||||||
buff_L = L.GetVideoBuffer();
|
|
||||||
buff_R = R.GetVideoBuffer();
|
|
||||||
|
|
||||||
for (int i = 0; i < 144; i++)
|
for (int i = 0; i < 144; i++)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < 160; j++)
|
for (int j = 0; j < 160; j++)
|
||||||
|
@ -124,5 +183,71 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
public uint[] color_palette = new uint[4];
|
public uint[] color_palette = new uint[4];
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region audio
|
||||||
|
|
||||||
|
public bool CanProvideAsync => false;
|
||||||
|
|
||||||
|
public void SetSyncMode(SyncSoundMode mode)
|
||||||
|
{
|
||||||
|
if (mode != SyncSoundMode.Sync)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("Only Sync mode is supported_");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public SyncSoundMode SyncMode => SyncSoundMode.Sync;
|
||||||
|
|
||||||
|
public void GetSamplesSync(out short[] samples, out int nsamp)
|
||||||
|
{
|
||||||
|
short[] temp_samp_L;
|
||||||
|
short[] temp_samp_R;
|
||||||
|
|
||||||
|
int nsamp_L;
|
||||||
|
int nsamp_R;
|
||||||
|
|
||||||
|
L.audio.GetSamplesSync(out temp_samp_L, out nsamp_L);
|
||||||
|
R.audio.GetSamplesSync(out temp_samp_R, out nsamp_R);
|
||||||
|
|
||||||
|
if (linkSettings.AudioSet == GBLinkSettings.AudioSrc.Left)
|
||||||
|
{
|
||||||
|
samples = temp_samp_L;
|
||||||
|
nsamp = nsamp_L;
|
||||||
|
}
|
||||||
|
else if (linkSettings.AudioSet == GBLinkSettings.AudioSrc.Right)
|
||||||
|
{
|
||||||
|
samples = temp_samp_R;
|
||||||
|
nsamp = nsamp_R;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
samples = new short[0];
|
||||||
|
nsamp = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void GetSamplesAsync(short[] samples)
|
||||||
|
{
|
||||||
|
throw new NotSupportedException("Async is not available");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DiscardSamples()
|
||||||
|
{
|
||||||
|
L.audio.DiscardSamples();
|
||||||
|
R.audio.DiscardSamples();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GetSamples(short[] samples)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DisposeSound()
|
||||||
|
{
|
||||||
|
L.audio.DisposeSound();
|
||||||
|
R.audio.DisposeSound();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,9 +7,43 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
{
|
{
|
||||||
public byte[] CloneSaveRam()
|
public byte[] CloneSaveRam()
|
||||||
{
|
{
|
||||||
if (L.cart_RAM != null)
|
if ((L.cart_RAM != null) || (R.cart_RAM != null))
|
||||||
{
|
{
|
||||||
return (byte[])L.cart_RAM.Clone();
|
int Len1 = 0;
|
||||||
|
int Len2 = 0;
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
if (L.cart_RAM != null)
|
||||||
|
{
|
||||||
|
Len1 = L.cart_RAM.Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (R.cart_RAM != null)
|
||||||
|
{
|
||||||
|
Len2 = R.cart_RAM.Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] temp = new byte[Len1 + Len2];
|
||||||
|
|
||||||
|
if (L.cart_RAM != null)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < L.cart_RAM.Length; i++)
|
||||||
|
{
|
||||||
|
temp[index] = L.cart_RAM[i];
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (R.cart_RAM != null)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < L.cart_RAM.Length; i++)
|
||||||
|
{
|
||||||
|
temp[index] = R.cart_RAM[i];
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return temp;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -19,7 +53,20 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
|
|
||||||
public void StoreSaveRam(byte[] data)
|
public void StoreSaveRam(byte[] data)
|
||||||
{
|
{
|
||||||
Buffer.BlockCopy(data, 0, L.cart_RAM, 0, data.Length);
|
if ((L.cart_RAM != null) && (R.cart_RAM == null))
|
||||||
|
{
|
||||||
|
Buffer.BlockCopy(data, 0, L.cart_RAM, 0, L.cart_RAM.Length);
|
||||||
|
}
|
||||||
|
else if ((R.cart_RAM != null) && (L.cart_RAM == null))
|
||||||
|
{
|
||||||
|
Buffer.BlockCopy(data, 0, R.cart_RAM, 0, R.cart_RAM.Length);
|
||||||
|
}
|
||||||
|
else if ((R.cart_RAM != null) && (L.cart_RAM != null))
|
||||||
|
{
|
||||||
|
Buffer.BlockCopy(data, 0, L.cart_RAM, 0, L.cart_RAM.Length);
|
||||||
|
Buffer.BlockCopy(data, L.cart_RAM.Length, R.cart_RAM, 0, R.cart_RAM.Length);
|
||||||
|
}
|
||||||
|
|
||||||
Console.WriteLine("loading SRAM here");
|
Console.WriteLine("loading SRAM here");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +74,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return L.has_bat & _syncSettings.L.Use_SRAM;
|
return (L.has_bat || R.has_bat) & linkSyncSettings.Use_SRAM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,78 +13,133 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
{
|
{
|
||||||
public GBLinkSettings GetSettings()
|
public GBLinkSettings GetSettings()
|
||||||
{
|
{
|
||||||
return new GBLinkSettings
|
return linkSettings.Clone();
|
||||||
(
|
|
||||||
L.GetSettings(),
|
|
||||||
R.GetSettings()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public GBLinkSyncSettings GetSyncSettings()
|
public GBLinkSyncSettings GetSyncSettings()
|
||||||
{
|
{
|
||||||
return new GBLinkSyncSettings
|
return linkSyncSettings.Clone();
|
||||||
(
|
|
||||||
L.GetSyncSettings(),
|
|
||||||
R.GetSyncSettings()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool PutSettings(GBLinkSettings o)
|
public bool PutSettings(GBLinkSettings o)
|
||||||
{
|
{
|
||||||
return L.PutSettings(o.L) || R.PutSettings(o.R);
|
linkSettings = o;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool PutSyncSettings(GBLinkSyncSettings o)
|
public bool PutSyncSettings(GBLinkSyncSettings o)
|
||||||
{
|
{
|
||||||
return L.PutSyncSettings(o.L) || R.PutSyncSettings(o.R);
|
bool ret = GBLinkSyncSettings.NeedsReboot(linkSyncSettings, o);
|
||||||
|
linkSyncSettings = o;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
private GBLinkSettings _settings = new GBLinkSettings();
|
private GBLinkSettings linkSettings = new GBLinkSettings();
|
||||||
public GBLinkSyncSettings _syncSettings = new GBLinkSyncSettings();
|
public GBLinkSyncSettings linkSyncSettings = new GBLinkSyncSettings();
|
||||||
|
|
||||||
public class GBLinkSettings
|
public class GBLinkSettings
|
||||||
{
|
{
|
||||||
public GBHawk.GBHawk.GBSettings L;
|
[DisplayName("Color Mode")]
|
||||||
public GBHawk.GBHawk.GBSettings R;
|
[Description("Pick Between Green scale and Grey scale colors")]
|
||||||
|
[DefaultValue(GBHawk.GBHawk.GBSettings.PaletteType.BW)]
|
||||||
|
public GBHawk.GBHawk.GBSettings.PaletteType Palette_L { get; set; }
|
||||||
|
|
||||||
public GBLinkSettings()
|
[DisplayName("Color Mode")]
|
||||||
|
[Description("Pick Between Green scale and Grey scale colors")]
|
||||||
|
[DefaultValue(GBHawk.GBHawk.GBSettings.PaletteType.BW)]
|
||||||
|
public GBHawk.GBHawk.GBSettings.PaletteType Palette_R { get; set; }
|
||||||
|
|
||||||
|
public enum AudioSrc
|
||||||
{
|
{
|
||||||
L = new GBHawk.GBHawk.GBSettings();
|
Left,
|
||||||
R = new GBHawk.GBHawk.GBSettings();
|
Right,
|
||||||
|
Both
|
||||||
}
|
}
|
||||||
|
|
||||||
public GBLinkSettings(GBHawk.GBHawk.GBSettings L, GBHawk.GBHawk.GBSettings R)
|
[DisplayName("Audio Selection")]
|
||||||
{
|
[Description("Choose Audio Source. Both will produce Stereo sound.")]
|
||||||
this.L = L;
|
[DefaultValue(AudioSrc.Left)]
|
||||||
this.R = R;
|
public AudioSrc AudioSet { get; set; }
|
||||||
}
|
|
||||||
|
|
||||||
public GBLinkSettings Clone()
|
public GBLinkSettings Clone()
|
||||||
{
|
{
|
||||||
return new GBLinkSettings(L.Clone(), R.Clone());
|
return (GBLinkSettings)MemberwiseClone();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class GBLinkSyncSettings
|
public class GBLinkSyncSettings
|
||||||
{
|
{
|
||||||
public GBHawk.GBHawk.GBSyncSettings L;
|
[DisplayName("Console Mode L")]
|
||||||
public GBHawk.GBHawk.GBSyncSettings R;
|
[Description("Pick which console to run, 'Auto' chooses from ROM extension, 'GB' and 'GBC' chooses the respective system")]
|
||||||
|
[DefaultValue(GBHawk.GBHawk.GBSyncSettings.ConsoleModeType.Auto)]
|
||||||
|
public GBHawk.GBHawk.GBSyncSettings.ConsoleModeType ConsoleMode_L { get; set; }
|
||||||
|
|
||||||
public GBLinkSyncSettings()
|
[DisplayName("Console Mode R")]
|
||||||
|
[Description("Pick which console to run, 'Auto' chooses from ROM extension, 'GB' and 'GBC' chooses the respective system")]
|
||||||
|
[DefaultValue(GBHawk.GBHawk.GBSyncSettings.ConsoleModeType.Auto)]
|
||||||
|
public GBHawk.GBHawk.GBSyncSettings.ConsoleModeType ConsoleMode_R { get; set; }
|
||||||
|
|
||||||
|
[DisplayName("CGB in GBA")]
|
||||||
|
[Description("Emulate GBA hardware running a CGB game, instead of CGB hardware. Relevant only for titles that detect the presense of a GBA, such as Shantae.")]
|
||||||
|
[DefaultValue(false)]
|
||||||
|
public bool GBACGB { get; set; }
|
||||||
|
|
||||||
|
[DisplayName("RTC Initial Time L")]
|
||||||
|
[Description("Set the initial RTC time in terms of elapsed seconds.")]
|
||||||
|
[DefaultValue(0)]
|
||||||
|
public int RTCInitialTime_L
|
||||||
{
|
{
|
||||||
L = new GBHawk.GBHawk.GBSyncSettings();
|
get { return _RTCInitialTime_L; }
|
||||||
R = new GBHawk.GBHawk.GBSyncSettings();
|
set { _RTCInitialTime_L = Math.Max(0, Math.Min(1024 * 24 * 60 * 60, value)); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public GBLinkSyncSettings(GBHawk.GBHawk.GBSyncSettings L, GBHawk.GBHawk.GBSyncSettings R)
|
[DisplayName("RTC Initial Time R")]
|
||||||
|
[Description("Set the initial RTC time in terms of elapsed seconds.")]
|
||||||
|
[DefaultValue(0)]
|
||||||
|
public int RTCInitialTime_R
|
||||||
{
|
{
|
||||||
this.L = L;
|
get { return _RTCInitialTime_R; }
|
||||||
this.R = R;
|
set { _RTCInitialTime_R = Math.Max(0, Math.Min(1024 * 24 * 60 * 60, value)); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[DisplayName("Timer Div Initial Time L")]
|
||||||
|
[Description("Don't change from 0 unless it's hardware accurate. GBA GBC mode is known to be 8.")]
|
||||||
|
[DefaultValue(8)]
|
||||||
|
public int DivInitialTime_L
|
||||||
|
{
|
||||||
|
get { return _DivInitialTime_L; }
|
||||||
|
set { _DivInitialTime_L = Math.Min((ushort)65535, (ushort)value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
[DisplayName("Timer Div Initial Time R")]
|
||||||
|
[Description("Don't change from 0 unless it's hardware accurate. GBA GBC mode is known to be 8.")]
|
||||||
|
[DefaultValue(8)]
|
||||||
|
public int DivInitialTime_R
|
||||||
|
{
|
||||||
|
get { return _DivInitialTime_R; }
|
||||||
|
set { _DivInitialTime_R = Math.Min((ushort)65535, (ushort)value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
[DisplayName("Use Existing SaveRAM")]
|
||||||
|
[Description("When true, existing SaveRAM will be loaded at boot up")]
|
||||||
|
[DefaultValue(false)]
|
||||||
|
public bool Use_SRAM { get; set; }
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
private int _RTCInitialTime_L;
|
||||||
|
private int _RTCInitialTime_R;
|
||||||
|
[JsonIgnore]
|
||||||
|
public ushort _DivInitialTime_L;
|
||||||
|
public ushort _DivInitialTime_R;
|
||||||
|
|
||||||
public GBLinkSyncSettings Clone()
|
public GBLinkSyncSettings Clone()
|
||||||
{
|
{
|
||||||
return new GBLinkSyncSettings(L.Clone(), R.Clone());
|
return (GBLinkSyncSettings)MemberwiseClone();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool NeedsReboot(GBLinkSyncSettings x, GBLinkSyncSettings y)
|
||||||
|
{
|
||||||
|
return !DeepEquality.DeepEquals(x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
"GBHawkLink",
|
"GBHawkLink",
|
||||||
"",
|
"",
|
||||||
isPorted: false,
|
isPorted: false,
|
||||||
isReleased: true)]
|
isReleased: false)]
|
||||||
[ServiceNotApplicable(typeof(IDriveLight))]
|
[ServiceNotApplicable(typeof(IDriveLight))]
|
||||||
public partial class GBHawkLink : IEmulator, ISaveRam, IDebuggable, IStatable, IInputPollable, IRegionable, ILinkable,
|
public partial class GBHawkLink : IEmulator, ISaveRam, IDebuggable, IStatable, IInputPollable, IRegionable, ILinkable,
|
||||||
ISettable<GBHawkLink.GBLinkSettings, GBHawkLink.GBLinkSyncSettings>
|
ISettable<GBHawkLink.GBLinkSettings, GBHawkLink.GBLinkSyncSettings>
|
||||||
|
@ -24,25 +24,45 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
public GBHawk.GBHawk L;
|
public GBHawk.GBHawk L;
|
||||||
public GBHawk.GBHawk R;
|
public GBHawk.GBHawk R;
|
||||||
|
|
||||||
|
// if true, the link cable is currently connected
|
||||||
|
private bool _cableconnected = true;
|
||||||
|
|
||||||
|
// if true, the link cable toggle signal is currently asserted
|
||||||
|
private bool _cablediscosignal = false;
|
||||||
|
|
||||||
//[CoreConstructor("GB", "GBC")]
|
//[CoreConstructor("GB", "GBC")]
|
||||||
public GBHawkLink(CoreComm comm, GameInfo game_L, byte[] rom_L, GameInfo game_R, byte[] rom_R, /*string gameDbFn,*/ object settings, object syncSettings)
|
public GBHawkLink(CoreComm comm, GameInfo game_L, byte[] rom_L, GameInfo game_R, byte[] rom_R, /*string gameDbFn,*/ object settings, object syncSettings)
|
||||||
{
|
{
|
||||||
var ser = new BasicServiceProvider(this);
|
var ser = new BasicServiceProvider(this);
|
||||||
|
|
||||||
GBLinkSettings linkSettings = (GBLinkSettings)settings ?? new GBLinkSettings();
|
linkSettings = (GBLinkSettings)settings ?? new GBLinkSettings();
|
||||||
GBLinkSyncSettings linkSyncSettings = (GBLinkSyncSettings)syncSettings ?? new GBLinkSyncSettings();
|
linkSyncSettings = (GBLinkSyncSettings)syncSettings ?? new GBLinkSyncSettings();
|
||||||
_controllerDeck = new GBHawkLinkControllerDeck(GBHawkControllerDeck.DefaultControllerName, GBHawkControllerDeck.DefaultControllerName);
|
_controllerDeck = new GBHawkLinkControllerDeck(GBHawkControllerDeck.DefaultControllerName, GBHawkControllerDeck.DefaultControllerName);
|
||||||
|
|
||||||
CoreComm = comm;
|
CoreComm = comm;
|
||||||
|
|
||||||
|
var temp_set_L = new GBHawk.GBHawk.GBSettings();
|
||||||
|
var temp_set_R = new GBHawk.GBHawk.GBSettings();
|
||||||
|
|
||||||
|
var temp_sync_L = new GBHawk.GBHawk.GBSyncSettings();
|
||||||
|
var temp_sync_R = new GBHawk.GBHawk.GBSyncSettings();
|
||||||
|
|
||||||
|
temp_sync_L.ConsoleMode = linkSyncSettings.ConsoleMode_L;
|
||||||
|
temp_sync_R.ConsoleMode = linkSyncSettings.ConsoleMode_R;
|
||||||
|
|
||||||
|
temp_sync_L.DivInitialTime = linkSyncSettings.DivInitialTime_L;
|
||||||
|
temp_sync_R.DivInitialTime = linkSyncSettings.DivInitialTime_R;
|
||||||
|
temp_sync_L.RTCInitialTime = linkSyncSettings.RTCInitialTime_L;
|
||||||
|
temp_sync_R.RTCInitialTime = linkSyncSettings.RTCInitialTime_R;
|
||||||
|
|
||||||
L = new GBHawk.GBHawk(new CoreComm(comm.ShowMessage, comm.Notify) { CoreFileProvider = comm.CoreFileProvider },
|
L = new GBHawk.GBHawk(new CoreComm(comm.ShowMessage, comm.Notify) { CoreFileProvider = comm.CoreFileProvider },
|
||||||
game_L, rom_L, linkSettings.L, linkSyncSettings.L);
|
game_L, rom_L, temp_set_L, temp_sync_L);
|
||||||
|
|
||||||
R = new GBHawk.GBHawk(new CoreComm(comm.ShowMessage, comm.Notify) { CoreFileProvider = comm.CoreFileProvider },
|
R = new GBHawk.GBHawk(new CoreComm(comm.ShowMessage, comm.Notify) { CoreFileProvider = comm.CoreFileProvider },
|
||||||
game_R, rom_R, linkSettings.R, linkSyncSettings.R);
|
game_R, rom_R, temp_set_R, temp_sync_R);
|
||||||
|
|
||||||
ser.Register<IVideoProvider>(this);
|
ser.Register<IVideoProvider>(this);
|
||||||
ser.Register<ISoundProvider>(L.audio);
|
ser.Register<ISoundProvider>(this);
|
||||||
|
|
||||||
_tracer = new TraceBuffer { Header = L.cpu.TraceHeader };
|
_tracer = new TraceBuffer { Header = L.cpu.TraceHeader };
|
||||||
ser.Register<ITraceable>(_tracer);
|
ser.Register<ITraceable>(_tracer);
|
||||||
|
@ -52,16 +72,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
SetupMemoryDomains();
|
SetupMemoryDomains();
|
||||||
|
|
||||||
HardReset();
|
HardReset();
|
||||||
|
|
||||||
L.color_palette[0] = color_palette_BW[0];
|
|
||||||
L.color_palette[1] = color_palette_BW[1];
|
|
||||||
L.color_palette[2] = color_palette_BW[2];
|
|
||||||
L.color_palette[3] = color_palette_BW[3];
|
|
||||||
|
|
||||||
R.color_palette[0] = color_palette_BW[0];
|
|
||||||
R.color_palette[1] = color_palette_BW[1];
|
|
||||||
R.color_palette[2] = color_palette_BW[2];
|
|
||||||
R.color_palette[3] = color_palette_BW[3];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void HardReset()
|
public void HardReset()
|
||||||
|
@ -78,7 +88,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
|
|
||||||
private readonly ITraceable _tracer;
|
private readonly ITraceable _tracer;
|
||||||
|
|
||||||
bool ILinkable.LinkConnected { get; }
|
public bool LinkConnected { get; private set; }
|
||||||
|
|
||||||
private void ExecFetch(ushort addr)
|
private void ExecFetch(ushort addr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,6 +30,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
|
||||||
Name = Port1.Definition.Name,
|
Name = Port1.Definition.Name,
|
||||||
BoolButtons = Port1.Definition.BoolButtons
|
BoolButtons = Port1.Definition.BoolButtons
|
||||||
.Concat(Port2.Definition.BoolButtons)
|
.Concat(Port2.Definition.BoolButtons)
|
||||||
|
.Concat(new[] { "Toggle Cable" } )
|
||||||
.ToList()
|
.ToList()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue