diff --git a/code.c b/code.c index ba90001..a56567d 100644 --- a/code.c +++ b/code.c @@ -1,8 +1,8 @@ -#define code +#ifndef CODE + +#define CODE -#ifndef instruktion #include "instruktion.c" -#endif /* ifndef instruktion */ unsigned int code1[] = { (PUSHC << 24) | IMMEDIATE(3), @@ -35,4 +35,4 @@ unsigned int code3[] = { (WRCHR << 24), (HALT << 24) }; - +#endif diff --git a/instruktion.c b/instruktion.c index 2a61dee..4f8459c 100644 --- a/instruktion.c +++ b/instruktion.c @@ -1,3 +1,4 @@ +#ifndef INSREUKTION #define instruktion #define IMMEDIATE(x) ((x) & 0x00FFFFFF) @@ -15,3 +16,5 @@ #define WRINT 8 #define RDCHR 9 #define WRCHR 10 + +#endif /* ifndef INSREUKTION */ diff --git a/njvm.c b/njvm.c index bb18621..508908e 100644 --- a/njvm.c +++ b/njvm.c @@ -1,47 +1,26 @@ #include #include #include -#ifndef instruktion #include "instruktion.c" -#endif /* ifndef instruktion */ -#ifndef code #include "code.c" -#endif /* ifndef code */ +#include "stack.c" //Comment to disable debug // #define DEBUG + +// Stack +struct stack stack; +#define SIZE 1000 + unsigned int* programmSpeicher; void copyToProgramm(unsigned int codeToCopy[]){ programmSpeicher = codeToCopy; } -// Stack -#define maxValues 1000 - -unsigned int stack[maxValues]; -unsigned int current = 0; - -void stackPush(unsigned int value) { - if (current > (maxValues-1)) { - fprintf(stderr, "stack overflow\n"); - exit(EXIT_FAILURE); - } - stack[current] = value; - current++; -} - -unsigned int stackPop(void) { - if (current < 1) { - fprintf(stderr, "stack underflow\n"); - exit(EXIT_FAILURE); - } - return stack[--current]; -} - void version(void) { printf("Ninja Virtual Machine version %i (compiled %s, %s)\n", 0, __DATE__, __TIME__); } @@ -52,46 +31,46 @@ void help(void) { void printProgramm(){ int i = 0; char c[10]; - while (programmSpeicher[i] != 0) - { - switch (programmSpeicher[i] >> 24) { - case PUSHC: - strcpy(c,"pushc"); - break; - case ADD: - strcpy(c,"add"); - break; - case SUB: - strcpy(c,"sub"); - break; - case MUL: - strcpy(c,"mul"); - break; - case DIV: - strcpy(c,"div"); - break; - case MOD: - strcpy(c,"mod"); - break; - case RDINT: - strcpy(c,"rdint"); - break; - case WRINT: - strcpy(c,"wrint"); - break; - case RDCHR: - strcpy(c,"rdchr"); - break; - case WRCHR: - strcpy(c,"wrchr"); - break; - default: - strcpy(c,"halt"); - break; - } - IMMEDIATE(programmSpeicher[i])? printf("%03i:\t%s\t%i\n",i,c,IMMEDIATE(programmSpeicher[i])) : printf("%03i:\t%s\n",i,c); - i++; - } + // while (programmSpeicher[i] != 0) + // { + // switch (programmSpeicher[i] >> 24) { + // case PUSHC: + // strcpy(c,"pushc"); + // break; + // case ADD: + // strcpy(c,"add"); + // break; + // case SUB: + // strcpy(c,"sub"); + // break; + // case MUL: + // strcpy(c,"mul"); + // break; + // case DIV: + // strcpy(c,"div"); + // break; + // case MOD: + // strcpy(c,"mod"); + // break; + // case RDINT: + // strcpy(c,"rdint"); + // break; + // case WRINT: + // strcpy(c,"wrint"); + // break; + // case RDCHR: + // strcpy(c,"rdchr"); + // break; + // case WRCHR: + // strcpy(c,"wrchr"); + // break; + // default: + // strcpy(c,"halt"); + // break; + // } + // IMMEDIATE(programmSpeicher[i])? printf("%03i:\t%s\t%i\n",i,c,IMMEDIATE(programmSpeicher[i])) : printf("%03i:\t%s\n",i,c); + // i++; + // } printf("%03i:\thalt\n",i); } void execute(void) { @@ -106,39 +85,39 @@ void execute(void) { goto end; break; case PUSHC: - stackPush(IMMEDIATE(programmSpeicher[i])); + push(stack,IMMEDIATE(programmSpeicher[i])); break; case ADD: - stackPush(stackPop()+stackPop()); + push(stack,pop(stack)+pop(stack)); break; case SUB: - temp = stackPop(); - stackPush(stackPop() - temp); + temp = pop(stack); + push(stack,pop(stack) - temp); break; case MUL: - stackPush(stackPop()*stackPop()); + push(stack,pop(stack)*pop(stack)); break; case DIV: - temp = stackPop(); - stackPush(stackPop()/temp); + temp = pop(stack); + push(stack,pop(stack)/temp); break; case MOD: - temp = stackPop(); - stackPush(stackPop()%temp); + temp = pop(stack); + push(stack,pop(stack)%temp); break; case RDINT: scanf("%i",&intInput); - stackPush(intInput); + push(stack,intInput); break; case WRINT: - printf("%i",stackPop()); + printf("%i",pop(stack)); break; case RDCHR: scanf("%c",&charInput); - stackPush(charInput); + push(stack,charInput); break; case WRCHR: - printf("%c",stackPop()); + printf("%c",pop(stack)); break; } i++; @@ -148,15 +127,6 @@ end: } #ifdef DEBUG -void printStack(void){ - if(current >= 0) return; - printf("----\n"); - for (int i = 0; i < current; i++) { - printf("|%i| \n",stack[i]); - } - printf("----\n"); -} - void tests(void){ printf("Runnig debug mode\n"); copyToProgramm(code1); @@ -167,6 +137,12 @@ void tests(void){ #endif /* ifdef DEBUG */ int main(int argc, char *argv[]) { + int size = SIZE; + int current = 0; + unsigned int s[SIZE]; + stack.size = &size; + stack.current = ¤t; + stack.stack = s; #ifdef DEBUG tests(); #endif /* ifdef DEBUG */ @@ -192,7 +168,7 @@ int main(int argc, char *argv[]) { // Started printf("Ninja Virtual Machine started\n"); printProgramm(); - execute(); + // execute(); // Stopped printf("Ninja Virtual Machine stopped\n"); return 0; diff --git a/stack.c b/stack.c new file mode 100755 index 0000000..e941f88 --- /dev/null +++ b/stack.c @@ -0,0 +1,47 @@ +// +// Created by Nilss on 29.10.2023. +// +#ifndef STACK +#define STACK + +#include +#include + +struct stack { + int* size; + int* current; + unsigned int *stack; +}; + +void printStack(struct stack stack) { + printf("Stack\nSize:\t\t%i\nCurrent:\t%i\n", *stack.size, *stack.current); + for (int i = 0; i < *stack.size; ++i) { + printf("|%i|\n", stack.stack[i]); + } +} + +struct stack initStack(int size) { + unsigned int a[size]; + int current = 0; + struct stack s1 = {&size, ¤t, a}; + return s1; +} + +void push(struct stack s, unsigned int value) { + if (*s.current >= *s.size) { + printf("Stack Overflow\n"); + exit(EXIT_FAILURE); + } + s.stack[*s.current] = value; + *s.current=*s.current + 1; +} + +unsigned int pop(struct stack s) { + if (*s.current == 0) { + printf("Stack Underflow\n"); + exit(EXIT_FAILURE); + } + *s.current = *s.current -1; + return s.stack[*s.current]; +} +#endif