mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-07 11:51:49 +09:00
70 lines
1.5 KiB
JavaScript
70 lines
1.5 KiB
JavaScript
// exec_args: bf.js input_file optional_memsize
|
|
let memsize = exec_args[2]|0;
|
|
if (memsize <= 0) memsize = (sys.maxmem() < 30000) ? sys.maxmem()-256 : 30000;
|
|
let nativePtr = undefined;
|
|
try {
|
|
nativePtr = sys.malloc(memsize);
|
|
}
|
|
catch (e) {
|
|
printerrln("Could not allocate memory with size "+memsize);
|
|
return 10;
|
|
}
|
|
let stubHead = "let x="+memsize+";"+
|
|
"let a=()=>sys.print(String.fromCharCode(sys.peek(t)));"+
|
|
"let k=(b)=>sys.poke(t,b);"+
|
|
"let b=()=>k(sys.readKey());"+
|
|
"let e=()=>sys.peek(t);"+
|
|
"let m=(a,b)=>Number((a-(Math.floor(a/b)*b)).toPrecision(8));"+
|
|
"let p=()=>{t=m(t+1,x)};"+
|
|
"let q=()=>{t=m(t-1,x)};"+
|
|
"let v=()=>k(m(e()+1,256));"+
|
|
"let w=()=>k(m(e()-1,256));"+
|
|
"let t="+nativePtr+";"
|
|
let translation = {
|
|
62: "p();",
|
|
60: "q();",
|
|
43: "v();",
|
|
45: "w();",
|
|
46: "a();",
|
|
44: "b();",
|
|
91: "while(e()){",
|
|
93: "}"
|
|
};
|
|
if (exec_args[1] === undefined) {
|
|
printerrln("Usage: bf <path-to-BF-program>");
|
|
return 1;
|
|
}
|
|
let bfprg = "";
|
|
try {
|
|
let f = files.open(_G.shell.resolvePathInput(exec_args[1]).full);
|
|
bfprg = f.sread();
|
|
}
|
|
catch(e) {
|
|
printerrln(e);
|
|
sys.free(nativePtr);
|
|
return 1;
|
|
}
|
|
try {
|
|
// translate
|
|
let tprg = stubHead;
|
|
for (let k = 0; k < bfprg.length; k++) {
|
|
tprg += (translation[bfprg.charCodeAt(k)] || "");
|
|
}
|
|
|
|
// clear memory
|
|
for (let k = 0; k < memsize; k++) {
|
|
sys.poke(nativePtr+k, 0);
|
|
}
|
|
|
|
// run
|
|
eval(tprg);
|
|
}
|
|
catch (e) {
|
|
printerrln(e);
|
|
return 1;
|
|
}
|
|
finally {
|
|
sys.free(nativePtr);
|
|
}
|
|
|
|
return 0; |