Exemple #1
0
 private static void WriteSymbols(string path, Assembler assembler)
 {
     using (var writer = new StreamWriter(path))
     {
         writer.WriteLine("; This file was generated by sass");
         foreach (var symbol in assembler.ExpressionEngine.Symbols)
         {
             if (symbol.Value.IsLabel && !symbol.Key.Contains("@")) // The latter removes globalized local labels
                 writer.WriteLine(string.Format(".equ {0} 0x{1}", symbol.Key, symbol.Value.Value.ToString("X")));
         }
     }
 }
Exemple #2
0
        public static int Main(string[] args)
        {
            InstructionSets = new Dictionary<string, InstructionSet>();
            InstructionSets.Add("z80", LoadInternalSet("sass.Tables.z80.table"));
            string instructionSet = "z80"; // Default
            string inputFile = null, outputFile = null;
            var settings = new AssemblySettings();
            List<string> defines = new List<string>();

            for (int i = 0; i < args.Length; i++)
            {
                string arg = args[i];
                if (arg.StartsWith("-") && arg != "-")
                {
                    try
                    {
                        switch (arg)
                        {
                            case "-d":
                            case "--define":
                                defines.AddRange(args[++i].Split(','));
                                break;
                            case "--debug-mode":
                                Thread.Sleep(10000);
                                break;
                            case "--encoding":
                                try
                                {
                                    settings.Encoding = Encoding.GetEncoding(args[++i]);
                                }
                                catch
                                {
                                    Console.Error.WriteLine("The specified encoding was not recognized. Use sass --list-encodings to see available encodings.");
                                    return 1;
                                }
                                break;
                            case "-h":
                            case "-?":
                            case "/?":
                            case "/help":
                            case "-help":
                            case "--help":
                                DisplayHelp();
                                return 0;
                            case "--inc":
                            case "--include":
                                settings.IncludePath = args[++i].Split(';');
                                break;
                            case "--input":
                            case "--input-file":
                                inputFile = args[++i];
                                break;
                            case "--instr":
                            case "--instruction-set":
                                instructionSet = args[++i];
                                break;
                            case "-l":
                            case "--listing":
                                settings.ListingOutput = args[++i];
                                break;
                            case "--list-encodings":
                                Console.WriteLine("The default encoding is UTF-8. The following are available: ");
                                foreach (var encoding in Encoding.GetEncodings())
                                    Console.WriteLine("{0} [{1}]", encoding.DisplayName, encoding.Name);
                                Console.WriteLine("Use the identifier (in [brackets]) with --encoding).");
                                return 0;
                            case "--nest-macros":
                                settings.AllowNestedMacros = true;
                                break;
                            case "--output":
                            case "--output-file":
                                outputFile = args[++i];
                                break;
                            case "-s":
                            case "--symbols":
                                settings.SymbolOutput = args[++i];
                                break;
                            case "-v":
                            case "--verbose":
                                settings.Verbose = true;
                                break;
                        }
                    }
                    catch (ArgumentOutOfRangeException)
                    {
                        Console.Error.WriteLine("Error: Invalid usage. Use sass.exe --help for usage information.");
                        return 1;
                    }
                }
                else
                {
                    if (inputFile == null)
                        inputFile = args[i];
                    else if (outputFile == null)
                        outputFile = args[i];
                    else
                    {
                        Console.Error.WriteLine("Error: Invalid usage. Use sass.exe --help for usage information.");
                        return 1;
                    }
                }
            }

            if (inputFile == null)
            {
                Console.Error.WriteLine("No input file specified. Use sass.exe --help for usage information.");
                return 1;
            }
            if (outputFile == null)
                outputFile = Path.GetFileNameWithoutExtension(inputFile) + ".bin";

            InstructionSet selectedInstructionSet;
            if (!InstructionSets.ContainsKey(instructionSet))
            {
                if (File.Exists(instructionSet))
                    selectedInstructionSet = InstructionSet.Load(File.ReadAllText(instructionSet));
                else
                {
                    Console.Error.WriteLine("Specified instruction set was not found.");
                    return 1;
                }
            }
            else
                selectedInstructionSet = InstructionSets[instructionSet];

            var assembler = new Assembler(selectedInstructionSet, settings);
            foreach (var define in defines)
                assembler.ExpressionEngine.Symbols.Add(define.ToLower(), new Symbol(1));
            string file;
            if (inputFile == "-")
                file = Console.In.ReadToEnd();
            else
                file = File.ReadAllText(inputFile);
            var watch = new Stopwatch();
            watch.Start();
            var output = assembler.Assemble(file, inputFile);
            watch.Stop();

            if (outputFile == "-")
                Console.OpenStandardOutput().Write(output.Data, 0, output.Data.Length);
            else
                File.WriteAllBytes(outputFile, output.Data);
            var errors = from l in output.Listing
                         where l.Warning != AssemblyWarning.None || l.Error != AssemblyError.None
                         orderby l.RootLineNumber
                         select l;
            if (!settings.Verbose)
            {
                foreach (var listing in errors)
                {
                    if (listing.Error != AssemblyError.None)
                        Console.Error.WriteLine(listing.FileName + ":" + listing.LineNumber + " Error: " + listing.Error);
                    if (listing.Warning != AssemblyWarning.None)
                        Console.Error.WriteLine(listing.FileName + ":" + listing.LineNumber + " Warning: " + listing.Warning);
                }
            }

            if (settings.Verbose || settings.ListingOutput != null)
            {
                var listing = GenerateListing(output);
                if (settings.Verbose)
                    Console.Write(listing);
                if (settings.ListingOutput != null)
                    File.WriteAllText(settings.ListingOutput, listing);
            }

            if (settings.SymbolOutput != null)
                WriteSymbols(settings.SymbolOutput, assembler);

            Console.Error.WriteLine("Assembly done: {0} ms", watch.ElapsedMilliseconds);
            if (Debugger.IsAttached)
            {
                Console.Error.WriteLine("Press any key to continue...");
                Console.ReadKey(true);
            }
            return errors.Count(e => e.Error != AssemblyError.None);
        }
