
/********************************************************************
 * Workfile   : util.c
 * Project    : Kraken
 * Author     : khwoo
 * Description: Commands Template
 *
 *                                 Copyright (c) 2009 HUMAX Co., Ltd.
 *                                               All rights reserved.
 ********************************************************************/

#define _______________________________________________________________________
#define ____HEADER_FILES____
#include "htype.h"
#include "util.h"

#define _______________________________________________________________________
#define ____MACRO_DEFINITION____


#define _______________________________________________________________________
#define ____EXTERNAL_VARIABLE_DEFINITION____


#define _______________________________________________________________________
#define ____EXTERNAL_FUNCTION_DEFINITION____


#define _______________________________________________________________________
#define ____TYPE_DEFINITION____


#define _______________________________________________________________________
#define ____GLOBAL_VARIABLE_DEFINITION____


#define _______________________________________________________________________
#define ____STATIC_VARIABLE_DEFINITION____
const static unsigned short CRC_16_TABLE[256] =
{
	0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,
	0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,
	0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,
	0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,
	0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40,
	0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
	0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641,
	0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
	0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
	0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
	0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41,
	0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
	0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41,
	0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
	0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,
	0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
	0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240,
	0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
	0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41,
	0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
	0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,
	0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
	0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640,
	0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
	0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241,
	0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
	0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
	0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
	0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40,
	0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
	0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641,
	0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
};

const static unsigned long	_crc32Tbl[256] =
{
	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
	0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
	0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
	0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
	0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
	0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
	0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
	0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
	0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
	0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
	0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
	0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
	0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
	0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
	0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
	0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
	0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
	0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
	0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
	0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
	0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
	0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
	0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
	0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
	0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
	0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
	0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
	0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
	0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
	0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
	0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
	0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
	0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
	0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
	0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
	0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
	0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
	0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
	0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
	0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
	0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
	0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
};	/* _crc32Tbl */

#define N_BIT_Byte		8
#define SIZE_BitBuf 	(N_BIT_Byte * sizeof(_bitBuf))
#define N_BIT_Dic		13
#define SIZE_Dic		(1 << N_BIT_Dic)
#define MAX_Match		256
#define THRESHOLD		3
#define MAX_ByteNum 	255
#define NC				(MAX_ByteNum + MAX_Match+2-THRESHOLD)
#define N_BIT_C 		9
#define N_BIT_Code		16


#define NP				(N_BIT_Dic+1)
#define NT				(N_BIT_Code+3)
#define PBIT			4				// smallest integer such that (1U<<PBIT) > NP
#define TBIT			5				// smallest integer such that (1U<<TBIT) > NT
#if NT>NP
	#define NPT 		NT
#else
	#define NPT 		NP
#endif

extern	unsigned long	_compDataSize ;			// compressed data size
extern	unsigned long	_orgDataSize ;			// original data size
extern	unsigned char	_decompBuf[0x8000] ;	// decompress buffer

unsigned char	_cLen[NC], _ptLen[NPT + 100], *_orgData, _dicBuf[SIZE_Dic];
unsigned short	_left[2*NC-1], _right[2*NC-1], _blkSize, _cTbl[4096],
				_ptTbl[256], _bitBuf, _subBitBuf,
				_start[18], _count[17], _weight[17];
short			_bitCount;
unsigned short	_compSize;


#define _______________________________________________________________________
#define ____STATIC_FUNCTION_DEFINITION____


#define _______________________________________________________________________
#define ____STATIC_FUNCTION_BODY____


#define _______________________________________________________________________
#define ____GLOBAL_FUNCTION_BODY____

unsigned short GetCRC16(unsigned char *BufferPtr, unsigned long NumberOfByte)
{
	unsigned short		CRC ;

	CRC = 0;
	while (NumberOfByte--)
	{
		CRC = (CRC >> 8) ^ CRC_16_TABLE[(CRC ^ *BufferPtr++) & 0xff] ;
	}

	return CRC ;
} /* GetCrc16 */

unsigned short GetCRC16Fast(void *inP, unsigned long NumberOfByte)
{
	unsigned short		CRC ;
	unsigned long *aligned_4;
	unsigned long pre_count, end_count,loop_4;
	unsigned long data;
	unsigned char *BufferPtr = inP;

	if (NumberOfByte < 4)
	{
		return GetCRC16(inP, NumberOfByte);
	}
	pre_count = ((unsigned long)BufferPtr & 0x03);
	if(pre_count!=0)
		pre_count = 4-pre_count;
	aligned_4 = (unsigned long *)((unsigned long)BufferPtr + pre_count);
	loop_4 = (NumberOfByte-pre_count)>>2;
	end_count = NumberOfByte-(loop_4<<2)-pre_count;

	CRC=0;
	while((pre_count--)!=0)
	{
		CRC = (CRC >> 8) ^ CRC_16_TABLE[(CRC ^ *BufferPtr++) & 0xff] ;
	}

	BufferPtr=(unsigned char *)aligned_4+(loop_4<<2);

	while((loop_4--)!=0)
	{
		data= *aligned_4++;
#if defined(CONFIG_BIG_ENDIAN)
		CRC = (CRC >> 8) ^ CRC_16_TABLE[(CRC ^ (data>>24)) & 0xff];
		CRC = (CRC >> 8) ^ CRC_16_TABLE[(CRC ^ (data>>16)) & 0xff];
		CRC = (CRC >> 8) ^ CRC_16_TABLE[(CRC ^ (data>> 8)) & 0xff];
		CRC = (CRC >> 8) ^ CRC_16_TABLE[(CRC ^ (data	)) & 0xff];
#else
		CRC = (CRC >> 8) ^ CRC_16_TABLE[(CRC ^ (data	)) & 0xff];
		CRC = (CRC >> 8) ^ CRC_16_TABLE[(CRC ^ (data>> 8)) & 0xff];
		CRC = (CRC >> 8) ^ CRC_16_TABLE[(CRC ^ (data>>16)) & 0xff];
		CRC = (CRC >> 8) ^ CRC_16_TABLE[(CRC ^ (data>>24)) & 0xff];
#endif
	}

	while((end_count--)!=0)
	{
		CRC = (CRC >> 8) ^ CRC_16_TABLE[(CRC ^ *BufferPtr++) & 0xff];
	}

	return CRC ;

} /* GetCrc16 */

unsigned long GetCrc32(unsigned char *p, unsigned long n)
{
	unsigned long	crc, *tbl;
	unsigned long	len;

	len = n;

	crc = 0xFFFFFFFF;
	tbl = (unsigned long*)_crc32Tbl;
	while (n--)
	{
		  crc = (crc >> 8) ^ tbl[(crc ^ *p) & 0xff];
		  p++;
	}
	return ~crc;
} /* GetCrc32 */

unsigned long GetCRC32Fast(void *inP, unsigned long NumberOfByte)
{
	register unsigned long		CRC ;
	unsigned long *aligned_4;
	unsigned long pre_count, end_count,loop_4;
	unsigned long data;
	unsigned char *BufferPtr = inP;

	if (NumberOfByte < 4)
	{
		return GetCrc32(inP, NumberOfByte);
	}
	pre_count = ((unsigned long)BufferPtr & 0x03);
	if(pre_count!=0)
		pre_count = 4-pre_count;
	aligned_4 = (unsigned long *)((unsigned long)BufferPtr + pre_count);
	loop_4 = (NumberOfByte-pre_count)>>2;
	end_count = NumberOfByte-(loop_4<<2)-pre_count;

	CRC = 0xFFFFFFFF;
	while((pre_count--)!=0)
	{
		CRC = (CRC >> 8) ^ _crc32Tbl[(CRC ^ *BufferPtr++) & 0xff] ;
	}

	BufferPtr=(unsigned char *)aligned_4+(loop_4<<2);

	while((loop_4--)!=0)
	{
		data= *aligned_4++;
#if defined(CONFIG_BIG_ENDIAN)
		CRC = (CRC >> 8) ^ _crc32Tbl[(CRC ^ (data>>24)) & 0xff];
		CRC = (CRC >> 8) ^ _crc32Tbl[(CRC ^ (data>>16)) & 0xff];
		CRC = (CRC >> 8) ^ _crc32Tbl[(CRC ^ (data>> 8)) & 0xff];
		CRC = (CRC >> 8) ^ _crc32Tbl[(CRC ^ (data	 )) & 0xff];
#else
		CRC = (CRC >> 8) ^ _crc32Tbl[(CRC ^ (data	 )) & 0xff];
		CRC = (CRC >> 8) ^ _crc32Tbl[(CRC ^ (data>> 8)) & 0xff];
		CRC = (CRC >> 8) ^ _crc32Tbl[(CRC ^ (data>>16)) & 0xff];
		CRC = (CRC >> 8) ^ _crc32Tbl[(CRC ^ (data>>24)) & 0xff];
#endif
	}

	while((end_count--)!=0)
	{
		CRC = (CRC >> 8) ^ _crc32Tbl[(CRC ^ *BufferPtr++) & 0xff] ;
	}

	return ~CRC ;

} /* GetCrc16 */


unsigned short Get12Bits(unsigned char * base)
{
	unsigned short temp = 0 ;

	temp |= *(base + 0) ;
	temp <<= 8 ;
	temp |= *(base + 1) ;

	return temp & 0x0FFF ;
} /* Get12Bits */

unsigned short Get16Bits(unsigned char *base)
{
	unsigned short temp = 0 ;

	temp |= *(base + 0) ;
	temp <<= 8 ;
	temp |= *(base + 1) ;

	return temp ;
} /* Get16Bits */

unsigned long  Get24Bits(unsigned char *base)
{
	unsigned long temp = 0 ;

	temp |= *(base + 0) ;
	temp <<= 8 ;
	temp |= *(base + 1) ;
	temp <<= 8 ;
	temp |= *(base + 2) ;

	return temp ;
} /* Get24Bits */

unsigned long Get32Bits(unsigned char *base)
{
	unsigned long temp = 0 ;

	temp |= *(base + 0) ;
	temp <<= 8 ;
	temp |= *(base + 1) ;
	temp <<= 8 ;
	temp |= *(base + 2) ;
	temp <<= 8 ;
	temp |= *(base + 3) ;

	return temp ;
} /* Get32Bits */

unsigned short SWAP16(unsigned short A)
{
	return (((A >> 8) | (A << 8)));
}

unsigned int SWAP32(unsigned long A)
{
	return ((A << 24) | ((A << 8) &  0xFF0000) | ((A >> 8) &  0xFF00) |(A >> 24));
}

void MakeTbl(unsigned short nChar, unsigned char *bitLen, unsigned short tblBits, unsigned short *tbl)
{
	unsigned short	*wp, *wpp, *wppp, i, k, avail, mask;
	unsigned short	len, ch, jutBits, nextCode;
	unsigned char	*bp;

	for (wp=&_count[1],i=1; i<=16; i++)
		*wp++ = 0;
	for (wp=_count, bp=bitLen, i=0; i<nChar; i++)
		wp[*bp++]++;

	for (wp=&_start[1],wpp=&_count[1],*wp=0,i=1,k=15; i<=16; i++,k--,wp++)
		wp[1] = *wp + (*wpp++ << k);

	if (_start[17] != (unsigned short)(1U << 16))
		printf("\n\nDecompression error: BAD TABLE\r\n\r\n");

	jutBits = 16-tblBits;

	for (wp=&_start[1],wpp=&_weight[1],i=1,k=tblBits-1; i<=tblBits; i++,k--)
	{
		*wp >>= jutBits;
		wp++;
		*wpp++ = 1U << k;
	}

	for (k=16-i,wp=&_weight[i]; i<=16; i++,k--)
		*wp++ = 1U << k;

	i = _start[tblBits+1] >> jutBits;
	if (i != (unsigned short)(1U << 16))
	{
		k = 1U << tblBits;
		while (i!=k)
			tbl[i++] = 0;
	}

	avail = nChar;
	mask = 1U << (15-tblBits);
	wpp = _right;
	wppp = _left;
	for (ch=0,bp=bitLen; ch<nChar; ch++)
	{
		if ((len = *bp++) == 0)
			continue;

		k = _start[len];
		nextCode = k + _weight[len];

		if (len <= tblBits)
		{
			for (wp=tbl+k; k<nextCode; k++)
				*wp++ = ch;
		}
		else
		{
			wp = tbl + (k >> jutBits);
			i = len-tblBits;
			while (i != 0)
			{
				if (*wp == 0)
				{
					wpp[avail] = wppp[avail] = 0;
					*wp = avail++;
				}
				wp = (k&mask ? wpp : wppp) + *wp;
				k <<= 1;
				i--;
			}
			*wp = ch;
		}
		_start[len] = nextCode;
	}
} /* MakeTbl */


void FillBuf(unsigned short n)	/* Shift _bitBuf n bits left, read n bits */
{
	_bitBuf <<= n;
	while (n > _bitCount)
	{
		n -= _bitCount;
		_bitBuf |= _subBitBuf << n;
		if (_compSize != 0)
		{
			_compSize--;
			_subBitBuf = *_orgData++;
		}
		else
			_subBitBuf = 0;
		_bitCount = N_BIT_Byte;
	}
	_bitCount -= n;
	_bitBuf |= _subBitBuf >> _bitCount;
} /* FillBuf */


unsigned short GetBits(unsigned short n)
{
	unsigned short	x;

	x = _bitBuf >> (SIZE_BitBuf-n);
	FillBuf(n);

	return x;
} /* GetBits */


void ReadPtLen(signed short nn, signed short nBit, signed short iSpecial)
{
	signed short	i,c,n;
	unsigned short	mask, *wp;
	unsigned char	*bp;

	n = GetBits(nBit);
	if (n == 0)
	{
		c = GetBits(nBit);

		for (bp=_ptLen,i=0; i<nn; i++)
			*bp++ = 0;
		for (wp=_ptTbl,i=0; i<256; i++)
			*wp++ = c;
	}
	else
	{
		i = 0;
		bp = _ptLen;
		while (i < n)
		{
			c = _bitBuf >> (SIZE_BitBuf-3);
			if (c == 7)
			{
				mask = 1U << (SIZE_BitBuf-1-3);
				while (mask & _bitBuf)
				{
					mask >>= 1;
					c++;
				}
			}
			FillBuf(c<7 ? 3 : c-3);
			bp[i++] = (unsigned char)c;
			if (i == iSpecial)
			{
				c = GetBits(2);
				while (--c >= 0)
					bp[i++] = 0;
			}
		}
		while (i<nn)
			bp[i++] = 0;
		MakeTbl(nn, bp, 8, _ptTbl);
	}
} /* ReadPtLen */


void ReadCLen(void)
{
	signed short	i, c, n;
	unsigned short	mask, *wp, *wpp;
	unsigned char	*bp, *bpp;

	n = GetBits(N_BIT_C);
	bp = _cLen;
	if (n == 0)
	{
		c = GetBits(N_BIT_C);
		for (i=0; i<NC; i++)
			*bp++ = 0;
		for (wp=_cTbl,i=0; i<4096; i++)
			*wp++ = c;
	}
	else
	{
		i = 0;
		bpp = _ptLen;
		wp = _right;
		wpp = _left;
		while (i < n)
		{
			c = _ptTbl[_bitBuf>>(SIZE_BitBuf-8)];
			if (c >= NT)
			{
				mask = 1U << (SIZE_BitBuf-1-8);
				do
				{
					c = (_bitBuf & mask) ? wp[c] : wpp[c];
					mask >>= 1;
				} while (c >= NT);
			}
			FillBuf(bpp[c]);
			if (c <= 2)
			{
				if (c == 0) c = 1;
				else if (c == 1) c = GetBits(4) + 3;
				else		c = GetBits(N_BIT_C) + 20;

				while (--c >= 0)
					bp[i++]=0;
			}
			else
				bp[i++] = c-2;
		}
		while (i < NC)
			bp[i++] = 0;
		MakeTbl(NC, bp, 12, _cTbl);
	}
} /* ReadCLen */


