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

📄 blit_mips_fix.c

📁 大名鼎鼎的CE下播放软件,TCPPMP的源代码!!!2410下可以流畅的解QVGA的H264,MPEG4等格式.
💻 C
📖 第 1 页 / 共 2 页
字号:
			if (Prepare)
			{
				I2C(SLL,R3,A,8);
				I3(OR,A,A,R3);
				I2C(SLL,R3,B,8);
				I3(OR,B,B,R3);
				I2C(SLL,R3,B,16);
				I3(OR,A,A,R3);
			}
			I2C(SW,A,Dst,0);
		}
		else
		{
			if (Prepare)
			{
				I2C(SLL,R3,B,8);
				I3(OR,A,A,R3);
			}
			I2C(SH,A,Dst,0);
		}
		break;

	case 16:
		if (p->Dst.Flags & PF_16BITACCESS)
		{
			if (p->DstDoubleX)
			{
				if (Prepare && !p->ColorLookup)
					I2C(SRL,B,A,16);

				I2C(SH,A,Dst,0);
				I2C(SH,A,Dst,2);
				I2C(SH,B,Dst,4);
				I2C(SH,B,Dst,6);
			}
			else
			{
				if (Prepare)
					I2C(SRL,B,A,16);

				I2C(SH,A,Dst,0);
				I2C(SH,B,Dst,2);
			}
		}
		else
		{
			if (p->DstDoubleX)
			{
				if (Prepare)
				{
					if (p->ColorLookup)
					{
						I2C(SLL,R3,A,16);
						I2C(SLL,R2,B,16);
						I3(OR,A,A,R3);
						I3(OR,B,B,R2);
					}
					else
					{
						I2C(SLL,R3,A,16);
						I2C(SRL,R2,A,16);
						I2C(SRL,A,R3,16);
						I2C(SLL,B,R2,16);
						I3(OR,A,A,R3);
						I3(OR,B,B,R2);
					}
				}
				I2C(SW,B,Dst,4);
			}
			I2C(SW,A,Dst,0);
		}
		break;
	case 24:
		if (p->DstDoubleX)
		{
			if (Prepare)
			{
				I2C(SLL,R3,A,24);
				I2C(SRL,R2,A,8);
				I3(OR,A,A,R3);
				I2C(SLL,R3,B,16);
				I3(OR,R3,R3,R2);
				I2C(SRL,R2,B,16);
				I2C(SLL,B,B,8);
				I3(OR,B,B,R2);
			}
			I2C(SW,A,Dst,0);
			I2C(SW,R3,Dst,4);
			I2C(SW,B,Dst,8);
		}
		else
		{
			if (Prepare)
			{
				I2C(SRL,R3,A,16);
				I2C(SLL,B,B,8);
				I3(OR,R3,R3,B);
				I2C(SRL,B,B,16);
			}
			I2C(SH,A,Dst,0);
			I2C(SH,R3,Dst,2);
			I2C(SH,B,Dst,4);
		}
		break;
	case 32:
		if (p->DstDoubleX)
		{
			I2C(SW,A,Dst,0);
			I2C(SW,A,Dst,4);
			I2C(SW,B,Dst,8);
			I2C(SW,B,Dst,12);
		}
		else
		{
			I2C(SW,A,Dst,0);
			I2C(SW,B,Dst,4);
		}
		break;
	}
}

