From 3be4e7b101063907e4148b1b03ea6d68e7a3053a Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Mon, 8 Nov 2021 23:16:17 +0100 Subject: [PATCH] add platform module providing implementation of random functions --- platform/makefile | 5 ++++- platform/platform.cwa | 16 ++++++++++++++++ src/main.rs | 8 ++++++++ uw8-tool/src/base_module.rs | 3 +++ web/src/main.js | 7 +++++++ 5 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 platform/platform.cwa diff --git a/platform/makefile b/platform/makefile index 67b44a1..b61c4d6 100644 --- a/platform/makefile +++ b/platform/makefile @@ -1,4 +1,7 @@ -all: loader.wasm +all: loader.wasm platform.wasm loader.wasm: loader.cwa curlywas loader.cwa + +platform.wasm: platform.cwa + curlywas platform.cwa \ No newline at end of file diff --git a/platform/platform.cwa b/platform/platform.cwa new file mode 100644 index 0000000..d6f8e7b --- /dev/null +++ b/platform/platform.cwa @@ -0,0 +1,16 @@ +import "env.memory" memory(4); + +global mut randomState: i32 = 37; + +export fn random() -> i32 { + let state: i32; + randomState = (state := ( + state := randomState ^ (randomState << 13) + ) ^ (state >> 17) + ) ^ (state << 5); + randomState * 625341585 +} + +export fn randomSeed(s: i32) { + randomState = (((s + !(s >> 31)) as i64 * 8445297036689579347i64) >> 31i64) as i32; +} diff --git a/src/main.rs b/src/main.rs index 8518721..db29200 100644 --- a/src/main.rs +++ b/src/main.rs @@ -61,6 +61,8 @@ fn main() -> Result<()> { let mut loader = Loader::new(&engine)?; + let platform_module = wasmtime::Module::new(&engine, include_bytes!("../platform/platform.wasm"))?; + let module = wasmtime::Module::new(&engine, loader.load(&uw8_module)?)?; let mut store = wasmtime::Store::new(&engine, ()); @@ -93,6 +95,12 @@ fn main() -> Result<()> { )?; } + let platform_instance = linker.instantiate(&mut store, &platform_module)?; + + for export in platform_instance.exports(&mut store) { + linker.define("env", export.name(), export.into_func().expect("platform surely only exports functions"))?; + } + let instance = linker.instantiate(&mut store, &module)?; let tic = instance.get_typed_func::(&mut store, "tic")?; diff --git a/uw8-tool/src/base_module.rs b/uw8-tool/src/base_module.rs index 0283cd8..37cd43c 100644 --- a/uw8-tool/src/base_module.rs +++ b/uw8-tool/src/base_module.rs @@ -65,6 +65,9 @@ impl BaseModule { add_function(&mut functions, &type_map, "pow", &[F32, F32], Some(F32)); add_function(&mut functions, &type_map, "log", &[F32], Some(F32)); + add_function(&mut functions, &type_map, "random", &[], Some(I32)); + add_function(&mut functions, &type_map, "randomSeed", &[I32], None); + for i in functions.len()..64 { add_function( &mut functions, diff --git a/web/src/main.js b/web/src/main.js index 0233d4a..ebb88e1 100644 --- a/web/src/main.js +++ b/web/src/main.js @@ -1,4 +1,5 @@ import loaderUrl from "data-url:../../platform/loader.wasm"; +import platformUrl from "data-url:../../platform/platform.wasm"; import baseUrl from "data-url:../../uw8-tool/base1.wasm"; async function loadWasm(url, imports) { @@ -96,6 +97,12 @@ async function runModule(data) { importObject.env['g_reserved' + i] = 0; } + let platform_instance = await loadWasm(platformUrl, importObject); + + for(let name in platform_instance.exports) { + importObject.env[name] = platform_instance.exports[name] + } + let instance = new WebAssembly.Instance(await WebAssembly.compile(data), importObject); let buffer = imageData.data;