mirror of
https://github.com/exoticorn/microw8.git
synced 2026-11-14 07:17:19 +01:00
Compare commits
21
Commits
v0.1.2
..
0f82e6e711
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0f82e6e711 | ||
|
|
0ade24ebf6 | ||
|
|
29186c806f | ||
|
|
b626d2609a | ||
|
|
39ead8220f | ||
|
|
ce18a8a162 | ||
|
|
a15e796489 | ||
|
|
f178076b86 | ||
|
|
81adcf0198 | ||
|
|
780caf965a | ||
|
|
2033f9a172 | ||
|
|
0d514c7dd3 | ||
|
|
a8eb3bda27 | ||
|
|
8b765a5742 | ||
|
|
7197c11586 | ||
|
|
99a423619e | ||
|
|
9063e872d3 | ||
|
|
85240599e8 | ||
|
|
35ec5fdb59 | ||
|
|
a6a82ff5a1 | ||
|
|
973814a629 |
No files matched your search
Generated
+117
-99
@@ -2,22 +2,13 @@
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "addr2line"
|
||||
version = "0.16.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3e61f2b7f93d2c7d2b08263acaa4a363b3e276806c68af6134c44f523bf1aacd"
|
||||
dependencies = [
|
||||
"gimli 0.25.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "addr2line"
|
||||
version = "0.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b"
|
||||
dependencies = [
|
||||
"gimli 0.26.1",
|
||||
"gimli",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -68,6 +59,17 @@ dependencies = [
|
||||
"yansi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "async-trait"
|
||||
version = "0.1.52"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "atty"
|
||||
version = "0.2.14"
|
||||
@@ -91,12 +93,12 @@ version = "0.3.63"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "321629d8ba6513061f26707241fa9bc89524ff1cd7a915a97ef0c62c666ce1b6"
|
||||
dependencies = [
|
||||
"addr2line 0.17.0",
|
||||
"addr2line",
|
||||
"cc",
|
||||
"cfg-if 1.0.0",
|
||||
"libc",
|
||||
"miniz_oxide",
|
||||
"object 0.27.1",
|
||||
"object",
|
||||
"rustc-demangle",
|
||||
]
|
||||
|
||||
@@ -332,24 +334,24 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cranelift-bforest"
|
||||
version = "0.77.0"
|
||||
version = "0.81.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "15013642ddda44eebcf61365b2052a23fd8b7314f90ba44aa059ec02643c5139"
|
||||
checksum = "32f027f29ace03752bb83c112eb4f53744bc4baadf19955e67fcde1d71d2f39d"
|
||||
dependencies = [
|
||||
"cranelift-entity",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cranelift-codegen"
|
||||
version = "0.77.0"
|
||||
version = "0.81.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "298f2a7ed5fdcb062d8e78b7496b0f4b95265d20245f2d0ca88f846dd192a3a3"
|
||||
checksum = "6c10af69cbf4e228c11bdc26d8f9d5276773909152a769649a160571b282f92f"
|
||||
dependencies = [
|
||||
"cranelift-bforest",
|
||||
"cranelift-codegen-meta",
|
||||
"cranelift-codegen-shared",
|
||||
"cranelift-entity",
|
||||
"gimli 0.25.0",
|
||||
"gimli",
|
||||
"log",
|
||||
"regalloc",
|
||||
"smallvec",
|
||||
@@ -358,34 +360,33 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cranelift-codegen-meta"
|
||||
version = "0.77.0"
|
||||
version = "0.81.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5cf504261ac62dfaf4ffb3f41d88fd885e81aba947c1241275043885bc5f0bac"
|
||||
checksum = "290ac14d2cef43cbf1b53ad5c1b34216c9e32e00fa9b6ac57b5e5a2064369e02"
|
||||
dependencies = [
|
||||
"cranelift-codegen-shared",
|
||||
"cranelift-entity",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cranelift-codegen-shared"
|
||||
version = "0.77.0"
|
||||
version = "0.81.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1cd2a72db4301dbe7e5a4499035eedc1e82720009fb60603e20504d8691fa9cd"
|
||||
checksum = "beb9142d134a03d01e3995e6d8dd3aecf16312261d0cb0c5dcd73d5be2528c1c"
|
||||
|
||||
[[package]]
|
||||
name = "cranelift-entity"
|
||||
version = "0.77.0"
|
||||
version = "0.81.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "48868faa07cacf948dc4a1773648813c0e453ff9467e800ff10f6a78c021b546"
|
||||
checksum = "1268a50b7cbbfee8514d417fc031cedd9965b15fa9e5ed1d4bc16de86f76765e"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cranelift-frontend"
|
||||
version = "0.77.0"
|
||||
version = "0.81.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "351c9d13b4ecd1a536215ec2fd1c3ee9ee8bc31af172abf1e45ed0adb7a931df"
|
||||
checksum = "97ac0d440469e19ab12183e31a9e41b4efd8a4ca5fbde2a10c78c7bb857cc2a4"
|
||||
dependencies = [
|
||||
"cranelift-codegen",
|
||||
"log",
|
||||
@@ -395,9 +396,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cranelift-native"
|
||||
version = "0.77.0"
|
||||
version = "0.81.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6df8b556663d7611b137b24db7f6c8d9a8a27d7f29c7ea7835795152c94c1b75"
|
||||
checksum = "794cd1a5694a01c68957f9cfdc5ac092cf8b4e9c2d1697c4a5100f90103e9e9e"
|
||||
dependencies = [
|
||||
"cranelift-codegen",
|
||||
"libc",
|
||||
@@ -406,9 +407,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cranelift-wasm"
|
||||
version = "0.77.0"
|
||||
version = "0.81.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7a69816d90db694fa79aa39b89dda7208a4ac74b6f2b8f3c4da26ee1c8bdfc5e"
|
||||
checksum = "f2ddd4ca6963f6e94d00e8935986411953581ac893587ab1f0eb4f0b5a40ae65"
|
||||
dependencies = [
|
||||
"cranelift-codegen",
|
||||
"cranelift-entity",
|
||||
@@ -416,7 +417,7 @@ dependencies = [
|
||||
"itertools",
|
||||
"log",
|
||||
"smallvec",
|
||||
"wasmparser 0.80.2",
|
||||
"wasmparser 0.82.0",
|
||||
"wasmtime-types",
|
||||
]
|
||||
|
||||
@@ -498,7 +499,7 @@ checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35"
|
||||
[[package]]
|
||||
name = "curlywas"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/exoticorn/curlywas.git?rev=89638565#896385654ab2c089200920b6dea4abec641c88d6"
|
||||
source = "git+https://github.com/exoticorn/curlywas.git?rev=557c3a84#557c3a842675a1ebd77e84021f9f5236d4fa5648"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"ariadne",
|
||||
@@ -810,21 +811,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "gimli"
|
||||
version = "0.25.0"
|
||||
version = "0.26.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7"
|
||||
checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4"
|
||||
dependencies = [
|
||||
"fallible-iterator",
|
||||
"indexmap",
|
||||
"stable_deref_trait",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gimli"
|
||||
version = "0.26.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4"
|
||||
|
||||
[[package]]
|
||||
name = "glob"
|
||||
version = "0.3.0"
|
||||
@@ -1035,6 +1030,12 @@ dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "io-lifetimes"
|
||||
version = "0.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ec58677acfea8a15352d42fc87d11d63596ade9239e0a7c9352914417515dbe6"
|
||||
|
||||
[[package]]
|
||||
name = "iovec"
|
||||
version = "0.1.4"
|
||||
@@ -1141,6 +1142,12 @@ dependencies = [
|
||||
"winapi 0.3.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.0.42"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5284f00d480e1c39af34e72f8ad60b94f47007e3481cd3b731c1d67190ddc7b7"
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.14"
|
||||
@@ -1456,9 +1463,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "object"
|
||||
version = "0.26.2"
|
||||
version = "0.27.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "39f37e50073ccad23b6d09bcb5b263f4e76d3bb6038e4a3c08e52162ffa8abc2"
|
||||
checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9"
|
||||
dependencies = [
|
||||
"crc32fast",
|
||||
"indexmap",
|
||||
@@ -1466,13 +1473,10 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "object"
|
||||
version = "0.27.1"
|
||||
name = "once_cell"
|
||||
version = "1.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5"
|
||||
|
||||
[[package]]
|
||||
name = "opaque-debug"
|
||||
@@ -1729,9 +1733,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regalloc"
|
||||
version = "0.0.31"
|
||||
version = "0.0.34"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "571f7f397d61c4755285cd37853fe8e03271c243424a907415909379659381c5"
|
||||
checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02"
|
||||
dependencies = [
|
||||
"log",
|
||||
"rustc-hash",
|
||||
@@ -1788,6 +1792,20 @@ version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "0.33.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a9466f25b92a648960ac1042fd3baa6b0bf285e60f754d7e5070770c813a177a"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"errno",
|
||||
"io-lifetimes",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
"winapi 0.3.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.9"
|
||||
@@ -2521,18 +2539,18 @@ version = "0.77.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b35c86d22e720a07d954ebbed772d01180501afe7d03d464f413bb5f8914a8d6"
|
||||
|
||||
[[package]]
|
||||
name = "wasmparser"
|
||||
version = "0.80.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "449167e2832691a1bff24cde28d2804e90e09586a448c8e76984792c44334a6b"
|
||||
|
||||
[[package]]
|
||||
name = "wasmparser"
|
||||
version = "0.81.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "98930446519f63d00a836efdc22f67766ceae8dbcc1571379f2bcabc6b2b9abc"
|
||||
|
||||
[[package]]
|
||||
name = "wasmparser"
|
||||
version = "0.82.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0559cc0f1779240d6f894933498877ea94f693d84f3ee39c9a9932c6c312bd70"
|
||||
|
||||
[[package]]
|
||||
name = "wasmparser"
|
||||
version = "0.83.0"
|
||||
@@ -2541,28 +2559,28 @@ checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a"
|
||||
|
||||
[[package]]
|
||||
name = "wasmtime"
|
||||
version = "0.30.0"
|
||||
version = "0.34.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "899b1e5261e3d3420860dacfb952871ace9d7ba9f953b314f67aaf9f8e2a4d89"
|
||||
checksum = "4882e78d9daceeaff656d82869f298fd472ea8d8ccf96fbd310da5c1687773ac"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
"backtrace",
|
||||
"bincode",
|
||||
"cfg-if 1.0.0",
|
||||
"cpp_demangle",
|
||||
"indexmap",
|
||||
"lazy_static",
|
||||
"libc",
|
||||
"log",
|
||||
"object 0.26.2",
|
||||
"object",
|
||||
"once_cell",
|
||||
"paste",
|
||||
"psm",
|
||||
"rayon",
|
||||
"region",
|
||||
"rustc-demangle",
|
||||
"serde",
|
||||
"target-lexicon",
|
||||
"wasmparser 0.80.2",
|
||||
"wasmparser 0.82.0",
|
||||
"wasmtime-cache",
|
||||
"wasmtime-cranelift",
|
||||
"wasmtime-environ",
|
||||
@@ -2575,18 +2593,17 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasmtime-cache"
|
||||
version = "0.30.0"
|
||||
version = "0.34.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2493b81d7a9935f7af15e06beec806f256bc974a90a843685f3d61f2fc97058"
|
||||
checksum = "cf5b9af2d970624455f9ea109acc60cc477afe097f86c190eb519a8b7d6646cd"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"base64",
|
||||
"bincode",
|
||||
"directories-next",
|
||||
"errno",
|
||||
"file-per-thread-logger",
|
||||
"libc",
|
||||
"log",
|
||||
"rustix",
|
||||
"serde",
|
||||
"sha2",
|
||||
"toml",
|
||||
@@ -2596,9 +2613,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasmtime-cranelift"
|
||||
version = "0.30.0"
|
||||
version = "0.34.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "99706bacdf5143f7f967d417f0437cce83a724cf4518cb1a3ff40e519d793021"
|
||||
checksum = "1ed6ff21d2dbfe568af483f0c508e049fc6a497c73635e2c50c9b1baf3a93ed8"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"cranelift-codegen",
|
||||
@@ -2606,67 +2623,67 @@ dependencies = [
|
||||
"cranelift-frontend",
|
||||
"cranelift-native",
|
||||
"cranelift-wasm",
|
||||
"gimli 0.25.0",
|
||||
"gimli",
|
||||
"log",
|
||||
"more-asserts",
|
||||
"object 0.26.2",
|
||||
"object",
|
||||
"target-lexicon",
|
||||
"thiserror",
|
||||
"wasmparser 0.80.2",
|
||||
"wasmparser 0.82.0",
|
||||
"wasmtime-environ",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasmtime-environ"
|
||||
version = "0.30.0"
|
||||
version = "0.34.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ac42cb562a2f98163857605f02581d719a410c5abe93606128c59a10e84de85b"
|
||||
checksum = "860936d38df423b4291b3e31bc28d4895e2208f9daba351c2397d18a0a10e0bf"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"cfg-if 1.0.0",
|
||||
"cranelift-entity",
|
||||
"gimli 0.25.0",
|
||||
"gimli",
|
||||
"indexmap",
|
||||
"log",
|
||||
"more-asserts",
|
||||
"object 0.26.2",
|
||||
"object",
|
||||
"serde",
|
||||
"target-lexicon",
|
||||
"thiserror",
|
||||
"wasmparser 0.80.2",
|
||||
"wasmparser 0.82.0",
|
||||
"wasmtime-types",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasmtime-fiber"
|
||||
version = "0.30.0"
|
||||
version = "0.34.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8779dd78755a248512233df4f6eaa6ba075c41bea2085fec750ed2926897bf95"
|
||||
checksum = "67e285306aa274d85a22753bef826226e1cc473bac0b541523f46dccf80751cc"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"libc",
|
||||
"rustix",
|
||||
"winapi 0.3.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasmtime-jit"
|
||||
version = "0.30.0"
|
||||
version = "0.34.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "24f46dd757225f29a419be415ea6fb8558df9b0194f07e3a6a9c99d0e14dd534"
|
||||
checksum = "e794310a0df5266c7ac73e8211a024a49e3860ac0ca2af5db8527be942ad063e"
|
||||
dependencies = [
|
||||
"addr2line 0.16.0",
|
||||
"addr2line",
|
||||
"anyhow",
|
||||
"bincode",
|
||||
"cfg-if 1.0.0",
|
||||
"gimli 0.25.0",
|
||||
"libc",
|
||||
"cpp_demangle",
|
||||
"gimli",
|
||||
"log",
|
||||
"more-asserts",
|
||||
"object 0.26.2",
|
||||
"object",
|
||||
"region",
|
||||
"rustc-demangle",
|
||||
"rustix",
|
||||
"serde",
|
||||
"target-lexicon",
|
||||
"thiserror",
|
||||
"wasmparser 0.80.2",
|
||||
"wasmtime-environ",
|
||||
"wasmtime-runtime",
|
||||
"winapi 0.3.9",
|
||||
@@ -2674,9 +2691,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasmtime-runtime"
|
||||
version = "0.30.0"
|
||||
version = "0.34.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0122215a44923f395487048cb0a1d60b5b32c73aab15cf9364b798dbaff0996f"
|
||||
checksum = "90ffe5cb3db705ea43fcf37475a79891a3ada754c1cbe333540879649de943d5"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"backtrace",
|
||||
@@ -2691,6 +2708,7 @@ dependencies = [
|
||||
"more-asserts",
|
||||
"rand",
|
||||
"region",
|
||||
"rustix",
|
||||
"thiserror",
|
||||
"wasmtime-environ",
|
||||
"wasmtime-fiber",
|
||||
@@ -2699,14 +2717,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasmtime-types"
|
||||
version = "0.30.0"
|
||||
version = "0.34.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f9b01caf8a204ef634ebac99700e77ba716d3ebbb68a1abbc2ceb6b16dbec9e4"
|
||||
checksum = "70a5b60d70c1927c5a403f7c751de179414b6b91da75b2312c3ae78196cf9dc3"
|
||||
dependencies = [
|
||||
"cranelift-entity",
|
||||
"serde",
|
||||
"thiserror",
|
||||
"wasmparser 0.80.2",
|
||||
"wasmparser 0.82.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2871,18 +2889,18 @@ checksum = "9fc79f4a1e39857fc00c3f662cbf2651c771f00e9c15fe2abc341806bd46bd71"
|
||||
|
||||
[[package]]
|
||||
name = "zstd"
|
||||
version = "0.9.2+zstd.1.5.1"
|
||||
version = "0.10.0+zstd.1.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2390ea1bf6c038c39674f22d95f0564725fc06034a47129179810b2fc58caa54"
|
||||
checksum = "3b1365becbe415f3f0fcd024e2f7b45bacfb5bdd055f0dc113571394114e7bdd"
|
||||
dependencies = [
|
||||
"zstd-safe",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zstd-safe"
|
||||
version = "4.1.3+zstd.1.5.1"
|
||||
version = "4.1.4+zstd.1.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e99d81b99fb3c2c2c794e3fe56c305c63d5173a16a46b5850b07c935ffc7db79"
|
||||
checksum = "2f7cd17c9af1a4d6c24beb1cc54b17e2ef7b593dc92f19e9d9acad8b182bbaee"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"zstd-sys",
|
||||
@@ -2890,9 +2908,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zstd-sys"
|
||||
version = "1.6.2+zstd.1.5.1"
|
||||
version = "1.6.3+zstd.1.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2daf2f248d9ea44454bfcb2516534e8b8ad2fc91bf818a1885495fc42bc8ac9f"
|
||||
checksum = "fc49afa5c8d634e75761feda8c592051e7eeb4683ba827211eb0d731d3402ea8"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"libc",
|
||||
|
||||
+2
-2
@@ -11,12 +11,12 @@ native = ["wasmtime"]
|
||||
browser = ["warp", "tokio", "tokio-stream", "webbrowser"]
|
||||
|
||||
[dependencies]
|
||||
wasmtime = { version = "0.30", optional = true }
|
||||
wasmtime = { version = "0.34", optional = true }
|
||||
anyhow = "1"
|
||||
minifb = { version = "0.20", default-features = false, features = ["x11"] }
|
||||
notify = "4"
|
||||
pico-args = "0.4"
|
||||
curlywas = { git = "https://github.com/exoticorn/curlywas.git", rev = "89638565" }
|
||||
curlywas = { git = "https://github.com/exoticorn/curlywas.git", rev = "557c3a84" }
|
||||
wat = "1"
|
||||
uw8-tool = { path = "uw8-tool" }
|
||||
same-file = "1"
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
// Steady On Tim, It's Only A Budget Game
|
||||
// by Gasman / Hooy-Program
|
||||
// ported to MicroW8 by exoticorn/icebird
|
||||
|
||||
include "../include/microw8-api.cwa"
|
||||
|
||||
fn melody(t: i32, T: i32) -> i32 {
|
||||
let inline riff_pos = abs(((T&31) - 16) as f32) as i32;
|
||||
let lazy shift = ((1-((T>>5)&3))%2-1) as f32 / 6 as f32;
|
||||
|
||||
let inline note_count = 5 - (T >= 512);
|
||||
let inline octave = (riff_pos/5) as f32;
|
||||
let inline riff_note = 5514 >> (riff_pos % note_count * 4) & 15;
|
||||
let inline melody_freq = pow(2 as f32, shift + octave - (riff_note as f32 / 12 as f32));
|
||||
let inline melody = (t as f32 * melody_freq) as i32 & 128;
|
||||
|
||||
let inline arp_note = ((0x85>>((t>>12)%3*4)) & 15) - 1;
|
||||
let inline arp_freq = pow(2 as f32, shift + (arp_note as f32 / 12 as f32));
|
||||
let inline arp_vol = (T >= 256) * (12-T%12);
|
||||
let inline arpeggio = ((t as f32 * arp_freq) as i32 & 128) * arp_vol / 12;
|
||||
|
||||
melody + arpeggio
|
||||
}
|
||||
|
||||
export fn snd(t: i32) -> f32 {
|
||||
let lazy T = t/10000;
|
||||
|
||||
let inline mel_arp = melody(t, T)/3 + melody(t, T-3)/5;
|
||||
|
||||
let inline bass_vol = (T >= 128) & (197 >> (T % 8));
|
||||
let inline bass_freq = pow(2 as f32, (((T & 4) * ((T & 7) - 1)) as f32 / 24 as f32 - 5 as f32));
|
||||
let inline bass = ((t as f32 * bass_freq) as i32 & 63) * bass_vol;
|
||||
|
||||
let inline snare_ish = (random() & 31) * (8 - (T + 4) % 8) / 8;
|
||||
|
||||
let inline sample = mel_arp + bass + snare_ish;
|
||||
sample as f32 / 255 as f32
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
import "env.memory" memory(4);
|
||||
|
||||
fn melody(ch: i32, t: i32, T: i32) {
|
||||
let lazy riff_pos = abs(((T&31) - 16) as f32) as i32;
|
||||
let lazy shift = ((1-((T>>5)&3))%2-1) * 2;
|
||||
|
||||
let inline note_count = 5 - (T >= 512);
|
||||
let inline octave = (riff_pos/5) * 12;
|
||||
let inline riff_note = 5514 >> (riff_pos % note_count * 4) & 15;
|
||||
let inline melody_note = shift + octave - riff_note;
|
||||
|
||||
ch?1 = riff_pos * 10 + 63;
|
||||
ch?3 = melody_note + 64;
|
||||
|
||||
let inline arp_note = shift + ((0x85>>((t/2)%3*4)) & 15) - 1;
|
||||
80?3 = arp_note + 64;
|
||||
}
|
||||
|
||||
export fn upd() {
|
||||
let lazy t = 32!32 / (1000/60);
|
||||
let lazy T = t / 7;
|
||||
melody(98, t, T - 3);
|
||||
melody(92, t, T);
|
||||
|
||||
80?0 = ((T >= 256) & (T/12+(T-3)/12)) * 2 | 0x4; // arp trigger
|
||||
|
||||
if T >= 128 {
|
||||
let inline bass_step = T % 8;
|
||||
86?3 = if bass_step / 2 == 2 {
|
||||
86?0 = 0xc2;
|
||||
90
|
||||
} else {
|
||||
86?0 = ((197 >> bass_step) & 1) | 0x48;
|
||||
((T & 4) * ((T & 7) - 1)) / 2 + 28
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
data 80 {
|
||||
i8(
|
||||
0, 80, 0, 128, 0, 0x90,
|
||||
0, 80, 0, 128, 0, 0x4c,
|
||||
5, 128, 0, 128, 0, 0x4c,
|
||||
5, 128, 0, 128, 0, 0x4c,
|
||||
0xf8, 0x85,
|
||||
0x81, 0x81, 0, 110, 0, 80
|
||||
)
|
||||
}
|
||||
|
||||
/*
|
||||
include "../../platform/src/ges.cwa"
|
||||
|
||||
import "env.pow" fn pow(f32, f32) -> f32;
|
||||
import "env.sin" fn sin(f32) -> f32;
|
||||
|
||||
export fn snd(t: i32) -> f32 {
|
||||
gesSnd(t)
|
||||
}
|
||||
*/
|
||||
Generated
+1
-1
@@ -146,7 +146,7 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
|
||||
[[package]]
|
||||
name = "curlywas"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/exoticorn/curlywas.git?rev=89638565#896385654ab2c089200920b6dea4abec641c88d6"
|
||||
source = "git+https://github.com/exoticorn/curlywas.git?rev=557c3a84#557c3a842675a1ebd77e84021f9f5236d4fa5648"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"ariadne",
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ edition = "2021"
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
curlywas = { git="https://github.com/exoticorn/curlywas.git", rev="89638565" }
|
||||
curlywas = { git="https://github.com/exoticorn/curlywas.git", rev="557c3a84" }
|
||||
uw8-tool = { path="../uw8-tool" }
|
||||
anyhow = "1"
|
||||
lodepng = "3.4"
|
||||
Binary file not shown.
@@ -0,0 +1,180 @@
|
||||
const GesChannelState.Trigger = 0;
|
||||
const GesChannelState.EnvState = 1;
|
||||
const GesChannelState.EnvVol = 2;
|
||||
const GesChannelState.Phase = 4;
|
||||
const GesChannelState.Size = 6;
|
||||
|
||||
const GesState.Filter = GesChannelState.Size * 4;
|
||||
const GesState.Size = GesState.Filter + 8*4;
|
||||
|
||||
const GesStateOffset = 112;
|
||||
const GesBufferOffset = 112 + GesState.Size;
|
||||
|
||||
export fn gesSnd(t: i32) -> f32 {
|
||||
if !(t & 127) {
|
||||
let i: i32;
|
||||
loop clearLoop {
|
||||
i!GesBufferOffset = 0;
|
||||
branch_if (i := i + 4) < 128*8: clearLoop;
|
||||
}
|
||||
|
||||
let ch: i32;
|
||||
loop channelLoop {
|
||||
let lazy channelState = GesStateOffset + ch * GesChannelState.Size;
|
||||
let lazy channelReg = 80 + ch * 6;
|
||||
let envState = channelState?GesChannelState.EnvState;
|
||||
let envVol = i32.load16_u(channelState, GesChannelState.EnvVol);
|
||||
|
||||
let lazy oldTrigger = channelState?GesChannelState.Trigger;
|
||||
let lazy ctrl = channelReg?0;
|
||||
if (oldTrigger ^ ctrl) & (ctrl | 2) & 3 {
|
||||
envState = 1;
|
||||
envVol = 0;
|
||||
}
|
||||
channelState?GesChannelState.Trigger = ctrl;
|
||||
|
||||
if envState {
|
||||
let lazy attack = channelReg?4 & 15;
|
||||
envVol = envVol + 12 * pow(1.5625, (15 - attack) as f32) as i32;
|
||||
if envVol >= 65535 | !attack {
|
||||
envVol = 65535;
|
||||
envState = 0;
|
||||
}
|
||||
} else {
|
||||
let inline decay = (channelReg - (ctrl & 1))?5 >> 4;
|
||||
let inline dec = 8 * pow(1.5625, (15 - decay) as f32) as i32;
|
||||
envVol = envVol - ((dec * (envVol + 8192)) >> 16);
|
||||
let inline sustain = (channelReg?5 & 15) << 12;
|
||||
let lazy targetVol = (ctrl & 1) * sustain;
|
||||
if envVol < targetVol {
|
||||
envVol = targetVol;
|
||||
}
|
||||
}
|
||||
channelState?GesChannelState.EnvState = envState;
|
||||
|
||||
i32.store16(envVol, channelState, GesChannelState.EnvVol);
|
||||
|
||||
let inline note = i32.load16_u(channelReg, 2);
|
||||
let inline freq = 440 as f32 * pow(2.0, (note - 69*256) as f32 / (12*256) as f32);
|
||||
let phaseInc = (freq * (65536.0 / 44100.0)) as i32;
|
||||
|
||||
let phase = i32.load16_u(channelState, GesChannelState.Phase) << 8;
|
||||
|
||||
let inline pulseWidth = channelReg?1;
|
||||
let phaseShift = (pulseWidth - 128) * 255;
|
||||
let invPhaseInc = 1 as f32 / phaseInc as f32;
|
||||
|
||||
i = 0;
|
||||
let wave = ctrl >> 6;
|
||||
if wave < 2 {
|
||||
if wave {
|
||||
let pulsePhase1 = pulseWidth << 23;
|
||||
let pulsePhase2 = (511 - pulseWidth) << 23;
|
||||
loop sawLoop {
|
||||
let p = (phase ^ 32768) << 16;
|
||||
let saw = (p >> 16) - polyBlep(phase, invPhaseInc, -32767);
|
||||
let saw2 = select(p #>= pulsePhase1 & p #< pulsePhase2, -saw, saw);
|
||||
let saw2 = saw2 -
|
||||
polyBlep((p - pulsePhase1) >> 16, invPhaseInc, -saw) -
|
||||
polyBlep((p - pulsePhase2) >> 16, invPhaseInc, saw);
|
||||
i!(GesBufferOffset + 128*4) = saw2;
|
||||
phase = phase + phaseInc;
|
||||
branch_if (i := i + 4) < 64*4: sawLoop;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
let pulsePhase = 32768 + pulseWidth * 128;
|
||||
loop rectLoop {
|
||||
i!(GesBufferOffset + 128*4) = select((phase & 65535) < pulsePhase, -32768, 32767) -
|
||||
polyBlep(phase, invPhaseInc, -32767) -
|
||||
polyBlep(phase - pulsePhase, invPhaseInc, 32767);
|
||||
phase = phase + phaseInc;
|
||||
branch_if (i := i + 4) < 64*4: rectLoop;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if wave == 2 {
|
||||
let scale = pulseWidth + 256;
|
||||
loop triLoop {
|
||||
let s = phase << 16;
|
||||
s = (s ^ (s >> 31));
|
||||
s = (s >> 8) * scale;
|
||||
s = (s ^ (s >> 31));
|
||||
i!(GesBufferOffset + 128*4) = (s >> 15) - 32768;
|
||||
phase = phase + phaseInc;
|
||||
branch_if (i := i + 4) < 64*4: triLoop;
|
||||
}
|
||||
} else {
|
||||
loop noiseLoop {
|
||||
let s = (phase >> 12) & 4095;
|
||||
let pulse = ((phase >> 8) & 255) >= pulseWidth;
|
||||
s = s * 0x6746ba73;
|
||||
s = s ^ (s >> 15) * pulse;
|
||||
i!(GesBufferOffset + 128*4) = (s * 0x83567a92 + (phase << 16)) >> 16;
|
||||
phase = phase + phaseInc;
|
||||
branch_if (i := i + 4) < 64*4: noiseLoop;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
i32.store16(phase >> 8, channelState, GesChannelState.Phase);
|
||||
|
||||
let channelVol = ((ch >> 1)?0x68 >> ((ch & 1) * 4)) & 15;
|
||||
envVol = envVol * channelVol / 15;
|
||||
|
||||
let leftVol = (0x4c6a >> (ch * 4)) & 15;
|
||||
let rightVol = 16 - leftVol;
|
||||
|
||||
let lazy filter = ((ctrl >> 2) & 3) - 1;
|
||||
|
||||
i = 0;
|
||||
if filter #> 1 {
|
||||
loop mixLoop {
|
||||
let sample = (i!(GesBufferOffset + 128*4) * envVol) >> 18;
|
||||
(i * 2)!GesBufferOffset = (i * 2)!GesBufferOffset + ((sample * leftVol) >> 4);
|
||||
(i * 2)!(GesBufferOffset + 4) = (i * 2)!(GesBufferOffset + 4) + ((sample * rightVol) >> 4);
|
||||
branch_if (i := i + 4) < 64*4: mixLoop;
|
||||
}
|
||||
} else {
|
||||
let ctrl = filter?0x6a;
|
||||
let note = i32.load16_u(filter * 2, 0x6c);
|
||||
let inline freq = 440 as f32 * pow(2.0, (note - 69*256) as f32 / (12*256) as f32);
|
||||
let F = (8192 as f32 * sin(min(0.25, freq / 44100 as f32) * 3.1415)) as i32;
|
||||
let Q = 8192 - (ctrl >> 4) * (7000/15);
|
||||
let Qlimit = (8192*4096/F - F/2) * 3 / 4;
|
||||
if Q > Qlimit {
|
||||
Q = Qlimit;
|
||||
}
|
||||
let low_out = ctrl & 1;
|
||||
let high_out = (ctrl >> 1) & 1;
|
||||
let band_out = (ctrl >> 2) & 1;
|
||||
let low = (ch * 8)!(GesStateOffset + GesState.Filter);
|
||||
let band = (ch * 8)!(GesStateOffset + GesState.Filter + 4);
|
||||
loop filterLoop {
|
||||
let in = (i!(GesBufferOffset + 128*4) * envVol) >> 18;
|
||||
|
||||
let high = in - low - ((band * Q) >> 12);
|
||||
band = band + ((F * high) >> 12);
|
||||
low = low + ((F * band) >> 12);
|
||||
|
||||
let sample = low * low_out + high * high_out + band * band_out;
|
||||
(i * 2)!GesBufferOffset = (i * 2)!GesBufferOffset + ((sample * leftVol) >> 4);
|
||||
(i * 2)!(GesBufferOffset + 4) = (i * 2)!(GesBufferOffset + 4) + ((sample * rightVol) >> 4);
|
||||
branch_if (i := i + 4) < 64*4: filterLoop;
|
||||
}
|
||||
(ch * 8)!(GesStateOffset + GesState.Filter) = low;
|
||||
(ch * 8)!(GesStateOffset + GesState.Filter + 4) = band;
|
||||
}
|
||||
|
||||
branch_if (ch := ch + 1) < 4: channelLoop;
|
||||
}
|
||||
}
|
||||
(((t & 127) * 4)!GesBufferOffset) as f32 / 32768 as f32
|
||||
}
|
||||
|
||||
fn polyBlep(transientPhase: i32, invPhaseInc: f32, magnitude: i32) -> i32 {
|
||||
let lazy t = ((transientPhase << 16) >> 16) as f32 * invPhaseInc;
|
||||
let lazy x = max(0 as f32, 1 as f32 - abs(t));
|
||||
(f32.copysign(x * x, t) * magnitude as f32) as i32
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import "env.memory" memory(1);
|
||||
import "env.sin" fn sin(f32) -> f32;
|
||||
import "env.pow" fn pow(f32, f32) -> f32;
|
||||
|
||||
include "ges.cwa"
|
||||
@@ -11,16 +11,16 @@ fn main() -> Result<()> {
|
||||
convert_font()?;
|
||||
|
||||
println!("Compiling loader module");
|
||||
let loader = curlywas::compile_file("src/loader.cwa", curlywas::Options::default())?;
|
||||
File::create("bin/loader.wasm")?.write_all(&loader.wasm)?;
|
||||
let loader = curlywas::compile_file("src/loader.cwa", curlywas::Options::default()).0?;
|
||||
File::create("bin/loader.wasm")?.write_all(&loader)?;
|
||||
|
||||
println!("Loader (including base module): {} bytes", loader.wasm.len());
|
||||
println!("Loader (including base module): {} bytes", loader.len());
|
||||
|
||||
println!("Compiling platform module");
|
||||
let platform = curlywas::compile_file("src/platform.cwa", curlywas::Options::default())?;
|
||||
let platform = curlywas::compile_file("src/platform.cwa", curlywas::Options::default()).0?;
|
||||
println!("Compressing platform module");
|
||||
let platform = uw8_tool::pack(
|
||||
&platform.wasm,
|
||||
&platform,
|
||||
&uw8_tool::PackConfig::default().with_compression_level(4),
|
||||
)?;
|
||||
File::create("bin/platform.uw8")?.write_all(&platform)?;
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import "env.memory" memory(4);
|
||||
|
||||
import "env.sin" fn sin(f32) -> f32;
|
||||
import "env.cos" fn cos(f32) -> f32;
|
||||
import "env.pow" fn pow(f32, f32) -> f32;
|
||||
|
||||
export fn time() -> f32 {
|
||||
(0!64) as f32 / 1000 as f32
|
||||
@@ -500,6 +502,12 @@ export fn setCursorPosition(x: i32, y: i32) {
|
||||
textCursorY = y * scale;
|
||||
}
|
||||
|
||||
///////////
|
||||
// SOUND //
|
||||
///////////
|
||||
|
||||
include "ges.cwa"
|
||||
|
||||
///////////
|
||||
// SETUP //
|
||||
///////////
|
||||
@@ -508,6 +516,13 @@ export fn endFrame() {
|
||||
68!4 = 68!0;
|
||||
}
|
||||
|
||||
fn memclr(base: i32, size: i32) {
|
||||
loop bytes {
|
||||
(base + (size := size - 1))?0 = 0;
|
||||
branch_if size: bytes;
|
||||
}
|
||||
}
|
||||
|
||||
start fn setup() {
|
||||
let i: i32 = 12*16*3-1;
|
||||
let avg: f32;
|
||||
@@ -540,10 +555,26 @@ start fn setup() {
|
||||
branch_if (i := i - 1) >= 0: expand_sweetie;
|
||||
}
|
||||
|
||||
memclr(0, 64);
|
||||
memclr(112, 8);
|
||||
memclr(0x14000, 0x2c000);
|
||||
|
||||
|
||||
cls(0);
|
||||
randomSeed(random());
|
||||
}
|
||||
|
||||
data 80 {
|
||||
i8(
|
||||
0, 128, 0, 69, 0x8, 0xc8,
|
||||
0, 128, 0, 69, 0x8, 0xc8,
|
||||
0, 128, 0, 69, 0x8, 0xc8,
|
||||
0, 128, 0, 69, 0x8, 0xc8,
|
||||
0xff, 0xff,
|
||||
1, 1, 0, 100, 0, 100
|
||||
)
|
||||
}
|
||||
|
||||
data 0x13000+192*4 {
|
||||
i32(
|
||||
0x2c1c1a,
|
||||
|
||||
+35
-1
@@ -18,7 +18,9 @@ The memory has to be imported as `env` `memory` and has a maximum size of 256kb
|
||||
00000-00040: user memory
|
||||
00040-00044: time since module start in ms
|
||||
00044-0004c: gamepad state
|
||||
0004c-00078: reserved
|
||||
0004c-00050: reserved
|
||||
00050-00070: sound registers
|
||||
00070-00078: reserved
|
||||
00078-12c78: frame buffer
|
||||
12c78-13000: reserved
|
||||
13000-13400: palette
|
||||
@@ -269,6 +271,38 @@ Sets the background color.
|
||||
|
||||
Sets the cursor position. In normal mode `x` and `y` are multiplied by 8 to get the pixel position, in graphics mode they are used as is.
|
||||
|
||||
## Sound
|
||||
|
||||
```
|
||||
Per channel:
|
||||
|
||||
00 : CTRL - wave form, ring, sync, filter send, trigger
|
||||
bit 0: note on flag
|
||||
bit 1: note trigger
|
||||
bit 2,3: filter 0,1 send
|
||||
bit 6,7: wave form (rect, saw, tri, noise)
|
||||
01 : PULS - pulse width
|
||||
02 : FINE - fine tuning
|
||||
03 : NOTE - note
|
||||
04 : ENVA - attack, decay
|
||||
05 : ENVR - sustain, release
|
||||
|
||||
50-56: channel 0
|
||||
56-5b: channel 1
|
||||
5c-61: channel 2
|
||||
62-67: channel 3
|
||||
|
||||
68: VO01 - volumes channel 0&1
|
||||
69: VO23 - volumes channel 2&3
|
||||
|
||||
6a : FCTR 0 - type, resonance
|
||||
6b : FCTR 1 - type, resonance
|
||||
6c : FFIN 0 - cutoff fine tuning
|
||||
6d : FNOT 0 - cutoff note
|
||||
6e : FFIN 1 - cutoff fine tuning
|
||||
6f : FNOT 1 - cutoff note
|
||||
```
|
||||
|
||||
# The `uw8` tool
|
||||
|
||||
The `uw8` tool included in the MicroW8 download includes a number of useful tools for developing MicroW8 carts. For small productions written in
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<section>
|
||||
<h1 class="text-center heading-text">A WebAssembly based fantasy console</h1>
|
||||
</section>
|
||||
<a href="v0.1.1">
|
||||
<a href="v0.1.2">
|
||||
<img class="demonstration-gif" style="width:640px;height:480px;image-rendering:pixelated" src="img/technotunnel.png"></img>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
+60
-46
@@ -101,19 +101,16 @@ fn run(mut args: Arguments) -> Result<()> {
|
||||
|
||||
while runtime.is_open() {
|
||||
if first_run || watcher.poll_changed_file()?.is_some() {
|
||||
match start_cart(&filename, &mut *runtime, &config) {
|
||||
Ok(dependencies) => {
|
||||
if watch_mode {
|
||||
for dep in dependencies {
|
||||
watcher.add_file(dep)?;
|
||||
}
|
||||
}
|
||||
let (result, dependencies) = start_cart(&filename, &mut *runtime, &config);
|
||||
if watch_mode {
|
||||
for dep in dependencies {
|
||||
watcher.add_file(dep)?;
|
||||
}
|
||||
Err(err) => {
|
||||
eprintln!("Load error: {}", err);
|
||||
if !watch_mode {
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
if let Err(err) = result {
|
||||
eprintln!("Load error: {}", err);
|
||||
if !watch_mode {
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
first_run = false;
|
||||
@@ -136,37 +133,45 @@ struct Config {
|
||||
output_path: Option<PathBuf>,
|
||||
}
|
||||
|
||||
fn load_cart(filename: &Path, config: &Config) -> Result<(Vec<u8>, Vec<PathBuf>)> {
|
||||
fn load_cart(filename: &Path, config: &Config) -> (Result<Vec<u8>>, Vec<PathBuf>) {
|
||||
let mut dependencies = Vec::new();
|
||||
let mut cart = match SourceType::of_file(filename)? {
|
||||
SourceType::Binary => {
|
||||
let mut cart = vec![];
|
||||
File::open(filename)?.read_to_end(&mut cart)?;
|
||||
dependencies.push(filename.to_path_buf());
|
||||
cart
|
||||
}
|
||||
SourceType::Wat => {
|
||||
let cart = wat::parse_file(filename)?;
|
||||
dependencies.push(filename.to_path_buf());
|
||||
cart
|
||||
}
|
||||
SourceType::CurlyWas => {
|
||||
let module = curlywas::compile_file(filename, curlywas::Options::default())?;
|
||||
dependencies = module.dependencies;
|
||||
module.wasm
|
||||
}
|
||||
};
|
||||
fn inner(filename: &Path, config: &Config, dependencies: &mut Vec<PathBuf>) -> Result<Vec<u8>> {
|
||||
let mut cart = match SourceType::of_file(filename)? {
|
||||
SourceType::Binary => {
|
||||
let mut cart = vec![];
|
||||
File::open(filename)?.read_to_end(&mut cart)?;
|
||||
cart
|
||||
}
|
||||
SourceType::Wat => {
|
||||
let cart = wat::parse_file(filename)?;
|
||||
cart
|
||||
}
|
||||
SourceType::CurlyWas => {
|
||||
let (module, deps) = curlywas::compile_file(filename, curlywas::Options::default());
|
||||
*dependencies = deps;
|
||||
module?
|
||||
}
|
||||
};
|
||||
|
||||
if let Some(ref pack_config) = config.pack {
|
||||
cart = uw8_tool::pack(&cart, pack_config)?;
|
||||
println!("packed size: {} bytes", cart.len());
|
||||
if let Some(ref pack_config) = config.pack {
|
||||
cart = uw8_tool::pack(&cart, pack_config)?;
|
||||
println!("packed size: {} bytes", cart.len());
|
||||
}
|
||||
|
||||
if let Some(ref path) = config.output_path {
|
||||
File::create(path)?.write_all(&cart)?;
|
||||
}
|
||||
|
||||
Ok(cart)
|
||||
}
|
||||
|
||||
if let Some(ref path) = config.output_path {
|
||||
File::create(path)?.write_all(&cart)?;
|
||||
let result = inner(filename, config, &mut dependencies);
|
||||
|
||||
if dependencies.is_empty() {
|
||||
dependencies.push(filename.to_path_buf());
|
||||
}
|
||||
|
||||
Ok((cart, dependencies))
|
||||
(result, dependencies)
|
||||
}
|
||||
|
||||
enum SourceType {
|
||||
@@ -205,14 +210,22 @@ impl SourceType {
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "native", feature = "browser"))]
|
||||
fn start_cart(filename: &Path, runtime: &mut dyn Runtime, config: &Config) -> Result<Vec<PathBuf>> {
|
||||
let cart = load_cart(filename, config)?;
|
||||
fn start_cart(
|
||||
filename: &Path,
|
||||
runtime: &mut dyn Runtime,
|
||||
config: &Config,
|
||||
) -> (Result<()>, Vec<PathBuf>) {
|
||||
let (cart, dependencies) = load_cart(filename, config);
|
||||
let cart = match cart {
|
||||
Ok(cart) => cart,
|
||||
Err(err) => return (Err(err), dependencies),
|
||||
};
|
||||
|
||||
if let Err(err) = runtime.load(&cart.0) {
|
||||
if let Err(err) = runtime.load(&cart) {
|
||||
eprintln!("Load error: {}", err);
|
||||
Err(err)
|
||||
(Err(err), dependencies)
|
||||
} else {
|
||||
Ok(cart.1)
|
||||
(Ok(()), dependencies)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -231,13 +244,14 @@ fn pack(mut args: Arguments) -> Result<()> {
|
||||
|
||||
let out_file = args.free_from_os_str::<PathBuf, bool>(|s| Ok(s.into()))?;
|
||||
|
||||
let (cart, _) = load_cart(
|
||||
let cart = load_cart(
|
||||
&in_file,
|
||||
&Config {
|
||||
pack: Some(pack_config),
|
||||
output_path: None,
|
||||
},
|
||||
)?;
|
||||
)
|
||||
.0?;
|
||||
|
||||
File::create(out_file)?.write_all(&cart)?;
|
||||
|
||||
@@ -260,8 +274,8 @@ fn compile(mut args: Arguments) -> Result<()> {
|
||||
let in_file = args.free_from_os_str::<PathBuf, bool>(|s| Ok(s.into()))?;
|
||||
let out_file = args.free_from_os_str::<PathBuf, bool>(|s| Ok(s.into()))?;
|
||||
|
||||
let module = curlywas::compile_file(in_file, options)?;
|
||||
File::create(out_file)?.write_all(&module.wasm)?;
|
||||
let module = curlywas::compile_file(in_file, options).0?;
|
||||
File::create(out_file)?.write_all(&module)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
<!doctype html><html><head><meta charset="utf8"><title>uw8-run</title><style>body,canvas,html{background-color:#202024;margin:0;padding:0}body,html{height:100%}body{display:grid;grid-template-rows:1fr}#screen{align-self:center;border:4px solid #303040;image-rendering:pixelated;justify-self:center}#message{background-color:rgba(0,0,0,.4);color:#c64;font:700 12pt sans-serif;padding:8px;position:absolute;width:calc(100% - 16px);z-index:2}@media (min-width:648px) and (min-height:488px){#screen{height:480px;width:640px}}@media (min-width:968px) and (min-height:728px){#screen{height:720px;width:960px}}</style></head><body> <canvas id="screen" width="320" height="240" tabindex="1"> </canvas> <div id="message"></div> </body><script type="module">function A(A){return A&&A.__esModule?A.default:A}let e=function(e,t={}){t.setMessage||(t.setMessage=(A,e)=>{e&&console.log("error: "+e)});let a,B,n,r,o=e.getContext("2d"),i=o.createImageData(320,240),s=t.devkitMode,F=A=>new Uint8Array(A),g=A=>new Uint32Array(A),l=0,Q=null==t.keyboardElement?e:t.keyboardElement;if(Q){let A=A=>{let a,o="keydown"==A.type;switch(A.code){case"ArrowUp":a=1;break;case"ArrowDown":a=2;break;case"ArrowLeft":a=4;break;case"ArrowRight":a=8;break;case"KeyZ":a=16;break;case"KeyX":a=32;break;case"KeyA":a=64;break;case"KeyS":a=128;break;case"KeyR":o&&c(B,!0);break;case"F9":o&&e.toBlob((A=>{f(A,".png")})),A.preventDefault();break;case"F10":o&&function(){if(n)return n.stop(),void(n=null);n=new MediaRecorder(e.captureStream(),{mimeType:"video/webm",videoBitsPerSecond:25e6});let A=[];n.ondataavailable=e=>{A.push(e.data)};let a=t.timerElement;a&&(a.hidden=!1,a.innerText="00:00");function B(){if(r){if(a){let A=Math.floor((Date.now()-r)/1e3);a.innerText=Math.floor(A/60).toString().padStart(2,"0")+":"+(A%60).toString().padStart(2,"0")}setTimeout(B,1e3)}}n.onstop=()=>{a&&(a.hidden=!0),f(new Blob(A,{type:"video/webm"}),".webm")},n.start(),r=Date.now(),setTimeout(B,1e3)}(),A.preventDefault()}o?l|=a:l&=~a};Q.onkeydown=A,Q.onkeyup=A}async function c(n,r){a&&(a(),a=null);let Q=n.byteLength;if(t.setMessage(Q),0==Q)return;B=n;let f=window.location.pathname;if(Q<=1024&&!r){let A="";for(let e of F(n))A+=String.fromCharCode(e);f+="#"+btoa(A),f!=window.location.pathname+window.location.hash&&history.pushState(null,null,f)}e.width=e.width;try{let e={initial:4};s||(e.maximum=4);let r,f=new WebAssembly.Memory({initial:4,maximum:s?16:4}),E=F(f.buffer),I={env:{memory:f}},d=A=>{if(r&&(!s||0!=F(A)[0])){E.set(F(A));let e=r.exports.load_uw8(A.byteLength);A=new ArrayBuffer(e),F(A).set(E.slice(0,e))}return A},M=async A=>(await WebAssembly.instantiate(A,I)).instance,C=async A=>M(d(await(await fetch(A)).arrayBuffer()));r=await C(A("data:application/wasm;base64,AGFzbQEAAAABFQRgAX8Bf2ACf38Bf2ADf39%2FAGAAAAIPAQNlbnYGbWVtb3J5AgAEAwkIAAABAgEAAAMGEAN%2FAUEAC38BQQALfwFBAAsHGQIIbG9hZF91dzgAAAp1bmNvbXByZXNzAAQIAQcKngUIxwEBB39BAC0AAEEBayIBQQBIBEAgAA8LQYDAByAAaiECIAFBAXEEQEEBQYHABxAEIQIFQYDAB0EAIAAQAwtBAEGAhA9BCBADQYiEDyEDQQghBEGBwAchBQNAIAUgAkggAyMATiAFLQAAIAMtAABMcnEEQCAEIAQgBRACIgZqIQQgAyMASCAFLQAAIAMtAABGcQRAIAMgAxABaiEDCyAFIAZqIQUMAQsgAyMASARAIAQgBCADEAIiB2ohBCADIAdqIQMMAQsLIAQLPAEEfyAAIQEDQCACIAFBAWoiAS0AACIEQf8AcSADdHIhAiADQQdqIQMgBEEHdQ0ACyABQQFqIABrIAJqCxIBAX8gACABIAEQASICEAMgAgskAANAIAJBAEoEQCAAIAJBAWsiAmogASACai0AADoAAAwBCwsLqQEBBn8gACQBQQAkAgNAIANBgAE6AICADyADQQFqIgNBgQNIDQALAkADQEEAEAYiBQRAIAQEf0EBBUGAAhAGCwRAQYECEAVBAWsiAkUNAwtBwQIQBSEGA0AgASABIAJrLQAAOgAAIAFBAWohASAGQQFrIgYNAAsFQQEhBwNAIAdBAXQgBxAGciIHQYACSA0ACyABIAc6AAAgAUEBaiEBCyAFIQQMAAsLIAELNAECfwNAIAAgAmoQBgRAIAEgACACakEgahAGIAJ0ciEBIAJBAWohAgwBCwsgAUEBIAJ0cgtxAQR%2FA0AjAkGAIEgEQCMCQQh0IwEtAAByJAIjAUEBaiQBDAELCyMCQf8BcSICIAAtAICADyIBIwJBCHUiA2xBgAIgAWsgA2wgAWsgAiABSCIEG2okAiAAIAFBByAEQYECbGogAWtBBHVqOgCAgA8gBAsMAEEAQYCEDxAEJAALC9gDAQBBAAvRAwF%2F%2F9fTKCTONmi84%2BnrbVSOH%2Fc6vSf%2BD4d9SJNBc3FX7QfUHxwdZoJ2gbrkOxXMlCFQohTpOfrqH2lON%2BKLJNVfU5Nu4GOO2WMojT29uFcnCJS3%2B1hbxaL%2Fh9lmLYb3zvWsMJ%2BjBoF3XH%2BX3PiQRGj3lSO6d6ROB1tLHAjBvc8KRcJC8ezAHO2KxgN0C60LhqDnEMNRGkiZIGd7vFakdzsTK52rXTWTEF%2BRtXf5UnppLVtDQaKioHW9qgBgNM8z076axgmmzZdgskOHHn3MVWuglavoCFh4dRFW5XmuZwoBT3HKAX%2F6xPFRb56MQoyggxfIPc7Po49uFG7BLqNaZm%2FVzLkVsqcnLbkOu67BrqPS6In7L9Zomf6E5PQp%2FK7DKV5%2FS%2Be15wnC3zqP1Bj6xLe3xzckXir7SHPZsep5NtRy%2FGpcseCHgPNHMos7xPQKdDO%2BAXqvMZuNdOwFZm6TmQ3vmMOdSSpn62axAi0QlRgoxhrA%2F42mIF6TkGbDAElqkMfF0EyKfip%2B2EPJtH7AksMALac%2BkjT9fyIQRGiD5HMZwCTKLxBLX3A07qdkKrXlR5i8pYOXZxAX4vyy9BKV8RfUfvEuqyNXXnBg4e%2BB%2FPnR%2Bg%3D%3D"));for(let A of["acos","asin","atan","atan2","cos","exp","log","sin","tan","pow"])I.env[A]=Math[A];for(let A=9;A<64;++A)I.env["reserved"+A]=()=>{};for(let A=0;A<16;++A)I.env["g_reserved"+A]=0;n=d(n);let u=await C(A("data:;base64,AnevpqDvapimRNPOGhqee07n%2Bv1yTm1n5XES6y7%2BqPUQFqw5livsDo%2Fkram7E1zzZg6qmLzXsUswfnD9AZjEuJOrUjm2TzbQ%2BWO1hv6bvL0OA5NIRBHdnLCD2DJC5a7Jh%2Bn20qczMOvGlUk700JPiog%2BRZrdnPfnjdZrltFOZBk1oyEomoNCnRBIG%2Bd2U%2BJ%2FfcPD%2FV5KVii8nTeMgUfwVbKV79ZcQGuE4VPTr0nA80eJso3NQUtKG8IWxj9LEus4f2c0dEpDNmDI9qq9a12KBBCrzzqR046Line truncated
|
||||
<!doctype html><html><head><meta charset="utf8"><title>uw8-run</title><style>body,canvas,html{background-color:#202024;margin:0;padding:0}body,html{height:100%}body{display:grid;grid-template-rows:1fr}#screen{align-self:center;border:4px solid #303040;image-rendering:pixelated;justify-self:center}#message{background-color:rgba(0,0,0,.4);color:#c64;font:700 12pt sans-serif;padding:8px;position:absolute;width:calc(100% - 16px);z-index:2}@media (min-width:648px) and (min-height:488px){#screen{height:480px;width:640px}}@media (min-width:968px) and (min-height:728px){#screen{height:720px;width:960px}}</style></head><body> <canvas id="screen" width="320" height="240" tabindex="1"> </canvas> <div id="message"></div> </body><script type="module">function e(e){return e&&e.__esModule?e.default:e}class t extends AudioWorkletNode{constructor(e){super(e,"apu",{outputChannelCount:[2]})}}let A=(...e)=>new Uint8Array(...e),a=(...e)=>new Uint32Array(...e);let B=function(B,n={}){n.setMessage||(n.setMessage=(e,t)=>{t&&console.log("error: "+t)});let o,s,r,i,F=B.getContext("2d"),l=F.createImageData(320,240),d=n.devkitMode,c=0,Q=null==n.keyboardElement?B:n.keyboardElement;if(Q){let e=e=>{let t,A="keydown"==e.type;switch(e.code){case"ArrowUp":t=1;break;case"ArrowDown":t=2;break;case"ArrowLeft":t=4;break;case"ArrowRight":t=8;break;case"KeyZ":t=16;break;case"KeyX":t=32;break;case"KeyA":t=64;break;case"KeyS":t=128;break;case"KeyR":A&&C(s,!0);break;case"F9":A&&B.toBlob((e=>{g(e,".png")})),e.preventDefault();break;case"F10":A&&function(){if(r)return r.stop(),void(r=null);r=new MediaRecorder(B.captureStream(),{mimeType:"video/webm",videoBitsPerSecond:25e6});let e=[];r.ondataavailable=t=>{e.push(t.data)};let t=n.timerElement;t&&(t.hidden=!1,t.innerText="00:00");function A(){if(i){if(t){let e=Math.floor((Date.now()-i)/1e3);t.innerText=Math.floor(e/60).toString().padStart(2,"0")+":"+(e%60).toString().padStart(2,"0")}setTimeout(A,1e3)}}r.onstop=()=>{t&&(t.hidden=!0),g(new Blob(e,{type:"video/webm"}),".webm")},r.start(),i=Date.now(),setTimeout(A,1e3)}(),e.preventDefault()}A?c|=t:c&=~t};Q.onkeydown=e,Q.onkeyup=e}async function C(r,i){o&&(o(),o=null);let Q=new AudioContext({sampleRate:44100}),g=!0;o=()=>{Q.close(),g=!1};let w=r.byteLength;if(n.setMessage(w),0==w)return;await Q.audioWorklet.addModule(e("data:application/javascript,let%20e%3D%28...e%29%3D%3Enew%20Uint8Array%28...e%29%3Bclass%20s%20extends%20AudioWorkletProcessor%7Bconstructor%28%29%7Bsuper%28%29%2Cthis.sampleIndex%3D0%2Cthis.port.onmessage%3Ds%3D%3E%7Bthis.memory%3Fe%28this.memory.buffer%2C80%2C32%29.set%28e%28s.data%29%29%3Athis.load%28s.data%5B0%5D%2Cs.data%5B1%5D%29%7D%7Dasync%20load%28e%2Cs%29%7Blet%20t%3Dnew%20WebAssembly.Memory%28%7Binitial%3A4%2Cmaximum%3A4%7D%29%2Ca%3D%7Benv%3A%7Bmemory%3At%7D%7D%3Bfor%28let%20e%20of%5B%22acos%22%2C%22asin%22%2C%22atan%22%2C%22atan2%22%2C%22cos%22%2C%22exp%22%2C%22log%22%2C%22sin%22%2C%22tan%22%2C%22pow%22%5D%29a.env%5Be%5D%3DMath%5Be%5D%3Bfor%28let%20e%3D9%3Be%3C64%3B%2B%2Be%29a.env%5B%22reserved%22%2Be%5D%3D%28%29%3D%3E%7B%7D%3Bfor%28let%20e%3D0%3Be%3C16%3B%2B%2Be%29a.env%5B%22g_reserved%22%2Be%5D%3D0%3Blet%20r%3Dasync%20e%3D%3E%28await%20WebAssembly.instantiate%28e%2Ca%29%29.instance%2Cn%3Dawait%20r%28e%29%3Bfor%28let%20e%20in%20n.exports%29a.env%5Be%5D%3Dn.exports%5Be%5D%3Blet%20o%3Dawait%20r%28s%29%3Bthis.memory%3Dt%2Cthis.snd%3Do.exports.snd%7C%7Cn.exports.gesSnd%2Cthis.port.postMessage%282%29%7Dprocess%28e%2Cs%2Ct%29%7Bif%28this.snd%29%7Blet%20e%3Ds%5B0%5D%2Ct%3Dthis.sampleIndex%2Ca%3De%5B0%5D.length%3Bfor%28let%20s%3D0%3Bs%3Ca%3B%2B%2Bs%29e%5B0%5D%5Bs%5D%3Dthis.snd%28t%2B%2B%29%2Ce%5B1%5D%5Bs%5D%3Dthis.snd%28t%2B%2B%29%3Bthis.sampleIndex%3D4294967295%26t%7Dreturn%210%7D%7DregisterProcessor%28%22apu%22%2Cs%29%3B"));let u,f=new t(Q),D=0,p=new Promise((e=>u=e)),E=e=>{D|=e,3==D&&u&&(u(!0),u=null)};f.port.onmessage=e=>E(e.data);let I=()=>{"suspended"==Q.state?(n.startButton&&(n.startButton.style="",B.style="display:none"),(n.startButton||B).onclick=()=>{Q.resume()}):(n.startButton&&(n.startButton.style="display:none",B.style=""),E(1))};Q.onstatechange=I,I(),s=r;let m=window.location.pathname;if(w<=1024&&!i){let e="";for(let t of A(r))e+=String.fromCharCode(t);m+="#"+btoa(e),m!=window.location.pathname+window.location.hash&&history.pushState(null,null,m)}B.width=B.width;try{let t={initial:4};d||(t.maximum=4);let B,o=new WebAssembly.Memory(t),i=A(o.buffer),u={env:{memory:o}},D=e=>{if(B&&(!d||0!=A(e)[0])){i.set(A(e));let t=B.exports.load_uw8(e.byteLength);e=new ArrayBuffer(t),A(e).set(i.slice(0,t))}return e},E=async e=>(await WebAssembly.instantiate(e,u)).instance,I=async e=>D(await(await fetch(e)).arrayBuffer());B=await E(await I(e("data:application/wasm;base64,AGFzbQEAAAABFQRgAX8Bf2ACf38Bf2ADf39%2FAGAAAAIPAQNlbnYGbWVtb3J5AgAEAwkIAAABAgEAAAMGEAN%2FAUEAC38BQQALfwFBAAsHGQIIbG9hZF91dzgAAAp1bmNvbXByZXNzAAQIAQcKngUIxwEBB39BAC0AAEEBayIBQQBIBEAgAA8LQYDAByAAaiECIAFBAXEEQEEBQYHABxAEIQIFQYDAB0EAIAAQAwtBAEGAhA9BCBADQYiEDyEDQQghBEGBwAchBQNAIAUgAkLine truncated
|
||||
@@ -0,0 +1,30 @@
|
||||
import "env.memory" memory(4);
|
||||
import "env.pow" fn pow(f32, f32) -> f32;
|
||||
import "env.sin" fn sin(f32) -> f32;
|
||||
import "env.cls" fn cls(i32);
|
||||
import "env.rectangle" fn rectangle(f32, f32, f32, f32, i32);
|
||||
|
||||
include "../platform/src/ges.cwa"
|
||||
|
||||
export fn snd(t: i32) -> f32 {
|
||||
gesSnd(t)
|
||||
}
|
||||
|
||||
export fn upd() {
|
||||
80?0 = 32!32 / 200 & 2 | 0x41;
|
||||
80?3 = (32!32 / 400)%7*12/7 + 40;
|
||||
let pulse = (32!32 * 256 / 2000) & 511;
|
||||
if pulse >= 256 {
|
||||
pulse = 511 - pulse;
|
||||
}
|
||||
80?1 = pulse;
|
||||
|
||||
cls(0);
|
||||
rectangle(0.0, 100.0, (pulse * 320 / 256) as f32, 16.0, 15);
|
||||
}
|
||||
|
||||
data 80 {
|
||||
i8(
|
||||
0x41, 0, 0, 80, 0x70, 0
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
include "../examples/include/microw8-api.cwa"
|
||||
|
||||
export fn upd() {
|
||||
80?0 = (32!32 >> 11 << 6) | 5;
|
||||
80?1 = (sin(time() * 6 as f32) * 95 as f32) as i32 + 128;
|
||||
plotGes();
|
||||
}
|
||||
|
||||
data 80 { i8 (
|
||||
1, 128, 0, 69, 0, 15,
|
||||
0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0,
|
||||
0xff, 0xff,
|
||||
0xc1, 0, 0, 110, 0, 0
|
||||
) }
|
||||
|
||||
//import "env.gesSnd" fn gesSnd(i32) -> f32;
|
||||
|
||||
include "../platform/src/ges.cwa"
|
||||
|
||||
export fn snd(t: i32) -> f32 {
|
||||
gesSnd(t)
|
||||
}
|
||||
|
||||
global mut samplePos: i32 = 0;
|
||||
|
||||
const SoundBuffer = 0x30000;
|
||||
|
||||
fn plotGes() {
|
||||
rectangle(0 as f32, 10 as f32, 320 as f32, 320 as f32, 0);
|
||||
let count = (time() * 44100 as f32) as i32 * 2 - samplePos;
|
||||
let i: i32;
|
||||
loop genLoop {
|
||||
(i*4)$SoundBuffer = gesSnd(samplePos + i);
|
||||
branch_if (i := i + 1) < count: genLoop;
|
||||
}
|
||||
samplePos = samplePos + count;
|
||||
|
||||
let ch: i32;
|
||||
loop channelLoop {
|
||||
let offset = 159;
|
||||
i = 0;
|
||||
|
||||
loop searchLoop {
|
||||
offset = offset + 1;
|
||||
branch_if (offset * 8 + ch - 8)$SoundBuffer < 0 as f32 | (offset * 8 + ch)$SoundBuffer >= 0 as f32 & offset + 160 < count: searchLoop;
|
||||
}
|
||||
|
||||
offset = ch + (offset - 160) * 8;
|
||||
i = 0;
|
||||
loop plotLoop {
|
||||
setPixel(i, floor((i * 8 + offset)$SoundBuffer * 127 as f32) as i32 + 60 + ch * (120/8), 15);
|
||||
branch_if (i := i + 1) < 320: plotLoop;
|
||||
}
|
||||
|
||||
branch_if (ch := ch + 8) < 16: channelLoop;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
#!/bin/bash
|
||||
rm -rf .parcel-cache && yarn parcel src/index.html
|
||||
@@ -0,0 +1,69 @@
|
||||
let U8 = (...a) => new Uint8Array(...a);
|
||||
class APU extends AudioWorkletProcessor {
|
||||
constructor() {
|
||||
super();
|
||||
this.sampleIndex = 0;
|
||||
this.port.onmessage = (ev) => {
|
||||
if(this.memory) {
|
||||
U8(this.memory.buffer, 80, 32).set(U8(ev.data));
|
||||
} else {
|
||||
this.load(ev.data[0], ev.data[1]);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
async load(platform_data, data) {
|
||||
let memory = new WebAssembly.Memory({ initial: 4, maximum: 4 });
|
||||
|
||||
let importObject = {
|
||||
env: {
|
||||
memory
|
||||
},
|
||||
};
|
||||
|
||||
for (let n of ['acos', 'asin', 'atan', 'atan2', 'cos', 'exp', 'log', 'sin', 'tan', 'pow']) {
|
||||
importObject.env[n] = Math[n];
|
||||
}
|
||||
|
||||
for (let i = 9; i < 64; ++i) {
|
||||
importObject.env['reserved' + i] = () => { };
|
||||
}
|
||||
|
||||
for (let i = 0; i < 16; ++i) {
|
||||
importObject.env['g_reserved' + i] = 0;
|
||||
}
|
||||
|
||||
let instantiate = async (data) => (await WebAssembly.instantiate(data, importObject)).instance;
|
||||
|
||||
let platform_instance = await instantiate(platform_data);
|
||||
|
||||
for (let name in platform_instance.exports) {
|
||||
importObject.env[name] = platform_instance.exports[name]
|
||||
}
|
||||
|
||||
let instance = await instantiate(data);
|
||||
|
||||
this.memory = memory;
|
||||
|
||||
this.snd = instance.exports.snd || platform_instance.exports.gesSnd;
|
||||
|
||||
this.port.postMessage(2);
|
||||
}
|
||||
|
||||
process(inputs, outputs, parameters) {
|
||||
if(this.snd) {
|
||||
let channels = outputs[0];
|
||||
let index = this.sampleIndex;
|
||||
let numSamples = channels[0].length;
|
||||
for(let i = 0; i < numSamples; ++i) {
|
||||
channels[0][i] = this.snd(index++);
|
||||
channels[1][i] = this.snd(index++);
|
||||
}
|
||||
this.sampleIndex = index & 0xffffffff;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
registerProcessor('apu', APU);
|
||||
+4
-3
@@ -13,10 +13,11 @@
|
||||
<a href="https://exoticorn.github.io/microw8">MicroW8</a> 0.1.2
|
||||
</div>
|
||||
<div id="centered">
|
||||
<canvas id="screen" width="320" height="240">
|
||||
<canvas class="screen" id="screen" width="320" height="240">
|
||||
</canvas>
|
||||
<div id="timer" hidden="true"></div>
|
||||
<div id="message"></div>
|
||||
<button class="screen" id="start" style="display:none">Click to start</button>
|
||||
<div id="timer" hidden="true"></div>
|
||||
<div id="message"></div>
|
||||
<button id="cartButton" style="visibility:hidden">Load cart...</button>
|
||||
</div>
|
||||
<div id="footer">
|
||||
|
||||
+4
-1
@@ -12,6 +12,7 @@ let uw8 = MicroW8(document.getElementById('screen'), {
|
||||
setMessage,
|
||||
keyboardElement: window,
|
||||
timerElement: document.getElementById("timer"),
|
||||
startButton: document.getElementById("start")
|
||||
});
|
||||
|
||||
function runModuleFromHash() {
|
||||
@@ -79,7 +80,9 @@ if(location.hash.length != 0) {
|
||||
url += 'cart.uw8';
|
||||
}
|
||||
try {
|
||||
await uw8.runModuleFromURL(url, true);
|
||||
if(!await uw8.runModuleFromURL(url, true)) {
|
||||
setupLoad();
|
||||
}
|
||||
} catch(e) {
|
||||
setupLoad();
|
||||
}
|
||||
|
||||
+73
-14
@@ -1,5 +1,15 @@
|
||||
import loaderUrl from "data-url:../../platform/bin/loader.wasm";
|
||||
import platformUrl from "data-url:../../platform/bin/platform.uw8";
|
||||
import audioWorkletUrl from "data-url:./audiolet.js";
|
||||
|
||||
class AudioNode extends AudioWorkletNode {
|
||||
constructor(context) {
|
||||
super(context, 'apu', {outputChannelCount: [2]});
|
||||
}
|
||||
}
|
||||
|
||||
let U8 = (...a) => new Uint8Array(...a);
|
||||
let U32 = (...a) => new Uint32Array(...a);
|
||||
|
||||
export default function MicroW8(screen, config = {}) {
|
||||
if(!config.setMessage) {
|
||||
@@ -18,9 +28,6 @@ export default function MicroW8(screen, config = {}) {
|
||||
|
||||
let currentData;
|
||||
|
||||
let U8 = (d) => new Uint8Array(d);
|
||||
let U32 = (d) => new Uint32Array(d);
|
||||
|
||||
let pad = 0;
|
||||
let keyboardElement = config.keyboardElement == undefined ? screen : config.keyboardElement;
|
||||
if(keyboardElement) {
|
||||
@@ -90,6 +97,13 @@ export default function MicroW8(screen, config = {}) {
|
||||
cancelFunction = null;
|
||||
}
|
||||
|
||||
let audioContext = new AudioContext({sampleRate: 44100});
|
||||
let keepRunning = true;
|
||||
cancelFunction = () => {
|
||||
audioContext.close();
|
||||
keepRunning = false;
|
||||
}
|
||||
|
||||
let cartridgeSize = data.byteLength;
|
||||
|
||||
config.setMessage(cartridgeSize);
|
||||
@@ -97,6 +111,40 @@ export default function MicroW8(screen, config = {}) {
|
||||
return;
|
||||
}
|
||||
|
||||
await audioContext.audioWorklet.addModule(audioWorkletUrl);
|
||||
let audioNode = new AudioNode(audioContext);
|
||||
|
||||
let audioReadyFlags = 0;
|
||||
let audioReadyResolve;
|
||||
let audioReadyPromise = new Promise(resolve => audioReadyResolve = resolve);
|
||||
let updateAudioReady = (f) => {
|
||||
audioReadyFlags |= f;
|
||||
if(audioReadyFlags == 3 && audioReadyResolve) {
|
||||
audioReadyResolve(true);
|
||||
audioReadyResolve = null;
|
||||
}
|
||||
};
|
||||
audioNode.port.onmessage = (e) => updateAudioReady(e.data);
|
||||
let audioStateChange = () => {
|
||||
if(audioContext.state == 'suspended') {
|
||||
if(config.startButton) {
|
||||
config.startButton.style = '';
|
||||
screen.style = 'display:none';
|
||||
}
|
||||
(config.startButton || screen).onclick = () => {
|
||||
audioContext.resume();
|
||||
};
|
||||
} else {
|
||||
if(config.startButton) {
|
||||
config.startButton.style = 'display:none';
|
||||
screen.style = '';
|
||||
}
|
||||
updateAudioReady(1);
|
||||
}
|
||||
};
|
||||
audioContext.onstatechange = audioStateChange;
|
||||
audioStateChange();
|
||||
|
||||
currentData = data;
|
||||
|
||||
let newURL = window.location.pathname;
|
||||
@@ -119,7 +167,7 @@ export default function MicroW8(screen, config = {}) {
|
||||
if(!devkitMode) {
|
||||
memSize.maximum = 4;
|
||||
}
|
||||
let memory = new WebAssembly.Memory({ initial: 4, maximum: devkitMode ? 16 : 4 });
|
||||
let memory = new WebAssembly.Memory(memSize);
|
||||
let memU8 = U8(memory.buffer);
|
||||
|
||||
let importObject = {
|
||||
@@ -142,9 +190,9 @@ export default function MicroW8(screen, config = {}) {
|
||||
|
||||
let instantiate = async (data) => (await WebAssembly.instantiate(data, importObject)).instance;
|
||||
|
||||
let loadModuleURL = async (url) => instantiate(loadModuleData(await (await fetch(url)).arrayBuffer()));
|
||||
let loadModuleURL = async (url) => loadModuleData(await (await fetch(url)).arrayBuffer());
|
||||
|
||||
loader = await loadModuleURL(loaderUrl);
|
||||
loader = await instantiate(await loadModuleURL(loaderUrl));
|
||||
|
||||
for (let n of ['acos', 'asin', 'atan', 'atan2', 'cos', 'exp', 'log', 'sin', 'tan', 'pow']) {
|
||||
importObject.env[n] = Math[n];
|
||||
@@ -160,7 +208,10 @@ export default function MicroW8(screen, config = {}) {
|
||||
|
||||
data = loadModuleData(data);
|
||||
|
||||
let platform_instance = await loadModuleURL(platformUrl);
|
||||
let platform_data = await loadModuleURL(platformUrl);
|
||||
audioNode.port.postMessage([platform_data, data]);
|
||||
|
||||
let platform_instance = await instantiate(platform_data);
|
||||
|
||||
for (let name in platform_instance.exports) {
|
||||
importObject.env[name] = platform_instance.exports[name]
|
||||
@@ -169,14 +220,15 @@ export default function MicroW8(screen, config = {}) {
|
||||
let instance = await instantiate(data);
|
||||
|
||||
let buffer = U32(imageData.data.buffer);
|
||||
|
||||
await audioReadyPromise;
|
||||
|
||||
let startTime = Date.now();
|
||||
|
||||
let keepRunning = true;
|
||||
cancelFunction = () => keepRunning = false;
|
||||
|
||||
const timePerFrame = 1000 / 60;
|
||||
let nextFrame = startTime;
|
||||
|
||||
audioNode.connect(audioContext.destination);
|
||||
|
||||
function mainloop() {
|
||||
if (!keepRunning) {
|
||||
@@ -216,10 +268,16 @@ export default function MicroW8(screen, config = {}) {
|
||||
let u32Mem = U32(memory.buffer);
|
||||
u32Mem[16] = now - startTime;
|
||||
u32Mem[17] = pad | gamepad;
|
||||
instance.exports.upd();
|
||||
if(instance.exports.upd) {
|
||||
instance.exports.upd();
|
||||
}
|
||||
platform_instance.exports.endFrame();
|
||||
|
||||
let soundRegisters = new ArrayBuffer(32);
|
||||
U8(soundRegisters).set(U8(memory.buffer, 80, 32));
|
||||
audioNode.port.postMessage(soundRegisters, [soundRegisters]);
|
||||
|
||||
let palette = U32(memory.buffer.slice(0x13000, 0x13000 + 1024));
|
||||
let palette = U32(memory.buffer, 0x13000, 1024);
|
||||
for (let i = 0; i < 320 * 240; ++i) {
|
||||
buffer[i] = palette[memU8[i + 120]] | 0xff000000;
|
||||
}
|
||||
@@ -305,10 +363,11 @@ export default function MicroW8(screen, config = {}) {
|
||||
async function runModuleFromURL(url, keepUrl) {
|
||||
let response = await fetch(url);
|
||||
let type = response.headers.get('Content-Type');
|
||||
if(type && type.includes('html')) {
|
||||
throw false;
|
||||
if((type && type.includes('html')) || response.status != 200) {
|
||||
return false;
|
||||
}
|
||||
runModule(await response.arrayBuffer(), keepUrl || devkitMode);
|
||||
return true;
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
+11
-4
@@ -37,7 +37,7 @@ a:hover {
|
||||
color: #405040;
|
||||
}
|
||||
|
||||
#screen {
|
||||
.screen {
|
||||
width: 320px;
|
||||
height: 240px;
|
||||
image-rendering: pixelated;
|
||||
@@ -45,9 +45,16 @@ a:hover {
|
||||
margin-bottom: 8px;
|
||||
border: 4px solid #303040;
|
||||
box-shadow: 5px 5px 20px black;
|
||||
}
|
||||
|
||||
#screen {
|
||||
cursor: none;
|
||||
}
|
||||
|
||||
#start {
|
||||
font-size: 150%;
|
||||
}
|
||||
|
||||
#timer::before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
@@ -84,21 +91,21 @@ button:active {
|
||||
}
|
||||
|
||||
@media (min-width: 680px) and (min-height: 620px) {
|
||||
#screen {
|
||||
.screen {
|
||||
width: 640px;
|
||||
height: 480px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1000px) and (min-height: 800px) {
|
||||
#screen {
|
||||
.screen {
|
||||
width: 960px;
|
||||
height: 720px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (width:640px) and (height:480px) {
|
||||
#screen {
|
||||
.screen {
|
||||
width: 640px;
|
||||
height: 480px;
|
||||
border: 0;
|
||||
|
||||
Reference in new issue
Block a user