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

📄 misc.asm

📁 bf533平台图像采集程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	r3 = -r3;
	r3 += 32;
	r1 <<= r3; //r1 value; r3 shift
	
	r3 = [p0];
	r3 = r3 | r1;
	[p0++] = r3; //point to pos
	r0 = r0 + r2;
	[p0++] = r0; //point to tail
	cc = r5 <= r0;
	if cc jump LABEL1;

	r5 = [sp++];
	rts;
	
LABEL1:	
	p1 = [p0]; 
	i0 = 0;
	
	r2 = ~r3;
	(r6, r2) = byteunpack r3:2;//unpack r2
	r7 = (a1 = r6.h*r2.h), r6 = (a0 = r6.l*r2.l);
	r7 = r7.l * r6.l(is);
	cc = r7;
	if !cc jump INSERT_ZERO1;
	//no 0xff
	(r7, r6) = byteunpack r3:2(r); //unpack r3
	r6 = bytepack(r6.l, r6.h);
	r7 = bytepack(r7.l, r7.h);
	r1 = bytepack(r7, r6);
	
	[p1++] = r1;
	[p0--] = p1; //point to pos
	r0 += -32;
	[p0--] = r0; //point to buf 
	r0 = 0;
	[p0] = r0;
	
	r5 = [sp++];
	rts;
	
SHIFTABOVE32:
	r3 += -32;
	r5 = r1;
	r1 >>= r3;
	r0 = [p0];//p0 point to buf	
	r0 = r0 | r1;
	p1 = [p0+8]; 
	
	r2 = ~r0;
	(r6, r2) = byteunpack r3:2;//unpack r2
	r7 = (a1 = r6.h*r2.h), r6 = (a0 = r6.l*r2.l);
	r7 = r7.l * r6.l(is);
	cc = r7;
	if !cc jump INSERT_ZERO1;
	//no 0xff
	(r7, r6) = byteunpack r1:0; //unpack r0
	r6 = bytepack(r6.l, r6.h);
	r7 = bytepack(r7.l, r7.h);
	r1 = bytepack(r7, r6);

	[p1++] = r1;
	[p0+8] = p1;
	
	r0 = 32;
	r0 = r0 - r3;
	r5 <<= r0;
	[p0++] = r7;
	[p0] = r3;
	
	r5 = [sp++];
	rts;

INSERT_ZERO1:
	
	
_BitstreamPutBits.end:
	nop;
	

void BitstreamPutBits(unsigned short value,unsigned char size)
{
	unsigned int shift = 32 - stream.pos - size;
	
	value &= (1<<size)-1;
	
	if (shift <= 32) {
		stream.buf |= value << shift;

		stream.pos += size;
	
		if (stream.pos >= 32) {
			unsigned int b = stream.buf;
	
			BSWAP(&b);
			
			*stream.tail++ = b;
			stream.buf = 0;
			stream.pos -= 32;
		}
	

	} else {
		unsigned int remainder;
		unsigned int b;
		
		shift = size - (32 - stream.pos);
		stream.buf |= value >> shift;
		
		b = stream.buf;

		BSWAP(&b);

		*stream.tail++ = b;

		remainder = shift;

		shift = 32 - shift;

		stream.buf = value << shift;
		stream.pos = remainder;	
	}
}
*/

_pre_fetch:
	p0 = r0; //s
	p2 = r0;
	p2 += 4;
	p1 = r1; //stride
	
	prefetch [p0];
	p0 = p0 + p1;
	prefetch [p0];
	p0 = p0 + p1;
	prefetch [p0];
	p0 = p0 + p1;
	prefetch [p0];
	p0 = p0 + p1;
	prefetch [p0];
	p0 = p0 + p1;
	prefetch [p0];
	p0 = p0 + p1;
	prefetch [p0];
	p0 = p0 + p1;
	prefetch [p0];

	prefetch [p2];
	p2 = p2 + p1;
	prefetch [p2];
	p2 = p2 + p1;
	prefetch [p2];
	p2 = p2 + p1;
	prefetch [p2];
	p2 = p2 + p1;
	prefetch [p2];
	p2 = p2 + p1;
	prefetch [p2];
	p2 = p2 + p1;
	prefetch [p2];
	p2 = p2 + p1;
	prefetch [p2];
	
/*	p2 = 1;
	nop;nop;nop;nop;
	lsetup(lsfetch, lefetch) lc0 = p2;
	lsfetch:
		prefetch [p0];
//		nop;nop;nop;nop;
	lefetch: nop; //p0 = p0 + p1;
*/	
	rts;
