Synced DSP-1 code with Snes9x. Removed Mario Kart rearview mirror hack.
This commit is contained in:
@@ -18,7 +18,6 @@ along with this program; if not, write to the Free Software
|
|||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#define __ZSNES__
|
#define __ZSNES__
|
||||||
|
|
||||||
#if (defined __ZSNES__ && __UNIXSDL__)
|
#if (defined __ZSNES__ && __UNIXSDL__)
|
||||||
@@ -35,12 +34,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|||||||
|
|
||||||
// uncomment some lines to test
|
// uncomment some lines to test
|
||||||
//#define printinfo
|
//#define printinfo
|
||||||
//#define debug02
|
|
||||||
//#define debug0A
|
|
||||||
//#define debug06
|
//#define debug06
|
||||||
|
|
||||||
#define __OPT__
|
#define __OPT__
|
||||||
#define __OPT02__
|
|
||||||
#define __OPT06__
|
#define __OPT06__
|
||||||
|
|
||||||
#ifdef DebugDSP1
|
#ifdef DebugDSP1
|
||||||
@@ -419,24 +415,22 @@ const short DSP1_SinTable[256] = {
|
|||||||
|
|
||||||
short DSP1_Sin(short Angle)
|
short DSP1_Sin(short Angle)
|
||||||
{
|
{
|
||||||
int S;
|
|
||||||
if (Angle < 0) {
|
if (Angle < 0) {
|
||||||
if (Angle == -32768) return 0;
|
if (Angle == -32768) return 0;
|
||||||
return -DSP1_Sin(-Angle);
|
return -DSP1_Sin(-Angle);
|
||||||
}
|
}
|
||||||
S = DSP1_SinTable[Angle >> 8] + (DSP1_MulTable[Angle & 0xff] * DSP1_SinTable[0x40 + (Angle >> 8)] >> 15);
|
int S = DSP1_SinTable[Angle >> 8] + (DSP1_MulTable[Angle & 0xff] * DSP1_SinTable[0x40 + (Angle >> 8)] >> 15);
|
||||||
if (S > 32767) S = 32767;
|
if (S > 32767) S = 32767;
|
||||||
return (short) S;
|
return (short) S;
|
||||||
}
|
}
|
||||||
|
|
||||||
short DSP1_Cos(short Angle)
|
short DSP1_Cos(short Angle)
|
||||||
{
|
{
|
||||||
int S;
|
|
||||||
if (Angle < 0) {
|
if (Angle < 0) {
|
||||||
if (Angle == -32768) return -32768;
|
if (Angle == -32768) return -32768;
|
||||||
Angle = -Angle;
|
Angle = -Angle;
|
||||||
}
|
}
|
||||||
S = DSP1_SinTable[0x40 + (Angle >> 8)] - (DSP1_MulTable[Angle & 0xff] * DSP1_SinTable[Angle >> 8] >> 15);
|
int S = DSP1_SinTable[0x40 + (Angle >> 8)] - (DSP1_MulTable[Angle & 0xff] * DSP1_SinTable[Angle >> 8] >> 15);
|
||||||
if (S < -32768) S = -32767;
|
if (S < -32768) S = -32767;
|
||||||
return (short) S;
|
return (short) S;
|
||||||
}
|
}
|
||||||
@@ -516,6 +510,16 @@ void DSP1_NormalizeDouble(int Product, short *Coefficient, short *Exponent)
|
|||||||
*Exponent = e;
|
*Exponent = e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
short DSP1_Truncate(short C, short E)
|
||||||
|
{
|
||||||
|
if (E > 0) {
|
||||||
|
if (C > 0) return 32767; else if (C < 0) return -32767;
|
||||||
|
} else {
|
||||||
|
if (E < 0) return C * DSP1ROM[0x0031 + E] >> 15;
|
||||||
|
}
|
||||||
|
return C;
|
||||||
|
}
|
||||||
|
|
||||||
void DSPOp04()
|
void DSPOp04()
|
||||||
{
|
{
|
||||||
Op04Sin = DSP1_Sin(Op04Angle) * Op04Radius >> 15;
|
Op04Sin = DSP1_Sin(Op04Angle) * Op04Radius >> 15;
|
||||||
@@ -534,254 +538,156 @@ void DSPOp0C()
|
|||||||
Op0CY2 = (Op0CY1 * DSP1_Cos(Op0CA) >> 15) - (Op0CX1 * DSP1_Sin(Op0CA) >> 15);
|
Op0CY2 = (Op0CY1 * DSP1_Cos(Op0CA) >> 15) - (Op0CX1 * DSP1_Sin(Op0CA) >> 15);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
short CentreX;
|
||||||
|
short CentreY;
|
||||||
|
short VOffset;
|
||||||
|
|
||||||
|
short VPlane_C;
|
||||||
|
short VPlane_E;
|
||||||
|
|
||||||
|
// Azimuth and Zenith angles
|
||||||
|
short SinAas;
|
||||||
|
short CosAas;
|
||||||
|
short SinAzs;
|
||||||
|
short CosAzs;
|
||||||
|
|
||||||
|
// Clipped Zenith angle
|
||||||
|
short SinAZS;
|
||||||
|
short CosAZS;
|
||||||
|
short SecAZS_C1;
|
||||||
|
short SecAZS_E1;
|
||||||
|
short SecAZS_C2;
|
||||||
|
short SecAZS_E2;
|
||||||
|
|
||||||
|
const short MaxAZS_Exp[16] = {
|
||||||
|
0x38b4, 0x38b7, 0x38ba, 0x38be, 0x38c0, 0x38c4, 0x38c7, 0x38ca,
|
||||||
|
0x38ce, 0x38d0, 0x38d4, 0x38d7, 0x38da, 0x38dd, 0x38e0, 0x38e4
|
||||||
|
};
|
||||||
|
|
||||||
|
void DSP1_Parameter(short Fx, short Fy, short Fz, short Lfe, short Les, short Aas, short Azs, short *Vof, short *Vva, short *Cx, short *Cy)
|
||||||
|
{
|
||||||
|
short CSec, C, E;
|
||||||
|
|
||||||
|
// Copy Zenith angle for clipping
|
||||||
|
short AZS = Azs;
|
||||||
|
|
||||||
|
// Store Sin and Cos of Azimuth and Zenith angles
|
||||||
|
SinAas = DSP1_Sin(Aas);
|
||||||
|
CosAas = DSP1_Cos(Aas);
|
||||||
|
SinAzs = DSP1_Sin(Azs);
|
||||||
|
CosAzs = DSP1_Cos(Azs);
|
||||||
|
|
||||||
|
// Center of Projection
|
||||||
|
CentreX = Fx + (Lfe * (SinAzs * -SinAas >> 15) >> 15);
|
||||||
|
CentreY = Fy + (Lfe * (SinAzs * CosAas >> 15) >> 15);
|
||||||
|
|
||||||
|
E = 0;
|
||||||
|
DSP1_Normalize(Fz + (Lfe * (CosAzs * 0x7fff >> 15) >> 15), &C, &E);
|
||||||
|
|
||||||
|
VPlane_C = C;
|
||||||
|
VPlane_E = E;
|
||||||
|
|
||||||
|
// Determine clip boundary and clip Zenith angle if necessary
|
||||||
|
short MaxAZS = MaxAZS_Exp[-E];
|
||||||
|
|
||||||
|
if (AZS < 0) {
|
||||||
|
MaxAZS = -MaxAZS;
|
||||||
|
if (AZS < MaxAZS + 1) AZS = MaxAZS + 1;
|
||||||
|
} else {
|
||||||
|
if (AZS > MaxAZS) AZS = MaxAZS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store Sin and Cos of clipped Zenith angle
|
||||||
|
SinAZS = DSP1_Sin(AZS);
|
||||||
|
CosAZS = DSP1_Cos(AZS);
|
||||||
|
|
||||||
|
DSP1_Inverse(CosAZS, 0, &SecAZS_C1, &SecAZS_E1);
|
||||||
|
DSP1_Normalize(C * SecAZS_C1 >> 15, &C, &E);
|
||||||
|
E += SecAZS_E1;
|
||||||
|
|
||||||
|
C = DSP1_Truncate(C, E) * SinAZS >> 15;
|
||||||
|
|
||||||
|
CentreX += C * SinAas >> 15;
|
||||||
|
CentreY -= C * CosAas >> 15;
|
||||||
|
|
||||||
|
*Cx = CentreX;
|
||||||
|
*Cy = CentreY;
|
||||||
|
|
||||||
|
// Raster number of imaginary center and horizontal line
|
||||||
|
*Vof = 0;
|
||||||
|
|
||||||
|
if ((Azs != AZS) || (Azs == MaxAZS))
|
||||||
|
{
|
||||||
|
if (Azs == -32768) Azs = -32767;
|
||||||
|
|
||||||
|
C = Azs - MaxAZS;
|
||||||
|
if (C >= 0) C--;
|
||||||
|
short Aux = ~(C << 2);
|
||||||
|
|
||||||
|
C = Aux * DSP1ROM[0x0328] >> 15;
|
||||||
|
C = (C * Aux >> 15) + DSP1ROM[0x0327];
|
||||||
|
*Vof -= (C * Aux >> 15) * Les >> 15;
|
||||||
|
|
||||||
|
C = Aux * Aux >> 15;
|
||||||
|
Aux = (C * DSP1ROM[0x0324] >> 15) + DSP1ROM[0x0325];
|
||||||
|
CosAZS += (C * Aux >> 15) * CosAZS >> 15;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOffset = Les * CosAZS >> 15;
|
||||||
|
|
||||||
|
DSP1_Inverse(SinAZS, 0, &CSec, &E);
|
||||||
|
DSP1_Normalize(VOffset, &C, &E);
|
||||||
|
DSP1_Normalize(C * CSec >> 15, &C, &E);
|
||||||
|
|
||||||
|
if (C == -32768) { C >>= 1; E++; }
|
||||||
|
|
||||||
|
*Vva = DSP1_Truncate(-C, E);
|
||||||
|
|
||||||
|
// Store Sec of clipped Zenith angle
|
||||||
|
DSP1_Inverse(CosAZS, 0, &SecAZS_C2, &SecAZS_E2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DSP1_Raster(short Vs, short *An, short *Bn, short *Cn, short *Dn)
|
||||||
|
{
|
||||||
|
short C, E, C1, E1;
|
||||||
|
|
||||||
|
DSP1_Inverse((Vs * SinAzs >> 15) + VOffset, 7, &C, &E);
|
||||||
|
E += VPlane_E;
|
||||||
|
|
||||||
|
C1 = C * VPlane_C >> 15;
|
||||||
|
E1 = E + SecAZS_E2;
|
||||||
|
|
||||||
|
DSP1_Normalize(C1, &C, &E);
|
||||||
|
|
||||||
|
C = DSP1_Truncate(C, E);
|
||||||
|
|
||||||
|
*An = C * CosAas >> 15;
|
||||||
|
*Cn = C * SinAas >> 15;
|
||||||
|
|
||||||
|
DSP1_Normalize(C1 * SecAZS_C2 >> 15, &C, &E1);
|
||||||
|
|
||||||
|
C = DSP1_Truncate(C, E1);
|
||||||
|
|
||||||
|
*Bn = C * -SinAas >> 15;
|
||||||
|
*Dn = C * CosAas >> 15;
|
||||||
|
}
|
||||||
|
|
||||||
short Op02FX;
|
short Op02FX;
|
||||||
short Op02FY;
|
short Op02FY;
|
||||||
short Op02FZ;
|
short Op02FZ;
|
||||||
short Op02LFE;
|
short Op02LFE;
|
||||||
short Op02LES;
|
short Op02LES;
|
||||||
unsigned short Op02AAS;
|
short Op02AAS;
|
||||||
unsigned short Op02AZS;
|
short Op02AZS;
|
||||||
unsigned short Op02VOF;
|
short Op02VOF;
|
||||||
unsigned short Op02VVA;
|
short Op02VVA;
|
||||||
|
|
||||||
short Op02CX;
|
short Op02CX;
|
||||||
short Op02CY;
|
short Op02CY;
|
||||||
double Op02CXF;
|
|
||||||
double Op02CYF;
|
|
||||||
double ViewerX0;
|
|
||||||
double ViewerY0;
|
|
||||||
double ViewerZ0;
|
|
||||||
double ViewerX1;
|
|
||||||
double ViewerY1;
|
|
||||||
double ViewerZ1;
|
|
||||||
double ViewerX;
|
|
||||||
double ViewerY;
|
|
||||||
double ViewerZ;
|
|
||||||
int ViewerAX;
|
|
||||||
int ViewerAY;
|
|
||||||
int ViewerAZ;
|
|
||||||
double NumberOfSlope;
|
|
||||||
double ScreenX;
|
|
||||||
double ScreenY;
|
|
||||||
double ScreenZ;
|
|
||||||
double TopLeftScreenX;
|
|
||||||
double TopLeftScreenY;
|
|
||||||
double TopLeftScreenZ;
|
|
||||||
double BottomRightScreenX;
|
|
||||||
double BottomRightScreenY;
|
|
||||||
double BottomRightScreenZ;
|
|
||||||
double Ready;
|
|
||||||
double RasterLX;
|
|
||||||
double RasterLY;
|
|
||||||
double RasterLZ;
|
|
||||||
double ScreenLX1;
|
|
||||||
double ScreenLY1;
|
|
||||||
double ScreenLZ1;
|
|
||||||
int ReversedLES;
|
|
||||||
short Op02LESb;
|
|
||||||
double NAzsB,NAasB;
|
|
||||||
double ViewerXc;
|
|
||||||
double ViewerYc;
|
|
||||||
double ViewerZc;
|
|
||||||
double CenterX,CenterY;
|
|
||||||
short Op02CYSup,Op02CXSup;
|
|
||||||
double CXdistance;
|
|
||||||
|
|
||||||
#define VofAngle 0x3880
|
|
||||||
|
|
||||||
short TValDebug,TValDebug2;
|
|
||||||
short ScrDispl;
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __OPT02__
|
|
||||||
void DSPOp02()
|
|
||||||
{
|
|
||||||
ViewerZ1=-Cos(Angle(Op02AZS));
|
|
||||||
ViewerX1=Sin(Angle(Op02AZS))*Sin(Angle(Op02AAS));
|
|
||||||
ViewerY1=Sin(Angle(Op02AZS))*Cos(Angle(Op02AAS));
|
|
||||||
|
|
||||||
|
|
||||||
#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);
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
ViewerXc=Op02FX;
|
|
||||||
ViewerYc=Op02FY;
|
|
||||||
ViewerZc=Op02FZ;
|
|
||||||
|
|
||||||
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 = (short)((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()
|
void DSPOp02()
|
||||||
{
|
{
|
||||||
ViewerZ1=-cos(Op02AZS*6.2832/65536.0);
|
DSP1_Parameter(Op02FX, Op02FY, Op02FZ, Op02LFE, Op02LES, Op02AAS, Op02AZS, &Op02VOF, &Op02VVA, &Op02CX, &Op02CY);
|
||||||
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 Op0AVS;
|
||||||
short Op0AA;
|
short Op0AA;
|
||||||
@@ -789,82 +695,10 @@ short Op0AB;
|
|||||||
short Op0AC;
|
short Op0AC;
|
||||||
short Op0AD;
|
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()
|
void DSPOp0A()
|
||||||
{
|
{
|
||||||
double x2,y2,x3,y3,x4,y4,m,ypos;
|
DSP1_Raster(Op0AVS, &Op0AA, &Op0AB, &Op0AC, &Op0AD);
|
||||||
|
Op0AVS++;
|
||||||
|
|
||||||
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 Op06X;
|
||||||
@@ -890,7 +724,6 @@ int tanval2;
|
|||||||
#ifdef __OPT06__
|
#ifdef __OPT06__
|
||||||
void DSPOp06()
|
void DSPOp06()
|
||||||
{
|
{
|
||||||
|
|
||||||
ObjPX=Op06X-Op02FX;
|
ObjPX=Op06X-Op02FX;
|
||||||
ObjPY=Op06Y-Op02FY;
|
ObjPY=Op06Y-Op02FY;
|
||||||
ObjPZ=Op06Z-Op02FZ;
|
ObjPZ=Op06Z-Op02FZ;
|
||||||
@@ -1222,13 +1055,7 @@ void DSPOp14()
|
|||||||
|
|
||||||
DSP1_Normalize(C * CSec >> 15, &C, &E);
|
DSP1_Normalize(C * CSec >> 15, &C, &E);
|
||||||
|
|
||||||
if (E > 0) {
|
Op14Zrr = Op14Zr + DSP1_Truncate(C, E);
|
||||||
if (C > 0) C = 32767; else if (C < 0) C = -32767;
|
|
||||||
} else {
|
|
||||||
if (E < 0) C = C * DSP1ROM[0x31 + E] >> 15;
|
|
||||||
}
|
|
||||||
|
|
||||||
Op14Zrr = Op14Zr + C;
|
|
||||||
|
|
||||||
// Rotation Around X
|
// Rotation Around X
|
||||||
Op14Xrr = Op14Xr + (Op14U * DSP1_Sin(Op14Yr) >> 15) + (Op14F * DSP1_Cos(Op14Yr) >> 15);
|
Op14Xrr = Op14Xr + (Op14U * DSP1_Sin(Op14Yr) >> 15) + (Op14F * DSP1_Cos(Op14Yr) >> 15);
|
||||||
@@ -1244,13 +1071,36 @@ void DSPOp14()
|
|||||||
|
|
||||||
DSP1_Normalize(-(C * CTan >> 15), &C, &E);
|
DSP1_Normalize(-(C * CTan >> 15), &C, &E);
|
||||||
|
|
||||||
if (E > 0) {
|
Op14Yrr = Op14Yr + DSP1_Truncate(C, E) + Op14L;
|
||||||
if (C > 0) C = 32767; else if (C < 0) C = -32767;
|
}
|
||||||
} else {
|
|
||||||
if (E < 0) C = C * DSP1ROM[0x31 + E] >> 15;
|
|
||||||
}
|
|
||||||
|
|
||||||
Op14Yrr = Op14Yr + C + Op14L;
|
void DSP1_Target(short H, short V, short *X, short *Y)
|
||||||
|
{
|
||||||
|
short C, E, C1, E1;
|
||||||
|
|
||||||
|
DSP1_Inverse((V * SinAzs >> 15) + VOffset, 8, &C, &E);
|
||||||
|
E += VPlane_E;
|
||||||
|
|
||||||
|
C1 = C * VPlane_C >> 15;
|
||||||
|
E1 = E + SecAZS_E1;
|
||||||
|
|
||||||
|
H <<= 8;
|
||||||
|
|
||||||
|
DSP1_Normalize(C1, &C, &E);
|
||||||
|
|
||||||
|
C = DSP1_Truncate(C, E) * H >> 15;
|
||||||
|
|
||||||
|
*X = CentreX + (C * CosAas >> 15);
|
||||||
|
*Y = CentreY - (C * SinAas >> 15);
|
||||||
|
|
||||||
|
V <<= 8;
|
||||||
|
|
||||||
|
DSP1_Normalize(C1 * SecAZS_C1 >> 15, &C, &E1);
|
||||||
|
|
||||||
|
C = DSP1_Truncate(C, E1) * V >> 15;
|
||||||
|
|
||||||
|
*X += C * -SinAas >> 15;
|
||||||
|
*Y += C * CosAas >> 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
short Op0EH;
|
short Op0EH;
|
||||||
@@ -1260,16 +1110,7 @@ short Op0EY;
|
|||||||
|
|
||||||
void DSPOp0E()
|
void DSPOp0E()
|
||||||
{
|
{
|
||||||
// screen Directions UP
|
DSP1_Target(Op0EH, Op0EV, &Op0EX, &Op0EY);
|
||||||
RVPos = Op0EV;
|
|
||||||
RHPos = Op0EH;
|
|
||||||
GetRXYPos();
|
|
||||||
Op0EX = (short)(RXRes);
|
|
||||||
Op0EY = (short)(RYRes);
|
|
||||||
|
|
||||||
#ifdef DebugDSP1
|
|
||||||
Log_Message("OP0E COORDINATE H:%d V:%d X:%d Y:%d",Op0EH,Op0EV,Op0EX,Op0EY);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
short Op0BX;
|
short Op0BX;
|
||||||
@@ -1362,14 +1203,14 @@ void DSPOp28()
|
|||||||
if (Radius == 0) Op28R = 0;
|
if (Radius == 0) Op28R = 0;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
short C, E, Pos, Node1, Node2;
|
short C, E;
|
||||||
DSP1_NormalizeDouble(Radius, &C, &E);
|
DSP1_NormalizeDouble(Radius, &C, &E);
|
||||||
if (E & 1) C = C * 0x4000 >> 15;
|
if (E & 1) C = C * 0x4000 >> 15;
|
||||||
|
|
||||||
Pos = C * 0x0040 >> 15;
|
short Pos = C * 0x0040 >> 15;
|
||||||
|
|
||||||
Node1 = DSP1ROM[0x00d5 + Pos];
|
short Node1 = DSP1ROM[0x00d5 + Pos];
|
||||||
Node2 = DSP1ROM[0x00d6 + Pos];
|
short Node2 = DSP1ROM[0x00d6 + Pos];
|
||||||
|
|
||||||
Op28R = ((Node2 - Node1) * (C & 0x1ff) >> 9) + Node1;
|
Op28R = ((Node2 - Node1) * (C & 0x1ff) >> 9) + Node1;
|
||||||
Op28R >>= (E >> 1);
|
Op28R >>= (E >> 1);
|
||||||
@@ -1392,7 +1233,6 @@ short Op1CZ2;
|
|||||||
|
|
||||||
void DSPOp1C()
|
void DSPOp1C()
|
||||||
{
|
{
|
||||||
|
|
||||||
// Rotate Around Op1CZ1
|
// Rotate Around Op1CZ1
|
||||||
Op1CX1 = (Op1CYBR * DSP1_Sin(Op1CZ) >> 15) + (Op1CXBR * DSP1_Cos(Op1CZ) >> 15);
|
Op1CX1 = (Op1CYBR * DSP1_Sin(Op1CZ) >> 15) + (Op1CXBR * DSP1_Cos(Op1CZ) >> 15);
|
||||||
Op1CY1 = (Op1CYBR * DSP1_Cos(Op1CZ) >> 15) - (Op1CXBR * DSP1_Sin(Op1CZ) >> 15);
|
Op1CY1 = (Op1CYBR * DSP1_Cos(Op1CZ) >> 15) - (Op1CXBR * DSP1_Sin(Op1CZ) >> 15);
|
||||||
@@ -1432,5 +1272,3 @@ void DSPOp2F()
|
|||||||
{
|
{
|
||||||
Op2FSize=0x100;
|
Op2FSize=0x100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ EXTSYM memaccessspc7110w16,ram7f,snesmap2,snesmmap,MultiTap,memaccessbankr848mb
|
|||||||
EXTSYM memaccessbankr1648mb,procexecloop,ram7fa,wramdata,wramdataa,fname,fnames
|
EXTSYM memaccessbankr1648mb,procexecloop,ram7fa,wramdata,wramdataa,fname,fnames
|
||||||
EXTSYM GetCurDir,SRAMChdir,cfgloadsdir,fnamest,statefileloc,InitDir,InitDrive
|
EXTSYM GetCurDir,SRAMChdir,cfgloadsdir,fnamest,statefileloc,InitDir,InitDrive
|
||||||
EXTSYM curromspace,infoloc,patchfile,romispal,initregr,initregw,memtabler16
|
EXTSYM curromspace,infoloc,patchfile,romispal,initregr,initregw,memtabler16
|
||||||
EXTSYM memtabler8,memtablew16,memtablew8,sfxramdata,ScrDispl,wramreadptr
|
EXTSYM memtabler8,memtablew16,memtablew8,sfxramdata,wramreadptr
|
||||||
EXTSYM wramwriteptr,loadstate2,CMovieExt,MoviePlay,MovieDumpRaw,AllowUDLR
|
EXTSYM wramwriteptr,loadstate2,CMovieExt,MoviePlay,MovieDumpRaw,AllowUDLR
|
||||||
|
|
||||||
;initc.c
|
;initc.c
|
||||||
@@ -1039,7 +1039,6 @@ SECTION .text
|
|||||||
NEWSYM init65816
|
NEWSYM init65816
|
||||||
mov byte[osm2dis],0
|
mov byte[osm2dis],0
|
||||||
mov byte[bgfixer2],0
|
mov byte[bgfixer2],0
|
||||||
mov word[ScrDispl],0
|
|
||||||
cmp byte[SA1Enable],0
|
cmp byte[SA1Enable],0
|
||||||
je .nosa1init
|
je .nosa1init
|
||||||
call SA1Reset
|
call SA1Reset
|
||||||
|
|||||||
@@ -17,11 +17,6 @@
|
|||||||
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EXTSYM ScrDispl
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%macro Mode7Calculate 0
|
%macro Mode7Calculate 0
|
||||||
; mode 7, ax = curyposition, dx = curxposition (left side)
|
; mode 7, ax = curyposition, dx = curxposition (left side)
|
||||||
; draw center map coordinates at (X0-bg1scrolx,Y0-bg1scroly) on screen
|
; draw center map coordinates at (X0-bg1scrolx,Y0-bg1scroly) on screen
|
||||||
@@ -49,7 +44,6 @@ EXTSYM ScrDispl
|
|||||||
jz .nonegc
|
jz .nonegc
|
||||||
or bx,1110000000000000b
|
or bx,1110000000000000b
|
||||||
.nonegc
|
.nonegc
|
||||||
sub bx,[ScrDispl]
|
|
||||||
mov [.cyloc],bx
|
mov [.cyloc],bx
|
||||||
mov bx,[mode7Y0]
|
mov bx,[mode7Y0]
|
||||||
and bx,0001111111111111b ; 13 -> 16 bit signed value
|
and bx,0001111111111111b ; 13 -> 16 bit signed value
|
||||||
@@ -132,7 +126,6 @@ EXTSYM ScrDispl
|
|||||||
jz .nonegc
|
jz .nonegc
|
||||||
or bx,1100000000000000b
|
or bx,1100000000000000b
|
||||||
.nonegc
|
.nonegc
|
||||||
sub bx,[ScrDispl]
|
|
||||||
mov [.cyloc],bx
|
mov [.cyloc],bx
|
||||||
mov bx,[mode7Y0]
|
mov bx,[mode7Y0]
|
||||||
and bx,0001111111111111b ; 13 -> 16 bit signed value
|
and bx,0001111111111111b ; 13 -> 16 bit signed value
|
||||||
|
|||||||
@@ -647,8 +647,6 @@ CalculateNewValues:
|
|||||||
.noflip
|
.noflip
|
||||||
add ax,[BG1SYl+ebx*2+2]
|
add ax,[BG1SYl+ebx*2+2]
|
||||||
add eax,ecx
|
add eax,ecx
|
||||||
sub ax,[ScrDispl]
|
|
||||||
sub ax,[ScrDispl]
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
EXTSYM BGMS1,FillSubScr,CMainWinScr,CSubWinScr,scadtng
|
EXTSYM BGMS1,FillSubScr,CMainWinScr,CSubWinScr,scadtng
|
||||||
EXTSYM ngwinen,winbg1enval,BuildWindow,ngwintable,ngcwinptr,domosaicng16b
|
EXTSYM ngwinen,winbg1enval,BuildWindow,ngwintable,ngcwinptr,domosaicng16b
|
||||||
EXTSYM pesimpng,ScrDispl
|
EXTSYM pesimpng
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -123,7 +123,6 @@ EXTSYM pesimpng,ScrDispl
|
|||||||
jz .nonegc
|
jz .nonegc
|
||||||
or bx,1110000000000000b
|
or bx,1110000000000000b
|
||||||
.nonegc
|
.nonegc
|
||||||
sub bx,[ScrDispl]
|
|
||||||
mov [mcyloc],bx
|
mov [mcyloc],bx
|
||||||
mov bx,[mode7Y0]
|
mov bx,[mode7Y0]
|
||||||
and bx,0001111111111111b ; 13 -> 16 bit signed value
|
and bx,0001111111111111b ; 13 -> 16 bit signed value
|
||||||
|
|||||||
Reference in New Issue
Block a user