diff --git a/Cargo.lock b/Cargo.lock index d05ac51..1b35884 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -172,7 +172,7 @@ checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd" [[package]] name = "upkr" -version = "0.2.0-pre3" +version = "0.2.0" dependencies = [ "anyhow", "cdivsufsort", diff --git a/Cargo.toml b/Cargo.toml index 02a9b53..cea6a5c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "upkr" -version = "0.2.0-pre3" +version = "0.2.0" edition = "2021" [profile.release] diff --git a/README.md b/README.md index b372148..36f4add 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,57 @@ Upkr is a simple general purpose lz packer designed to be used in the [MicroW8](https://github.com/exoticorn/microw8) platform. The compressed format is losely based on [Shrinkler](https://github.com/askeksa/Shrinkler) with the main difference being that -Upkr doesn't differnetiate between literals at odd or even addresses and that I went with rANS/rABS instead of a range coder. +Upkr doesn't differentiate between literals at odd or even addresses (by default) and that I went with rANS/rABS instead of a range coder. -At this point, Upkr should still be considered unstable - the compressed format is not very likely to change but I still want -to keep that option open a little longer. +Compression rate is on par with Shrinkler. + +The differences compare to Shrinkler also makes it interesting on 8bit platforms. The z80 unpacker included in the release +is both about twice as fast and smaller than the Shrinkler unpacker. ## Inspirations: * Ferris' blog about his [C64 intro packer](https://yupferris.github.io/blog/2020/08/31/c64-4k-intro-packer-deep-dive.html) * [Shrinkler](https://github.com/askeksa/Shrinkler) -* Ryg's [sample rANS implementation](https://github.com/rygorous/ryg_rans) \ No newline at end of file +* Ryg's [sample rANS implementation](https://github.com/rygorous/ryg_rans) + +## Unpackers + +The release includes a reference c unpacker, as well as some optimized asm unpackers (arm and riscv). The unpckers in +c_unpacker and asm_unpackers unpack the default upkr compressed format. The z80_unpacker +is based on some variations to the compressed format. (Use `upkr --z80` to select those variations.) +An optimized x86 (DOS) unpacker is currently being worked on out of tree. + +## Usage + +``` + upkr [-l level(0-9)] [config options] [] + upkr -u [config options] [] + upkr --margin [config options] + + -l, --level N compression level 0-9 + -0, ..., -9 short form for setting compression level + -u, --unpack unpack infile + --margin calculate margin for overlapped unpacking of a packed file + +Config presets for specific unpackers: + --z80 --big-endian-bitstream --invert-bit-encoding --simplified-prob-update -9 + --x86 --bitstream --invert-is-match-bit --invert-continue-value-bit --invert-new-offset-bit + --x86b --bitstream --invert-continue-value-bit --no-repeated-offsets -9 + +Config options (need to match when packing/unpacking): + -b, --bitstream bitstream mode + -p, --parity N use N (2/4) parity contexts + -r, --reverse reverse input & output + +Config options to tailor output to specific optimized unpackers: + --invert-is-match-bit + --invert-new-offset-bit + --invert-continue-value-bit + --invert-bit-encoding + --simplified-prob-update + --big-endian-bitstream (implies --bitstream) + --no-repeated-offsets + --eof-in-length + --max-offset N + --max-length N +``` diff --git a/release/.gitignore b/release/.gitignore new file mode 100644 index 0000000..54124cb --- /dev/null +++ b/release/.gitignore @@ -0,0 +1,4 @@ +*.zip +*.tgz +upkr-linux/ +upkr-windows/ diff --git a/release/Makefile b/release/Makefile new file mode 100644 index 0000000..b786704 --- /dev/null +++ b/release/Makefile @@ -0,0 +1,35 @@ +VERSION=0.2.0 + +all: clean upkr-linux-$(VERSION).tgz upkr-windows-$(VERSION).zip + +clean: + rm -rf upkr-linux + rm -f upkr-linux*.tgz + rm -rf upkr-windows + rm -f upkr-windows*.zip + +upkr-linux-$(VERSION).tgz: upkr-linux/upkr PHONY + cp ../README.md upkr-linux + cd .. && git archive HEAD c_unpacker | tar -xC release/upkr-linux + cd .. && git archive HEAD z80_unpacker | tar -xC release/upkr-linux + cd .. && git archive HEAD asm_unpackers | tar -xC release/upkr-linux + tar czf $@ upkr-linux + +upkr-windows-$(VERSION).zip: upkr-windows/upkr.exe PHONY + cp ../README.md upkr-windows/ + cd .. && git archive HEAD c_unpacker | tar -xC release/upkr-windows + cd .. && git archive HEAD z80_unpacker | tar -xC release/upkr-windows + cd .. && git archive HEAD asm_unpackers | tar -xC release/upkr-windows + zip -r -9 $@ upkr-windows + +upkr-linux/upkr: + cargo build --target x86_64-unknown-linux-musl --release + mkdir -p upkr-linux + cp ../target/x86_64-unknown-linux-musl/release/upkr upkr-linux/ + +upkr-windows/upkr.exe: + cargo build --target x86_64-pc-windows-gnu --release + mkdir -p upkr-windows + cp ../target/x86_64-pc-windows-gnu/release/upkr.exe upkr-windows/ + +PHONY: \ No newline at end of file