From fa8934b1d4ea13be0ce921c81a0480995de39e06 Mon Sep 17 00:00:00 2001 From: goyuken Date: Sun, 2 Nov 2014 19:11:19 +0000 Subject: [PATCH] lynx: memory domains. R/W: RAM, Save Ram. R: Cart A, Cart B. --- .../Consoles/Atari/lynx/LibLynx.cs | 6 +++ .../Consoles/Atari/lynx/Lynx.cs | 35 +++++++++++++++--- lynx/cart.cpp | 8 ++++ lynx/cart.h | 1 + lynx/cinterface.cpp | 9 +++++ lynx/system.h | 1 + output/dll/bizlynx.dll | Bin 80896 -> 80896 bytes 7 files changed, 55 insertions(+), 5 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/LibLynx.cs b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/LibLynx.cs index 042ccd8acf..fe47804d8f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/LibLynx.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/LibLynx.cs @@ -31,6 +31,10 @@ namespace BizHawk.Emulation.Cores.Atari.Lynx [DllImport(dllname, CallingConvention = cc)] public static extern bool GetSaveRamPtr(IntPtr s, out int size, out IntPtr data); + [DllImport(dllname, CallingConvention = cc)] + public static extern void GetReadOnlyCartPtrs(IntPtr s, out int s0, out IntPtr p0, out int s1, out IntPtr p1); + + [DllImport(dllname, CallingConvention = cc)] public static extern int BinStateSize(IntPtr s); [DllImport(dllname, CallingConvention = cc)] @@ -42,6 +46,8 @@ namespace BizHawk.Emulation.Cores.Atari.Lynx [DllImport(dllname, CallingConvention = cc)] public static extern void TxtStateLoad(IntPtr s, [In]ref TextStateFPtrs ff); + [DllImport(dllname, CallingConvention = cc)] + public static extern IntPtr GetRamPointer(IntPtr s); [Flags] public enum Buttons : ushort diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.cs b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.cs index b915d14f2a..5b7f98f451 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.cs @@ -12,7 +12,7 @@ using Newtonsoft.Json; namespace BizHawk.Emulation.Cores.Atari.Lynx { [CoreAttributes("Handy", "K. Wilkins", true, false, "mednafen 0-9-34-1", "http://mednafen.sourceforge.net/")] - public class Lynx : IEmulator, IVideoProvider, ISyncSoundProvider + public class Lynx : IEmulator, IVideoProvider, ISyncSoundProvider, IMemoryDomains { IntPtr Core; @@ -112,6 +112,7 @@ namespace BizHawk.Emulation.Cores.Atari.Lynx BufferWidth = WIDTH; BufferHeight = HEIGHT; } + SetupMemoryDomains(); } catch { @@ -161,10 +162,6 @@ namespace BizHawk.Emulation.Cores.Atari.Lynx } } - #region debugging - - #endregion - #region Controller private static readonly ControllerDefinition LynxTroller = new ControllerDefinition @@ -366,5 +363,33 @@ namespace BizHawk.Emulation.Cores.Atari.Lynx } #endregion + + #region MemoryDomains + + private void SetupMemoryDomains() + { + var mms = new List(); + mms.Add(MemoryDomain.FromIntPtr("RAM", 65536, MemoryDomain.Endian.Little, LibLynx.GetRamPointer(Core), true)); + + IntPtr p; + int s; + if (LibLynx.GetSaveRamPtr(Core, out s, out p)) + mms.Add(MemoryDomain.FromIntPtr("Save RAM", s, MemoryDomain.Endian.Little, p, true)); + + IntPtr p0, p1; + int s0, s1; + LibLynx.GetReadOnlyCartPtrs(Core, out s0, out p0, out s1, out p1); + if (s0 > 0 && p0 != IntPtr.Zero) + mms.Add(MemoryDomain.FromIntPtr("Cart A", s0, MemoryDomain.Endian.Little, p0, false)); + if (s1 > 0 && p1 != IntPtr.Zero) + mms.Add(MemoryDomain.FromIntPtr("Cart B", s1, MemoryDomain.Endian.Little, p1, false)); + + MemoryDomains = new MemoryDomainList(mms, 0); + } + + + public MemoryDomainList MemoryDomains { get; private set; } + + #endregion } } diff --git a/lynx/cart.cpp b/lynx/cart.cpp index a4840465ef..5afc0596f9 100644 --- a/lynx/cart.cpp +++ b/lynx/cart.cpp @@ -331,6 +331,14 @@ bool CCart::GetSaveRamPtr(int &size, uint8 *&data) } } +void CCart::GetReadOnlyPtrs(int &s0, uint8 *&p0, int &s1, uint8 *&p1) +{ + s0 = mMaskBank0 + 1; + s1 = mMaskBank1 + 1; + p0 = mCartBank0; + p1 = mCartBank1; +} + SYNCFUNC(CCart) { NSS(mWriteEnableBank0); diff --git a/lynx/cart.h b/lynx/cart.h index 278799fea2..fbe9e91b3c 100644 --- a/lynx/cart.h +++ b/lynx/cart.h @@ -108,6 +108,7 @@ public: // when the original cart did not have it bool GetSaveRamPtr(int &size, uint8 *&data); + void GetReadOnlyPtrs(int &s0, uint8 *&p0, int &s1, uint8 *&p1); templatevoid SyncState(NewState *ns); diff --git a/lynx/cinterface.cpp b/lynx/cinterface.cpp index 9a303d7e07..e0421e6b61 100644 --- a/lynx/cinterface.cpp +++ b/lynx/cinterface.cpp @@ -47,6 +47,10 @@ EXPORT int GetSaveRamPtr(CSystem *s, int *size, uint8 **data) return s->GetSaveRamPtr(*size, *data); } +EXPORT void GetReadOnlyCartPtrs(CSystem *s, int *s0, uint8 **p0, int *s1, uint8 **p1) +{ + s->GetReadOnlyCartPtrs(*s0, *p0, *s1, *p1); +} EXPORT int BinStateSize(CSystem *s) { @@ -81,3 +85,8 @@ EXPORT void TxtStateLoad(CSystem *s, FPtrs *ff) s->SyncState(&loader); } +EXPORT void *GetRamPointer(CSystem *s) +{ + return s->GetRamPointer(); +} + diff --git a/lynx/system.h b/lynx/system.h index 3fa74f7b2a..421649f770 100644 --- a/lynx/system.h +++ b/lynx/system.h @@ -143,6 +143,7 @@ public: bool Advance(int buttons, uint32 *vbuff, int16 *sbuff, int &sbuffsize); bool GetSaveRamPtr(int &size, uint8 *&data) { return mCart->GetSaveRamPtr(size, data); } + void GetReadOnlyCartPtrs(int &s0, uint8 *&p0, int &s1, uint8 *&p1) { mCart->GetReadOnlyPtrs(s0, p0, s1, p1); } // // We MUST have separate CPU & RAM peek & poke handlers as all CPU accesses must diff --git a/output/dll/bizlynx.dll b/output/dll/bizlynx.dll index 83c1ac20a87f8b588981d5640cb840f4ac7e1131..7903f302ac4cd737666112e0ab6be27b505126a6 100644 GIT binary patch delta 4897 zcmZ|S33yFM{|E4y1wjzIS|VEH|GmM#{r{im&GUSonctk5xo76g%sH7| zYnokaD)6J;`I+%XBif2SHagMn-cPPm<4xL@#u^{eEc&xSy*kn&cPFntBbyhSNXb9{ zc2YvfL1XzS)=LO-9~sr33innJ;vC5I7@XZZxcaguh!5x)m)$$m**iETDE7zRerQ6f z&u^@+=8O;RF*qeCuKKvqKQWSiW=u=$MrRnC61#_3Uv!jQhX%3eq1v|5U7gt20e!)F@Db3CSoGaz5&i*0X?!CI{PxtVZrs8VCOIf z1yP~S0ioG6;h+&UHq49W8VO^g=^kVK*tckgLB}P~r^Z|3^fqU6afg=@4*osfVa^-Q z0e(*EjEzjFyWrk8?u55dP~6;DJ|WgCB*>_q&^EC0AYm-0vlAYd-%4I*G*9K|*GAve zQMAn1oZ5+28pl(c(=XlCsZ;$ZXN;T{LrdKorY)s@MLC42Yq#u znMs%`@SQ`L5U@fosDK+VDT^?-z`cMl!xs`}7V^n+33C$hV#K+KFCl)2xCrqY#Ba|d zObg`i!`Fz;A�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 X=CixlYivjEH7qGY3g-$m!~1^#HCT$H delta 4847 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 U935gO_Y>C;DOIpUA@lwI1JnbCt^fc4