09ba31da1c5ffafb029de96de77a7c3ea52e3ce2
Located the nuke1 ASM decompressor source at NUKE.CPP (305 lines of C++ with inline x86 assembly). Analysis of the half-buffer flush logic in FlushIt (ULTRACMP.CPP) reveals the extraction hang root cause: For a 49152-byte SuperMaster, the original adjusts the output position: wTOE = 49152 - 32768 = 16384 (lower buffer half) wComp = 0 (flush when output enters lower half) FlushIt triggers immediately after the first decompressed byte (because wTOE is already in the lower half with wComp=0). It reads decompressed output from position 32768 + wSkip = 49152, but the actual output was written at position 16384. This produces garbage and triggers early termination. UC2 v3's compressor starts the LZ77 window at position 49152 (raw SuperMaster size), while the original's decompressor expects the window at position 16384 (49152 mod 32768). Fixing this requires aligning the compressor's starting position to match the decompressor's adjusted wTOE. Also corrected: the earlier "single-file extraction works" finding was a false positive from incomplete UC2DIST extraction (15/22 files). With complete UC2DIST, listing works but extraction hangs for all files.
UC2 v3.0.0 — UltraCompressor II
A cross-platform revival of UltraCompressor II, the DOS-era archiver by Nico de Vries (1992--1996). UC2 was notable for its advanced deduplication ("master blocks"), file versioning, and competitive compression ratios on the hardware of its day.
This project brings UC2 back as a modern, portable C99 tool. Phase 1 (current) provides decompression and archive listing, built on Jan Bobrowski's clean-room portable decompressor (unuc2/libunuc2). Phase 2 will add compression using the original algorithms.
Building
Requires CMake >= 3.16 and a C99 compiler (GCC, Clang, or MSVC).
cmake -B build
cmake --build build
The binary is at build/cli/uc2.
Usage
uc2 archive.uc2 # Extract all files
uc2 -l archive.uc2 # List contents
uc2 -t archive.uc2 # Test archive integrity
uc2 -d /tmp/out archive.uc2 # Extract to directory
uc2 -l archive.uc2 '*.txt' # List matching files
uc2 -p archive.uc2 readme.txt # Extract to stdout
Options
| Flag | Description |
|---|---|
-l |
List archive contents |
-t |
Test archive integrity |
-a |
Include all file versions (not just latest) |
-d path |
Extract to specified directory |
-f |
Overwrite existing files |
-p |
Extract to stdout |
-D |
Skip directory metadata; -DD also skips file metadata |
-T |
Tab-separated output (for scripting) |
Project Structure
UC2/
lib/ libuc2 decompression library
cli/ uc2 command-line tool
original/ preserved original sources (reference only)
cmake/ build system modules
tests/ test archives and test programs
History
- v1.0--v2.3 (1992--1996) Original DOS releases by Nico de Vries
- 2015 Source code released under LGPL-3.0 by Danny Bezemer
- 2020--2021 Jan Bobrowski writes unuc2/libunuc2 (portable decompressor)
- 2026 UC2 v3.0.0: cross-platform revival
License
GPL-3.0. See LICENSE and CREDITS.md for full attribution.
Languages
C++
49.1%
C
41.8%
Batchfile
3.6%
CMake
2.3%
Python
1.6%
Other
1.6%