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 gpuLoadImage(void)
25 x0 = PacketBuffer.U2[2] & 1023;
26 y0 = PacketBuffer.U2[3] & 511;
27 w0 = PacketBuffer.U2[4];
28 h0 = PacketBuffer.U2[5];
30 if ((y0 + h0) > FRAME_HEIGHT)
32 h0 = FRAME_HEIGHT - y0;
35 FrameToWrite = ((w0)&&(h0));
41 pvram = &((u16*)GPU_FrameBuffer)[x0+(y0*1024)];
43 GPU_GP1 |= 0x08000000;
46 ///////////////////////////////////////////////////////////////////////////////
47 INLINE void gpuStoreImage(void)
50 x0 = PacketBuffer.U2[2] & 1023;
51 y0 = PacketBuffer.U2[3] & 511;
52 w0 = PacketBuffer.U2[4];
53 h0 = PacketBuffer.U2[5];
55 if ((y0 + h0) > FRAME_HEIGHT)
57 h0 = FRAME_HEIGHT - y0;
59 FrameToRead = ((w0)&&(h0));
65 pvram = &((u16*)GPU_FrameBuffer)[x0+(y0*1024)];
67 GPU_GP1 |= 0x08000000;
70 INLINE void gpuMoveImage(void)
74 x0 = PacketBuffer.U2[2] & 1023;
75 y0 = PacketBuffer.U2[3] & 511;
76 x1 = PacketBuffer.U2[4] & 1023;
77 y1 = PacketBuffer.U2[5] & 511;
78 w0 = PacketBuffer.U2[6];
79 h0 = PacketBuffer.U2[7];
81 if( (x0==x1) && (y0==y1) ) return;
82 if ((w0<=0) || (h0<=0)) return;
84 if (((y0+h0)>512)||((x0+w0)>1024)||((y1+h0)>512)||((x1+w0)>1024))
86 u16 *psxVuw=GPU_FrameBuffer;
90 psxVuw [(1024*((y1+j)&511))+((x1+i)&0x3ff)]=
91 psxVuw[(1024*((y0+j)&511))+((x0+i)&0x3ff)];
93 else if ((x0&1)||(x1&1))
96 lpDst = lpSrc = (u16*)GPU_FrameBuffer;
97 lpSrc += FRAME_OFFSET(x0, y0);
98 lpDst += FRAME_OFFSET(x1, y1);
99 x1 = FRAME_WIDTH - w0;
102 do { *lpDst++ = *lpSrc++; } while (--x0);
110 lpDst = lpSrc = (u32*)(void*)GPU_FrameBuffer;
111 lpSrc += ((FRAME_OFFSET(x0, y0))>>1);
112 lpDst += ((FRAME_OFFSET(x1, y1))>>1);
115 x1 = (FRAME_WIDTH - w0 +1)>>1;
119 *((u16*)lpDst) = *((u16*)lpSrc);
126 do { *lpDst++ = *lpSrc++; } while (--x0);
127 *((u16*)lpDst) = *((u16*)lpSrc);
134 x1 = (FRAME_WIDTH - w0)>>1;
138 do { *lpDst++ = *lpSrc++; } while (--x0);
146 INLINE void gpuClearImage(void)
149 x0 = PacketBuffer.S2[2];
150 y0 = PacketBuffer.S2[3];
151 w0 = PacketBuffer.S2[4] & 0x3ff;
152 h0 = PacketBuffer.S2[5] & 0x3ff;
156 if (w0 > FRAME_WIDTH) w0 = FRAME_WIDTH;
161 if (h0 > FRAME_HEIGHT) h0 = FRAME_HEIGHT;
167 u16* pixel = (u16*)GPU_FrameBuffer + FRAME_OFFSET(x0, y0);
168 u16 rgb = GPU_RGB16(PacketBuffer.S4[0]);
169 y0 = FRAME_WIDTH - w0;
172 do { *pixel++ = rgb; } while (--x0);
178 u32* pixel = (u32*)(void*)GPU_FrameBuffer + ((FRAME_OFFSET(x0, y0))>>1);
179 u32 rgb = GPU_RGB16(PacketBuffer.S4[0]);
183 y0 = (FRAME_WIDTH - w0 +1)>>1;
187 do { *pixel++ = rgb; } while (--x0);
188 *((u16*)pixel) = (u16)rgb;
194 y0 = (FRAME_WIDTH - w0)>>1;
198 do { *pixel++ = rgb; } while (--x0);