//==================================================================== // IrisUTL.h // ユーティリティライブラリ // // Copyright (C) 2003 NINTENDO Co.,Ltd. //==================================================================== #ifndef _IRIS_UTL_H #define _IRIS_UTL_H #ifdef __cplusplus extern "C" { #endif #include #include //====================================================================== // クリア & コピー //====================================================================== //---------------------------------------------------------------------- // CPU 16bitクリア // //・CPUにて16bitデータでクリアします。 // //・引数: // data クリアデータ // destp デスティネーションアドレス // size クリアサイズ // //・戻り値:なし //---------------------------------------------------------------------- void UTL_CpuClear16(u32 data, void *destp, s32 size); //---------------------------------------------------------------------- // CPU 16bitコピー // //・CPUにて16bit幅でコピーします。 // //・引数: // srcp ソースアドレス // destp デスティネーションアドレス // size 転送サイズ // //・戻り値:なし //---------------------------------------------------------------------- void UTL_CpuCopy16(const void *srcp, void *destp, s32 size); //---------------------------------------------------------------------- // CPU 32bitクリア // //・CPUにて32bitデータでクリアします。 // //・引数: // data クリアデータ // destp デスティネーションアドレス // size クリアサイズ // //・戻り値:なし //---------------------------------------------------------------------- void UTL_CpuClear32(u32 data, void *destp, s32 size); //---------------------------------------------------------------------- // CPU 32bitコピー // //・CPUにて32bit幅でコピーします。 // //・引数: // srcp ソースアドレス // destp デスティネーションアドレス // size 転送サイズ // //・戻り値:なし //---------------------------------------------------------------------- void UTL_CpuCopy32(const void *srcp, void *destp, s32 size); //---------------------------------------------------------------------- // CPU 高速クリア // //・CPUにて32bitデータで高速にクリアします。 //・オーバーフローしない範囲では32Byte単位の複数ストア命令が使用されます。 // //・引数: // data クリアデータ // destp デスティネーションアドレス // size クリアサイズ // //・戻り値:なし //---------------------------------------------------------------------- void UTL_CpuClearFast(u32 data, void *destp, s32 size); //---------------------------------------------------------------------- // CPU 高速コピー // //・CPUにて32bit幅で高速にコピーします。 //・オーバーフローしない範囲では32Byte単位の複数ロード/ストア命令が使用されます。 // //・引数: // srcp ソースアドレス // destp デスティネーションアドレス // size 転送サイズ // //・戻り値:なし //---------------------------------------------------------------------- void UTL_CpuCopyFast(const void *srcp, void *destp, s32 size); //---------------------------------------------------------------------- // データのスワップ(ワード/バイト) // //・setDataとdestpが指す先のデータをスワップします。 //・プロセッサ間やモジュール間で共有リソースを排他制御するための // スピンロック等を実現することができます。 // //・引数: // setData セットするデータ // destp スワップ先のポインタ // //・戻り値:スワップ先へ直前に格納されていた値 // //※但し、メインメモリに対してはキャッシュ経由でなければ // バイトアクセスはできないことに注意して下さい。 // ですので、メインメモリ上では基本的に UTL_SwapWord() を使用して下さい。 //---------------------------------------------------------------------- s32 UTL_SwapWord(u32 setData, volatile u32 *destp); u8 UTL_SwapByte(u32 setData, volatile u8 *destp); //====================================================================== // 圧縮データ展開 //====================================================================== //---------------------------------------------------------------------- // Bit圧縮データ展開 // //・0固定のビットを詰めたデータを展開します。 //・ソースアドレスにメインメモリを指定する場合は // データキャッシュを有効にする必要があります。 //・デスティネーションアドレスは4Byte境界に合わせて下さい。 // //・引数: // void *srcp ソースアドレス // void *destp デスティネーションアドレス // UnPackBitsParam *paramp UnPackBitsParam構造体データのアドレス // //・UnPackBitsParam構造体 // u16 srcNum ソースデータ・バイト数 // u8 srcBitNum 1ソースデータ・ビット数 // u8 destBitNum 1デスティネーションデータ・ビット数 // u32 destOffset:31 ソースデータに加算するオフセット数 // destOffset0_On:1 0のデータにオフセットを加算するか否かのフラグ // //・戻り値:なし //---------------------------------------------------------------------- void UTL_UnPackBits(const void *srcp, void *destp, UnPackBitsParam *paramp); //---------------------------------------------------------------------- // LZ77圧縮データ8bit展開 // //・LZ77圧縮データを展開し、8bit単位で書き込みます。 //・ソースアドレス、デスティネーションアドレスともに、メインメモリを // 指定する場合はデータキャッシュを有効にする必要があります。 //・VRAMに直接展開することはできません。 //・圧縮データのサイズが4の倍数にならなかった場合は // 出来るだけ0で詰めて調整して下さい。 //・ソースアドレスは4Byte境界に合わせて下さい。 // //・引数: // void *srcp ソースアドレス // void *destp デスティネーションアドレス // //・データヘッダ // u32 :4 予約 // compType:4 圧縮タイプ( = 1) // destSize:24 展開後のデータサイズ // //・フラグデータフォーマット // u8 flags 圧縮/無圧縮フラグ // (0, 1) = (無圧縮データ, 圧縮データ) //・コードデータフォーマット(Big Endian) // u16 length:4 展開データ長 - 3(一致長3Byte以上時のみ圧縮) // offset:12 一致データオフセット - 1 // //・戻り値:なし //---------------------------------------------------------------------- void UTL_UnCompLZ77Byte(const void *srcp, void *destp); //---------------------------------------------------------------------- // LZ77圧縮データ16bit展開 // //・LZ77圧縮データを展開し、16bit単位で書き込みます。 //・データTCMやメインメモリにも展開できますが、UTL_UnCompLZ77Byte() // より低速です。 //・ソースアドレスにメインメモリを指定する場合は // データキャッシュを有効にする必要があります。 //・圧縮データは一致文字列を2Byte以前より検索したものにして下さい。 //・圧縮データのサイズが4の倍数にならなかった場合は // 出来るだけ0で詰めて調整して下さい。 //・ソースアドレスは4Byte境界に合わせて下さい。 // //・引数: // void *srcp ソースアドレス // void *destp デスティネーションアドレス // //・データヘッダ // u32 :4 予約 // compType:4 圧縮タイプ( = 1) // destSize:24 展開後のデータサイズ // //・フラグデータフォーマット // u8 flags 圧縮/無圧縮フラグ // (0, 1) = (無圧縮データ, 圧縮データ) //・コードデータフォーマット(Big Endian) // u16 length:4 展開データ長 - 3(一致長3Byte以上時のみ圧縮) // offset:12 一致データオフセット( >= 2) - 1 // //・戻り値:なし //---------------------------------------------------------------------- void UTL_UnCompLZ77Short(const void *srcp, void *destp); //---------------------------------------------------------------------- // ハフマン圧縮データ展開 // //・ハフマン圧縮データを展開し、32bit単位で書き込みます。 //・ソースアドレスにメインメモリを指定する場合は // データキャッシュを有効にする必要があります。 //・圧縮データのサイズが4の倍数にならなかった場合は // 出来るだけ0で詰めて調整して下さい。 //・ソースアドレスは4Byte境界に合わせて下さい。 // //・引数: // void *srcp ソースアドレス // void *destp デスティネーションアドレス // //・データヘッダ // u32 bitSize:4 1データ・ビットサイズ(通常 4|8) // compType:4 圧縮タイプ( = 2) // destSize:24 展開後のデータサイズ // //・ツリーテーブル // u8 treeSize ツリーテーブルサイズ/2 - 1 // TreeNodeData nodeRoot ルートノード // // TreeNodeData nodeLeft ルート左ノード // TreeNodeData nodeRight ルート右ノード // // TreeNodeData nodeLeftLeft 左左ノード // TreeNodeData nodeLeftRight 左右ノード // // TreeNodeData nodeRightLeft 右左ノード // TreeNodeData nodeRightRight 右右ノード // // ・ // ・ // // この後に圧縮データ本体 // //・TreeNodeData構造体 // u8 nodeNextOffset:6 次ノードデータへのオフセット - 1(2Byte単位) // rightEndFlag:1 右ノード終了フラグ // leftEndzflag:1 左ノード終了フラグ // 終了フラグがセットされている場合 // 次ノードにデータがある // //・戻り値:なし //---------------------------------------------------------------------- void UTL_UnCompHuffman(const void *srcp, void *destp); //---------------------------------------------------------------------- // ランレングス圧縮データ8bit展開 // //・ランレングス圧縮データを展開し、8bit単位で書き込みます。 //・ソースアドレス、デスティネーションアドレスともに、メインメモリを // 指定する場合はデータキャッシュを有効にする必要があります。 //・VRAMに直接展開することはできません。 //・圧縮データのサイズが4の倍数にならなかった場合は // 出来るだけ0で詰めて調整して下さい。 //・ソースアドレスは4Byte境界に合わせて下さい。 // //・引数: // void *srcp ソースアドレス // void *destp デスティネーションアドレス // //・データヘッダ // u32 :4 予約 // compType:4 圧縮タイプ( = 3) // destSize:24 展開後のデータサイズ // //・フラグデータフォーマット // u8 length:7 展開データ長 - 1(無圧縮時) // 展開データ長 - 3(連続長3Byte以上時のみ圧縮) // flag:1 (0, 1) = (無圧縮データ, 圧縮データ) // //・戻り値:なし //---------------------------------------------------------------------- void UTL_UnCompRLByte(const void *srcp, void *destp); //---------------------------------------------------------------------- // ランレングス圧縮データ16bit展開 // //・ランレングス圧縮データを展開し、16bit単位で書き込みます。 //・データTCMやメインメモリにも展開できますが、UTL_UnCompRLByte() // より低速です。 //・ソースアドレスにメインメモリを指定する場合は // データキャッシュを有効にする必要があります。 //・圧縮データのサイズが4の倍数にならなかった場合は // 出来るだけ0で詰めて調整して下さい。 //・ソースアドレスは4Byte境界に合わせて下さい。 // //・引数: // void *srcp ソースアドレス // void *destp デスティネーションアドレス // //・データヘッダ // u32 :4 予約 // compType:4 圧縮タイプ( = 3) // destSize:24 展開後のデータサイズ // //・フラグデータフォーマット // u8 length:7 展開データ長 - 1(無圧縮時) // 展開データ長 - 3(連続長3Byte以上時のみ圧縮) // flag:1 (0, 1) = (無圧縮データ, 圧縮データ) // //・戻り値:なし //---------------------------------------------------------------------- void UTL_UnCompRLShort(const void *srcp, void *destp); #ifdef __cplusplus } #endif #endif // _IRIS_UTL_H