Files
MathApp/Core/DebugDumper.cs
T

148 lines
5.6 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
public class DebugDumper
{
public static void GenerateDumpFile(string asmCode, string outputPath)
{
string[] lines = asmCode.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
StringBuilder dump = new StringBuilder();
Dictionary<string, int> variables = new Dictionary<string, int>();
int accumulator = 0;
int x = 0;
int y = 0;
for (int i = 0; i < lines.Length; i++)
{
string line = lines[i].Trim();
if (string.IsNullOrEmpty(line) || line.StartsWith("::"))
{
dump.AppendLine($"[{i}] {line}");
continue;
}
string[] tokens = line.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
if (tokens.Length == 0) continue;
string command = tokens[0].ToUpper();
string comment = "";
int ResolveValue(string val)
{
if (variables.ContainsKey(val)) return variables[val];
if (int.TryParse(val, out int num)) return num;
return 0;
}
switch (command)
{
// Variables
case "NVAR":
string newVar = tokens[1];
int newVal = ResolveValue(tokens[2]);
variables[newVar] = newVal;
comment = $"Create '{newVar}' with value of '{newVal}'";
break;
case "SVAR":
string setVar = tokens[1];
int setVal = ResolveValue(tokens[2]);
variables[setVar] = setVal;
comment = $"Set variable '{setVar}' to '{setVal}'";
break;
case "RVAR":
variables.Remove(tokens[1]);
comment = $"Remove variable '{tokens[1]}'";
break;
// Memory / Registers
case "LDA":
comment = $"Load memory address {tokens[1]} into Accumulator";
break;
case "STA":
comment = $"Store the Accumulator ({accumulator}) into Memory address {tokens[1]}";
break;
case "LDX":
x = accumulator;
comment = $"Load Accumulator ({accumulator}) into X";
break;
case "LDY":
y = accumulator;
comment = $"Load Accumulator ({accumulator}) into Y";
break;
case "STX":
accumulator = x;
comment = $"Store X ({x}) into Accumulator";
break;
case "STY":
accumulator = y;
comment = $"Store Y ({y}) into Accumulator";
break;
case "SEA":
int seaVal = ResolveValue(tokens[1]);
accumulator = seaVal;
// If they passed a variable name, show both the name and the value
if (variables.ContainsKey(tokens[1]))
comment = $"Set Accumulator to '{tokens[1]}' ({seaVal})";
else
comment = $"Set Accumulator to {seaVal}";
break;
// Arithmetic
case "ADD":
accumulator = x + y;
comment = $"Add X ({x}) and Y ({y}) and store into the Accumulator ({accumulator})";
break;
case "SUB":
accumulator = x - y;
comment = $"Subtract Y ({y}) from X ({x}) and store into the Accumulator ({accumulator})";
break;
case "MUL":
accumulator = x * y;
comment = $"Multiply X ({x}) and Y ({y}) and store into the Accumulator ({accumulator})";
break;
case "DIV":
if (y != 0) accumulator = x / y;
comment = $"Divide X ({x}) by Y ({y}) and store into the Accumulator ({accumulator})";
break;
// Flow Control
case "JZE":
comment = $"Jump to line {tokens[1]} if Zero flag is true";
break;
case "JMP":
comment = $"Jump to line {tokens[1]}";
break;
case "SFG":
comment = $"Set flag '{tokens[1]}' to true";
break;
case "RFG":
comment = $"Set flag '{tokens[1]}' to false";
break;
// Debug
case "PRA":
comment = $"Print Accumulator ({accumulator})";
break;
case "PRX":
comment = $"Print X ({x})";
break;
case "PRY":
comment = $"Print Y ({y})";
break;
case "PRM":
comment = $"Print value of memory address {tokens[1]}";
break;
case "HLT":
comment = "Halt execution";
break;
default:
comment = "Unknown command";
break;
}
dump.AppendLine($"[{i}] {line,-20} :: {comment}");
}
File.WriteAllText(outputPath, dump.ToString());
}
}