From 5b3de57fcaec0c2d488764f169e9f453fc3c4024 Mon Sep 17 00:00:00 2001 From: goyuken Date: Wed, 21 Nov 2012 01:21:50 +0000 Subject: [PATCH] gba: make core go into zombie mode if libmeteor aborts, instead of crashing. this makes it easy to pick apart failures using the in-program debugging tools (memory view, tracelog once i add it) --- .../Consoles/Nintendo/GBA/Meteor.cs | 89 ++++++++++++++++-- BizHawk.MultiClient/output/dll/libmeteor.dll | Bin 675328 -> 675328 bytes libmeteor/cinterface.cpp | 1 + libmeteor/source/lcd.cpp | 4 +- libmeteor/source/timer.cpp | 2 +- 5 files changed, 87 insertions(+), 9 deletions(-) diff --git a/BizHawk.Emulation/Consoles/Nintendo/GBA/Meteor.cs b/BizHawk.Emulation/Consoles/Nintendo/GBA/Meteor.cs index feefac8c6d..92b085620b 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/GBA/Meteor.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/GBA/Meteor.cs @@ -37,7 +37,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA { Controller.UpdateControls(Frame++); IsLagFrame = true; - LibMeteor.libmeteor_frameadvance(); + if (!coredead) + LibMeteor.libmeteor_frameadvance(); if (IsLagFrame) LagCount++; } @@ -175,6 +176,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA LibMeteor.MessageCallback messagecallback; /// hold pointer to input callback so it won't get GCed LibMeteor.InputCallback inputcallback; + /// true if libmeteor aborted + bool coredead = false; LibMeteor.Buttons GetInput() { @@ -194,14 +197,85 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA return ret; } + #region messagecallbacks + void PrintMessage(string msg, bool abort) { - if (!abort) - Console.Write(msg.Replace("\n", "\r\n")); - else - throw new Exception("libmeteor abort:\n " + msg); + Console.Write(msg.Replace("\n", "\r\n")); + if (abort) + StopCore(msg); } + void StopCore(string msg) + { + coredead = true; + Console.WriteLine("Core stopped."); + for (int i = 0; i < soundbuffer.Length; i++) + soundbuffer[i] = 0; + + var gz = new System.IO.Compression.GZipStream( + new MemoryStream(Convert.FromBase64String(dispfont), false), + System.IO.Compression.CompressionMode.Decompress); + byte[] font = new byte[2048]; + gz.Read(font, 0, 2048); + gz.Dispose(); + + // cores aren't supposed to have bad dependencies like System.Drawing, right? + + int scx = 0; + int scy = 0; + + foreach (char c in msg) + { + if (scx == 240 || c == '\n') + { + scy += 8; + scx = 0; + } + if (scy == 160) + break; + if (c == '\r' || c == '\n') + continue; + if (c < 256 && c != ' ') + { + int fpos = c * 8; + for (int j = 0; j < 8; j++) + { + for (int i = 0; i < 8; i++) + { + if ((font[fpos] >> i & 1) != 0) + videobuffer[(scy + j) * 240 + scx + i] = unchecked((int)0xffff0000); + else + videobuffer[(scy + j) * 240 + scx + i] = unchecked((int)0xff000000); + } + fpos++; + } + } + scx += 8; + } + } + + const string dispfont = + "H4sICAInrFACAGZvby5yYXcARVU9q9RAFL2gjK8IT+0GDGoh1oGFGHDYQvwL2hoQroXhsdUqGGbxZ/gD" + + "bKys7BRhIZVYLgurIghvG3ksCPKKJfGcm1nfSTJn750792smWUmIr9++/vjmdYzDZlhuh1guFotpfiRH" + + "+dQ4n+aLxfOj/MgUR7mID8GLDMN2CftBgj54oEGG5ZuPH98sh93P3afJZHIzqGrw0e+/7LPs+OqVvuu7" + + "7vTZJb8J223Y+MtZHvLsstwuqlAVt+E1eh+DV0JU+s3mx3q9luCChjoIsVgI7Wg2kAHBQ1mkqPu6EBhk" + + "feYFcM5F0B0d9A74WtX2QvRtdU0SrBp6kaZpKIJ7XI341oV66sVp4TOtJS/L/IN+k8pnQkCbZb4QPEVB" + + "nYYhKB16JHZwbsZRDuBEDWsnEnQeTzSIz60CyHWV6cg19LOXjfb1TqKb1pSrzE0VHBUOvIed8ia3dZGb" + + "c96JM0ZhfgzPBPCbkWEPEs/4j+fO1kd2HM55Q0bf4PdmCW15E/HdFI1M7Dg/Z1xN64InguxqpGn6kkvF" + + "GaJ0Z32/6jrRkxjntFciMB79mTwPM5NLm0ffWac3iCb7kbx0XbfqzzqhEGBPLe2i9TVKmxGtiGPFIm1N" + + "tNj+ppMLDDl7Ywh1q62gPEUKlJX1Yw3k1uTo2P9sCseQW3Y80B4QLznrNwaOnbMGUDK9SNOvVgxt9vQH" + + "gj51IPn7SdlRFDt4MoarIGvKwyoFd6tV34CtAWTLRySiAZF5Oq5DcHvyAvuO8/FtLgZrRNcf9tlp8l/4" + + "sc64HPuhMnLmR/Z3jA/9cbAzexVj2CU59SPYD+rJyU6VfsiIh5NtL+j+/b7cyzmOu+op1wXrjzHXG2Ow" + + "Qikba6pbgwL0P7J4y89XDRsY7ZxEXLcmkydP/zz9NVv74P2N4yLVVaT8wIxDNv9NaRtG1pM5kinLVqKY" + + "ERndzXhOgOicGNe1yPLp5NUXnezAm99//3ymoX0xodQvsMKoE5GH18fr3aPx+v5ivPwFbt1KIx9VffYM" + + "g30GyUkPbV1zJgGzJpt+sWAxGEWSHwH4izg/hwAeBjEMw0GPweTDfNLyUWzSqdroXN+L9L1z1Gy3tsKe" + + "7Zbzpj/oOE+9P8iq5j/Nj/HUQK+S4omkuMJIaqD3g5+xQ2KwvIcEKshXE3YJNkfgjbg7/8YNLbV0Lqo6" + + "AFEaQqJmPlM7n+l9VeDHJTm57wGJPtjRwhg53+LD1DRnMvNFO9q3q9WqFfncnq6+tm7mszbzM4QziERe" + + "h7+LyO+zz8AYfQGerdf+P27cOBYaeUubt1RNU138q4wg74qiuFeGKjQA5BwOgxABACX8A6+GHm0ACAAA"; + + #endregion + void Init() { if (attachedcore != null) @@ -273,7 +347,10 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA { uint nbytes = LibMeteor.libmeteor_emptysound(); samples = soundbuffer; - nsamp = (int)(nbytes / 4); + if (!coredead) + nsamp = (int)(nbytes / 4); + else + nsamp = 738; } public void DiscardSamples() diff --git a/BizHawk.MultiClient/output/dll/libmeteor.dll b/BizHawk.MultiClient/output/dll/libmeteor.dll index 71bbcdb549a1b2b5e19e4cb05becbfbb59f9f7e5..6e99f0c5af1b2b3c1f0638293c5d7a0d70670cb2 100644 GIT binary patch delta 2005 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 F?7wi}WBLF9 diff --git a/libmeteor/cinterface.cpp b/libmeteor/cinterface.cpp index c0a640735b..63fa55f354 100644 --- a/libmeteor/cinterface.cpp +++ b/libmeteor/cinterface.cpp @@ -26,6 +26,7 @@ void abort_bizhawk(const char *msg) { if (messagecallback) messagecallback(msg, 1); + AMeteor::Stop(); // makes it easy to pick apart what happened } uint16_t (*keycallback)() = NULL; diff --git a/libmeteor/source/lcd.cpp b/libmeteor/source/lcd.cpp index d54375a5f8..7a3b2679cc 100644 --- a/libmeteor/source/lcd.cpp +++ b/libmeteor/source/lcd.cpp @@ -41,7 +41,7 @@ namespace AMeteor if (dispstat & 0x2) // if we were H-Blanking { - debug("hblank end"); + //debug("hblank end"); // we are not anymore, we're on next line dispstat ^= 0x2; // call me when we are H-Blanking again @@ -96,7 +96,7 @@ namespace AMeteor } else // if we were not H-Blanking { - debug("hblank vcount : " << std::dec << vcount); + //debug("hblank vcount : " << std::dec << vcount); // now, we are dispstat |= 0x2; // call me when we are not H-Blanking anymore diff --git a/libmeteor/source/timer.cpp b/libmeteor/source/timer.cpp index b287f79649..6c2b9472c2 100644 --- a/libmeteor/source/timer.cpp +++ b/libmeteor/source/timer.cpp @@ -88,7 +88,7 @@ namespace AMeteor void Timer::TimeEvent () { - debug("Timer" << (int)m_num << " overflow"); + //debug("Timer" << (int)m_num << " overflow"); SOUND.TimerOverflow(m_num); m_count = 65536 - m_reload;