From 299fcbcc571312327204e587f2ac7f322ed1fbb5 Mon Sep 17 00:00:00 2001 From: goyuken Date: Fri, 3 May 2013 01:32:16 +0000 Subject: [PATCH] saturn: power button, saveram. at the moment, only the internal bupram is saverammed, although it's generated separately per game, like other bizwhack consoles --- .../Consoles/Sega/Saturn/LibYabause.cs | 7 ++ .../Consoles/Sega/Saturn/Yabause.cs | 64 ++++++++++-------- BizHawk.MultiClient/output/dll/libyabause.dll | Bin 563200 -> 563712 bytes yabause/src/libyabause/yui.cpp | 15 ++++ 4 files changed, 56 insertions(+), 30 deletions(-) diff --git a/BizHawk.Emulation/Consoles/Sega/Saturn/LibYabause.cs b/BizHawk.Emulation/Consoles/Sega/Saturn/LibYabause.cs index 518510d7c4..05e98c4cc2 100644 --- a/BizHawk.Emulation/Consoles/Sega/Saturn/LibYabause.cs +++ b/BizHawk.Emulation/Consoles/Sega/Saturn/LibYabause.cs @@ -101,6 +101,13 @@ namespace BizHawk.Emulation.Consoles.Sega.Saturn [DllImport("libyabause.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void libyabause_deinit(); + [DllImport("libyabause.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern bool libyabause_savesaveram(string fn); + [DllImport("libyabause.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern bool libyabause_loadsaveram(string fn); + [DllImport("libyabause.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern void libyabause_clearsaveram(); + /// /// /// diff --git a/BizHawk.Emulation/Consoles/Sega/Saturn/Yabause.cs b/BizHawk.Emulation/Consoles/Sega/Saturn/Yabause.cs index cfd7062399..b85cbe79a5 100644 --- a/BizHawk.Emulation/Consoles/Sega/Saturn/Yabause.cs +++ b/BizHawk.Emulation/Consoles/Sega/Saturn/Yabause.cs @@ -154,9 +154,7 @@ namespace BizHawk.Emulation.Consoles.Sega.Saturn if (Controller["Reset"]) LibYabause.libyabause_softreset(); if (Controller["Power"]) - { - // TODO - } + LibYabause.libyabause_hardreset(); LibYabause.libyabause_setpads(p11, p12, p21, p22); @@ -177,25 +175,49 @@ namespace BizHawk.Emulation.Consoles.Sega.Saturn public string SystemId { get { return "SAT"; } } public bool DeterministicEmulation { get { return true; } } + #region saveram + public byte[] ReadSaveRam() { - return new byte[0]; + var ms = new MemoryStream(); + var fp = new FilePiping(); + fp.Get(ms); + bool success = LibYabause.libyabause_savesaveram(fp.GetPipeNameNative()); + var e = fp.GetResults(); + if (e != null) + throw e; + if (!success) + throw new Exception("libyabause_savesaveram() failed!"); + var ret = ms.ToArray(); + ms.Dispose(); + return ret; } public void StoreSaveRam(byte[] data) { + var fp = new FilePiping(); + fp.Offer(data); + bool success = LibYabause.libyabause_loadsaveram(fp.GetPipeNameNative()); + var e = fp.GetResults(); + if (e != null) + throw e; + if (!success) + throw new Exception("libyabause_loadsaveram() failed!"); } public void ClearSaveRam() { + LibYabause.libyabause_clearsaveram(); } public bool SaveRamModified { - get; - set; + get { return true; } + set { if (!value) throw new InvalidOperationException(); } } + #endregion + public void ResetFrameCounter() { Frame = 0; @@ -295,7 +317,7 @@ namespace BizHawk.Emulation.Consoles.Sega.Saturn return ms.ToArray(); } -#endregion + #endregion public CoreComm CoreComm { get; private set; } @@ -345,29 +367,11 @@ namespace BizHawk.Emulation.Consoles.Sega.Saturn samples = SoundBuffer; } - public void DiscardSamples() - { - } - - public ISoundProvider SoundProvider - { - get { return null; } - } - - public ISyncSoundProvider SyncSoundProvider - { - get { return this; } - } - - public bool StartAsyncSound() - { - return false; - } - - public void EndAsyncSound() - { - - } + public void DiscardSamples() { } + public ISoundProvider SoundProvider { get { return null; } } + public ISyncSoundProvider SyncSoundProvider { get { return this; } } + public bool StartAsyncSound() { return false; } + public void EndAsyncSound() { } #endregion diff --git a/BizHawk.MultiClient/output/dll/libyabause.dll b/BizHawk.MultiClient/output/dll/libyabause.dll index 1e27372ff7d646f03ecd724581049978984afbca..909a2d49575abe5824b2a1dd66edd5c25dbd38be 100644 GIT binary patch delta 14569 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