#include #include #include "instruktion.c" #include "code.c" #include "stack.c" #include "program.c" #include "codeReader.c" #include "SDA.c" //Comment to disable debug #define DEBUG // Stack struct stack stack; #define SIZE 1000 // Program struct program program; // SDA struct sda sda; unsigned fp; void version(void) { printf("Ninja Virtual Machine version %i (compiled %s, %s)\n", 0, __DATE__, __TIME__); } void help(void) { printf("Usage: ./njvm [options] \n\t--debug\tstart virtual machine in debug mode\n\t--version\tshow version and exit\n\t--help\t\tshow this help and exit\n"); } void execute(struct program program) { int i; int intInput; unsigned int temp; char charInput; for (i = 0; i < *program.size; ++i) { switch (program.program[i] >> 24) { case HALT: goto end; case PUSHC: push(stack, SIGN_EXTEND(IMMEDIATE(program.program[i]))); break; case ADD: push(stack, pop(stack) + pop(stack)); break; case SUB: temp = pop(stack); push(stack, pop(stack) - temp); break; case MUL: push(stack, pop(stack) * pop(stack)); break; case DIV: temp = pop(stack); push(stack, pop(stack) / temp); break; case MOD: temp = pop(stack); push(stack, pop(stack) % temp); break; case RDINT: scanf("%i", &intInput); push(stack, intInput); break; case WRINT: printf("%i", pop(stack)); break; case RDCHR: scanf("%c", &charInput); push(stack, charInput); break; case WRCHR: printf("%c", pop(stack)); break; case PUSHG: push(stack, getSDA(SIGN_EXTEND(IMMEDIATE(program.program[i])), sda)); break; case POPG: setSDA(SIGN_EXTEND(IMMEDIATE(program.program[i])), pop(stack), sda); break; case ASF: push(stack, *stack.current); fp = *stack.current - 1; *stack.current = *stack.current + SIGN_EXTEND(IMMEDIATE(program.program[i])); break; case RSF: *stack.current = fp + 2; fp = pop(stack); case POPL: stack.stack[fp + SIGN_EXTEND(IMMEDIATE(program.program[i]))] = pop(stack); break; case PUSHL: push(stack, stack.stack[fp + SIGN_EXTEND(IMMEDIATE(program.program[i]))]); break; } } end: return; } #ifdef DEBUG void tests(void) { printf("Runnig debug mode\n"); int temp = fromFile("./prog1.bin", program); int sizeSDA = temp; unsigned int s[sizeSDA]; sda.size = &temp; sda.sda = s; printProgram(program); } #endif /* ifdef DEBUG */ int main(int argc, char *argv[]) { // Initialize the Stack int size = SIZE; int current = 0; unsigned int s[SIZE]; stack.size = &size; stack.current = ¤t; stack.stack = s; // Initialize ProgrammSpeicher int psize = 1000; int saveProgram = 0; unsigned int p[1000]; program.size = &psize; program.program = p; program.saveProgram = &saveProgram; int debug = 0; if (debug){ tests(); } if (argc > 1) { if (strcmp(argv[1], "--version") == 0) { version(); } else if (strcmp(argv[1], "--help") == 0) { help(); } else { int temp = fromFile(argv[1], program); int sizeSDA = temp; unsigned int s[sizeSDA]; sda.size = &temp; sda.sda = s; execute(program); } } else { return 0; } }