_pre_fetch.end:
	nop;
		
_copy8to16:
	[--sp] = (r7:6, p5:4);
	
	p5 = r1; //s
	
	p1 = r2; //stride
	p2 = 8;
	i0 = 0;
	p0 = r1; //s
	l1 = 0;
	i1 = r0; //d
	
	m0 = r2;
	p1 += -4;
	r2.l = 0xFF80; //-128
	r2.h = r2.l << 0;

	r0 = [p0++];

	lsetup(lscopy, lecopy) lc0 = p2;
	lscopy:
		(r7, r6) = byteunpack r1:0;
		r6 = r6 +|+ r2;
		r7 = r7 +|+ r2 || [i1++] = r6 || r0 = [p0++p1];
		[i1++] = r7 || (r7, r6) = byteunpack r1:0; 
		r6 = r6 +|+ r2;
		r7 = r7 +|+ r2 || [i1++] = r6;
	lecopy: [i1++] = r7 || r0 = [p0++];
	
	(r7:6, p5:4) = [sp++];
	rts;
_copy8to16.end:
	nop;

	//quantize(short* sigBuf, short* lpBuf, unsigned char* quantTab);
_quantize:
	link 0;
	[--sp] = (r7:4, p5:3);

	p0.l = _FZBT;
	p0.h = _FZBT;
	
	p4 = r0; //non_zero_ac_index
	
	p1 = r1; //lpBuf
	
	l2 = 0;
	
	i2 = r2; // quant table
	
	i0 = 0;
	
	p3 = r0; //sigBuf
	
	p2 = 32;
	r7 = r7 - r7(ns) || r2.l = w[i2++]; //q
	
	p5 = 16;
	
	lsetup(ls0, le0) lc0 = p2;
	ls0:
		(r3, r6) = byteunpack r3:2 || r4 = [p1++]; //coeff
		
		r5 = abs r4(v) || p2 = [p0++]; //temp = abs(coeff);
		r3 = r6 >> 1(v); //qval>>1
		r5 = r5 +|+ r3; //temp += qval>>1

		r0 = r5.l(z); //temp
		r1 = r6.l(z); //qval  
		cc = r1 < r0;
		
		if cc jump DIV;
		p2 = p3 + (p2 << 1); //sigBuf[FZBT[i]]		

		STORE:		
		w[p2] = r7 || r0 = r5 >> 16;
		p2 = [p0++] || r1 = r6 >> 16;
		cc = r1 < r0;
		
		if cc jump DIV1;
		r7 = r7 - r7(ns);
		p2 = p3 + (p2 << 1); //sigBuf[FZBT[i]]		
		
		STORE1:
	le0: r7 = r7 - r7(ns) || w[p2] = r7 || r2.l = w[i2++]; //q;
	
	r0 = p4;
	r1 = p3;
	r0 = r0 - r1;
	r0 >>= 1; //non_zero_ac_index
	
	(r7:4, p5:3) = [sp++];
	unlink;
	rts;
	
DIV:
//	p5 = 16;
	divs(r0, r1);
	lsetup(lpdivs,lpdive) lc1 = p5;
	lpdivs:
	lpdive: divq(r0, r1); 
	r7 = r0.l(x);
	
	cc = bittst(r4, 15);	
	r1 = -r7;
	if cc r7 = r1;

	p2 = p3 + (p2 << 1); //sigBuf[FZBT[i]]	
	cc = p4 < p2;
	if cc p4 = p2;
		
	jump STORE;

DIV1:
//	p5 = 16;
	divs(r0, r1);
	lsetup(lpdiv1s,lpdiv1e) lc1 = p5;
	lpdiv1s:
	lpdiv1e: divq(r0, r1); 
	r7 = r0.l(x);
	
	cc = bittst(r4, 31);	
	r1 = -r7;
	if cc r7 = r1;
	
	p2 = p3 + (p2 << 1); //sigBuf[FZBT[i]]	
	cc = p4 < p2;
	if cc p4 = p2;

	jump STORE1;
		
_quantize.end:
	nop;
	
