mirror of
https://github.com/aaru-dps/docs.git
synced 2025-12-16 19:24:38 +00:00
68 lines
3.4 KiB
Plaintext
68 lines
3.4 KiB
Plaintext
|
|
*** SFX (SelF-eXtracting LHA/LZH compressed files)
|
|
*** Document revision: 1.3
|
|
*** Last updated: March 11, 2004
|
|
*** Compiler/Editor: Peter Schepers
|
|
*** Contributors/sources: Chris Smeets
|
|
|
|
These files are actually LHA archives, except there they have a
|
|
decompressor program prepended to the file, capable of decompressing on
|
|
either a C64 or a C128, independant of the load address. The beginning of
|
|
the file is a BASIC program (with an unusual load address):
|
|
|
|
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
|
|
-----------------------------------------------
|
|
00000: 01 1C 28 1C C6 07 97 32 30 2C 30 3A 8B C2 28 32 <-Note load address
|
|
00010: 30 29 B2 30 A7 FE 02 30 3A 9E C2 28 34 36 29 AC
|
|
00020: 32 35 36 AA 36 36 3A 80 00 3C 1C D0 07 9E C2 28
|
|
00030: 34 34 29 AC 32 35 36 AA 36 36 3A 80 00 00 00 ..
|
|
|
|
which when decoded looks like this:
|
|
|
|
1990 POKE20,0:IFPEEK(20)=0THEN<254><2>0:SYSPEEK(46)*256+66:END
|
|
2000 SYSPEEK(44)*256+66:END
|
|
|
|
This was decoded on a C64... the two codes in line 1990, the <254> and
|
|
<2>0 are not decodable on the C64, but are on the C128. The first line
|
|
checks for whether it is running on a C64 or a 128. If it is a C64, it will
|
|
execute the SYS call line 2000, otherwise it executes the SYS on line 1990.
|
|
|
|
Later on in the header, we have the copyright message. Any SFX should
|
|
have this message.
|
|
|
|
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
|
|
----------------------------------------------- ----------------
|
|
00D20: .. .. .. .. .. .. .. .. .. .. .. 43 36 34 2F 43 ...........C64/C
|
|
00D30: 31 32 38 20 53 45 4C 46 20 45 58 54 52 41 43 54 128 SELF EXTRACT
|
|
00D40: 49 4E 47 20 4C 48 41 52 43 48 49 56 45 0D 43 4F ING LHARCHIVE.CO
|
|
00D50: 50 59 52 49 47 48 54 20 31 39 39 30 20 2D 20 43 PYRIGHT 1990 - C
|
|
00D60: 2E 53 4D 45 45 54 53 0D 54 4F 52 4F 4E 54 4F 2C .SMEETS.TORONTO,
|
|
00D70: 43 41 4E 41 44 41 .. .. .. .. .. .. .. .. .. .. CANADA..
|
|
|
|
I have seen two different versions of the header, one which is 3711 bytes
|
|
long, and the other standard one which is 3721 bytes long. The only way to
|
|
tell them apart is to examine the byte value at offset $0067 into the file.
|
|
If it is $CE, then we have the 3721 byte header. If it is $C4, then it is
|
|
the shorter 3711 byte header. Notice that the difference between the two
|
|
values is 10, the same as the header difference.
|
|
|
|
Typically, at address $0E89 (3721 bytes into the file) or at $0E7F (3711
|
|
bytes in) you will find the beginning of the LHA archive, denoted by two
|
|
bytes and the signature '-LH1-'.
|
|
|
|
00E80: .. .. .. .. .. .. .. .. .. 1E B6 2D 6C 68 31 2D ...........-LH1-
|
|
|
|
*ALL* LHA/LZH archives have this type of signature string in them
|
|
('-lhx-', where x is the type of compression used, with C64 archives being
|
|
1, and most PC archives being 5). The actual archive starts 2 bytes before
|
|
this string is found, and goes to the end of the file. If you want to
|
|
convert them to LHA, you can chop the front end off the file (up to two
|
|
bytes before the -lhx- string), and rename it to an LHA. It will then be a
|
|
normal LHA file.
|
|
|
|
Another way to handle SFX's is to extract them with Star LHA. This
|
|
program handles both LHA and SFX formats, as they are basically the same.
|
|
Extract them as you would an LHA file (StarLHA -x xxxxxxxx.SFX). For more
|
|
information on the LHA/LZH layout, refer to the LHA topic.
|
|
|