1 /***************************************************************************
2 * Copyright (C) 2010 PCSX4ALL Team *
3 * Copyright (C) 2010 Unai *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. *
19 ***************************************************************************/
21 ///////////////////////////////////////////////////////////////////////////////
22 INLINE void gpuSetTexture(u16 tpage)
26 GPU_GP1 = (GPU_GP1 & ~0x7FF) | (tpage & 0x7FF);
28 TextureWindow[0]&= ~TextureWindow[2];
29 TextureWindow[1]&= ~TextureWindow[3];
31 tp = (tpage >> 7) & 3;
32 tx = (tpage & 0x0F) << 6;
33 ty = (tpage & 0x10) << 4;
35 tx += (TextureWindow[0] >> (2 - tp));
36 ty += TextureWindow[1];
38 BLEND_MODE = (((tpage>>5)&0x3) ) << 3;
39 TEXT_MODE = (((tpage>>7)&0x3) + 1 ) << 5; // +1 el cero no lo usamos
41 TBA = &((u16*)GPU_FrameBuffer)[FRAME_OFFSET(tx, ty)];
45 ///////////////////////////////////////////////////////////////////////////////
46 INLINE void gpuSetCLUT(u16 clut)
48 CBA = &((u16*)GPU_FrameBuffer)[(clut & 0x7FFF) << 4];
51 #ifdef ENABLE_GPU_NULL_SUPPORT
52 #define NULL_GPU() break
57 #ifdef ENABLE_GPU_LOG_SUPPORT
58 #define DO_LOG(expr) printf expr
60 #define DO_LOG(expr) {}
63 #define Blending (((PRIM&0x2)&&(blend))?(PRIM&0x2):0)
64 #define Blending_Mode (((PRIM&0x2)&&(blend))?BLEND_MODE:0)
65 #define Lighting (((~PRIM)&0x1)&&(light))
67 void gpuSendPacketFunction(const int PRIM)
69 //printf("0x%x\n",PRIM);
75 gpuClearImage(); // prim handles updateLace && skip
76 DO_LOG(("gpuClearImage(0x%x)\n",PRIM));
85 gpuDrawF3(gpuPolySpanDrivers [Blending_Mode | Masking | Blending | PixelMSB]);
86 DO_LOG(("gpuDrawF3(0x%x)\n",PRIM));
96 gpuSetCLUT (PacketBuffer.U4[2] >> 16);
97 gpuSetTexture (PacketBuffer.U4[4] >> 16);
98 if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F))
99 gpuDrawFT3(gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | PixelMSB]);
101 gpuDrawFT3(gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | PixelMSB]);
102 DO_LOG(("gpuDrawFT3(0x%x)\n",PRIM));
112 const PP gpuPolySpanDriver = gpuPolySpanDrivers [Blending_Mode | Masking | Blending | PixelMSB];
113 //--PacketBuffer.S2[6];
114 gpuDrawF3(gpuPolySpanDriver);
115 PacketBuffer.U4[1] = PacketBuffer.U4[4];
116 //--PacketBuffer.S2[2];
117 gpuDrawF3(gpuPolySpanDriver);
118 DO_LOG(("gpuDrawF4(0x%x)\n",PRIM));
128 gpuSetCLUT (PacketBuffer.U4[2] >> 16);
129 gpuSetTexture (PacketBuffer.U4[4] >> 16);
130 PP gpuPolySpanDriver;
131 if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F))
132 gpuPolySpanDriver = gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | PixelMSB];
134 gpuPolySpanDriver = gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | PixelMSB];
135 //--PacketBuffer.S2[6];
136 gpuDrawFT3(gpuPolySpanDriver);
137 PacketBuffer.U4[1] = PacketBuffer.U4[7];
138 PacketBuffer.U4[2] = PacketBuffer.U4[8];
139 //--PacketBuffer.S2[2];
140 gpuDrawFT3(gpuPolySpanDriver);
141 DO_LOG(("gpuDrawFT4(0x%x)\n",PRIM));
151 gpuDrawG3(gpuPolySpanDrivers [Blending_Mode | Masking | Blending | 129 | PixelMSB]);
152 DO_LOG(("gpuDrawG3(0x%x)\n",PRIM));
162 gpuSetCLUT (PacketBuffer.U4[2] >> 16);
163 gpuSetTexture (PacketBuffer.U4[5] >> 16);
164 gpuDrawGT3(gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | ((Lighting)?129:0) | PixelMSB]);
165 DO_LOG(("gpuDrawGT3(0x%x)\n",PRIM));
175 const PP gpuPolySpanDriver = gpuPolySpanDrivers [Blending_Mode | Masking | Blending | 129 | PixelMSB];
176 //--PacketBuffer.S2[6];
177 gpuDrawG3(gpuPolySpanDriver);
178 PacketBuffer.U4[0] = PacketBuffer.U4[6];
179 PacketBuffer.U4[1] = PacketBuffer.U4[7];
180 //--PacketBuffer.S2[2];
181 gpuDrawG3(gpuPolySpanDriver);
182 DO_LOG(("gpuDrawG4(0x%x)\n",PRIM));
192 gpuSetCLUT (PacketBuffer.U4[2] >> 16);
193 gpuSetTexture (PacketBuffer.U4[5] >> 16);
194 const PP gpuPolySpanDriver = gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | ((Lighting)?129:0) | PixelMSB];
195 //--PacketBuffer.S2[6];
196 gpuDrawGT3(gpuPolySpanDriver);
197 PacketBuffer.U4[0] = PacketBuffer.U4[9];
198 PacketBuffer.U4[1] = PacketBuffer.U4[10];
199 PacketBuffer.U4[2] = PacketBuffer.U4[11];
200 //--PacketBuffer.S2[2];
201 gpuDrawGT3(gpuPolySpanDriver);
202 DO_LOG(("gpuDrawGT4(0x%x)\n",PRIM));
212 gpuDrawLF(gpuPixelDrivers [ (Blending_Mode | Masking | Blending | (PixelMSB>>3)) >> 1]);
213 DO_LOG(("gpuDrawLF(0x%x)\n",PRIM));
227 gpuDrawLF(gpuPixelDrivers [ (Blending_Mode | Masking | Blending | (PixelMSB>>3)) >> 1]);
228 DO_LOG(("gpuDrawLF(0x%x)\n",PRIM));
230 if ((PacketBuffer.U4[3] & 0xF000F000) != 0x50005000)
232 PacketBuffer.U4[1] = PacketBuffer.U4[2];
233 PacketBuffer.U4[2] = PacketBuffer.U4[3];
245 gpuDrawLG(gpuPixelDrivers [ (Blending_Mode | Masking | Blending | (PixelMSB>>3)) >> 1]);
246 DO_LOG(("gpuDrawLG(0x%x)\n",PRIM));
260 gpuDrawLG(gpuPixelDrivers [ (Blending_Mode | Masking | Blending | (PixelMSB>>3)) >> 1]);
261 DO_LOG(("gpuDrawLG(0x%x)\n",PRIM));
263 if ((PacketBuffer.U4[4] & 0xF000F000) != 0x50005000)
265 PacketBuffer.U1[3 + (2 * 4)] = PacketBuffer.U1[3 + (0 * 4)];
266 PacketBuffer.U4[0] = PacketBuffer.U4[2];
267 PacketBuffer.U4[1] = PacketBuffer.U4[3];
268 PacketBuffer.U4[2] = PacketBuffer.U4[4];
280 gpuDrawT(gpuTileSpanDrivers [Blending_Mode | Masking | Blending | (PixelMSB>>3)]);
281 DO_LOG(("gpuDrawT(0x%x)\n",PRIM));
291 gpuSetCLUT (PacketBuffer.U4[2] >> 16);
292 gpuSetTexture (GPU_GP1);
293 if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F))
294 gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | (enableAbbeyHack<<7) | PixelMSB]);
296 gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | (enableAbbeyHack<<7) | PixelMSB]);
297 DO_LOG(("gpuDrawS(0x%x)\n",PRIM));
307 PacketBuffer.U4[2] = 0x00010001;
308 gpuDrawT(gpuTileSpanDrivers [Blending_Mode | Masking | Blending | (PixelMSB>>3)]);
309 DO_LOG(("gpuDrawT(0x%x)\n",PRIM));
319 PacketBuffer.U4[2] = 0x00080008;
320 gpuDrawT(gpuTileSpanDrivers [Blending_Mode | Masking | Blending | (PixelMSB>>3)]);
321 DO_LOG(("gpuDrawT(0x%x)\n",PRIM));
331 PacketBuffer.U4[3] = 0x00080008;
332 gpuSetCLUT (PacketBuffer.U4[2] >> 16);
333 gpuSetTexture (GPU_GP1);
334 if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F))
335 gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | (enableAbbeyHack<<7) | PixelMSB]);
337 gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | (enableAbbeyHack<<7) | PixelMSB]);
338 DO_LOG(("gpuDrawS(0x%x)\n",PRIM));
348 PacketBuffer.U4[2] = 0x00100010;
349 gpuDrawT(gpuTileSpanDrivers [Blending_Mode | Masking | Blending | (PixelMSB>>3)]);
350 DO_LOG(("gpuDrawT(0x%x)\n",PRIM));
360 PacketBuffer.U4[3] = 0x00100010;
361 gpuSetCLUT (PacketBuffer.U4[2] >> 16);
362 gpuSetTexture (GPU_GP1);
363 if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F))
364 gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | (enableAbbeyHack<<7) | PixelMSB]);
366 gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | (enableAbbeyHack<<7) | PixelMSB]);
367 DO_LOG(("gpuDrawS(0x%x)\n",PRIM));
370 case 0x80: // vid -> vid
371 gpuMoveImage(); // prim handles updateLace && skip
372 DO_LOG(("gpuMoveImage(0x%x)\n",PRIM));
374 case 0xA0: // sys ->vid
375 gpuLoadImage(); // prim handles updateLace && skip
376 #ifndef isSkip // not a define
377 if (alt_fps) isSkip=false;
379 DO_LOG(("gpuLoadImage(0x%x)\n",PRIM));
381 case 0xC0: // vid -> sys
382 gpuStoreImage(); // prim handles updateLace && skip
383 DO_LOG(("gpuStoreImage(0x%x)\n",PRIM));
387 const u32 temp = PacketBuffer.U4[0];
388 GPU_GP1 = (GPU_GP1 & ~0x000007FF) | (temp & 0x000007FF);
390 DO_LOG(("gpuSetTexture(0x%x)\n",PRIM));
395 static const u8 TextureMask[32] = {
396 255, 7, 15, 7, 31, 7, 15, 7, 63, 7, 15, 7, 31, 7, 15, 7, //
397 127, 7, 15, 7, 31, 7, 15, 7, 63, 7, 15, 7, 31, 7, 15, 7 //
399 const u32 temp = PacketBuffer.U4[0];
400 TextureWindow[0] = ((temp >> 10) & 0x1F) << 3;
401 TextureWindow[1] = ((temp >> 15) & 0x1F) << 3;
402 TextureWindow[2] = TextureMask[(temp >> 0) & 0x1F];
403 TextureWindow[3] = TextureMask[(temp >> 5) & 0x1F];
404 gpuSetTexture(GPU_GP1);
406 DO_LOG(("TextureWindow(0x%x)\n",PRIM));
411 const u32 temp = PacketBuffer.U4[0];
412 DrawingArea[0] = temp & 0x3FF;
413 DrawingArea[1] = (temp >> 10) & 0x3FF;
415 DO_LOG(("DrawingArea_Pos(0x%x)\n",PRIM));
420 const u32 temp = PacketBuffer.U4[0];
421 DrawingArea[2] = (temp & 0x3FF) + 1;
422 DrawingArea[3] = ((temp >> 10) & 0x3FF) + 1;
424 DO_LOG(("DrawingArea_Size(0x%x)\n",PRIM));
429 const u32 temp = PacketBuffer.U4[0];
430 DrawingOffset[0] = ((long)temp<<(32-11))>>(32-11);
431 DrawingOffset[1] = ((long)temp<<(32-22))>>(32-11);
433 DO_LOG(("DrawingOffset(0x%x)\n",PRIM));
438 const u32 temp = PacketBuffer.U4[0];
439 //GPU_GP1 = (GPU_GP1 & ~0x00001800) | ((temp&3) << 11);
440 Masking = (temp & 0x2) << 1;
441 PixelMSB =(temp & 0x1) << 8;
442 DO_LOG(("SetMask(0x%x)\n",PRIM));