*** WRA (WRAptor compressed files) *** Document revision 1.1 Written by Bill Lucier (copyright 1995), and distributed by Loadstar (on disk and from the website), this is an uncommon compression format as it is a very recent program. It handles PRG, SEQ, USR and GEOS files, but not REL files. It utilizes a variant of the LZ (Lempel-Ziv) compression algorithm, starting at 9 bits per code. The following is a dump of a sample WRA file. Notice all the filenames are preceeded by the 4-byte signature "FF 42 4C FF", which contains the authors initials "BL". (Note: much of the following explanation is theoretical, as I have not been able to crack the compression method yet.) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII ----------------------------------------------- ---------------- 0000: FF 42 4C FF 50 4F 4F 59 41 4E 00 02 00 82 04 60 úBLúPOOYANú.ú‚.` 0010: 80 50 01 16 41 59 0C 14 F0 81 0C 47 49 31 11 40 €P..AY..ð.GI1.@ 0020: 9E 4F 2C 90 49 C2 E2 61 3C 82 44 22 94 84 42 C1 žO,IÂâa<‚D"”„BÁ 0030: C0 B0 62 00 21 82 02 90 62 0C 61 63 19 43 D4 4D À°bú!‚.b.ac.CÔM 0040: 20 92 49 D1 F3 13 41 01 E0 02 78 68 37 1C 0D 40 ú’IÑó.A.à.xh7..@ 0050: 14 E1 40 00 DD 0B FF 42 4C FF 50 4F 4F 59 41 4E .á@úÝ.úBLúPOOYAN 0060: 2E 4D 41 49 4E 00 02 7E 0C 0A B0 31 31 00 08 00 .MAINú.~..°11ú.ú 0070: 00 09 40 00 05 2A 00 02 A5 54 3C 81 10 88 00 08 úú@ú.*ú.¥T<.ˆú. Byte: $00-03: FF 42 4C FF - File signature "úBLú" 04-xx: 50 4F 4F 59 41 4E 00 - File name "POOYAN", terminated with a $00 (null) byte 02 - File type 01 = SEQ 02 = PRG 03 = USR 04 = GEOS What follows the filetype is compressed file data, up until two bytes before the next signature, or two bytes to the end of the file, whichever comes first. The two bytes at the end comprise the 16-bit CRC value. This format does not include information in the header that would normally be considered important for the decompressor, such as: 1. No original or compressed file sizes 2. No offset to show where the next contained file starts 3. No version# info, to know if the decompressor you have is the correct type to uncompress the file. In order to get a simple listing of the files contained in an WRA archive, you need to decompress each file in succession, a tedious task at the best of times. This *is* the method WRAptor uses to display files in its archives, and it is very slow! From a cursory examination of the compressed data, the following possible bit breakdown of a normal 9-bit code appears: 876543210 xyyyzzzzz x - Code indicator yyy - Command zzzzz - Dictionary offset If 'x' is clear, then the remaining 8 bits (yyyzzzzz) comprise a standard byte of information. The byte is sent to the output file stream, and also added to the decompressor dictionary. How the dictionary is built is still a mystery. If 'x' is set, then we have a "code", which needs to be decoded as follows: yyy - Command 000 - If 'zzzzz' is non-zero, do a "fill". Dictionary byte offset of value to repeat is in 'zzzzz', repeat length in the next 5 bits 'aaaaa'. if 'zzzzz' is zero, we have a special command. When a '100000000' occurs (code value 256), something special happens, but I don't know what yet. 001 - Dictionary reference. Offset in'zzzzz', length in the next 5 bits 'aaaaa' 010 - ??? 011 - ??? 100 - ??? 101 - ??? 110 - ??? 111 - ??? Most "commands" have 10 bits following, the first 5 are the remainder from the original 9-bit word, the other 5 must be read in separately. The value of 'yyyyy' refers to a position in the decompressor dictionary. The next 5 bits, "aaaaa" represent the "count" value, either how many times to "fill" or how long of an entry we need from the dictionary. As is the case in most LZ-variant compression programs, there should also be several other "commands" defined: - One to increase the dictionary length. This increases the "code" length from 9 bits to 10 (or 10 to 11). - One to "clear" the dictionary when it gets full, and start the code length back over at 9 bits. - One to indicate when the file ends, the "EOF". I suspect it is part of the "256" code from above, but I can't be sure. The LZW compressor, a specific implementation of LZ (of which I don't think WRA is one) uses code 256 to show the "EOF", 257 to increase the dictionary size and 258 to clear the dictionary. I suspect something similar is at work in WRAptor as well, but decoding an unknown format takes time.