From c16fe6349bcdf250d27887bbe4c39fd3addceb5e Mon Sep 17 00:00:00 2001 From: Elias Bennour Date: Sun, 3 Dec 2023 14:24:22 +0100 Subject: [PATCH] add error message if no program selected fix error with negative numbers --- njvm.c | 79 ++++++++++++++++++++++++++++++------------------------- program.c | 2 ++ 2 files changed, 45 insertions(+), 36 deletions(-) diff --git a/njvm.c b/njvm.c index d501000..01ecbf5 100644 --- a/njvm.c +++ b/njvm.c @@ -3,12 +3,11 @@ #include "instruktion.c" #include "code.c" #include "stack.c" -#include "program.c" - +#include "program.c" //Comment to disable debug -#define DEBUG +//#define DEBUG // Stack struct stack stack; @@ -33,48 +32,49 @@ void execute(struct program program) { for (i = 0; i < *program.size; ++i) { switch (program.program[i] >> 24) { case HALT: - goto end; + goto end; break; case PUSHC: - push(stack,IMMEDIATE(program.program[i])); + push(stack, SIGN_EXTEND(IMMEDIATE(program.program[i]))); break; case ADD: - push(stack,pop(stack)+pop(stack)); + push(stack, pop(stack) + pop(stack)); break; case SUB: - temp = pop(stack); - push(stack,pop(stack) - temp); + temp = pop(stack); + push(stack, pop(stack) - temp); break; case MUL: - push(stack,pop(stack)*pop(stack)); + push(stack, pop(stack) * pop(stack)); break; case DIV: - temp = pop(stack); - push(stack,pop(stack)/temp); + temp = pop(stack); + push(stack, pop(stack) / temp); break; case MOD: - temp = pop(stack); - push(stack,pop(stack)%temp); + temp = pop(stack); + push(stack, pop(stack) % temp); break; case RDINT: - scanf("%i",&intInput); - push(stack,intInput); + scanf("%i", &intInput); + push(stack, intInput); break; case WRINT: - printf("%i",pop(stack)); + printf("%i", pop(stack)); break; case RDCHR: - scanf("%c",&charInput); - push(stack,charInput); + scanf("%c", &charInput); + push(stack, charInput); break; case WRCHR: - printf("%c",pop(stack)); + printf("%c", pop(stack)); break; } } end: return; } + #ifdef DEBUG void tests(void){ @@ -93,40 +93,47 @@ int main(int argc, char *argv[]) { 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; - - #ifdef DEBUG - tests(); - #endif /* ifdef DEBUG */ - if (argc > 1) { + +#ifdef DEBUG + tests(); +#endif /* ifdef DEBUG */ + if (argc > 1) { if (strcmp(argv[1], "--version") == 0) { version(); } else if (strcmp(argv[1], "--help") == 0) { help(); - } else if (strcmp(argv[1], "--prog1") == 0) { - copyToProgram(code1, sizeof(code1)/sizeof(code1[0]),program); + } else if (strcmp(argv[1], "--prog1") == 0) { + copyToProgram(code1, sizeof(code1) / sizeof(code1[0]), program); goto run; - } else if (strcmp(argv[1],"--prog2") == 0) { - copyToProgram(code2, sizeof(code2)/sizeof(code2[0]),program); + } else if (strcmp(argv[1], "--prog2") == 0) { + copyToProgram(code2, sizeof(code2) / sizeof(code2[0]), program); goto run; - }else if (strcmp(argv[1],"--prog3") == 0) { - copyToProgram(code3, sizeof(code3)/sizeof(code3[0]),program); + } else if (strcmp(argv[1], "--prog3") == 0) { + copyToProgram(code3, sizeof(code3) / sizeof(code3[0]), program); goto run; - }else { + } else { printf("unknown command line argument '%s', try './njvm --help'", argv[1]); } } else { - run: + run: // Started - printf("Ninja Virtual Machine started\n"); - printProgram(program); - execute(program); + if (*program.saveProgram == 1) { + printf("Ninja Virtual Machine started\n"); + printProgram(program); + execute(program); + } else { + printf("Error: no program selected\n"); + return 1; + } // Stopped printf("Ninja Virtual Machine stopped\n"); return 0; diff --git a/program.c b/program.c index 0eddcff..3a484dd 100644 --- a/program.c +++ b/program.c @@ -11,6 +11,7 @@ struct program { int *size; unsigned int *program; + int *saveProgram; }; void copyToProgram(const unsigned int codeToCopy[], int size, struct program program) { @@ -18,6 +19,7 @@ void copyToProgram(const unsigned int codeToCopy[], int size, struct program pro program.program[i] = codeToCopy[i]; } *program.size = size; + *program.saveProgram = 1; } void printProgram(struct program program) {