Updated and cleaned up code

This commit is contained in:
pagefault
2003-04-14 18:39:12 +00:00
parent 037441596d
commit 265fd7cb35
8 changed files with 194 additions and 177 deletions

View File

@@ -15,6 +15,7 @@
//along with this program; if not, write to the Free Software //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.
#ifdef __LINUX__ #ifdef __LINUX__
#include "../gblhdr.h" #include "../gblhdr.h"
#else #else
@@ -24,7 +25,6 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#endif #endif
//#define DebugDSP1 //#define DebugDSP1
// uncomment some lines to test // uncomment some lines to test
@@ -82,19 +82,21 @@ void Stop_Log (void)
#endif #endif
/***************************************************************************\ /***************************************************************************\
* Math tables * * Math tables *
\***************************************************************************/ \***************************************************************************/
double *CosTable2;
double *SinTable2;
#define INCR 2048 #define INCR 2048
#define Angle(x) (((x)/(65536/INCR)) & (INCR-1)) #define Angle(x) (((x)/(65536/INCR)) & (INCR-1))
#define Cos(x) ((double) CosTable2[x]) #define Cos(x) ((double) CosTable2[x])
#define Sin(x) ((double) SinTable2[x]) #define Sin(x) ((double) SinTable2[x])
// gcc warning fix
#ifdef PI
#undef PI
#endif
#define PI 3.14159265358979323846264338327 #define PI 3.14159265358979323846264338327
double CosTable2[INCR];
double SinTable2[INCR];
double Atan(double x) double Atan(double x)
{ {
@@ -229,6 +231,7 @@ void C4Op0D()
C41FXVal=(short)(((double)C41FXVal*tanval)*0.98); C41FXVal=(short)(((double)C41FXVal*tanval)*0.98);
} }
/***************************************************************************\ /***************************************************************************\
* DSP1 code * * DSP1 code *
\***************************************************************************/ \***************************************************************************/
@@ -238,8 +241,8 @@ void InitDSP(void)
{ {
#ifdef __OPT__ #ifdef __OPT__
unsigned int i; unsigned int i;
// CosTable2 = (double *) malloc(INCR*sizeof(double)); CosTable2 = (double *)malloc(INCR*sizeof(double));
// SinTable2 = (double *) malloc(INCR*sizeof(double)); SinTable2 = (double *)malloc(INCR*sizeof(double));
for (i=0; i<INCR; i++){ for (i=0; i<INCR; i++){
CosTable2[i] = (cos((double)(2*PI*i/INCR))); CosTable2[i] = (cos((double)(2*PI*i/INCR)));
SinTable2[i] = (sin((double)(2*PI*i/INCR))); SinTable2[i] = (sin((double)(2*PI*i/INCR)));
@@ -251,16 +254,13 @@ void InitDSP(void)
} }
short Op00Multiplicand; // int16 short Op00Multiplicand;
short Op00Multiplier; // int16 short Op00Multiplier;
short Op00Result; // int16 short Op00Result;
void DSPOp00() void DSPOp00()
{ {
// Use the shift 15, don't divide by 32768, it doesn't round the same. Op00Result=Op00Multiplicand*Op00Multiplier/32768;
// This expression is bit accurate to DSP1B on MSVC 6.
Op00Result=Op00Multiplicand*Op00Multiplier >> 15;
#ifdef DebugDSP1 #ifdef DebugDSP1
Log_Message("OP00 MULT %d*%d/32768=%d",Op00Multiplicand,Op00Multiplier,Op00Result); Log_Message("OP00 MULT %d*%d/32768=%d",Op00Multiplicand,Op00Multiplier,Op00Result);
#endif #endif
@@ -274,28 +274,23 @@ float Op10Temp;
void DSPOp10() void DSPOp10()
{ {
// Hard to get bit accurate here but it's very close...
// within 2 lsb's on the coefficient of the DSP1B. Emu is more accurate.
if (Op10Coefficient == 0) {
Op10CoefficientR = 0x7fff; // DSP1B - Strange but true
Op10ExponentR = 0x002f;
} else {
Op10ExponentR=-Op10Exponent; Op10ExponentR=-Op10Exponent;
Op10Temp = (float)(Op10Coefficient / 32768.0); Op10Temp = Op10Coefficient / 32768.0;
if (Op10Temp == 0) {
Op10CoefficientR = 0;
} else
Op10Temp = 1/Op10Temp; Op10Temp = 1/Op10Temp;
if (Op10Temp > 0) if (Op10Temp > 0)
while (Op10Temp>=1.0) { while (Op10Temp>=1.0) {
Op10Temp = (float)(Op10Temp/2.0); Op10Temp=Op10Temp/2.0;
Op10ExponentR++; Op10ExponentR++;
} }
else else
while (Op10Temp <= -1.0) { while (Op10Temp<-1.0) {
Op10Temp=(float)(Op10Temp/2.0); Op10Temp=Op10Temp/2.0;
Op10ExponentR++; Op10ExponentR++;
} }
Op10CoefficientR = (short)(Op10Temp*32768); Op10CoefficientR = Op10Temp*32768;
}
#ifdef DebugDSP1 #ifdef DebugDSP1
Log_Message("OP10 INV %d*2^%d = %d*2^%d", Op10Coefficient, Op10Exponent, Op10CoefficientR, Op10ExponentR); Log_Message("OP10 INV %d*2^%d = %d*2^%d", Op10Coefficient, Op10Exponent, Op10CoefficientR, Op10ExponentR);
#endif #endif
@@ -303,7 +298,7 @@ void DSPOp10()
short Op04Angle; short Op04Angle;
short Op04Radius; // This is signed unsigned short Op04Radius;
short Op04Sin; short Op04Sin;
short Op04Cos; short Op04Cos;
@@ -331,8 +326,8 @@ void DSPOp04()
angle = Op04Angle*2*PI/65536.0; angle = Op04Angle*2*PI/65536.0;
Op04Sin = (short)(sin(angle) * Op04Radius); Op04Sin = sin(angle) * Op04Radius;
Op04Cos = (short)(cos(angle) * Op04Radius); Op04Cos = cos(angle) * Op04Radius;
#ifdef DebugDSP1 #ifdef DebugDSP1
Log_Message("OP04 Angle:%d Radius:%d",(Op04Angle/256)&255,Op04Radius); Log_Message("OP04 Angle:%d Radius:%d",(Op04Angle/256)&255,Op04Radius);
@@ -350,8 +345,8 @@ short Op0CY2;
#ifdef __OPT0C__ #ifdef __OPT0C__
void DSPOp0C() void DSPOp0C()
{ {
Op0CX2=(short)((Op0CX1*Cos(Angle(Op0CA))+Op0CY1*Sin(Angle(Op0CA)))); Op0CX2=(Op0CX1*Cos(Angle(Op0CA))+Op0CY1*Sin(Angle(Op0CA)));
Op0CY2=(short)((Op0CX1*-Sin(Angle(Op0CA))+Op0CY1*Cos(Angle(Op0CA)))); Op0CY2=(Op0CX1*-Sin(Angle(Op0CA))+Op0CY1*Cos(Angle(Op0CA)));
#ifdef DebugDSP1 #ifdef DebugDSP1
Log_Message("OP0C Angle:%d X:%d Y:%d CX:%d CY:%d",(Op0CA/256)&255,Op0CX1,Op0CY1,Op0CX2,Op0CY2); Log_Message("OP0C Angle:%d X:%d Y:%d CX:%d CY:%d",(Op0CA/256)&255,Op0CX1,Op0CY1,Op0CX2,Op0CY2);
#endif #endif
@@ -505,7 +500,7 @@ void DSPOp02()
CenterY = (cos(NAasB)*ViewerZc*CXdistance)+ViewerYc; CenterY = (cos(NAasB)*ViewerZc*CXdistance)+ViewerYc;
if (CenterY<-32768) CenterY = -32768; if (CenterY>32767) CenterY=32767; if (CenterY<-32768) CenterY = -32768; if (CenterY>32767) CenterY=32767;
TValDebug = (short)((NAzsB*65536/6.28)); TValDebug = (NAzsB*65536/6.28);
TValDebug2 = ScrDispl; TValDebug2 = ScrDispl;
// if (Op02CY < 0) {Op02CYSup = Op02CY/256; Op02CY = 0;} // if (Op02CY < 0) {Op02CYSup = Op02CY/256; Op02CY = 0;}
@@ -718,7 +713,6 @@ double ObjPX2;
double ObjPY2; double ObjPY2;
double ObjPZ2; double ObjPZ2;
double DivideOp06; double DivideOp06;
double d;
int Temp; int Temp;
int tanval2; int tanval2;
@@ -758,16 +752,7 @@ void DSPOp06()
{ {
Op06H=(short)(-ObjPX2*Op02LES/-(ObjPZ2)); //-ObjPX2*256/-ObjPZ2; Op06H=(short)(-ObjPX2*Op02LES/-(ObjPZ2)); //-ObjPX2*256/-ObjPZ2;
Op06V=(short)(-ObjPY2*Op02LES/-(ObjPZ2)); //-ObjPY2*256/-ObjPZ2; Op06V=(short)(-ObjPY2*Op02LES/-(ObjPZ2)); //-ObjPY2*256/-ObjPZ2;
d=(double)Op02LES; Op06S=(unsigned short)(256*(double)Op02LES/-ObjPZ2);
d*=256.0;
d/=(-ObjPZ2);
if(d>65535.0)
d=65535.0;
else if(d<0.0)
d=0.0;
Op06S=(unsigned short)d;
//Op06S=(unsigned short)(256*(double)Op02LES/-ObjPZ2);
//Op06S=(unsigned short)((double)(256.0*((double)Op02LES)/(-ObjPZ2)));
} }
else else
{ {
@@ -818,15 +803,7 @@ void DSPOp06()
{ {
Op06H=(short)(-ObjPX2*Op02LES/-(ObjPZ2)); //-ObjPX2*256/-ObjPZ2; Op06H=(short)(-ObjPX2*Op02LES/-(ObjPZ2)); //-ObjPX2*256/-ObjPZ2;
Op06V=(short)(-ObjPY2*Op02LES/-(ObjPZ2)); //-ObjPY2*256/-ObjPZ2; Op06V=(short)(-ObjPY2*Op02LES/-(ObjPZ2)); //-ObjPY2*256/-ObjPZ2;
double d=(double)Op02LES; Op06S=(unsigned short)(256*(double)Op02LES/-ObjPZ2);
d*=256.0;
d/=(-ObjPZ2);
if(d>65535.0)
d=65535.0;
else if(d<0.0)
d=0.0;
Op06S=(unsigned short)d;
// Op06S=(unsigned short)(256*(double)Op02LES/-ObjPZ2);
} }
else else
{ {
@@ -1314,8 +1291,8 @@ void DSPOp0E()
RVPos = Op0EV; RVPos = Op0EV;
RHPos = Op0EH; RHPos = Op0EH;
GetRXYPos(); GetRXYPos();
Op0EX = (short)(RXRes); Op0EX = RXRes;
Op0EY = (short)(RYRes); Op0EY = RYRes;
#ifdef DebugDSP1 #ifdef DebugDSP1
Log_Message("OP0E COORDINATE H:%d V:%d X:%d Y:%d",Op0EH,Op0EV,Op0EX,Op0EY); Log_Message("OP0E COORDINATE H:%d V:%d X:%d Y:%d",Op0EH,Op0EV,Op0EX,Op0EY);
@@ -1337,7 +1314,7 @@ short Op2BS;
void DSPOp0B() void DSPOp0B()
{ {
Op0BS = (short)((Op0BX*matrixA[0][0]+Op0BY*matrixA2[0][1]+Op0BZ*matrixA2[0][2])); Op0BS = (Op0BX*matrixA[0][0]+Op0BY*matrixA2[0][1]+Op0BZ*matrixA2[0][2]);
#ifdef DebugDSP1 #ifdef DebugDSP1
Log_Message("OP0B"); Log_Message("OP0B");
#endif #endif
@@ -1345,7 +1322,7 @@ void DSPOp0B()
void DSPOp1B() void DSPOp1B()
{ {
Op1BS = (short)((Op1BX*matrixA2[0][0]+Op1BY*matrixA2[0][1]+Op1BZ*matrixA2[0][2])); Op1BS = (Op1BX*matrixA2[0][0]+Op1BY*matrixA2[0][1]+Op1BZ*matrixA2[0][2]);
#ifdef DebugDSP1 #ifdef DebugDSP1
Log_Message("OP1B X: %d Y: %d Z: %d S: %d",Op1BX,Op1BY,Op1BZ,Op1BS); Log_Message("OP1B X: %d Y: %d Z: %d S: %d",Op1BX,Op1BY,Op1BZ,Op1BS);
Log_Message(" MX: %d MY: %d MZ: %d Scale: %d",(short)(matrixA2[0][0]*100),(short)(matrixA2[0][1]*100),(short)(matrixA2[0][2]*100),(short)(sc2*100)); Log_Message(" MX: %d MY: %d MZ: %d Scale: %d",(short)(matrixA2[0][0]*100),(short)(matrixA2[0][1]*100),(short)(matrixA2[0][2]*100),(short)(sc2*100));
@@ -1355,7 +1332,7 @@ void DSPOp1B()
void DSPOp2B() void DSPOp2B()
{ {
Op2BS = (short)((Op2BX*matrixA3[0][0]+Op2BY*matrixA3[0][1]+Op2BZ*matrixA3[0][2])); Op2BS = (Op2BX*matrixA3[0][0]+Op2BY*matrixA3[0][1]+Op2BZ*matrixA3[0][2]);
#ifdef DebugDSP1 #ifdef DebugDSP1
Log_Message("OP2B"); Log_Message("OP2B");
#endif #endif
@@ -1366,8 +1343,6 @@ long Op08Size;
void DSPOp08() void DSPOp08()
{ {
// This is bit accurate to DSP1B when compiled with VC 6 on a P4
Op08Size=(Op08X*Op08X+Op08Y*Op08Y+Op08Z*Op08Z)*2; Op08Size=(Op08X*Op08X+Op08Y*Op08Y+Op08Z*Op08Z)*2;
Op08Ll = Op08Size&0xFFFF; Op08Ll = Op08Size&0xFFFF;
Op08Lh = (Op08Size>>16) & 0xFFFF; Op08Lh = (Op08Size>>16) & 0xFFFF;
@@ -1381,12 +1356,12 @@ short Op18X,Op18Y,Op18Z,Op18R,Op18D;
void DSPOp18() void DSPOp18()
{ {
// This is bit accurate to DSP1B when compiled with VC6 on a P4 double x,y,z,r;
int x,y,z,r; // int32
x=Op18X; y=Op18Y; z=Op18Z; r=Op18R; x=Op18X; y=Op18Y; z=Op18Z; r=Op18R;
r = (x*x+y*y+z*z-r*r); r = (x*x+y*y+z*z-r*r);
Op18D=(short) (r >> 15); if (r>32767) r=32767;
if (r<-32768) r=-32768;
Op18D=(short)r;
#ifdef DebugDSP1 #ifdef DebugDSP1
Log_Message("OP18 X: %d Y: %d Z: %d R: %D DIFF %d",Op18X,Op18Y,Op18Z,Op18D); Log_Message("OP18 X: %d Y: %d Z: %d R: %D DIFF %d",Op18X,Op18Y,Op18Z,Op18D);
#endif #endif
@@ -1399,9 +1374,6 @@ short Op28R;
void DSPOp28() void DSPOp28()
{ {
// This works pretty good until r overflows from 0x7fff, then it goes to h*ll.
// Hopefully games don't count on overflow cases matching the DSP
Op28R=(short)sqrt(Op28X*Op28X+Op28Y*Op28Y+Op28Z*Op28Z); Op28R=(short)sqrt(Op28X*Op28X+Op28Y*Op28Y+Op28Z*Op28Z);
#ifdef DebugDSP1 #ifdef DebugDSP1
Log_Message("OP28 X:%d Y:%d Z:%d",Op28X,Op28Y,Op28Z); Log_Message("OP28 X:%d Y:%d Z:%d",Op28X,Op28Y,Op28Z);
@@ -1409,7 +1381,8 @@ void DSPOp28()
#endif #endif
} }
short Op1CX,Op1CY,Op1CZ; short Op1CAZ;
unsigned short Op1CX,Op1CY,Op1CZ;
short Op1CXBR,Op1CYBR,Op1CZBR,Op1CXAR,Op1CYAR,Op1CZAR; short Op1CXBR,Op1CYBR,Op1CZBR,Op1CXAR,Op1CYAR,Op1CZAR;
short Op1CX1; short Op1CX1;
short Op1CY1; short Op1CY1;
@@ -1427,17 +1400,17 @@ void DSPOp1C()
za = Angle(Op1CZ); za = Angle(Op1CZ);
// rotate around Z // rotate around Z
Op1CX1=(short)((Op1CXBR*Cos(za)+Op1CYBR*Sin(za))); Op1CX1=(Op1CXBR*Cos(za)+Op1CYBR*Sin(za));
Op1CY1=(short)((Op1CXBR*-Sin(za)+Op1CYBR*Cos(za))); Op1CY1=(Op1CXBR*-Sin(za)+Op1CYBR*Cos(za));
Op1CZ1=Op1CZBR; Op1CZ1=Op1CZBR;
// rotate around Y // rotate around Y
Op1CX2=(short)((Op1CX1*Cos(ya)+Op1CZ1*-Sin(ya))); Op1CX2=(Op1CX1*Cos(ya)+Op1CZ1*-Sin(ya));
Op1CY2=Op1CY1; Op1CY2=Op1CY1;
Op1CZ2=(short)((Op1CX1*Sin(ya)+Op1CZ1*Cos(ya))); Op1CZ2=(Op1CX1*Sin(ya)+Op1CZ1*Cos(ya));
// rotate around X // rotate around X
Op1CXAR=Op1CX2; Op1CXAR=Op1CX2;
Op1CYAR=(short)((Op1CY2*Cos(xa)+Op1CZ2*Sin(xa))); Op1CYAR=(Op1CY2*Cos(xa)+Op1CZ2*Sin(xa));
Op1CZAR=(short)((Op1CY2*-Sin(xa)+Op1CZ2*Cos(xa))); Op1CZAR=(Op1CY2*-Sin(xa)+Op1CZ2*Cos(xa));
#ifdef DebugDSP1 #ifdef DebugDSP1
Log_Message("OP1C Apply Matrix CX:%d CY:%d CZ",Op1CXAR,Op1CYAR,Op1CZAR); Log_Message("OP1C Apply Matrix CX:%d CY:%d CZ",Op1CXAR,Op1CYAR,Op1CZAR);
@@ -1447,10 +1420,9 @@ void DSPOp1C()
void DSPOp1C() void DSPOp1C()
{ {
double ya,xa,za; double ya,xa,za;
ya = Op1CX/32768.0*PI; ya = Op1CX/65536.0*PI*2;
xa = Op1CY/32768.0*PI; xa = Op1CY/65536.0*PI*2;
za = Op1CZ/32768.0*PI; za = Op1CZ/65536.0*PI*2;
// rotate around Z // rotate around Z
Op1CX1=(Op1CXBR*cos(za)+Op1CYBR*sin(za)); Op1CX1=(Op1CXBR*cos(za)+Op1CYBR*sin(za));
Op1CY1=(Op1CXBR*-sin(za)+Op1CYBR*cos(za)); Op1CY1=(Op1CXBR*-sin(za)+Op1CYBR*cos(za));
@@ -1470,20 +1442,3 @@ void DSPOp1C()
} }
#endif #endif
// Op 0F = Test DSP1 RAM
// Returns 0x0000 if RAM checks OK
unsigned short Op0FRamsize;
unsigned short Op0FPass;
void DSPOp0F()
{
// We use our PC's RAM, not DSP1 RAM but we need to pass the RAM check
Op0FPass = 0x0000;
return;
#ifdef DebugDSP1
Log_Message("OP0F RAM Test Pass:%d", Op0FPass);
#endif
}

View File

@@ -22,7 +22,6 @@ EXTSYM DSPOp0A,Op0AA,Op0AB,Op0AC,Op0AD,Op0AVS,DSPOp10
EXTSYM debstop EXTSYM debstop
EXTSYM DSPOp00,Op00Multiplicand,Op00Multiplier EXTSYM DSPOp00,Op00Multiplicand,Op00Multiplier
EXTSYM Op00Result EXTSYM Op00Result
;EXTSYM DSPOp10,Op10a,Op10b,Op10A,Op10B
EXTSYM DSPOp0F,Op0FPass EXTSYM DSPOp0F,Op0FPass
EXTSYM DSPOp04,Op04Angle,Op04Cos,Op04Radius,Op04Sin EXTSYM DSPOp04,Op04Angle,Op04Cos,Op04Radius,Op04Sin
EXTSYM DSPOp28,Op28R,Op28X,Op28Y,Op28Z EXTSYM DSPOp28,Op28R,Op28X,Op28Y,Op28Z
@@ -54,9 +53,11 @@ NEWSYM Dsp1ProcAsmStart
SECTION .bss
NEWSYM dsp1ptr, resd 1
NEWSYM dsp1array, resb 4096
NEWSYM dsp1ptr, dd 0 SECTION .text
NEWSYM dsp1array, times 4096 db 0
;******************************************************* ;*******************************************************
; DSP1 Read Functions ; DSP1 Read Functions
@@ -75,7 +76,6 @@ NEWSYM DSP1Read8b3F
mov al,80h mov al,80h
ret ret
NEWSYM DSP1Read16b3F NEWSYM DSP1Read16b3F
test ecx,8000h test ecx,8000h
jnz .dsp1area jnz .dsp1area
@@ -85,7 +85,7 @@ NEWSYM DSP1Read16b3F
jae .doC000 jae .doC000
cmp byte[DSP1RLeft],0 cmp byte[DSP1RLeft],0
jne .movestuff jne .movestuff
mov ax,0FFFFh xor ax,ax
ret ret
.doC000 .doC000
mov ax,08000h mov ax,08000h
@@ -145,7 +145,7 @@ NEWSYM DSP1Read16b
jae .do7000 jae .do7000
cmp byte[DSP1RLeft],0 cmp byte[DSP1RLeft],0
jne .movestuff jne .movestuff
mov ax,0FFFFh xor ax,ax
ret ret
.do7000 .do7000
mov ax,8000h mov ax,8000h
@@ -305,16 +305,19 @@ NEWSYM DSP1Write16b
DSP1WriteProc 0Fh, DSP1_0F ; DSP RAM Check DSP1WriteProc 0Fh, DSP1_0F ; DSP RAM Check
ret ret
NEWSYM DSP1COp, db 0 SECTION .bss
NEWSYM DSP1RLeft, db 0 NEWSYM DSP1COp, resb 1
NEWSYM DSP1WLeft, db 0 NEWSYM DSP1RLeft, resb 1
NEWSYM DSP1CPtrW, db 0 NEWSYM DSP1WLeft, resb 1
NEWSYM DSP1CPtrR, db 0 NEWSYM DSP1CPtrW, resb 1
NEWSYM DSP1VARS, times 16 dw 0 NEWSYM DSP1CPtrR, resb 1
NEWSYM DSP1RET, times 16 dw 0 NEWSYM DSP1VARS, resw 16
NEWSYM DSPDet, db 0 NEWSYM DSP1RET, resw 16
NEWSYM DSPDet, resb 1
NEWSYM DSPFuncUsed, times 256 db 0 NEWSYM DSPFuncUsed, resb 256
SECTION .text
;******************************************************* ;*******************************************************
; DSP1 Conversion Functions ; DSP1 Conversion Functions
@@ -337,6 +340,7 @@ DSP1_00: ; 16-bit multiply
EXTSYM Op10Exponent, Op10ExponentR EXTSYM Op10Exponent, Op10ExponentR
EXTSYM Op10Coefficient, Op10CoefficientR EXTSYM Op10Coefficient, Op10CoefficientR
DSP1_10: ; Inverse DSP1_10: ; Inverse
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -371,6 +375,7 @@ DSP1_04: ; Trigonometric
mov byte[DSP1RLeft],2 mov byte[DSP1RLeft],2
pop eax pop eax
ret ret
DSP1_08: ; Vector Size DSP1_08: ; Vector Size
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -389,6 +394,7 @@ DSP1_08: ; Vector Size
mov byte[DSP1RLeft],2 mov byte[DSP1RLeft],2
pop eax pop eax
ret ret
DSP1_18: ; Vector Size Comparison DSP1_18: ; Vector Size Comparison
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -426,7 +432,6 @@ DSP1_28: ; Vector Absolute Value
pop eax pop eax
ret ret
DSP1_0C: ; Coordinate Rotation DSP1_0C: ; Coordinate Rotation
or byte[DSPDet],08h or byte[DSPDet],08h
push eax push eax
@@ -446,6 +451,7 @@ DSP1_0C: ; Coordinate Rotation
mov byte[DSP1RLeft],2 mov byte[DSP1RLeft],2
pop eax pop eax
ret ret
DSP1_1C: ; 3D Coordinate Rotation DSP1_1C: ; 3D Coordinate Rotation
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -473,7 +479,6 @@ DSP1_1C: ; 3D Coordinate Rotation
pop eax pop eax
ret ret
DSP1_02: ; Vector Size DSP1_02: ; Vector Size
or byte[DSPDet],10h or byte[DSPDet],10h
push eax push eax
@@ -564,6 +569,7 @@ DSP1_0A: ; Raster Data Calculation via DMA
mov byte[DSP1RLeft],4 mov byte[DSP1RLeft],4
pop eax pop eax
ret ret
DSP1_06: ; Object Projection Calculation DSP1_06: ; Object Projection Calculation
or byte[DSPDet],40h or byte[DSPDet],40h
push eax push eax
@@ -603,6 +609,7 @@ DSP1_06: ; Object Projection Calculation
mov [eax+11],bx mov [eax+11],bx
pop ebx pop ebx
add dword[dsp1ptr],13 add dword[dsp1ptr],13
DSP1_0E: ; Coordinate Calculation of a point onscreen DSP1_0E: ; Coordinate Calculation of a point onscreen
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -619,6 +626,7 @@ DSP1_0E: ; Coordinate Calculation of a point onscreen
mov byte[DSP1RLeft],2 mov byte[DSP1RLeft],2
pop eax pop eax
ret ret
DSP1_01: ; Set Attitude Matrix A DSP1_01: ; Set Attitude Matrix A
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -634,6 +642,7 @@ DSP1_01: ; Set Attitude Matrix A
popad popad
pop eax pop eax
ret ret
DSP1_11: ; Set Attitude Matrix B DSP1_11: ; Set Attitude Matrix B
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -649,6 +658,7 @@ DSP1_11: ; Set Attitude Matrix B
popad popad
pop eax pop eax
ret ret
DSP1_21: ; Set Attitude Matrix C DSP1_21: ; Set Attitude Matrix C
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -664,6 +674,7 @@ DSP1_21: ; Set Attitude Matrix C
popad popad
pop eax pop eax
ret ret
DSP1_0D: ; Convert from global to object coords Matrix A DSP1_0D: ; Convert from global to object coords Matrix A
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -684,6 +695,7 @@ DSP1_0D: ; Convert from global to object coords Matrix A
mov byte[DSP1RLeft],3 mov byte[DSP1RLeft],3
pop eax pop eax
ret ret
DSP1_0F: ; DSP RAM Test DSP1_0F: ; DSP RAM Test
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -695,6 +707,7 @@ DSP1_0F: ; DSP RAM Test
mov byte[DSP1RLeft],1 mov byte[DSP1RLeft],1
pop eax pop eax
ret ret
DSP1_1D: ; Convert from global to object coords Matrix B DSP1_1D: ; Convert from global to object coords Matrix B
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -715,6 +728,7 @@ DSP1_1D: ; Convert from global to object coords Matrix B
mov byte[DSP1RLeft],3 mov byte[DSP1RLeft],3
pop eax pop eax
ret ret
DSP1_2D: ; Convert from global to object coords Matrix C DSP1_2D: ; Convert from global to object coords Matrix C
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -735,6 +749,7 @@ DSP1_2D: ; Convert from global to object coords Matrix C
mov byte[DSP1RLeft],3 mov byte[DSP1RLeft],3
pop eax pop eax
ret ret
DSP1_03: ; Convert from object to global coords Matrix A DSP1_03: ; Convert from object to global coords Matrix A
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -755,6 +770,7 @@ DSP1_03: ; Convert from object to global coords Matrix A
mov byte[DSP1RLeft],3 mov byte[DSP1RLeft],3
pop eax pop eax
ret ret
DSP1_13: ; Convert from object to global coords Matrix B DSP1_13: ; Convert from object to global coords Matrix B
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -775,6 +791,7 @@ DSP1_13: ; Convert from object to global coords Matrix B
mov byte[DSP1RLeft],3 mov byte[DSP1RLeft],3
pop eax pop eax
ret ret
DSP1_23: ; Convert from object to global coords Matrix C DSP1_23: ; Convert from object to global coords Matrix C
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -795,6 +812,7 @@ DSP1_23: ; Convert from object to global coords Matrix C
mov byte[DSP1RLeft],3 mov byte[DSP1RLeft],3
pop eax pop eax
ret ret
DSP1_0B: ; Calculation of inner product Matrix A DSP1_0B: ; Calculation of inner product Matrix A
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -811,6 +829,7 @@ DSP1_0B: ; Calculation of inner product Matrix A
mov byte[DSP1RLeft],1 mov byte[DSP1RLeft],1
pop eax pop eax
ret ret
DSP1_1B: ; Calculation of inner product Matrix B DSP1_1B: ; Calculation of inner product Matrix B
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -827,6 +846,7 @@ DSP1_1B: ; Calculation of inner product Matrix B
mov byte[DSP1RLeft],1 mov byte[DSP1RLeft],1
pop eax pop eax
ret ret
DSP1_2B: ; Calculation of inner product Matrix C DSP1_2B: ; Calculation of inner product Matrix C
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]
@@ -843,6 +863,7 @@ DSP1_2B: ; Calculation of inner product Matrix C
mov byte[DSP1RLeft],1 mov byte[DSP1RLeft],1
pop eax pop eax
ret ret
DSP1_14: ; 3D angle rotation DSP1_14: ; 3D angle rotation
push eax push eax
mov ax,[DSP1VARS] mov ax,[DSP1VARS]

View File

@@ -37,10 +37,10 @@ NEWSYM FlushCache
; Copy 512 bytes from pb:eax to SfxCACHERAM ; Copy 512 bytes from pb:eax to SfxCACHERAM
ret ret
SECTION .data SECTION .bss
NEWSYM tempsfx, db 0,0,0 NEWSYM tempsfx, resb 3
ALIGN32 SECTION .data ;ALIGN=32
; FxChip emulation by _Demo_ ; FxChip emulation by _Demo_
; Optimised by zsKnight ; Optimised by zsKnight
@@ -119,7 +119,6 @@ NEWSYM SfxB, dd 0 ; B flag (1 when with instruction executed)
NEWSYM SfxOverflow, dd 0 ; Overflow flag NEWSYM SfxOverflow, dd 0 ; Overflow flag
NEWSYM SfxCACHERAM, times 512 db 0 ; 512 bytes of GSU cache memory NEWSYM SfxCACHERAM, times 512 db 0 ; 512 bytes of GSU cache memory
SECTION .data
num2writesfxreg equ $-SfxR0 num2writesfxreg equ $-SfxR0
; pharos equ hack *sigh* ; pharos equ hack *sigh*
NEWSYM PHnum2writesfxreg, dd num2writesfxreg NEWSYM PHnum2writesfxreg, dd num2writesfxreg
@@ -844,10 +843,13 @@ NEWSYM FxOp4C ; PLOT plot pixel with R1,R2 as x,y and the color register
inc word [SfxR1] inc word [SfxR1]
ret ret
.prevx dw 0 SECTION .bss
.prevy dw 0 .prevx resw 1
.prevy resw 1
sfxwarning db 0 sfxwarning resb 1
SECTION .text
NEWSYM FxOp4CA1 ; RPIX read color of the pixel with R1,R2 as x,y NEWSYM FxOp4CA1 ; RPIX read color of the pixel with R1,R2 as x,y
FETCHPIPE FETCHPIPE
@@ -2646,11 +2648,13 @@ NEWSYM FxOpFFA2 ; SM (XX),RN store word in RAM
CLRFLAGS CLRFLAGS
ret ret
ALIGN32 SECTION .bss ;ALIGN=32
NEWSYM NumberOfOpcodes, dd 0 ; Number of opcodes to execute NEWSYM NumberOfOpcodes, resd 1 ; Number of opcodes to execute
NEWSYM NumberOfOpcodesBU, dd 0 ; Number of opcodes to execute backup value NEWSYM NumberOfOpcodesBU, resd 1 ; Number of opcodes to execute backup value
NEWSYM sfxwarningb, db 0 NEWSYM sfxwarningb, resb 1
SECTION .text
NEWSYM MainLoop NEWSYM MainLoop
mov eax,[SfxPBR] mov eax,[SfxPBR]

View File

@@ -39,7 +39,7 @@ NEWSYM FxEmu2CAsmStart
SECTION .text ;ALIGN=32
ALIGN32 ALIGN32
NEWSYM FxOpd00 ; STOP stop GSU execution (and maybe generate an IRQ) ; Verified. NEWSYM FxOpd00 ; STOP stop GSU execution (and maybe generate an IRQ) ; Verified.
@@ -747,8 +747,11 @@ NEWSYM FxOpd4C ; PLOT plot pixel with R1,R2 as x,y and the color register
inc word [SfxR1] inc word [SfxR1]
FXReturn FXReturn
.prevx dw 0 SECTION .bss
.prevy dw 0 .prevx resw 1
.prevy resw 1
SECTION .text
NEWSYM FxOpd4CA1 ; RPIX read color of the pixel with R1,R2 as x,y NEWSYM FxOpd4CA1 ; RPIX read color of the pixel with R1,R2 as x,y
FETCHPIPE FETCHPIPE

View File

@@ -199,11 +199,12 @@ NEWSYM FxTableAsmStart
SECTION .bss ;ALIGN=32
NEWSYM sfx128lineloc, dd 0 NEWSYM sfx128lineloc, resd 1
NEWSYM sfx160lineloc, dd 0 NEWSYM sfx160lineloc, resd 1
NEWSYM sfx192lineloc, dd 0 NEWSYM sfx192lineloc, resd 1
NEWSYM sfxobjlineloc, dd 0 NEWSYM sfxobjlineloc, resd 1
SECTION .text
NEWSYM InitFxTables NEWSYM InitFxTables
@@ -3222,6 +3223,7 @@ NEWSYM InitFxTables
ret ret
; normal ; normal
SECTION .data
NEWSYM sfxnametab NEWSYM sfxnametab
db 'STOP NOP CACHE LSR ' db 'STOP NOP CACHE LSR '
db 'ROL BRA BLT BGE ' db 'ROL BRA BLT BGE '
@@ -3544,4 +3546,6 @@ NEWSYM sfxnametab
db 'IWT R8 IWT R9 IWT R10 IWT R11 ' db 'IWT R8 IWT R9 IWT R10 IWT R11 '
db 'IWT R12 IWT R13 IWT R14 IWT R15 ' db 'IWT R12 IWT R13 IWT R14 IWT R15 '
SECTION .text
NEWSYM FxTableAsmEnd NEWSYM FxTableAsmEnd

View File

@@ -18,7 +18,7 @@
%include "macros.mac" %include "macros.mac"
EXTSYM xa,xx,xy,xd,xdb,xpb,xs,xe,initaddrl,UpdateDPage,wramdata,IRAM,cycpbl,SA1DoIRQ EXTSYM xa,xx,xy,xd,xdb,xpb,xs,xe,initaddrl,UpdateDPage,wramdata,IRAM,cycpbl,SA1DoIRQ
EXTSYM spcnumread,SA1IRQEn,nextopcodesa1,debugds EXTSYM spcnumread,spchalted,SA1IRQEn,nextopcodesa1,debugds
EXTSYM SNSRegP,SNSRegE,SNSRegPCS,SA1Ptr,SNSPtr,nmiv,irqv,nmiv2,irqv2,snesmap2,SA1tablead EXTSYM SNSRegP,SNSRegE,SNSRegPCS,SA1Ptr,SNSPtr,nmiv,irqv,nmiv2,irqv2,snesmap2,SA1tablead
EXTSYM SA1xpb,SA1RegP,wramdataa,SA1TimerVal,debuggeron EXTSYM SA1xpb,SA1RegP,wramdataa,SA1TimerVal,debuggeron
EXTSYM SA1RegE,SA1RegPCS,SA1BWPtr,SNSBWPtr,CurBWPtr,SA1NMIV,SA1IRQV,debstop,tablead EXTSYM SA1RegE,SA1RegPCS,SA1BWPtr,SNSBWPtr,CurBWPtr,SA1NMIV,SA1IRQV,debstop,tablead
@@ -35,14 +35,16 @@ NEWSYM Sa1ProcAsmStart
; *** Disable spc700 if possible *** ; *** Disable spc700 if possible ***
SECTION .bss ;ALIGN=32
NEWSYM SA1Status, resb 1 ; 0 = 65816, 1 = SA1A, 2 = SA1B
NEWSYM SA1Status, db 0 ; 0 = 65816, 1 = SA1A, 2 = SA1B NEWSYM CurrentExecSA1, resb 1
NEWSYM CurrentCPU, resb 1
NEWSYM CurrentExecSA1, db 0 ;ALIGN32
NEWSYM CurrentCPU, db 0 NEWSYM prevedi, resd 1
ALIGN32 SECTION .text
NEWSYM prevedi, dd 0
%macro SA1Debugb 0 %macro SA1Debugb 0
pushad pushad
@@ -232,7 +234,9 @@ NEWSYM SA1Swap
or byte[SA1DoIRQ],8 or byte[SA1DoIRQ],8
jmp .returnirq jmp .returnirq
NEWSYM SA1xpc, dd 0 SECTION .bss
NEWSYM SA1xpc, resd 1
SECTION .text
%macro makedl 0 %macro makedl 0
and dl,00111100b and dl,00111100b

View File

@@ -62,9 +62,8 @@ NEWSYM Sa1RegsAsmStart
SECTION .data ;ALIGN=32
ALIGN32
NEWSYM SPCMultA, dd 0 NEWSYM SPCMultA, dd 0
NEWSYM SPCMultB, dd 0 NEWSYM SPCMultB, dd 0
NEWSYM SPCDivEnd, dd 0 NEWSYM SPCDivEnd, dd 0
@@ -96,6 +95,8 @@ NEWSYM SPC7110TempPosition, dd 0
NEWSYM SPC7110TempLength, dd 0 NEWSYM SPC7110TempLength, dd 0
NEWSYM SPCPrevCompPtr, dd 0 NEWSYM SPCPrevCompPtr, dd 0
SECTION .text
RTC2800: RTC2800:
push ebx push ebx
cmp dword[RTCRest],100 cmp dword[RTCRest],100
@@ -274,7 +275,10 @@ SPC485F:
mov al,[SPC7110RTC+0Fh] mov al,[SPC7110RTC+0Fh]
ret ret
NEWSYM SPCDecompFin, dd 0 SECTION .bss
NEWSYM SPCDecompFin, resd 1
SECTION .text
NEWSYM SPC7110init NEWSYM SPC7110init
mov dword[SPCMultA],0 mov dword[SPCMultA],0
@@ -592,16 +596,19 @@ SPC480C: ; decompression finished status
mov byte[SPCDecompFin],0 mov byte[SPCDecompFin],0
ret ret
NEWSYM CurPtrVal, dd 0 SECTION .bss
NEWSYM CurCompCounter2, dd 0 NEWSYM CurPtrVal, resd 1
NEWSYM CurPtrLen, dd 0 NEWSYM CurCompCounter2, resd 1
NEWSYM CurValUsed, db 0 NEWSYM CurPtrLen, resd 1
NEWSYM PrevDecompPtr, dw 0 NEWSYM CurValUsed, resb 1
NEWSYM CurDecompPtr, dw 0 NEWSYM PrevDecompPtr, resw 1
NEWSYM CurDecompSize, dw 0 NEWSYM CurDecompPtr, resw 1
NEWSYM DecompArray, times 65536 db 0 NEWSYM CurDecompSize, resw 1
NEWSYM DecompAPtr, dd 0 NEWSYM DecompArray, resb 65536
lastentry dd 0 NEWSYM DecompAPtr, resd 1
lastentry resd 1
SECTION .text
NEWSYM UpdateRTC NEWSYM UpdateRTC
@@ -1423,11 +1430,14 @@ SPC4841:
mov al,byte[SPC7110RTCStat+2] mov al,byte[SPC7110RTCStat+2]
ret ret
SECTION .data
SPCTimerVal SPCTimerVal
db 12h,01h,02h,03h,04h,05h,06h,07h,08h,09h,0,0,0,0,0,0 db 12h,01h,02h,03h,04h,05h,06h,07h,08h,09h,0,0,0,0,0,0
db 10h,11h,32h,21h,22h,23h,24h,25h,26h,27h,0,0,0,0,0,0 db 10h,11h,32h,21h,22h,23h,24h,25h,26h,27h,0,0,0,0,0,0
db 28h,29h db 28h,29h
SECTION .text
SPC4842: SPC4842:
mov al,80h mov al,80h
ret ret
@@ -1461,7 +1471,7 @@ SPC4842:
; SA-1 Start ; SA-1 Start
; ---------- ; ----------
ALIGN32 SECTION .data ;ALIGN=32
; IRQ Stuff ; IRQ Stuff
NEWSYM SA1Mode, dd 0 ; 0 = SNES CPU, 1 = SA1 CPU NEWSYM SA1Mode, dd 0 ; 0 = SNES CPU, 1 = SA1 CPU
@@ -1547,6 +1557,8 @@ NEWSYM Sdd1Bank, dd 0
NEWSYM Sdd1Addr, dd 0 NEWSYM Sdd1Addr, dd 0
NEWSYM Sdd1NewAddr, dd 0 NEWSYM Sdd1NewAddr, dd 0
SECTION .text
%macro SA1QuickF 2 %macro SA1QuickF 2
NEWSYM %1 NEWSYM %1
mov [%2],al mov [%2],al
@@ -2297,8 +2309,11 @@ NEWSYM sa12239w
mov [SA1DMACount+1],al mov [SA1DMACount+1],al
ret ret
NEWSYM sa1dmaptr, dd 0 SECTION .bss
NEWSYM sa1dmaptrs, dd 0 NEWSYM sa1dmaptr, resd 1
NEWSYM sa1dmaptrs, resd 1
SECTION .text
NEWSYM sa1dmairam NEWSYM sa1dmairam
mov ebx,[SA1DMADest] mov ebx,[SA1DMADest]
@@ -2359,8 +2374,10 @@ executesa1dma:
pop edx pop edx
ret ret
SECTION .bss
tempblah resb 1
tempblah db 0 SECTION .text
%macro setbit2b 2 %macro setbit2b 2
test al,%1 test al,%1
@@ -2553,7 +2570,10 @@ sa1chconv:
popad popad
ret ret
.numrows dd 0 SECTION .bss
.numrows resd 1
SECTION .text
NEWSYM initSA1regs NEWSYM initSA1regs
setreg 2300h*4,sa12300r setreg 2300h*4,sa12300r

View File

@@ -190,7 +190,10 @@ NEWSYM cacheregw
or byte[cachewarning],2 or byte[cachewarning],2
ret ret
NEWSYM cachewarning, db 0 SECTION .bss
NEWSYM cachewarning, resb 1
SECTION .text
; SFX Registers ; SFX Registers
@@ -315,7 +318,10 @@ NEWSYM reg3031r
.cleared .cleared
mov al,[SfxSFR+1] mov al,[SfxSFR+1]
ret ret
.test db 0 SECTION .bss
.test resb 1
SECTION .text
NEWSYM reg3032r ; Unused NEWSYM reg3032r ; Unused
xor al,al xor al,al
ret ret