1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdint.h>
#include <stdio.h>
typedef uint16_t u16;
static const u16 n = -1;
static u16 m[1<<16], prog = 0, pc = 0;
int main(int argc, char **argv) {
if (setvbuf(stdout, NULL, _IONBF, 0) < 0)
return 1;
for (long i = 1, d = 0; i < argc; i++) {
FILE *f = fopen(argv[i], "rb");
if (!f)
return 2;
while (fscanf(f, "%ld,", &d) > 0)
m[prog++] = d;
if (fclose(f) < 0)
return 3;
}
for (pc = 0; pc < 32768;) {
u16 a = m[pc++], b = m[pc++], c = m[pc++];
if (a == n) {
m[b] = getchar();
} else if (b == n) {
if (putchar(m[a]) < 0)
return 3;
} else if (c & 0x8000 && c != n) {
u16 mc = m[c & 0x7FFF];
m[b] = (m[a] & ~mc) | (m[b] & mc);
} else {
u16 r = m[b] - m[a];
if (r == 0 || r & 32768)
pc = c;
m[b] = r;
}
}
return 0;
}