⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arith_encode_for_tp.h

📁 基于ADI BLACKFIN的jbig压缩和解压缩程序
💻 H
字号:
.extern _jbg_lsz, _jbg_nmps, _jbg_nlps;


// Arguments: 
// p0:arithe_encode_state

// p5: cx

// r3: pix

	POINT_TO_ANY(p1, _jbg_lsz);

	PST_CX = p0 + CX;
	
	PST_CX += 20;
	
	ST_CX = b[PST_CX](z);
	
	r2 = ST_CX;
	
	bitclr(r2, 7);
	
	_SS = r2;
	
	r7 = r3 + r3(ns) || A_REG = [PA_REG];
	
	r7 = r7 >> 1 || C_REG = [PC_REG];
	
	CT = [PCT];
	
	BUF = [PBUF];
	
//	_SS = _SS << 1;
	
	JBG_LSZ = JBG_LSZ + (_SS << 1);
	
	r5 = ST_CX >> 7 || LSZ = w[JBG_LSZ](z);
	
	cc = r7 == r5;
	
//	_SS = _SS >> 1;
	
	if cc jump PROCESS_MPS_TP;		// The two bits equal implies a more probable symbol
	
	// Process less probable symbol
	
	POINT_TO_ANY(p3, _jbg_nlps);
	
	JBG_NLPS = JBG_NLPS + _SS;
	
	A_REG = A_REG - LSZ(ns) || r6 = b[JBG_NLPS](z);
	
	cc = A_REG < LSZ;
	
	if cc jump LPS_EXCHANGE_TP;
	
	C_REG = C_REG + A_REG;
	
	A_REG = LSZ;
	
LPS_EXCHANGE_TP:

	r5 = 0x80;
	
	ST_CX = ST_CX & r5;
	
	ST_CX = ST_CX ^ r6;
	
	jump END_ENCODE_SYMBOL_TP;
	
	
PROCESS_MPS_TP:

	A_REG = A_REG - LSZ;
	
	r5 = 0x8000(z);
	
	cc = A_REG < r5;
	
	if !cc jump FIN_TP;
	
	POINT_TO_ANY(p3, _jbg_nmps);
	
	JBG_NMPS = JBG_NMPS + _SS;
	
	cc = A_REG < LSZ;
	
	if !cc jump MPS_EXCHANGE_TP;
	
	C_REG = A_REG + C_REG;
	
	A_REG = LSZ;
	
MPS_EXCHANGE_TP:

	ST_CX = ST_CX >> 7 || r6 = b[JBG_NMPS](z);
	
	ST_CX <<= 7;
	
	ST_CX = ST_CX | r6;
	
END_ENCODE_SYMBOL_TP:

	b[PST_CX] = ST_CX;
	
	r0 = 0xffff(z);
	
	r0.h = 7;
	
	CONST_ZERO = CONST_ZERO - CONST_ZERO(ns) || SC = [PSC];
	
	CONST_FF = 0xff(z);
	
	CONST_8000 = 0x8000(z);
	
	CUR_SDE = CUR_SDE_SAVE;
	
RENORM_TP:

	A_REG <<= 1;
	
	C_REG <<= 1;
	
	CT += -1;
	
	cc = CT <= 0;
	
	if cc jump RENORM_LOOP_TP;
	
	cc = A_REG < CONST_8000;
	
	if cc jump RENORM_TP;
	
	jump ARITH_ENCODE_END_TP;
	
RENORM_LOOP_TP:

	TEMP = C_REG >> 19;
	
	cc = TEMP <= CONST_FF;
	
	if cc jump JUDGE_FF_TP;
	
	cc = BUF < 0;
	
	if cc jump SC_FIRST_TP;
	
	BUF += 1;
	
	b[CUR_SDE++] = BUF;
	
	cc = BUF == CONST_FF;	// if buffer == MARKER_ESC
	
	if !cc jump SC_FIRST_TP;
	
	b[CUR_SDE++] = CONST_ZERO;	// WRITE_BYTE(MARKER_STUFF)
	
SC_FIRST_TP:

	cc = SC == 0;
	
	if cc jump SC_FIRST_NEXT_TP;

	b[CUR_SDE++] = CONST_ZERO;
	
	SC += -1;
	
	jump SC_FIRST_TP;

SC_FIRST_NEXT_TP:

	BUF = TEMP & CONST_FF;
	
	jump RENORM_END_TP;
	
	
JUDGE_FF_TP:

	cc = TEMP == CONST_FF;
	
	if !cc jump BELOW_FF_TP;
	
	SC += 1;
	
	jump RENORM_END_TP;
	

BELOW_FF_TP:

	cc = BUF < 0;
	
	if cc jump SC_SECOND_TP;
	
	b[CUR_SDE++] = BUF;
	
SC_SECOND_TP:

	cc = SC == 0;
	
	if cc jump SC_SECOND_NEXT_TP;
	
	b[CUR_SDE++] = CONST_FF;
	
	b[CUR_SDE++] = CONST_ZERO;
	
	SC += -1;
	
	jump SC_SECOND_TP;
	
SC_SECOND_NEXT_TP:

	BUF = TEMP;

		
RENORM_END_TP:
	
	C_REG = C_REG & r0;
	
	CT = 8;
	
	cc = A_REG < CONST_8000;
	
	if cc jump RENORM_TP;

	
ARITH_ENCODE_END_TP:
	
	[PC_REG] = C_REG;
	
	[PSC] = SC;
	
	[PBUF] = BUF;
	
	CUR_SDE_SAVE = CUR_SDE;
	
	[PCT] = CT;
	
FIN_TP:

	[PA_REG] = A_REG;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -