private void UpdateMemoryFields(EmulatorHost host)
        {
            var conventionalMemory = host.VirtualMachine.GetConventionalMemoryUsage();

            conventionalMemoryLabel.Content = string.Format("{0}k used, {1}k free", conventionalMemory.MemoryUsed / 1024, conventionalMemory.MemoryFree / 1024);

            var expandedMemory = host.VirtualMachine.GetExpandedMemoryUsage();

            expandedMemoryLabel.Content = string.Format("{0}k used, {1}k free", expandedMemory.BytesAllocated / 1024, expandedMemory.BytesFree / 1024);

            var extendedMemory = host.VirtualMachine.GetExtendedMemoryUsage();

            extendedMemoryLabel.Content = string.Format("{0}k used, {1}k free", extendedMemory.BytesAllocated / 1024, extendedMemory.BytesFree / 1024);
        }
        private void UpdateProcessorFields(EmulatorHost host)
        {
            long currentCount = host.TotalInstructions;

            if (currentCount < lastCount)
            {
                lastCount = 0;
            }

            long value = currentCount - lastCount;

            instructionsLabel.Content = currentCount.ToString("#,#");
            ipsLabel.Content          = value.ToString("#,#");

            lastCount = currentCount;
        }
Beispiel #3
0
        static void Main()
        {
            // Get config options
            var builder = new ConfigurationBuilder()
                          .SetBasePath(Directory.GetCurrentDirectory())
                          // appsettings_scroll.json
                          // appsettings_hello.json
                          // appsettings_snake.json
                          .AddJsonFile("appsettings_scroll.json");

            Configuration = builder.Build();

            var emulatorHostOptions = new Options();

            Configuration.GetSection(Options.ConfigSectionName).Bind(emulatorHostOptions);

            // Alternative way, build config via code instead of reading from appsettings.json
            //var emulatorHostOptions = ConfigViaCode();

            // Init EmulatorHost and run!
            var emulatorHost = new EmulatorHost(emulatorHostOptions);

            emulatorHost.Start();
        }
Beispiel #4
0
        public static void HandleConfiguration(Configuration configuration)
        {
            if (configuration.ApiPort > 0)
            {
                var tcp = new TcpListener(new IPEndPoint(IPAddress.Loopback, configuration.ApiPort));

                tcp.Start();

                while (true)
                {
                    try
                    {
                        using var connection = tcp.AcceptTcpClient();
                        using var stream     = connection.GetStream();
                        using var reader     = new BinaryReader(stream);
                        using var writer     = new BinaryWriter(stream);

                        var builder     = new ConfigurationBuilder();
                        var configCount = ushort.Parse(reader.ReadString());
                        for (ushort i = 0; i < configCount; i++)
                        {
                            builder.Configure(reader.ReadString(), writer.Write);
                        }

                        writer.Write(string.Empty);

                        stream.Flush();

                        var lineCount = ulong.Parse(reader.ReadString());

                        if (lineCount == 0)
                        {
                            continue;
                        }

                        var buffer = new List <string>();

                        for (ulong i = 0; i < lineCount; i++)
                        {
                            buffer.Add(reader.ReadString());
                        }

                        IEnumerable <UrclInstruction> instructions;

                        try
                        {
                            instructions = Parser.Parse(buffer);
                        }
                        catch (ParserError ex)
                        {
                            writer.Write(ex.Message);
                            stream.Flush();
                            continue;
                        }

                        EmulatorHost.Emulator(configuration, instructions, writer.Write, () => { }, false);

                        writer.Write(string.Empty);
                        stream.Flush();
                    }
                    catch (Exception ex)
                    {
                        Console.Error.WriteLine($"API: {ex.Message}");
                    }
                }
            }
        }
