From 462dc3a1c66445fbb044f2674372d4453ba9fa2e Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Mon, 27 Dec 2021 17:31:08 +0100 Subject: [PATCH] update upkr (new tweaked compressed format) --- Cargo.lock | 2 +- platform/Cargo.lock | 2 +- platform/bin/loader.wasm | Bin 1281 -> 1288 bytes platform/bin/platform.uw8 | Bin 2397 -> 2377 bytes platform/src/loader.cwa | 27 ++++++++++++++++----------- uw8-tool/Cargo.lock | 2 +- uw8-tool/Cargo.toml | 2 +- 7 files changed, 20 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c05b229..bc72cc4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1524,7 +1524,7 @@ dependencies = [ [[package]] name = "upkr" version = "0.1.0" -source = "git+https://github.com/exoticorn/upkr.git?rev=7d280bd#7d280bd533b037d579b6cdf12fb69046eb5c2c91" +source = "git+https://github.com/exoticorn/upkr.git?rev=08c86af0#08c86af06f106631ce0401c881bd66fb2c0271e6" dependencies = [ "anyhow", "cdivsufsort", diff --git a/platform/Cargo.lock b/platform/Cargo.lock index 2d513c7..fbc9062 100644 --- a/platform/Cargo.lock +++ b/platform/Cargo.lock @@ -326,7 +326,7 @@ dependencies = [ [[package]] name = "upkr" version = "0.1.0" -source = "git+https://github.com/exoticorn/upkr.git?rev=7d280bd#7d280bd533b037d579b6cdf12fb69046eb5c2c91" +source = "git+https://github.com/exoticorn/upkr.git?rev=08c86af0#08c86af06f106631ce0401c881bd66fb2c0271e6" dependencies = [ "anyhow", "cdivsufsort", diff --git a/platform/bin/loader.wasm b/platform/bin/loader.wasm index 727985bd7e68e1c957a4b21c28642739aed96804..f80d0301a6ca37f371f4be41660fe9c4799bbe51 100644 GIT binary patch delta 742 zcmZqV>foA?!+3dPt}mnAc1A|ldIbg*Mn?t}CT0f(7RLrgD~5&!ejtl6ONqs?k=cWn zft$&J*};)PfQ`jLft97+k&)H0fk}Xkd-4ZH2~{?rHbx+1%GPCIuwr0PU{t zWXx7#18R0;RAim3$z;Uh$N*$SGuhR5GBPp)ZPf)?q{ztZpv>ghpy0s*qB%;G8G+^$ zsW2&n%u!+FVdUlpivMRURAN$K^iX70U1zY0(n0)qlQr)bZU8o9mVpaXh{Cb^6@+`e?SUMY+ebY^&;bO!!whDf>#WTGXG* zVIPB@wxvdNetU6xy3D?4PN67PiP^0lOdJ1aG~C`0{(50ulE|~E$EL(=u_&i zrj}DTb~ZjxZx=Ncy5kf7xZdz;VJnke#C6uD##?jj?Y~wBT|fR_O_{Oi=a`=EvgZn-zQu)4iV0M^dK*Gr<~RI!bB;P+ZX5j^SN~I-LKA{ z9rd}dro3^VJy(8~?$vu`leVuaSo!Sc4E2yE-Hx^27Db@~ delta 709 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 PDm3a9-ap2Yxx_~R3xT@N diff --git a/platform/src/loader.cwa b/platform/src/loader.cwa index 2bccfbb..c1db35d 100644 --- a/platform/src/loader.cwa +++ b/platform/src/loader.cwa @@ -88,14 +88,17 @@ export fn uncompress(src_ptr: i32, dest_ptr: i32) -> i32 { let i: i32; loop init_contexts { - i!0x3c000 = 0x800; - branch_if (i := i + 4) < (256 + 1 + 128) * 4: init_contexts + i?0x3c000 = 0x80; + branch_if (i := i + 1) < 256 + 1 + 128: init_contexts } + let prev_was_match: i32; + block finished { loop unpack_loop { if upkr_bit(0) { - if upkr_bit(256) { + let inline new_offset = if prev_was_match { 1 } else { upkr_bit(256) }; + if new_offset { offset = upkr_length(257) - 1; branch_if !offset: finished } @@ -105,6 +108,7 @@ export fn uncompress(src_ptr: i32, dest_ptr: i32) -> i32 { dest_ptr = dest_ptr + 1; branch_if (length := length - 1): copy; } + prev_was_match = 1; } else { // literal i = 0; @@ -115,6 +119,7 @@ export fn uncompress(src_ptr: i32, dest_ptr: i32) -> i32 { } dest_ptr?0 = byte; dest_ptr = dest_ptr + 1; + prev_was_match = 0; } branch unpack_loop; } @@ -138,28 +143,28 @@ fn upkr_length(context_index: i32) -> i32 { } fn upkr_bit(context_index: i32) -> i32 { - let prob = (context_index * 4)!0x3c000; + let prob = context_index?0x3c000; loop refill { - if upkr_state < 1<<16 { + if upkr_state < 1<<12 { upkr_state = (upkr_state << 8) | upkr_src_ptr?0; upkr_src_ptr = upkr_src_ptr + 1; branch refill; } } - let lazy state_low = upkr_state & 0xfff; + let lazy state_low = upkr_state & 0xff; let bit = state_low < prob; if bit { - upkr_state = prob * (upkr_state >> 12) + state_low; - prob = prob + ((0x1000 - prob) >> 4); + upkr_state = prob * (upkr_state >> 8) + state_low; + prob = prob + ((0x108 - prob) >> 4); } else { - upkr_state = (0x1000 - prob) * (upkr_state >> 12) + state_low - prob; - prob = prob - (prob >> 4); + upkr_state = (0x100 - prob) * (upkr_state >> 8) + state_low - prob; + prob = prob - ((prob + 8) >> 4); } - (context_index * 4)!0x3c000 = prob; + context_index?0x3c000 = prob; bit } diff --git a/uw8-tool/Cargo.lock b/uw8-tool/Cargo.lock index 9bf8f90..7d55196 100644 --- a/uw8-tool/Cargo.lock +++ b/uw8-tool/Cargo.lock @@ -124,7 +124,7 @@ dependencies = [ [[package]] name = "upkr" version = "0.1.0" -source = "git+https://github.com/exoticorn/upkr.git?rev=7d280bd#7d280bd533b037d579b6cdf12fb69046eb5c2c91" +source = "git+https://github.com/exoticorn/upkr.git?rev=08c86af0#08c86af06f106631ce0401c881bd66fb2c0271e6" dependencies = [ "anyhow", "cdivsufsort", diff --git a/uw8-tool/Cargo.toml b/uw8-tool/Cargo.toml index 6eb39df..693e41e 100644 --- a/uw8-tool/Cargo.toml +++ b/uw8-tool/Cargo.toml @@ -10,5 +10,5 @@ wasmparser = "0.81" wasm-encoder = "0.8" anyhow = "1" pico-args = "0.4" -upkr = { git = "https://github.com/exoticorn/upkr.git", rev = "7d280bd" } +upkr = { git = "https://github.com/exoticorn/upkr.git", rev = "08c86af0" } pbr = "1" \ No newline at end of file