public class BF { private final int ARRAYSIZE = 10000; private final int CODESIZE = 10000; private IO io = new IO(); private byte[] prog = new byte[CODESIZE]; private byte[] data = new byte[ARRAYSIZE]; private int ptr, pc; public void startup() { io.putchar((byte) '\n'); io.putchar((byte) 'B'); io.putchar((byte) 'r'); io.putchar((byte) 'a'); io.putchar((byte) 'i'); io.putchar((byte) 'n'); io.putchar((byte) 'f'); io.putchar((byte) '*'); io.putchar((byte) '*'); io.putchar((byte) 'k'); io.putchar((byte) '\n'); return; } private void prompt() { io.putchar((byte) '>'); io.putchar((byte) ' '); return; } public void read() { prompt(); for (int i = 0; i < CODESIZE; i++) { byte b; b = io.getchar(); //io.putchar(b); if (b == '\n' || b == '\r') { prog[i] = (byte) 0; break; } else { prog[i] = b; } } } public void print() { boolean flag = true; for (int i = 0; i < CODESIZE; i++) { byte b; b = prog[i]; if (b == 0) { break; } io.putchar(b); } io.putchar((byte) '\n'); } private void put_hex(byte b) { byte h; h = (byte) ((b >> 4) & 0x0F); if (0 <= h && h <= 9) { io.putchar((byte) (h + '0')); } else { io.putchar((byte) ((h - 10) + 'A')); } byte l; l = (byte) ((b >> 0) & 0x0F); if (0 <= h && l <= 9) { io.putchar((byte) (l + '0')); } else { io.putchar((byte) ((l - 10) + 'A')); } io.putchar((byte) '\n'); } public void init() { ptr = 0; pc = 0; for (int i = 0; i < ARRAYSIZE; i++) { data[i] = 0; } return; } public boolean step() { //System.out.printf("[0]=%02x\n", data[0]); //System.out.printf("[1]=%02x\n", data[1]); //System.out.printf("[2]=%02x\n", data[2]); //System.out.printf("pc=%02x\n", pc); //System.out.printf("ptr=%02x\n", ptr); byte cmd; cmd = prog[pc]; byte tmp; int nlvl = 0; switch (cmd) { case 0: return false; case '>': ptr++; break; case '<': ptr--; break; case '+': data[ptr] = (byte) (data[ptr] + 1); break; case '-': data[ptr] = (byte) (data[ptr] - 1); break; case '.': io.putchar(data[ptr]); break; case ',': data[ptr] = io.getchar(); break; case '[': if (data[ptr] == (byte) 0) { while (true) { pc++; if(prog[pc] == ']' && nlvl == 0) break; if(prog[pc] == '[') nlvl++; if(prog[pc] == ']') nlvl--; } } break; case ']': while (true) { pc--; if(prog[pc] == '[' && nlvl == 0) break; if(prog[pc] == ']') nlvl++; if(prog[pc] == '[') nlvl--; } pc--; break; default: break; } pc++; return true; } }