unsigned short DecodeC(void)
{
	unsigned short	i, mask, *wp, *wpp;

	if (_blkSize == 0)
	{
		_blkSize = GetBits(16);
		ReadPtLen(NT, TBIT, 3);
		ReadCLen();
		ReadPtLen(NP, PBIT, (unsigned short)-1);
	}
	_blkSize--;
	i = _cTbl[_bitBuf >> (SIZE_BitBuf-12)];
	if (i >= NC)
	{
		mask = 1U << (SIZE_BitBuf-1-12);
		wp = _right;
		wpp = _left;
		do
		{
			i = (_bitBuf & mask) ? wp[i] : wpp[i];
			mask >>= 1;
		} while (i >= NC);
	}
	FillBuf(_cLen[i]);

	return i;
} /* DecodeC */


unsigned short DecodeP(void)
{
	unsigned short	i, mask, *wp, *wpp;

	i = _ptTbl[_bitBuf >> (SIZE_BitBuf-8)];
	if (i >= NP)
	{
		mask = 1U << (SIZE_BitBuf-1-8);
		wp = _right;
		wpp = _left;
		do
		{
			i = (_bitBuf & mask) ? wp[i] : wpp[i];
			mask >>= 1;
		} while (i >= NP);
	}
	FillBuf(_ptLen[i]);
	if (i != 0)
		i = (1U << (i-1)) + GetBits(i-1);

	return i;
} /* DecodeP */


unsigned char *DecompressData(unsigned char *data)
{
	signed short	rem, n, i, r, c;	// rem: remaining unsigned chars to copy
	unsigned char	*dicBuf, *decompBuf;
	unsigned short	orgSize;

	_orgData	= data;
	orgSize		= (unsigned short)_orgDataSize;
	_compSize	= (unsigned short)_compDataSize;
	decompBuf	= _decompBuf;

	_bitBuf = _subBitBuf = 0;
	_bitCount = 0;
	FillBuf(SIZE_BitBuf);
	_blkSize = 0;
	rem = 0;
	i = 0;

	while (orgSize != 0)
	{
		dicBuf = _dicBuf;

		n = (orgSize > SIZE_Dic) ? SIZE_Dic : orgSize;

		r = 0;
		while (--rem >= 0)
		{
			dicBuf[r] = dicBuf[i];
			i = (i+1) & (SIZE_Dic-1);
			if (++r == n)
				goto NEXT;
		}

		while(1)
		{
			c = DecodeC();
			if (c <= MAX_ByteNum)
			{
				dicBuf[r] = (unsigned char)c;
				if (++r == n)
					goto NEXT;
			}
			else
			{
				rem = c - (MAX_ByteNum+1-THRESHOLD);
				i = (r-DecodeP()-1) & (SIZE_Dic-1);
				while (--rem >= 0)
				{
					dicBuf[r] = dicBuf[i];
					i = (i+1) & (SIZE_Dic-1);
					if (++r == n)
						goto NEXT;
				}
			}
		}

		NEXT:

		for (r=0; r<n; r++)
			*decompBuf++ = *dicBuf++;

		orgSize -= n;
	}

//	DSI_printf(0, "Decomp end\r\n");

	return _decompBuf;
} /* Decompress */

