private static IEnumerable <CompileConfig> ExtractDirectives(string filePath)
 {
     using (var file = new StreamReader(filePath))
     {
         string line = null;
         while ((line = file.ReadLine()) != null)
         {
             if (!line.StartsWith("#pragma FXC"))
             {
                 yield break;
             }
             var match   = FxcPragmaPatten.Match(line);
             var options = new CompileConfig()
             {
                 Name       = match.Groups[1].Value,
                 Profile    = match.Groups[2].Success ? match.Groups[2].Value : match.Groups[3].Value,
                 EntryPoint = match.Groups[4].Value,
                 ExtraArgs  = match.Groups[5].Value
             };
             if (options.Name == "" || options.Profile == "")
             {
                 throw new InvalidOperationException($"Could not parse FXC directive: {line}");
             }
             yield return(options);
         }
     }
 }
        private static void CompileShader(string sourcePath, CompileConfig config)
        {
            var targetDirectory = Path.GetDirectoryName(sourcePath);
            var objectPath      = Path.Combine(targetDirectory, $"{config.Name}.o");

            DateTime srcTime = File.GetLastWriteTime(sourcePath);
            DateTime dstTime = File.GetLastWriteTime(objectPath);

            if (dstTime > srcTime)
            {
                return;
            }
            var sourceName = Path.GetFileName(sourcePath);
            var fxc10      = Path.Combine(FxcDir, "fxc10.exe");

            var sb = new StringBuilder();

            sb.Append(sourceName);
            sb.AppendFormat(" /Fo {0}.o", config.Name);
            sb.AppendFormat(" /Fc {0}.asm", config.Name);
            sb.AppendFormat(" /T {0}", config.Profile);
            sb.Append(" /nologo");
            if (config.EntryPoint != "")
            {
                sb.AppendFormat(" /E {0}", config.EntryPoint);
            }
            if (config.ExtraArgs != "")
            {
                sb.AppendFormat(" {0}", config.ExtraArgs);
            }
            var result = Command(fxc10, sb.ToString(), targetDirectory);

            if (result.ResultCode != 0)
            {
                throw new InvalidOperationException($"fxc {sb} returned error code {result.ResultCode}\n{result.Stderr}");
            }
            //FXC 10.1 cannot disassemble fx_2_0 shaders
            if (config.EntryPoint != "")
            {
                return;
            }
            var profileMatch = ProfilePatten.Match(config.Profile);

            if (profileMatch.Groups[2].Value != "2" && profileMatch.Groups[2].Value != "3")
            {
                return;
            }
            var fxc9 = Path.Combine(FxcDir, "fxc9.exe");

            sb = new StringBuilder();
            sb.AppendFormat("/dumpbin {0}.o", config.Name);
            sb.AppendFormat(" /Fc {0}.asm", config.Name);
            sb.AppendFormat(" /T {0}", config.Profile);
            sb.Append(" /nologo");
            result = Command(fxc9, sb.ToString(), targetDirectory);
            if (result.ResultCode != 0)
            {
                throw new InvalidOperationException($"fxc {sb} returned error code {result.ResultCode}\n{result.Stderr}");
            }
        }
示例#3
0
 internal void ApplyConfig(CompileConfig config)
 {
     foreach (MapVersion mapVersion in config.Maps)
     {
         this.MapVersionList.Items.Add(this.CreateLvi(mapVersion));
     }
 }
示例#4
0
 internal void Save(CompileConfig config)
 {
     config.Maps = new List <MapVersion>();
     foreach (ListViewItem lvi in this.MapVersionList.Items)
     {
         config.Maps.Add((MapVersion)lvi.Tag);
     }
 }
示例#5
0
 internal void Save(CompileConfig config)
 {
     config.BinWriterTasks.Clear();
     foreach (ListViewItem lvi in this.BinWriterTaskList.Items)
     {
         config.BinWriterTasks.Add((BinWriterTask)lvi.Tag);
     }
 }
