
/********************************************************************
 * 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 */

