SirCmpwn

Untitled

Apr 26th, 2012
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.56 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using orgASM;
  6. using System.IO;
  7.  
  8. namespace build0x42c
  9. {
  10.     class Program
  11.     {
  12.         static bool generateReports = false;
  13.         static string startupDirectory;
  14.         static bool bigEndian = false;
  15.         static ushort kernelSize, bootloaderSize;
  16.  
  17.         static List<ListEntry> Kernel;
  18.         static List<ListEntry> Bootloader;
  19.  
  20.         static void Main(string[] args)
  21.         {
  22.             DateTime startupTime = DateTime.Now;
  23.  
  24.             // Parse arguments
  25.             foreach (string arg in args)
  26.             {
  27.                 if (arg.StartsWith("-"))
  28.                 {
  29.                     switch (arg)
  30.                     {
  31.                         case "--debug-mode":
  32.                             Console.ReadKey(true);
  33.                             break;
  34.                         case "--generate-reports":
  35.                         case "-r":
  36.                             generateReports = true;
  37.                             break;
  38.                         default:
  39.                             Console.WriteLine("Invalid arguments.");
  40.                             return;
  41.                     }
  42.                 }
  43.             }
  44.  
  45.             Console.WriteLine("0x42c Build Tool     Copyright 0x42c Team 2012");
  46.             startupDirectory = Directory.GetCurrentDirectory();
  47.  
  48.             // Clean up old build
  49.             if (Directory.Exists("../bin"))
  50.                 Directory.Delete("../bin", true);
  51.             Directory.CreateDirectory("../bin");
  52.             Directory.CreateDirectory("../bin/kernel");
  53.             Directory.CreateDirectory("../bin/bootloader");
  54.             Directory.CreateDirectory("../bin/userspace");
  55.             Directory.CreateDirectory("../bin/dump");
  56.             if (generateReports)
  57.             {
  58.                 if (Directory.Exists("../reports"))
  59.                     Directory.Delete("../reports", true);
  60.                 Directory.CreateDirectory("../reports");
  61.             }
  62.  
  63.             // Build kernel
  64.             Console.WriteLine("Building 0x42c-kernel...");
  65.             Directory.SetCurrentDirectory("../src/kernel");
  66.             Assembler kernelAssembler = new Assembler();
  67.             kernelAssembler.IncludePath = "../include";
  68.             using (StreamReader sr = new StreamReader("base.dasm"))
  69.             {
  70.                 string code = sr.ReadToEnd();
  71.                 Kernel = kernelAssembler.Assemble(code, "base.dasm");
  72.             }
  73.             Directory.SetCurrentDirectory(startupDirectory);
  74.             CreateOutput(Kernel, "../bin/kernel", "kernel");
  75.  
  76.             // Build bootloader
  77.             Console.WriteLine("Building 0x42c-bootloader...");
  78.             Directory.SetCurrentDirectory("../src/bootloader");
  79.             Assembler bootloaderAssembler = new Assembler();
  80.             bootloaderAssembler.IncludePath = "../include";
  81.             using (StreamReader sr = new StreamReader("base.dasm"))
  82.             {
  83.                 string code = sr.ReadToEnd();
  84.                 Bootloader = bootloaderAssembler.Assemble(code, "base.dasm");
  85.             }
  86.             Directory.SetCurrentDirectory(startupDirectory);
  87.             CreateOutput(Bootloader, "../bin/bootloader", "bootloader");
  88.  
  89.             // Patch all files together
  90.             Console.WriteLine("Creating memory dump...");
  91.             using (Stream dump = File.Open("../bin/dump/0x42c.bin", FileMode.Create))
  92.             {
  93.                 dump.Write(new byte[0xFFFF * 2], 0, 0xFFFF * 2);
  94.                 dump.Flush();
  95.  
  96.                 // Write kernel to dump
  97.                 dump.Seek(0, SeekOrigin.Begin);
  98.                 kernelSize = WriteToStream(Kernel, dump);
  99.  
  100.                 // Write bootloader to dump
  101.                 dump.Seek(kernelAssembler.Values["os_bootloader"], SeekOrigin.Begin);
  102.                 bootloaderSize = WriteToStream(Bootloader, dump);
  103.             }
  104.  
  105.             Console.WriteLine("Build complete " + (DateTime.Now - startupTime).TotalMilliseconds + "ms");
  106.         }
  107.  
  108.         private static ushort WriteToStream(List<ListEntry> output, Stream stream)
  109.         {
  110.             ushort size = 0;
  111.             foreach (var entry in Kernel)
  112.             {
  113.                 if (entry.Output != null)
  114.                 {
  115.                     foreach (ushort value in entry.Output)
  116.                     {
  117.                         byte[] buffer = BitConverter.GetBytes(value);
  118.                         if (bigEndian)
  119.                             Array.Reverse(buffer);
  120.                         stream.Write(buffer, 0, buffer.Length);
  121.                         size++;
  122.                     }
  123.                 }
  124.             }
  125.             stream.Flush();
  126.             return size;
  127.         }
  128.  
  129.         private static void CreateOutput(List<ListEntry> output, string location, string filename)
  130.         {
  131.             // create output files
  132.  
  133.             // Create listing file
  134.             string listing = Assembler.CreateListing(output);
  135.             using (StreamWriter sw = new StreamWriter(Path.Combine(location, filename + ".lst")))
  136.                 sw.Write(listing);
  137.             // Create binary file
  138.             using (Stream s = File.Open(Path.Combine(location, filename + ".bin"), FileMode.Create))
  139.             {
  140.                 foreach (var entry in output)
  141.                 {
  142.                     if (entry.Output != null)
  143.                     {
  144.                         foreach (ushort value in entry.Output)
  145.                         {
  146.                             byte[] buffer = BitConverter.GetBytes(value);
  147.                             if (bigEndian)
  148.                                 Array.Reverse(buffer);
  149.                             s.Write(buffer, 0, buffer.Length);
  150.                         }
  151.                     }
  152.                 }
  153.             }
  154.             // Output errors/warnings to console
  155.             foreach (var entry in output.Where(o => o.WarningCode != WarningCode.None &&
  156.                 o.ErrorCode != ErrorCode.Success))
  157.             {
  158.                 if (entry.ErrorCode != ErrorCode.Success)
  159.                 {
  160.                     Console.WriteLine("Error " + entry.FileName + " (line " +
  161.                         entry.LineNumber + "): " + ListEntry.GetFriendlyErrorMessage(entry.ErrorCode));
  162.                 }
  163.                 if (entry.WarningCode != WarningCode.None)
  164.                 {
  165.                     Console.WriteLine("Warning " + entry.WarningCode + " (line " +
  166.                         entry.LineNumber + "): " + ListEntry.GetFriendlyWarningMessage(entry.WarningCode));
  167.                 }
  168.             }
  169.         }
  170.     }
  171. }
Advertisement
Add Comment
Please, Sign In to add comment