# MI_CompressLZ*

## 構文

  `#include <nitro/mi.h>`
  `u32 MI_CompressLZ( const u8 *srcp, u32 size, u8 *dstp );
  u32 MI_CompressLZFast( const u8 *srcp, u32 size, u8 *dstp, u8* work );
  u32 MI_CompressLZEx( const u8 *srcp, u32 size, u8 *dstp );
  u32 MI_CompressLZExFast( const u8 *srcp, u32 size, u8 *dstp, u8* work );
  `

## 引数

srcp | 圧縮するデータが格納されているソースアドレス。
size | 圧縮するソースデータサイズ。
dstp | 圧縮先バッファへのポインタ、ソースデータサイズ以上の領域が必要です。要4バイトアライン。
work | MI_CompressLZ*Fast()系の関数で必要となる圧縮用の一時ワークバッファ。 MI_LZ_FAST_COMPRESS_WORK_SIZEバイトのサイズが必要です。

## 返り値

圧縮データのサイズを返します。
もしも圧縮後のデータがソースファイルよりも大きくなる場合には、圧縮を行なわずに0を返します。

## 説明

データをLZ77圧縮し、指定のメモリ領域に書き込みます。
圧縮先のバッファにはソースデータと同じサイズの領域を用意する必要があります。

サフィックスにFastの付いたAPIでは、スライド辞書の検索時にワークバッファを利用することで、通常の関数と比較して数倍高速に処理されます。
ワークバッファを指定しない形式のAPIではスライド辞書を単純検索していますので、ソースデータによっては完了までに時間がかかる場合があります。

LZ77拡張圧縮( `MI_CompressLZEx*()` )では、通常のLZ77圧縮に比べてより高い圧縮率が期待できますが、最悪の場合の圧縮時間が通常の`MI_CompressLZFast()`での ワーストケースと比較して数倍長くなる事が考えられ、MI_CompressLZFastを使用した方が安定した処理時間での圧縮が可能です。
展開時の速度はどちらの方式でも同程度です。
どちらの圧縮形式でも`MI_UncompressLZ*()`や、`MI_ReadUncompLZ()`で展開することが 可能ですが、NitroSDK4.2より前のSDKを使用しているプログラムでは、LZ77拡張圧縮されたファイルを展開できませんので、ご注意ください。

8bit単位で書き込みますので、NITROの場合はdstpにVRAM上のアドレスを指定することはできません。
srcpにはNITRO/TWL共にVRAM上のアドレスを指定することが可能です。

## 内部動作

システムコール、DMAは使用せずCPUだけで処理します。

## 参照

`MI_UncompressLZ*, MI_ReadUncompLZ, MI_CompressRL, MI_CompressHuffman`

## 履歴

2008/12/05 TWLに関する記述を追加
2007/11/01 LZ77拡張圧縮を追加, MI_CompressLZ*系のAPIリファレンスを統合
2005/02/01 初版