mirror of
https://github.com/exoticorn/microw8.git
synced 2026-01-21 03:36:41 +01:00
Compare commits
4 Commits
88ee0e1bef
...
10ba7ed3bb
| Author | SHA1 | Date | |
|---|---|---|---|
| 10ba7ed3bb | |||
| acea5cb6e0 | |||
| d239775411 | |||
| 20365a0dd0 |
6
examples/c/build.sh
Executable file
6
examples/c/build.sh
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
clang -O2 -Wno-incompatible-library-redeclaration --no-standard-libraries -ffast-math -Xclang -target-feature -Xclang +nontrapping-fptoint -Wl,--no-entry -Wl,--export-all -Wl,--import-memory -Wl,--initial-memory=262144 -Wl,-zstack-size=90000 -o cart.wasm cart.c --target=wasm32 && \
|
||||||
|
uw8 filter-exports cart.wasm cart.wasm && \
|
||||||
|
wasm-opt -Oz --fast-math --strip-producers -o cart.wasm cart.wasm && \
|
||||||
|
uw8 pack -l 9 cart.wasm cart.uw8
|
||||||
27
examples/c/cart.c
Normal file
27
examples/c/cart.c
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#define IMPORT(MODULE, NAME) __attribute__((import_module(MODULE), import_name(NAME)))
|
||||||
|
|
||||||
|
IMPORT("env", "atan2") extern float atan2(float, float);
|
||||||
|
IMPORT("env", "time") extern float time();
|
||||||
|
|
||||||
|
float sqrt(float v) {
|
||||||
|
return __builtin_sqrt(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define FRAMEBUFFER ((unsigned char*)120)
|
||||||
|
|
||||||
|
void upd() {
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for( ;; ) {
|
||||||
|
float t = time() * 63.0f;
|
||||||
|
float x = (float)(i % 320 - 160);
|
||||||
|
float y = (float)(i / 320 - 120);
|
||||||
|
float d = 40000.0f / sqrt(x * x + y * y);
|
||||||
|
float u = atan2(x, y) * 512.0f / 3.141f;
|
||||||
|
unsigned char c = (unsigned char)((int)(d + t * 2.0f) ^ (int)(u + t)) >> 4;
|
||||||
|
FRAMEBUFFER[i] = c;
|
||||||
|
|
||||||
|
i += 1;
|
||||||
|
if(i >= 320*240) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
19
examples/curlywas/tunnel.cwa
Normal file
19
examples/curlywas/tunnel.cwa
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import "env.memory" memory(4);
|
||||||
|
|
||||||
|
import "env.atan2" fn atan2(f32, f32) -> f32;
|
||||||
|
import "env.time" fn time() -> f32;
|
||||||
|
|
||||||
|
export fn upd() {
|
||||||
|
let i: i32;
|
||||||
|
loop pixels {
|
||||||
|
let inline t = time() * 63 as f32;
|
||||||
|
let lazy x = (i % 320 - 160) as f32;
|
||||||
|
let lazy y = (i / 320 - 120) as f32;
|
||||||
|
let inline d = 40000 as f32 / sqrt(x * x + y * y);
|
||||||
|
let inline u = atan2(x, y) * (512.0 / 3.141);
|
||||||
|
let inline c = ((i32.trunc_sat_f32_s(d + t * 2 as f32) ^ i32.trunc_sat_f32_s(u + t)) & 255) >> 4;
|
||||||
|
i?120 = c;
|
||||||
|
|
||||||
|
branch_if (i := i + 1) < 320*240: pixels;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
rustc --target=wasm32-unknown-unknown --crate-type cdylib -C opt-level="z" -C "link-args=--import-memory --initial-memory=262144 -zstack-size=90000" -o tunnel.wasm tunnel.rs && \
|
rustc --target=wasm32-unknown-unknown -C target-feature=+nontrapping-fptoint --crate-type cdylib -C opt-level="z" -C "link-args=--import-memory --initial-memory=262144 -zstack-size=90000" -o tunnel.wasm tunnel.rs && \
|
||||||
uw8 filter-exports tunnel.wasm tunnel.wasm && \
|
uw8 filter-exports tunnel.wasm tunnel.wasm && \
|
||||||
wasm-opt -Oz --strip-producers -o tunnel.wasm tunnel.wasm && \
|
wasm-opt -Oz --strip-producers -o tunnel.wasm tunnel.wasm && \
|
||||||
uw8 pack -l 9 tunnel.wasm tunnel.uw8
|
uw8 pack -l 9 tunnel.wasm tunnel.uw8
|
||||||
|
|||||||
@@ -27,15 +27,6 @@ fn sqrt(v: f32) -> f32 {
|
|||||||
unsafe { core::intrinsics::sqrtf32(v) }
|
unsafe { core::intrinsics::sqrtf32(v) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ftoi(v: f32) -> i32 {
|
|
||||||
// The compiler is allowed to do bad things to our code if this
|
|
||||||
// ever results in a value that doesn't fit in an i32.
|
|
||||||
// (the joy of undefined behavior)
|
|
||||||
// But that would trap in wasm anyway, so we don't really
|
|
||||||
// care.
|
|
||||||
unsafe { v.to_int_unchecked() }
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub fn upd() {
|
pub fn upd() {
|
||||||
let mut i: i32 = 0;
|
let mut i: i32 = 0;
|
||||||
@@ -43,9 +34,9 @@ pub fn upd() {
|
|||||||
let t = time() * 63.;
|
let t = time() * 63.;
|
||||||
let x = (i % 320 - 160) as f32;
|
let x = (i % 320 - 160) as f32;
|
||||||
let y = (i / 320 - 120) as f32;
|
let y = (i / 320 - 120) as f32;
|
||||||
let d = 40000 as f32 / sqrt(x * x + y * y + 1.);
|
let d = 40000 as f32 / sqrt(x * x + y * y);
|
||||||
let u = atan2(x, y) * 512. / 3.141;
|
let u = atan2(x, y) * 512. / 3.141;
|
||||||
let c = (ftoi(d + t * 2.) ^ ftoi(u + t)) as u8 >> 4;
|
let c = ((d + t * 2.) as i32 ^ (u + t) as i32) as u8 >> 4;
|
||||||
unsafe {
|
unsafe {
|
||||||
*((120 + i) as *mut u8) = c;
|
*((120 + i) as *mut u8) = c;
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@@ -5,7 +5,11 @@ pub fn build(b: *std.build.Builder) void {
|
|||||||
|
|
||||||
const lib = b.addSharedLibrary("cart", "main.zig", .unversioned);
|
const lib = b.addSharedLibrary("cart", "main.zig", .unversioned);
|
||||||
lib.setBuildMode(mode);
|
lib.setBuildMode(mode);
|
||||||
lib.setTarget(.{ .cpu_arch = .wasm32, .os_tag = .freestanding });
|
lib.setTarget(.{
|
||||||
|
.cpu_arch = .wasm32,
|
||||||
|
.os_tag = .freestanding,
|
||||||
|
.cpu_features_add = std.Target.wasm.featureSet(&.{ .nontrapping_fptoint })
|
||||||
|
});
|
||||||
lib.import_memory = true;
|
lib.import_memory = true;
|
||||||
lib.initial_memory = 262144;
|
lib.initial_memory = 262144;
|
||||||
lib.max_memory = 262144;
|
lib.max_memory = 262144;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ export fn upd() void {
|
|||||||
var t = time() * 63.0;
|
var t = time() * 63.0;
|
||||||
var x = @intToFloat(f32, (@intCast(i32, i % 320) - 160));
|
var x = @intToFloat(f32, (@intCast(i32, i % 320) - 160));
|
||||||
var y = @intToFloat(f32, (@intCast(i32, i / 320) - 120));
|
var y = @intToFloat(f32, (@intCast(i32, i / 320) - 120));
|
||||||
var d = 40000.0 / @sqrt(x * x + y * y + 1.0);
|
var d = 40000.0 / @sqrt(x * x + y * y);
|
||||||
var u = atan2(x, y) * 512.0 / 3.141;
|
var u = atan2(x, y) * 512.0 / 3.141;
|
||||||
var c = @intCast(u8, (@floatToInt(i32, d + t * 2.0) ^ @floatToInt(i32, u + t)) & 255) >> 4;
|
var c = @intCast(u8, (@floatToInt(i32, d + t * 2.0) ^ @floatToInt(i32, u + t)) & 255) >> 4;
|
||||||
|
|
||||||
|
|||||||
21
uw8-tool/src/filter_exports.rs
Normal file
21
uw8-tool/src/filter_exports.rs
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
use std::path::Path;
|
||||||
|
use anyhow::Result;
|
||||||
|
|
||||||
|
pub fn filter_exports(in_path: &Path, out_path: &Path) -> Result<()> {
|
||||||
|
let mut module = walrus::Module::from_file(in_path)?;
|
||||||
|
|
||||||
|
let exports_to_delete: Vec<_> = module.exports.iter().filter_map(|export| match export.name.as_str() {
|
||||||
|
"upd" => None,
|
||||||
|
_ => Some(export.id())
|
||||||
|
}).collect();
|
||||||
|
|
||||||
|
for id in exports_to_delete {
|
||||||
|
module.exports.delete(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
walrus::passes::gc::run(&mut module);
|
||||||
|
|
||||||
|
module.emit_wasm_file(out_path)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user