Assembler mnemonic generation for disassembler.

This commit is contained in:
Felix Queißner 2016-06-29 14:20:34 +02:00
parent 0a70f1cbd7
commit 7bc60e8c18

View file

@ -6,12 +6,16 @@ using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using static System.Console;
namespace SuperVM.Assembler namespace SuperVM.Assembler
{ {
class Program class Program
{ {
static void Main(string[] args) static void Main(string[] args)
{ {
// GenerateDisassemblerListingsForC();
if (args.Contains("-gen-code")) if (args.Contains("-gen-code"))
{ {
MnemonicParser.GenerateFromDocumentation( MnemonicParser.GenerateFromDocumentation(
@ -47,6 +51,77 @@ namespace SuperVM.Assembler
} }
} }
private static void GenerateDisassemblerListingsForC()
{
foreach (var mnemonic in Assembler.mnemonics)
{
var i = mnemonic.Value;
Write("{{ \"{0}\", {{ ", mnemonic.Key);
switch (i.ExecutionZ)
{
case ExecutionMode.Always: Write("VM_EXEC_X, "); break;
case ExecutionMode.Zero: Write("VM_EXEC_0, "); break;
case ExecutionMode.One: Write("VM_EXEC_1, "); break;
}
switch (i.ExecutionN)
{
case ExecutionMode.Always: Write("VM_EXEC_X, "); break;
case ExecutionMode.Zero: Write("VM_EXEC_0, "); break;
case ExecutionMode.One: Write("VM_EXEC_1, "); break;
}
switch (i.Input0)
{
case InputType.Zero: Write("VM_INPUT_ZERO, "); break;
case InputType.Pop: Write("VM_INPUT_POP, "); break;
case InputType.Peek: Write("VM_INPUT_PEEK, "); break;
case InputType.Argument: Write("VM_INPUT_ARG, "); break;
}
switch (i.Input1)
{
case InputType.Zero: Write("VM_INPUT_ZERO, "); break;
case InputType.Pop: Write("VM_INPUT_POP, "); break;
case InputType.Peek: Write("VM_INPUT_PEEK, "); break;
case InputType.Argument: Write("VM_INPUT_ARG, "); break;
}
switch (i.Command)
{
case Command.Copy: Write("VM_CMD_COPY, "); break;
case Command.Store: Write("VM_CMD_STORE, "); break;
case Command.Load: Write("VM_CMD_LOAD, "); break;
case Command.Get: Write("VM_CMD_GET, "); break;
case Command.Set: Write("VM_CMD_SET, "); break;
case Command.BpGet: Write("VM_CMD_BPGET, "); break;
case Command.BpSet: Write("VM_CMD_BPSET, "); break;
case Command.CpGet: Write("VM_CMD_CPGET, "); break;
case Command.Math: Write("VM_CMD_MATH, "); break;
case Command.SpGet: Write("VM_CMD_SPGET, "); break;
case Command.SpSet: Write("VM_CMD_SPSET, "); break;
case Command.SysCall: Write("VM_CMD_SYSCALL, "); break;
case Command.HwIO: Write("VM_CMD_HWIO, "); break;
}
Write("{0}, ", i.CommandInfo);
switch (i.ModifyFlags)
{
case false: Write("VM_FLAG_NO, "); break;
case true: Write("VM_FLAG_YES, "); break;
}
switch (i.Output)
{
case OutputType.Discard: Write("VM_OUTPUT_DISCARD"); break;
case OutputType.Push: Write("VM_OUTPUT_PUSH"); break;
case OutputType.Jump: Write("VM_OUTPUT_JUMP"); break;
case OutputType.JumpRelative: Write("VM_OUTPUT_JUMPR"); break;
}
Console.WriteLine("} },");
}
}
static void PrintInstruction(ulong instr, string comment) static void PrintInstruction(ulong instr, string comment)
{ {
var str = Convert.ToString((long)instr, 2).PadLeft(64, '0'); var str = Convert.ToString((long)instr, 2).PadLeft(64, '0');