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; 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 L;
Gameboy R; Gameboy R;
// counter to ensure we do 35112 samples per frame // counter to ensure we do 35112 samples per frame
int overflowL = 0; int overflowL = 0;
int overflowR = 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; const int SampPerFrame = 35112;
@ -57,6 +38,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
{ {
return right ? R.IsCGBMode() : L.IsCGBMode(); 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) 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", "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", "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 ", "")); 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++; Frame++;
L.FrameAdvancePrep(); L.FrameAdvancePrep();
@ -174,7 +164,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
LibGambatte.gambatte_blitto(R.GambatteState, rightvbuff, pitch); LibGambatte.gambatte_blitto(R.GambatteState, rightvbuff, pitch);
nR += (int)nsamp; 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 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(L.GambatteState, ro & 0xff); // ShiftIn
LibGambatte.gambatte_linkstatus(R.GambatteState, lo & 0xff); // ShiftIn LibGambatte.gambatte_linkstatus(R.GambatteState, lo & 0xff); // ShiftIn
} }
} }
overflowL = nL - SampPerFrame; overflowL = nL - SampPerFrame;
overflowR = nR - SampPerFrame; overflowR = nR - SampPerFrame;
@ -229,6 +221,32 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
public string BoardName { get { return L.BoardName + '|' + R.BoardName; } } 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 #region saveram
public byte[] CloneSaveRam() public byte[] CloneSaveRam()
@ -271,13 +289,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
#endregion #endregion
public void ResetCounters()
{
Frame = 0;
LagCount = 0;
IsLagFrame = false;
}
#region savestates #region savestates
public void SaveStateText(TextWriter writer) public void SaveStateText(TextWriter writer)
@ -308,6 +319,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
writer.Write(overflowR); writer.Write(overflowR);
writer.Write(LatchL); writer.Write(LatchL);
writer.Write(LatchR); writer.Write(LatchR);
writer.Write(cableconnected);
writer.Write(cablediscosignal);
} }
public void LoadStateBinary(BinaryReader reader) public void LoadStateBinary(BinaryReader reader)
@ -322,6 +335,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
overflowR = reader.ReadInt32(); overflowR = reader.ReadInt32();
LatchL = reader.ReadInt32(); LatchL = reader.ReadInt32();
LatchR = reader.ReadInt32(); LatchR = reader.ReadInt32();
cableconnected = reader.ReadBoolean();
cablediscosignal = reader.ReadBoolean();
} }
public byte[] SaveStateBinary() public byte[] SaveStateBinary()
@ -337,10 +352,33 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
#endregion #endregion
public CoreComm CoreComm { get; private set; } #region debugging
public MemoryDomainList MemoryDomains { get; private set; } 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() void SetMemoryDomains()
{ {
var mm = new List<MemoryDomain>(); var mm = new List<MemoryDomain>();
@ -353,22 +391,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
MemoryDomains = new MemoryDomainList(mm); MemoryDomains = new MemoryDomainList(mm);
} }
public void Dispose() #endregion
{
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 VideoProvider #region VideoProvider
@ -446,6 +469,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
#endregion #endregion
#region settings
public object GetSettings() public object GetSettings()
{ {
return new GambatteLinkSettings return new GambatteLinkSettings
@ -519,5 +544,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
} }
} }
#endregion
} }
} }