dual gameboy: SAVESTATES OBSLETEEDDDEEDDDDDDDDDDDDDDD. link cable connection toggling

This commit is contained in:
goyuken 2014-08-18 02:31:42 +00:00
parent c9645858da
commit ca7a7886ed
1 changed files with 76 additions and 49 deletions

View File

@ -19,34 +19,15 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
{
bool disposed = false;
public Dictionary<string, int> GetCpuFlagsAndRegisters()
{
var left = L.GetCpuFlagsAndRegisters()
.Select(reg => new KeyValuePair<string, int>("Left " + reg.Key, reg.Value));
var right = R.GetCpuFlagsAndRegisters()
.Select(reg => new KeyValuePair<string, int>("Right " + reg.Key, reg.Value));
return left.Union(right).ToList().ToDictionary(pair => pair.Key, pair => pair.Value);
}
public void SetCpuRegister(string register, int value)
{
if (register.StartsWith("Left "))
{
L.SetCpuRegister(register.Replace("Left ", ""), value);
}
else if (register.StartsWith("Right "))
{
R.SetCpuRegister(register.Replace("Right ", ""), value);
}
}
Gameboy L;
Gameboy R;
// counter to ensure we do 35112 samples per frame
int overflowL = 0;
int overflowR = 0;
/// <summary>if true, the link cable is currently connected</summary>
bool cableconnected = true;
/// <summary>if true, the link cable toggle signal is currently asserted</summary>
bool cablediscosignal = false;
const int SampPerFrame = 35112;
@ -57,6 +38,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
{
return right ? R.IsCGBMode() : L.IsCGBMode();
}
public bool LinkCableConnected { get { return cableconnected; } }
public GambatteLink(CoreComm comm, GameInfo leftinfo, byte[] leftrom, GameInfo rightinfo, byte[] rightrom, object Settings, object SyncSettings, bool deterministic)
{
@ -110,6 +92,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
{
"P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 A", "P1 B", "P1 Select", "P1 Start", "P1 Power",
"P2 Up", "P2 Down", "P2 Left", "P2 Right", "P2 A", "P2 B", "P2 Select", "P2 Start", "P2 Power",
"Toggle Cable"
}
};
@ -131,6 +114,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
RCont.Set(s.Replace("P2 ", ""));
}
}
bool cablediscosignal_new = Controller["Toggle Cable"];
if (cablediscosignal_new && !cablediscosignal)
{
cableconnected ^= true;
Console.WriteLine("Cable connect status to {0}", cableconnected);
}
cablediscosignal = cablediscosignal_new;
Frame++;
L.FrameAdvancePrep();
@ -174,7 +164,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
LibGambatte.gambatte_blitto(R.GambatteState, rightvbuff, pitch);
nR += (int)nsamp;
}
// poll link cable statuses
// poll link cable statuses, but not when the cable is disconnected
if (!cableconnected)
continue;
if (LibGambatte.gambatte_linkstatus(L.GambatteState, 256) != 0) // ClockTrigger
{
@ -192,7 +185,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
LibGambatte.gambatte_linkstatus(L.GambatteState, ro & 0xff); // ShiftIn
LibGambatte.gambatte_linkstatus(R.GambatteState, lo & 0xff); // ShiftIn
}
}
overflowL = nL - SampPerFrame;
overflowR = nR - SampPerFrame;
@ -229,6 +221,32 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
public string BoardName { get { return L.BoardName + '|' + R.BoardName; } }
public void ResetCounters()
{
Frame = 0;
LagCount = 0;
IsLagFrame = false;
}
public CoreComm CoreComm { get; private set; }
public void Dispose()
{
if (!disposed)
{
L.Dispose();
L = null;
R.Dispose();
R = null;
blip_left.Dispose();
blip_left = null;
blip_right.Dispose();
blip_right = null;
disposed = true;
}
}
#region saveram
public byte[] CloneSaveRam()
@ -271,13 +289,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
#endregion
public void ResetCounters()
{
Frame = 0;
LagCount = 0;
IsLagFrame = false;
}
#region savestates
public void SaveStateText(TextWriter writer)
@ -308,6 +319,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
writer.Write(overflowR);
writer.Write(LatchL);
writer.Write(LatchR);
writer.Write(cableconnected);
writer.Write(cablediscosignal);
}
public void LoadStateBinary(BinaryReader reader)
@ -322,6 +335,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
overflowR = reader.ReadInt32();
LatchL = reader.ReadInt32();
LatchR = reader.ReadInt32();
cableconnected = reader.ReadBoolean();
cablediscosignal = reader.ReadBoolean();
}
public byte[] SaveStateBinary()
@ -337,10 +352,33 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
#endregion
public CoreComm CoreComm { get; private set; }
#region debugging
public MemoryDomainList MemoryDomains { get; private set; }
public Dictionary<string, int> GetCpuFlagsAndRegisters()
{
var left = L.GetCpuFlagsAndRegisters()
.Select(reg => new KeyValuePair<string, int>("Left " + reg.Key, reg.Value));
var right = R.GetCpuFlagsAndRegisters()
.Select(reg => new KeyValuePair<string, int>("Right " + reg.Key, reg.Value));
return left.Union(right).ToList().ToDictionary(pair => pair.Key, pair => pair.Value);
}
public void SetCpuRegister(string register, int value)
{
if (register.StartsWith("Left "))
{
L.SetCpuRegister(register.Replace("Left ", ""), value);
}
else if (register.StartsWith("Right "))
{
R.SetCpuRegister(register.Replace("Right ", ""), value);
}
}
void SetMemoryDomains()
{
var mm = new List<MemoryDomain>();
@ -353,22 +391,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
MemoryDomains = new MemoryDomainList(mm);
}
public void Dispose()
{
if (!disposed)
{
L.Dispose();
L = null;
R.Dispose();
R = null;
blip_left.Dispose();
blip_left = null;
blip_right.Dispose();
blip_right = null;
disposed = true;
}
}
#endregion
#region VideoProvider
@ -446,6 +469,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
#endregion
#region settings
public object GetSettings()
{
return new GambatteLinkSettings
@ -519,5 +544,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
}
}
#endregion
}
}