add error message if no program selected
fix error with negative numbers
This commit is contained in:
parent
1363db7c11
commit
c16fe6349b
71
njvm.c
71
njvm.c
@ -5,10 +5,9 @@
|
|||||||
#include "stack.c"
|
#include "stack.c"
|
||||||
#include "program.c"
|
#include "program.c"
|
||||||
|
|
||||||
|
|
||||||
//Comment to disable debug
|
//Comment to disable debug
|
||||||
|
|
||||||
#define DEBUG
|
//#define DEBUG
|
||||||
|
|
||||||
// Stack
|
// Stack
|
||||||
struct stack stack;
|
struct stack stack;
|
||||||
@ -33,48 +32,49 @@ void execute(struct program program) {
|
|||||||
for (i = 0; i < *program.size; ++i) {
|
for (i = 0; i < *program.size; ++i) {
|
||||||
switch (program.program[i] >> 24) {
|
switch (program.program[i] >> 24) {
|
||||||
case HALT:
|
case HALT:
|
||||||
goto end;
|
goto end;
|
||||||
break;
|
break;
|
||||||
case PUSHC:
|
case PUSHC:
|
||||||
push(stack,IMMEDIATE(program.program[i]));
|
push(stack, SIGN_EXTEND(IMMEDIATE(program.program[i])));
|
||||||
break;
|
break;
|
||||||
case ADD:
|
case ADD:
|
||||||
push(stack,pop(stack)+pop(stack));
|
push(stack, pop(stack) + pop(stack));
|
||||||
break;
|
break;
|
||||||
case SUB:
|
case SUB:
|
||||||
temp = pop(stack);
|
temp = pop(stack);
|
||||||
push(stack,pop(stack) - temp);
|
push(stack, pop(stack) - temp);
|
||||||
break;
|
break;
|
||||||
case MUL:
|
case MUL:
|
||||||
push(stack,pop(stack)*pop(stack));
|
push(stack, pop(stack) * pop(stack));
|
||||||
break;
|
break;
|
||||||
case DIV:
|
case DIV:
|
||||||
temp = pop(stack);
|
temp = pop(stack);
|
||||||
push(stack,pop(stack)/temp);
|
push(stack, pop(stack) / temp);
|
||||||
break;
|
break;
|
||||||
case MOD:
|
case MOD:
|
||||||
temp = pop(stack);
|
temp = pop(stack);
|
||||||
push(stack,pop(stack)%temp);
|
push(stack, pop(stack) % temp);
|
||||||
break;
|
break;
|
||||||
case RDINT:
|
case RDINT:
|
||||||
scanf("%i",&intInput);
|
scanf("%i", &intInput);
|
||||||
push(stack,intInput);
|
push(stack, intInput);
|
||||||
break;
|
break;
|
||||||
case WRINT:
|
case WRINT:
|
||||||
printf("%i",pop(stack));
|
printf("%i", pop(stack));
|
||||||
break;
|
break;
|
||||||
case RDCHR:
|
case RDCHR:
|
||||||
scanf("%c",&charInput);
|
scanf("%c", &charInput);
|
||||||
push(stack,charInput);
|
push(stack, charInput);
|
||||||
break;
|
break;
|
||||||
case WRCHR:
|
case WRCHR:
|
||||||
printf("%c",pop(stack));
|
printf("%c", pop(stack));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end:
|
end:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
||||||
void tests(void){
|
void tests(void){
|
||||||
@ -96,37 +96,44 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
// Initialize ProgrammSpeicher
|
// Initialize ProgrammSpeicher
|
||||||
int psize = 1000;
|
int psize = 1000;
|
||||||
|
int saveProgram = 0;
|
||||||
unsigned int p[1000];
|
unsigned int p[1000];
|
||||||
program.size = &psize;
|
program.size = &psize;
|
||||||
program.program = p;
|
program.program = p;
|
||||||
|
program.saveProgram = &saveProgram;
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
tests();
|
tests();
|
||||||
#endif /* ifdef DEBUG */
|
#endif /* ifdef DEBUG */
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
if (strcmp(argv[1], "--version") == 0) {
|
if (strcmp(argv[1], "--version") == 0) {
|
||||||
version();
|
version();
|
||||||
} else if (strcmp(argv[1], "--help") == 0) {
|
} else if (strcmp(argv[1], "--help") == 0) {
|
||||||
help();
|
help();
|
||||||
} else if (strcmp(argv[1], "--prog1") == 0) {
|
} else if (strcmp(argv[1], "--prog1") == 0) {
|
||||||
copyToProgram(code1, sizeof(code1)/sizeof(code1[0]),program);
|
copyToProgram(code1, sizeof(code1) / sizeof(code1[0]), program);
|
||||||
goto run;
|
goto run;
|
||||||
} else if (strcmp(argv[1],"--prog2") == 0) {
|
} else if (strcmp(argv[1], "--prog2") == 0) {
|
||||||
copyToProgram(code2, sizeof(code2)/sizeof(code2[0]),program);
|
copyToProgram(code2, sizeof(code2) / sizeof(code2[0]), program);
|
||||||
goto run;
|
goto run;
|
||||||
}else if (strcmp(argv[1],"--prog3") == 0) {
|
} else if (strcmp(argv[1], "--prog3") == 0) {
|
||||||
copyToProgram(code3, sizeof(code3)/sizeof(code3[0]),program);
|
copyToProgram(code3, sizeof(code3) / sizeof(code3[0]), program);
|
||||||
goto run;
|
goto run;
|
||||||
}else {
|
} else {
|
||||||
printf("unknown command line argument '%s', try './njvm --help'", argv[1]);
|
printf("unknown command line argument '%s', try './njvm --help'", argv[1]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
run:
|
run:
|
||||||
// Started
|
// Started
|
||||||
printf("Ninja Virtual Machine started\n");
|
if (*program.saveProgram == 1) {
|
||||||
printProgram(program);
|
printf("Ninja Virtual Machine started\n");
|
||||||
execute(program);
|
printProgram(program);
|
||||||
|
execute(program);
|
||||||
|
} else {
|
||||||
|
printf("Error: no program selected\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
// Stopped
|
// Stopped
|
||||||
printf("Ninja Virtual Machine stopped\n");
|
printf("Ninja Virtual Machine stopped\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@ -11,6 +11,7 @@
|
|||||||
struct program {
|
struct program {
|
||||||
int *size;
|
int *size;
|
||||||
unsigned int *program;
|
unsigned int *program;
|
||||||
|
int *saveProgram;
|
||||||
};
|
};
|
||||||
|
|
||||||
void copyToProgram(const unsigned int codeToCopy[], int size, struct program program) {
|
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.program[i] = codeToCopy[i];
|
||||||
}
|
}
|
||||||
*program.size = size;
|
*program.size = size;
|
||||||
|
*program.saveProgram = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void printProgram(struct program program) {
|
void printProgram(struct program program) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user