diff --git a/nrj.c b/nrj.c index be22b5f..f6040b2 100644 --- a/nrj.c +++ b/nrj.c @@ -68,21 +68,18 @@ void nrj_load(NRJWORD* m, NRJWORD offset, char *fname) { } void nrj_run(char *program) { - NRJWORD maxaddr = (NRJWORD) (NRJSIZE - 1), mem[NRJSIZE], a, b, c; - mem[0] = (NRJWORD) 4; - mem[1] = mem[2] = mem[3] = (NRJWORD) 0; - nrj_load(mem, mem[0], program); - while(mem[0] != maxaddr) { - if(mem[1]) nrj_in(&mem[3], &mem[mem[1]]); - a = mem[0]++; - b = mem[0]++; - c = mem[0]++; - mem[a] = (~(mem[a] | mem[b])) & maxaddr; - mem[0] = (mem[0] + mem[c]) & maxaddr; - mem[1] = (NRJWORD) 0; - if(mem[2]) { - nrj_out(&mem[3], &mem[mem[2]]); - mem[2] = (NRJWORD) 0; + NRJWORD maxaddr = (NRJWORD) (NRJSIZE - 1), mem[NRJSIZE], pc; + mem[0] = mem[1] = mem[2] = (NRJWORD) 0; + pc = (NRJWORD) 3; + nrj_load(mem, pc, program); + while(pc != maxaddr) { + if(mem[0]) nrj_in(&mem[2], &mem[mem[0]]); + mem[mem[pc]] = (~(mem[mem[pc]] | mem[mem[pc+1]])) & maxaddr; + pc = mem[mem[pc+2]]; + mem[0] = (NRJWORD) 0; + if(mem[1]) { + nrj_out(&mem[2], &mem[mem[1]]); + mem[1] = (NRJWORD) 0; } } }