diff --git a/njvm.c b/njvm.c index efd6625..ae32165 100644 --- a/njvm.c +++ b/njvm.c @@ -167,12 +167,18 @@ void execute(struct program program) { if (debug == 1) printf("new i: %i\n", i); break; case CALL: - push(stack, i+1); - break; + if (debug == 1) printf("call: %i\n", SIGN_EXTEND(IMMEDIATE(program.program[i]))); + push(stack, i + 1); + i = SIGN_EXTEND(IMMEDIATE(program.program[i])) - 1; + if (debug == 1) printf("new i: %i\n", i); + break; case RET: - i = pop(stack); - break; - } + if (debug == 1) printf("ret\n"); + if (debug == 1) printf("pop: %i\n", peek(stack, 1)); + i = pop(stack); + if (debug == 1) printf("new i: %i\n", i); + break; + } } end: return; diff --git a/program.c b/program.c index d5491c4..4fcdbe5 100644 --- a/program.c +++ b/program.c @@ -104,6 +104,24 @@ void printProgram(struct program program) { case BRT: strcpy(c, "brt"); break; + case CALL: + strcpy(c, "call"); + break; + case RET: + strcpy(c, "ret"); + break; + case DROP: + strcpy(c, "drop"); + break; + case PUSHR: + strcpy(c, "pushr"); + break; + case POPR: + strcpy(c, "popr"); + break; + case DUP: + strcpy(c, "dup"); + break; default: strcpy(c, "ERROR"); break;