Пример #1
0
        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;
            }
        }
Пример #2
0
        // 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(" ", "", ""));
                }
            }
        }
Пример #3
0
        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
            }
        }
Пример #4
0
 private SystemExecutionState DisassembleProcessor(DisassemblyMode mode, ushort start, ushort length)
 {
     Disassemble(mode, start, length);
     return(SystemExecutionState.Debugging);
 }
Пример #5
0
        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(" ", "", ""));
                        }
                    }
                }
            }
        }
Пример #6
0
        // 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();
        }