You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
448 lines
8.2 KiB
448 lines
8.2 KiB
/*****************************************************************************\
|
|
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
|
|
This file is licensed under the Snes9x License.
|
|
For further information, consult the LICENSE file in the root directory.
|
|
\*****************************************************************************/
|
|
|
|
#ifndef _DSP1_H_
|
|
#define _DSP1_H_
|
|
|
|
enum
|
|
{
|
|
M_DSP1_LOROM_S,
|
|
M_DSP1_LOROM_L,
|
|
M_DSP1_HIROM,
|
|
M_DSP2_LOROM,
|
|
M_DSP3_LOROM,
|
|
M_DSP4_LOROM
|
|
};
|
|
|
|
struct SDSP0
|
|
{
|
|
uint32 maptype;
|
|
uint32 boundary;
|
|
};
|
|
|
|
struct SDSP1
|
|
{
|
|
bool8 waiting4command;
|
|
bool8 first_parameter;
|
|
uint8 command;
|
|
uint32 in_count;
|
|
uint32 in_index;
|
|
uint32 out_count;
|
|
uint32 out_index;
|
|
uint8 parameters[512];
|
|
uint8 output[512];
|
|
|
|
int16 CentreX;
|
|
int16 CentreY;
|
|
int16 VOffset;
|
|
|
|
int16 VPlane_C;
|
|
int16 VPlane_E;
|
|
|
|
// Azimuth and Zenith angles
|
|
int16 SinAas;
|
|
int16 CosAas;
|
|
int16 SinAzs;
|
|
int16 CosAzs;
|
|
|
|
// Clipped Zenith angle
|
|
int16 SinAZS;
|
|
int16 CosAZS;
|
|
int16 SecAZS_C1;
|
|
int16 SecAZS_E1;
|
|
int16 SecAZS_C2;
|
|
int16 SecAZS_E2;
|
|
|
|
int16 Nx;
|
|
int16 Ny;
|
|
int16 Nz;
|
|
int16 Gx;
|
|
int16 Gy;
|
|
int16 Gz;
|
|
int16 C_Les;
|
|
int16 E_Les;
|
|
int16 G_Les;
|
|
|
|
int16 matrixA[3][3];
|
|
int16 matrixB[3][3];
|
|
int16 matrixC[3][3];
|
|
|
|
int16 Op00Multiplicand;
|
|
int16 Op00Multiplier;
|
|
int16 Op00Result;
|
|
|
|
int16 Op20Multiplicand;
|
|
int16 Op20Multiplier;
|
|
int16 Op20Result;
|
|
|
|
int16 Op10Coefficient;
|
|
int16 Op10Exponent;
|
|
int16 Op10CoefficientR;
|
|
int16 Op10ExponentR;
|
|
|
|
int16 Op04Angle;
|
|
int16 Op04Radius;
|
|
int16 Op04Sin;
|
|
int16 Op04Cos;
|
|
|
|
int16 Op0CA;
|
|
int16 Op0CX1;
|
|
int16 Op0CY1;
|
|
int16 Op0CX2;
|
|
int16 Op0CY2;
|
|
|
|
int16 Op02FX;
|
|
int16 Op02FY;
|
|
int16 Op02FZ;
|
|
int16 Op02LFE;
|
|
int16 Op02LES;
|
|
int16 Op02AAS;
|
|
int16 Op02AZS;
|
|
int16 Op02VOF;
|
|
int16 Op02VVA;
|
|
int16 Op02CX;
|
|
int16 Op02CY;
|
|
|
|
int16 Op0AVS;
|
|
int16 Op0AA;
|
|
int16 Op0AB;
|
|
int16 Op0AC;
|
|
int16 Op0AD;
|
|
|
|
int16 Op06X;
|
|
int16 Op06Y;
|
|
int16 Op06Z;
|
|
int16 Op06H;
|
|
int16 Op06V;
|
|
int16 Op06M;
|
|
|
|
int16 Op01m;
|
|
int16 Op01Zr;
|
|
int16 Op01Xr;
|
|
int16 Op01Yr;
|
|
|
|
int16 Op11m;
|
|
int16 Op11Zr;
|
|
int16 Op11Xr;
|
|
int16 Op11Yr;
|
|
|
|
int16 Op21m;
|
|
int16 Op21Zr;
|
|
int16 Op21Xr;
|
|
int16 Op21Yr;
|
|
|
|
int16 Op0DX;
|
|
int16 Op0DY;
|
|
int16 Op0DZ;
|
|
int16 Op0DF;
|
|
int16 Op0DL;
|
|
int16 Op0DU;
|
|
|
|
int16 Op1DX;
|
|
int16 Op1DY;
|
|
int16 Op1DZ;
|
|
int16 Op1DF;
|
|
int16 Op1DL;
|
|
int16 Op1DU;
|
|
|
|
int16 Op2DX;
|
|
int16 Op2DY;
|
|
int16 Op2DZ;
|
|
int16 Op2DF;
|
|
int16 Op2DL;
|
|
int16 Op2DU;
|
|
|
|
int16 Op03F;
|
|
int16 Op03L;
|
|
int16 Op03U;
|
|
int16 Op03X;
|
|
int16 Op03Y;
|
|
int16 Op03Z;
|
|
|
|
int16 Op13F;
|
|
int16 Op13L;
|
|
int16 Op13U;
|
|
int16 Op13X;
|
|
int16 Op13Y;
|
|
int16 Op13Z;
|
|
|
|
int16 Op23F;
|
|
int16 Op23L;
|
|
int16 Op23U;
|
|
int16 Op23X;
|
|
int16 Op23Y;
|
|
int16 Op23Z;
|
|
|
|
int16 Op14Zr;
|
|
int16 Op14Xr;
|
|
int16 Op14Yr;
|
|
int16 Op14U;
|
|
int16 Op14F;
|
|
int16 Op14L;
|
|
int16 Op14Zrr;
|
|
int16 Op14Xrr;
|
|
int16 Op14Yrr;
|
|
|
|
int16 Op0EH;
|
|
int16 Op0EV;
|
|
int16 Op0EX;
|
|
int16 Op0EY;
|
|
|
|
int16 Op0BX;
|
|
int16 Op0BY;
|
|
int16 Op0BZ;
|
|
int16 Op0BS;
|
|
|
|
int16 Op1BX;
|
|
int16 Op1BY;
|
|
int16 Op1BZ;
|
|
int16 Op1BS;
|
|
|
|
int16 Op2BX;
|
|
int16 Op2BY;
|
|
int16 Op2BZ;
|
|
int16 Op2BS;
|
|
|
|
int16 Op28X;
|
|
int16 Op28Y;
|
|
int16 Op28Z;
|
|
int16 Op28R;
|
|
|
|
int16 Op1CX;
|
|
int16 Op1CY;
|
|
int16 Op1CZ;
|
|
int16 Op1CXBR;
|
|
int16 Op1CYBR;
|
|
int16 Op1CZBR;
|
|
int16 Op1CXAR;
|
|
int16 Op1CYAR;
|
|
int16 Op1CZAR;
|
|
int16 Op1CX1;
|
|
int16 Op1CY1;
|
|
int16 Op1CZ1;
|
|
int16 Op1CX2;
|
|
int16 Op1CY2;
|
|
int16 Op1CZ2;
|
|
|
|
uint16 Op0FRamsize;
|
|
uint16 Op0FPass;
|
|
|
|
int16 Op2FUnknown;
|
|
int16 Op2FSize;
|
|
|
|
int16 Op08X;
|
|
int16 Op08Y;
|
|
int16 Op08Z;
|
|
int16 Op08Ll;
|
|
int16 Op08Lh;
|
|
|
|
int16 Op18X;
|
|
int16 Op18Y;
|
|
int16 Op18Z;
|
|
int16 Op18R;
|
|
int16 Op18D;
|
|
|
|
int16 Op38X;
|
|
int16 Op38Y;
|
|
int16 Op38Z;
|
|
int16 Op38R;
|
|
int16 Op38D;
|
|
};
|
|
|
|
struct SDSP2
|
|
{
|
|
bool8 waiting4command;
|
|
uint8 command;
|
|
uint32 in_count;
|
|
uint32 in_index;
|
|
uint32 out_count;
|
|
uint32 out_index;
|
|
uint8 parameters[512];
|
|
uint8 output[512];
|
|
|
|
bool8 Op05HasLen;
|
|
int32 Op05Len;
|
|
uint8 Op05Transparent;
|
|
|
|
bool8 Op06HasLen;
|
|
int32 Op06Len;
|
|
|
|
uint16 Op09Word1;
|
|
uint16 Op09Word2;
|
|
|
|
bool8 Op0DHasLen;
|
|
int32 Op0DOutLen;
|
|
int32 Op0DInLen;
|
|
};
|
|
|
|
struct SDSP3
|
|
{
|
|
uint16 DR;
|
|
uint16 SR;
|
|
uint16 MemoryIndex;
|
|
|
|
int16 WinLo;
|
|
int16 WinHi;
|
|
int16 AddLo;
|
|
int16 AddHi;
|
|
|
|
uint16 Codewords;
|
|
uint16 Outwords;
|
|
uint16 Symbol;
|
|
uint16 BitCount;
|
|
uint16 Index;
|
|
uint16 Codes[512];
|
|
uint16 BitsLeft;
|
|
uint16 ReqBits;
|
|
uint16 ReqData;
|
|
uint16 BitCommand;
|
|
uint8 BaseLength;
|
|
uint16 BaseCodes;
|
|
uint16 BaseCode;
|
|
uint8 CodeLengths[8];
|
|
uint16 CodeOffsets[8];
|
|
uint16 LZCode;
|
|
uint8 LZLength;
|
|
|
|
uint16 X;
|
|
uint16 Y;
|
|
|
|
uint8 Bitmap[8];
|
|
uint8 Bitplane[8];
|
|
uint16 BMIndex;
|
|
uint16 BPIndex;
|
|
uint16 Count;
|
|
|
|
int16 op3e_x;
|
|
int16 op3e_y;
|
|
|
|
int16 op1e_terrain[0x2000];
|
|
int16 op1e_cost[0x2000];
|
|
int16 op1e_weight[0x2000];
|
|
|
|
int16 op1e_cell;
|
|
int16 op1e_turn;
|
|
int16 op1e_search;
|
|
|
|
int16 op1e_x;
|
|
int16 op1e_y;
|
|
|
|
int16 op1e_min_radius;
|
|
int16 op1e_max_radius;
|
|
|
|
int16 op1e_max_search_radius;
|
|
int16 op1e_max_path_radius;
|
|
|
|
int16 op1e_lcv_radius;
|
|
int16 op1e_lcv_steps;
|
|
int16 op1e_lcv_turns;
|
|
};
|
|
|
|
struct SDSP4
|
|
{
|
|
bool8 waiting4command;
|
|
bool8 half_command;
|
|
uint16 command;
|
|
uint32 in_count;
|
|
uint32 in_index;
|
|
uint32 out_count;
|
|
uint32 out_index;
|
|
uint8 parameters[512];
|
|
uint8 output[512];
|
|
uint8 byte;
|
|
uint16 address;
|
|
|
|
// op control
|
|
int8 Logic; // controls op flow
|
|
|
|
// projection format
|
|
int16 lcv; // loop-control variable
|
|
int16 distance; // z-position into virtual world
|
|
int16 raster; // current raster line
|
|
int16 segments; // number of raster lines drawn
|
|
|
|
// 1.15.16 or 1.15.0 [sign, integer, fraction]
|
|
int32 world_x; // line of x-projection in world
|
|
int32 world_y; // line of y-projection in world
|
|
int32 world_dx; // projection line x-delta
|
|
int32 world_dy; // projection line y-delta
|
|
int16 world_ddx; // x-delta increment
|
|
int16 world_ddy; // y-delta increment
|
|
int32 world_xenv; // world x-shaping factor
|
|
int16 world_yofs; // world y-vertical scroll
|
|
int16 view_x1; // current viewer-x
|
|
int16 view_y1; // current viewer-y
|
|
int16 view_x2; // future viewer-x
|
|
int16 view_y2; // future viewer-y
|
|
int16 view_dx; // view x-delta factor
|
|
int16 view_dy; // view y-delta factor
|
|
int16 view_xofs1; // current viewer x-vertical scroll
|
|
int16 view_yofs1; // current viewer y-vertical scroll
|
|
int16 view_xofs2; // future viewer x-vertical scroll
|
|
int16 view_yofs2; // future viewer y-vertical scroll
|
|
int16 view_yofsenv; // y-scroll shaping factor
|
|
int16 view_turnoff_x; // road turnoff data
|
|
int16 view_turnoff_dx; // road turnoff delta factor
|
|
|
|
// drawing area
|
|
int16 viewport_cx; // x-center of viewport window
|
|
int16 viewport_cy; // y-center of render window
|
|
int16 viewport_left; // x-left of viewport
|
|
int16 viewport_right; // x-right of viewport
|
|
int16 viewport_top; // y-top of viewport
|
|
int16 viewport_bottom; // y-bottom of viewport
|
|
|
|
// sprite structure
|
|
int16 sprite_x; // projected x-pos of sprite
|
|
int16 sprite_y; // projected y-pos of sprite
|
|
int16 sprite_attr; // obj attributes
|
|
bool8 sprite_size; // sprite size: 8x8 or 16x16
|
|
int16 sprite_clipy; // visible line to clip pixels off
|
|
int16 sprite_count;
|
|
|
|
// generic projection variables designed for two solid polygons + two polygon sides
|
|
int16 poly_clipLf[2][2]; // left clip boundary
|
|
int16 poly_clipRt[2][2]; // right clip boundary
|
|
int16 poly_ptr[2][2]; // HDMA structure pointers
|
|
int16 poly_raster[2][2]; // current raster line below horizon
|
|
int16 poly_top[2][2]; // top clip boundary
|
|
int16 poly_bottom[2][2]; // bottom clip boundary
|
|
int16 poly_cx[2][2]; // center for left/right points
|
|
int16 poly_start[2]; // current projection points
|
|
int16 poly_plane[2]; // previous z-plane distance
|
|
|
|
// OAM
|
|
int16 OAM_attr[16]; // OAM (size, MSB) data
|
|
int16 OAM_index; // index into OAM table
|
|
int16 OAM_bits; // offset into OAM table
|
|
int16 OAM_RowMax; // maximum number of tiles per 8 aligned pixels (row)
|
|
int16 OAM_Row[32]; // current number of tiles per row
|
|
};
|
|
|
|
extern struct SDSP0 DSP0;
|
|
extern struct SDSP1 DSP1;
|
|
extern struct SDSP2 DSP2;
|
|
extern struct SDSP3 DSP3;
|
|
extern struct SDSP4 DSP4;
|
|
|
|
uint8 S9xGetDSP (uint16);
|
|
void S9xSetDSP (uint8, uint16);
|
|
void S9xResetDSP (void);
|
|
uint8 DSP1GetByte (uint16);
|
|
void DSP1SetByte (uint8, uint16);
|
|
uint8 DSP2GetByte (uint16);
|
|
void DSP2SetByte (uint8, uint16);
|
|
uint8 DSP3GetByte (uint16);
|
|
void DSP3SetByte (uint8, uint16);
|
|
uint8 DSP4GetByte (uint16);
|
|
void DSP4SetByte (uint8, uint16);
|
|
void DSP3_Reset (void);
|
|
|
|
extern uint8 (*GetDSP) (uint16);
|
|
extern void (*SetDSP) (uint8, uint16);
|
|
|
|
#endif
|