From 6f92fd8bb36ede8d2f180227089aaf601e24e278 Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Sat, 11 Dec 2021 23:56:46 +0100 Subject: [PATCH] add line function to platform --- Cargo.lock | 3 +- Cargo.toml | 2 +- platform/Cargo.lock | 3 +- platform/Cargo.toml | 2 +- platform/bin/loader.wasm | Bin 1278 -> 1281 bytes platform/bin/platform.uw8 | Bin 2072 -> 2303 bytes platform/src/loader.cwa | 12 +++--- platform/src/main.rs | 4 +- platform/src/platform.cwa | 83 ++++++++++++++++++++++++++++++++++++ src/main.rs | 2 +- uw8-tool/src/base_module.rs | 1 + 11 files changed, 99 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9c37f8b..3dacab7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -426,11 +426,12 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "curlywas" version = "0.1.0" -source = "git+https://github.com/exoticorn/curlywas.git?rev=d62bc8bf86cff65145d5aea045b81122bc15d709#d62bc8bf86cff65145d5aea045b81122bc15d709" +source = "git+https://github.com/exoticorn/curlywas.git?rev=196719b#196719b35ef377cb7e001554b27ac5de013dcf2b" dependencies = [ "anyhow", "ariadne", "chumsky", + "pico-args", "wasm-encoder", "wasmparser 0.81.0", ] diff --git a/Cargo.toml b/Cargo.toml index 8cbbd05..6bdc23d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,5 +11,5 @@ anyhow = "1" minifb = "0.19" notify = "4" pico-args = "0.4" -curlywas = { git = "https://github.com/exoticorn/curlywas.git", rev = "d62bc8bf86cff65145d5aea045b81122bc15d709" } +curlywas = { git = "https://github.com/exoticorn/curlywas.git", rev = "196719b" } uw8-tool = { path = "uw8-tool" } \ No newline at end of file diff --git a/platform/Cargo.lock b/platform/Cargo.lock index ed42583..2d513c7 100644 --- a/platform/Cargo.lock +++ b/platform/Cargo.lock @@ -146,11 +146,12 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "curlywas" version = "0.1.0" -source = "git+https://github.com/exoticorn/curlywas.git?rev=c0140d0#c0140d0671e81b57e8fd142c66c675a659fd50f8" +source = "git+https://github.com/exoticorn/curlywas.git?rev=196719b#196719b35ef377cb7e001554b27ac5de013dcf2b" dependencies = [ "anyhow", "ariadne", "chumsky", + "pico-args", "wasm-encoder", "wasmparser", ] diff --git a/platform/Cargo.toml b/platform/Cargo.toml index fb6e338..12ec78c 100644 --- a/platform/Cargo.toml +++ b/platform/Cargo.toml @@ -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="c0140d0" } +curlywas = { git="https://github.com/exoticorn/curlywas.git", rev="196719b" } uw8-tool = { path="../uw8-tool" } anyhow = "1" lodepng = "3.4" \ No newline at end of file diff --git a/platform/bin/loader.wasm b/platform/bin/loader.wasm index dc8fc96275e306451e7fe862579cd5773411de2b..727985bd7e68e1c957a4b21c28642739aed96804 100644 GIT binary patch delta 363 zcmV-x0hIp!34sc*HUodj0|5X*01Ltc414);{6mojPcfY;Vt~WKiIuf1hHPxE2lAGp z$Y-O+bP8y8PmbssdYa}+940QdxlXu7*yo05f3yd{=4nLJL@R0&e>oYM1K4YmM7XWCJ$Ozo%4yz?&urc zO$3q4f}1?sh#$%qXb@i|iVeMUyG?a50+g6L+(h#i6x#AbB1JAXN^{mMixGQa9AmZ} z8;2)Nd_~(W<8cz(SZe8qn)JhDMD>t@oz;t%IW9bEH;_Wc52+hMr2UrTtQSY_tIUz> J2-x~^D&9r7s#5>} delta 360 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 QKL1z+U_nYdbMJd502q&J{{R30 delta 2062 zcmV+p2=Vv-5ttB=A%D<2Y*poYkMgfZ;7b%+{Rv#3)Jqa@Jh)egrJ^wK>#IFelNAoG50- z?sxho7>miMskgWaR}?IMW~A{(pz>8Ck6OW@7dLsye7lxftbc06T_&j7g50FL$s5A- zm60qkeX4kI>>FQLCs@Y+e!4ld7HnuUiEBS2v2N zT9Ep&5Z57HsUAMyfo#v(M&3gm%aEpy)DNFYQ?>X`+P?Xg`yakj0xn<; zpfP8;vo=Achj-E6S*I@8NY8$Tz!+iTzQi7{Ps(XqXVg0uM;Fa+9R=7c3z|?qOCUnc1#?DsTwMPLa*fF6vo%xI-&n`+p9IO;?a>u0jS_5 zq_Oz>wiU?pG6#}(BUR&a71(k@I_Tu*q$EsltNWcU*24ysyx&j>igZ$!6jA4|*r1w2 z@{4u1wJFPwie;xKn9X$t1+=vR`hQt8oj+jA$hHzwTv2rZm9q92Ddsn+6{u>|!g~Wi zcA%&v{i7gUg120k7Ou?yZZ1~msZ*9bskmpGkLxW*p3EO3z44y$yZhW|;wyJTh}hRQ zIl$Xt>UGrsE$Wu`{bm2b8zM0?d?k4Kph$GZ-R|u9qAKD#@$dPLUqQSiFn)U=%zu5tBBRP(HrT4A zwJWyuN~_`0HiT1!b2?%B%m8$P3>BL=#*Lh5Es3sBrT1AHyRdU9>)i@*N-F{~(MtN> zrD!uZ^&-ILhG{vqxHR2fYu^3($RoThh%vBAAJl55jGw!~pGL{-G8~OQ8b(4@4Y0tk z-~Fgx^sJHUD^HNv{Y}-_QO$TfSoTjx-oO z+iS4s30B0fQuK~7h;Y-@xu6=kB>Sx!E?}1BIAfOXe&`I!*nc(9E%ax~Q%dTKZ?B}G zhE$3c5H&3F7DwQyC%9{t2oDyi!kIO(j7Bl}kLuW0AIoGogS_aZ+h?dU!mnKAW0efR zQHn)%hnZMPFBc+usxGj6^3O-gF?ShV9kp~4Y)D{SRLHW9^^h*E1AyhVQwp2R0G?0B zAZzZ!+T5m({C{J!@mUh9bxg{Ue&D5g?qtzoY!48F@bcXNUtWyaa#3jL^Fge@YH=HV zy6|0kF^M_|dRB?qAV@&&2=N8jR-WPNyu^y;zCcF6vAprC`%VC24oZk7OD{-Wg9!p~ s&P-PSwt`i2tW>|lj)>F^C!-_zG}mOMRDKaPKwi+5HwS{w#MDxz0At1z5dZ)H diff --git a/platform/src/loader.cwa b/platform/src/loader.cwa index 7540fe8..2bccfbb 100644 --- a/platform/src/loader.cwa +++ b/platform/src/loader.cwa @@ -3,7 +3,7 @@ import "env.memory" memory(4); global mut base_end: i32 = 0; export fn load_uw8(module_size: i32) -> i32 { - let lazy version = ?0 - 1; + let lazy version = 0?0 - 1; if version < 0 { return module_size; } @@ -21,10 +21,10 @@ export fn load_uw8(module_size: i32) -> i32 { let src = 0x1e001; loop sections { - if src < module_end & (base_start >= base_end | ?src <= ?base_start) { + if src < module_end & (base_start >= base_end | src?0 <= base_start?0) { let lazy length2 = copy_section(dest, src); dest = dest + length2; - if base_start < base_end & ?src == ?base_start { + if base_start < base_end & src?0 == base_start?0 { base_start = base_start + section_size(base_start); } src = src + length2; @@ -47,7 +47,7 @@ fn section_size(ptr: i32) -> i32 { let l = 0; let shift = 0; loop size { - let lazy b = ?p; + let lazy b = p?0; l = l | ((b & 127) << shift); shift = shift + 7; p = p + 1; @@ -65,7 +65,7 @@ fn copy_section(dest: i32, src: i32) -> i32 { fn copy(dest: i32, src: i32, len: i32) { if len > 0 { loop bytes { - ?(dest + (len := len - 1)) = ?(src + len); + (dest + (len := len - 1))?0 = (src + len)?0; branch_if len: bytes } } @@ -142,7 +142,7 @@ fn upkr_bit(context_index: i32) -> i32 { loop refill { if upkr_state < 1<<16 { - upkr_state = (upkr_state << 8) | ?upkr_src_ptr; + upkr_state = (upkr_state << 8) | upkr_src_ptr?0; upkr_src_ptr = upkr_src_ptr + 1; branch refill; } diff --git a/platform/src/main.rs b/platform/src/main.rs index 288465a..3ae45ec 100644 --- a/platform/src/main.rs +++ b/platform/src/main.rs @@ -11,13 +11,13 @@ fn main() -> Result<()> { convert_font()?; println!("Compiling loader module"); - let loader = curlywas::compile_file("src/loader.cwa")?; + let loader = curlywas::compile_file("src/loader.cwa", curlywas::Options::default())?; File::create("bin/loader.wasm")?.write_all(&loader)?; println!("Loader (including base module): {} bytes", loader.len()); println!("Compiling platform module"); - let platform = curlywas::compile_file("src/platform.cwa")?; + let platform = curlywas::compile_file("src/platform.cwa", curlywas::Options::default())?; println!("Compressing platform module"); let platform = uw8_tool::pack( &platform, diff --git a/platform/src/platform.cwa b/platform/src/platform.cwa index e986fdc..c2ffa81 100644 --- a/platform/src/platform.cwa +++ b/platform/src/platform.cwa @@ -135,6 +135,89 @@ export fn circle(cx: f32, cy: f32, radius: f32, col: i32) { } } +export fn line(x1: f32, y1: f32, x2: f32, y2: f32, col: i32) { + let swapTmp: f32; + if x1 > x2 { + swapTmp = x1; + x1 = x2; + x2 = swapTmp; + swapTmp = y1; + y1 = y2; + y2 = swapTmp; + } + if x1 < 0 as f32 & x2 >= 0 as f32 { + y1 = y1 + (y2 - y1) * -x1 / (x2 - x1); + x1 = 0 as f32; + } + if x1 < 320 as f32 & x2 >= 320 as f32 { + y2 = y2 + (y2 - y1) * (320 as f32 - x2) / (x2 - x1); + x2 = 320 as f32; + } + + if y1 > y2 { + swapTmp = x1; + x1 = x2; + x2 = swapTmp; + swapTmp = y1; + y1 = y2; + y2 = swapTmp; + } + if y1 < 0 as f32 & y2 >= 0 as f32 { + x1 = x1 + (x2 - x1) * -y1 / (y2 - y1); + y1 = 0 as f32; + } + if y1 < 240 as f32 & y2 >= 240 as f32 { + x2 = x2 + (x2 - x1) * (240 as f32 - y2) / (y2 - y1); + y2 = 240 as f32; + } + + let lazy dx = x2 - x1; + let lazy dy = y2 - y1; + let max_axis: f32; + let p: f32; + if abs(dx) >= dy { + max_axis = dx; + p = x1; + } else { + max_axis = dy; + p = y1; + } + + let steps = floor(p + max_axis) as i32 - floor(p) as i32; + p = floor(p) + 0.5 - p; + if max_axis < 0 as f32 { + steps = -steps; + p = -p; + max_axis = -max_axis; + } + dx = dx / max_axis; + dy = dy / max_axis; + + let f = min(max_axis, max(0 as f32, p)); + setPixel((x1 + f * dx) as i32, (y1 + f * dy) as i32, col); + + if !steps { + return; + } + + x1 = x1 + (1 as f32 + p) * dx; + y1 = y1 + (1 as f32 + p) * dy; + + p = p + steps as f32; + + loop pixels { + if steps := steps - 1 { + setPixel(x1 as i32, y1 as i32, col); + x1 = x1 + dx; + y1 = y1 + dy; + branch pixels; + } + } + + f = min(max_axis, p) - p; + setPixel((x1 + f * dx) as i32, (y1 + f * dy) as i32, col); +} + ////////// // TEXT // ////////// diff --git a/src/main.rs b/src/main.rs index a6e311e..48d0ff9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -97,7 +97,7 @@ fn load_cart(filename: &Path, uw8: &mut MicroW8, config: &Config) -> Result<()> if cart[0] >= 10 { let src = String::from_utf8(cart)?; - cart = curlywas::compile_str(&src)?; + cart = curlywas::compile_str(&src, filename, curlywas::Options::default())?; } if config.pack { diff --git a/uw8-tool/src/base_module.rs b/uw8-tool/src/base_module.rs index 1085adb..c59a93b 100644 --- a/uw8-tool/src/base_module.rs +++ b/uw8-tool/src/base_module.rs @@ -76,6 +76,7 @@ impl BaseModule { add_function(&mut functions, &type_map, "hline", &[I32, I32, I32, I32], None); 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, "line", &[F32, F32, F32, F32, I32], None); add_function(&mut functions, &type_map, "time", &[], Some(F32)); add_function(&mut functions, &type_map, "isButtonPressed", &[I32], Some(I32));