buildPart1Module = () => {
const module = new binaryen.Module();
module.addFunctionImport(
'print',
'env',
'print',
[binaryen.i32],
binaryen.i32
);
for (let name of ['xMin', 'xMax', 'yMin', 'yMax']) {
module.addGlobal(name, binaryen.i32, 1, module.i32.const(0));
}
const memSize = Math.floor((1024 * 1024 * 1024) / 65536);
module.setMemory(memSize, memSize, 'memory');
module.addFunction(
"setBounds",
binaryen.createType([
binaryen.i32,
binaryen.i32,
binaryen.i32,
binaryen.i32
]),
binaryen.i32,
[],
module.block(null, [
...['xMin', 'xMax', 'yMin', 'yMax'].map((name, i) =>
module.global.set(name, module.local.get(i, binaryen.i32))
),
module.if(
module.i32.lt_s(
module.memory.size(),
module.i32.div_s(
module.i32.mul(
module.i32.add(
module.i32.sub(
module.global.get('xMax', binaryen.i32),
module.global.get('yMax', binaryen.i32)
),
module.i32.const(1)
),
module.i32.add(
module.i32.sub(
module.global.get('yMax', binaryen.i32),
module.global.get('yMin', binaryen.i32)
),
module.i32.const(1)
)
),
module.i32.const(65536)
)
),
module.return(module.i32.const(1))
),
module.return(module.i32.const(0))
])
);
module.addFunctionExport("setBounds", "setBounds");
/** Get location of spot at x and y (local parameters 0 and 1) in linear memory */
const arrayMath = () => {
return module.i32.add(
// x - xMin
module.i32.sub(
module.local.get(0, binaryen.i32),
module.global.get('xMin', binaryen.i32)
),
// (y - yMin) * (xMax - xMin + 1)
module.i32.mul(
module.i32.sub(
module.local.get(1, binaryen.i32),
module.global.get('yMin', binaryen.i32)
),
module.i32.add(
module.i32.sub(
module.global.get('xMax', binaryen.i32),
module.global.get('xMin', binaryen.i32)
),
module.i32.const(1)
)
)
);
};
module.addFunction(
"recordSpot",
binaryen.createType([binaryen.i32, binaryen.i32]),
null,
[],
module.block(null, [
module.i32.store8(0, 0, arrayMath(), module.i32.const(1))
])
);
module.addFunctionExport("recordSpot", "recordSpot");
module.addFunction(
"checkSpot",
binaryen.createType([binaryen.i32, binaryen.i32]),
binaryen.i32,
[],
module.block(null, [module.return(module.i32.load8_s(0, 0, arrayMath()))])
);
module.addFunctionExport("checkSpot", "checkSpot");
if (!module.validate()) {
throw new Error("validation error");
}
return module;
}