📄 dsp1emu.c
字号:
CenterX = (-sin(NAasB)*ViewerZc*CXdistance)+ViewerXc;
CenterY = (cos(NAasB)*ViewerZc*CXdistance)+ViewerYc;
Op02CX = (short)CenterX;
Op02CY = (short)CenterY;
ViewerXc=ViewerX;//-Op02FX);
ViewerYc=ViewerY;//-Op02FY);
ViewerZc=ViewerZ;//-Op02FZ);
CenterX = (-sin(NAasB)*ViewerZc*CXdistance)+ViewerXc;
if (CenterX<-32768) CenterX = -32768; if (CenterX>32767) CenterX=32767;
CenterY = (cos(NAasB)*ViewerZc*CXdistance)+ViewerYc;
if (CenterY<-32768) CenterY = -32768; if (CenterY>32767) CenterY=32767;
TValDebug = (NAzsB*65536/6.28);
TValDebug2 = ScrDispl;
// if (Op02CY < 0) {Op02CYSup = Op02CY/256; Op02CY = 0;}
// if (Op02CX < 0) {Op02CXSup = Op02CX/256; Op02CX = 0;}
// [4/15/2001] (ViewerX+ViewerX1*NumberOfSlope);
// [4/15/2001] (ViewerY+ViewerY1*NumberOfSlope);
// if(Op02LFE==0x2200)Op02VVA=0xFECD;
// else Op02VVA=0xFFB2;
#ifdef DebugDSP1
Log_Message("OP02 FX:%d FY:%d FZ:%d LFE:%d LES:%d",Op02FX,Op02FY,Op02FZ,Op02LFE,Op02LES);
Log_Message(" AAS:%d AZS:%d VOF:%d VVA:%d",Op02AAS,Op02AZS,Op02VOF,Op02VVA);
Log_Message(" VX:%d VY:%d VZ:%d",(short)ViewerX,(short)ViewerY,(short)ViewerZ);
#endif
}
#else
void DSPOp02()
{
ViewerZ1=-cos(Op02AZS*6.2832/65536.0);
ViewerX1=sin(Op02AZS*6.2832/65536.0)*sin(Op02AAS*6.2832/65536.0);
ViewerY1=sin(Op02AZS*6.2832/65536.0)*cos(-Op02AAS*6.2832/65536.0);
#ifdef debug02
printf("\nViewerX1 : %f ViewerY1 : %f ViewerZ1 : %f\n",ViewerX1,ViewerY1,
ViewerZ1);
getch();
#endif
ViewerX=Op02FX-ViewerX1*Op02LFE;
ViewerY=Op02FY-ViewerY1*Op02LFE;
ViewerZ=Op02FZ-ViewerZ1*Op02LFE;
ScreenX=Op02FX+ViewerX1*(Op02LES-Op02LFE);
ScreenY=Op02FY+ViewerY1*(Op02LES-Op02LFE);
ScreenZ=Op02FZ+ViewerZ1*(Op02LES-Op02LFE);
#ifdef debug02
printf("ViewerX : %f ViewerY : %f ViewerZ : %f\n",ViewerX,ViewerY,ViewerZ);
printf("Op02FX : %d Op02FY : %d Op02FZ : %d\n",Op02FX,Op02FY,Op02FZ);
printf("ScreenX : %f ScreenY : %f ScreenZ : %f\n",ScreenX,ScreenY,ScreenZ);
getch();
#endif
if (ViewerZ1==0)ViewerZ1++;
NumberOfSlope=ViewerZ/-ViewerZ1;
Op02CX=(short)(Op02CXF=ViewerX+ViewerX1*NumberOfSlope);
Op02CY=(short)(Op02CYF=ViewerY+ViewerY1*NumberOfSlope);
ViewerXc=ViewerX;//-Op02FX);
ViewerYc=ViewerY;//-Op02FY);
ViewerZc=ViewerZ;//-Op02FZ);
Op02VOF=0x0000;
ReversedLES=0;
Op02LESb=Op02LES;
if ((Op02LES>=VofAngle+16384.0) && (Op02LES<VofAngle+32768.0)) {
ReversedLES=1;
Op02LESb=VofAngle+0x4000-(Op02LES-(VofAngle+0x4000));
}
Op02VVA = (short)(Op02LESb * tan((Op02AZS-0x4000)*6.2832/65536.0));
if ((Op02LESb>=VofAngle) && (Op02LESb<=VofAngle+0x4000)) {
Op02VOF= (short)(Op02LESb * tan((Op02AZS-0x4000-VofAngle)*6.2832/65536.0));
Op02VVA-=Op02VOF;
}
if (ReversedLES){
Op02VOF=-Op02VOF;
}
NAzsB = (Op02AZS-0x4000)*6.2832/65536.0;
NAasB = Op02AAS*6.2832/65536.0;
if (tan(NAzsB)==0) NAzsB=0.1;
ScrDispl=0;
if (NAzsB>-0.15) {NAzsB=-0.15;ScrDispl=Op02VVA-0xFFDA;}
CXdistance=1/tan(NAzsB);
CenterX = (-sin(NAasB)*ViewerZc*CXdistance)+ViewerXc;
if (CenterX<-32768) CenterX = -32768; if (CenterX>32767) CenterX=32767;
Op02CX = (short)CenterX;
CenterY = (cos(NAasB)*ViewerZc*CXdistance)+ViewerYc;
if (CenterY<-32768) CenterY = -32768; if (CenterY>32767) CenterY=32767;
Op02CY = (short)CenterY;
TValDebug = (NAzsB*65536/6.28);
TValDebug2 = ScrDispl;
// if (Op02CY < 0) {Op02CYSup = Op02CY/256; Op02CY = 0;}
// if (Op02CX < 0) {Op02CXSup = Op02CX/256; Op02CX = 0;}
// [4/15/2001] (ViewerX+ViewerX1*NumberOfSlope);
// [4/15/2001] (ViewerY+ViewerY1*NumberOfSlope);
// if(Op02LFE==0x2200)Op02VVA=0xFECD;
// else Op02VVA=0xFFB2;
#ifdef DebugDSP1
Log_Message("OP02 FX:%d FY:%d FZ:%d LFE:%d LES:%d",Op02FX,Op02FY,Op02FZ,Op02LFE,Op02LES);
Log_Message(" AAS:%d AZS:%d VOF:%d VVA:%d",Op02AAS,Op02AZS,Op02VOF,Op02VVA);
Log_Message(" VX:%d VY:%d VZ:%d",(short)ViewerX,(short)ViewerY,(short)ViewerZ);
#endif
}
#endif
short Op0AVS;
short Op0AA;
short Op0AB;
short Op0AC;
short Op0AD;
double RasterRX;
double RasterRY;
double RasterRZ;
double RasterLSlopeX;
double RasterLSlopeY;
double RasterLSlopeZ;
double RasterRSlopeX;
double RasterRSlopeY;
double RasterRSlopeZ;
double GroundLX;
double GroundLY;
double GroundRX;
double GroundRY;
double Distance;
double NAzs,NAas;
double RVPos,RHPos,RXRes,RYRes;
void GetRXYPos(){
double scalar;
if (Op02LES==0) return;
NAzs = NAzsB - Atan((RVPos) / (double)Op02LES);
NAas = NAasB;// + Atan(RHPos) / (double)Op02LES);
if (cos(NAzs)==0) NAzs+=0.001;
if (tan(NAzs)==0) NAzs+=0.001;
RXRes = (-sin(NAas)*ViewerZc/(tan(NAzs))+ViewerXc);
RYRes = (cos(NAas)*ViewerZc/(tan(NAzs))+ViewerYc);
scalar = ((ViewerZc/sin(NAzs))/(double)Op02LES);
RXRes += scalar*-sin(NAas+PI/2)*RHPos;
RYRes += scalar*cos(NAas+PI/2)*RHPos;
}
void DSPOp0A()
{
double x2,y2,x3,y3,x4,y4,m,ypos;
if(Op0AVS==0) {Op0AVS++; return;}
ypos=Op0AVS-ScrDispl;
// CenterX,CenterX = Center (x1,y1)
// Get (0,Vs) coords (x2,y2)
RVPos = ypos; RHPos = 0;
GetRXYPos(); x2 = RXRes; y2 = RYRes;
// Get (-128,Vs) coords (x3,y3)
RVPos = ypos; RHPos = -128;
GetRXYPos(); x3 = RXRes; y3 = RYRes;
// Get (127,Vs) coords (x4,y4)
RVPos = ypos; RHPos = 127;
GetRXYPos(); x4 = RXRes; y4 = RYRes;
// A = (x4-x3)/256
m = (x4-x3)/256*256; if (m>32767) m=32767; if (m<-32768) m=-32768;
Op0AA = (short)(m);
// C = (y4-y3)/256
m = (y4-y3)/256*256; if (m>32767) m=32767; if (m<-32768) m=-32768;
Op0AC = (short)(m);
if (ypos==0){
Op0AB = 0;
Op0AD = 0;
}
else {
// B = (x2-x1)/Vs
m = (x2-CenterX)/ypos*256; if (m>32767) m=32767; if (m<-32768) m=-32768;
Op0AB = (short)(m);
// D = (y2-y1)/Vs
m = (y2-CenterY)/ypos*256; if (m>32767) m=32767; if (m<-32768) m=-32768;
Op0AD = (short)(m);
}
Op0AVS+=1;
}
short Op06X;
short Op06Y;
short Op06Z;
short Op06H;
short Op06V;
unsigned short Op06S;
double ObjPX;
double ObjPY;
double ObjPZ;
double ObjPX1;
double ObjPY1;
double ObjPZ1;
double ObjPX2;
double ObjPY2;
double ObjPZ2;
double DivideOp06;
int Temp;
int tanval2;
#ifdef __OPT06__
void DSPOp06()
{
ObjPX=Op06X-Op02FX;
ObjPY=Op06Y-Op02FY;
ObjPZ=Op06Z-Op02FZ;
// rotate around Z
tanval2 = Angle(-Op02AAS+32768);
// tanval2 = (-Op02AAS+32768)/(65536/INCR);
ObjPX1=(ObjPX*Cos(tanval2)+ObjPY*-Sin(tanval2));
ObjPY1=(ObjPX*Sin(tanval2)+ObjPY*Cos(tanval2));
ObjPZ1=ObjPZ;
// rotate around X
// tanval2 = (-Op02AZS/(65536/INCR)) & 1023;
tanval2 = Angle(-Op02AZS);
// tanval2 = (-Op02AZS)/256;
ObjPX2=ObjPX1;
ObjPY2=(ObjPY1*Cos(tanval2)+ObjPZ1*-Sin(tanval2));
ObjPZ2=(ObjPY1*Sin(tanval2)+ObjPZ1*Cos(tanval2));
#ifdef debug06
Log_Message("ObjPX2: %f ObjPY2: %f ObjPZ2: %f\n",ObjPX2,ObjPY2,ObjPZ2);
#endif
ObjPZ2=ObjPZ2-Op02LFE;
if (ObjPZ2<0)
{
Op06H=(short)(-ObjPX2*Op02LES/-(ObjPZ2)); //-ObjPX2*256/-ObjPZ2;
Op06V=(short)(-ObjPY2*Op02LES/-(ObjPZ2)); //-ObjPY2*256/-ObjPZ2;
Op06S=(unsigned short)(256*(double)Op02LES/-ObjPZ2);
}
else
{
Op06H=0;
Op06V=14*16;
Op06S=0xFFFF;
}
#ifdef DebugDSP1
Log_Message("OP06 X:%d Y:%d Z:%d",Op06X,Op06Y,Op06Z);
Log_Message("OP06 H:%d V:%d S:%d",Op06H,Op06V,Op06S);
#endif
}
#else
void DSPOp06()
{
ObjPX=Op06X-Op02FX;
ObjPY=Op06Y-Op02FY;
ObjPZ=Op06Z-Op02FZ;
// rotate around Z
tanval = (-Op02AAS+32768)/65536.0*6.2832;
ObjPX1=(ObjPX*cos(tanval)+ObjPY*-sin(tanval));
ObjPY1=(ObjPX*sin(tanval)+ObjPY*cos(tanval));
ObjPZ1=ObjPZ;
#ifdef debug06
Log_Message("Angle : %f", tanval);
Log_Message("ObjPX1: %f ObjPY1: %f ObjPZ1: %f\n",ObjPX1,ObjPY1,ObjPZ1);
Log_Message("cos(tanval) : %f sin(tanval) : %f", cos(tanval), sin(tanval));
#endif
// rotate around X
tanval = (-Op02AZS)/65536.0*6.2832;
ObjPX2=ObjPX1;
ObjPY2=(ObjPY1*cos(tanval)+ObjPZ1*-sin(tanval));
ObjPZ2=(ObjPY1*sin(tanval)+ObjPZ1*cos(tanval));
#ifdef debug06
Log_Message("ObjPX2: %f ObjPY2: %f ObjPZ2: %f\n",ObjPX2,ObjPY2,ObjPZ2);
#endif
ObjPZ2=ObjPZ2-Op02LFE;
if (ObjPZ2<0)
{
Op06H=(short)(-ObjPX2*Op02LES/-(ObjPZ2)); //-ObjPX2*256/-ObjPZ2;
Op06V=(short)(-ObjPY2*Op02LES/-(ObjPZ2)); //-ObjPY2*256/-ObjPZ2;
Op06S=(unsigned short)(256*(double)Op02LES/-ObjPZ2);
}
else
{
Op06H=0;
Op06V=14*16;
Op06S=0xFFFF;
}
#ifdef DebugDSP1
Log_Message("OP06 X:%d Y:%d Z:%d",Op06X,Op06Y,Op06Z);
Log_Message("OP06 H:%d V:%d S:%d",Op06H,Op06V,Op06S);
#endif
}
#endif
double matrixB[3][3];
double matrixB2[3][3];
double matrixB3[3][3];
double matrixA[3][3];
double matrixA2[3][3];
double matrixA3[3][3];
void MultMatrixB(double result[3][3],double mat1[3][3],double mat2[3][3])
{
result[0][0]=(mat1[0][0]*mat2[0][0]+mat1[0][1]*mat2[1][0]+mat1[0][2]*mat2[2][0]);
result[0][1]=(mat1[0][0]*mat2[0][1]+mat1[0][1]*mat2[1][1]+mat1[0][2]*mat2[2][1]);
result[0][2]=(mat1[0][0]*mat2[0][2]+mat1[0][1]*mat2[1][2]+mat1[0][2]*mat2[2][2]);
result[1][0]=(mat1[1][0]*mat2[0][0]+mat1[1][1]*mat2[1][0]+mat1[1][2]*mat2[2][0]);
result[1][1]=(mat1[1][0]*mat2[0][1]+mat1[1][1]*mat2[1][1]+mat1[1][2]*mat2[2][1]);
result[1][2]=(mat1[1][0]*mat2[0][2]+mat1[1][1]*mat2[1][2]+mat1[1][2]*mat2[2][2]);
result[2][0]=(mat1[2][0]*mat2[0][0]+mat1[2][1]*mat2[1][0]+mat1[2][2]*mat2[2][0]);
result[2][1]=(mat1[2][0]*mat2[0][1]+mat1[2][1]*mat2[1][1]+mat1[2][2]*mat2[2][1]);
result[2][2]=(mat1[2][0]*mat2[0][2]+mat1[2][1]*mat2[1][2]+mat1[2][2]*mat2[2][2]);
}
short Op01m;
short Op01Zr;
short Op01Xr;
short Op01Yr;
short Op11m;
short Op11Zr;
short Op11Xr;
short Op11Yr;
short Op21m;
short Op21Zr;
short Op21Xr;
short Op21Yr;
double sc,sc2,sc3;
#ifdef __OPT01__
void DSPOp01()
{
unsigned short zr,yr,xr;
zr = Angle(Op01Zr);
xr = Angle(Op01Yr);
yr = Angle(Op01Xr);
matrixB[0][0]=1; matrixB[0][1]=0; matrixB[0][2]=0;
matrixB[1][0]=0; matrixB[1][1]=Cos(xr); matrixB[1][2]=-Sin(xr);
matrixB[2][0]=0; matrixB[2][1]=Sin(xr); matrixB[2][2]=Cos(xr);
matrixB2[0][0]=Cos(yr); matrixB2[0][1]=0; matrixB2[0][2]=Sin(yr);
matrixB2[1][0]=0; matrixB2[1][1]=1; matrixB2[1][2]=0;
matrixB2[2][0]=-Sin(yr); matrixB2[2][1]=0; matrixB2[2][2]=Cos(yr);
MultMatrixB(matrixB3,matrixB,matrixB2);
matrixB2[0][0]=Cos(zr); matrixB2[0][1]=-Sin(zr); matrixB2[0][2]=0;
matrixB2[1][0]=Sin(zr); matrixB2[1][1]=Cos(zr); matrixB2[1][2]=0;
matrixB2[2][0]=0; matrixB2[2][1]=0; matrixB2[2][2]=1;
MultMatrixB(matrixB,matrixB3,matrixB2);
sc = ((double)Op01m)/32768.0;
matrixA[0][0]=matrixB[0][0]; matrixA[0][1]=matrixB[0][1]; matrixA[0][2]=matrixB[0][2];
matrixA[1][0]=matrixB[1][0]; matrixA[1][1]=matrixB[1][1]; matrixA[1][2]=matrixB[1][2];
matrixA[2][0]=matrixB[2][0]; matrixA[2][1]=matrixB[2][1]; matrixA[2][2]=matrixB[2][2];
#ifdef DebugDSP1
Log_Message("OP01 ZR: %d XR: %d YR: %d",Op01Zr,Op01Xr,Op01Yr);
#endif
}
#else
void DSPOp01()
{
double zr,yr,xr;
zr = ((double)Op01Zr)*6.2832/65536;
xr = ((double)Op01Yr)*6.2832/65536;
yr = ((double)Op01Xr)*6.2832/65536;
matrixB[0][0]=1; matrixB[0][1]=0; matrixB[0][2]=0;
matrixB[1][0]=0; matrixB[1][1]=cos(xr); matrixB[1][2]=-sin(xr);
matrixB[2][0]=0; matrixB[2][1]=sin(xr); matrixB[2][2]=cos(xr);
matrixB2[0][0]=cos(yr); matrixB2[0][1]=0; matrixB2[0][2]=sin(yr);
matrixB2[1][0]=0; matrixB2[1][1]=1; matrixB2[1][2]=0;
matrixB2[2][0]=-sin(yr); matrixB2[2][1]=0; matrixB2[2][2]=cos(yr);
MultMatrixB(matrixB3,matrixB,matrixB2);
matrixB2[0][0]=cos(zr); matrixB2[0][1]=-sin(zr); matrixB2[0][2]=0;
matrixB2[1][0]=sin(zr); matrixB2[1][1]=cos(zr); matrixB2[1][2]=0;
matrixB2[2][0]=0; matrixB2[2][1]=0; matrixB2[2][2]=1;
MultMatrixB(matrixB,matrixB3,matrixB2);
sc = ((double)Op01m)/32768.0;
matrixA[0][0]=matrixB[0][0]; matrixA[0][1]=matrixB[0][1]; matrixA[0][2]=matrixB[0][2];
matrixA[1][0]=matrixB[1][0]; matrixA[1][1]=matrixB[1][1]; matrixA[1][2]=matrixB[1][2];
matrixA[2][0]=matrixB[2][0]; matrixA[2][1]=matrixB[2][1]; matrixA[2][2]=matrixB[2][2];
#ifdef DebugDSP1
Log_Message("OP01 ZR: %d XR: %d YR: %d",Op01Zr,Op01Xr,Op01Yr);
#endif
}
#endif
#ifdef __OPT11__
void DSPOp11()
{
short zr,yr,xr;
zr = Angle(Op11Zr);
xr = Angle(Op11Yr);
yr = Angle(Op11Xr);
matrixB[0][0]=1; matrixB[0][1]=0; matrixB[0][2]=0;
matrixB[1][0]=0; matrixB[1][1]=Cos(xr); matrixB[1][2]=-Sin(xr);
matrixB[2][0]=0; matrixB[2][1]=Sin(xr); matrixB[2][2]=Cos(xr);
matrixB2[0][0]=Cos(yr); matrixB2[0][1]=0; matrixB2[0][2]=Sin(yr);
matrixB2[1][0]=0; matrixB2[1][1]=1; matrixB2[1][2]=0;
matrixB2[2][0]=-Sin(yr); matrixB2[2][1]=0; matrixB2[2][2]=Cos(yr);
MultMatrixB(matrixB3,matrixB,matrixB2);
matrixB2[0][0]=Cos(zr); matrixB2[0][1]=-Sin(zr); matrixB2[0][2]=0;
matrixB2[1][0]=Sin(zr); matrixB2[1][1]=Cos(zr); matrixB2[1][2]=0;
matrixB2[2][0]=0; matrixB2[2][1]=0; matrixB2[2][2]=1;
MultMatrixB(matrixB,matrixB3,matrixB2);
sc2 = ((double)Op11m)/32768.0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -