# SVC_UncompressLZ8FromDevice

## 構文

      #include <nitro/os/common/systemCall.h>

      s32 SVC_UncompressLZ8FromDevice( const void* srcp,
                                  void* destp,
                                  const void* paramp,
                                  const MIReadStreamCallbacks* callbacks );

## 引数

srcp | LZ77圧縮データの格納されているソースアドレス
destp | 展開するディスティネーションアドレス
paramp | `MIReadStreamCallbacks` 構造体の `initStream`関数へ渡すパラメータへのアドレス
callbacks | `MIReadStreamCallbacks` 構造体のアドレス

## 返り値

0以上ならば展開したサイズで、0より小さければエラーです。

## 説明

LZ77圧縮データを展開し、指定のメモリ領域に書き込みます。

srcp で指定する圧縮データを展開し、destp で指定する領域に格納されます。

メモリマッピングされていないデバイス上の圧縮データをテンポラリバッファを使わずに直接展開することが出来ます。
バイトアクセスできないRAMにも展開できます。

srcp で指定するデータは '`ntrcomp -l 2`' で圧縮したものとしてください。
srcp の境界制限は `initStream` コールバック関数の実装依存となります。

サンプルコード

    s32 NVRAMi_UncompressLZ8( const u8 *nvram, void *ram, int limit )
    {
        static const MIReadStreamCallbacks cb = {NVRAMi_InitReadStream, NVRAMi_TerminateReadStream,
                                                 NVRAMi_ReadByteStream, NULL, NVRAMi_ReadWordStream};

        return SVC_UncompressLZ8FromDevice( nvram, ram, &limit, &cb );
    }

    s32 NVRAMi_InitReadStream( const u8 *nvram, void *ram, const void *param )
    {
        int limit = *(int*)param;
        u32 comp_header;
        u32 address = (u32)nvram;
        u8  adr[3];
        int size;
        int i;
        s32 retval;

        adr[0] = (u8)(address >> 16);
        adr[1] = (u8)(address >> 8);
        adr[2] = (u8)(address);

        // 命令部4バイト送信
        SPI_Wait();
        NVRAM_SPIChangeMode( SPI_TRANSMODE_CONTINUOUS );
        SPI_Send( NVRAM_INSTRUCTION_READ );
        for (i = 0; i < 3; i++)
        {
            SPI_Wait();
            SPI_Send(adr[i]);
        }

        // preload
        SPI_Wait();
        SPI_Dummy();

        comp_header = NVRAMi_ReadWordStream( nvram );
        retval = comp_header;

        size = comp_header >> 8;
        if ( (int)(nvram + size) > NVRAM_SIZE_MAX ||
             size <= 0 || size > limit )
        {
            retval = -1;
        }

        return retval;
    }

    u8 NVRAMi_ReadByteStream( const u8 *nvram )
    {
        u8 byte;

        SPI_Wait();
        byte = SPI_Receive();

        // preload
        SPI_Dummy();

        return  byte;
    }

    u32 NVRAMi_ReadWordStream( const u8 *nvram )
    {
        u32 word;
        u8* bytep = (u8*)&word;
        int i;

        for (i=0; i<4; i++)
        {
            *bytep++ = NVRAMi_ReadByteStream( NULL );
        }

        return word;
    }

    s32 NVRAMi_TerminateReadStream( const u8 *nvram )
    {
        // 1st dummy read
        SPI_Wait();
        (void)SPI_Receive();

        // 2nd dummy read
        NVRAM_SPIChangeMode(SPI_TRANSMODE_1BYTE);
        SPI_DummyWait();
        (void)SPI_Receive();

        return  0;
    }

## 参照

`SVC_UncompressLZ16FromDevice
`

## 履歴

2007/10/22 初版