diff --git a/prototypes/supervm-asm/assembler.cs b/prototypes/supervm-asm/assembler.cs index 0f71984..494bc19 100644 --- a/prototypes/supervm-asm/assembler.cs +++ b/prototypes/supervm-asm/assembler.cs @@ -32,7 +32,7 @@ namespace supervm_asm for(int i = 0; i < code.Length; i++) { var bits = BitConverter.GetBytes(code[i]); - if(BitConverter.IsLittleEndian) + if(BitConverter.IsLittleEndian == false) { bits = bits.Reverse().ToArray(); } @@ -49,13 +49,14 @@ namespace supervm_asm var portions = new [] { new { Start = 0, Length = 32, Color = ConsoleColor.Red }, - new { Start = 32, Length = 2, Color = ConsoleColor.Blue }, + new { Start = 32, Length = 2, Color = ConsoleColor.DarkGreen }, new { Start = 34, Length = 1, Color = ConsoleColor.Green }, new { Start = 35, Length = 16, Color = ConsoleColor.Magenta }, - new { Start = 51, Length = 8, Color = ConsoleColor.Yellow }, - new { Start = 59, Length = 1, Color = ConsoleColor.DarkCyan }, - new { Start = 60, Length = 2, Color = ConsoleColor.Cyan }, - new { Start = 62, Length = 2, Color = ConsoleColor.DarkBlue }, + new { Start = 51, Length = 6, Color = ConsoleColor.Yellow }, + new { Start = 57, Length = 1, Color = ConsoleColor.DarkCyan }, + new { Start = 58, Length = 2, Color = ConsoleColor.Cyan }, + new { Start = 60, Length = 2, Color = ConsoleColor.DarkBlue }, + new { Start = 62, Length = 2, Color = ConsoleColor.Blue }, }; var fg = Console.ForegroundColor; diff --git a/prototypes/supervm-asm/testcode.asm b/prototypes/supervm-asm/testcode.asm index 511f254..a294ece 100644 --- a/prototypes/supervm-asm/testcode.asm +++ b/prototypes/supervm-asm/testcode.asm @@ -1,8 +1,8 @@  push 0 ; Some comment loop: dup - [f:yes] sub 10 [r:discard] + [i0:arg] sub 10 [f:yes] [r:discard] [ex(z)=1] jmp @end - add 1 + [i0:arg] add 1 jmp @loop end: \ No newline at end of file diff --git a/prototypes/supervm/main.c b/prototypes/supervm/main.c index 83665b1..3f0c959 100644 --- a/prototypes/supervm/main.c +++ b/prototypes/supervm/main.c @@ -3,77 +3,6 @@ #include #include -Instruction code[] = -{ - // { VM_EXEC_X, VM_EXEC_X, VM_INPUT_ZERO, VM_INPUT_ZERO, VM_CMD_COPY, 0, VM_FLAG_NO, VM_OUTPUT_DISCARD, 0 }, - { // push 0 - VM_EXEC_X, - VM_EXEC_X, - VM_INPUT_ARG, - VM_INPUT_ZERO, - VM_CMD_COPY, - 0, - VM_FLAG_NO, - VM_OUTPUT_PUSH, - 0 - }, - { // dup - VM_EXEC_X, - VM_EXEC_X, - VM_INPUT_PEEK, - VM_INPUT_ZERO, - VM_CMD_COPY, - 0, - VM_FLAG_NO, - VM_OUTPUT_PUSH, - 0 - }, - { // cmp 10 - VM_EXEC_X, - VM_EXEC_X, - VM_INPUT_ARG, - VM_INPUT_POP, - VM_CMD_MATH, - VM_MATH_SUB, - VM_FLAG_YES, - VM_OUTPUT_DISCARD, - 10 - }, - { // jmp 7 - VM_EXEC_1, - VM_EXEC_X, - VM_INPUT_ARG, - VM_INPUT_ZERO, - VM_CMD_COPY, - 0, - VM_FLAG_NO, - VM_OUTPUT_JUMP, - 7 - }, - { // add 1 - VM_EXEC_X, - VM_EXEC_X, - VM_INPUT_ARG, - VM_INPUT_POP, - VM_CMD_MATH, - 0, - VM_FLAG_NO, - VM_OUTPUT_PUSH, - 1 - }, - { // jmp 1 - VM_EXEC_X, - VM_EXEC_X, - VM_INPUT_ARG, - VM_INPUT_ZERO, - VM_CMD_COPY, - 0, - VM_FLAG_NO, - VM_OUTPUT_JUMP, - 1 - }, -}; - void dump_proc(Process *process) { if(process->flags & VM_FLAG_Z) @@ -85,6 +14,11 @@ void dump_proc(Process *process) printf("n"); else printf(" "); + + printf( + "%2d %2d ", + process->codePointer, + process->basePointer); printf("[ "); for(int i = 1; i <= process->stackPointer; i++) { @@ -103,8 +37,43 @@ void vm_assert(int assertion, const char *msg) int main(int argc, const char **argv) { - Module module = { code, 6 }; - + if(argc < 2) { + printf("Usage: vm [binary]\n"); + printf(" [binary]: The file to be executed.\n"); + return 1; + } + Module module = { 0 }; + { // Read module + FILE *f = fopen(argv[1], "rb"); + fseek(f, 0, SEEK_END); + size_t len = ftell(f); + fseek(f, 0, SEEK_SET); + module.code = malloc(len); + module.length = len / sizeof(Instruction); + + char *ptr = (char*)module.code; + for(int p = 0; p < len; p += fread(&ptr[p], 1, sizeof(Instruction), f)); + + fclose(f); + } + printf("Loaded module %s with %d instructions.\n", argv[1], module.length); + for(int i = 0; i < module.length; i++) + { + Instruction c = module.code[i]; + printf( + "%3d: %10d %1d %1d %5d %3d %1d %1d %1d %1d\n", + i, + c.argument, + c.output, + c.flags, + c.cmdinfo, + c.command, + c.input1, + c.input0, + c.execN, + c.execZ); + } + Process process = { &module, 0, 0, 0, 0 }; Process *p = &process;