diff --git a/EveryFileExplorer/EveryFileExplorer.csproj b/EveryFileExplorer/EveryFileExplorer.csproj
index cd891d6..fb5cefb 100644
--- a/EveryFileExplorer/EveryFileExplorer.csproj
+++ b/EveryFileExplorer/EveryFileExplorer.csproj
@@ -65,16 +65,12 @@
Form1.cs
+ Designer
ResXFileCodeGenerator
- Resources.Designer.cs
Designer
-
- True
- Resources.resx
-
SettingsSingleFileGenerator
Settings.Designer.cs
diff --git a/EveryFileExplorer/Properties/Resources.Designer.cs b/EveryFileExplorer/Properties/Resources.Designer.cs
deleted file mode 100644
index 69bc0f5..0000000
--- a/EveryFileExplorer/Properties/Resources.Designer.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// This code was generated by a tool.
-// Runtime Version:4.0.30319.18063
-//
-// Changes to this file may cause incorrect behavior and will be lost if
-// the code is regenerated.
-//
-//------------------------------------------------------------------------------
-
-namespace EveryFileExplorer.Properties
-{
-
-
- ///
- /// A strongly-typed resource class, for looking up localized strings, etc.
- ///
- // This class was auto-generated by the StronglyTypedResourceBuilder
- // class via a tool like ResGen or Visual Studio.
- // To add or remove a member, edit your .ResX file then rerun ResGen
- // with the /str option, or rebuild your VS project.
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- internal class Resources
- {
-
- private static global::System.Resources.ResourceManager resourceMan;
-
- private static global::System.Globalization.CultureInfo resourceCulture;
-
- [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
- internal Resources()
- {
- }
-
- ///
- /// Returns the cached ResourceManager instance used by this class.
- ///
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Resources.ResourceManager ResourceManager
- {
- get
- {
- if ((resourceMan == null))
- {
- global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EveryFileExplorer.Properties.Resources", typeof(Resources).Assembly);
- resourceMan = temp;
- }
- return resourceMan;
- }
- }
-
- ///
- /// Overrides the current thread's CurrentUICulture property for all
- /// resource lookups using this strongly typed resource class.
- ///
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Globalization.CultureInfo Culture
- {
- get
- {
- return resourceCulture;
- }
- set
- {
- resourceCulture = value;
- }
- }
- }
-}
diff --git a/LibEveryFileExplorer/LibEveryFileExplorer.csproj b/LibEveryFileExplorer/LibEveryFileExplorer.csproj
index 92c1c15..666108f 100644
--- a/LibEveryFileExplorer/LibEveryFileExplorer.csproj
+++ b/LibEveryFileExplorer/LibEveryFileExplorer.csproj
@@ -117,6 +117,7 @@
ResXFileCodeGenerator
Resource.Designer.cs
+ Designer
FileBrowser.cs
diff --git a/LibEveryFileExplorer/UI/FileBrowser.Designer.cs b/LibEveryFileExplorer/UI/FileBrowser.Designer.cs
index bf1ca3b..a27442f 100644
--- a/LibEveryFileExplorer/UI/FileBrowser.Designer.cs
+++ b/LibEveryFileExplorer/UI/FileBrowser.Designer.cs
@@ -31,10 +31,6 @@
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FileBrowser));
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.treeView1 = new System.Windows.Forms.TreeView();
- this.splitContainer2 = new System.Windows.Forms.SplitContainer();
- this.listView1 = new LibEveryFileExplorer.UI.ListViewNF();
- this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
- this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.buttonDirAdd = new System.Windows.Forms.ToolStripButton();
this.buttonFileAdd = new System.Windows.Forms.ToolStripButton();
@@ -42,15 +38,13 @@
this.buttonDelete = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.buttonRename = new System.Windows.Forms.ToolStripButton();
- this.propertyGrid1 = new System.Windows.Forms.PropertyGrid();
+ this.listView1 = new LibEveryFileExplorer.UI.ListViewNF();
+ this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+ this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();
- this.splitContainer2.Panel1.SuspendLayout();
- this.splitContainer2.Panel2.SuspendLayout();
- this.splitContainer2.SuspendLayout();
this.toolStrip1.SuspendLayout();
this.SuspendLayout();
//
@@ -67,7 +61,8 @@
//
// splitContainer1.Panel2
//
- this.splitContainer1.Panel2.Controls.Add(this.splitContainer2);
+ this.splitContainer1.Panel2.Controls.Add(this.listView1);
+ this.splitContainer1.Panel2.Controls.Add(this.toolStrip1);
this.splitContainer1.Size = new System.Drawing.Size(700, 391);
this.splitContainer1.SplitterDistance = 175;
this.splitContainer1.TabIndex = 0;
@@ -86,51 +81,6 @@
this.treeView1.TabIndex = 0;
this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
//
- // splitContainer2
- //
- this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
- this.splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
- this.splitContainer2.Location = new System.Drawing.Point(0, 0);
- this.splitContainer2.Name = "splitContainer2";
- //
- // splitContainer2.Panel1
- //
- this.splitContainer2.Panel1.Controls.Add(this.listView1);
- this.splitContainer2.Panel1.Controls.Add(this.toolStrip1);
- //
- // splitContainer2.Panel2
- //
- this.splitContainer2.Panel2.Controls.Add(this.propertyGrid1);
- this.splitContainer2.Size = new System.Drawing.Size(521, 391);
- this.splitContainer2.SplitterDistance = 346;
- this.splitContainer2.TabIndex = 0;
- //
- // listView1
- //
- this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
- this.columnHeader1,
- this.columnHeader2});
- this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.listView1.Location = new System.Drawing.Point(0, 25);
- this.listView1.MultiSelect = false;
- this.listView1.Name = "listView1";
- this.listView1.Size = new System.Drawing.Size(346, 366);
- this.listView1.TabIndex = 0;
- this.listView1.TileSize = new System.Drawing.Size(168, 36);
- this.listView1.UseCompatibleStateImageBehavior = false;
- this.listView1.View = System.Windows.Forms.View.Tile;
- this.listView1.ItemActivate += new System.EventHandler(this.listView1_ItemActivate);
- this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged);
- this.listView1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseClick);
- //
- // columnHeader1
- //
- this.columnHeader1.Text = "Name";
- //
- // columnHeader2
- //
- this.columnHeader2.Text = "Size";
- //
// toolStrip1
//
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
@@ -142,7 +92,7 @@
this.buttonRename});
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
- this.toolStrip1.Size = new System.Drawing.Size(346, 25);
+ this.toolStrip1.Size = new System.Drawing.Size(521, 25);
this.toolStrip1.TabIndex = 1;
this.toolStrip1.Text = "toolStrip1";
//
@@ -196,13 +146,31 @@
this.buttonRename.Text = "Rename";
this.buttonRename.Click += new System.EventHandler(this.buttonRename_Click);
//
- // propertyGrid1
+ // listView1
//
- this.propertyGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.propertyGrid1.Location = new System.Drawing.Point(0, 0);
- this.propertyGrid1.Name = "propertyGrid1";
- this.propertyGrid1.Size = new System.Drawing.Size(171, 391);
- this.propertyGrid1.TabIndex = 0;
+ this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.columnHeader1,
+ this.columnHeader2});
+ this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.listView1.Location = new System.Drawing.Point(0, 25);
+ this.listView1.MultiSelect = false;
+ this.listView1.Name = "listView1";
+ this.listView1.Size = new System.Drawing.Size(521, 366);
+ this.listView1.TabIndex = 0;
+ this.listView1.TileSize = new System.Drawing.Size(168, 36);
+ this.listView1.UseCompatibleStateImageBehavior = false;
+ this.listView1.View = System.Windows.Forms.View.Tile;
+ this.listView1.ItemActivate += new System.EventHandler(this.listView1_ItemActivate);
+ this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged);
+ this.listView1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseClick);
+ //
+ // columnHeader1
+ //
+ this.columnHeader1.Text = "Name";
+ //
+ // columnHeader2
+ //
+ this.columnHeader2.Text = "Size";
//
// FileBrowser
//
@@ -214,13 +182,9 @@
this.Load += new System.EventHandler(this.FileBrowser_Load);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel2.ResumeLayout(false);
+ this.splitContainer1.Panel2.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
- this.splitContainer2.Panel1.ResumeLayout(false);
- this.splitContainer2.Panel1.PerformLayout();
- this.splitContainer2.Panel2.ResumeLayout(false);
- ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit();
- this.splitContainer2.ResumeLayout(false);
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.ResumeLayout(false);
@@ -231,17 +195,15 @@
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.TreeView treeView1;
- private System.Windows.Forms.SplitContainer splitContainer2;
private ListViewNF listView1;
- private System.Windows.Forms.PropertyGrid propertyGrid1;
+ private System.Windows.Forms.ColumnHeader columnHeader1;
+ private System.Windows.Forms.ColumnHeader columnHeader2;
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripButton buttonDirAdd;
private System.Windows.Forms.ToolStripButton buttonFileAdd;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ToolStripButton buttonDelete;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.ToolStripButton buttonRename;
- private System.Windows.Forms.ToolStripButton buttonDelete;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
- private System.Windows.Forms.ColumnHeader columnHeader1;
- private System.Windows.Forms.ColumnHeader columnHeader2;
}
}
diff --git a/NDS/CPU/ARM9.cs b/NDS/CPU/ARM9.cs
new file mode 100644
index 0000000..d8075e6
--- /dev/null
+++ b/NDS/CPU/ARM9.cs
@@ -0,0 +1,433 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using LibEveryFileExplorer.IO;
+
+namespace NDS.CPU
+{
+ public class ARM9
+ {
+ public static byte[] Decompress(byte[] Compressed, uint RamAddress, uint EntryAddress, uint AutoloadDone)
+ {
+ ARM9Context c = new ARM9Context();
+ c.Registers[15] = EntryAddress;
+ Array.Copy(Compressed, 0, c.Memory, RamAddress, Compressed.Length);
+ uint stopaddress;
+ while (true)
+ {
+ ExecuteInstruction(c);
+ if (c.Registers[15] == AutoloadDone)
+ {
+ //Now we know the address of do_autoload + 4, which is MIi_UncompressBackward + 8
+ stopaddress = c.Registers[14] - 4;
+ break;
+ }
+ }
+ c = new ARM9Context();
+ c.Registers[15] = EntryAddress;
+ Array.Copy(Compressed, 0, c.Memory, RamAddress, Compressed.Length);
+ uint length = 0;
+ uint compoffsaddr = 0;
+ while (true)
+ {
+ ExecuteInstruction(c);
+ if (c.Registers[15] == stopaddress - 4)
+ {
+ //look if the file is compressed (R0 = 0 means the data is not compressed!)
+ if (c.Registers[0] == 0) return Compressed;
+ length = c.Registers[0] + IOUtil.ReadU32LE(c.Memory, (int)c.Registers[0] - 4) - RamAddress;
+ compoffsaddr = c.Registers[1] + 0x14 - RamAddress;
+ }
+ //we're done decompressing!
+ if (c.Registers[15] == stopaddress) break;
+ }
+ byte[] result = new byte[length];
+ Array.Copy(c.Memory, RamAddress, result, 0, length);
+ IOUtil.WriteU32LE(result, (int)compoffsaddr, 0);
+ return result;
+ }
+
+ private class ARM9Context
+ {
+ public uint[] Registers = new uint[16];
+ public byte[] Memory = new byte[0x8000000];
+ public bool C;
+ public bool N;
+ public bool V;
+ public bool Z;
+ }
+
+ private static void ExecuteInstruction(ARM9Context c)
+ {
+ uint inst = IOUtil.ReadU32LE(c.Memory, (int)c.Registers[15]);
+ uint condition = inst >> 28;
+ if (EvaluateCondition(c, condition))
+ {
+ switch ((inst >> 25) & 7)
+ {
+ case 0:
+ case 1:
+ DataProc(c, inst);
+ c.Registers[15] += 4;
+ break;
+ case 0x2:
+ case 0x3:
+ SingleDataTrans(c, inst);
+ c.Registers[15] += 4;
+ break;
+ case 0x4:
+ BlockDataTrans(c, inst);
+ c.Registers[15] += 4;
+ break;
+ case 0x5://101
+ Branch(c, inst);
+ break;
+ case 0x7:
+ c.Registers[15] += 4;
+ break;//ignore mcr, mrc and that kind of crap
+ default:
+ c.Registers[15] += 4;
+ break;
+ }
+ }
+ else c.Registers[15] += 4;
+ }
+
+ private static UInt32 Shift(UInt32 ShiftType, UInt32 Value, UInt32 NrBits, ref bool Carry)
+ {
+ switch (ShiftType)
+ {
+ case 0:
+ if (NrBits > 0) Carry = ((Value >> (32 - (int)NrBits)) & 1) == 1;
+ return Value << (int)NrBits;
+ case 1:
+ if (NrBits > 0) Carry = ((Value >> ((int)NrBits - 1)) & 1) == 1;
+ else Carry = ((Value >> 31) & 1) == 1;
+ return Value >> (int)NrBits;
+ case 2:
+ if (NrBits > 0)
+ {
+ Carry = ((Value >> ((int)NrBits - 1)) & 1) == 1;
+ return (uint)(((int)Value) >> (int)NrBits);
+ }
+ else
+ {
+ Carry = ((Value >> 31) & 1) == 1;
+ return ((Value >> 31) & 1) * 0xFFFFFFFF;
+ }
+ case 3:
+ if (NrBits > 0)
+ {
+ Carry = ((Value >> ((int)NrBits - 1)) & 1) == 1;
+ return (Value >> (int)NrBits) | (Value << (32 - (int)NrBits));
+ }
+ else
+ {
+ uint tmp = ((Carry ? 1u : 0u) << 31) | (Value >> 1);
+ Carry = (Value & 1) == 1;
+ return tmp;
+ }
+ }
+ return 0xFFFFFFFF;
+ }
+
+ private static void DataProc(ARM9Context c, uint Instruction)
+ {
+ uint result = 0;
+ uint Rn;
+ if ((Instruction & 0x0FFFFF00) == 0x12FFF00)//bx, blx
+ {
+ uint op = (Instruction >> 4) & 0xF;
+ Rn = Instruction & 0xF;
+ if (op == 1)
+ {
+ c.Registers[15] = c.Registers[Rn] - 4;
+ }
+ else if (op == 3)
+ {
+ c.Registers[14] = c.Registers[15] + 4;
+ c.Registers[15] = c.Registers[Rn] - 4;
+ }
+ else
+ {
+ //shouldn't happen!
+ }
+ return;
+ }
+ bool Shift_C = c.C;
+
+ bool I = ((Instruction >> 25) & 1) == 1;
+ uint Opcode = (Instruction >> 21) & 0xF;
+ bool S = ((Instruction >> 20) & 1) == 1;
+ Rn = (Instruction >> 16) & 0xF;
+ uint Rd = (Instruction >> 12) & 0xF;
+ uint Op2 = 0;
+ if (I)
+ {
+ uint Is = (Instruction >> 8) & 0xF;
+ uint nn = Instruction & 0xFF;
+
+ Op2 = (nn >> (int)(Is * 2)) | (nn << (32 - (int)(Is * 2)));
+ }
+ else
+ {
+ uint ShiftType = (Instruction >> 5) & 0x3;
+ bool R = ((Instruction >> 4) & 1) == 1;
+ uint Rm = Instruction & 0xF;
+
+ if (!R)
+ {
+ uint Is = (Instruction >> 7) & 0x1F;
+ Op2 = Shift(ShiftType, c.Registers[Rm], Is, ref Shift_C);
+ }
+ else
+ {
+ uint Rs = (Instruction >> 8) & 0xF;
+ uint Reserved = (Instruction >> 7) & 1;
+ Op2 = Shift(ShiftType, c.Registers[Rm], c.Registers[Rs] & 0xFF, ref Shift_C);
+ }
+ }
+
+ switch (Opcode)
+ {
+ case 0x2://sub
+ result = c.Registers[Rd] = c.Registers[Rn] - Op2;
+ break;
+ case 0x4://add
+ result = c.Registers[Rd] = c.Registers[Rn] + Op2;
+ break;
+ case 0x8:
+ if (S == false)//MRS
+ {
+ break;
+ }
+ else//TST
+ {
+ result = c.Registers[Rn] & Op2;
+ }
+ break;
+ case 0x9:
+ if (S == false)//MSR
+ {
+ break;
+ }
+ else//TEQ
+ {
+ result = c.Registers[Rn] ^ Op2;
+ }
+ break;
+ case 0xA://compare
+ result = c.Registers[Rn] - Op2;
+ break;
+ case 0xC://OR logical
+ result = c.Registers[Rd] = c.Registers[Rn] | Op2;
+ break;
+ case 0xD://move
+ result = c.Registers[Rd] = Op2;
+ break;
+ case 0xE://bit clear
+ result = c.Registers[Rd] = c.Registers[Rn] & ~Op2;
+ break;
+ default:
+ break;
+ }
+
+ if (S)
+ {
+ bool V = c.V;//tmp
+ bool C = c.C;//tmp
+ bool Z = result == 0;
+ bool N = (result >> 31) == 1;
+ if (Rd != 15)
+ {
+ switch (Opcode)
+ {
+ case 0:
+ case 1:
+ case 8:
+ case 9:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ C = Shift_C;
+ break;
+ //case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ //case 10:
+ case 11:
+ C = !(Op2 > c.Registers[Rn]);
+ break;
+ case 0x2:
+ case 0xA:
+ C = !(Op2 > c.Registers[Rn]);
+ V = ((c.Registers[Rn] < 0 && Op2 >= 0) || (c.Registers[Rn] >= 0 && Op2 < 0)) && ((c.Registers[Rn] < 0 && result >= 0) || (c.Registers[Rn] >= 0 && result < 0));
+ break;
+ }
+ c.C = C;
+ c.N = N;
+ c.V = V;
+ c.Z = Z;
+ }
+ }
+
+ }
+
+ private static void SingleDataTrans(ARM9Context c, UInt32 Instruction)
+ {
+ bool I = ((Instruction >> 25) & 1) == 1;
+ bool P = ((Instruction >> 24) & 1) == 1;
+ bool U = ((Instruction >> 23) & 1) == 1;
+ bool B = ((Instruction >> 22) & 1) == 1;
+
+ bool T = false;
+ bool W = false;
+
+ if (P) W = ((Instruction >> 21) & 1) == 1;
+ else T = ((Instruction >> 21) & 1) == 1;
+
+ bool L = ((Instruction >> 20) & 1) == 1;
+
+ uint Rn = (Instruction >> 16) & 0xF;
+ uint Rd = (Instruction >> 12) & 0xF;
+
+ uint Offset;
+ if (I)
+ {
+ uint Is = (Instruction >> 7) & 0x1F;
+ uint ShiftType = (Instruction >> 5) & 0x3;
+ uint Reserved = (Instruction >> 4) & 1;
+ uint Rm = Instruction & 0xF;
+ bool Shift_C = c.C;
+ Offset = Shift(ShiftType, c.Registers[Rm], Is, ref Shift_C);
+ }
+ else
+ {
+ Offset = Instruction & 0xFFF;
+ }
+
+ uint MemoryOffset = c.Registers[Rn];
+ if (Rn == 15) MemoryOffset += 8;
+ if (P)
+ {
+ if (U) MemoryOffset += Offset;
+ else MemoryOffset -= Offset;
+ if (W) c.Registers[Rn] = MemoryOffset;
+ }
+ if (L)
+ {
+ if (B)
+ {
+ try
+ {
+ c.Registers[Rd] = c.Memory[MemoryOffset];
+ }
+ catch { }
+ }
+ else c.Registers[Rd] = IOUtil.ReadU32LE(c.Memory, (int)MemoryOffset);
+ }
+ else
+ {
+ if (Rd == 15)
+ {
+ if (B) c.Memory[MemoryOffset] = (byte)((c.Registers[Rd] + 12) & 0xFF);
+ else Array.Copy(BitConverter.GetBytes(c.Registers[Rd] + 12), 0, c.Memory, MemoryOffset, 4);
+ }
+ else
+ {
+ if (B) c.Memory[MemoryOffset] = (byte)(c.Registers[Rd] & 0xFF);
+ else Array.Copy(BitConverter.GetBytes(c.Registers[Rd]), 0, c.Memory, MemoryOffset, 4);
+ }
+ }
+ if (!P)
+ {
+ if (U) MemoryOffset += Offset;
+ else MemoryOffset -= Offset;
+ c.Registers[Rn] = MemoryOffset;
+ }
+ }
+
+ private static void BlockDataTrans(ARM9Context c, UInt32 Instruction)
+ {
+ bool P = ((Instruction >> 24) & 1) == 1;
+ bool U = ((Instruction >> 23) & 1) == 1;
+ bool S = ((Instruction >> 22) & 1) == 1;
+ bool W = ((Instruction >> 21) & 1) == 1;
+ bool L = ((Instruction >> 20) & 1) == 1;
+ uint Rn = (Instruction >> 16) & 0xF;
+ uint RList = Instruction & 0xFFFF;
+
+ if (!U && ((RList >> 15) & 1) == 1)
+ {
+ //TODO!
+ }
+
+ uint offs = c.Registers[Rn];
+ for (int i = 0; i < 15; i++)
+ {
+ int reg;
+ if (U) reg = i;
+ else reg = 14 - i;
+ if (((RList >> reg) & 1) == 1)
+ {
+ if (P)
+ {
+ if (U) offs += 4;
+ else offs -= 4;
+ }
+ if (L) c.Registers[reg] = IOUtil.ReadU32LE(c.Memory, (int)offs);
+ else IOUtil.WriteU32LE(c.Memory, (int)offs, c.Registers[reg]);
+ if (!P)
+ {
+ if (U) offs += 4;
+ else offs -= 4;
+ }
+ }
+ }
+ if (U && ((RList >> 15) & 1) == 1)
+ {
+ //TODO!
+ }
+ if (W) c.Registers[Rn] = offs;
+ }
+
+ private static void Branch(ARM9Context c, UInt32 Instruction)
+ {
+ uint Opcode = (Instruction >> 24) & 1;
+ int nn = (int)((Instruction & 0xFFFFFF) << 8) >> 8;
+ if (Opcode == 1)
+ c.Registers[14] = c.Registers[15] + 4;
+ c.Registers[15] = (uint)((int)c.Registers[15] + 8 + nn * 4);
+ }
+
+ private static bool EvaluateCondition(ARM9Context c, uint condition)
+ {
+ switch (condition)
+ {
+ case 0x0: return c.Z == true;
+ case 0x1: return c.Z == false;
+ case 0x2: return c.C == true;
+ case 0x3: return c.C == false;
+ case 0x4: return c.N == true;
+ case 0x5: return c.N == false;
+ case 0x6: return c.V == true;
+ case 0x7: return c.V == false;
+ case 0x8: return c.C == true && c.Z == false;
+ case 0x9: return c.C == false || c.Z == true;
+ case 0xA: return c.N == c.V;
+ case 0xB: return c.N != c.V;
+ case 0xC: return c.Z == false && c.N == c.V;
+ case 0xD: return c.Z == true || c.N != c.V;
+ case 0xE: return true;
+ case 0xF: return false;
+ }
+ //shouldn't happen!
+ return false;
+ }
+ }
+}
diff --git a/NDS/CPU/ASMHackInfo.cs b/NDS/CPU/ASMHackInfo.cs
new file mode 100644
index 0000000..aae2a72
--- /dev/null
+++ b/NDS/CPU/ASMHackInfo.cs
@@ -0,0 +1,109 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml.Serialization;
+using System.IO;
+
+namespace NDS.CPU
+{
+ [Serializable]
+ [XmlRoot("ASMHack")]
+ public class ASMHackInfo
+ {
+ public ASMHackInfo() { }
+ public ASMHackInfo(NDS Rom, UInt32 AreaLo)
+ {
+ AddressInfo.RamAddress = Rom.Header.MainRamAddress;
+ AddressInfo.EntryAddress = Rom.Header.MainEntryAddress;
+ AddressInfo.AutoloadDoneAddress = Rom.Header.MainAutoloadDone;
+ AddressInfo.ArenaLo = AreaLo;
+ //Default:
+ InPath = "arm9.bin";
+ OutPath = "arm9_new.bin";
+ }
+
+ [XmlElement("Addresses")]
+ public Addresses AddressInfo = new Addresses();
+ public class Addresses : IXmlSerializable
+ {
+ public UInt32 RamAddress;
+ public UInt32 EntryAddress;
+ public UInt32 AutoloadDoneAddress;
+ public UInt32 ArenaLo;
+
+ public System.Xml.Schema.XmlSchema GetSchema()
+ {
+ return null;
+ }
+
+ public void ReadXml(System.Xml.XmlReader reader)
+ {
+ reader.ReadStartElement("RamAddress");
+ {
+ RamAddress = uint.Parse(reader.ReadString().Replace("0x", ""), System.Globalization.NumberStyles.HexNumber);
+ }
+ reader.ReadEndElement();
+ reader.ReadStartElement("EntryAddress");
+ {
+ EntryAddress = uint.Parse(reader.ReadString().Replace("0x", ""), System.Globalization.NumberStyles.HexNumber);
+ }
+ reader.ReadEndElement();
+ reader.ReadStartElement("AutoloadDoneAddress");
+ {
+ AutoloadDoneAddress = uint.Parse(reader.ReadString().Replace("0x", ""), System.Globalization.NumberStyles.HexNumber);
+ }
+ reader.ReadEndElement();
+ reader.ReadStartElement("ArenaLo");
+ {
+ ArenaLo = uint.Parse(reader.ReadString().Replace("0x", ""), System.Globalization.NumberStyles.HexNumber);
+ }
+ reader.ReadEndElement();
+ }
+
+ public void WriteXml(System.Xml.XmlWriter writer)
+ {
+ writer.WriteStartElement("RamAddress");
+ {
+ writer.WriteString("0x" + RamAddress.ToString("X8"));
+ }
+ writer.WriteEndElement();
+ writer.WriteStartElement("EntryAddress");
+ {
+ writer.WriteString("0x" + EntryAddress.ToString("X8"));
+ }
+ writer.WriteEndElement();
+ writer.WriteStartElement("AutoloadDoneAddress");
+ {
+ writer.WriteString("0x" + AutoloadDoneAddress.ToString("X8"));
+ }
+ writer.WriteEndElement();
+ writer.WriteStartElement("ArenaLo");
+ {
+ writer.WriteString("0x" + ArenaLo.ToString("X8"));
+ }
+ writer.WriteEndElement();
+ }
+ }
+ public String InPath;
+ public String OutPath;
+
+ public static ASMHackInfo FromByteArray(byte[] Data)
+ {
+ XmlSerializer s = new XmlSerializer(typeof(ASMHackInfo));
+ return (ASMHackInfo)s.Deserialize(new MemoryStream(Data));
+ }
+
+ public byte[] Write()
+ {
+ XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
+ ns.Add("", "");
+ XmlSerializer s = new XmlSerializer(typeof(ASMHackInfo));
+ MemoryStream m = new MemoryStream();
+ s.Serialize(m, this, ns);
+ byte[] data = m.ToArray();
+ m.Close();
+ return data;
+ }
+ }
+}
diff --git a/NDS/NDS.cs b/NDS/NDS.cs
index c92c3e4..541d943 100644
--- a/NDS/NDS.cs
+++ b/NDS/NDS.cs
@@ -8,6 +8,7 @@ using System.Drawing;
using System.Windows.Forms;
using LibEveryFileExplorer.Files.SimpleFileSystem;
using NDS.UI;
+using NDS.CPU;
namespace NDS
{
@@ -16,39 +17,38 @@ namespace NDS
public NDS(byte[] data)
{
EndianBinaryReader er = new EndianBinaryReader(new MemoryStream(data), Endianness.LittleEndian);
- header = new ROM_Header(er);
+ Header = new RomHeader(er);
- er.BaseStream.Position = header.main_rom_offset;
- main_rom = er.ReadBytes((int)header.main_size);
+ er.BaseStream.Position = Header.MainRomOffset;
+ MainRom = er.ReadBytes((int)Header.MainSize);
- er.BaseStream.Position = header.sub_rom_offset;
- sub_rom = er.ReadBytes((int)header.sub_size);
+ er.BaseStream.Position = Header.SubRomOffset;
+ SubRom = er.ReadBytes((int)Header.SubSize);
- er.BaseStream.Position = header.fnt_offset;
- fnt = new ROM_FNT(er);
+ er.BaseStream.Position = Header.FntOffset;
+ Fnt = new RomFNT(er);
- er.BaseStream.Position = header.main_ovt_offset;
- main_ovt = new ROM_OVT[header.main_ovt_size / 32];
- for (int i = 0; i < header.main_ovt_size / 32; i++) main_ovt[i] = new ROM_OVT(er);
+ er.BaseStream.Position = Header.MainOvtOffset;
+ MainOvt = new RomOVT[Header.MainOvtSize / 32];
+ for (int i = 0; i < Header.MainOvtSize / 32; i++) MainOvt[i] = new RomOVT(er);
- er.BaseStream.Position = header.sub_ovt_offset;
- sub_ovt = new ROM_OVT[header.sub_ovt_size / 32];
- for (int i = 0; i < header.sub_ovt_size / 32; i++) sub_ovt[i] = new ROM_OVT(er);
+ er.BaseStream.Position = Header.SubOvtOffset;
+ SubOvt = new RomOVT[Header.SubOvtSize / 32];
+ for (int i = 0; i < Header.SubOvtSize / 32; i++) SubOvt[i] = new RomOVT(er);
- er.BaseStream.Position = header.fat_offset;
- fat = new FileAllocationEntry[header.fat_size / 8];
- for (int i = 0; i < header.fat_size / 8; i++) fat[i] = new FileAllocationEntry(er);
+ er.BaseStream.Position = Header.FatOffset;
+ Fat = new FileAllocationEntry[Header.FatSize / 8];
+ for (int i = 0; i < Header.FatSize / 8; i++) Fat[i] = new FileAllocationEntry(er);
- er.BaseStream.Position = header.banner_offset;
- banner = new BannerFile(er);
+ er.BaseStream.Position = Header.BannerOffset;
+ Banner = new RomBanner(er);
- FileData = new byte[header.fat_size / 8][];
- for (int i = 0; i < header.fat_size / 8; i++)
+ FileData = new byte[Header.FatSize / 8][];
+ for (int i = 0; i < Header.FatSize / 8; i++)
{
- er.BaseStream.Position = fat[i].fileTop;
- FileData[i] = er.ReadBytes((int)fat[i].fileSize);
+ er.BaseStream.Position = Fat[i].fileTop;
+ FileData[i] = er.ReadBytes((int)Fat[i].fileSize);
}
-
er.Close();
}
@@ -57,214 +57,214 @@ namespace NDS
return new NDSViewer(this);
}
- public ROM_Header header;
- public class ROM_Header
+ public RomHeader Header;
+ public class RomHeader
{
- public ROM_Header(EndianBinaryReader er)
+ public RomHeader(EndianBinaryReader er)
{
- game_name = er.ReadString(Encoding.ASCII, 12).Replace("\0", "");
- game_code = er.ReadString(Encoding.ASCII, 4).Replace("\0", "");
- maker_code = er.ReadString(Encoding.ASCII, 2).Replace("\0", "");
- product_id = er.ReadByte();
- device_type = er.ReadByte();
- device_size = er.ReadByte();
- reserved_A = er.ReadBytes(9);
- game_version = er.ReadByte();
- property = er.ReadByte();
+ GameName = er.ReadString(Encoding.ASCII, 12).Replace("\0", "");
+ GameCode = er.ReadString(Encoding.ASCII, 4).Replace("\0", "");
+ MakerCode = er.ReadString(Encoding.ASCII, 2).Replace("\0", "");
+ ProductId = er.ReadByte();
+ DeviceType = er.ReadByte();
+ DeviceSize = er.ReadByte();
+ ReservedA = er.ReadBytes(9);
+ GameVersion = er.ReadByte();
+ Property = er.ReadByte();
- main_rom_offset = er.ReadUInt32();
- main_entry_address = er.ReadUInt32();
- main_ram_address = er.ReadUInt32();
- main_size = er.ReadUInt32();
- sub_rom_offset = er.ReadUInt32();
- sub_entry_address = er.ReadUInt32();
- sub_ram_address = er.ReadUInt32();
- sub_size = er.ReadUInt32();
+ MainRomOffset = er.ReadUInt32();
+ MainEntryAddress = er.ReadUInt32();
+ MainRamAddress = er.ReadUInt32();
+ MainSize = er.ReadUInt32();
+ SubRomOffset = er.ReadUInt32();
+ SubEntryAddress = er.ReadUInt32();
+ SubRamAddress = er.ReadUInt32();
+ SubSize = er.ReadUInt32();
- fnt_offset = er.ReadUInt32();
- fnt_size = er.ReadUInt32();
+ FntOffset = er.ReadUInt32();
+ FntSize = er.ReadUInt32();
- fat_offset = er.ReadUInt32();
- fat_size = er.ReadUInt32();
+ FatOffset = er.ReadUInt32();
+ FatSize = er.ReadUInt32();
- main_ovt_offset = er.ReadUInt32();
- main_ovt_size = er.ReadUInt32();
+ MainOvtOffset = er.ReadUInt32();
+ MainOvtSize = er.ReadUInt32();
- sub_ovt_offset = er.ReadUInt32();
- sub_ovt_size = er.ReadUInt32();
+ SubOvtOffset = er.ReadUInt32();
+ SubOvtSize = er.ReadUInt32();
- rom_param_A = er.ReadBytes(8);
- banner_offset = er.ReadUInt32();
- secure_crc = er.ReadUInt16();
- rom_param_B = er.ReadBytes(2);
+ RomParamA = er.ReadBytes(8);
+ BannerOffset = er.ReadUInt32();
+ SecureCRC = er.ReadUInt16();
+ RomParamB = er.ReadBytes(2);
- main_autoload_done = er.ReadUInt32();
- sub_autoload_done = er.ReadUInt32();
+ MainAutoloadDone = er.ReadUInt32();
+ SubAutoloadDone = er.ReadUInt32();
- rom_param_C = er.ReadBytes(8);
- rom_size = er.ReadUInt32();
- header_size = er.ReadUInt32();
- reserved_B = er.ReadBytes(0x38);
+ RomParamC = er.ReadBytes(8);
+ RomSize = er.ReadUInt32();
+ HeaderSize = er.ReadUInt32();
+ ReservedB = er.ReadBytes(0x38);
- logo_data = er.ReadBytes(0x9C);
- logo_crc = er.ReadUInt16();
- header_crc = er.ReadUInt16();
+ LogoData = er.ReadBytes(0x9C);
+ LogoCRC = er.ReadUInt16();
+ HeaderCRC = er.ReadUInt16();
}
- public String game_name;//12
- public String game_code;//4
- public String maker_code;//2
- public Byte product_id;
- public Byte device_type;
- public Byte device_size;
- public byte[] reserved_A;//9
- public Byte game_version;
- public Byte property;
+ public String GameName;//12
+ public String GameCode;//4
+ public String MakerCode;//2
+ public Byte ProductId;
+ public Byte DeviceType;
+ public Byte DeviceSize;
+ public byte[] ReservedA;//9
+ public Byte GameVersion;
+ public Byte Property;
- public UInt32 main_rom_offset;
- public UInt32 main_entry_address;
- public UInt32 main_ram_address;
- public UInt32 main_size;
- public UInt32 sub_rom_offset;
- public UInt32 sub_entry_address;
- public UInt32 sub_ram_address;
- public UInt32 sub_size;
+ public UInt32 MainRomOffset;
+ public UInt32 MainEntryAddress;
+ public UInt32 MainRamAddress;
+ public UInt32 MainSize;
+ public UInt32 SubRomOffset;
+ public UInt32 SubEntryAddress;
+ public UInt32 SubRamAddress;
+ public UInt32 SubSize;
- public UInt32 fnt_offset;
- public UInt32 fnt_size;
+ public UInt32 FntOffset;
+ public UInt32 FntSize;
- public UInt32 fat_offset;
- public UInt32 fat_size;
+ public UInt32 FatOffset;
+ public UInt32 FatSize;
- public UInt32 main_ovt_offset;
- public UInt32 main_ovt_size;
+ public UInt32 MainOvtOffset;
+ public UInt32 MainOvtSize;
- public UInt32 sub_ovt_offset;
- public UInt32 sub_ovt_size;
+ public UInt32 SubOvtOffset;
+ public UInt32 SubOvtSize;
- public byte[] rom_param_A;//8
- public UInt32 banner_offset;
- public UInt16 secure_crc;
- public byte[] rom_param_B;//2
+ public byte[] RomParamA;//8
+ public UInt32 BannerOffset;
+ public UInt16 SecureCRC;
+ public byte[] RomParamB;//2
- public UInt32 main_autoload_done;
- public UInt32 sub_autoload_done;
+ public UInt32 MainAutoloadDone;
+ public UInt32 SubAutoloadDone;
- public byte[] rom_param_C;//8
- public UInt32 rom_size;
- public UInt32 header_size;
- public byte[] reserved_B;//0x38
+ public byte[] RomParamC;//8
+ public UInt32 RomSize;
+ public UInt32 HeaderSize;
+ public byte[] ReservedB;//0x38
- public byte[] logo_data;//0x9C
- public UInt16 logo_crc;
- public UInt16 header_crc;
+ public byte[] LogoData;//0x9C
+ public UInt16 LogoCRC;
+ public UInt16 HeaderCRC;
}
- public Byte[] main_rom;
- public Byte[] sub_rom;
- public ROM_FNT fnt;
- public class ROM_FNT
+ public Byte[] MainRom;
+ public Byte[] SubRom;
+ public RomFNT Fnt;
+ public class RomFNT
{
- public ROM_FNT(EndianBinaryReader er)
+ public RomFNT(EndianBinaryReader er)
{
- directoryTable = new List();
- directoryTable.Add(new DirectoryTableEntry(er));
- for (int i = 0; i < directoryTable[0].dirParentID - 1; i++)
+ DirectoryTable = new List();
+ DirectoryTable.Add(new DirectoryTableEntry(er));
+ for (int i = 0; i < DirectoryTable[0].dirParentID - 1; i++)
{
- directoryTable.Add(new DirectoryTableEntry(er));
+ DirectoryTable.Add(new DirectoryTableEntry(er));
}
- entryNameTable = new List();
+ EntryNameTable = new List();
int dirend = 0;
- while (dirend < directoryTable[0].dirParentID)
+ while (dirend < DirectoryTable[0].dirParentID)
{
byte entryNameLength = er.ReadByte();
er.BaseStream.Position--;
if (entryNameLength == 0)
{
- entryNameTable.Add(new EntryNameTableEndOfDirectoryEntry(er));
+ EntryNameTable.Add(new EntryNameTableEndOfDirectoryEntry(er));
dirend++;
}
- else if (entryNameLength < 0x80) entryNameTable.Add(new EntryNameTableFileEntry(er));
- else entryNameTable.Add(new EntryNameTableDirectoryEntry(er));
+ else if (entryNameLength < 0x80) EntryNameTable.Add(new EntryNameTableFileEntry(er));
+ else EntryNameTable.Add(new EntryNameTableDirectoryEntry(er));
}
}
- public List directoryTable;
- public List entryNameTable;
+ public List DirectoryTable;
+ public List EntryNameTable;
}
- public ROM_OVT[] main_ovt;
- public ROM_OVT[] sub_ovt;
- public class ROM_OVT
+ public RomOVT[] MainOvt;
+ public RomOVT[] SubOvt;
+ public class RomOVT
{
[Flags]
- public enum OVT_Flag : byte
+ public enum OVTFlag : byte
{
Compressed = 1,
- Authentication_Code = 2
+ AuthenticationCode = 2
}
- public ROM_OVT(EndianBinaryReader er)
+ public RomOVT(EndianBinaryReader er)
{
- id = er.ReadUInt32();
- ram_address = er.ReadUInt32();
- ram_size = er.ReadUInt32();
- bss_size = er.ReadUInt32();
- sinit_init = er.ReadUInt32();
- sinit_init_end = er.ReadUInt32();
- file_id = er.ReadUInt32();
+ Id = er.ReadUInt32();
+ RamAddress = er.ReadUInt32();
+ RamSize = er.ReadUInt32();
+ BssSize = er.ReadUInt32();
+ SinitInit = er.ReadUInt32();
+ SinitInitEnd = er.ReadUInt32();
+ FileId = er.ReadUInt32();
UInt32 tmp = er.ReadUInt32();
- compressed = tmp & 0xFFFFFF;
- flag = (OVT_Flag)(tmp >> 24);
+ Compressed = tmp & 0xFFFFFF;
+ Flag = (OVTFlag)(tmp >> 24);
}
- public UInt32 id;
- public UInt32 ram_address;
- public UInt32 ram_size;
- public UInt32 bss_size;
- public UInt32 sinit_init;
- public UInt32 sinit_init_end;
- public UInt32 file_id;
+ public UInt32 Id;
+ public UInt32 RamAddress;
+ public UInt32 RamSize;
+ public UInt32 BssSize;
+ public UInt32 SinitInit;
+ public UInt32 SinitInitEnd;
+ public UInt32 FileId;
- public UInt32 compressed;//:24;
- public OVT_Flag flag;// :8;
+ public UInt32 Compressed;//:24;
+ public OVTFlag Flag;// :8;
}
- public FileAllocationEntry[] fat;
- public BannerFile banner;
- public class BannerFile
+ public FileAllocationEntry[] Fat;
+ public RomBanner Banner;
+ public class RomBanner
{
- public BannerFile(EndianBinaryReader er)
+ public RomBanner(EndianBinaryReader er)
{
- h = new BannerHeader(er);
- v1 = new BannerFileV1(er);
+ Header = new BannerHeader(er);
+ Banner = new BannerV1(er);
}
- BannerHeader h;
+ BannerHeader Header;
public class BannerHeader
{
public BannerHeader(EndianBinaryReader er)
{
- version = er.ReadByte();
- reserved_A = er.ReadByte();
- crc16_v1 = er.ReadUInt16();
- reserved_B = er.ReadBytes(28);
+ Version = er.ReadByte();
+ ReservedA = er.ReadByte();
+ CRC16_v1 = er.ReadUInt16();
+ ReservedB = er.ReadBytes(28);
}
- public Byte version;
- public Byte reserved_A;
- public UInt16 crc16_v1;
- public Byte[] reserved_B;//28
+ public Byte Version;
+ public Byte ReservedA;
+ public UInt16 CRC16_v1;
+ public Byte[] ReservedB;//28
}
- BannerFileV1 v1;
- public class BannerFileV1
+ BannerV1 Banner;
+ public class BannerV1
{
- public BannerFileV1(EndianBinaryReader er)
+ public BannerV1(EndianBinaryReader er)
{
- image = er.ReadBytes(32 * 32 / 2);
- pltt = er.ReadBytes(16 * 2);
- gameName = new string[6];
- gameName[0] = er.ReadString(Encoding.Unicode, 128).Replace("\0", "");
- gameName[1] = er.ReadString(Encoding.Unicode, 128).Replace("\0", "");
- gameName[2] = er.ReadString(Encoding.Unicode, 128).Replace("\0", "");
- gameName[3] = er.ReadString(Encoding.Unicode, 128).Replace("\0", "");
- gameName[4] = er.ReadString(Encoding.Unicode, 128).Replace("\0", "");
- gameName[5] = er.ReadString(Encoding.Unicode, 128).Replace("\0", "");
+ Image = er.ReadBytes(32 * 32 / 2);
+ Pltt = er.ReadBytes(16 * 2);
+ GameName = new string[6];
+ GameName[0] = er.ReadString(Encoding.Unicode, 128).Replace("\0", "");
+ GameName[1] = er.ReadString(Encoding.Unicode, 128).Replace("\0", "");
+ GameName[2] = er.ReadString(Encoding.Unicode, 128).Replace("\0", "");
+ GameName[3] = er.ReadString(Encoding.Unicode, 128).Replace("\0", "");
+ GameName[4] = er.ReadString(Encoding.Unicode, 128).Replace("\0", "");
+ GameName[5] = er.ReadString(Encoding.Unicode, 128).Replace("\0", "");
}
- public Byte[] image;//32*32/2
- public Byte[] pltt;//16*2
- public String[] gameName;//6, 128 chars (UTF16-LE)
+ public Byte[] Image;//32*32/2
+ public Byte[] Pltt;//16*2
+ public String[] GameName;//6, 128 chars (UTF16-LE)
}
}
public Byte[][] FileData;
@@ -276,14 +276,14 @@ namespace NDS
dirs.Add(new SFSDirectory("/", true));
dirs[0].DirectoryID = 0xF000;
- uint nrdirs = fnt.directoryTable[0].dirParentID;
+ uint nrdirs = Fnt.DirectoryTable[0].dirParentID;
for (int i = 1; i < nrdirs; i++)
{
dirs.Add(new SFSDirectory((ushort)(0xF000 + i)));
}
for (int i = 1; i < nrdirs; i++)
{
- if (fnt.directoryTable[i].dirParentID - 0xF000 == i)
+ if (Fnt.DirectoryTable[i].dirParentID - 0xF000 == i)
{
treereconstruct = true;
foreach (var v in dirs)
@@ -292,7 +292,7 @@ namespace NDS
}
break;
}
- dirs[i].Parent = dirs[fnt.directoryTable[i].dirParentID - 0xF000];
+ dirs[i].Parent = dirs[Fnt.DirectoryTable[i].dirParentID - 0xF000];
}
if (!treereconstruct)
{
@@ -308,13 +308,13 @@ namespace NDS
}
}
uint offset = nrdirs * 8;
- ushort fileid = fnt.directoryTable[0].dirEntryFileID;
+ ushort fileid = Fnt.DirectoryTable[0].dirEntryFileID;
SFSDirectory curdir = null;
- foreach (EntryNameTableEntry e in fnt.entryNameTable)
+ foreach (EntryNameTableEntry e in Fnt.EntryNameTable)
{
for (int i = 0; i < nrdirs; i++)
{
- if (offset == fnt.directoryTable[i].dirEntryStart)
+ if (offset == Fnt.DirectoryTable[i].dirEntryStart)
{
curdir = dirs[i];
break;
@@ -341,7 +341,7 @@ namespace NDS
offset += 3u + (e.entryNameLength & 0x7Fu);
}
}
- for (int i = (int)(header.main_ovt_size / 32 + header.sub_ovt_size / 32); i < header.fat_size / 8; i++)
+ for (int i = (int)(Header.MainOvtSize / 32 + Header.SubOvtSize / 32); i < Header.FatSize / 8; i++)
{
//byte[] data = new byte[fat[i].fileSize];
//Array.Copy(FileData FIMG.fileImage, fat[i].fileTop, data, 0, data.Length);
@@ -350,6 +350,11 @@ namespace NDS
return dirs[0];
}
+ public byte[] GetDecompressedARM9()
+ {
+ return ARM9.Decompress(MainRom, Header.MainRamAddress, Header.MainEntryAddress, Header.MainAutoloadDone);
+ }
+
public class NDSIdentifier : FileFormatIdentifier
{
public override string GetCategory()
diff --git a/NDS/NDS.csproj b/NDS/NDS.csproj
index d2e544b..0808e37 100644
--- a/NDS/NDS.csproj
+++ b/NDS/NDS.csproj
@@ -52,6 +52,8 @@
+
+
diff --git a/NDS/UI/NDSViewer.Designer.cs b/NDS/UI/NDSViewer.Designer.cs
index b28b127..7267992 100644
--- a/NDS/UI/NDSViewer.Designer.cs
+++ b/NDS/UI/NDSViewer.Designer.cs
@@ -53,6 +53,20 @@
this.menuItem10 = new System.Windows.Forms.MenuItem();
this.menuItem11 = new System.Windows.Forms.MenuItem();
this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
+ this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+ this.tabControl1 = new System.Windows.Forms.TabControl();
+ this.tabPage1 = new System.Windows.Forms.TabPage();
+ this.tabPage2 = new System.Windows.Forms.TabPage();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.button1 = new System.Windows.Forms.Button();
+ this.button2 = new System.Windows.Forms.Button();
+ ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+ this.splitContainer1.Panel1.SuspendLayout();
+ this.splitContainer1.Panel2.SuspendLayout();
+ this.splitContainer1.SuspendLayout();
+ this.tabControl1.SuspendLayout();
+ this.tabPage2.SuspendLayout();
+ this.groupBox1.SuspendLayout();
this.SuspendLayout();
//
// fileBrowser1
@@ -66,7 +80,7 @@
this.fileBrowser1.ShowAddFileButton = false;
this.fileBrowser1.ShowDeleteButton = false;
this.fileBrowser1.ShowRenameButton = false;
- this.fileBrowser1.Size = new System.Drawing.Size(652, 338);
+ this.fileBrowser1.Size = new System.Drawing.Size(475, 338);
this.fileBrowser1.TabIndex = 0;
this.fileBrowser1.OnDirectoryChanged += new LibEveryFileExplorer.UI.FileBrowser.OnDirectoryChangedEventHandler(this.fileBrowser1_OnDirectoryChanged);
this.fileBrowser1.OnFileActivated += new LibEveryFileExplorer.UI.FileBrowser.OnFileActivatedEventHandler(this.fileBrowser1_OnFileActivated);
@@ -233,17 +247,109 @@
//
this.saveFileDialog1.Title = "Export...";
//
+ // splitContainer1
+ //
+ this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+ this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+ this.splitContainer1.Name = "splitContainer1";
+ //
+ // splitContainer1.Panel1
+ //
+ this.splitContainer1.Panel1.Controls.Add(this.fileBrowser1);
+ //
+ // splitContainer1.Panel2
+ //
+ this.splitContainer1.Panel2.Controls.Add(this.tabControl1);
+ this.splitContainer1.Size = new System.Drawing.Size(652, 338);
+ this.splitContainer1.SplitterDistance = 475;
+ this.splitContainer1.TabIndex = 1;
+ //
+ // tabControl1
+ //
+ this.tabControl1.Controls.Add(this.tabPage1);
+ this.tabControl1.Controls.Add(this.tabPage2);
+ this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tabControl1.Location = new System.Drawing.Point(0, 0);
+ this.tabControl1.Name = "tabControl1";
+ this.tabControl1.SelectedIndex = 0;
+ this.tabControl1.Size = new System.Drawing.Size(173, 338);
+ this.tabControl1.TabIndex = 0;
+ //
+ // tabPage1
+ //
+ this.tabPage1.Location = new System.Drawing.Point(4, 22);
+ this.tabPage1.Name = "tabPage1";
+ this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPage1.Size = new System.Drawing.Size(165, 312);
+ this.tabPage1.TabIndex = 0;
+ this.tabPage1.Text = "Banner";
+ this.tabPage1.UseVisualStyleBackColor = true;
+ //
+ // tabPage2
+ //
+ this.tabPage2.Controls.Add(this.groupBox1);
+ this.tabPage2.Location = new System.Drawing.Point(4, 22);
+ this.tabPage2.Name = "tabPage2";
+ this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPage2.Size = new System.Drawing.Size(165, 312);
+ this.tabPage2.TabIndex = 1;
+ this.tabPage2.Text = "Code";
+ this.tabPage2.UseVisualStyleBackColor = true;
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.button1);
+ this.groupBox1.Controls.Add(this.button2);
+ this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupBox1.Location = new System.Drawing.Point(3, 3);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Padding = new System.Windows.Forms.Padding(3, 3, 3, 6);
+ this.groupBox1.Size = new System.Drawing.Size(159, 68);
+ this.groupBox1.TabIndex = 0;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "ARM9";
+ //
+ // button1
+ //
+ this.button1.Dock = System.Windows.Forms.DockStyle.Top;
+ this.button1.Location = new System.Drawing.Point(3, 39);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(153, 23);
+ this.button1.TabIndex = 0;
+ this.button1.Text = "Export Decompressed...";
+ this.button1.UseVisualStyleBackColor = true;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // button2
+ //
+ this.button2.Dock = System.Windows.Forms.DockStyle.Top;
+ this.button2.Location = new System.Drawing.Point(3, 16);
+ this.button2.Name = "button2";
+ this.button2.Size = new System.Drawing.Size(153, 23);
+ this.button2.TabIndex = 1;
+ this.button2.Text = "Export...";
+ this.button2.UseVisualStyleBackColor = true;
+ this.button2.Click += new System.EventHandler(this.button2_Click);
+ //
// NDSViewer
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(652, 338);
- this.Controls.Add(this.fileBrowser1);
+ this.Controls.Add(this.splitContainer1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Menu = this.mainMenu1;
this.Name = "NDSViewer";
this.Text = "NARC Viewer";
this.Load += new System.EventHandler(this.NARCViewer_Load);
+ this.splitContainer1.Panel1.ResumeLayout(false);
+ this.splitContainer1.Panel2.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+ this.splitContainer1.ResumeLayout(false);
+ this.tabControl1.ResumeLayout(false);
+ this.tabPage2.ResumeLayout(false);
+ this.groupBox1.ResumeLayout(false);
this.ResumeLayout(false);
}
@@ -273,5 +379,12 @@
private System.Windows.Forms.SaveFileDialog saveFileDialog1;
private System.Windows.Forms.MenuItem menuReplace;
private System.Windows.Forms.MenuItem menuItem14;
+ private System.Windows.Forms.SplitContainer splitContainer1;
+ private System.Windows.Forms.TabControl tabControl1;
+ private System.Windows.Forms.TabPage tabPage1;
+ private System.Windows.Forms.TabPage tabPage2;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.Button button2;
}
}
\ No newline at end of file
diff --git a/NDS/UI/NDSViewer.cs b/NDS/UI/NDSViewer.cs
index 791f996..f5f0e39 100644
--- a/NDS/UI/NDSViewer.cs
+++ b/NDS/UI/NDSViewer.cs
@@ -10,6 +10,7 @@ using LibEveryFileExplorer.Files.SimpleFileSystem;
using LibEveryFileExplorer;
using LibEveryFileExplorer.Files;
using NDS.NitroSystem.FND;
+using System.IO;
namespace NDS.UI
{
@@ -232,5 +233,29 @@ namespace NDS.UI
fileBrowser1.UpdateDirectories(Root.GetTreeNodes(), true);
*/
}
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ saveFileDialog1.FileName = "arm9.bin";
+ saveFileDialog1.Filter = "Binary Data (*.bin)|*.bin";
+ if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK
+ && saveFileDialog1.FileName.Length > 0)
+ {
+ File.Create(saveFileDialog1.FileName).Close();
+ File.WriteAllBytes(saveFileDialog1.FileName, Archive.GetDecompressedARM9());
+ }
+ }
+
+ private void button2_Click(object sender, EventArgs e)
+ {
+ saveFileDialog1.FileName = "arm9.bin";
+ saveFileDialog1.Filter = "Binary Data (*.bin)|*.bin";
+ if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK
+ && saveFileDialog1.FileName.Length > 0)
+ {
+ File.Create(saveFileDialog1.FileName).Close();
+ File.WriteAllBytes(saveFileDialog1.FileName, Archive.MainRom);
+ }
+ }
}
}