示例#6
0
        private void CompileWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            CompileConfig config   = (CompileConfig)e.Argument;
            var           compiler = new Compiler(config);
            Stopwatch     sw       = Stopwatch.StartNew();

            compiler.Compile();
            sw.Stop();
            e.Result = sw.Elapsed;
        }
示例#7
0
 internal void ApplyConfig(CompileConfig config)
 {
     this.ImageList.BeginUpdate();
     this.ImageList.Items.Clear();
     foreach (var img in config.Images)
     {
         this.AddImage(img.Name, img.Path);
     }
     this.ImageList.EndUpdate();
 }
示例#8
0
 internal void ApplyConfig(CompileConfig config)
 {
     this.BinWriterTaskList.BeginUpdate();
     this.BinWriterTaskList.Items.Clear();
     foreach (var task in config.BinWriterTasks.OrderBy(t => t.Order))
     {
         this.BinWriterTaskList.Items.Add(this.CreateLvi(task));
     }
     this.AssignOrder();
     this.BinWriterTaskList.EndUpdate();
 }
示例#9
0
        private void ApplyConfig(CompileConfig config)
        {
            this.BinName.Text           = config.BinFile;
            this.MapSubfolder.Text      = config.MapDirectory;
            this.OutputTextBox.Text     = config.OutputDirectory;
            this.MapVersionTextBox.Text = config.MapVersion;
            this.ThreadCount.Value      = config.Threads;

            this.ImagesUserControl.ApplyConfig(config);
            this.BinWriterTaskUserControl.ApplyConfig(config);
            this.MapUserControl.ApplyConfig(config);
        }
示例#10
0
 public void Save(CompileConfig config)
 {
     config.Images.Clear();
     foreach (ListViewItem img in this.ImageList.Items)
     {
         config.Images.Add(new ImageDefinition
         {
             Name = img.SubItems[0].Text,
             Path = img.SubItems[1].Text
         });
     }
 }
示例#11
0
        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var dr = this.OpenConfigDialog.ShowDialog();

            if (dr != DialogResult.OK)
            {
                return;
            }
            this.configFile = new FileInfo(this.OpenConfigDialog.FileName);
            CompileConfig config = Xml.Deserialize <CompileConfig>(this.configFile, false);

            this.ApplyConfig(config);
        }
示例#12
0
        private void GenerateConfig(out CompileConfig config)
        {
            config = new CompileConfig();
            // Store information which resides in the main window
            config.BinFile         = this.BinName.Text;
            config.MapDirectory    = this.MapSubfolder.Text;
            config.OutputDirectory = this.OutputTextBox.Text;
            config.MapVersion      = this.MapVersionTextBox.Text;
            config.Threads         = (int)this.ThreadCount.Value;

            // Store usercontrol settings
            this.ImagesUserControl.Save(config);
            this.BinWriterTaskUserControl.Save(config);
            this.MapUserControl.Save(config);
        }
示例#13
0
        public CompileOptions(CompileConfig cfg)
        {
            InitializeComponent();
            DialogResult = DialogResult.Cancel;

            config                          = cfg;
            textBox_ram.Text                = cfg.RAM.ToString();
            textBox_flash.Text              = cfg.Flash.ToString();
            textBox_eeprom.Text             = cfg.EEPROM.ToString();
            textBox_registerCount.Text      = cfg.RegisterCount.ToString();
            textBox_registerNameFormat.Text = cfg.RegisterNameFormat;
            richTextBox_incPath.Text        = string.Join("\n", cfg.IncludePaths);
            comboBox_base.Text              = cfg.Base.ToString();

            checkedListBox_bf.Items.Clear();
            foreach (var a in Enum.GetNames(typeof(HASMMachineBannedFeatures)))
            {
                checkedListBox_bf.Items.Add(a, cfg.BannedFeatures.HasFlag((HASMMachineBannedFeatures)Enum.Parse(typeof(HASMMachineBannedFeatures), a)));
            }

            dataGridView1.Rows.Clear();
            foreach (var a in cfg.Defines)
            {
                if (string.IsNullOrEmpty(a.Name))
                {
                    continue;
                }

                DataGridViewRow row = new DataGridViewRow();

                DataGridViewTextBoxCell cell1 = new DataGridViewTextBoxCell
                {
                    Value = a.Name
                };

                DataGridViewTextBoxCell cell2 = new DataGridViewTextBoxCell
                {
                    Value = a.Value
                };

                row.Cells.Add(cell1);
                row.Cells.Add(cell2);

                dataGridView1.Rows.Add(row);
            }
        }
