LC LZ2: Difference between revisions
m (Long commands dont add +1 to the length) |
m (Added category.) |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{DISPLAYTITLE:LC_LZ2}} | {{DISPLAYTITLE:LC_LZ2}} | ||
LZ2 or LC_LZ2, as named by [[Lunar Compress]], is a lossless data compression format, used by [[Super Mario World]] to compress graphics. It is also used by | LZ2 or LC_LZ2, as named by [[Lunar Compress]], is a lossless data compression format, used by [[Super Mario World]] to compress graphics. It is also used by [[Super Mario World 2: Yoshi's Island]]. | ||
== Compression == | == Compression == | ||
Line 31: | Line 31: | ||
increased by 1 after each write | increased by 1 after each write | ||
100 "Repeat" | 100 "Repeat" | ||
Followed by two bytes ( | Followed by two bytes (big endian byte order) containing address (in the | ||
output buffer) to copy (L+1) bytes from | output buffer) to copy (L+1) bytes from | ||
101 (Unused command) | 101 (Unused command) | ||
Line 40: | Line 40: | ||
CCC: Real command | CCC: Real command | ||
LLLLLLLLLL: Length | LLLLLLLLLL: Length | ||
</pre> | </pre> | ||
Line 58: | Line 57: | ||
[https://fusoya.eludevisibility.org/lc/index.html Lunar Compress], a library by [[FuSoYa]] made to handle loading various game graphics format, including LZ2. | [https://fusoya.eludevisibility.org/lc/index.html Lunar Compress], a library by [[FuSoYa]] made to handle loading various game graphics format, including LZ2. | ||
[[Category:Compression Formats]] |
Latest revision as of 19:50, 24 March 2023
LZ2 or LC_LZ2, as named by Lunar Compress, is a lossless data compression format, used by Super Mario World to compress graphics. It is also used by Super Mario World 2: Yoshi's Island.
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.
Here is a list of commands bits which the LC_LZ2 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 two bytes (big endian byte order) containing address (in the output buffer) to copy (L+1) bytes from 101 (Unused command) 110 (Unused command) 111 "Long length" This command has got a two-byte header: 111CCCLL LLLLLLLL CCC: Real command LLLLLLLLLL: Length
Decompression
During the decompression, the decompressed chunks are outputted into a buffer which is either RAM or SRAM. SMW uses the RAM address $7E:AD00 as its decompression buffer.
Usage
You can use the LC_LZ2 compression to mainly compress graphics. Technically you can compress anything with this format, but graphics is preferred due to their big size. Seeing the SNES isn't fast, the decompression takes a while to finish, so whenever you overuse the compression the loading time will increase.
Other
You can see an LC_LZ2 decompression routine setup at SNES $00:B888. The decompression routine itself is located at SNES $00:B8DE.
External links
Lunar Compress, a library by FuSoYa made to handle loading various game graphics format, including LZ2.