From 667a2223313d9bf7076b4652729e37c5c967248d Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Sat, 27 Nov 2021 21:02:42 +0100 Subject: [PATCH] tic(i32) => upd(), time(), first version of palette --- platform/bin/loader.wasm | Bin 1192 -> 1201 bytes platform/bin/platform.uw8 | Bin 520 -> 774 bytes platform/src/platform.cwa | 67 +++++++++++++++++++++++++++++++++--- src/lib.rs | 19 +++++----- uw8-tool/src/base_module.rs | 7 ++-- uw8-tool/src/pack.rs | 4 --- web/src/main.js | 3 +- 7 files changed, 79 insertions(+), 21 deletions(-) diff --git a/platform/bin/loader.wasm b/platform/bin/loader.wasm index 4e6ed69959b701eadbec0342b8a73e4694be988e..2964a9a4c47bb3d949700527d0226f2f043ceb51 100644 GIT binary patch delta 389 zcmV;00eb$Z39$*VHUoe80s#O)01NU02Rr&jA8)!d6b4AW>Z!#n(~xQjVEiSt&2}AC zK83-U$&JBB-~LcgmWW%J`YP0sK)b|NAKlwJ4cOYBknXr)YDh;g4obAi$^pjJ$v@0? zXN7GR=mlvtN)Xbpqz;~Mzd9+Rm+GUFs7Nz&HaHmll6}WgVEBJ?8!U`Qp;6A*o^2BL z9*Kkf*ehY6L*3<(WZgjj@TKR>psub+QEXIQf+=7PAn^zNM+T3aoPp=stO}jCdE%VX zHj%Op=$^5XbEz9Cz}nIha+3cuX|mICHF!G7x>CH%Eu^K~-H0e|+afJd4P{MVA8WeW zIiFz_9bLQm+Sh%(S*u*h&mPuZX&D`tM%~O)Ol)l_RA?4Q2bp(I28~N(Ne(BbfJLX6 zxo+OxC+!?GK3<&N8lyZBqN@@lA0?qQsuS=n^#MkiUnW)35EXqTfW2jjK<7{6-gRe0 jJW^=aj+~tTB|wdiTN4_Ex$w64jEusPhjxp`Z4B2IVynvYHH>etlPr&=?4y2=VD?7d>3$hN^DQLRP zW8cjwpr7$r@DxAn8Gi=4AV4ZcQ+{Y7_|0ZdEh!jg%PXsy189HC6TgQ`lqe>GQCAwp zi_&KKm}7!CRiG$su&{PnmPEXXhzeG=8yEOP3~(f(F`%QSb8kx+qGppm;9fEGui5e= z=8{?u9F0XV!&8tYOtl*w2rWXE^0g#00;!37;Vn#ZPGXu-0KK-_`e-WluajGq;z#EV zf}QA`N@pNtSL$@}_=XZ=%iv<|ahhY&c#oQ&vfPvzZ0$pGHy3Q~sz;WE3BaDuhjO!h zC|R2!qdnKFcx+TGx(oW|KU;{!QPv1Ok}P%IA;L@rc>)g0AqHiL_%qRyM>8;UZX?|V a=CEOiaW46DpqmqT{vH?MX0>PSib;Un6tU+3 diff --git a/platform/bin/platform.uw8 b/platform/bin/platform.uw8 index cd42c5e8857549635396ccd8ae032a97ac3ef1f8..ec6bef69c2505688bb4a35817d6b4eaf8df70b83 100644 GIT binary patch literal 774 zcmV+h1Nr;{4F7uD@G0pt*Nur{>tlp%3nXXd4vyJ}bG1)O$Ym3qDItCtOGq%+I+54ymH7-$Jp>PiICo5s zHLms>ka*alvfE_Ar%`jJeWgsv5DQg zoSxKwMHb1v?0+`IM35(wdd&<-XzXm5GP`HB0?q6_Yw>+Un$8#GGAEgh=8;Q_8NE+z zvIa$Y9&?H#wzvWqO6%xvd~NW&M9b`7IUPB04wJA-eiC*E{sJ_PV%FfNn0P*;SJz=> z#B3>hDRa}03)^r`j(%Gtm0aDYnRd}IgmC@;YBPSG04E$lfc^TgvQEZe6_tT#x~YZC z-h#3j^>{O8{wmE4)iIeq$}XJ_t`KJiV%KqW2UT^R5l~&?tX$KOC$S94f}F4{KS%&D z<;kP1L_I&j?fhK2oK(hvW6y`^;x)lt2Q1?o#r@5>)%8dl(z(3M5cZe-+-AV4fyz>2 z?mkGez@x}Umoxv&D}ep%xCM4BD0|(e3S+T18BU&r4i5ah-A-f42#DZ%-XU$RDe-yVMMrm<%Ul0Ro)U+6@*$ zxV-IT0eWCx;=8J-W zZ?1|buM0;t*3NRqOfj?{LN4VAM>yrsTx;g@-k;j{?j9f7@_G{e@UUW&ys#=#?_FR` z^D%GEj@-veoh++AMK;7+XsD&A-gG E0Le3gegFUf literal 520 zcmV+j0{8s_3jBZlKNI!Fm~HoLQHDy__os-cJ5rF1U??Me$qV1zzdy5bVPD$SoB*w@ zspE*%NymH$#W8S`(^&`7R0d%&OcrOzl4M@rvb(4=Pp1?gKB*Y@u)yD8RY`t!xO1ZCLcD3|YnC~ZrE6e`F8tn^dUZc&Tz^>46PUJ*B5=hBsQt83FKl&r zEq>tN!-bdqh)6IyS@{mtJUffDFEcFA>$;k?!PSF=p?oQjE0kNp9c*RDe6dWU0o}8z zl`~QF#*E?vQ1jjPzo~#vLA@)HUB)v$}@>hya_7ky)3%tS*Bu9LeY! z7GrO5^x5CDLlrQEn5!0<-u%k>zCBkCYy=y2rxSU%<{h}p`a3Z5F*-?LNQL7|xsqs9OHAlD6rhVEM*4QpfG)8WAs?TY-HCR0AjhNc)ZpzC>W3 z@2uFo!!;~x7V_?W4sGR2o5LIOm1R4wbRpXhul=HIxMi{Ew_x&CS8iivK_StX-JbIS zw4n#?*6~v_LQlAP;8TWk496-@D<`O5%RBglg6a1vTX(vWptw z1-78p(7O$a+}{gN@;->efD9ua{H71_V>?gQ+X7~35D;y7a*ak3$OS42hc#yMKw!x5 KxPT<2pr*$89R`X3 diff --git a/platform/src/platform.cwa b/platform/src/platform.cwa index 9317ee4..b63fd88 100644 --- a/platform/src/platform.cwa +++ b/platform/src/platform.cwa @@ -1,5 +1,15 @@ import "env.memory" memory(4); +import "env.cos" fn cos(f32) -> f32; + +export fn time() -> i32 { + 0!64 +} + +export fn ftime() -> f32 { + (0!64) as f32 / 1000 as f32 +} + global mut randomState: i64 = 37i64; export fn random() -> i32 { @@ -108,11 +118,58 @@ export fn circle(cx: f32, cy: f32, radius: f32, col: i32) { } start fn setup() { - let i: i32; - loop colors { - (i*4)!(120+320*240) = i * 0x10101; - branch_if (i := i + 1) < 256: colors + let i: i32 = 12*16*3-1; + let avg: f32; + loop gradients { + let lazy scale = (i % 48) as f32 / 48 as f32; + let inline angle = i as f32 * (3.1416 / 1.5 - 3.1416 / (11.0 * 16.0 * 1.5)); + let lazy c = 0.4 - cos(angle); + let inline ulimit = avg + 0.8; + let inline llimit = avg - 0.8; + let lazy a = max(llimit, min(ulimit, c)) * (scale + 0.05); + let lazy b = scale * scale * 0.8; + let inline v = (select(i < 11*16*3, max(0 as f32, min(a + b - a * b, 1 as f32)), scale) * 255 as f32) as i32; + (i%3 + i/3*4)?(120+320*240) = v; + avg = (avg + c) * 0.5; + + branch_if i := i - 1: gradients; } + + i = 255; + loop expand_sweetie { + let lazy channel = i & 3; + let lazy index = i >> 2; + let lazy first_step = index >= 32; + let inline src1 = select(first_step, index % 32 / 2, index * 2); + let inline src2 = select(first_step, (index + 1) % 32 / 2, index * 2 + 1); + let inline c1 = (src1 * 4 + channel)?(120+320*240+192*4); + let inline c2 = (src2 * 4 + channel)?(120+320*240+192*4); + i?(120+320*240+192*4) = (c1 + c2) * (3 + first_step) / 8; + + branch_if (i := i - 1) >= 0: expand_sweetie; + } + cls(0); randomSeed(random()); -} \ No newline at end of file +} + +data 120+320*240+192*4 { + i32( + 0x2c1c1a, + 0x5d275d, + 0x533eb1, + 0x577def, + 0x75cdff, + 0x70f0a7, + 0x64b738, + 0x797125, + 0x6f3629, + 0xc95d3b, + 0xf6a641, + 0xf7ef73, + 0xf4f4f4, + 0xc2b094, + 0x866c56, + 0x573c33 + ) +} diff --git a/src/lib.rs b/src/lib.rs index 46352db..8e158ef 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,7 +19,7 @@ pub struct MicroW8 { struct UW8Instance { store: Store<()>, memory: Memory, - tic: TypedFunc, + upd: TypedFunc<(), ()>, start_time: Instant, } @@ -76,8 +76,10 @@ impl MicroW8 { let platform_data = include_bytes!("../platform/bin/platform.uw8"); memory.data_mut(&mut store)[..platform_data.len()].copy_from_slice(platform_data); - let platform_length = load_uw8.call(&mut store, platform_data.len() as i32)? as u32 as usize; - let platform_module = wasmtime::Module::new(&self.engine, &memory.data(&store)[..platform_length])?; + let platform_length = + load_uw8.call(&mut store, platform_data.len() as i32)? as u32 as usize; + let platform_module = + wasmtime::Module::new(&self.engine, &memory.data(&store)[..platform_length])?; memory.data_mut(&mut store)[..module.len()].copy_from_slice(module); let module_length = load_uw8.call(&mut store, module.len() as i32)? as u32 as usize; @@ -121,12 +123,12 @@ impl MicroW8 { } let instance = linker.instantiate(&mut store, &module)?; - let tic = instance.get_typed_func::(&mut store, "tic")?; + let upd = instance.get_typed_func::<(), (), _>(&mut store, "upd")?; self.instance = Some(UW8Instance { store, memory, - tic, + upd, start_time: Instant::now(), }); @@ -135,10 +137,9 @@ impl MicroW8 { pub fn run_frame(&mut self) -> Result<()> { if let Some(mut instance) = self.instance.take() { - instance.tic.call( - &mut instance.store, - instance.start_time.elapsed().as_millis() as i32, - )?; + instance.memory.data_mut(&mut instance.store)[64..68] + .copy_from_slice(&(instance.start_time.elapsed().as_millis() as i32).to_le_bytes()); + instance.upd.call(&mut instance.store, ())?; let framebuffer = &instance.memory.data(&instance.store)[120..]; let palette = &framebuffer[320 * 240..]; diff --git a/uw8-tool/src/base_module.rs b/uw8-tool/src/base_module.rs index 2c01acf..2a5107e 100644 --- a/uw8-tool/src/base_module.rs +++ b/uw8-tool/src/base_module.rs @@ -77,6 +77,9 @@ impl BaseModule { add_function(&mut functions, &type_map, "rectangle", &[F32, F32, F32, F32, I32], None); add_function(&mut functions, &type_map, "circle", &[F32, F32, F32, I32], None); + add_function(&mut functions, &type_map, "time", &[], Some(I32)); + add_function(&mut functions, &type_map, "ftime", &[], Some(F32)); + for i in functions.len()..64 { add_function( &mut functions, @@ -105,8 +108,8 @@ impl BaseModule { types, function_imports: functions, global_imports, - functions: vec![lookup_type(&type_map, &[I32], None)], - exports: vec![("tic", first_function)], + functions: vec![lookup_type(&type_map, &[], None)], + exports: vec![("upd", first_function)], memory: 4, }) } diff --git a/uw8-tool/src/pack.rs b/uw8-tool/src/pack.rs index cb7bc48..ba8add2 100644 --- a/uw8-tool/src/pack.rs +++ b/uw8-tool/src/pack.rs @@ -570,10 +570,6 @@ impl ImportSection { } } - if memory == 0 { - bail!("No memory import found"); - } - Ok(ImportSection { memory, functions, diff --git a/web/src/main.js b/web/src/main.js index de57d20..e31d85b 100644 --- a/web/src/main.js +++ b/web/src/main.js @@ -107,7 +107,8 @@ async function runModule(data) { } try { - instance.exports.tic(Date.now() - startTime); + new Uint32Array(memory.buffer)[16] = Date.now() - startTime; + instance.exports.upd(); let palette = new Uint32Array(memory.buffer.slice(76920, 76920 + 1024)); for (let i = 0; i < 320 * 240; ++i) {