undar-lang/test/bf.ul

69 lines
1.3 KiB
Plaintext

plex Console
{
ref function vector(void):void;
byte read;
u32 pad;
byte type;
byte write;
byte error;
u16 pad2;
ref byte[] addr;
byte mode;
byte exec;
}
Console console = devmap(0x10, Console);
byte memory[10000];
str code = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.";
bf(code);
halt;
function bf(str code)
{
nat mp; // memory pointer
nat ip = 0; // instruction pointer
while (ip < code.length) {
if (ip > code.length) { return; }
if (mp > memory.length) { return; }
if (code[ip] == '>') {
mp = mp + 1;
} else if (code[ip] == '<') {
mp = mp - 1;
} else if (code[ip] == '+') {
memory[mp] = memory[mp] + 1;
} else if (code[ip] == '-') {
memory[mp] = memory[mp] - 1;
} else if (code[ip] == '.') {
console.write = memory[mp];
} else if (code[ip] == ',') {
memory[mp] = console.read;
} else if (code[ip] == '[') {
if(!memory[mp]) {
nat nc = 1;
while (nc > 0) {
ip = ip + 1;
if (code[ip] == '[') {
nc = nc + 1;
} else if (code[ip] == ']') {
nc = nc - 1;
}
}
}
} else if (code[ip] == ']') {
if (memory[mp]) {
nat nc = 1;
while (nc > 0) {
ip = ip - 1;
if (code[ip] == ']') {
nc = nc + 1;
} else if (code[ip] == '[') {
nc = nc - 1;
}
}
}
}
ip = ip + 1;
}
}