Exemple #3
0
        static void Main(string[] args)
        {
            Console.WriteLine("SirCmpwn's Assembler     Copyright Drew DeVault 2012");

            InstructionSets = new Dictionary<string, InstructionSet>();
            InstructionSets.Add("z80", LoadInternalSet("sass.Tables.z80.table"));
            string instructionSet = "z80"; // Default
            string inputFile = null, outputFile = null;

            for (int i = 0; i < args.Length; i++)
            {
                string arg = args[i];
                if (arg.StartsWith("-"))
                {
                    switch (arg)
                    {
                        case "--input":
                        case "--input-file":
                            inputFile = args[++i];
                            break;
                        case "--output":
                        case "--output-file":
                            outputFile = args[++i];
                            break;
                        case "--instr":
                            instructionSet = args[++i];
                            break;
                        case "-h":
                        case "-?":
                        case "/?":
                        case "/help":
                        case "-help":
                        case "--help":
                            DisplayHelp();
                            return;
                    }
                }
                else
                {
                    if (inputFile == null)
                        inputFile = args[i];
                    else if (outputFile == null)
                        outputFile = args[i];
                    else
                    {
                        Console.WriteLine("Error: Invalid usage. Use sass.exe --help for usage information.");
                        return;
                    }
                }
            }

            if (inputFile == null)
            {
                Console.WriteLine("No input file specified. Use sass.exe --help for usage information.");
                return;
            }
            if (outputFile == null)
                outputFile = Path.GetFileNameWithoutExtension(inputFile) + ".bin";

            var assembler = new Assembler(InstructionSets[instructionSet]);
            string file = File.ReadAllText(inputFile);
            var watch = new Stopwatch();
            watch.Start();
            var output = assembler.Assemble(file, inputFile);
            watch.Stop();

            File.WriteAllBytes(outputFile, output.Data);
            var errors = from l in output.Listing
                         where l.Warning != AssemblyWarning.None || l.Error != AssemblyError.None
                         orderby l.RootLineNumber
                         select l;
            foreach (var listing in errors)
            {
                if (listing.Error != AssemblyError.None)
                    Console.WriteLine(listing.FileName + " [" + listing.LineNumber + "]: Error: " + listing.Error);
                if (listing.Warning != AssemblyWarning.None)
                    Console.WriteLine(listing.FileName + " [" + listing.LineNumber + "]: Warning: " + listing.Warning);
            }
            Console.WriteLine("Assembly done: {0} ms", watch.ElapsedMilliseconds);
        }