private void InitializeEmulator(string fileName, bool debug) { emulatorThread = new Thread(() => { emulator = new Emulator { Debug = debug }; emulator.Run(fileName); }); emulatorThread.Start(); //Wait for the emulator to be available while (emulator?.IsRunning != true) { Thread.Sleep(5); } //Build the UI to display the debug data InitializeDebugDataGrid(ref RegistersGrid, ref registersValues, ref emulator.Chip8.V); InitializeDebugDataGrid(ref MemoryGrid, ref memoryValues, ref emulator.Chip8.Memory); InitializeDebugDataGrid(ref KeysGrid, ref keyValues, ref emulator.Chip8.Keys); InitializeDebugDataGrid(ref StackGrid, ref stackValues, ref emulator.Chip8.Stack); //Hook the events KeyDown += emulator.OnKeyPressed; KeyUp += emulator.OnKeyReleased; emulator.OnNewFrame += OnImageChanged; emulator.OnUiTick += OnRefreshDebugGrids; //Initialize the dissasembler var disassembler = new Disassembler.Disassembler(emulator.ProgramCode); FormatDissasembledCode(disassembler.Dissasemble()); }
private void GenerateASMFile() { //Output($"Creating ASM File"); var map = new Dictionary <ulong, List <string> >(); foreach (var symbol in Linker.Symbols) { if (!map.TryGetValue(symbol.VirtualAddress, out List <string> list)) { list = new List <string>(); map.Add(symbol.VirtualAddress, list); } list.Add(symbol.Name); } var textSection = Linker.Sections[(int)SectionKind.Text]; var startingAddress = textSection.VirtualAddress + MultibootHeaderLength; var fileOffset = Linker.BaseFileOffset + MultibootHeaderLength; var length = textSection.Size; var code2 = File.ReadAllBytes(LauncherSettings.OutputFile); var code = new byte[code2.Length]; for (ulong i = fileOffset; i < (ulong)code2.Length; i++) { code[i - fileOffset] = code2[i]; } var disassembler = new Disassembler.Disassembler(LauncherSettings.Platform); disassembler.SetMemory(code, startingAddress); using (var dest = File.CreateText(LauncherSettings.AsmFile)) { foreach (var instruction in disassembler.Decode()) { if (map.TryGetValue(instruction.Address, out List <string> list)) { foreach (var entry in list) { dest.WriteLine($"; {entry}"); } } dest.WriteLine(instruction.Full); if (instruction.Address > startingAddress + length) { break; } } } //Output($"ASM File Created"); }
static void Main(string[] args) { using (var dialog = new OpenFileDialog()) { if (dialog.ShowDialog() != DialogResult.OK) { return; } var disassembler = new Disassembler.Disassembler(new BaseResolver(false, Game.Ghosts), dialog.FileName); var path = Path.Combine(Path.GetDirectoryName(dialog.FileName), Path.GetFileNameWithoutExtension(dialog.FileName)); using (var writer = new StreamWriter(path + ".txt")) { foreach (var function in disassembler.Disassemble()) { writer.Write(function.ToString()); } } } }