From 83f74f1290e43ecf0956af6e816bc26b0bb4f106 Mon Sep 17 00:00:00 2001 From: goyuken Date: Tue, 20 Nov 2012 15:52:36 +0000 Subject: [PATCH] gba: handle libmeteor aborts. Final Fantasy 5 (J) now crashes instead of drifting off into the sunset --- .../Consoles/Nintendo/GBA/LibMeteor.cs | 3 +- .../Consoles/Nintendo/GBA/Meteor.cs | 60 +++++++++--------- BizHawk.MultiClient/output/dll/libmeteor.dll | Bin 675328 -> 675328 bytes libmeteor/cinterface.cpp | 13 ++-- libmeteor/source/debug.hpp | 3 +- 5 files changed, 42 insertions(+), 37 deletions(-) diff --git a/BizHawk.Emulation/Consoles/Nintendo/GBA/LibMeteor.cs b/BizHawk.Emulation/Consoles/Nintendo/GBA/LibMeteor.cs index e0c33e2c34..0b75031d9d 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/GBA/LibMeteor.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/GBA/LibMeteor.cs @@ -68,8 +68,9 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA /// core callback to print meaningful (or meaningless) log messages /// /// message to be printed + /// true if emulation should be aborted [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void MessageCallback(string msg); + public delegate void MessageCallback(string msg, bool abort); /// /// set callback for log messages. this can (and should) be called first diff --git a/BizHawk.Emulation/Consoles/Nintendo/GBA/Meteor.cs b/BizHawk.Emulation/Consoles/Nintendo/GBA/Meteor.cs index 482eaa2f51..b804db5dc8 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/GBA/Meteor.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/GBA/Meteor.cs @@ -40,33 +40,19 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA LagCount++; } - public int Frame + public int Frame { get; private set; } + public int LagCount { get; set; } + public bool IsLagFrame { get; private set; } + public string SystemId { get { return "GBA"; } } + public bool DeterministicEmulation { get { return true; } } + + public void ResetFrameCounter() { - get; - private set; + Frame = 0; + LagCount = 0; } - public int LagCount - { - get; - set; - } - - public bool IsLagFrame - { - get; - private set; - } - - public string SystemId - { - get { return "GBA"; } - } - - public bool DeterministicEmulation - { - get { return true; } - } + #region saveram public byte[] ReadSaveRam() { @@ -83,11 +69,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA public bool SaveRamModified { get { return false; } set { } } - public void ResetFrameCounter() - { - Frame = 0; - LagCount = 0; - } + #endregion #region savestates @@ -138,12 +120,16 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA get { return null; } } + /// like libsnes, the library is single-instance static GBA attachedcore; + /// hold pointer to message callback so it won't get GCed LibMeteor.MessageCallback messagecallback; + /// hold pointer to input callback so it won't get GCed LibMeteor.InputCallback inputcallback; LibMeteor.Buttons GetInput() { + // libmeteor bitflips everything itself, so 0 == off, 1 == on IsLagFrame = false; LibMeteor.Buttons ret = 0; if (Controller["Up"]) ret |= LibMeteor.Buttons.BTN_UP; @@ -159,13 +145,20 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA return ret; } + void PrintMessage(string msg, bool abort) + { + if (!abort) + Console.Write(msg.Replace("\n", "\r\n")); + else + throw new Exception("libmeteor abort:\n " + msg); + } void Init() { if (attachedcore != null) attachedcore.Dispose(); - messagecallback = (str) => Console.Write(str.Replace("\n","\r\n")); + messagecallback = PrintMessage; inputcallback = GetInput; LibMeteor.libmeteor_setmessagecallback(messagecallback); LibMeteor.libmeteor_setkeycallback(inputcallback); @@ -192,6 +185,12 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA disposed = true; videohandle.Free(); soundhandle.Free(); + // guarantee crash if it gets accessed + LibMeteor.libmeteor_setbuffers(IntPtr.Zero, 240 * 160 * 4, IntPtr.Zero, 4); + messagecallback = null; + inputcallback = null; + LibMeteor.libmeteor_setmessagecallback(messagecallback); + LibMeteor.libmeteor_setkeycallback(inputcallback); } } @@ -225,7 +224,6 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA uint nbytes = LibMeteor.libmeteor_emptysound(); samples = soundbuffer; nsamp = (int)(nbytes / 4); - } public void DiscardSamples() diff --git a/BizHawk.MultiClient/output/dll/libmeteor.dll b/BizHawk.MultiClient/output/dll/libmeteor.dll index a6a52228bffc4ffd25a2166475593a35ad03dc79..5335be733a729823d1aedf75c7022fedd6c27901 100644 GIT binary patch delta 3717 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