86aad47b |
1 | /*************************************************************************** |
2 | * Copyright (C) 2010 PCSX4ALL Team * |
3 | * Copyright (C) 2010 Unai * |
4 | * * |
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. * |
9 | * * |
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. * |
14 | * * |
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 | ***************************************************************************/ |
20 | |
21 | /////////////////////////////////////////////////////////////////////////////// |
22 | INLINE void gpuSetTexture(u16 tpage) |
23 | { |
4144e9ab |
24 | u32 tp; |
25 | u32 tx, ty; |
26 | GPU_GP1 = (GPU_GP1 & ~0x1FF) | (tpage & 0x1FF); |
86aad47b |
27 | |
28 | TextureWindow[0]&= ~TextureWindow[2]; |
29 | TextureWindow[1]&= ~TextureWindow[3]; |
30 | |
31 | tp = (tpage >> 7) & 3; |
32 | tx = (tpage & 0x0F) << 6; |
33 | ty = (tpage & 0x10) << 4; |
4144e9ab |
34 | if (tp == 3) tp = 2; |
86aad47b |
35 | |
36 | tx += (TextureWindow[0] >> (2 - tp)); |
37 | ty += TextureWindow[1]; |
38 | |
39 | BLEND_MODE = (((tpage>>5)&0x3) ) << 3; |
40 | TEXT_MODE = (((tpage>>7)&0x3) + 1 ) << 5; // +1 el cero no lo usamos |
41 | |
42 | TBA = &((u16*)GPU_FrameBuffer)[FRAME_OFFSET(tx, ty)]; |
43 | |
44 | } |
45 | |
46 | /////////////////////////////////////////////////////////////////////////////// |
47 | INLINE void gpuSetCLUT(u16 clut) |
48 | { |
49 | CBA = &((u16*)GPU_FrameBuffer)[(clut & 0x7FFF) << 4]; |
50 | } |
51 | |
52 | #ifdef ENABLE_GPU_NULL_SUPPORT |
53 | #define NULL_GPU() break |
54 | #else |
55 | #define NULL_GPU() |
56 | #endif |
57 | |
58 | #ifdef ENABLE_GPU_LOG_SUPPORT |
59 | #define DO_LOG(expr) printf expr |
60 | #else |
61 | #define DO_LOG(expr) {} |
62 | #endif |
63 | |
64 | #define Blending (((PRIM&0x2)&&(blend))?(PRIM&0x2):0) |
65 | #define Blending_Mode (((PRIM&0x2)&&(blend))?BLEND_MODE:0) |
66 | #define Lighting (((~PRIM)&0x1)&&(light)) |
67 | |
68 | void gpuSendPacketFunction(const int PRIM) |
69 | { |
70 | //printf("0x%x\n",PRIM); |
71 | |
72 | switch (PRIM) |
73 | { |
74 | case 0x02: |
75 | NULL_GPU(); |
76 | gpuClearImage(); // prim handles updateLace && skip |
77 | DO_LOG(("gpuClearImage(0x%x)\n",PRIM)); |
78 | break; |
79 | case 0x20: |
80 | case 0x21: |
81 | case 0x22: |
82 | case 0x23: |
83 | if (!isSkip) |
84 | { |
85 | NULL_GPU(); |
86 | gpuDrawF3(gpuPolySpanDrivers [Blending_Mode | Masking | Blending | PixelMSB]); |
87 | DO_LOG(("gpuDrawF3(0x%x)\n",PRIM)); |
88 | } |
89 | break; |
90 | case 0x24: |
91 | case 0x25: |
92 | case 0x26: |
93 | case 0x27: |
94 | if (!isSkip) |
95 | { |
96 | NULL_GPU(); |
97 | gpuSetCLUT (PacketBuffer.U4[2] >> 16); |
98 | gpuSetTexture (PacketBuffer.U4[4] >> 16); |
99 | if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F)) |
100 | gpuDrawFT3(gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | PixelMSB]); |
101 | else |
102 | gpuDrawFT3(gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | PixelMSB]); |
103 | DO_LOG(("gpuDrawFT3(0x%x)\n",PRIM)); |
104 | } |
105 | break; |
106 | case 0x28: |
107 | case 0x29: |
108 | case 0x2A: |
109 | case 0x2B: |
110 | if (!isSkip) |
111 | { |
112 | NULL_GPU(); |
113 | const PP gpuPolySpanDriver = gpuPolySpanDrivers [Blending_Mode | Masking | Blending | PixelMSB]; |
114 | //--PacketBuffer.S2[6]; |
115 | gpuDrawF3(gpuPolySpanDriver); |
116 | PacketBuffer.U4[1] = PacketBuffer.U4[4]; |
117 | //--PacketBuffer.S2[2]; |
118 | gpuDrawF3(gpuPolySpanDriver); |
119 | DO_LOG(("gpuDrawF4(0x%x)\n",PRIM)); |
120 | } |
121 | break; |
122 | case 0x2C: |
123 | case 0x2D: |
124 | case 0x2E: |
125 | case 0x2F: |
126 | if (!isSkip) |
127 | { |
128 | NULL_GPU(); |
129 | gpuSetCLUT (PacketBuffer.U4[2] >> 16); |
130 | gpuSetTexture (PacketBuffer.U4[4] >> 16); |
131 | PP gpuPolySpanDriver; |
132 | if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F)) |
133 | gpuPolySpanDriver = gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | PixelMSB]; |
134 | else |
135 | gpuPolySpanDriver = gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | PixelMSB]; |
136 | //--PacketBuffer.S2[6]; |
137 | gpuDrawFT3(gpuPolySpanDriver); |
138 | PacketBuffer.U4[1] = PacketBuffer.U4[7]; |
139 | PacketBuffer.U4[2] = PacketBuffer.U4[8]; |
140 | //--PacketBuffer.S2[2]; |
141 | gpuDrawFT3(gpuPolySpanDriver); |
142 | DO_LOG(("gpuDrawFT4(0x%x)\n",PRIM)); |
143 | } |
144 | break; |
145 | case 0x30: |
146 | case 0x31: |
147 | case 0x32: |
148 | case 0x33: |
149 | if (!isSkip) |
150 | { |
151 | NULL_GPU(); |
152 | gpuDrawG3(gpuPolySpanDrivers [Blending_Mode | Masking | Blending | 129 | PixelMSB]); |
153 | DO_LOG(("gpuDrawG3(0x%x)\n",PRIM)); |
154 | } |
155 | break; |
156 | case 0x34: |
157 | case 0x35: |
158 | case 0x36: |
159 | case 0x37: |
160 | if (!isSkip) |
161 | { |
162 | NULL_GPU(); |
163 | gpuSetCLUT (PacketBuffer.U4[2] >> 16); |
164 | gpuSetTexture (PacketBuffer.U4[5] >> 16); |
165 | gpuDrawGT3(gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | ((Lighting)?129:0) | PixelMSB]); |
166 | DO_LOG(("gpuDrawGT3(0x%x)\n",PRIM)); |
167 | } |
168 | break; |
169 | case 0x38: |
170 | case 0x39: |
171 | case 0x3A: |
172 | case 0x3B: |
173 | if (!isSkip) |
174 | { |
175 | NULL_GPU(); |
176 | const PP gpuPolySpanDriver = gpuPolySpanDrivers [Blending_Mode | Masking | Blending | 129 | PixelMSB]; |
177 | //--PacketBuffer.S2[6]; |
178 | gpuDrawG3(gpuPolySpanDriver); |
179 | PacketBuffer.U4[0] = PacketBuffer.U4[6]; |
180 | PacketBuffer.U4[1] = PacketBuffer.U4[7]; |
181 | //--PacketBuffer.S2[2]; |
182 | gpuDrawG3(gpuPolySpanDriver); |
183 | DO_LOG(("gpuDrawG4(0x%x)\n",PRIM)); |
184 | } |
185 | break; |
186 | case 0x3C: |
187 | case 0x3D: |
188 | case 0x3E: |
189 | case 0x3F: |
190 | if (!isSkip) |
191 | { |
192 | NULL_GPU(); |
193 | gpuSetCLUT (PacketBuffer.U4[2] >> 16); |
194 | gpuSetTexture (PacketBuffer.U4[5] >> 16); |
195 | const PP gpuPolySpanDriver = gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | ((Lighting)?129:0) | PixelMSB]; |
196 | //--PacketBuffer.S2[6]; |
197 | gpuDrawGT3(gpuPolySpanDriver); |
198 | PacketBuffer.U4[0] = PacketBuffer.U4[9]; |
199 | PacketBuffer.U4[1] = PacketBuffer.U4[10]; |
200 | PacketBuffer.U4[2] = PacketBuffer.U4[11]; |
201 | //--PacketBuffer.S2[2]; |
202 | gpuDrawGT3(gpuPolySpanDriver); |
203 | DO_LOG(("gpuDrawGT4(0x%x)\n",PRIM)); |
204 | } |
205 | break; |
206 | case 0x40: |
207 | case 0x41: |
208 | case 0x42: |
209 | case 0x43: |
210 | if (!isSkip) |
211 | { |
212 | NULL_GPU(); |
213 | gpuDrawLF(gpuPixelDrivers [ (Blending_Mode | Masking | Blending | (PixelMSB>>3)) >> 1]); |
214 | DO_LOG(("gpuDrawLF(0x%x)\n",PRIM)); |
215 | } |
216 | break; |
217 | case 0x48: |
218 | case 0x49: |
219 | case 0x4A: |
220 | case 0x4B: |
221 | case 0x4C: |
222 | case 0x4D: |
223 | case 0x4E: |
224 | case 0x4F: |
225 | if (!isSkip) |
226 | { |
227 | NULL_GPU(); |
228 | gpuDrawLF(gpuPixelDrivers [ (Blending_Mode | Masking | Blending | (PixelMSB>>3)) >> 1]); |
229 | DO_LOG(("gpuDrawLF(0x%x)\n",PRIM)); |
230 | } |
231 | if ((PacketBuffer.U4[3] & 0xF000F000) != 0x50005000) |
232 | { |
233 | PacketBuffer.U4[1] = PacketBuffer.U4[2]; |
234 | PacketBuffer.U4[2] = PacketBuffer.U4[3]; |
235 | PacketCount = 1; |
236 | PacketIndex = 3; |
237 | } |
238 | break; |
239 | case 0x50: |
240 | case 0x51: |
241 | case 0x52: |
242 | case 0x53: |
243 | if (!isSkip) |
244 | { |
245 | NULL_GPU(); |
246 | gpuDrawLG(gpuPixelDrivers [ (Blending_Mode | Masking | Blending | (PixelMSB>>3)) >> 1]); |
247 | DO_LOG(("gpuDrawLG(0x%x)\n",PRIM)); |
248 | } |
249 | break; |
250 | case 0x58: |
251 | case 0x59: |
252 | case 0x5A: |
253 | case 0x5B: |
254 | case 0x5C: |
255 | case 0x5D: |
256 | case 0x5E: |
257 | case 0x5F: |
258 | if (!isSkip) |
259 | { |
260 | NULL_GPU(); |
261 | gpuDrawLG(gpuPixelDrivers [ (Blending_Mode | Masking | Blending | (PixelMSB>>3)) >> 1]); |
262 | DO_LOG(("gpuDrawLG(0x%x)\n",PRIM)); |
263 | } |
264 | if ((PacketBuffer.U4[4] & 0xF000F000) != 0x50005000) |
265 | { |
266 | PacketBuffer.U1[3 + (2 * 4)] = PacketBuffer.U1[3 + (0 * 4)]; |
267 | PacketBuffer.U4[0] = PacketBuffer.U4[2]; |
268 | PacketBuffer.U4[1] = PacketBuffer.U4[3]; |
269 | PacketBuffer.U4[2] = PacketBuffer.U4[4]; |
270 | PacketCount = 2; |
271 | PacketIndex = 3; |
272 | } |
273 | break; |
274 | case 0x60: |
275 | case 0x61: |
276 | case 0x62: |
277 | case 0x63: |
278 | if (!isSkip) |
279 | { |
280 | NULL_GPU(); |
281 | gpuDrawT(gpuTileSpanDrivers [Blending_Mode | Masking | Blending | (PixelMSB>>3)]); |
282 | DO_LOG(("gpuDrawT(0x%x)\n",PRIM)); |
283 | } |
284 | break; |
285 | case 0x64: |
286 | case 0x65: |
287 | case 0x66: |
288 | case 0x67: |
289 | if (!isSkip) |
290 | { |
291 | NULL_GPU(); |
292 | gpuSetCLUT (PacketBuffer.U4[2] >> 16); |
293 | gpuSetTexture (GPU_GP1); |
294 | if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F)) |
295 | gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | (enableAbbeyHack<<7) | PixelMSB]); |
296 | else |
297 | gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | (enableAbbeyHack<<7) | PixelMSB]); |
298 | DO_LOG(("gpuDrawS(0x%x)\n",PRIM)); |
299 | } |
300 | break; |
301 | case 0x68: |
302 | case 0x69: |
303 | case 0x6A: |
304 | case 0x6B: |
305 | if (!isSkip) |
306 | { |
307 | NULL_GPU(); |
308 | PacketBuffer.U4[2] = 0x00010001; |
309 | gpuDrawT(gpuTileSpanDrivers [Blending_Mode | Masking | Blending | (PixelMSB>>3)]); |
310 | DO_LOG(("gpuDrawT(0x%x)\n",PRIM)); |
311 | } |
312 | break; |
313 | case 0x70: |
314 | case 0x71: |
315 | case 0x72: |
316 | case 0x73: |
317 | if (!isSkip) |
318 | { |
319 | NULL_GPU(); |
320 | PacketBuffer.U4[2] = 0x00080008; |
321 | gpuDrawT(gpuTileSpanDrivers [Blending_Mode | Masking | Blending | (PixelMSB>>3)]); |
322 | DO_LOG(("gpuDrawT(0x%x)\n",PRIM)); |
323 | } |
324 | break; |
325 | case 0x74: |
326 | case 0x75: |
327 | case 0x76: |
328 | case 0x77: |
329 | if (!isSkip) |
330 | { |
331 | NULL_GPU(); |
332 | PacketBuffer.U4[3] = 0x00080008; |
333 | gpuSetCLUT (PacketBuffer.U4[2] >> 16); |
334 | gpuSetTexture (GPU_GP1); |
335 | if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F)) |
336 | gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | (enableAbbeyHack<<7) | PixelMSB]); |
337 | else |
338 | gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | (enableAbbeyHack<<7) | PixelMSB]); |
339 | DO_LOG(("gpuDrawS(0x%x)\n",PRIM)); |
340 | } |
341 | break; |
342 | case 0x78: |
343 | case 0x79: |
344 | case 0x7A: |
345 | case 0x7B: |
346 | if (!isSkip) |
347 | { |
348 | NULL_GPU(); |
349 | PacketBuffer.U4[2] = 0x00100010; |
350 | gpuDrawT(gpuTileSpanDrivers [Blending_Mode | Masking | Blending | (PixelMSB>>3)]); |
351 | DO_LOG(("gpuDrawT(0x%x)\n",PRIM)); |
352 | } |
353 | break; |
354 | case 0x7C: |
355 | case 0x7D: |
b3db9409 |
356 | #ifdef __arm__ |
357 | if ((GPU_GP1 & 0x180) == 0 && (Masking | PixelMSB) == 0) |
358 | { |
359 | gpuSetCLUT (PacketBuffer.U4[2] >> 16); |
360 | gpuSetTexture (GPU_GP1); |
361 | gpuDrawS16(); |
362 | break; |
363 | } |
364 | // fallthrough |
365 | #endif |
86aad47b |
366 | case 0x7E: |
367 | case 0x7F: |
368 | if (!isSkip) |
369 | { |
370 | NULL_GPU(); |
371 | PacketBuffer.U4[3] = 0x00100010; |
372 | gpuSetCLUT (PacketBuffer.U4[2] >> 16); |
373 | gpuSetTexture (GPU_GP1); |
374 | if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F)) |
375 | gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | (enableAbbeyHack<<7) | PixelMSB]); |
376 | else |
377 | gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | (enableAbbeyHack<<7) | PixelMSB]); |
378 | DO_LOG(("gpuDrawS(0x%x)\n",PRIM)); |
379 | } |
380 | break; |
381 | case 0x80: // vid -> vid |
382 | gpuMoveImage(); // prim handles updateLace && skip |
383 | DO_LOG(("gpuMoveImage(0x%x)\n",PRIM)); |
384 | break; |
385 | case 0xA0: // sys ->vid |
386 | gpuLoadImage(); // prim handles updateLace && skip |
89c0de42 |
387 | #ifndef isSkip // not a define |
86aad47b |
388 | if (alt_fps) isSkip=false; |
89c0de42 |
389 | #endif |
86aad47b |
390 | DO_LOG(("gpuLoadImage(0x%x)\n",PRIM)); |
391 | break; |
392 | case 0xC0: // vid -> sys |
393 | gpuStoreImage(); // prim handles updateLace && skip |
394 | DO_LOG(("gpuStoreImage(0x%x)\n",PRIM)); |
395 | break; |
396 | case 0xE1: |
397 | { |
398 | const u32 temp = PacketBuffer.U4[0]; |
399 | GPU_GP1 = (GPU_GP1 & ~0x000007FF) | (temp & 0x000007FF); |
400 | gpuSetTexture(temp); |
401 | DO_LOG(("gpuSetTexture(0x%x)\n",PRIM)); |
402 | } |
403 | break; |
404 | case 0xE2: |
405 | { |
406 | static const u8 TextureMask[32] = { |
407 | 255, 7, 15, 7, 31, 7, 15, 7, 63, 7, 15, 7, 31, 7, 15, 7, // |
408 | 127, 7, 15, 7, 31, 7, 15, 7, 63, 7, 15, 7, 31, 7, 15, 7 // |
409 | }; |
410 | const u32 temp = PacketBuffer.U4[0]; |
411 | TextureWindow[0] = ((temp >> 10) & 0x1F) << 3; |
412 | TextureWindow[1] = ((temp >> 15) & 0x1F) << 3; |
413 | TextureWindow[2] = TextureMask[(temp >> 0) & 0x1F]; |
414 | TextureWindow[3] = TextureMask[(temp >> 5) & 0x1F]; |
415 | gpuSetTexture(GPU_GP1); |
c006d9e3 |
416 | //isSkip = false; |
86aad47b |
417 | DO_LOG(("TextureWindow(0x%x)\n",PRIM)); |
418 | } |
419 | break; |
420 | case 0xE3: |
421 | { |
422 | const u32 temp = PacketBuffer.U4[0]; |
423 | DrawingArea[0] = temp & 0x3FF; |
424 | DrawingArea[1] = (temp >> 10) & 0x3FF; |
c006d9e3 |
425 | //isSkip = false; |
86aad47b |
426 | DO_LOG(("DrawingArea_Pos(0x%x)\n",PRIM)); |
427 | } |
428 | break; |
429 | case 0xE4: |
430 | { |
431 | const u32 temp = PacketBuffer.U4[0]; |
432 | DrawingArea[2] = (temp & 0x3FF) + 1; |
433 | DrawingArea[3] = ((temp >> 10) & 0x3FF) + 1; |
c006d9e3 |
434 | //isSkip = false; |
86aad47b |
435 | DO_LOG(("DrawingArea_Size(0x%x)\n",PRIM)); |
436 | } |
437 | break; |
438 | case 0xE5: |
439 | { |
440 | const u32 temp = PacketBuffer.U4[0]; |
4144e9ab |
441 | DrawingOffset[0] = ((s32)temp<<(32-11))>>(32-11); |
442 | DrawingOffset[1] = ((s32)temp<<(32-22))>>(32-11); |
c006d9e3 |
443 | //isSkip = false; |
86aad47b |
444 | DO_LOG(("DrawingOffset(0x%x)\n",PRIM)); |
445 | } |
446 | break; |
447 | case 0xE6: |
448 | { |
449 | const u32 temp = PacketBuffer.U4[0]; |
450 | //GPU_GP1 = (GPU_GP1 & ~0x00001800) | ((temp&3) << 11); |
451 | Masking = (temp & 0x2) << 1; |
452 | PixelMSB =(temp & 0x1) << 8; |
453 | DO_LOG(("SetMask(0x%x)\n",PRIM)); |
454 | } |
455 | break; |
456 | } |
457 | } |