private void Disassemble(DisassemblyMode mode, ushort startAddress, ushort length) { if (startAddress > Memory.Size) { throw new InvalidOperationException(String.Format("Start address must be less than the size of system memory ({0}).", Helpers.ToOctal(Memory.Size))); } ushort endAddress = (ushort)Math.Min(Memory.Size, startAddress + length); ushort address = startAddress; while (address < endAddress) { string disassembly = string.Empty; int size = 0; try { switch (mode) { case DisassemblyMode.Processor: size = 1; disassembly = Processor.Disassemble(address); break; case DisassemblyMode.DisplayAuto: disassembly = DisplayProcessor.Disassemble(address, DisplayProcessorMode.Indeterminate, out size); break; case DisassemblyMode.DisplayProcessor: disassembly = DisplayProcessor.Disassemble(address, DisplayProcessorMode.Processor, out size); break; case DisassemblyMode.DisplayIncrement: disassembly = DisplayProcessor.Disassemble(address, DisplayProcessorMode.Increment, out size); break; case DisassemblyMode.DisplayCompact: disassembly = DisplayProcessor.Disassemble(address, DisplayProcessorMode.CompactAddressing, out size); break; } } catch { // this can happen if the data is not a valid instruction disassembly = "<invalid instruction>"; size = 1; } Console.WriteLine("{0}\\{1} {2}", Helpers.ToOctal(address), Helpers.ToOctal(Memory.Fetch(address)), disassembly); address += (ushort)size; } }
// Used by Emblem Magic (and could potentially be used by other external software) public static void Disassemble( EACodeLanguage language, byte[] rom, string filename, TextWriter output, bool addEndGuards, DisassemblyMode mode, int offset, Priority priority, int size, ILog log) { if (offset > rom.Length) { log.AddError("Offset is larger than size of ROM."); } if (size <= 0 || size + offset > rom.Length) { size = rom.Length - offset; } IEnumerable <string[]> strArrays; string[] lines; switch (mode) { case DisassemblyMode.Block: strArrays = language.Disassemble(rom, offset, size, priority, addEndGuards, log); lines = CoreInfo.DefaultLines(language.Name, Path.GetFileName(filename), offset, new int?(size)); break; case DisassemblyMode.ToEnd: strArrays = language.DisassembleToEnd(rom, offset, priority, addEndGuards, log); lines = CoreInfo.DefaultLines(language.Name, Path.GetFileName(filename), offset, new int?()); break; case DisassemblyMode.Structure: strArrays = language.DisassembleChapter(rom, offset, addEndGuards, log); lines = CoreInfo.DefaultLines(language.Name, Path.GetFileName(filename), offset, new int?()); break; default: throw new ArgumentException(); } if (log.ErrorCount == 0) { if (filename.Length > 0) { output.WriteLine(Program.Frame(lines, "//", 1)); output.WriteLine(); } foreach (string[] strArray in strArrays) { output.WriteLine(((IEnumerable <string>)strArray).ToElementWiseString(" ", "", "")); } } }
private void disassembleButton_Click(object sender, EventArgs e) { string game = GetChosenGame(); DisassemblyMode mode = GetChosenMode(); if (textFile == null || binaryFile == null) { MessageBox.Show("Choose both files"); } else if (!File.Exists(binaryFile)) { MessageBox.Show("ROM file doesn't exist."); } else if (!Nintenlord.Event_Assembler.Core.Program.CodesLoaded) { MessageBox.Show("Raws not loaded"); } else { #if DEBUG lastMessages = new StringWriter(); var messageLog = new TextWriterMessageLog(lastMessages); Priority priority; if (mode == DisassemblyMode.Block || mode == DisassemblyMode.ToEnd) { if (!GetPriority(out priority)) { return; } } else { priority = Priority.none; } Core.Program.Disassemble(binaryFile, textFile, game, this.checkBoxEnder.Checked, mode, (int)OffsetControl.Value, priority, (int)LengthControl.Value, messageLog); PrintAll(messageLog); #else disassemblyBackgroundWorker.RunWorkerAsync(Tuple.Create(binaryFile, textFile, game, (int)OffsetControl.Value, (int)LengthControl.Value, mode, this.checkBoxEnder.Checked)); #endif } }
private SystemExecutionState DisassembleProcessor(DisassemblyMode mode, ushort start, ushort length) { Disassemble(mode, start, length); return(SystemExecutionState.Debugging); }
public static void Disassemble(string inputFile, string outputFile, string languageName, bool addEndGuards, DisassemblyMode mode, int offset, Priority priority, int size, ILog messageLog) { if (!File.Exists(inputFile)) { messageLog.AddError("File " + inputFile + " doesn't exist."); return; } else if (File.Exists(outputFile)) { if (File.GetAttributes(outputFile).HasFlag(FileAttributes.ReadOnly)) { messageLog.AddError("Output cannot be written to. It is read-only."); return; } } EACodeLanguage language = languages[languageName]; byte[] data = File.ReadAllBytes(inputFile); if (offset > data.Length) { messageLog.AddError("Offset is larger than size of file."); } else { if (size <= 0 || size + offset > data.Length) { size = data.Length - offset; } IEnumerable<string[]> code; string[] defaultLines; switch (mode) { case DisassemblyMode.Block: code = language.Disassemble(data, offset, size, priority, addEndGuards, messageLog); defaultLines = CoreInfo.DefaultLines(language.Name, Path.GetFileName(inputFile), offset, size); break; case DisassemblyMode.ToEnd: code = language.DisassembleToEnd(data, offset, priority, addEndGuards, messageLog); defaultLines = CoreInfo.DefaultLines(language.Name, Path.GetFileName(inputFile), offset, null); break; case DisassemblyMode.Structure: code = language.DisassembleChapter(data, offset, addEndGuards, messageLog); defaultLines = CoreInfo.DefaultLines(language.Name, Path.GetFileName(inputFile), offset, null); break; default: throw new ArgumentException(); } if (messageLog.ErrorCount == 0) { using (StreamWriter sw = new StreamWriter(outputFile)) { sw.WriteLine(); sw.WriteLine(Frame(defaultLines, "//", 1)); sw.WriteLine(); foreach (string[] line in code) { sw.WriteLine(line.ToElementWiseString(" ", "", "")); } } } } }
// EA GUI Entry point public static void Disassemble(string inputFile, string outputFile, string languageName, bool addEndGuards, DisassemblyMode mode, int offset, Priority priority, int size, ILog messageLog) { Program.RunConfig.inputFile = inputFile; Program.RunConfig.outputFile = outputFile; Program.RunConfig.language = languageName; Program.RunConfig.addEndGuards = addEndGuards; Program.RunConfig.disassemblyMode = mode; Program.RunConfig.disassemblyOffset = offset; Program.RunConfig.disassemblyPriority = priority; Program.RunConfig.disassemblySize = size; Disassemble(messageLog); }
public static void Disassemble(string originalFile, string outputFile, string game, int offset, int size, DisassemblyMode mode, bool addEndingLines) { if (!File.Exists(originalFile)) { messageLog.AddError("File " + originalFile + " doesn't exist."); return; } if (File.Exists(outputFile)) { if ((File.GetAttributes(outputFile) & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { messageLog.AddError("Output cannot be written to. It is read-only."); return; } } EACodeLanguage language = languages[game]; byte[] data = File.ReadAllBytes(originalFile); if (offset > data.Length) { messageLog.AddError("Offset is larger than size of file."); } else { if (size <= 0 || size + offset > data.Length) { size = data.Length - offset; } IEnumerable<string[]> code; string[] defaultLines; switch (mode) { case DisassemblyMode.Block: Priority priority; if (GetPriority(out priority)) { code = language.Disassemble(data, offset, size, priority, addEndingLines); defaultLines = CoreInfo.DefaultLines(game, Path.GetFileName(originalFile), offset, size); } else goto end; break; case DisassemblyMode.ToEnd: if (GetPriority(out priority)) { code = language.DisassembleToEnd(data, offset, priority, addEndingLines); defaultLines = CoreInfo.DefaultLines(game, Path.GetFileName(originalFile), offset, null); } else goto end; break; case DisassemblyMode.Structure: code = language.DisassembleChapter(data, offset, addEndingLines); defaultLines = CoreInfo.DefaultLines(game, Path.GetFileName(originalFile), offset, null); break; default: throw new ArgumentException(); } using (StreamWriter sw = new StreamWriter(outputFile)) { sw.WriteLine(); sw.WriteLine(Frame(defaultLines, "//", 1)); sw.WriteLine(); foreach (string[] line in code) { sw.WriteLine(line.ToElementWiseString(" ", "", "")); } } } messageLog.PrintAll(); end: messageLog.Clear(); }