From a0ee98852e52bc04a48f2dc90355e59a984965ac Mon Sep 17 00:00:00 2001 From: Superfranci99 Date: Sat, 14 Mar 2015 20:50:13 +0100 Subject: [PATCH 01/17] Read Engine A data #33 --- .gitignore | 4 + IO_RegisterViewer/EngineA.cs | 127 ++++++++++++++++++ IO_RegisterViewer/IO_Register.cs | 11 ++ IO_RegisterViewer/IO_RegisterViewer.csproj | 47 +++++++ IO_RegisterViewer/Properties/AssemblyInfo.cs | 27 ++++ .../bin/Debug/IO_RegisterViewer.pdb | Bin 0 -> 13824 bytes IO_RegisterViewer/bin/Debug/NitroDebugger.pdb | Bin 0 -> 101888 bytes .../obj/Debug/IO_RegisterViewer.pdb | Bin 0 -> 13824 bytes ...le_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs | 0 ...le_5937a670-0e60-4077-877b-f7221da3dda1.cs | 0 ...le_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs | 0 NitroDebugger.sln | 7 +- 12 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 IO_RegisterViewer/EngineA.cs create mode 100644 IO_RegisterViewer/IO_Register.cs create mode 100644 IO_RegisterViewer/IO_RegisterViewer.csproj create mode 100644 IO_RegisterViewer/Properties/AssemblyInfo.cs create mode 100644 IO_RegisterViewer/bin/Debug/IO_RegisterViewer.pdb create mode 100644 IO_RegisterViewer/bin/Debug/NitroDebugger.pdb create mode 100644 IO_RegisterViewer/obj/Debug/IO_RegisterViewer.pdb create mode 100644 IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs create mode 100644 IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs create mode 100644 IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs diff --git a/.gitignore b/.gitignore index ba392ae..1d69533 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,7 @@ NitroDebugger.UnitTests/obj/ .nuget/NuGet.exe *.userprefs packages/ +*.dll +IO_RegisterViewer/bin/Debug/NitroDebugger.exe +*.txt +*.cache diff --git a/IO_RegisterViewer/EngineA.cs b/IO_RegisterViewer/EngineA.cs new file mode 100644 index 0000000..47f8e3d --- /dev/null +++ b/IO_RegisterViewer/EngineA.cs @@ -0,0 +1,127 @@ +using System; +using System.IO; +using NitroDebugger.RSP; + +namespace IO_RegisterViewer +{ + public class EngineA : IO_Register + { + + public void Read (GdbStream stream) + { + if (stream == null) + return; + + BinaryReader br = new BinaryReader (stream); + + this.Dispcnt = br.ReadInt32 (); + this.Dispstat = br.ReadInt16 (); + this.Vcount = br.ReadInt16 (); + + this.Engine2dA = new Engine2D (); + this.Engine2dA.Read (stream); + + this.Disp3dcnt = br.ReadInt16 (); + this.Dispcapcnt = br.ReadInt32 (); + this.Disp_mmem_fifo = br.ReadInt32 (); + this.Master_bright = br.ReadInt16 (); + } + + public int Dispcnt { get; set; } + public short Dispstat { get; set; } + public short Vcount { get; set; } + public Engine2D Engine2dA { get; set; } + public short Disp3dcnt { get; set; } + public int Dispcapcnt { get; set; } + public int Disp_mmem_fifo { get; set; } + public short Master_bright { get; set; } + + public class Engine2D : IO_Register + { + + public void Read (GdbStream stream) + { + BinaryReader br = new BinaryReader (stream); + + this.Bg0cnt = br.ReadInt16 (); + this.Bg1cnt = br.ReadInt16 (); + this.Bg2cnt = br.ReadInt16 (); + this.Bg3cnt = br.ReadInt16 (); + this.Bg0hofs = br.ReadInt16 (); + this.Bg0vofs = br.ReadInt16 (); + this.Bg1hofs = br.ReadInt16 (); + this.Bg1vofs = br.ReadInt16 (); + this.Bg2hofs = br.ReadInt16 (); + this.Bg2vofs = br.ReadInt16 (); + this.Bg3hofs = br.ReadInt16 (); + this.Bg3vofs = br.ReadInt16 (); + this.Bg2pa = br.ReadInt16 (); + this.Bg2pb = br.ReadInt16 (); + this.Bg2pc = br.ReadInt16 (); + this.Bg2pd = br.ReadInt16 (); + this.Bg2x = br.ReadInt32 (); + this.Bg2y = br.ReadInt32 (); + this.Bg3pa = br.ReadInt16 (); + this.Bg3pb = br.ReadInt16 (); + this.Bg3pc = br.ReadInt16 (); + this.Bg3pd = br.ReadInt16 (); + this.Bg3x = br.ReadInt32 (); + this.Bg3y = br.ReadInt32 (); + this.Win0h = br.ReadInt16 (); + this.Win1h = br.ReadInt16 (); + this.Win0v = br.ReadInt16 (); + this.Win1v = br.ReadInt16 (); + this.Winin = br.ReadInt16 (); + this.Winout = br.ReadInt16 (); + this.Mosaic = br.ReadInt16 (); + this.Bldcnt = br.ReadInt16 (); + this.Bldalpha = br.ReadInt16 (); + this.Bldy = br.ReadInt16 (); + } + + + #region Properties + + public short Bg0cnt { get; set; } + public short Bg1cnt { get; set; } + public short Bg2cnt { get; set; } + public short Bg3cnt { get; set; } + public short Bg0hofs { get; set; } + public short Bg0vofs { get; set; } + public short Bg1hofs { get; set; } + public short Bg1vofs { get; set; } + public short Bg2hofs { get; set; } + public short Bg2vofs { get; set; } + public short Bg3hofs { get; set; } + public short Bg3vofs { get; set; } + public short Bg2pa { get; set; } + public short Bg2pb { get; set; } + public short Bg2pc { get; set; } + public short Bg2pd { get; set; } + public int Bg2x { get; set; } + public int Bg2y { get; set; } + public short Bg3pa { get; set; } + public short Bg3pb { get; set; } + public short Bg3pc { get; set; } + public short Bg3pd { get; set; } + public int Bg3x { get; set; } + public int Bg3y { get; set; } + public short Win0h { get; set; } + public short Win1h { get; set; } + public short Win0v { get; set; } + public short Win1v { get; set; } + public short Winin { get; set; } + public short Winout { get; set; } + public short Mosaic { get; set; } + public short Bldcnt { get; set; } + public short Bldalpha { get; set; } + public short Bldy { get; set; } + + #endregion + + + } + + } +} + diff --git a/IO_RegisterViewer/IO_Register.cs b/IO_RegisterViewer/IO_Register.cs new file mode 100644 index 0000000..91029b4 --- /dev/null +++ b/IO_RegisterViewer/IO_Register.cs @@ -0,0 +1,11 @@ +using System; +using NitroDebugger.RSP; + +namespace IO_RegisterViewer +{ + public interface IO_Register + { + void Read(GdbStream stream); + } +} + diff --git a/IO_RegisterViewer/IO_RegisterViewer.csproj b/IO_RegisterViewer/IO_RegisterViewer.csproj new file mode 100644 index 0000000..8690ad1 --- /dev/null +++ b/IO_RegisterViewer/IO_RegisterViewer.csproj @@ -0,0 +1,47 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {E93E7091-28C4-4474-9E62-9AF5F0633A63} + Library + IO_RegisterViewer + IO_RegisterViewer + v4.5 + + + true + full + false + bin\Debug + DEBUG; + prompt + 4 + false + + + full + true + bin\Release + prompt + 4 + false + + + + + + + + + + + + + {FBAFCD9C-6B05-41C5-AEED-19784A9DC8C1} + NitroDebugger + + + \ No newline at end of file diff --git a/IO_RegisterViewer/Properties/AssemblyInfo.cs b/IO_RegisterViewer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..8e0f9b8 --- /dev/null +++ b/IO_RegisterViewer/Properties/AssemblyInfo.cs @@ -0,0 +1,27 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle ("IO_RegisterViewer")] +[assembly: AssemblyDescription ("")] +[assembly: AssemblyConfiguration ("")] +[assembly: AssemblyCompany ("")] +[assembly: AssemblyProduct ("")] +[assembly: AssemblyCopyright ("Francesco")] +[assembly: AssemblyTrademark ("")] +[assembly: AssemblyCulture ("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion ("1.0.*")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] + diff --git a/IO_RegisterViewer/bin/Debug/IO_RegisterViewer.pdb b/IO_RegisterViewer/bin/Debug/IO_RegisterViewer.pdb new file mode 100644 index 0000000000000000000000000000000000000000..78eb6705bd7c49d6ae49295827f3ad224fab07fc GIT binary patch literal 13824 zcmeHNYfMx}6rNpH5D*2eh}g80LSs>P7eqz-;IWGcx?m+(HAI2sf*WDi?5?lGCfCL^ z=_7?ECau+`Y1-JPHEFH3F|D?y57OF)Mors4{%N$1mhRflaH7mnYy*Oim-RVq9NOxBYkX8F9W+1tX@1S%Y z%;#8;z@-ZjlkQ##q*>EC@7~#)GfzC8Ybl@|OEwrVNkk$xV2p}~Nn=_9{pmm1)c=^) zdGzEu8=ffah&!FqUM-GQy=i^ptJ0;rFaCBarM*ypPkil}H7QM}Q;y~c(K){SXx%=4 z(TT>VmwkM-)(OM-m{kcrfkA1aJ~~B6t!w z1x&v&4s6n$mB5T&otFI=!iiVUroXWEq=ot#4B>i6)3F6eos-UjXM)*wo3|!*71F#r zssOW00ZUqngsl7FiHgrzmu;~w%lg(umWbiQq+ykShl&JA)ZcoZ)X@>}UMQysb!Q_@ zT`?vgF`WjcZeqbx!KvUlF!w)g0r&fOaI`I;9heNJO&ILj!zU&UQ37)Rug<^R)`tB* zSetyS{U3Ma>y2C+!?FK|I92oWek9O!rRxgq?L&MtE~;G|toM7BkT+244tO`UD*mvq zw#*k^vZm z-BPnJydEw2*;1oy$ro4`G+NrMx751LD_a`ckV^f{KEG1TA)%omj7ZTMs%JyAX!K(A zP?9J-dMmE-!R{d0#+^ahT)W7j`4z7iL->-@G3Xwc^XHJ(vQ{YdjYy}8m=u1;H0#Rp zRFR>z0|{t|V$l%f??YEEbv}n|LcWoMRGRM4}f!e@c`EmdbyDpyQjxHu4SMo8OkmOQXjOT#5o2s zEg8xGHDQ`#oTN3qebb~Z#G1zXepuVLv?CVboKLgugp+l`k*135?lP;hgI9!uPUILSQ=}0&5(K?m-$<3#Y>(Qsha0bzJP5qC&{)XBk{FZ13+hN=bfb<7M z(n{p*2d)A$|7OHG31E5u)A!zo_F>?sKGtT~L63uoTO*nhw#r_#kOYX62I8om=&|^v zJbq%*fF*!jBQ1S^o^QkervH~>8`Vf1Z;8*6j>f zFFT1*^Bgl9TnCnf^9;{0pv%WJz(fDv0lJT1o_yEK6SXrg)91i6&s#g!@>Qc7t`Y6V zotl8cKOl5CUXjege(;S=`i3GpX7U>|kXAB`N`o%Fq`lzkYO=N2U{=RB7y zw^Ype#D0z6ljONjf772VW4^p2lXY2Y#b1(^VbT00^Z0wpc;mp)GxkV?bvaW0NgB4h zPBbX*b&cW3E_5YvAdyJCHb^~PLyKGXWM##a?LSoPxzO>!>pxqrA4i^Jna{tW+}{)s z4u5^C5)zIO%>8;?1S-LXmVkGIo-xe!U+ZKz+KjrlWvoE2MTzV)G$LaPWNEPk%Nbj2 z2D2;^EYDJ7Gq%`e&$V30v(->KrvC3f{WJb=0n7M54m*Q!ASpWjpNaQfC_9JkQv{@6 zU|gu15B>LF#*%4Z?jZUJ-h9e)0AoeD1N;8|%bmviCXPk!HY80N0SV~7d;~f&yBL)c F_z#+ti^l)} literal 0 HcmV?d00001 diff --git a/IO_RegisterViewer/bin/Debug/NitroDebugger.pdb b/IO_RegisterViewer/bin/Debug/NitroDebugger.pdb new file mode 100644 index 0000000000000000000000000000000000000000..0369a059aaa4c754d0f3ea42d1fe3310b1abad12 GIT binary patch literal 101888 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 TksLUZ14nY;NDjPaIq?4h&C_Bn literal 0 HcmV?d00001 diff --git a/IO_RegisterViewer/obj/Debug/IO_RegisterViewer.pdb b/IO_RegisterViewer/obj/Debug/IO_RegisterViewer.pdb new file mode 100644 index 0000000000000000000000000000000000000000..78eb6705bd7c49d6ae49295827f3ad224fab07fc GIT binary patch literal 13824 zcmeHNYfMx}6rNpH5D*2eh}g80LSs>P7eqz-;IWGcx?m+(HAI2sf*WDi?5?lGCfCL^ z=_7?ECau+`Y1-JPHEFH3F|D?y57OF)Mors4{%N$1mhRflaH7mnYy*Oim-RVq9NOxBYkX8F9W+1tX@1S%Y z%;#8;z@-ZjlkQ##q*>EC@7~#)GfzC8Ybl@|OEwrVNkk$xV2p}~Nn=_9{pmm1)c=^) zdGzEu8=ffah&!FqUM-GQy=i^ptJ0;rFaCBarM*ypPkil}H7QM}Q;y~c(K){SXx%=4 z(TT>VmwkM-)(OM-m{kcrfkA1aJ~~B6t!w z1x&v&4s6n$mB5T&otFI=!iiVUroXWEq=ot#4B>i6)3F6eos-UjXM)*wo3|!*71F#r zssOW00ZUqngsl7FiHgrzmu;~w%lg(umWbiQq+ykShl&JA)ZcoZ)X@>}UMQysb!Q_@ zT`?vgF`WjcZeqbx!KvUlF!w)g0r&fOaI`I;9heNJO&ILj!zU&UQ37)Rug<^R)`tB* zSetyS{U3Ma>y2C+!?FK|I92oWek9O!rRxgq?L&MtE~;G|toM7BkT+244tO`UD*mvq zw#*k^vZm z-BPnJydEw2*;1oy$ro4`G+NrMx751LD_a`ckV^f{KEG1TA)%omj7ZTMs%JyAX!K(A zP?9J-dMmE-!R{d0#+^ahT)W7j`4z7iL->-@G3Xwc^XHJ(vQ{YdjYy}8m=u1;H0#Rp zRFR>z0|{t|V$l%f??YEEbv}n|LcWoMRGRM4}f!e@c`EmdbyDpyQjxHu4SMo8OkmOQXjOT#5o2s zEg8xGHDQ`#oTN3qebb~Z#G1zXepuVLv?CVboKLgugp+l`k*135?lP;hgI9!uPUILSQ=}0&5(K?m-$<3#Y>(Qsha0bzJP5qC&{)XBk{FZ13+hN=bfb<7M z(n{p*2d)A$|7OHG31E5u)A!zo_F>?sKGtT~L63uoTO*nhw#r_#kOYX62I8om=&|^v zJbq%*fF*!jBQ1S^o^QkervH~>8`Vf1Z;8*6j>f zFFT1*^Bgl9TnCnf^9;{0pv%WJz(fDv0lJT1o_yEK6SXrg)91i6&s#g!@>Qc7t`Y6V zotl8cKOl5CUXjege(;S=`i3GpX7U>|kXAB`N`o%Fq`lzkYO=N2U{=RB7y zw^Ype#D0z6ljONjf772VW4^p2lXY2Y#b1(^VbT00^Z0wpc;mp)GxkV?bvaW0NgB4h zPBbX*b&cW3E_5YvAdyJCHb^~PLyKGXWM##a?LSoPxzO>!>pxqrA4i^Jna{tW+}{)s z4u5^C5)zIO%>8;?1S-LXmVkGIo-xe!U+ZKz+KjrlWvoE2MTzV)G$LaPWNEPk%Nbj2 z2D2;^EYDJ7Gq%`e&$V30v(->KrvC3f{WJb=0n7M54m*Q!ASpWjpNaQfC_9JkQv{@6 zU|gu15B>LF#*%4Z?jZUJ-h9e)0AoeD1N;8|%bmviCXPk!HY80N0SV~7d;~f&yBL)c F_z#+ti^l)} literal 0 HcmV?d00001 diff --git a/IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs new file mode 100644 index 0000000..e69de29 diff --git a/IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs new file mode 100644 index 0000000..e69de29 diff --git a/IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs new file mode 100644 index 0000000..e69de29 diff --git a/NitroDebugger.sln b/NitroDebugger.sln index 40a8b6b..74689c0 100644 --- a/NitroDebugger.sln +++ b/NitroDebugger.sln @@ -5,6 +5,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NitroDebugger", "NitroDebug EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NitroDebugger.UnitTests", "NitroDebugger.UnitTests\NitroDebugger.UnitTests.csproj", "{A114EA52-2DC2-4DD3-937B-CD9FB236BA74}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IO_RegisterViewer", "IO_RegisterViewer\IO_RegisterViewer.csproj", "{E93E7091-28C4-4474-9E62-9AF5F0633A63}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x86 = Debug|x86 @@ -15,13 +17,16 @@ Global {A114EA52-2DC2-4DD3-937B-CD9FB236BA74}.Debug|x86.Build.0 = Debug|Any CPU {A114EA52-2DC2-4DD3-937B-CD9FB236BA74}.Release|x86.ActiveCfg = Release|Any CPU {A114EA52-2DC2-4DD3-937B-CD9FB236BA74}.Release|x86.Build.0 = Release|Any CPU + {E93E7091-28C4-4474-9E62-9AF5F0633A63}.Debug|x86.ActiveCfg = Debug|Any CPU + {E93E7091-28C4-4474-9E62-9AF5F0633A63}.Debug|x86.Build.0 = Debug|Any CPU + {E93E7091-28C4-4474-9E62-9AF5F0633A63}.Release|x86.ActiveCfg = Release|Any CPU + {E93E7091-28C4-4474-9E62-9AF5F0633A63}.Release|x86.Build.0 = Release|Any CPU {FBAFCD9C-6B05-41C5-AEED-19784A9DC8C1}.Debug|x86.ActiveCfg = Debug|x86 {FBAFCD9C-6B05-41C5-AEED-19784A9DC8C1}.Debug|x86.Build.0 = Debug|x86 {FBAFCD9C-6B05-41C5-AEED-19784A9DC8C1}.Release|x86.ActiveCfg = Release|x86 {FBAFCD9C-6B05-41C5-AEED-19784A9DC8C1}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution - StartupItem = NitroDebugger\NitroDebugger.csproj Policies = $0 $0.ChangeLogPolicy = $1 $1.UpdateMode = None From f72ad7676ea86f106f2b88728a86363112edf7c7 Mon Sep 17 00:00:00 2001 From: Superfranci99 Date: Sun, 15 Mar 2015 14:31:12 +0100 Subject: [PATCH 02/17] Implemented bitter class #33 --- IO_RegisterViewer/Bitter.cs | 25 ++++++++++++++++++ IO_RegisterViewer/EngineA.cs | 7 +++-- IO_RegisterViewer/IO_RegisterViewer.csproj | 1 + .../bin/Debug/IO_RegisterViewer.pdb | Bin 13824 -> 15872 bytes .../obj/Debug/IO_RegisterViewer.pdb | Bin 13824 -> 15872 bytes 5 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 IO_RegisterViewer/Bitter.cs diff --git a/IO_RegisterViewer/Bitter.cs b/IO_RegisterViewer/Bitter.cs new file mode 100644 index 0000000..8ca2eef --- /dev/null +++ b/IO_RegisterViewer/Bitter.cs @@ -0,0 +1,25 @@ +using System; + +namespace IO_RegisterViewer +{ + public abstract class Bitter + { + public int Data { get; set; } + + protected Bitter () + { + this.Data = 0; + } + + protected Bitter (int data) + { + this.Data = data; + } + + /// + /// Gets the bits and store them in properties + /// + public abstract void GetBits (); + } +} + diff --git a/IO_RegisterViewer/EngineA.cs b/IO_RegisterViewer/EngineA.cs index 47f8e3d..6cc1861 100644 --- a/IO_RegisterViewer/EngineA.cs +++ b/IO_RegisterViewer/EngineA.cs @@ -36,6 +36,11 @@ namespace IO_RegisterViewer public int Disp_mmem_fifo { get; set; } public short Master_bright { get; set; } + #region bitter + + + #endregion + public class Engine2D : IO_Register { @@ -118,8 +123,6 @@ namespace IO_RegisterViewer public short Bldy { get; set; } #endregion - - } } diff --git a/IO_RegisterViewer/IO_RegisterViewer.csproj b/IO_RegisterViewer/IO_RegisterViewer.csproj index 8690ad1..d02af3b 100644 --- a/IO_RegisterViewer/IO_RegisterViewer.csproj +++ b/IO_RegisterViewer/IO_RegisterViewer.csproj @@ -36,6 +36,7 @@ + diff --git a/IO_RegisterViewer/bin/Debug/IO_RegisterViewer.pdb b/IO_RegisterViewer/bin/Debug/IO_RegisterViewer.pdb index 78eb6705bd7c49d6ae49295827f3ad224fab07fc..29f91ad5f0508416668dbda4d81594a1cc9b2ff4 100644 GIT binary patch delta 2327 zcmZXWUu;xG6vk(E?=H*ILU-xHw%yW&ZktlK+odg_R!X74UZKxvag`SGZ5+?+xDgOj;1QB-01K^8TV2s zb3JI6qOVntslCCw>Lp4SfZ|W$JFB-doEqkC0#Q@M$rZ`!kIEF{YT-i zQoR`QjjoAU`B6^+R&_>|d}nL^QxDUe%qyemK)B#V59-5{z81+pB~y*{lP7 zU_BTDQ{WP?0jvZY!F#|pU<-IJct6+#?gX2`J>Xh!2!xIK0*D0-n}^WAN=(+tec%Mx z4t@l#122N>L2g(F_!GDR{2kl~PJ*3a79#Be^T2M98A1?dHMj|^2eCP3JNN*&8Qd&Z z3-b{)wxDAW+zLJm_JS{g+rV*fJ9r#?5Iha`fggiA)DHzG)OSU(iH;6w?bxg?Y$H{~$JffX#&ZFcND*Zx$Xp70#IWD%O?<%B@vr6GiERrBAu7 z{HzVHqJy$91O0aa=5o(;@QIy+yZ5q^+yOe~`)KQo`$a6!-TCyuVE^M-k5|-Tfzd8R zPU9RX7ePmcYs-HYov^c)d5aK1*f@e0c#q*>W&k>K!!qN95jvSerPgIqpRp(`6{G2L93Fz^d%awq67^Kv;Al;aP@D8yV$q{De29b%OxSBheQ!^O74 zkmgPF(}opFq22RPru|*$h0#>474>cFKs$z1@yO9MW%IPn12$i?`I*fpZC2RiTq>$w zlWpM}O|_}|prLL>D{V$>exQ;ShPqr@Cw=PD;=TxLB@9hMnLs83Cr#{vruQeGktz`@ z9}bEVUHMFlAvX5+J;VZ8I-@VSA_-ZxgZO+xQaoO1vU8R~R~(LY%@ln;k`!7%iBWxzI&JQ+3VCRMRrGDqa%G))|A5 z&Y+&CeHG`dY3b}}T-PNU8k?%BsvA4Kp7Z?L8L9&O&+>zqsNf(8(_k3pRy zbNd+Y5$7`E@pFWB{02Dpzgwj$isX>$t5{gfGeFNSl&!RXoQM0{5q!nk)f?ejZ)U;j ztBUe0KfcP2jHZUHq;CP!+PrC9>->F}TF0-SKXv3Ad9zTeMTsv|L!za6`g=!197?^M zlXjdeAt!X+SD!;?t2vd2tukYnMR)*Kx$yc$+u z6z-51ABl-^L81$rt6O8#7^8@+)PpigAs5)SPvcsqu>d!0i<;s z89S++M`Ilv*TD5)8r%Th0Wqoe1l$C^1UG{pz$Wk;*bHXC7SMs6wt^+#7SIoF1=oVx zz-Dke7zbnEKClflX$R22uC*bs9Xti@1kZvU;3Y5)PJx}^Z7>1e1C!$Is_WvFR~D1y z10^Ha3K_=_Th1C4b6B{%wM|aMP}Y$AY}N`v${H%9nV1>B;%tNkg*PL&W>x`JLOzCm zam-gK+M*8Otm)EKhv6un<>HL5QV+;36@gAEn+Gh-SdnN66pIHntrN-9qFFJEj;M^d zTN6p2NCi43l1evSE)S%zHQC!h7ml+~G(?6%hEObpRsHRgSp3k@RA*{Q&?@}-?RBCn*Sv5m2O_VZx@`xu+WH&r(P^@*xT z!ZiG&S2Wf8#Dz#rk)2(JpX>|jMJ4N#X3$$9X6o15a&M7~RMcBdZ(4@PGO!#aMozkG z6rVK_UfCqxc$SH-27iSuJDMUgnO&5X*q+Yz6~~{pUz&S(^U4eU{V@~ejnl^Gpu+V= zS)mjBcZi4Mp$}q25R2j6vOFwKB-;(&4X_7V4Nao&y$HL@94qiew~Pv9^vF}3m*5XE G!+!&P=>5Y0 diff --git a/IO_RegisterViewer/obj/Debug/IO_RegisterViewer.pdb b/IO_RegisterViewer/obj/Debug/IO_RegisterViewer.pdb index 78eb6705bd7c49d6ae49295827f3ad224fab07fc..29f91ad5f0508416668dbda4d81594a1cc9b2ff4 100644 GIT binary patch delta 2327 zcmZXWUu;xG6vk(E?=H*ILU-xHw%yW&ZktlK+odg_R!X74UZKxvag`SGZ5+?+xDgOj;1QB-01K^8TV2s zb3JI6qOVntslCCw>Lp4SfZ|W$JFB-doEqkC0#Q@M$rZ`!kIEF{YT-i zQoR`QjjoAU`B6^+R&_>|d}nL^QxDUe%qyemK)B#V59-5{z81+pB~y*{lP7 zU_BTDQ{WP?0jvZY!F#|pU<-IJct6+#?gX2`J>Xh!2!xIK0*D0-n}^WAN=(+tec%Mx z4t@l#122N>L2g(F_!GDR{2kl~PJ*3a79#Be^T2M98A1?dHMj|^2eCP3JNN*&8Qd&Z z3-b{)wxDAW+zLJm_JS{g+rV*fJ9r#?5Iha`fggiA)DHzG)OSU(iH;6w?bxg?Y$H{~$JffX#&ZFcND*Zx$Xp70#IWD%O?<%B@vr6GiERrBAu7 z{HzVHqJy$91O0aa=5o(;@QIy+yZ5q^+yOe~`)KQo`$a6!-TCyuVE^M-k5|-Tfzd8R zPU9RX7ePmcYs-HYov^c)d5aK1*f@e0c#q*>W&k>K!!qN95jvSerPgIqpRp(`6{G2L93Fz^d%awq67^Kv;Al;aP@D8yV$q{De29b%OxSBheQ!^O74 zkmgPF(}opFq22RPru|*$h0#>474>cFKs$z1@yO9MW%IPn12$i?`I*fpZC2RiTq>$w zlWpM}O|_}|prLL>D{V$>exQ;ShPqr@Cw=PD;=TxLB@9hMnLs83Cr#{vruQeGktz`@ z9}bEVUHMFlAvX5+J;VZ8I-@VSA_-ZxgZO+xQaoO1vU8R~R~(LY%@ln;k`!7%iBWxzI&JQ+3VCRMRrGDqa%G))|A5 z&Y+&CeHG`dY3b}}T-PNU8k?%BsvA4Kp7Z?L8L9&O&+>zqsNf(8(_k3pRy zbNd+Y5$7`E@pFWB{02Dpzgwj$isX>$t5{gfGeFNSl&!RXoQM0{5q!nk)f?ejZ)U;j ztBUe0KfcP2jHZUHq;CP!+PrC9>->F}TF0-SKXv3Ad9zTeMTsv|L!za6`g=!197?^M zlXjdeAt!X+SD!;?t2vd2tukYnMR)*Kx$yc$+u z6z-51ABl-^L81$rt6O8#7^8@+)PpigAs5)SPvcsqu>d!0i<;s z89S++M`Ilv*TD5)8r%Th0Wqoe1l$C^1UG{pz$Wk;*bHXC7SMs6wt^+#7SIoF1=oVx zz-Dke7zbnEKClflX$R22uC*bs9Xti@1kZvU;3Y5)PJx}^Z7>1e1C!$Is_WvFR~D1y z10^Ha3K_=_Th1C4b6B{%wM|aMP}Y$AY}N`v${H%9nV1>B;%tNkg*PL&W>x`JLOzCm zam-gK+M*8Otm)EKhv6un<>HL5QV+;36@gAEn+Gh-SdnN66pIHntrN-9qFFJEj;M^d zTN6p2NCi43l1evSE)S%zHQC!h7ml+~G(?6%hEObpRsHRgSp3k@RA*{Q&?@}-?RBCn*Sv5m2O_VZx@`xu+WH&r(P^@*xT z!ZiG&S2Wf8#Dz#rk)2(JpX>|jMJ4N#X3$$9X6o15a&M7~RMcBdZ(4@PGO!#aMozkG z6rVK_UfCqxc$SH-27iSuJDMUgnO&5X*q+Yz6~~{pUz&S(^U4eU{V@~ejnl^Gpu+V= zS)mjBcZi4Mp$}q25R2j6vOFwKB-;(&4X_7V4Nao&y$HL@94qiew~Pv9^vF}3m*5XE G!+!&P=>5Y0 From c527d22616550b619b24f4aae7db572efb8d7ba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benito=20Palacios=20S=C3=A1nchez?= Date: Sun, 15 Mar 2015 11:06:44 +0100 Subject: [PATCH 03/17] Closed #38. Implements a base for plugins. --- .../NitroDebugger.UnitTests.csproj | 1 + NitroDebugger.UnitTests/PluginTests.cs | 63 +++++++++++++++++++ NitroDebugger/NitroDebugger.csproj | 4 ++ NitroDebugger/Plugin.cs | 59 +++++++++++++++++ NitroDebugger/Properties/AssemblyInfo.cs | 2 + 5 files changed, 129 insertions(+) create mode 100644 NitroDebugger.UnitTests/PluginTests.cs create mode 100644 NitroDebugger/Plugin.cs diff --git a/NitroDebugger.UnitTests/NitroDebugger.UnitTests.csproj b/NitroDebugger.UnitTests/NitroDebugger.UnitTests.csproj index cf38067..7c92274 100644 --- a/NitroDebugger.UnitTests/NitroDebugger.UnitTests.csproj +++ b/NitroDebugger.UnitTests/NitroDebugger.UnitTests.csproj @@ -51,6 +51,7 @@ + diff --git a/NitroDebugger.UnitTests/PluginTests.cs b/NitroDebugger.UnitTests/PluginTests.cs new file mode 100644 index 0000000..863d65d --- /dev/null +++ b/NitroDebugger.UnitTests/PluginTests.cs @@ -0,0 +1,63 @@ +// +// PluginTests.cs +// +// Author: +// Benito Palacios Sánchez +// +// Copyright (c) 2015 Benito Palacios Sánchez +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System; +using System.Linq; +using Moq; +using NitroDebugger; +using NUnit.Framework; + +namespace UnitTests +{ + [TestFixture] + public class PluginTests + { + [Test] + public void GetInstance() + { + TestPlugin plugin = new TestPlugin(); + Assert.AreSame(Plugin.Instances[0], plugin); + plugin.Dispose(); + } + + [Test] + public void GetFirstInstance() + { + TestPlugin plugin1 = new TestPlugin(); + TestPlugin plugin2 = new TestPlugin(); + Assert.AreSame(Plugin.Instances.First(), plugin1); + plugin1.Dispose(); + plugin2.Dispose(); + } + + [Test] + public void RemoveAfterDispose() + { + TestPlugin plugin = new TestPlugin(); + plugin.Dispose(); + Assert.Throws(() => Plugin.Instances.First()); + } + } + + class TestPlugin : Plugin + { + } +} + diff --git a/NitroDebugger/NitroDebugger.csproj b/NitroDebugger/NitroDebugger.csproj index 72ff78d..e2575e1 100644 --- a/NitroDebugger/NitroDebugger.csproj +++ b/NitroDebugger/NitroDebugger.csproj @@ -36,6 +36,9 @@ ..\libgame\bin\Debug\libgame.dll + + ..\libgame\libs\mono-addins\bin\Mono.Addins.dll + @@ -65,6 +68,7 @@ + diff --git a/NitroDebugger/Plugin.cs b/NitroDebugger/Plugin.cs new file mode 100644 index 0000000..c163f8d --- /dev/null +++ b/NitroDebugger/Plugin.cs @@ -0,0 +1,59 @@ +// +// Plugin.cs +// +// Author: +// Benito Palacios Sánchez +// +// Copyright (c) 2015 Benito Palacios Sánchez +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Mono.Addins; + +namespace NitroDebugger +{ + [TypeExtensionPoint] + public abstract class Plugin : IDisposable + { + static List instances = new List(); + + public Plugin() + { + instances.Add(this); + } + + ~Plugin() + { + this.Dispose(false); + } + + public static ReadOnlyCollection Instances { + get { return new ReadOnlyCollection(instances); } + } + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool freeManagedResourcesAlso) + { + instances.Remove(this); + } + } +} + diff --git a/NitroDebugger/Properties/AssemblyInfo.cs b/NitroDebugger/Properties/AssemblyInfo.cs index 94a6ade..fc26bb4 100644 --- a/NitroDebugger/Properties/AssemblyInfo.cs +++ b/NitroDebugger/Properties/AssemblyInfo.cs @@ -20,6 +20,7 @@ // along with this program. If not, see . using System.Reflection; using System.Runtime.CompilerServices; +using Mono.Addins; // Information about this assembly is defined by the following attributes. // Change them to the values specific to your project. @@ -40,3 +41,4 @@ using System.Runtime.CompilerServices; //[assembly: AssemblyDelaySign(false)] //[assembly: AssemblyKeyFile("")] +[assembly:AddinRoot("NitroDebugger", "1.0")] \ No newline at end of file From 88e0c53dffcafdac214b1eaf466de9586417c81b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benito=20Palacios=20S=C3=A1nchez?= Date: Sun, 15 Mar 2015 11:10:50 +0100 Subject: [PATCH 04/17] Fix constructor visibility for plugin --- NitroDebugger/Plugin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NitroDebugger/Plugin.cs b/NitroDebugger/Plugin.cs index c163f8d..44d5bdc 100644 --- a/NitroDebugger/Plugin.cs +++ b/NitroDebugger/Plugin.cs @@ -30,7 +30,7 @@ namespace NitroDebugger { static List instances = new List(); - public Plugin() + protected Plugin() { instances.Add(this); } From 03232404986d2f8ce51b7f303669f18903fdefe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benito=20Palacios=20S=C3=A1nchez?= Date: Sun, 15 Mar 2015 12:07:16 +0100 Subject: [PATCH 05/17] Created classes to implement #37 idea. --- NitroDebugger/DataStructure.cs | 45 +++++++++++++++++++++++++ NitroDebugger/NitroDebugger.csproj | 7 ++++ NitroDebugger/StructPanel.cs | 53 ++++++++++++++++++++++++++++++ NitroDebugger/VisualPlugin.cs | 35 ++++++++++++++++++++ 4 files changed, 140 insertions(+) create mode 100644 NitroDebugger/DataStructure.cs create mode 100644 NitroDebugger/StructPanel.cs create mode 100644 NitroDebugger/VisualPlugin.cs diff --git a/NitroDebugger/DataStructure.cs b/NitroDebugger/DataStructure.cs new file mode 100644 index 0000000..59fed42 --- /dev/null +++ b/NitroDebugger/DataStructure.cs @@ -0,0 +1,45 @@ +// +// DataStructure.cs +// +// Author: +// Benito Palacios Sánchez +// +// Copyright (c) 2015 Benito Palacios Sánchez +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System; + +namespace NitroDebugger +{ + public abstract class DataStructure + { + public abstract void Read(); + public abstract void Write(); + } + + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] + public class DataDescription : Attribute + { + public DataDescription(string description) + { + Description = description; + } + + public string Description { + get; + private set; + } + } +} + diff --git a/NitroDebugger/NitroDebugger.csproj b/NitroDebugger/NitroDebugger.csproj index e2575e1..3d2da9a 100644 --- a/NitroDebugger/NitroDebugger.csproj +++ b/NitroDebugger/NitroDebugger.csproj @@ -39,6 +39,10 @@ ..\libgame\libs\mono-addins\bin\Mono.Addins.dll + + + + @@ -69,6 +73,9 @@ + + + diff --git a/NitroDebugger/StructPanel.cs b/NitroDebugger/StructPanel.cs new file mode 100644 index 0000000..97ff0ae --- /dev/null +++ b/NitroDebugger/StructPanel.cs @@ -0,0 +1,53 @@ +// +// StructPanel.cs +// +// Author: +// Benito Palacios Sánchez +// +// Copyright (c) 2015 Benito Palacios Sánchez +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System; +using System.Linq; +using System.Reflection; +using Gtk; +using Mono.Addins; + +namespace NitroDebugger +{ + [TypeExtensionPoint] + public abstract class StructPanel : VisualPlugin + where T : DataStructure, new() + { + VBox container; + + protected StructPanel() + { + container = new VBox(); + Data = new T(); + + Data.Read(); + } + + public override Container MainContainer { + get { return container; } + } + + public T Data { + get; + private set; + } + } +} + diff --git a/NitroDebugger/VisualPlugin.cs b/NitroDebugger/VisualPlugin.cs new file mode 100644 index 0000000..4fbe26b --- /dev/null +++ b/NitroDebugger/VisualPlugin.cs @@ -0,0 +1,35 @@ +// +// VisualPlugin.cs +// +// Author: +// Benito Palacios Sánchez +// +// Copyright (c) 2015 Benito Palacios Sánchez +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System; +using Gtk; +using Mono.Addins; + +namespace NitroDebugger +{ + [TypeExtensionPoint] + public abstract class VisualPlugin : Plugin + { + public abstract Container MainContainer { + get; + } + } +} + From 4eab5b42826bfd647f6a6d421b9881ffe1238951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benito=20Palacios=20S=C3=A1nchez?= Date: Sun, 15 Mar 2015 12:07:47 +0100 Subject: [PATCH 06/17] Automatic bool type for #37 --- NitroDebugger/StructPanel.cs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/NitroDebugger/StructPanel.cs b/NitroDebugger/StructPanel.cs index 97ff0ae..e87a66f 100644 --- a/NitroDebugger/StructPanel.cs +++ b/NitroDebugger/StructPanel.cs @@ -38,6 +38,7 @@ namespace NitroDebugger Data = new T(); Data.Read(); + CreateComponents(); } public override Container MainContainer { @@ -48,6 +49,28 @@ namespace NitroDebugger get; private set; } + + private void CreateComponents() + { + BindingFlags flags = BindingFlags.GetProperty | BindingFlags.SetProperty; + var properties = typeof(T).GetProperties(flags) + .Where(p => p.GetCustomAttribute() != null); + + foreach (var prop in properties) { + dynamic value = prop.GetValue(Data); + if (value is bool) + CreateComponentForBool(prop, value); + } + } + + private void CreateComponentForBool(PropertyInfo prop, bool data) + { + string descr = prop.GetCustomAttribute().Description; + var checkbox = new CheckButton(descr); + checkbox.Active = data; + + container.Add(checkbox); + } } } From 0a56ccd2345d08d6af63817646eed9707ce4c4ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benito=20Palacios=20S=C3=A1nchez?= Date: Sun, 15 Mar 2015 12:18:27 +0100 Subject: [PATCH 07/17] Support enum types for #37. --- NitroDebugger/StructPanel.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/NitroDebugger/StructPanel.cs b/NitroDebugger/StructPanel.cs index e87a66f..07a0b8e 100644 --- a/NitroDebugger/StructPanel.cs +++ b/NitroDebugger/StructPanel.cs @@ -60,6 +60,8 @@ namespace NitroDebugger dynamic value = prop.GetValue(Data); if (value is bool) CreateComponentForBool(prop, value); + else if (value is Enum) + CreateComponentForEnum(prop, value); } } @@ -71,6 +73,20 @@ namespace NitroDebugger container.Add(checkbox); } + + private void CreateComponentForEnum(PropertyInfo prop, Enum data) + { + string descr = prop.GetCustomAttribute().Description; + string[] items = Enum.GetNames(data.GetType()); + + var subcontainer = new HBox(); + subcontainer.Add(new Label(descr)); + + var combo = new ComboBox(items); + subcontainer.Add(combo); + + container.Add(container); + } } } From 01d4d258fc03902f125a33e286b1b22baffe9c88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benito=20Palacios=20S=C3=A1nchez?= Date: Sun, 15 Mar 2015 12:30:23 +0100 Subject: [PATCH 08/17] Implements get registers command for #11. Need to implement still the reply support. --- NitroDebugger/NitroDebugger.csproj | 1 + NitroDebugger/RSP/Packets/ReadRegisters.cs | 38 ++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 NitroDebugger/RSP/Packets/ReadRegisters.cs diff --git a/NitroDebugger/NitroDebugger.csproj b/NitroDebugger/NitroDebugger.csproj index 3d2da9a..3f5fc02 100644 --- a/NitroDebugger/NitroDebugger.csproj +++ b/NitroDebugger/NitroDebugger.csproj @@ -76,6 +76,7 @@ + diff --git a/NitroDebugger/RSP/Packets/ReadRegisters.cs b/NitroDebugger/RSP/Packets/ReadRegisters.cs new file mode 100644 index 0000000..5fe9fbf --- /dev/null +++ b/NitroDebugger/RSP/Packets/ReadRegisters.cs @@ -0,0 +1,38 @@ +// +// ReadRegisters.cs +// +// Author: +// Benito Palacios Sánchez +// +// Copyright (c) 2015 Benito Palacios Sánchez +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System; + +namespace NitroDebugger.RSP.Packets +{ + public class ReadRegisters : CommandPacket + { + public ReadRegisters() + : base('g') + { + } + + protected override string PackArguments() + { + return ""; + } + } +} + From 0f235f780decc6ae64945f3d6d7a60e13a7d8a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benito=20Palacios=20S=C3=A1nchez?= Date: Sun, 15 Mar 2015 12:40:20 +0100 Subject: [PATCH 09/17] Fix typo that don't compile. Why chars are not implicit casted to string? --- NitroDebugger/RSP/Packets/ReadRegisters.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NitroDebugger/RSP/Packets/ReadRegisters.cs b/NitroDebugger/RSP/Packets/ReadRegisters.cs index 5fe9fbf..bfde24c 100644 --- a/NitroDebugger/RSP/Packets/ReadRegisters.cs +++ b/NitroDebugger/RSP/Packets/ReadRegisters.cs @@ -25,7 +25,7 @@ namespace NitroDebugger.RSP.Packets public class ReadRegisters : CommandPacket { public ReadRegisters() - : base('g') + : base("g") { } From a8e2ac48a407e6a80816ec84d910a87932b2c81e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benito=20Palacios=20S=C3=A1nchez?= Date: Sun, 15 Mar 2015 12:45:46 +0100 Subject: [PATCH 10/17] Store last command sent for context in reply converter --- NitroDebugger.UnitTests/PacketTypesTest.cs | 3 ++- NitroDebugger/RSP/PacketBinConverter.cs | 4 ++-- NitroDebugger/RSP/Presentation.cs | 4 +++- NitroDebugger/RSP/ReplyPacketFactory.cs | 4 ++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/NitroDebugger.UnitTests/PacketTypesTest.cs b/NitroDebugger.UnitTests/PacketTypesTest.cs index b32eb0d..c080ffb 100644 --- a/NitroDebugger.UnitTests/PacketTypesTest.cs +++ b/NitroDebugger.UnitTests/PacketTypesTest.cs @@ -182,7 +182,8 @@ namespace UnitTests byte[] expected = new byte[] { 0xCA, 0xFE, 0xBE, 0xBE, 0x00, 0x10, 0x20 }; string dataString = BitConverter.ToString(expected).Replace("-", ""); - ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket(dataString); + ReadMemoryCommand readMemory = new ReadMemoryCommand(0x00, 0x00); + ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket(dataString, readMemory); Assert.IsInstanceOf(reply); Assert.AreEqual(expected, ((DataReply)reply).GetData()); diff --git a/NitroDebugger/RSP/PacketBinConverter.cs b/NitroDebugger/RSP/PacketBinConverter.cs index 06d9f21..1dcdd4c 100644 --- a/NitroDebugger/RSP/PacketBinConverter.cs +++ b/NitroDebugger/RSP/PacketBinConverter.cs @@ -46,7 +46,7 @@ namespace NitroDebugger.RSP return TextEncoding.GetBytes(binPacket.ToString()); } - public static ReplyPacket FromBinary(byte[] data) + public static ReplyPacket FromBinary(byte[] data, CommandPacket commandSent = null) { if (!ValidateBinary(data)) throw new FormatException("[BIN] Invalid packet"); @@ -61,7 +61,7 @@ namespace NitroDebugger.RSP if (receivedChecksum != calculatedChecksum.ToString("x2")) throw new FormatException("[BIN] Invalid checksum"); - return ReplyPacketFactory.CreateReplyPacket(packetData); + return ReplyPacketFactory.CreateReplyPacket(packetData, commandSent); } private static bool ValidateBinary(byte[] data) diff --git a/NitroDebugger/RSP/Presentation.cs b/NitroDebugger/RSP/Presentation.cs index be2d789..88b3d7f 100644 --- a/NitroDebugger/RSP/Presentation.cs +++ b/NitroDebugger/RSP/Presentation.cs @@ -36,6 +36,7 @@ namespace NitroDebugger.RSP private Session session; private CancellationTokenSource cts; + private CommandPacket lastCommandSent; public Presentation(string hostname, int port) { @@ -50,6 +51,7 @@ namespace NitroDebugger.RSP public void SendCommand(CommandPacket command) { + this.lastCommandSent = command; this.SendData(PacketBinConverter.ToBinary(command)); } @@ -101,7 +103,7 @@ namespace NitroDebugger.RSP try { // Get data byte[] packet = this.session.ReadPacket(PacketSeparator); - response = PacketBinConverter.FromBinary(packet); + response = PacketBinConverter.FromBinary(packet, lastCommandSent); // Send ACK this.session.Write(RawPacket.Ack); diff --git a/NitroDebugger/RSP/ReplyPacketFactory.cs b/NitroDebugger/RSP/ReplyPacketFactory.cs index b1a8587..21a175b 100644 --- a/NitroDebugger/RSP/ReplyPacketFactory.cs +++ b/NitroDebugger/RSP/ReplyPacketFactory.cs @@ -26,7 +26,7 @@ namespace NitroDebugger.RSP { public static class ReplyPacketFactory { - public static ReplyPacket CreateReplyPacket(string data) + public static ReplyPacket CreateReplyPacket(string data, CommandPacket commandSent = null) { if (data == "OK") return new OkReply(); @@ -37,7 +37,7 @@ namespace NitroDebugger.RSP if (data.Length == 3 && data[0] == 'E') return new ErrorReply(Convert.ToInt32(data.Substring(1), 16)); - if (data.Length % 2 == 0) { + if (commandSent is ReadMemoryCommand) { try { byte[] dataBytes = Enumerable.Range(0, data.Length / 2) .Select(i => data.Substring(i * 2, 2)) From f2229f7f9d16cd22d3f0706155b66d88fb76c062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benito=20Palacios=20S=C3=A1nchez?= Date: Sun, 15 Mar 2015 13:43:53 +0100 Subject: [PATCH 11/17] Implements Read Register command and closes #11. --- NitroDebugger.UnitTests/PacketTypesTest.cs | 67 +++++++++++++++++ NitroDebugger/NitroDebugger.csproj | 2 + NitroDebugger/RSP/Packets/RegistersReply.cs | 40 ++++++++++ NitroDebugger/RSP/ReplyPacketFactory.cs | 32 +++++++- NitroDebugger/Register.cs | 83 +++++++++++++++++++++ 5 files changed, 221 insertions(+), 3 deletions(-) create mode 100644 NitroDebugger/RSP/Packets/RegistersReply.cs create mode 100644 NitroDebugger/Register.cs diff --git a/NitroDebugger.UnitTests/PacketTypesTest.cs b/NitroDebugger.UnitTests/PacketTypesTest.cs index c080ffb..d1bd085 100644 --- a/NitroDebugger.UnitTests/PacketTypesTest.cs +++ b/NitroDebugger.UnitTests/PacketTypesTest.cs @@ -222,6 +222,73 @@ namespace UnitTests Assert.AreEqual("M", cmd.Command); Assert.AreEqual("M2000800,8:" + dataString, cmd.Pack()); } + + [Test] + public void CreateReadRegistersCommand() + { + ReadRegisters cmd = new ReadRegisters(); + Assert.AreEqual("g", cmd.Command); + Assert.AreEqual("g", cmd.Pack()); + } + + [Test] + public void CreateRegistersReply() + { + Register[] registers = new Register[] { + new Register((RegisterType)0, 0x1423), + new Register((RegisterType)1, 0x3412)}; + RegistersReply reply = new RegistersReply(registers); + Assert.AreEqual(registers, reply.GetRegisters()); + } + + [Test] + public void FactoryRegistersReply() + { + Register[] expected = new Register[] { + new Register(RegisterType.R0, 0), new Register(RegisterType.R1, 1), + new Register(RegisterType.R2, 2), new Register(RegisterType.R3, 3), + new Register(RegisterType.R4, 4), new Register(RegisterType.R5, 5), + new Register(RegisterType.R6, 6), new Register(RegisterType.R7, 7), + new Register(RegisterType.R8, 8), new Register(RegisterType.R9, 9), + new Register(RegisterType.R10, 10), new Register(RegisterType.R11, 11), + new Register(RegisterType.R12, 12), new Register(RegisterType.LR, 13), + new Register(RegisterType.SP, 14), new Register(RegisterType.PC, 15), + new Register(RegisterType.CPSR, 255) + }; + byte[] binRegisters = new byte[] { + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, + 0x0C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, + 0x0E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, + + // Floating point registers, not used but sent as 0x00 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + // Floating point status register, not used but send as 0x00 + 0x00, 0x00, 0x00, 0x00, + + // CPSR + 0xFF, 0x0, 0x0, 0x00 + }; + string regString = BitConverter.ToString(binRegisters).Replace("-", ""); + + ReadRegisters readRegisters = new ReadRegisters(); + ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket(regString, readRegisters); + + Assert.IsInstanceOf(reply); + Assert.AreEqual(expected, ((RegistersReply)reply).GetRegisters()); + } } } diff --git a/NitroDebugger/NitroDebugger.csproj b/NitroDebugger/NitroDebugger.csproj index 3f5fc02..ce7ffc4 100644 --- a/NitroDebugger/NitroDebugger.csproj +++ b/NitroDebugger/NitroDebugger.csproj @@ -77,6 +77,8 @@ + + diff --git a/NitroDebugger/RSP/Packets/RegistersReply.cs b/NitroDebugger/RSP/Packets/RegistersReply.cs new file mode 100644 index 0000000..75360ae --- /dev/null +++ b/NitroDebugger/RSP/Packets/RegistersReply.cs @@ -0,0 +1,40 @@ +// +// RegistersReply.cs +// +// Author: +// Benito Palacios Sánchez +// +// Copyright (c) 2015 Benito Palacios Sánchez +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System; + +namespace NitroDebugger.RSP.Packets +{ + public class RegistersReply : ReplyPacket + { + private Register[] registers; + + public RegistersReply(Register[] registers) + { + this.registers = registers; + } + + public Register[] GetRegisters() + { + return registers; + } + } +} + diff --git a/NitroDebugger/RSP/ReplyPacketFactory.cs b/NitroDebugger/RSP/ReplyPacketFactory.cs index 21a175b..a32e99d 100644 --- a/NitroDebugger/RSP/ReplyPacketFactory.cs +++ b/NitroDebugger/RSP/ReplyPacketFactory.cs @@ -19,6 +19,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . using System; +using System.Collections.Generic; using System.Linq; using NitroDebugger.RSP.Packets; @@ -39,15 +40,40 @@ namespace NitroDebugger.RSP if (commandSent is ReadMemoryCommand) { try { - byte[] dataBytes = Enumerable.Range(0, data.Length / 2) - .Select(i => data.Substring(i * 2, 2)) - .Select(b => Convert.ToByte(b, 16)).ToArray(); + byte[] dataBytes = ConvertToByte(data).ToArray(); return new DataReply(dataBytes); } catch (FormatException) { } } + if (commandSent is ReadRegisters) { + try { + List registers = new List(); + var byteList = ConvertToByte(data).ToArray(); + + // General registers + registers.AddRange(Enumerable.Range(0, 16) + .Select(i => new Register( + (RegisterType)i, BitConverter.ToUInt32(byteList, i * 4))) + ); + + // CPSR + registers.Add(new Register( + RegisterType.CPSR, BitConverter.ToUInt32(byteList, 164)) + ); + + return new RegistersReply(registers.ToArray()); + } catch (FormatException) { } + } + throw new FormatException("Unknown reply"); } + + private static IEnumerable ConvertToByte(string data) + { + return Enumerable.Range(0, data.Length / 2) + .Select(i => data.Substring(i * 2, 2)) + .Select(b => Convert.ToByte(b, 16)); + } } } diff --git a/NitroDebugger/Register.cs b/NitroDebugger/Register.cs new file mode 100644 index 0000000..0d94bc5 --- /dev/null +++ b/NitroDebugger/Register.cs @@ -0,0 +1,83 @@ +// +// Register.cs +// +// Author: +// Benito Palacios Sánchez +// +// Copyright (c) 2015 Benito Palacios Sánchez +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System; + +namespace NitroDebugger +{ + public class Register + { + public Register(RegisterType type, uint value) + { + Type = type; + Value = value; + } + + public RegisterType Type { + get; + private set; + } + + public uint Value { + get; + set; + } + + public override bool Equals(object obj) + { + if (obj == null) + return false; + if (ReferenceEquals(this, obj)) + return true; + if (obj.GetType() != typeof(Register)) + return false; + Register other = (Register)obj; + return Type == other.Type && Value == other.Value; + } + + public override int GetHashCode() + { + unchecked { + return Type.GetHashCode() ^ Value.GetHashCode(); + } + } + } + + public enum RegisterType : byte { + R0 = 0, + R1 = 1, + R2 = 2, + R3 = 3, + R4 = 4, + R5 = 5, + R6 = 6, + R7 = 7, + R8 = 8, + R9 = 9, + R10 = 10, + R11 = 11, + R12 = 12, + LR = 13, + SP = 14, + PC = 15, + CPSR = 16 + } +} + From 145c75a0b3d9ee88e22221425c04d8038f895fe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benito=20Palacios=20S=C3=A1nchez?= Date: Sun, 15 Mar 2015 13:54:12 +0100 Subject: [PATCH 12/17] In DeSmuME CPSR is defined as register 25 --- NitroDebugger/Register.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NitroDebugger/Register.cs b/NitroDebugger/Register.cs index 0d94bc5..b0dea74 100644 --- a/NitroDebugger/Register.cs +++ b/NitroDebugger/Register.cs @@ -77,7 +77,7 @@ namespace NitroDebugger LR = 13, SP = 14, PC = 15, - CPSR = 16 + CPSR = 25 } } From 8830ed37a79701e6c862bc9cfdb609bfbf12046b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benito=20Palacios=20S=C3=A1nchez?= Date: Sun, 15 Mar 2015 14:28:16 +0100 Subject: [PATCH 13/17] Implements Write Registers command for #12 --- NitroDebugger.UnitTests/PacketTypesTest.cs | 37 +++++++++-- NitroDebugger/NitroDebugger.csproj | 1 + NitroDebugger/RSP/Packets/WriteRegisters.cs | 74 +++++++++++++++++++++ 3 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 NitroDebugger/RSP/Packets/WriteRegisters.cs diff --git a/NitroDebugger.UnitTests/PacketTypesTest.cs b/NitroDebugger.UnitTests/PacketTypesTest.cs index d1bd085..4053033 100644 --- a/NitroDebugger.UnitTests/PacketTypesTest.cs +++ b/NitroDebugger.UnitTests/PacketTypesTest.cs @@ -244,7 +244,20 @@ namespace UnitTests [Test] public void FactoryRegistersReply() { - Register[] expected = new Register[] { + Register[] expected = CreateRegisters(); + byte[] binRegisters = CreateNetworkRegisters(); + string regString = BitConverter.ToString(binRegisters).Replace("-", ""); + + ReadRegisters readRegisters = new ReadRegisters(); + ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket(regString, readRegisters); + + Assert.IsInstanceOf(reply); + Assert.AreEqual(expected, ((RegistersReply)reply).GetRegisters()); + } + + private Register[] CreateRegisters() + { + return new Register[] { new Register(RegisterType.R0, 0), new Register(RegisterType.R1, 1), new Register(RegisterType.R2, 2), new Register(RegisterType.R3, 3), new Register(RegisterType.R4, 4), new Register(RegisterType.R5, 5), @@ -255,7 +268,11 @@ namespace UnitTests new Register(RegisterType.SP, 14), new Register(RegisterType.PC, 15), new Register(RegisterType.CPSR, 255) }; - byte[] binRegisters = new byte[] { + } + + private byte[] CreateNetworkRegisters() + { + return new byte[] { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, @@ -281,13 +298,19 @@ namespace UnitTests // CPSR 0xFF, 0x0, 0x0, 0x00 }; - string regString = BitConverter.ToString(binRegisters).Replace("-", ""); + } - ReadRegisters readRegisters = new ReadRegisters(); - ReplyPacket reply = ReplyPacketFactory.CreateReplyPacket(regString, readRegisters); + [Test] + public void CreateWriteRegistersCommand() + { + Register[] registers = CreateRegisters(); + string networkRegisters = BitConverter.ToString(CreateNetworkRegisters()); + networkRegisters = networkRegisters.Replace("-", ""); - Assert.IsInstanceOf(reply); - Assert.AreEqual(expected, ((RegistersReply)reply).GetRegisters()); + WriteRegisters cmd = null; + Assert.DoesNotThrow(() => cmd = new WriteRegisters(registers)); + Assert.AreEqual("G", cmd.Command); + Assert.AreEqual("G" + networkRegisters, cmd.Pack()); } } } diff --git a/NitroDebugger/NitroDebugger.csproj b/NitroDebugger/NitroDebugger.csproj index ce7ffc4..b2347ca 100644 --- a/NitroDebugger/NitroDebugger.csproj +++ b/NitroDebugger/NitroDebugger.csproj @@ -79,6 +79,7 @@ + diff --git a/NitroDebugger/RSP/Packets/WriteRegisters.cs b/NitroDebugger/RSP/Packets/WriteRegisters.cs new file mode 100644 index 0000000..91951bd --- /dev/null +++ b/NitroDebugger/RSP/Packets/WriteRegisters.cs @@ -0,0 +1,74 @@ +// +// WriteRegisters.cs +// +// Author: +// Benito Palacios Sánchez +// +// Copyright (c) 2015 Benito Palacios Sánchez +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System; +using System.Linq; +using System.Text; + +namespace NitroDebugger.RSP.Packets +{ + public class WriteRegisters : CommandPacket + { + private Register[] registers; + + public WriteRegisters(Register[] registers) + : base("G") + { + if (registers.Length != 17) + throw new ArgumentException("Invalid number of registers"); + + if (Enumerable.Range(0, 16).Any(i => registers[i].Type != (RegisterType)i) || + registers[16].Type != RegisterType.CPSR) + throw new ArgumentException("Invalid registers"); + + this.registers = registers; + } + + public Register[] GetRegisters() + { + return this.registers; + } + + protected override string PackArguments() + { + StringBuilder args = new StringBuilder(); + for (int i = 0; i < 16; i++) + args.AppendFormat("{0:08}", RegisterDataToString(registers[i])); + + // Floating point registers, not used but sent + args.Append(new String('0', 192)); + + // Floating point status registers, not used but sent + args.Append(new String('0', 8)); + + // CPRS + args.AppendFormat("{0:04}", RegisterDataToString(registers[16])); + + return args.ToString(); + } + + private string RegisterDataToString(Register reg) + { + return BitConverter.ToString(BitConverter.GetBytes(reg.Value)) + .Replace("-", ""); + } + } +} + From a80b3ac836969cf8e0516b4601f26756eea209a8 Mon Sep 17 00:00:00 2001 From: Superfranci99 Date: Sun, 15 Mar 2015 15:19:26 +0100 Subject: [PATCH 14/17] Removed useless file for #37 test --- IO_RegisterViewer/Bitter.cs | 25 --------------- IO_RegisterViewer/EngineA.cs | 24 ++++++++++++--- IO_RegisterViewer/IO_Register.cs | 11 ------- IO_RegisterViewer/IO_RegisterViewer.csproj | 12 ++++++-- IO_RegisterViewer/bin/Debug/NitroDebugger.pdb | Bin 101888 -> 126464 bytes .../gtk-gui/IO_RegisterViewer.Window.cs | 22 +++++++++++++ IO_RegisterViewer/gtk-gui/generated.cs | 29 ++++++++++++++++++ IO_RegisterViewer/gtk-gui/gui.stetic | 19 ++++++++++++ NitroDebugger/DataStructure.cs | 5 +-- 9 files changed, 103 insertions(+), 44 deletions(-) delete mode 100644 IO_RegisterViewer/Bitter.cs delete mode 100644 IO_RegisterViewer/IO_Register.cs create mode 100644 IO_RegisterViewer/gtk-gui/IO_RegisterViewer.Window.cs create mode 100644 IO_RegisterViewer/gtk-gui/generated.cs create mode 100644 IO_RegisterViewer/gtk-gui/gui.stetic diff --git a/IO_RegisterViewer/Bitter.cs b/IO_RegisterViewer/Bitter.cs deleted file mode 100644 index 8ca2eef..0000000 --- a/IO_RegisterViewer/Bitter.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; - -namespace IO_RegisterViewer -{ - public abstract class Bitter - { - public int Data { get; set; } - - protected Bitter () - { - this.Data = 0; - } - - protected Bitter (int data) - { - this.Data = data; - } - - /// - /// Gets the bits and store them in properties - /// - public abstract void GetBits (); - } -} - diff --git a/IO_RegisterViewer/EngineA.cs b/IO_RegisterViewer/EngineA.cs index 6cc1861..754adbe 100644 --- a/IO_RegisterViewer/EngineA.cs +++ b/IO_RegisterViewer/EngineA.cs @@ -1,17 +1,24 @@ using System; using System.IO; +using NitroDebugger; using NitroDebugger.RSP; namespace IO_RegisterViewer { - public class EngineA : IO_Register + public class EngineA : DataStructure { + public override void Write () + { + throw new NotImplementedException (); + } - public void Read (GdbStream stream) + public override void Read (GdbStream stream) { if (stream == null) return; + stream.Seek (0x4000000, SeekOrigin.Begin); + BinaryReader br = new BinaryReader (stream); this.Dispcnt = br.ReadInt32 (); @@ -31,6 +38,7 @@ namespace IO_RegisterViewer public short Dispstat { get; set; } public short Vcount { get; set; } public Engine2D Engine2dA { get; set; } + // public short Disp3dcnt { get; set; } public int Dispcapcnt { get; set; } public int Disp_mmem_fifo { get; set; } @@ -41,10 +49,14 @@ namespace IO_RegisterViewer #endregion - public class Engine2D : IO_Register + public class Engine2D : DataStructure { + public override void Write () + { + throw new NotImplementedException (); + } - public void Read (GdbStream stream) + public override void Read (GdbStream stream) { BinaryReader br = new BinaryReader (stream); @@ -79,9 +91,11 @@ namespace IO_RegisterViewer this.Winin = br.ReadInt16 (); this.Winout = br.ReadInt16 (); this.Mosaic = br.ReadInt16 (); + this.NotUsed1 = br.ReadInt16 (); this.Bldcnt = br.ReadInt16 (); this.Bldalpha = br.ReadInt16 (); this.Bldy = br.ReadInt16 (); + this.NotUsed2 = br.ReadInt16 (); } @@ -118,9 +132,11 @@ namespace IO_RegisterViewer public short Winin { get; set; } public short Winout { get; set; } public short Mosaic { get; set; } + public short NotUsed1 { get; set; } public short Bldcnt { get; set; } public short Bldalpha { get; set; } public short Bldy { get; set; } + public short NotUsed2 { get; set; } #endregion } diff --git a/IO_RegisterViewer/IO_Register.cs b/IO_RegisterViewer/IO_Register.cs deleted file mode 100644 index 91029b4..0000000 --- a/IO_RegisterViewer/IO_Register.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using NitroDebugger.RSP; - -namespace IO_RegisterViewer -{ - public interface IO_Register - { - void Read(GdbStream stream); - } -} - diff --git a/IO_RegisterViewer/IO_RegisterViewer.csproj b/IO_RegisterViewer/IO_RegisterViewer.csproj index d02af3b..7f4b494 100644 --- a/IO_RegisterViewer/IO_RegisterViewer.csproj +++ b/IO_RegisterViewer/IO_RegisterViewer.csproj @@ -31,12 +31,15 @@ + + + - - + + @@ -45,4 +48,9 @@ NitroDebugger + + + gui.stetic + + \ No newline at end of file diff --git a/IO_RegisterViewer/bin/Debug/NitroDebugger.pdb b/IO_RegisterViewer/bin/Debug/NitroDebugger.pdb index 0369a059aaa4c754d0f3ea42d1fe3310b1abad12..67ce704c20ec393cd83e2917da7e4a77dba1b45c 100644 GIT binary patch delta 27996 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 NTwS4GJo|gM{{!oym`nfw delta 14970 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 + + + .. + 2.12 + + + + + + + + Window + CenterOnParent + + + + + \ No newline at end of file diff --git a/NitroDebugger/DataStructure.cs b/NitroDebugger/DataStructure.cs index 59fed42..3f225c1 100644 --- a/NitroDebugger/DataStructure.cs +++ b/NitroDebugger/DataStructure.cs @@ -19,13 +19,14 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . using System; +using NitroDebugger.RSP; namespace NitroDebugger { public abstract class DataStructure { - public abstract void Read(); - public abstract void Write(); + public abstract void Read(GdbStream stream); + public abstract void Write(GdbStream stream); } [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] From f3eaa5de75e95a87e95fda9c4dd063eed1bffbcd Mon Sep 17 00:00:00 2001 From: Superfranci99 Date: Sun, 15 Mar 2015 15:49:53 +0100 Subject: [PATCH 15/17] Fixed GdbStream using GdbSessionManager --- IO_RegisterViewer/EngineA.cs | 8 ++++++-- NitroDebugger/DataStructure.cs | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/IO_RegisterViewer/EngineA.cs b/IO_RegisterViewer/EngineA.cs index 754adbe..a8a5613 100644 --- a/IO_RegisterViewer/EngineA.cs +++ b/IO_RegisterViewer/EngineA.cs @@ -12,8 +12,10 @@ namespace IO_RegisterViewer throw new NotImplementedException (); } - public override void Read (GdbStream stream) + public override void Read () { + GdbStream stream = new GdbStream (GdbSessionManager.GetClient(0)); + if (stream == null) return; @@ -56,8 +58,10 @@ namespace IO_RegisterViewer throw new NotImplementedException (); } - public override void Read (GdbStream stream) + public override void Read () { + GdbStream stream = new GdbStream (GdbSessionManager.GetClient(0)); + BinaryReader br = new BinaryReader (stream); this.Bg0cnt = br.ReadInt16 (); diff --git a/NitroDebugger/DataStructure.cs b/NitroDebugger/DataStructure.cs index 3f225c1..a11240e 100644 --- a/NitroDebugger/DataStructure.cs +++ b/NitroDebugger/DataStructure.cs @@ -25,8 +25,8 @@ namespace NitroDebugger { public abstract class DataStructure { - public abstract void Read(GdbStream stream); - public abstract void Write(GdbStream stream); + public abstract void Read(); + public abstract void Write(); } [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] From 695215dafe0add63bc7f4f7081a047b2fea5b014 Mon Sep 17 00:00:00 2001 From: Superfranci99 Date: Sun, 15 Mar 2015 16:05:20 +0100 Subject: [PATCH 16/17] Minor bug fixed --- IO_RegisterViewer/EngineA.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/IO_RegisterViewer/EngineA.cs b/IO_RegisterViewer/EngineA.cs index a8a5613..b31aa2d 100644 --- a/IO_RegisterViewer/EngineA.cs +++ b/IO_RegisterViewer/EngineA.cs @@ -14,7 +14,7 @@ namespace IO_RegisterViewer public override void Read () { - GdbStream stream = new GdbStream (GdbSessionManager.GetClient(0)); + GdbStream stream = GdbSessionManager.GetDefaultClient().Stream; if (stream == null) return; @@ -40,7 +40,6 @@ namespace IO_RegisterViewer public short Dispstat { get; set; } public short Vcount { get; set; } public Engine2D Engine2dA { get; set; } - // public short Disp3dcnt { get; set; } public int Dispcapcnt { get; set; } public int Disp_mmem_fifo { get; set; } @@ -60,7 +59,7 @@ namespace IO_RegisterViewer public override void Read () { - GdbStream stream = new GdbStream (GdbSessionManager.GetClient(0)); + GdbStream stream = GdbSessionManager.GetDefaultClient().Stream; BinaryReader br = new BinaryReader (stream); From b5ae7a8363aa0a20313b9282169aa29958270da8 Mon Sep 17 00:00:00 2001 From: Superfranci99 Date: Sun, 15 Mar 2015 16:08:13 +0100 Subject: [PATCH 17/17] Removed obj and bin folders --- .../bin/Debug/IO_RegisterViewer.pdb | Bin 15872 -> 0 bytes IO_RegisterViewer/bin/Debug/NitroDebugger.pdb | Bin 126464 -> 0 bytes .../gtk-gui/IO_RegisterViewer.Window.cs | 22 ------------- IO_RegisterViewer/gtk-gui/generated.cs | 29 ------------------ IO_RegisterViewer/gtk-gui/gui.stetic | 19 ------------ .../obj/Debug/IO_RegisterViewer.pdb | Bin 15872 -> 0 bytes ...le_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs | 0 ...le_5937a670-0e60-4077-877b-f7221da3dda1.cs | 0 ...le_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs | 0 9 files changed, 70 deletions(-) delete mode 100644 IO_RegisterViewer/bin/Debug/IO_RegisterViewer.pdb delete mode 100644 IO_RegisterViewer/bin/Debug/NitroDebugger.pdb delete mode 100644 IO_RegisterViewer/gtk-gui/IO_RegisterViewer.Window.cs delete mode 100644 IO_RegisterViewer/gtk-gui/generated.cs delete mode 100644 IO_RegisterViewer/gtk-gui/gui.stetic delete mode 100644 IO_RegisterViewer/obj/Debug/IO_RegisterViewer.pdb delete mode 100644 IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs delete mode 100644 IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs delete mode 100644 IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs diff --git a/IO_RegisterViewer/bin/Debug/IO_RegisterViewer.pdb b/IO_RegisterViewer/bin/Debug/IO_RegisterViewer.pdb deleted file mode 100644 index 29f91ad5f0508416668dbda4d81594a1cc9b2ff4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15872 zcmeHNeQcCP8lT;+rSt<^uvie~!`5iQ?RKevo=V$o3oVo)r3hGs?si)?!Y;SFXhpM=#sl@#5EJSBe)G=kzFms6w@dkY zpXS-$yfgDYGxIz%^E@+en?r$UBo^t4PxDpyX3m_}+}bd0uG`}&$emo*DnL#l9Du3d zNBIo8$OQZM4A4N%q!MGmrn6Q9gi0WuU;Og-wIAOWeS8O}jU;bFWc&R`7WK^Rd$OzGtv^ge=K0_;;Cyf%_#AL9xBxs3 zd@h*p7lDhx=0y~R`iJMPJO7p?n0 zpV>w#rqizd?x~>x+y1A99Zps+hO+;8cKmm;%rWZiX3GD+ng5jQy`S%$va@7)-tPWq zp1u?#x!~U(M^B(FdnM9+;3n|r;2>DjA|!O(7v69B3+wW}iFH|)S{GR&i$6AHR0CUa z&qvZ|J|%x?qrKnVqf&vqoPalNL;?EU*j&W%j0f6BHgvl=*Z z=*S`3?h^iVUe(?Z?Fa{gu|TA~E)v+ZAsCK_+82c43pe@OmxSWcNL|pssk=KEZEtK@ zvn<#hip7J`6`|m*$Z6i}Ti+3jxdSmNsVgC=Ga;!v6ki8PVM^-Ml0uO+Q6=dXQ__ab z0WB%LF4c#-L*ZZzy97aL^e89=bx;s@G|q5(C{0uzy%lHqNLP@SadMFBe?NO2D{kw< z`sdy~64LuUHE@}FF^mVj{(bGAyvg;?`9+PfEY+v$y2tbX)_tY-;ybte-o9c^B-{SV zB*z53{$Hj6(_3t3$@))ENwuLkcFgoQB!5BPYuyZ&umShGiL|@1h40{b zkOy%uYhB83$z(=E_P@C5)5g7J zW1X)(wP!8sHj6rxK@x}sgHYlAT^I%muPB8D|8fD?dM15suy1R@4D+JGfMKX4K-0-Oxo0=xjY4LAju zC0zL9tvS6&KGGg=sfEjso(?V_#C-23ypsc_^+`;V&NJbdzgGL-r)vF;16PFpWxtBF z%u2C8=K|~Ma&0S27-h?(t=z-0m7_UE9dpiUJAIsx?~rY=TV>$4RUfYrrk$<@a?I60 z+NB0ayVL?{7ax#zsRK3w>wznP4Zr|!0dOM_HZ!&YQODrCXae2~#7Z(A1uh0Y4{Qd$ z0bBxn57+|S55$xoCR|F2WcT0I2ztLzt%kEw)35{$!tA-t#07{=afhO#ZKK-*ID(LhC4XninNk=_~Ga_YD354Da8QPVp9e?YZpMxf>c;@51( zL2_BS1Mx^S8UJ%$u&yq*#{Z1pu05WQz{bz^3&HdOY{TWeVUW+zeKR{?{*MT%NkZG% zyO6T>ZFqjkY=dLdaVFwEH4cZ0z|FofW+dSZV5r?k#+jJ=GS0*vhqxUlB8OeeNyrqd-(lo8VL zUO8U*2%8)A>QcvPwaOW2QZl7;GJ}i-O28g4*T6zB&O%~6_~={Tidcqxisjyxu>!po zwe^@XxsEB2C1VMeGq$(|%(59^t&uY`wiqwUI8ed8$sx=G{zP$^CC@X5S1}$h_ugb( z*AR7aUm@#O`spK*b+ar72dnHXUH{6#vYozxV+_ z-rL*uhq{g;`kZ5t_6@qcV?!_|C(rLpe*xz1 zTX?vNkCKl1jObS1Y=rO1IrUYwl~ud0OXV=#7#bp17ZYy8L zcC7au8e&@;ht-y;J8vBt^IYNcRo08kUv>W=`wAJ1(^H9M%-1o$uFHB%?*fnK11PnO z_c;2l$Qnbj9`A(pJu>eEG&!+j7f3-4d8fd9{?AE{5|Gpf{|D9dN=`(s@ z&!(LR`k#B~GsjOCVgMD3L*bhn!(9fkps{@)i>!c|SR!QaTUKUKy(hG$Ru7w$#$F;rU#*rpSwfeTNZXj}4W Hpn?AZsyjsM diff --git a/IO_RegisterViewer/bin/Debug/NitroDebugger.pdb b/IO_RegisterViewer/bin/Debug/NitroDebugger.pdb deleted file mode 100644 index 67ce704c20ec393cd83e2917da7e4a77dba1b45c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126464 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 diff --git a/IO_RegisterViewer/gtk-gui/IO_RegisterViewer.Window.cs b/IO_RegisterViewer/gtk-gui/IO_RegisterViewer.Window.cs deleted file mode 100644 index 4572372..0000000 --- a/IO_RegisterViewer/gtk-gui/IO_RegisterViewer.Window.cs +++ /dev/null @@ -1,22 +0,0 @@ - -// This file has been generated by the GUI designer. Do not modify. -namespace IO_RegisterViewer -{ - public partial class Window - { - protected virtual void Build () - { - global::Stetic.Gui.Initialize (this); - // Widget IO_RegisterViewer.Window - this.Name = "IO_RegisterViewer.Window"; - this.Title = global::Mono.Unix.Catalog.GetString ("Window"); - this.WindowPosition = ((global::Gtk.WindowPosition)(4)); - if ((this.Child != null)) { - this.Child.ShowAll (); - } - this.DefaultWidth = 400; - this.DefaultHeight = 300; - this.Show (); - } - } -} diff --git a/IO_RegisterViewer/gtk-gui/generated.cs b/IO_RegisterViewer/gtk-gui/generated.cs deleted file mode 100644 index 9ef3363..0000000 --- a/IO_RegisterViewer/gtk-gui/generated.cs +++ /dev/null @@ -1,29 +0,0 @@ - -// This file has been generated by the GUI designer. Do not modify. -namespace Stetic -{ - internal class Gui - { - private static bool initialized; - - internal static void Initialize (Gtk.Widget iconRenderer) - { - if ((Stetic.Gui.initialized == false)) { - Stetic.Gui.initialized = true; - } - } - } - - internal class ActionGroups - { - public static Gtk.ActionGroup GetActionGroup (System.Type type) - { - return Stetic.ActionGroups.GetActionGroup (type.FullName); - } - - public static Gtk.ActionGroup GetActionGroup (string name) - { - return null; - } - } -} diff --git a/IO_RegisterViewer/gtk-gui/gui.stetic b/IO_RegisterViewer/gtk-gui/gui.stetic deleted file mode 100644 index 4edc5ce..0000000 --- a/IO_RegisterViewer/gtk-gui/gui.stetic +++ /dev/null @@ -1,19 +0,0 @@ - - - - .. - 2.12 - - - - - - - - Window - CenterOnParent - - - - - \ No newline at end of file diff --git a/IO_RegisterViewer/obj/Debug/IO_RegisterViewer.pdb b/IO_RegisterViewer/obj/Debug/IO_RegisterViewer.pdb deleted file mode 100644 index 29f91ad5f0508416668dbda4d81594a1cc9b2ff4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15872 zcmeHNeQcCP8lT;+rSt<^uvie~!`5iQ?RKevo=V$o3oVo)r3hGs?si)?!Y;SFXhpM=#sl@#5EJSBe)G=kzFms6w@dkY zpXS-$yfgDYGxIz%^E@+en?r$UBo^t4PxDpyX3m_}+}bd0uG`}&$emo*DnL#l9Du3d zNBIo8$OQZM4A4N%q!MGmrn6Q9gi0WuU;Og-wIAOWeS8O}jU;bFWc&R`7WK^Rd$OzGtv^ge=K0_;;Cyf%_#AL9xBxs3 zd@h*p7lDhx=0y~R`iJMPJO7p?n0 zpV>w#rqizd?x~>x+y1A99Zps+hO+;8cKmm;%rWZiX3GD+ng5jQy`S%$va@7)-tPWq zp1u?#x!~U(M^B(FdnM9+;3n|r;2>DjA|!O(7v69B3+wW}iFH|)S{GR&i$6AHR0CUa z&qvZ|J|%x?qrKnVqf&vqoPalNL;?EU*j&W%j0f6BHgvl=*Z z=*S`3?h^iVUe(?Z?Fa{gu|TA~E)v+ZAsCK_+82c43pe@OmxSWcNL|pssk=KEZEtK@ zvn<#hip7J`6`|m*$Z6i}Ti+3jxdSmNsVgC=Ga;!v6ki8PVM^-Ml0uO+Q6=dXQ__ab z0WB%LF4c#-L*ZZzy97aL^e89=bx;s@G|q5(C{0uzy%lHqNLP@SadMFBe?NO2D{kw< z`sdy~64LuUHE@}FF^mVj{(bGAyvg;?`9+PfEY+v$y2tbX)_tY-;ybte-o9c^B-{SV zB*z53{$Hj6(_3t3$@))ENwuLkcFgoQB!5BPYuyZ&umShGiL|@1h40{b zkOy%uYhB83$z(=E_P@C5)5g7J zW1X)(wP!8sHj6rxK@x}sgHYlAT^I%muPB8D|8fD?dM15suy1R@4D+JGfMKX4K-0-Oxo0=xjY4LAju zC0zL9tvS6&KGGg=sfEjso(?V_#C-23ypsc_^+`;V&NJbdzgGL-r)vF;16PFpWxtBF z%u2C8=K|~Ma&0S27-h?(t=z-0m7_UE9dpiUJAIsx?~rY=TV>$4RUfYrrk$<@a?I60 z+NB0ayVL?{7ax#zsRK3w>wznP4Zr|!0dOM_HZ!&YQODrCXae2~#7Z(A1uh0Y4{Qd$ z0bBxn57+|S55$xoCR|F2WcT0I2ztLzt%kEw)35{$!tA-t#07{=afhO#ZKK-*ID(LhC4XninNk=_~Ga_YD354Da8QPVp9e?YZpMxf>c;@51( zL2_BS1Mx^S8UJ%$u&yq*#{Z1pu05WQz{bz^3&HdOY{TWeVUW+zeKR{?{*MT%NkZG% zyO6T>ZFqjkY=dLdaVFwEH4cZ0z|FofW+dSZV5r?k#+jJ=GS0*vhqxUlB8OeeNyrqd-(lo8VL zUO8U*2%8)A>QcvPwaOW2QZl7;GJ}i-O28g4*T6zB&O%~6_~={Tidcqxisjyxu>!po zwe^@XxsEB2C1VMeGq$(|%(59^t&uY`wiqwUI8ed8$sx=G{zP$^CC@X5S1}$h_ugb( z*AR7aUm@#O`spK*b+ar72dnHXUH{6#vYozxV+_ z-rL*uhq{g;`kZ5t_6@qcV?!_|C(rLpe*xz1 zTX?vNkCKl1jObS1Y=rO1IrUYwl~ud0OXV=#7#bp17ZYy8L zcC7au8e&@;ht-y;J8vBt^IYNcRo08kUv>W=`wAJ1(^H9M%-1o$uFHB%?*fnK11PnO z_c;2l$Qnbj9`A(pJu>eEG&!+j7f3-4d8fd9{?AE{5|Gpf{|D9dN=`(s@ z&!(LR`k#B~GsjOCVgMD3L*bhn!(9fkps{@)i>!c|SR!QaTUKUKy(hG$Ru7w$#$F;rU#*rpSwfeTNZXj}4W Hpn?AZsyjsM diff --git a/IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs deleted file mode 100644 index e69de29..0000000 diff --git a/IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs deleted file mode 100644 index e69de29..0000000 diff --git a/IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/IO_RegisterViewer/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs deleted file mode 100644 index e69de29..0000000