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; }
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(); }
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}"); } } } }
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}"); } } } }