📄 blit_mips_fix.c
字号:
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 + -