squishy
TL;DR
squishy is a modern pc 64k intro packer that provides better compression than all alternatives (that I've tried at least). It does so with a healthy mix of fresh and existing ideas, along with a hefty dose of CPU cycles and memory.
squishy has been used in several intros by top pc 64k intro groups including logicoma, monad, macau exports, polarity, quadtrip, ivory labs, and more.
Latest release
version 0.2.0 (23.03.2021)
- Migrated to x86-64. Note that the included README claims that all further squishy releases as of 0.2.0 will only target x86-64, and no longer support x86. However, x86-x64 proves to be a bit more difficult to compress than x86, so this was a bit hopeful. Expect further releases to support both x86 and x86-x64. In the meantime, previous versions are still available if x86 is desired.
Features/Usage
Currently, squishy is a barebones, command-line PE packer. There are no fancy reporting/debugging features or parameterization. Some of this stuff is planned, some of it isn't.
squishy -i uncompressed.exe -o compo-winner.exe
Pass -h
or --help
for more options/usage info.
Comparisons
Up-to-date metrics for several test intros are kept in this spreadsheet.
Presentations/Media
"Modern 64k Intro Compression" at Revision Online 2020
An overview of relevant techniques/information about 64k compression today, with specifics about squishy's primary model/approach.
"C64 4k intro packer deep-dive" on ferris blogs stuff
A blog post about an experimental C64 4k intro packer, with a section containing a detailed description of the closely-related second packer stage used by squishy.
Attribution
While squishy was primarily developed and tested by ferris / logicoma, several folks (and their respective works) have been instrumental in its design/development. Specifically, I'd like to thank:
- ryg / farbrausch, charles bloom, matt mahoney (and other PAQ authors), LZMA authors for providing open-source compression utilities, blog posts, and other literature
- blueberry / loonies for initial help bootstrapping a crinkler-like model and context tips
- mentor / tbc for tips/guidance for model improvements/testing
- all intro authors who provided (and continue to provide) uncompressed executables which was instrumental in building an extensive/universal PE corpus
- gargaj / conspiracy for usability feedback/testing
Changelog
version 0.2.0 (23.03.2021)
- Migrated to x86-64. Note that the included README claims that all further squishy releases as of 0.2.0 will only target x86-64, and no longer support x86. However, x86-x64 proves to be a bit more difficult to compress than x86, so this was a bit hopeful. Expect further releases to support both x86 and x86-x64. In the meantime, previous versions are still available if x86 is desired.
version 0.1.3 (07.02.2021)
- Fixed a possible code section unfilter regression introduced in 0.1.2, which affected a handful of intros.
- Fixed an issue where certain large resources could get corrupted during packing.
- Added additional 32-bit executable sanity checks which should catch most invalid/malformed input files.
version 0.1.2 (22.04.2020)
- Reworked jmp/call transform to be driven by the model's state-based disassembler, which allows the transform to more accurately identify these instructions. This provides better compression while also fixing compatibility issues when the previous inverse transform would produce invalid code after decompression.
- Adjusted indirect models slightly for better compression.
version 0.1.1 (05.04.2020)
- Added several command line options; see usage for info.
- Added warnings for resources, as they can be somewhat large.
version 0.1.0 (29.03.2020)
- Initial release version. A near-identical build was used to produce the first released 64k intros using squishy. If you received a version of squishy before the official public release, it should be nearly identical to this build and produce identical executables.