Beispiel #5
0
        public static void HandleConfiguration(Configuration configuration)
        {
            if (configuration.ApiPort > 0)
            {
                var modules = new ModuleLoader();
                var tcp     = new TcpListener(new IPEndPoint(IPAddress.Loopback, configuration.ApiPort));

                modules.Load(configuration);
                tcp.Start();

                while (true)
                {
                    try
                    {
                        using var connection = tcp.AcceptTcpClient();
                        using var stream     = connection.GetStream();
                        using var reader     = new BinaryReader(stream);
                        using var writer     = new BinaryWriter(stream);

                        var builder     = new ConfigurationBuilder();
                        var configCount = ushort.Parse(reader.ReadString());
                        for (ushort i = 0; i < configCount; i++)
                        {
                            builder.Configure(reader.ReadString(), writer.Write);
                        }

                        writer.Write(string.Empty);
                        stream.Flush();

                        var           lang         = reader.ReadString().ToLower();
                        var           outType      = reader.ReadString().ToLower();
                        var           selectedTier = reader.ReadString().ToLower();
                        OperationType tier;

                        switch (selectedTier)
                        {
                        case "core":
                            tier = OperationType.Pragma;
                            break;

                        case "basic":
                            tier = OperationType.Basic;
                            break;

                        case "complex":
                            tier = OperationType.Complex;
                            break;

                        case "any":
                            tier = OperationType.CustomPragma;
                            break;

                        default:
                            writer.Write($"Invalid platform target \"{selectedTier}\"");
                            writer.Write(string.Empty);
                            stream.Flush();
                            continue;
                        }

                        var lineCount = ulong.Parse(reader.ReadString());

                        if (lineCount == 0)
                        {
                            continue;
                        }

                        var lines = new List <string>();

                        for (ulong i = 0; i < lineCount; i++)
                        {
                            lines.Add(reader.ReadString());
                        }

                        IEnumerable <UrclInstruction> instructions;

                        try
                        {
                            if (lang != "urcl")
                            {
                                var source = lines;
                                lines = new List <string>();
                                bool hasError = false;

                                if (!modules.ExecuteFileHandler(lang, source, lines.Add, (msg) =>
                                {
                                    hasError = true;
                                    writer.Write(msg);
                                }))
                                {
                                    throw new ParserError($"Format \"{lang}\" is not supported.");
                                }

                                if (hasError)
                                {
                                    throw new ParserError("The source was not compiled successfully.");
                                }
                            }

                            var optimizer = new UrclOptimizer
                            {
                                Compatibility = tier,
                                ReplaceImmZeroWithZeroRegister = true,
                                CullRedundantMoves             = true,
                                CullCreateLabel = true
                            };

                            instructions = optimizer.Optimize(new Parser().Parse(lines, (imp) =>
                            {
                                throw new ParserError("Imports are not supported via the API.");
                            }).ToArray());

                            if (outType == "emulate")
                            {
                                EmulatorHost.Emulator(configuration, instructions, writer.Write, () => { }, false);
                            }
                            else if (outType == "dump")
                            {
                                foreach (var inst in instructions)
                                {
                                    writer.Write(inst.ToString());
                                }
                                writer.Write(string.Empty);
                                stream.Flush();
                                continue;
                            }
                            else
                            {
                                throw new ParserError($"Invalid output type \"{outType}\".");
                            }
                        }
                        catch (ParserError ex)
                        {
                            writer.Write(ex.Message);
                            writer.Write(string.Empty);
                            stream.Flush();
                            continue;
                        }
                        catch (TargetInvocationException ex)
                        {
                            writer.Write(ex.InnerException.Message);
                            writer.Write(string.Empty);
                            stream.Flush();
                            continue;
                        }
                        catch (Exception ex)
                        {
                            writer.Write(ex.Message);
                            writer.Write(string.Empty);
                            continue;
                        }

                        writer.Write(string.Empty);
                        stream.Flush();
                    }
                    catch (Exception ex)
                    {
                        Console.Error.WriteLine($"API: {ex}");
                    }
                }
            }
        }