add error message if no program selected
fix error with negative numbers
This commit is contained in:
parent
1363db7c11
commit
c16fe6349b
79
njvm.c
79
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;
|
||||
|
||||
@ -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) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user