/*
copy8to16(short* d, unsigned char* s, int stride)
{
	int i, j;
	
	for(i = 0; i < 8; i++)
	{
		for(j = 0; j < 8; j++)
		{
			d[i*8+j] = (short)(s[i*stride+j]-128);
		}
	}
}



//quantize(short* sigBuf, short* lpBuf, unsigned char* quantTab, unsigned char* FZBT);
_quantize:
	link 0;
	[--sp] = (r7:4, p5:3);
	
	p1 = r1; //lpBuf
	r3 = [fp+20];
	
	l1 = 0;
	i1 = r3; //FZBT
	l2 = 0;
	i2 = r2; // quant table
	
	i0 = 0;
	
	p3 = r0; //sigBuf
	
	
	p2 = 32;
	
	r2.l = w[i1++]; //FZBT
	
	a1 = a0 = 0;
	
	lsetup(ls0, le0) lc0 = p2;
	ls0:
		(r3, r7) = byteunpack r3:2 || r2.l = w[i2++]; //q

		r3 = r7.l(z);
		p2 = r3; //FZBT[i]
		
		(r3, r6) = byteunpack r3:2 || r4 = [p1++]; //coeff
		
		r5 = abs r4(v); //temp = abs(coeff);
		r3 = r6 >> 1(v); //qval>>1
		r5 = r5 +|+ r3; //temp += qval>>1

		p2 = p3 + (p2 << 1); //sigBuf[FZBT[i]]
				
		r0 = r5.l(z); //temp
		r1 = r6.l(z); //qval  
		cc = r1 < r0;
		if cc jump DIV;
		r0 = 0;

		STORE:		
		w[p2] = r0 || r7 = r7 >> 16;
		p2 = r7; //FZBT[i+1]
		
//		r5.l = r5.h << 0;
//		r0 = r5.l(z); //temp += qval>>1
//		r6.l = r6.h << 0;
//		r1 = r6.l(z); //qval
//		cc =  r1 < r0;
		r0 = r5 >> 16;
		r1 = r6 >> 16;
		cc = r1 < r0;
		

		p2 = p3 + (p2 << 1);
		
		if cc jump DIV1;
		r0 = 0;
		
		STORE1:
	le0: w[p2] = r0 || r2.l = w[i1++]; //FZBT;
	
	(r7:4, p5:3) = [sp++];
	unlink;
	rts;
	
DIV:
	p5 = 16;
	divs(r0, r1);
	lsetup(lpdivs,lpdive) lc1 = p5;
	lpdivs:
	lpdive: divq(r0, r1); 
	r0 = r0.l(x);
	
	cc = bittst(r4, 15);	
	r1 = -r0;
	if cc r0 = r1;
	jump STORE;

DIV1:
	p5 = 16;
	divs(r0, r1);
	lsetup(lpdiv1s,lpdiv1e) lc1 = p5;
	lpdiv1s:
	lpdiv1e: divq(r0, r1); 
	r0 = r0.l(x);
	
	cc = bittst(r4, 31);	
	r1 = -r0;
	if cc r0 = r1;
	jump STORE1;
		
_quantize.end:
	nop;
*/	
/*
	for (i = 0; i < DCTBLOCKSIZE; i++)             //量化操作
	{          
		short temp;
		unsigned short coeff;
		unsigned short qval;
		
		coeff = lpBuf[i];
		qval = quantTab[i];
		 
		temp = abs(qcoeff);

		temp += qval>>1;	// for rounding
		if(temp > qval)
			temp /= qval;
		else
			temp = 0;
			
		if(qcoeff < 0) temp = -temp;
		sigBuf[FZBT[i]] = temp;

	}
*/

_ComputeVLI:

	r0 = abs r0;
	r1 = 2047(z);
	r2 = 15;
	
	r0 = r0 & r1; //2048->0
	r1.l = signbits r0.l;
	r1.h = 0;
	r0 = r2 - r1; //16-(signbits+1)
	
	rts;
_ComputeVLI.end:
	nop;

/*
 unsigned char ComputeVLI(short val)
 { 
  unsigned char binStrLen = 0;
  val = abs(val); 
  if(val == 1)
  {
   binStrLen = 1;  
  }
  else if(val >= 2 && val <= 3)
  {
   binStrLen = 2;
  }
  else if(val >= 4 && val <= 7)
  {
   binStrLen = 3;
  }
  else if(val >= 8 && val <= 15)
  {
   binStrLen = 4;
  }
  else if(val >= 16 && val <= 31)
  {
   binStrLen = 5;
  }
  else if(val >= 32 && val <= 63)
  {
   binStrLen = 6;
  }
  else if(val >= 64 && val <= 127)
  {
   binStrLen = 7;
  }
  else if(val >= 128 && val <= 255)
  {
   binStrLen = 8;
  }
  else if(val >= 256 && val <= 511)
  {
   binStrLen = 9;
  }
  else if(val >= 512 && val <= 1023)
  {
   binStrLen = 10;
  }
  else if(val >= 1024 && val <= 2047)
  {
   binStrLen = 11;
  }

  return binStrLen;
 }
 */

⌨️ 快捷键说明

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