From 1cc480cd48cb98fa3fc0190b4b107ec09ce7195e Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Wed, 1 Dec 2021 09:08:21 +0100 Subject: [PATCH] add first iteration font and print functions --- examples/curlywas/skipahead.cwa | 5 +- platform/Cargo.lock | 108 +++++++++++++++++++++++++++++++- platform/Cargo.toml | 3 +- platform/bin/loader.wasm | Bin 1222 -> 1243 bytes platform/bin/platform.uw8 | Bin 833 -> 1406 bytes platform/src/font.png | Bin 0 -> 1620 bytes platform/src/font.pxo | Bin 0 -> 2294 bytes platform/src/main.rs | 28 +++++++++ platform/src/platform.cwa | 88 ++++++++++++++++++++++++-- src/lib.rs | 5 +- uw8-tool/src/base_module.rs | 4 ++ web/src/main.js | 2 +- 12 files changed, 232 insertions(+), 11 deletions(-) create mode 100644 platform/src/font.png create mode 100644 platform/src/font.pxo diff --git a/examples/curlywas/skipahead.cwa b/examples/curlywas/skipahead.cwa index f353635..1062a78 100644 --- a/examples/curlywas/skipahead.cwa +++ b/examples/curlywas/skipahead.cwa @@ -6,6 +6,7 @@ import "env.isButtonPressed" fn btn(i32) -> i32; import "env.random" fn random() -> i32; import "env.randomSeed" fn randomSeed(i32); import "env.cls" fn cls(i32); +import "env.printInt" fn printInt(i32); global mut pz: i32 = 4; global mut px: f32 = 2.0; @@ -21,6 +22,8 @@ export fn upd() { s = s + 0.1 - (f + control_speed) * btn(4 <| cls(4)) as f32; f = f * 0.7; + printInt(pz); + loop lines { let lazy z = (4000 / (y := y + 1) + pz) / 20; let lazy x = px - ({randomSeed(z); random()} >> 30) as f32; @@ -57,4 +60,4 @@ export fn upd() { px = px + (btn(3) - btn(2)) as f32 * control_speed; py = py + s; pz = pz + 1; -} \ No newline at end of file +} diff --git a/platform/Cargo.lock b/platform/Cargo.lock index ff26b85..ed42583 100644 --- a/platform/Cargo.lock +++ b/platform/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "ahash" version = "0.3.8" @@ -11,6 +17,17 @@ dependencies = [ "const-random", ] +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "anyhow" version = "1.0.47" @@ -32,6 +49,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +[[package]] +name = "bytemuck" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72957246c41db82b8ef88a5486143830adeb8227ef9837740bdec67724cf2c5b" + [[package]] name = "cc" version = "1.0.72" @@ -60,7 +83,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2d3efff85e8572b1c3fa0127706af58c4fff8458f8d9436d54b1e97573c7a3f" dependencies = [ - "ahash", + "ahash 0.3.8", ] [[package]] @@ -85,6 +108,15 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "crc32fast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3825b1e8580894917dc4468cb634a1b4e9745fddc854edad72d9c04644c0319f" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam-channel" version = "0.5.1" @@ -123,6 +155,27 @@ dependencies = [ "wasmparser", ] +[[package]] +name = "fallible_collections" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaefd4190151d458f16f0793d3452d7f13aeb3701566a4cefc4c37598876cc00" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "flate2" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +dependencies = [ + "cfg-if", + "crc32fast", + "libc", + "miniz_oxide", +] + [[package]] name = "getrandom" version = "0.2.3" @@ -134,6 +187,15 @@ dependencies = [ "wasi", ] +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash 0.7.6", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -152,6 +214,28 @@ version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8521a1b57e76b1ec69af7599e75e38e7b7fad6610f037db8c79b127201b5d119" +[[package]] +name = "lodepng" +version = "3.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24844d5c0b922ddd52fb5bf0964a4c7f8e799a946ec01bb463771eb04fc1a323" +dependencies = [ + "fallible_collections", + "flate2", + "libc", + "rgb", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + [[package]] name = "num-traits" version = "0.2.14" @@ -161,6 +245,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "once_cell" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" + [[package]] name = "pbr" version = "1.0.4" @@ -185,6 +275,7 @@ version = "0.1.0" dependencies = [ "anyhow", "curlywas", + "lodepng", "uw8-tool", ] @@ -194,6 +285,15 @@ version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" +[[package]] +name = "rgb" +version = "0.8.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a27fa03bb1e3e2941f52d4a555a395a72bf79b0a85fbbaab79447050c97d978c" +dependencies = [ + "bytemuck", +] + [[package]] name = "sacabase" version = "2.0.0" @@ -245,6 +345,12 @@ dependencies = [ "wasmparser", ] +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" diff --git a/platform/Cargo.toml b/platform/Cargo.toml index f06b90b..fb6e338 100644 --- a/platform/Cargo.toml +++ b/platform/Cargo.toml @@ -8,4 +8,5 @@ edition = "2021" [dependencies] curlywas = { git="https://github.com/exoticorn/curlywas.git", rev="c0140d0" } uw8-tool = { path="../uw8-tool" } -anyhow = "1" \ No newline at end of file +anyhow = "1" +lodepng = "3.4" \ No newline at end of file diff --git a/platform/bin/loader.wasm b/platform/bin/loader.wasm index 3cff3cea6bd4fbb939ce1fbd81b002e865947d57..0221d2f97b5459a84830b90ffbaeabb64ec0fab9 100644 GIT binary patch delta 432 zcmV;h0Z;zM3EK&-c}>Ww$ta_U7|>0C4%G z0V-tFMk72kKP=S+v#j-qJ`B20zA+Dm1`1Ia@9zgcAQrPDE~s4cF$%OLp2~@xWNYmC zw5^1WV-nbq3i!%(4PKNwhF9Gn`XV`tKCVKwTkphn+!)_m%%t&5;pkPVag8&&C?=<1 za~mD6%7>y2=YfBhx%|$k`uqq2yqPVlZJ;3HhIbq6e0-&lP`3l#GP}3Yt~5p4R`}0x zpdqYR9ft{_EOSGyoS(tgLNZ+#>M_`0p5wBxw>4+y0SbAhGrhPU1aKyzZ}c?NuTj8~ zMpbbsy2$}4P~0EqE?S?}8>)pkUj=Id{*k#JS_lyLwZJGwVc2Tqve>6&6RvH)+fNWXw(}3 delta 411 zcmV;M0c8H$3C0PqHUoc-0|5X*01Jl$1poSW4}dW-fi|!?5Ph|VQTwp{*Bp|^Q^|cg zjwb=}5Oh-zZNkT_>#EG>{lld1?OVE3h*O_W*HN?HOrx#lBMx9K^{SDkn4h1(>oiqE zGm=foH4!Yh8a#rt62B!J`V@_=E=Khkd0CKjoE{MZR|eF2jTC<@MTSW8)bVh>X@{=Y z=UI(l9uY~zH+%|5@6DeQ^YQw_zLNawCp`CmXBy_Mt!<($zoS`aJ}e*B*PQu99g5x% z!qGc5uT2Ut&k0rlVNf^9O-blbfqVb1OE@M60H&@Z8szHpo~>cP~+c zgv%FtZ12MqBT;>=Qe=Q(2(W+m3-~mEV5#56)7wvx;7BjJuKfS>MqdMFa1{M4u1+Vm zT1*K-+beNxHctbf(7l2OKcizs+Y1cf;|?P{Sn>FD&uA0dx*5$le>GuKlX*;cUSgfS Ft%dBj$#DPx diff --git a/platform/bin/platform.uw8 b/platform/bin/platform.uw8 index fafe324de9757941701aac9737c4706d2212554d..75b074feba98986423bc2d74162d7c33dbe2dd88 100644 GIT binary patch literal 1406 zcmV-^1%dhkH~L(loNHSUZAn6PY>$Kc2O?>i^ycPD>pu%lLjf*?n4g-=7Qbiq`$VjU zQOw`&hwZLubW?e+FvRM0_0F8a-FF$~!h{iB$moEZQx}k5UC$FI6>`;PC6);Y&*BQy z;U(&@a;g-J4OysZY869)TchK!aE_g9M0}D)v~QPs5<@-MhAf*TG1(A(s@QlclU1S>;FyPJC@UwV(W$BbeYGPlGcH0y!eWh64nf=D&&!`Y->i`Sn$PV_68g3id^8%KTk%yUerf54^3lmAeTg?p0e zSui`T|Ja${uAU{u6?s-`x6)_5-Hi+;8*IJ?sNOG@x6Di2z&GF8LuhdDymJ#|!X6^r zPbtt%P2<}*lnZUZf*XQXF~6A^QYs)!CbtGRyY|9Ql^s!edr;v?Q=r~3{Qq|r zs9)}3#61a2UdylTsp36WFe9j5JC|KT9Yctp?fPNV=yOp?!l09&my7aS51ZURCvE}B zvkQ6}n478%=?liUCaMU0Xv&WGiQjFQRid8W(2EY6Q1s}sB&b?cG^Lpf6T0- zFooC=D@lV?@bcQ-S?iPZS(P6mvk(dp6AiT{k_XiU2W#_GL2kHs)Oi<6YJ*61#8zM@ z1XEliZ|Z;1KQ#f~^*oJ5!^2aTYjcpii=43-;3Cj;Cs}_es&8n)d`He_V*G&zP=BXq z{k+eB0d}j{P7jK$z8i`HSJFv3)hwUv&zL=k@SZfcS7&mT;hE4Ta@+@p%_is!n&|P~ zMqQg|vrtTrp&l>1SFT7zTA~4mdbY7B=P8C1Tdj4(Xx=qpH!6WBxnQORR*apl$A?}| zHrFI5OGua`zG>frZ@if^8S5=qr#5KUK7GIj>Z7d%Glu?`X-Z07%HiXUhu$zy!tFt8 zBtj}S4;SwLd;M0(W_E#=EQ4*ce5QXCm9nRa+G|)=Sw`n$8$DoYTYO$++(Qe~H-#Ix zuq*cMMQP}k;t60E@h-X7%F=j|1kMM}GQ8DYe%mSN82kkAgxpf*crly~l$x5s`3eaH z%^1@QzZPcn%&ZZ*V?x#{#7%JETFyCnm$us87((qwQUQ8Pp^dmcmPAdw^Q@o#5^FcH zi27=O$Cm9xT8Tj8qDX@Vojl8#c7H5S=~4fFB&pcX;wzfWtwiy;!x=Reou_5~`VA4) z89FaiSF-OWS2GeY?A=84PbjiA>FsnM6!%J^pWG!D)Y7IJcG=+yTT|{1Hajt#K?&qs z@1@UTK=(-3(mVErK4~`fYOEQ^Nz!+_-tP z)f_i@MIVDTz`(MF+}ui{qavf}7{^!_av`iD(#EUFk^_Pon_-?bx!`KZphVoa-~Y@r zc-M0Z-~3$EuV2JHNWny^82EIrX@wR*sTp$qXy|1&;-mp6r6kAoa2-|Y4|rPk@;l6n|t&nRXN2ty#mITh`=*sJ~Xrq#Yg zH-n`KM){C8K7E)LrzSGI_ISKA*Zdl)@G3n0y&+1O*EZ^p>{M!dL(rd_SGN~Pe0Q;V zLQ=K|1Yu?sEt=MdkLvkjVt*e<$@k6c<*;#-8m0r_F) z$%WkGAsJcmNpV^8@HJ6AkgB6eYhw*Ra}16gg}Bp`OwZNmw}ebdpMGfK&OUx~LTz9( z8&WU7ur5EOgXrk{b)MhhsmEdd&a3}hsN|^Qm3M06GeJ39Z-PW$0m_F&l?b#Nc@W!o zZlFFQ*^fslL^9jf;M=Sqqjy`C(1P+P0X0s2gvsU}+|Fq_N-?J6ck1j2~*(n)bbz*?@w|?{EAZv@N9=jenQ+$eJYF-Wl1i=rqNMZ#T_-_*Y`0Yy*x9`p` zBLwxErTu7)yvJY$W^bjUOj(-_@bEFKn zgaD^fXjaY|Au~Bsf@+9GjkOlfby?mQ-C11@cR@ADhBsI6SOY3N42EKFjHwLNEA2KP zwXRNfFZgtc&Ti8Z9n6r^SWz-o3)ImcT?ZclE15p^$*~R1J2*_3-lTp0a{3D%&K6G9 LtaLgY9P<+Z%8H&B diff --git a/platform/src/font.png b/platform/src/font.png new file mode 100644 index 0000000000000000000000000000000000000000..f87e348e1b304646efcbef5bb82531ce9d498f53 GIT binary patch literal 1620 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 L$0 Result<()> { println!("Generating compressed base module"); uw8_tool::BaseModule::create_binary(&Path::new("target/base.upk"))?; + println!("Converting font"); + convert_font()?; + println!("Compiling loader module"); let loader = curlywas::compile_file("src/loader.cwa")?; File::create("bin/loader.wasm")?.write_all(&loader)?; @@ -25,3 +28,28 @@ fn main() -> Result<()> { Ok(()) } + +fn convert_font() -> Result<()> { + let image = lodepng::decode32_file("src/font.png")?; + + assert!(image.width == 128 && image.height == 128); + + let mut font = vec![]; + for char in 0..256 { + for y in 0..8 { + let mut byte = 0u8; + let base = (char % 16 * 8) + (char / 16 * 8 + y) * 128; + for x in 0..8 { + byte += byte; + if image.buffer[base + x].r > 128 { + byte |= 1; + } + } + font.push(byte); + } + } + + File::create("target/font.bin")?.write_all(&font)?; + + Ok(()) +} \ No newline at end of file diff --git a/platform/src/platform.cwa b/platform/src/platform.cwa index 26737d3..a53be17 100644 --- a/platform/src/platform.cwa +++ b/platform/src/platform.cwa @@ -6,6 +6,10 @@ export fn time() -> f32 { (0!64) as f32 / 1000 as f32 } +/////////// +// INPUT // +/////////// + export fn isButtonPressed(btn: i32) -> i32 { (68!0 >> btn) & 1 } @@ -14,6 +18,10 @@ export fn isButtonTriggered(btn: i32) -> i32 { ((68!0 & (-1 - 68!4)) >> btn) & 1 } +//////////// +// RANDOM // +//////////// + global mut randomState: i64 = 37i64; export fn random() -> i32 { @@ -43,8 +51,17 @@ export fn fmod(a: f32, b: f32) -> f32 { a - floor(a / b) * b } +///////////// +// DRAWING // +///////////// + +global mut textCursorX = 0; +global mut textCursorY = 0; + export fn cls(col: i32) { let i: i32; + textCursorX = 0; + textCursorY = 0; col = (col & 255) * 0x1010101; loop pixels { i!120 = col; @@ -121,6 +138,63 @@ export fn circle(cx: f32, cy: f32, radius: f32, col: i32) { } } +////////// +// TEXT // +////////// + +global mut textColor = 15; + +export fn printChar(char: i32) { + if char == 10 | textCursorX >= 320 { + textCursorX = 0; + textCursorY = textCursorY + 8; + return; + } + + let y: i32; + loop rows { + let bits = (char * 8 + y)?0x13400; + let x = 0; + loop pixels { + if (bits := bits << 1) & 256 { + setPixel(textCursorX + x, textCursorY + y, textColor); + } + branch_if (x := x + 1) < 8: pixels; + } + branch_if (y := y + 1) < 8: rows; + } + textCursorX = textCursorX + 8; +} + +export fn printString(ptr: i32) { + loop chars { + let lazy char = ptr?0; + if char { + printChar(char); + ptr = ptr + 1; + branch chars; + } + } +} + +export fn printInt(num: i32) { + let lazy p = 0x12fff; + p?0 = 0; + if num < 0 { + printChar(45); + num = -num; + } + loop digits { + (p := p - 1)?0 = 48 + num #% 10; + branch_if (num := num #/ 10): digits; + } + printString(p); +} + +/////////// +// SETUP // +/////////// + export fn endFrame() { 68!4 = 68!0; } @@ -137,7 +211,7 @@ start fn setup() { 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; + (i%3 + i/3*4)?0x13000 = v; avg = (avg + c) * 0.5; branch_if i := i - 1: gradients; @@ -150,9 +224,9 @@ start fn setup() { 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; + let inline c1 = (src1 * 4 + channel)?(0x13000+192*4); + let inline c2 = (src2 * 4 + channel)?(0x13000+192*4); + i?(0x13000+192*4) = (c1 + c2) * (3 + first_step) / 8; branch_if (i := i - 1) >= 0: expand_sweetie; } @@ -161,7 +235,7 @@ start fn setup() { randomSeed(random()); } -data 120+320*240+192*4 { +data 0x13000+192*4 { i32( 0x2c1c1a, 0x5d275d, @@ -181,3 +255,7 @@ data 120+320*240+192*4 { 0x573c33 ) } + +data 0x13400 { + file("../target/font.bin") +} diff --git a/src/lib.rs b/src/lib.rs index c1fe703..88be069 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -163,8 +163,9 @@ impl MicroW8 { instance.update.call(&mut instance.store, ())?; instance.end_frame.call(&mut instance.store, ())?; - let framebuffer = &instance.memory.data(&instance.store)[120..]; - let palette = &framebuffer[320 * 240..]; + let memory = instance.memory.data(&instance.store); + let framebuffer = &memory[120..]; + let palette = &memory[0x13000..]; for i in 0..320 * 240 { let offset = framebuffer[i] as usize * 4; self.window_buffer[i] = 0xff000000 diff --git a/uw8-tool/src/base_module.rs b/uw8-tool/src/base_module.rs index eaadc91..567bd6e 100644 --- a/uw8-tool/src/base_module.rs +++ b/uw8-tool/src/base_module.rs @@ -81,6 +81,10 @@ impl BaseModule { add_function(&mut functions, &type_map, "isButtonPressed", &[I32], Some(I32)); add_function(&mut functions, &type_map, "isButtonTriggered", &[I32], Some(I32)); + add_function(&mut functions, &type_map, "printChar", &[I32], None); + add_function(&mut functions, &type_map, "printString", &[I32], None); + add_function(&mut functions, &type_map, "printInt", &[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 e31d85b..cb028b6 100644 --- a/web/src/main.js +++ b/web/src/main.js @@ -110,7 +110,7 @@ async function runModule(data) { new Uint32Array(memory.buffer)[16] = Date.now() - startTime; instance.exports.upd(); - let palette = new Uint32Array(memory.buffer.slice(76920, 76920 + 1024)); + let palette = new Uint32Array(memory.buffer.slice(0x13000, 0x13000 + 1024)); for (let i = 0; i < 320 * 240; ++i) { buffer[i] = palette[memU8[i + 120]] | 0xff000000; }