undar-lang/test/bf.ul

71 lines
1.4 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[10000] memory;
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];
write = memory[mp];
} else if (code[ip] == ',') {
// memory[mp] = console.read;
memory[mp] = 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;
}
}