/* lang.c - simple bytecode language, written in 20 mins Written by Harry "Piru" Sintonen features: - 64k memory - input from stdin - output to stdout - add immediate (8-bit) - sub immediate (8-bit) - absolute jump (16-bit address) - absolute conditional jump (16-bit address) - return */ #include #include #include typedef enum { ST_INIT, ST_RUN } state_t; typedef unsigned char u8; #define INC(x) (((x) + 1) & 65535) #define DEC(x) (((x) - 1) & 65535) int main(int argc, char **argv) { state_t state = ST_INIT; u8 mem[65536]; int pc; int ac; int c; if (argc != 2) { fprintf(stderr, "usage: %s PROGRAM\n", argv[0]); exit(1); } for (;;) switch (state) { case ST_INIT: strncpy((char *) mem, argv[1], sizeof(mem)); pc = 0; ac = 0x8000; state = ST_RUN; break; case ST_RUN: switch (mem[pc]) { case 'I': c = getchar(); if (c == -1) exit(1); mem[ac] = (u8) c; ac = INC(ac); break; case 'O': ac = DEC(ac); putchar(mem[ac]); break; case 'A': mem[ac] = mem[ac] + mem[++pc]; break; case 'S': mem[ac] = mem[ac] - mem[++pc]; break; case 'C': if (mem[ac]) break; case 'J': pc = DEC((mem[pc + 1] << 8) | mem[pc + 2]); break; case 'R': exit(0); } pc = INC(pc); break; } return 0; }