#include <stdio.h>
int main(int argc, char **argv) {
unsigned char mem[256];
FILE *f;
if (argc != 2) {
printf("Usage: %s <program>\n", argv[0]);
return 1;
}
f = fopen(argv[1], "rb");
if (!f) {
printf("Cannot open file: %s\n", argv[1]);
return 2;
}
fread(mem + 16, 1, 240, f);
fclose(f);
unsigned char ip = 16;
while (mem[ip] != 9) {
switch (mem[ip]) {
case 0: mem[0] = mem[ip+1]; ip += 2; break;
case 1: mem[0] = mem[mem[mem[ip+1]]]; ip += 2; break;
case 2: mem[mem[ip+1]] = mem[0]; ip += 2; break;
case 3: mem[mem[mem[ip+1]]] = mem[0]; ip += 2; break;
case 4: mem[0] = mem[mem[ip+1]] - mem[0]; ip += 2; break;
case 5: if (*mem > mem[mem[ip+1]]) *mem = 0; ip += 2; break;
case 6: if (*mem) ip = mem[ip+1]; else ip += 2; break;
case 7: scanf("%c", mem); ip += 1; break;
case 8: printf("%c", *mem); ip += 1; break;
default:
printf("Invalid opcode (%d) at address %d\n", mem[ip], ip);
return 3;
}
}
}