示例#14
0
        private void button_ok_Click(object sender, EventArgs e)
        {
            config.IncludePaths = new List <string>();
            config.IncludePaths.AddRange(richTextBox_incPath.Text.Split('\n'));

            config.EEPROM             = int.Parse(textBox_eeprom.Text);
            config.Flash              = int.Parse(textBox_flash.Text);
            config.RAM                = int.Parse(textBox_ram.Text);
            config.RegisterNameFormat = textBox_registerNameFormat.Text;
            config.RegisterCount      = int.Parse(textBox_registerCount.Text);
            config.Base               = int.Parse(comboBox_base.Text);

            HASMMachineBannedFeatures bf = 0;

            foreach (var a in checkedListBox_bf.Items)
            {
                string name = (string)a;
                if (checkedListBox_bf.CheckedItems.Contains(a))
                {
                    bf |= (HASMMachineBannedFeatures)Enum.Parse(typeof(HASMMachineBannedFeatures), name);
                }
            }

            List <Define> defines = new List <Define>();

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                string name  = (string)row.Cells[0].Value;
                string value = (string)row.Cells[1].Value;
                defines.Add(new Define(name, value));
            }

            config.BannedFeatures = bf;
            config.Defines        = defines;

            CompileConfig.ToFile(config.FileName, config);
            DialogResult = DialogResult.OK;
            Close();
        }
示例#15
0
 public Compiler(CompileConfig config)
 {
     this.Config = config;
 }
示例#16
0
文件: Program.cs 项目: deathlef/AOMC2
        static void Main(string[] args)
        {
            CompileConfig config = new CompileConfig
            {
                OutputDirectory = @"d:\tmp\mapout",
                BinFile         = "AoRK.bin",
                MapDirectory    = "AoRK"
            };

            config.Images.Add(new ImageDefinition {
                Name = "Layer1", Path = @"D:\Anarchy Online\Maps\AoRK\output\AoRK_map1.png"
            });
            config.Images.Add(new ImageDefinition {
                Name = "Layer2", Path = @"D:\Anarchy Online\Maps\AoRK\output\AoRK_map2.png"
            });
            config.Images.Add(new ImageDefinition {
                Name = "Layer3", Path = @"D:\Anarchy Online\Maps\AoRK\output\AoRK_map3.png"
            });
            config.Images.Add(new ImageDefinition {
                Name = "Layer3_atlantean", Path = @"D:\Anarchy Online\Maps\AoRK\output\AoRK_map3_rimor.png"
            });
            config.Images.Add(new ImageDefinition {
                Name = "Layer3_rimor", Path = @"D:\Anarchy Online\Maps\AoRK\output\AoRK_map3_atlantean.png"
            });

            config.BinWriterTasks.Add(new BinWriterTask
            {
                MapRect = "7 0 360 457",
                Order   = 0,
                Images  = new string[] { "Layer1" }
            });


            config.BinWriterTasks.Add(new BinWriterTask
            {
                MapRect = "55 0 944 1144",
                Order   = 1,
                Images  = new string[] { "Layer2" }
            });


            config.BinWriterTasks.Add(new BinWriterTask
            {
                MapRect = "5 -7 3573 4583",
                Order   = 2,
                Images  = new string[] { "Layer3", "Layer3_atlantean", "Layer3_rimor" },
            });


            config.Maps.Add(new MapVersion
            {
                File       = "AoRK.txt",
                CoordsFile = "AoRK/AoRK.xml",
                Name       = "Atlas of Rubi-Ka",
                Type       = MapType.Rubika,
                Images     = new string[] { "Layer1", "Layer2", "Layer3" }
            });

            config.Maps.Add(new MapVersion
            {
                File       = "AoRK-Atlantean.txt",
                CoordsFile = "AoRK/AoRK.xml",
                Name       = "Atlas of Rubi-Ka (Atlantean)",
                Type       = MapType.Rubika,
                Images     = new string[] { "Layer1", "Layer2", "Layer3_atlantean" }
            });

            config.Maps.Add(new MapVersion
            {
                File       = "AoRK-Rimor.txt",
                CoordsFile = "AoRK/AoRK.xml",
                Name       = "Atlas of Rubi-Ka (Rimor)",
                Type       = MapType.Rubika,
                Images     = new string[] { "Layer1", "Layer2", "Layer3_rimor" }
            });


            Compiler compiler = new Compiler(config);

            Console.WriteLine("Compiler set up. Starting slicing...");
            Stopwatch sw = Stopwatch.StartNew();

            compiler.Compile();
            Console.WriteLine("Compiler done. Took {0} seconds.", sw.Elapsed.TotalSeconds);
            Console.WriteLine("Press any key to continue...");
            Console.ReadLine();
        }
