LL XX XX LL XX XX LL XXX LL XX XX LLLLLL XX XX Version 1.00 2nd April, 1993 Written by Jonathan Forbes Copyright © 1993, Xenomiga Technology 1 - Distribution This version of LX is freely distributable for non-commercial use, including distribution on the Fred Fish disks; i.e. there is no "shareware" (or other) fee for non-commercial use. Permission is hereby granted to include the unmodified Version 1.00 LX executable by itself (i.e. without this documentation) with any PUBLIC DOMAIN or SHAREWARE package, provided that a brief credit note is included in the program's documentation. Enquiries for licensing LX or its algorithms for COMMERCIAL use should be sent to: Xenomiga Technology 1132 Bay Street Toronto, Ontario M5S 2Z4 Canada 2 - Introduction LX is a fast dearchiver/decompressor for the Commodore Amiga. It is compatible with LZ, Lhunarc, Lharc, LharcA, and LhA (all for the Amiga), and Lharc and LHA for MS-DOS. LX is the third generation of LZH utility released by Xenomiga Technology, following Lhunarc and LZ. LX is also an extremely small program (~ 16K) which makes it ideal for floppy disk users to keep on a terminal disk. Since LX reads and writes data asynchronously, the speed of the source and destination devices (if they are different devices), be they floppy drives, hard drives, or CD-ROM's, does not cripple LX as is common with the other Amiga archivers. This makes LX ideal for use in floppy-to-hard drive installation programs. In fact, this is one of the purposes for which it was written. 3 - Performance 3.1 LX speed LX is, at the time of release, the fastest LZH/LHA dearchiver available for the Amiga. It goes without saying that the decompression routines were written entirely in highly optimised assembly language. LX was written with caching microprocessors in mind, and will perform better the larger the size of your CPU's cache. LX's decompression code should run almost entirely within the cache of the 68040. 3.2 LX/020 LX/020 is a version of LX which has been optimised for the Motorola 68020 and later processors in the 680x0 generation. It has been most optimised for the 68030, since LX was developed on an Amiga 3000, although it will run on a 68020. It will not run on a 68000 or 68010 machine, however. The speed increase is reasonably small (approximately 7% on an A3000), but if you have a 68020 or better, it makes sense to rename LX020 to LX and use that. 4 - System requirements LX requires AmigaDOS 2.0 or later to run. LX/020 requires, in addition to the above, at least a Motorola 68020 CPU. LX will run on an Amiga with 512 KB of RAM or more. LX does NOT require arp.library. 5 - Compatibility LX is intended to be compatible with all other LZH/LHA utilities, and supports many of the Amiga-specific extensions to the standard LZH format. LX can process archive headers of level 0 or 1, but does not process archive headers of level 2, since the presence of such headers is essentially non-existent on the Amiga, and would only incur additional overhead into the program. Note that LZ 1.92 and earlier can only process archive headers of level 0. 6 - Commands LX supports the basic extraction command set: 'e' or 'x' - Extract file(s) from archive This command is used to extract files from an archive. If all files are extracted successfully, LX will EXAMPLES LX x splat.lzh Extracts all files from the archive 'splat.lzh' to the current directory. LX x splat.lzh ram: Extracts all files from the archive 'splat.lzh' to ram: LX x splat.lzh ram: boing* Extracts all files starting with 'boing' to ram: LX x dh1:#? Extracts all archives ending in '.lzh' or '.lha' on dh1: to the current directory. 't' - Test file(s) in archive This command is similar to extract (above), except that no files are created. This command is used to check the integrity of all files in the archive. EXAMPLES LX t splat.lzh Tests all files in the archive 'splat.lzh'. LX t splat.lzh boing* Tests all files starting with 'boing' in the archive 'splat.lzh'. 'l' or 'v' - List or view the contents of an archive This command lists the contents of an archive. EXAMPLES LX v splat.lzh Views all files in the archive 'splat.lzh' LX l splat.lzh Lists all files in the archive 'splat.lzh' The L command provides output similar to the following: Original Packed Ratio Date Time Type CRC Name -------- ------- ----- --------- -------- ----- ---- ------------ 1535835 409839 73.3% 21-Feb-93 22:09:10 -lh5- 9A2E RADDiskImage -------- ------- ----- --------- -------- 1535835 409839 73.3% 20-Mar-93 12:57:26 1 file(s) The V command provides output similar to the following: Original Packed Ratio Date Time Name -------- ------- ----- --------- -------- ------------ 1535835 409839 73.3% 21-Feb-93 22:09:10 RADDiskImage -------- ------- ----- --------- -------- 1535835 409839 73.3% 20-Mar-93 12:57:26 1 file(s) 7 - Options LX supports similar options to the other LZH utilities: -a Preserve attributes [SET by default] Causes LX to restore Amiga file protection flags, if a level 1 archive header is detected. The attributes restored are: r: read w: write e: execute d: delete a: archive p: pure s: script h: hidden If this option is disabled (by using -a0 on the command line), the file protection flags are set to '----rwed' when files are extracted. Note: Archive headers of level 1 identify the operating system on which the files were compressed. On such archives, LX will use '----rwed' if the archive was not compressed using Amiga file attributes. LX will also use '----rwed' if the archive header is level 0. -A Set archive attributes [NOT SET by default] This option causes all files extracted from archives to have the following file attributes: '---arw-d'. If the -a option is also active, then any archives with a level 1 header and the Amiga archive identifier, will be restored to the attributes specified by the archive. All other files will have their attributes set to '---arw-d' as mentioned above. Thus, in order to ensure that ALL extracted files have the '---arw-d' attributes, one must use both the -a0 and the -A option. One may disable the archive bit ('a') by using the -C option (see below). For example, in order to ensure that ALL extracted files have the '----rw-d' attributes, one must use the -a0 -A -C options. -c Confirm files [NOT SET by default] This option causes LX to prompt you before each file is extracted. You will be asked the following: 'SomeFileName': extract? (Yes,No,All,Quit): Pressing 'Y' will cause the file in question to be extracted. 'N' will cause the file in question NOT be extracted (LX will skip to the next file in the archive) 'A' will cause ALL files from then onwards to be extracted (essentially turning off the -c option from then on) 'Q' will cause LX to quit immediately (without extracting any more files from the archive) The prompt is hotkeyed; i.e. one does not need to press the [] key. -C Clear archive bit [NOT SET by default] By default LX sets the archive bit ('a') on all extracted files (for example: '---arw-d') if the archive header is level 0 or does not does not carry the Amiga archive identifier. Specifying this option causes the 'a' bit to be cleared for extracted files; for example: '----rw-d'. -E Touch extracted files [NOT SET by default] When this option is specified, all files extracted from archives will have their modification date set to the present (as opposed to the date stored with the file in the archive). -f Ignore filenotes [NOT SET by default] When this option is specified, LX will not restore filenotes for extracted files. -F Fast progress display [NOT SET by default] This option causes LX to use a single line for all files extracted from an archive, thus removing the need to scroll the display. Since, on a fast Amiga, it can take longer to scroll the display than to extract some files (especially many small files), the use of this option can improve decompression performance. This option also causes LX to skip the blank line it normally inserts between the archive file name and the first file extracted, for a more compacted output. LX does use separate lines (separated by blanks) to display the names of the archives as they are processed, however. -l Lower case filenames [NOT SET by default] This option causes the filenames of all extracted files to be converted to lower case. This option and -u are mutually exclusive. -m Disable interactivity [NOT SET by default] This option supresses any prompting by LX. This option also causes existing files to be automatically overwritten if they already exist. This option is automatically enabled if standard input is not available to LX. -p Pause after loading [NOT SET by default] This option causes LX to wait for the user to press any key before performing any commands. Thus could be useful for users using floppy disks. LX is small enough to fit into RAM quite easily, however. -P Set task priority [NOT SET by default] This option causes LX to set its task priority to the provided value. For example: -p-1 causes LX to run at task priority -1. This can be useful when decompressing data in the background. -q Quiet mode [NOT SET by default] This option suppresses all output from LX. It also disables interactivity (like -m), and causes files to be overwritten automatically if they already exist. -u Upper case filenames [NOT SET by default] This option causes the filenames of all extracted files to be converted to upper case. This option and -l are mutually exclusive. -Qs Do not activate * wildcard [NOT SET by default] By default, LX sets the AmigaDOS 2.0 WILDSTAR flag, which enables the asterisk (*) to be used in pattern matching. LX does not restore this flag to its original state upon exit. The -Qs option causes LX not to set the WILDSTAR flag; this means that unless you have set the WILDSTAR flag yourself, LX will not recognise the asterisk (*) as a wildcard character. 8 - The history behind LX The original Lharc (MS-DOS) was written by Haruyasu Yoshizaki, and uses a compression scheme named "-lh1-". In 1989, I took the public domain source code, "lzhuf.c", and rewrote sections of it in assembly language to produce Lhunarc, the fastest Amiga LZH unarchiver at that time. This was my first attempt at using 68000 assembly language; in fact, part of the purpose of Lhunarc was for me to teach myself 68000 assembly language. In early 1990 I rewrote Lhunarc from scratch in a much more optimised form, having learned an almost unimaginable number of assembly language tricks and optimisations since Lhunarc. I also added the compression algorithms to the program, so that it would be a more complete archiving package. The first version of this program, named LZ 0.80, was released in May 1990, and was much faster than Lhunarc or any other compatible utility. In late 1990 I obtained the source code to the -lh5- compression routines (AR002.ZIP) and used the new algorithms to create a hybrid -lh1-/-lh5- algorithm compatible with the -lh1- compression scheme. Essentially, AR's lazy match evaluation and match finding algorithms were used. This increased compression by a few percent, and sped up compression by a factor of almost 3. This version of LZ was released as version 1.0 in February 1991, and allowed LZ to retain its lead in the compression field. I added the -lh5- compression scheme to LZ soon after, in version 1.80. By mid 1991, LZ 1.92 was released; the latest version of LZ to date. At that point in time, I switched all of my efforts to my commercial Bulletin Board Software package; Xenolink. At the end of 1991, LZ was finally surpassed by another program; LhA, by Stefan Boberg. Like LZ, LhA supported both -lh1- and -lh5-, but sported many more features as well as faster compression and decompression. It also used the -lh1-/-lh5- hybrid compression scheme pioneered by LZ. In December 1991, I resdesigned and rewrote the decompression algorithms of LZ from scratch, with the intention of releasing a significantly faster decompression-only program named LX. However, Xenolink was taking up so much of my software development time, that LX was put on the back-burner at this point. In January, 1993, I took off a couple of weeks off from Xenolink development to complete the remaining portions of LX, and this is the program you are looking at now, more or less; I just never got around to writing this document until now (April!). 9 - Registered owners of LZ A big thank-you to all registered users of LZ. Had it not been for the extremely positive response to LZ, I would not have started writing LX in the first place. In fact, I am looking into the possibility of writing a much more compressive archiving program; more compressive than ARJ 2.39b or PKZip 2.04. However, that'll have to wait, since all of my efforts will continue to be concentrated in Xenolink for the next long while.