LC_LZ5

From SMWiki
Jump to: navigation, search

LC_LZ5, as named by Lunar Compress, is a lossless data compression format, used by Super Mario Kart to compress graphics and other data. The LC_LZ5 compression format is a slight enhancement of the LC_LZ2 compression format, due to new commands.

Compression

The compressed data consists of "chunks", each with a header:

bits
76543210
CCCLLLLL
CCC:   Command bits
LLLLL: Length

If the header byte is $FF, the end of the compressed data has been reached, and decompression will be aborted.

The commands mostly remain their LC_LZ2 commands. However, there are new commands too. Here is a list of commands bits which the LC_LZ5 decompression function can use during the decompression:

000    "Direct Copy"
       Followed by (L+1) bytes of data
001    "Byte Fill"
       Followed by one byte to be repeated (L+1) times
010    "Word Fill"
       Followed by two bytes. Output first byte, then second, then first,
       then second, etc. until (L+1) bytes has been outputted
011    "Increasing Fill"
       Followed by one byte to be repeated (L+1) times, but the byte is
       increased by 1 after each write
100    "Repeat"
       Followed by a word (little-endian) containing address relative 
       to the output buffer's first byte to copy (L+1) bytes from.
       Basically it's this math: (Output buffer offset + word value)
101    "XOR Repeat"
       Same concept as above, except all the copied bytes are getting
       XOR'd by the value $FF.
110    "Negative Repeat", followed by a byte subtracted by the CURRENT index
       to the output buffer, to copy (L+1) bytes from.
       Basically it's this math: (Output buffer offset's index - byte value)
111    "Long length"
       This command has got a two-byte header:
       111CCCLL LLLLLLLL
       CCC:        Real command
       LLLLLLLLLL: Length
Long Length-exclusive command
111    "Negative XOR repeat"
       Same concept as "Negative Repeat", except all the copied bytes
       are getting XOR'd by the value $FF.

Seeing that the long length command uses ten bits for its length, the maximum length is 1024 bytes/1kB, while the normal length is 32 bytes.

Decompression

During the decompression, the decompressed chunks are outputted into a buffer which is either RAM or SRAM.

Usage

You can use the LC_LZ5 compression to mainly compress graphics and data. Technically you can compress anything with this format.

Personal tools