示例#17
0
文件: Editor.cs 项目: Coestaris/hasm
        private void Form1_Load(object sender, EventArgs e)
        {
            Self = this;

            tabControl1_SizeChanged(null, null);
            string configName = "";

            if (File.Exists("directory.txt"))
            {
                configName = File.ReadAllText("directory.txt");
            }

            if (!Directory.Exists(configName))
            {
                if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
                {
                    configName =
                        PlatformSpecific.CombinePath(folderBrowserDialog1.SelectedPath, WorkingFolder.MainConfigPostfix);
                    string compileConfigFileName =
                        PlatformSpecific.CombinePath(folderBrowserDialog1.SelectedPath, WorkingFolder.CompileConfigPostfix);
                    string userConfigFileName =
                        PlatformSpecific.CombinePath(folderBrowserDialog1.SelectedPath, WorkingFolder.UserConfigPostfix);

                    Directory.CreateDirectory(PlatformSpecific.CombinePath(folderBrowserDialog1.SelectedPath, WorkingFolder.IdeDirPostfix));

                    workingFolder = new WorkingFolder()
                    {
                        CompileConfigPath = compileConfigFileName,
                        UserConfigPath    = userConfigFileName,
                        Path = folderBrowserDialog1.SelectedPath,
                        PreferedToCompile = new SourceFile("", "")
                    };

                    WorkingFolder.ToFile(configName, workingFolder);
                    File.WriteAllText("directory.txt", folderBrowserDialog1.SelectedPath);
                }
                else
                {
                    Close();
                    return;
                }
            }
            else
            {
                configName =
                    PlatformSpecific.CombinePath(configName, WorkingFolder.MainConfigPostfix);
                if (File.Exists(configName))
                {
                    workingFolder = WorkingFolder.FromFile(configName, configName);
                }
                else
                {
                    workingFolder = new WorkingFolder()
                    {
                        CompileConfigPath =
                            PlatformSpecific.CombinePath(new FileInfo(configName).DirectoryName, WorkingFolder.CompileConfigPostfix),
                        UserConfigPath =
                            PlatformSpecific.CombinePath(new FileInfo(configName).DirectoryName, WorkingFolder.UserConfigPostfix),
                        Path = new FileInfo(configName).Directory.Parent.FullName,
                    };
                    WorkingFolder.ToFile(configName, workingFolder);
                }
            }

            if (File.Exists(workingFolder.UserConfigPath))
            {
                workingFolder.UserConfig = UserConfig.FromFile(workingFolder.UserConfigPath, workingFolder.Path);

                Size = workingFolder.UserConfig.WindowSize;
                splitContainer_main.SplitterDistance   = workingFolder.UserConfig.MainSplitterDistance;
                splitContainer_editor.SplitterDistance = workingFolder.UserConfig.EditorSplitterDistance;

                if (workingFolder.UserConfig.WindowPosition.X == -32000)
                {
                    WindowState = FormWindowState.Minimized;
                }
                else
                {
                    Left = workingFolder.UserConfig.WindowPosition.X;
                    Top  = workingFolder.UserConfig.WindowPosition.Y;
                }
            }
            else
            {
                workingFolder.UserConfig = new UserConfig()
                {
                    EditorSplitterDistance = splitContainer_editor.SplitterDistance,
                    MainSplitterDistance   = splitContainer_main.SplitterDistance,
                    OpenedTabs             = new List <string>(),
                    OutputType             = OutputType.Hex,
                    SelectedTab            = -1,
                    WindowPosition         = new Point(Left, Top),
                    WindowSize             = Size
                };
                UserConfig.ToFile(workingFolder.UserConfigPath, workingFolder.UserConfig);
            }

            if (File.Exists(workingFolder.CompileConfigPath))
            {
                workingFolder.CompileConfig          = CompileConfig.FromFile(workingFolder.CompileConfigPath);
                workingFolder.CompileConfig.FileName = workingFolder.CompileConfigPath;
            }
            else
            {
                workingFolder.CompileConfig = new CompileConfig()
                {
                    FileName = workingFolder.CompileConfigPath
                };
                CompileConfig.ToFile(workingFolder.CompileConfigPath, workingFolder.CompileConfig);
            }

            Machine = new HASMMachine(
                (uint)workingFolder.CompileConfig.RAM,
                (uint)workingFolder.CompileConfig.EEPROM,
                (uint)workingFolder.CompileConfig.Flash,
                workingFolder.CompileConfig.Base)
            {
                BannedFeatures     = workingFolder.CompileConfig.BannedFeatures,
                UserDefinedDefines = workingFolder.CompileConfig.Defines
                                     .FindAll(p => !string.IsNullOrEmpty(p.Name))
                                     .Select(p => new HASMLib.Parser.SyntaxTokens.Preprocessor.Define(p.Name, new HASMLib.Parser.SyntaxTokens.Preprocessor.StringGroup(p.Value)))
                                     .ToList()
            };
            Machine.SetRegisters(workingFolder.CompileConfig.RegisterNameFormat, (uint)workingFolder.CompileConfig.RegisterCount);
            foreach (var path in workingFolder.CompileConfig.IncludePaths)
            {
                string value   = path.Split(',')[0];
                string pattern = path.Split(',')[1];

                if (Directory.Exists(value))
                {
                    Machine.Cache.AddFileNames(value, pattern);
                }

                else
                {
                    value = PlatformSpecific.CombinePath(workingFolder.Path, value);
                    if (Directory.Exists(value))
                    {
                        Machine.Cache.AddFileNames(value, pattern);
                    }

                    else
                    {
                        MessageBox.Show($"Unable to directory file {value}",
                                        "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        continue;
                    }
                }
            }
            RebuildCache();
            if (workingFolder.UserConfig.OpenedTabs != null)
            {
                foreach (string path in workingFolder.UserConfig.OpenedTabs)
                {
                    AddTab(path);
                }
            }

            workingFolder.SetTreeView(treeView1);
            treeView1.ExpandAll();

            toolStripComboBox1.Items.Clear();
            toolStripComboBox1.Items.AddRange(workingFolder.SourceFiles.Select(p => (object)p).ToArray());

            toolStripComboBox1.SelectedItem = workingFolder.PreferedToCompile;

            tabControl1.Enabled       = true;
            tabControl1.SelectedIndex = workingFolder.UserConfig.SelectedTab;

            switch (workingFolder.UserConfig.OutputType)
            {
            case OutputType.Hex:
                hexOutputToolStripMenuItem.Checked = true;
                break;

            case OutputType.Dec:
                decOutputToolStripMenuItem.Checked = true;
                break;

            case OutputType.Char:
                charOutputToolStripMenuItem.Checked = true;
                break;

            default:
                break;
            }
            outputType = workingFolder.UserConfig.OutputType;

            Text = $"HASM Editor { (tabControl1.SelectedTab == null ? "" : " - " + (tabControl1.SelectedTab as TextEditor).Path.NormalizePath())}";
        }