void Fix_RGB_UV(blit_soft* p)
{
	int Col,ColCount,i,RowStep;
	dyninst* LoopY;
	dyninst* LoopX;
	dyninst* EndOfLine;

	p->Scale = (boolmem_t)(!(p->RScaleX == 8 || p->RScaleX == 16) || 
				!(p->RScaleY == 8 || p->RScaleY == 16) ||
				p->SrcUVX2!=1 || p->SrcUVY2!=1);

	if (p->Scale)
	{
		p->DstDoubleX = p->DstDoubleY = 0;
		p->ColorLookup = 0;
	}

	if (p->RScaleX == 8 || p->RScaleY == 8)
		p->DstAlignSize = 4;
	p->DstStepX = p->DirX * ((p->DstBPP*2) >> 3) << p->DstDoubleX;

	CodeBegin(7,OFS(stack,StackFrame),0);

	if (p->DstPalette)
	{
		IConst(R17,0);
		IConst(R18,0);
		IConst(R19,0);
		I2C(LW,R13,R4,OFS(blit_soft,LookUp_Data));
	}	
	else
	if (p->ColorLookup)
	{
		CalcLookUp(p,0);
		I2C(LW,R13,R4,OFS(blit_soft,LookUp_Data));
		I2C(ADDIU,R15,R13,p->LookUp_U);
		I2C(ADDIU,R16,R13,p->LookUp_V);
	}
	else
	{
		IConst(R17,(ConstAdjust(p->_RAdd) & 0xFFFF) * 0x10001);
		IConst(R18,(ConstAdjust(p->_GAdd) & 0xFFFF) * 0x10001);
		IConst(R19,(ConstAdjust(p->_BAdd) & 0xFFFF) * 0x10001);

		IConst(R15,0x01000100 << 3); //possat
		IConst(R13,0x7FFF7FFF); //negsat
	}
	
	I2C(LW,R24,R5,0); //Dst[0] RGB
	I2C(LW,R10,R6,4); //Src[1] U
	I2C(LW,R11,R6,8); //Src[2] V
	I2C(LW,R12,R6,0); //Src[0] Y
	I3(ADDU,R25,R7,ZERO); //DstPitch

	if (p->Scale)
	{
		I2C(SW,R10,SP,OFS(stack,U));
		I2C(SW,R11,SP,OFS(stack,V));
		I2C(SW,R12,SP,OFS(stack,Y));
		I2C(LW,R7,SP,OFS(stack,SrcPitch));
	}

	I2C(LW,R7,SP,OFS(stack,SrcPitch));
	I2C(LW,R5,SP,OFS(stack,Height));
	I2C(LW,R4,SP,OFS(stack,Width));

	if (!p->Scale)
	{
		//SrcNext = 2*Src->Pitch - (Width >> SrcDoubleX)
		I2C(SLL,R2,R7,1);
		if (p->SrcDoubleX)
		{
			I2C(SRL,R3,R4,p->SrcDoubleX);
			I3(SUBU,R2,R2,R3); 
		}
		else
			I3(SUBU,R2,R2,R4); 
		I2C(SW,R2,SP,OFS(stack,SrcNext));

		//UVNext = (Src->Pitch >> 1) - (Width >> SrcDoubleX >> 1);
		I2C(SRA,R2,R7,1);
		I2C(SRL,R3,R4,p->SrcDoubleX+1);
		I3(SUBU,R2,R2,R3); 
		I2C(SW,R2,SP,OFS(stack,UVNext));
	}
	else
		I2C(SW,R7,SP,OFS(stack,SrcNext));

	if (p->DirX<0) //adjust reversed destination for block size
		I2C(ADDIU,R24,R24,p->DstStepX+(p->DstBPP >> 3));

	if (p->SwapXY)
	{
		I2C(ADDIU,R3,ZERO,p->DstBPP * p->DirX);
		I2(MULT,R5,R3); // p->DstBPP * p->DirX * Height
		I1(MFLO,R3);
		I2C(SRA,R3,R3,3); // bits->byte
		I3(ADDU,R3,R3,R24);
		I2C(SW,R3,SP,OFS(stack,EndOfRect));

		//DstNext = DstStepX - Width * DstPitch;
		I2(MULT,R25,R4);
		I1(MFLO,R2);
		I2C(ADDIU,R3,ZERO,p->DstStepX);
		I3(SUBU,R3,R3,R2);
		I2C(SW,R3,SP,OFS(stack,DstNext));
	}
	else
	{
		I2(MULT,R5,R25); //Height * DstPitch
		I1(MFLO,R3);
		I3(ADDU,R3,R3,R24);
		I2C(SW,R3,SP,OFS(stack,EndOfRect));

		//DstNext = ((DstPitch*(Scale?1:2) << DstDoubleY) - DirX * Width << DstBPP2;
		I2C(SLL,R2,R25,p->DstDoubleY+(p->Scale?0:1));
		I2C(SLL,R3,R4,p->DstBPP2);
		I3(p->DirX>0?SUBU:ADDU,R2,R2,R3);
		I2C(SW,R2,SP,OFS(stack,DstNext));
	}

	if (p->SwapXY)
	{
		I2(MULT,R25,R4); // Width * DstPitch
		I1(MFLO,R4);
	}
	else
	{
		I2C(SLL,R4,R4,p->DstBPP2);
		if (p->DirX < 0)
			I3(SUBU,R4,ZERO,R4);
	}
	I2C(SW,R4,SP,OFS(stack,EndOfLineInc));

	if (p->Scale)
		I3(ADDU,R22,ZERO,ZERO); //pos=0
	else
		I3(ADDU,R14,R12,R7);

	ColCount = 32;
	for (i=1;i<16 && !(p->RScaleX & i);i<<=1)
		ColCount >>= 1;

	LoopY = Label(1);

	// R4 = EndOfLineInc
	I3(ADDU,R7,R24,R4);

	LoopX = Label(1);

	if (p->Scale)
	{
		EndOfLine = Label(0);

		if (p->SwapXY)
		{
			//we need next row in R14,R20,R21 (YUV)
			I2C(LW,R2,SP,OFS(stack,SrcNext)); //srcpitch

			//increment row of Y,U,V according to Pos -> Pos+RowStep*RScaleY
			I2C(ADDIU,R9,R22,p->RScaleY);		//Pos += RScaleY
			I2C(SRL,R8,R22,4);
			I2C(SRL,R9,R9,4);

			// dY  = ((Pos+RowStep*RScaleY) >> 4) - (Pos >> 4);
			I3(SUBU,R4,R9,R8); 
			I2(MULT,R4,R2); // dY * SrcPitch
			I1(MFLO,R4);
			I3(ADDU,R14,R12,R4);

			// dUV = ((Pos+RowStep*RScaleY) >> (4+SrcUVY2)) - (Pos >> (4+SrcUVY2));
			if (p->SrcUVY2) I2C(SRL,R9,R9,p->SrcUVY2);
			if (p->SrcUVY2) I2C(SRL,R8,R8,p->SrcUVY2);
			I3(SUBU,R4,R9,R8); 
			I2(MULT,R4,R2); // dUV * (SrcPitch >> SrcUVX2)
			I1(MFLO,R4);
			if (p->SrcUVX2) I2C(SRA,R4,R4,p->SrcUVX2);
			I3(ADDU,R20,R10,R4);
			I3(ADDU,R21,R11,R4);
		}

		for (Col=0;Col<ColCount;)
		{
			Fix_RGB_UV_Pixel(p,0,Col);

			++Col;
			if (!p->SwapXY)
				++Col;

			Write(p,R24,R8,R9,1);

			if (p->SwapXY)
				I3(ADDU,R24,R24,R25);
			else
				I2C(ADDIU,R24,R24,p->DstStepX);

			if (Col == ColCount) 
			{
				//last item in block, increase source pointers

				I2C(ADDIU,R12,R12,(p->RScaleX * ColCount) >> 4);
				I2C(ADDIU,R10,R10,(p->RScaleX * ColCount) >> (4+p->SrcUVX2));
				I2C(ADDIU,R11,R11,(p->RScaleX * ColCount) >> (4+p->SrcUVX2));

				if (p->SwapXY)
				{
					I2C(ADDIU,R14,R14,(p->RScaleX * ColCount) >> 4);
					I2C(ADDIU,R20,R20,(p->RScaleX * ColCount) >> (4+p->SrcUVX2));
					I2C(ADDIU,R21,R21,(p->RScaleX * ColCount) >> (4+p->SrcUVX2));
				}

				DS(); I2P(BNE,R24,R7,LoopX);
			}
			else
			{
				I2P(BEQ,R24,R7,EndOfLine); // delay slot will be the next item
			}
		}

		InstPost(EndOfLine);

		I2C(LW,R2,SP,OFS(stack,SrcNext)); //srcpitch
		I2C(LW,R4,SP,OFS(stack,DstNext));
		I2C(LW,R5,SP,OFS(stack,EndOfRect));
		
		I2C(LW,R10,SP,OFS(stack,U));
		I2C(LW,R11,SP,OFS(stack,V));
		I2C(LW,R12,SP,OFS(stack,Y));

		//increment pointers
		I3(ADDU,R24,R24,R4);

		RowStep = (p->SwapXY) ? 2:1;

		//increment row of Y,U,V according to Pos -> Pos+RowStep*RScaleY
		I2C(SRL,R8,R22,4);
		I2C(ADDIU,R22,R22,RowStep*p->RScaleY);		//Pos += RowStep*RScaleY
		I2C(SRL,R9,R22,4);

		// dY  = ((Pos+RowStep*RScaleY) >> 4) - (Pos >> 4);
		I3(SUBU,R4,R9,R8); 
		I2(MULT,R4,R2); // dY * SrcPitch
		I1(MFLO,R4);
		I3(ADDU,R12,R12,R4);

	    // dUV = ((Pos+RowStep*RScaleY) >> (4+SrcUVY2)) - (Pos >> (4+SrcUVY2));
		if (p->SrcUVY2) I2C(SRL,R9,R9,p->SrcUVY2);
		if (p->SrcUVY2) I2C(SRL,R8,R8,p->SrcUVY2);
		I3(SUBU,R4,R9,R8); 
		I2(MULT,R4,R2); // dUV * (SrcPitch >> SrcUVX2)
		I1(MFLO,R4);
		if (p->SrcUVX2) I2C(SRA,R4,R4,p->SrcUVX2);
		I3(ADDU,R10,R10,R4);
		I3(ADDU,R11,R11,R4);

		I2C(SW,R10,SP,OFS(stack,U));
		I2C(SW,R11,SP,OFS(stack,V));
		I2C(SW,R12,SP,OFS(stack,Y));
	}
	else
	{
		reg Dst;

		Fix_RGB_UV_LoadUV(p,0,0);
		Fix_RGB_UV_Pixel(p,0,0);

		Dst = R24;
		if (!p->SwapXY)
			Dst = R1;

		Write(p,R24,R8,R9,1);
		I3(ADDU,Dst,R24,R25);

		if (p->DstDoubleY)
		{
			Write(p,Dst,R8,R9,0);
			I3(ADDU,Dst,Dst,R25);
		}
	
		Fix_RGB_UV_Pixel(p,1,0);

		Write(p,Dst,R8,R9,1);

		if (p->DstDoubleY)
		{
			I3(ADDU,Dst,Dst,R25);
			Write(p,Dst,R8,R9,0);
		}

		if (p->SwapXY)
			I3(ADDU,Dst,Dst,R25);
		else
			I2C(ADDIU,R24,R24,p->DstStepX);

		I2C(ADDIU,R12,R12,2);
		I2C(ADDIU,R14,R14,2);

		DS(); I2P(BNE,R24,R7,LoopX);

		I2C(LW,R2,SP,OFS(stack,SrcNext));
		I2C(LW,R4,SP,OFS(stack,DstNext));
		I2C(LW,R6,SP,OFS(stack,UVNext));
		I2C(LW,R5,SP,OFS(stack,EndOfRect));
		
		//increment pointers
		I3(ADDU,R12,R12,R2);
		I3(ADDU,R14,R14,R2);
		I3(ADDU,R24,R24,R4);
		I3(ADDU,R10,R10,R6);
		I3(ADDU,R11,R11,R6);
	}

	//prepare registers for next row
	I2C(LW,R4,SP,OFS(stack,EndOfLineInc));

	DS(); I2P(BNE,R24,R5,LoopY);

	CodeEnd(7,OFS(stack,StackFrame),0);
}

#endif

⌨️ 快捷键说明

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