Glide Plugin GLES2 port from mupen64plus-ae, but with special FrameSkip code
[mupen64plus-pandora.git] / source / gles2glide64 / src / Glide64 / TexLoad4b.h
1 /*
2 * Glide64 - Glide video plugin for Nintendo 64 emulators.
3 * Copyright (c) 2002  Dave2001
4 * Copyright (c) 2003-2009  Sergey 'Gonetz' Lipski
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 //****************************************************************
22 //
23 // Glide64 - Glide Plugin for Nintendo 64 emulators
24 // Project started on December 29th, 2001
25 //
26 // Authors:
27 // Dave2001, original author, founded the project in 2001, left it in 2002
28 // Gugaman, joined the project in 2002, left it in 2002
29 // Sergey 'Gonetz' Lipski, joined the project in 2002, main author since fall of 2002
30 // Hiroshi 'KoolSmoky' Morii, joined the project in 2007
31 //
32 //****************************************************************
33 //
34 // To modify Glide64:
35 // * Write your name and (optional)email, commented by your work, so I know who did it, and so that you can find which parts you modified when it comes time to send it to me.
36 // * Do NOT send me the whole project or file that you modified.  Take out your modified code sections, and tell me where to put them.  If people sent the whole thing, I would have many different versions, but no idea how to combine them all.
37 //
38 //****************************************************************
39
40 #include <stdint.h>
41
42 static inline void load4bCI(uint8_t *src, uint8_t *dst, int wid_64, int height, uint16_t line, int ext, uint16_t *pal)
43 {
44   uint8_t *v7;
45   uint8_t *v8;
46   int v9;
47   int v10;
48   int v11;
49   uint32_t v12;
50   uint8_t *v13;
51   uint32_t v14;
52   uint32_t *v15;
53   uint32_t v16;
54   uint8_t *v17;
55   uint32_t *v18;
56   int v19;
57   int v20;
58   uint32_t v21;
59   uint32_t v22;
60   uint32_t *v23;
61   uint32_t v24;
62   int v25;
63   int v26;
64
65   v7 = src;
66   v8 = dst;
67   v9 = height;
68   do
69   {
70     v25 = v9;
71     v10 = wid_64;
72     do
73     {
74       v11 = v10;
75       v12 = bswap32(*(uint32_t *)v7);
76       v13 = v7 + 4;
77       ALOWORD(v10) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 23) & 0x1E)), 1);
78       v14 = v10 << 16;
79       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 27) & 0x1E)), 1);
80       *(uint32_t *)v8 = v14;
81       v15 = (uint32_t *)(v8 + 4);
82       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 15) & 0x1E)), 1);
83       v14 <<= 16;
84       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 19) & 0x1E)), 1);
85       *v15 = v14;
86       ++v15;
87       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 7) & 0x1E)), 1);
88       v14 <<= 16;
89       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 11) & 0x1E)), 1);
90       *v15 = v14;
91       ++v15;
92       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint8_t)v12 & 0x1E)), 1);
93       v14 <<= 16;
94       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 3) & 0x1E)), 1);
95       *v15 = v14;
96       ++v15;
97       v16 = bswap32(*(uint32_t *)v13);
98       v7 = v13 + 4;
99       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 23) & 0x1E)), 1);
100       v14 <<= 16;
101       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 27) & 0x1E)), 1);
102       *v15 = v14;
103       ++v15;
104       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 15) & 0x1E)), 1);
105       v14 <<= 16;
106       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 19) & 0x1E)), 1);
107       *v15 = v14;
108       ++v15;
109       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 7) & 0x1E)), 1);
110       v14 <<= 16;
111       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 11) & 0x1E)), 1);
112       *v15 = v14;
113       ++v15;
114       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint8_t)v16 & 0x1E)), 1);
115       v14 <<= 16;
116       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 3) & 0x1E)), 1);
117       *v15 = v14;
118       v8 = (uint8_t *)(v15 + 1);
119       v10 = v11 - 1;
120     }
121     while ( v11 != 1 );
122     if ( v25 == 1 )
123       break;
124     v26 = v25 - 1;
125     v17 = &src[(line + (uintptr_t)v7 - (uintptr_t)src) & 0x7FF];
126     v18 = (uint32_t *)&v8[ext];
127     v19 = wid_64;
128     do
129     {
130       v20 = v19;
131       v21 = bswap32(*((uint32_t *)v17 + 1));
132       ALOWORD(v19) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 23) & 0x1E)), 1);
133       v22 = v19 << 16;
134       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 27) & 0x1E)), 1);
135       *v18 = v22;
136       v23 = v18 + 1;
137       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 15) & 0x1E)), 1);
138       v22 <<= 16;
139       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 19) & 0x1E)), 1);
140       *v23 = v22;
141       ++v23;
142       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 7) & 0x1E)), 1);
143       v22 <<= 16;
144       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 11) & 0x1E)), 1);
145       *v23 = v22;
146       ++v23;
147       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint8_t)v21 & 0x1E)), 1);
148       v22 <<= 16;
149       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 3) & 0x1E)), 1);
150       *v23 = v22;
151       ++v23;
152       v24 = bswap32(*(uint32_t *)v17);
153       v17 = &src[((uintptr_t)v17 + 8 - (uintptr_t)src) & 0x7FF];
154       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 23) & 0x1E)), 1);
155       v22 <<= 16;
156       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 27) & 0x1E)), 1);
157       *v23 = v22;
158       ++v23;
159       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 15) & 0x1E)), 1);
160       v22 <<= 16;
161       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 19) & 0x1E)), 1);
162       *v23 = v22;
163       ++v23;
164       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 7) & 0x1E)), 1);
165       v22 <<= 16;
166       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 11) & 0x1E)), 1);
167       *v23 = v22;
168       ++v23;
169       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint8_t)v24 & 0x1E)), 1);
170       v22 <<= 16;
171       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 3) & 0x1E)), 1);
172       *v23 = v22;
173       v18 = v23 + 1;
174       v19 = v20 - 1;
175     }
176     while ( v20 != 1 );
177     v7 = &src[(line + (uintptr_t)v17 - (uintptr_t)src) & 0x7FF];
178     v8 = (uint8_t *)((char *)v18 + ext);
179     v9 = v26 - 1;
180   }
181   while ( v26 != 1 );
182 }
183
184 static inline void load4bIAPal(uint8_t *src, uint8_t *dst, int wid_64, int height, int line, int ext, uint16_t *pal)
185 {
186   uint8_t *v7;
187   uint32_t *v8;
188   int v9;
189   int v10;
190   int v11;
191   uint32_t v12;
192   uint32_t *v13;
193   uint32_t v14;
194   uint32_t *v15;
195   uint32_t v16;
196   uint8_t *v17;
197   uint32_t *v18;
198   int v19;
199   int v20;
200   uint32_t v21;
201   uint32_t v22;
202   uint32_t *v23;
203   uint32_t v24;
204   int v25;
205   int v26;
206
207   v7 = src;
208   v8 = (uint32_t *)dst;
209   v9 = height;
210   do
211   {
212     v25 = v9;
213     v10 = wid_64;
214     do
215     {
216       v11 = v10;
217       v12 = bswap32(*(uint32_t *)v7);
218       v13 = (uint32_t *)(v7 + 4);
219       ALOWORD(v10) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 23) & 0x1E)), 8);
220       v14 = v10 << 16;
221       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 27) & 0x1E)), 8);
222       *v8 = v14;
223       v15 = v8 + 1;
224       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 15) & 0x1E)), 8);
225       v14 <<= 16;
226       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 19) & 0x1E)), 8);
227       *v15 = v14;
228       ++v15;
229       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 7) & 0x1E)), 8);
230       v14 <<= 16;
231       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 11) & 0x1E)), 8);
232       *v15 = v14;
233       ++v15;
234       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint8_t)v12 & 0x1E)), 8);
235       v14 <<= 16;
236       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 3) & 0x1E)), 8);
237       *v15 = v14;
238       ++v15;
239       v16 = bswap32(*v13);
240       v7 = (uint8_t *)(v13 + 1);
241       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 23) & 0x1E)), 8);
242       v14 <<= 16;
243       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 27) & 0x1E)), 8);
244       *v15 = v14;
245       ++v15;
246       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 15) & 0x1E)), 8);
247       v14 <<= 16;
248       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 19) & 0x1E)), 8);
249       *v15 = v14;
250       ++v15;
251       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 7) & 0x1E)), 8);
252       v14 <<= 16;
253       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 11) & 0x1E)), 8);
254       *v15 = v14;
255       ++v15;
256       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint8_t)v16 & 0x1E)), 8);
257       v14 <<= 16;
258       ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 3) & 0x1E)), 8);
259       *v15 = v14;
260       v8 = v15 + 1;
261       v10 = v11 - 1;
262     }
263     while ( v11 != 1 );
264     if ( v25 == 1 )
265       break;
266     v26 = v25 - 1;
267     v17 = &src[(line + (uintptr_t)v7 - (uintptr_t)src) & 0x7FF];
268     v18 = (uint32_t *)((char *)v8 + ext);
269     v19 = wid_64;
270     do
271     {
272       v20 = v19;
273       v21 = bswap32(*((uint32_t *)v17 + 1));
274       ALOWORD(v19) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 23) & 0x1E)), 8);
275       v22 = v19 << 16;
276       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 27) & 0x1E)), 8);
277       *v18 = v22;
278       v23 = v18 + 1;
279       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 15) & 0x1E)), 8);
280       v22 <<= 16;
281       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 19) & 0x1E)), 8);
282       *v23 = v22;
283       ++v23;
284       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 7) & 0x1E)), 8);
285       v22 <<= 16;
286       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 11) & 0x1E)), 8);
287       *v23 = v22;
288       ++v23;
289       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint8_t)v21 & 0x1E)), 8);
290       v22 <<= 16;
291       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 3) & 0x1E)), 8);
292       *v23 = v22;
293       ++v23;
294       v24 = bswap32(*(uint32_t *)v17);
295       v17 = &src[((uintptr_t)v17 + 8 - (uintptr_t)src) & 0x7FF];
296       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 23) & 0x1E)), 8);
297       v22 <<= 16;
298       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 27) & 0x1E)), 8);
299       *v23 = v22;
300       ++v23;
301       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 15) & 0x1E)), 8);
302       v22 <<= 16;
303       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 19) & 0x1E)), 8);
304       *v23 = v22;
305       ++v23;
306       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 7) & 0x1E)), 8);
307       v22 <<= 16;
308       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 11) & 0x1E)), 8);
309       *v23 = v22;
310       ++v23;
311       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint8_t)v24 & 0x1E)), 8);
312       v22 <<= 16;
313       ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 3) & 0x1E)), 8);
314       *v23 = v22;
315       v18 = v23 + 1;
316       v19 = v20 - 1;
317     }
318     while ( v20 != 1 );
319     v7 = &src[(line + (uintptr_t)v17 - (uintptr_t)src) & 0x7FF];
320     v8 = (uint32_t *)((char *)v18 + ext);
321     v9 = v26 - 1;
322   }
323   while ( v26 != 1 );
324 }
325
326 static inline void load4bIA(uint8_t *src, uint8_t *dst, int wid_64, int height, int line, int ext)
327 {
328   uint32_t *v6;
329   uint32_t *v7;
330   int v8;
331   int v9;
332   int v10;
333   uint32_t v11;
334   uint32_t *v12;
335   uint32_t v13;
336   uint32_t v14;
337   uint32_t v15;
338   uint32_t *v16;
339   uint32_t v17;
340   uint32_t v18;
341   uint32_t v19;
342   uint32_t v20;
343   uint32_t v21;
344   uint32_t v22;
345   uint32_t v23;
346   uint32_t v24;
347   uint32_t v25;
348   uint32_t v26;
349   uint32_t v27;
350   uint32_t v28;
351   uint32_t v29;
352   uint32_t v30;
353   uint32_t v31;
354   uint32_t v32;
355   uint32_t *v33;
356   uint32_t *v34;
357   int v35;
358   int v36;
359   uint32_t v37;
360   uint32_t v38;
361   uint32_t v39;
362   uint32_t *v40;
363   uint32_t v41;
364   uint32_t v42;
365   uint32_t v43;
366   uint32_t v44;
367   uint32_t v45;
368   uint32_t v46;
369   uint32_t v47;
370   uint32_t v48;
371   uint32_t v49;
372   uint32_t v50;
373   uint32_t v51;
374   uint32_t v52;
375   uint32_t v53;
376   uint32_t v54;
377   uint32_t v55;
378   uint32_t v56;
379   int v57;
380   int v58;
381
382   v6 = (uint32_t *)src;
383   v7 = (uint32_t *)dst;
384   v8 = height;
385   do
386   {
387     v57 = v8;
388     v9 = wid_64;
389     do
390     {
391       v10 = v9;
392       v11 = bswap32(*v6);
393       v12 = v6 + 1;
394       v13 = v11;
395       v14 = (8 * (v11 & 0x100000)) | (4 * (v11 & 0x100000)) | (2 * (v11 & 0x100000)) | (v11 & 0x100000) | ((((v11 >> 16) & 0xE00) >> 3) & 0x100) | ((v11 >> 16) & 0xE00) | (8 * ((v11 >> 12) & 0x1000)) | (4 * ((v11 >> 12) & 0x1000)) | (2 * ((v11 >> 12) & 0x1000)) | ((v11 >> 12) & 0x1000) | ((((v11 >> 28) & 0xE) >> 3)) | ((v11 >> 28) & 0xE) | (8 * ((v11 >> 24) & 0x10)) | (4 * ((v11 >> 24) & 0x10)) | (2 * ((v11 >> 24) & 0x10)) | ((v11 >> 24) & 0x10);
396       v11 >>= 4;
397       v11 &= 0xE0000u;
398       v15 = v11 | v14;
399       v11 >>= 3;
400       *v7 = ((((v13 << 8) & 0xE000000) >> 3) & 0x1000000) | ((v13 << 8) & 0xE000000) | (8 * ((v13 << 12) & 0x10000000)) | (4 * ((v13 << 12) & 0x10000000)) | (2 * ((v13 << 12) & 0x10000000)) | ((v13 << 12) & 0x10000000) | (v11 & 0x10000) | v15;
401       v16 = v7 + 1;
402       v17 = 16 * (uint16_t)v13 & 0x1000;
403       v18 = (((v13 & 0xE00) >> 3) & 0x100) | (v13 & 0xE00) | (8 * v17) | (4 * v17) | (2 * v17) | (v17) | ((((v13 >> 12) & 0xE) >> 3)) | ((v13 >> 12) & 0xE) | (8 * ((v13 >> 8) & 0x10)) | (4 * ((v13 >> 8) & 0x10)) | (2 * ((v13 >> 8) & 0x10)) | ((v13 >> 8) & 0x10);
404       v19 = v13 << 16;
405       v20 = (8 * (v19 & 0x100000)) | (4 * (v19 & 0x100000)) | (2 * (v19 & 0x100000)) | (v19 & 0x100000) | v18;
406       v21 = v13 << 12;
407       v21 &= 0xE0000u;
408       v22 = v21 | v20;
409       v21 >>= 3;
410       *v16 = ((((v13 << 24) & 0xE000000) >> 3) & 0x1000000) | ((v13 << 24) & 0xE000000) | (8 * ((v13 << 28) & 0x10000000)) | (4 * ((v13 << 28) & 0x10000000)) | (2 * ((v13 << 28) & 0x10000000)) | ((v13 << 28) & 0x10000000) | (v21 & 0x10000) | v22;
411       ++v16;
412       v23 = bswap32(*v12);
413       v6 = v12 + 1;
414       v24 = v23;
415       v25 = (8 * (v23 & 0x100000)) | (4 * (v23 & 0x100000)) | (2 * (v23 & 0x100000)) | (v23 & 0x100000) | ((((v23 >> 16) & 0xE00) >> 3) & 0x100) | ((v23 >> 16) & 0xE00) | (8 * ((v23 >> 12) & 0x1000)) | (4 * ((v23 >> 12) & 0x1000)) | (2 * ((v23 >> 12) & 0x1000)) | ((v23 >> 12) & 0x1000) | (((v23 >> 28) & 0xE) >> 3) | ((v23 >> 28) & 0xE) | (8 * ((v23 >> 24) & 0x10)) | (4 * ((v23 >> 24) & 0x10)) | (2 * ((v23 >> 24) & 0x10)) | ((v23 >> 24) & 0x10);
416       v23 >>= 4;
417       v23 &= 0xE0000u;
418       v26 = v23 | v25;
419       v23 >>= 3;
420       *v16 = ((((v24 << 8) & 0xE000000) >> 3) & 0x1000000) | ((v24 << 8) & 0xE000000) | (8 * ((v24 << 12) & 0x10000000)) | (4 * ((v24 << 12) & 0x10000000)) | (2 * ((v24 << 12) & 0x10000000)) | ((v24 << 12) & 0x10000000) | (v23 & 0x10000) | (v26);
421       ++v16;
422       v27 = 16 * (uint16_t)v24 & 0x1000;
423       v28 = (((v24 & 0xE00) >> 3) & 0x100) | (v24 & 0xE00) | (8 * v27) | (4 * v27) | (2 * v27) | (v27) | ((((v24 >> 12) & 0xE) >> 3)) | ((v24 >> 12) & 0xE) | (8 * ((v24 >> 8) & 0x10)) | (4 * ((v24 >> 8) & 0x10)) | (2 * ((v24 >> 8) & 0x10)) | ((v24 >> 8) & 0x10);
424       v29 = v24 << 16;
425       v30 = (8 * (v29 & 0x100000)) | (4 * (v29 & 0x100000)) | (2 * (v29 & 0x100000)) | (v29 & 0x100000) | v28;
426       v31 = v24 << 12;
427       v31 &= 0xE0000u;
428       v32 = v31 | v30;
429       v31 >>= 3;
430       *v16 = ((((v24 << 24) & 0xE000000) >> 3) & 0x1000000) | ((v24 << 24) & 0xE000000) | (8 * ((v24 << 28) & 0x10000000)) | (4 * ((v24 << 28) & 0x10000000)) | (2 * ((v24 << 28) & 0x10000000)) | ((v24 << 28) & 0x10000000) | (v31 & 0x10000) | v32;
431       v7 = v16 + 1;
432       v9 = v10 - 1;
433     }
434     while ( v10 != 1 );
435     if ( v57 == 1 )
436       break;
437     v58 = v57 - 1;
438     v33 = (uint32_t *)((char *)v6 + line);
439     v34 = (uint32_t *)((char *)v7 + ext);
440     v35 = wid_64;
441     do
442     {
443       v36 = v35;
444       v37 = bswap32(v33[1]);
445       v38 = v37 >> 4;
446       v38 &= 0xE0000u;
447       v39 = v38 | (8 * (v37 & 0x100000)) | (4 * (v37 & 0x100000)) | (2 * (v37 & 0x100000)) | (v37 & 0x100000) | ((((v37 >> 16) & 0xE00) >> 3) & 0x100) | ((v37 >> 16) & 0xE00) | (8 * ((v37 >> 12) & 0x1000)) | (4 * ((v37 >> 12) & 0x1000)) | (2 * ((v37 >> 12) & 0x1000)) | ((v37 >> 12) & 0x1000) | (((v37 >> 28) & 0xE) >> 3) | ((v37 >> 28) & 0xE) | (8 * ((v37 >> 24) & 0x10)) | (4 * ((v37 >> 24) & 0x10)) | (2 * ((v37 >> 24) & 0x10)) | ((v37 >> 24) & 0x10);
448       v38 >>= 3;
449       *v34 = ((((v37 << 8) & 0xE000000) >> 3) & 0x1000000) | ((v37 << 8) & 0xE000000) | (8 * ((v37 << 12) & 0x10000000)) | (4 * ((v37 << 12) & 0x10000000)) | (2 * ((v37 << 12) & 0x10000000)) | ((v37 << 12) & 0x10000000) | (v38 & 0x10000) | v39;
450       v40 = v34 + 1;
451       v41 = 16 * (uint16_t)v37 & 0x1000;
452       v42 = (((v37 & 0xE00) >> 3) & 0x100) | (v37 & 0xE00) | (8 * v41) | (4 * v41) | (2 * v41) | v41 | (((v37 >> 12) & 0xE) >> 3) | ((v37 >> 12) & 0xE) | (8 * ((v37 >> 8) & 0x10)) | (4 * ((v37 >> 8) & 0x10)) | (2 * ((v37 >> 8) & 0x10)) | ((v37 >> 8) & 0x10);
453       v43 = v37 << 16;
454       v44 = (8 * (v43 & 0x100000)) | (4 * (v43 & 0x100000)) | (2 * (v43 & 0x100000)) | (v43 & 0x100000) | v42;
455       v45 = v37 << 12;
456       v45 &= 0xE0000u;
457       v46 = v45 | v44;
458       v45 >>= 3;
459       *v40 = ((((v37 << 24) & 0xE000000) >> 3) & 0x1000000) | ((v37 << 24) & 0xE000000) | (8 * ((v37 << 28) & 0x10000000)) | (4 * ((v37 << 28) & 0x10000000)) | (2 * ((v37 << 28) & 0x10000000)) | ((v37 << 28) & 0x10000000) | (v45 & 0x10000) | v46;
460       ++v40;
461       v47 = bswap32(*v33);
462       v33 += 2;
463       v48 = v47;
464       v49 = (8 * (v47 & 0x100000)) | (4 * (v47 & 0x100000)) | (2 * (v47 & 0x100000)) | (v47 & 0x100000) | ((((v47 >> 16) & 0xE00) >> 3) & 0x100) | ((v47 >> 16) & 0xE00) | (8 * ((v47 >> 12) & 0x1000)) | (4 * ((v47 >> 12) & 0x1000)) | (2 * ((v47 >> 12) & 0x1000)) | ((v47 >> 12) & 0x1000) | (((v47 >> 28) & 0xE) >> 3) | ((v47 >> 28) & 0xE) | (8 * ((v47 >> 24) & 0x10)) | (4 * ((v47 >> 24) & 0x10)) | (2 * ((v47 >> 24) & 0x10)) | ((v47 >> 24) & 0x10);
465       v47 >>= 4;
466       v47 &= 0xE0000u;
467       v50 = v47 | v49;
468       v47 >>= 3;
469       *v40 = ((((v48 << 8) & 0xE000000) >> 3) & 0x1000000) | ((v48 << 8) & 0xE000000) | (8 * ((v48 << 12) & 0x10000000)) | (4 * ((v48 << 12) & 0x10000000)) | (2 * ((v48 << 12) & 0x10000000)) | ((v48 << 12) & 0x10000000) | (v47 & 0x10000) | v50;
470       ++v40;
471       v51 = 16 * (uint16_t)v48 & 0x1000;
472       v52 = (((v48 & 0xE00) >> 3) & 0x100) | (v48 & 0xE00) | (8 * v51) | (4 * v51) | (2 * v51) | v51 | (((v48 >> 12) & 0xE) >> 3) | ((v48 >> 12) & 0xE) | (8 * ((v48 >> 8) & 0x10)) | (4 * ((v48 >> 8) & 0x10)) | (2 * ((v48 >> 8) & 0x10)) | ((v48 >> 8) & 0x10);
473       v53 = v48 << 16;
474       v54 = (8 * (v53 & 0x100000)) | (4 * (v53 & 0x100000)) | (2 * (v53 & 0x100000)) | (v53 & 0x100000) | v52;
475       v55 = v48 << 12;
476       v55 &= 0xE0000u;
477       v56 = v55 | v54;
478       v55 >>= 3;
479       *v40 = ((((v48 << 24) & 0xE000000) >> 3) & 0x1000000) | ((v48 << 24) & 0xE000000) | (8 * ((v48 << 28) & 0x10000000)) | (4 * ((v48 << 28) & 0x10000000)) | (2 * ((v48 << 28) & 0x10000000)) | ((v48 << 28) & 0x10000000) | (v55 & 0x10000) | v56;
480       v34 = v40 + 1;
481       v35 = v36 - 1;
482     }
483     while ( v36 != 1 );
484     v6 = (uint32_t *)((char *)v33 + line);
485     v7 = (uint32_t *)((char *)v34 + ext);
486     v8 = v58 - 1;
487   }
488   while ( v58 != 1 );
489 }
490
491 static inline void load4bI(uint8_t *src, uint8_t *dst, int wid_64, int height, int line, int ext)
492 {
493   uint32_t *v6;
494   uint32_t *v7;
495   int v8;
496   int v9;
497   int v10;
498   uint32_t v11;
499   uint32_t *v12;
500   uint32_t v13;
501   uint32_t v14;
502   uint32_t *v15;
503   uint32_t v16;
504   unsigned int v17;
505   unsigned int v18;
506   uint32_t v19;
507   uint32_t v20;
508   uint32_t *v21;
509   uint32_t *v22;
510   int v23;
511   int v24;
512   uint32_t v25;
513   uint32_t v26;
514   uint32_t *v27;
515   uint32_t v28;
516   uint32_t v29;
517   uint32_t v30;
518   uint32_t v31;
519   uint32_t v32;
520   int v33;
521   int v34;
522
523   v6 = (uint32_t *)src;
524   v7 = (uint32_t *)dst;
525   v8 = height;
526   do
527   {
528     v33 = v8;
529     v9 = wid_64;
530     do
531     {
532       v10 = v9;
533       v11 = bswap32(*v6);
534       v12 = v6 + 1;
535       v13 = v11;
536       v14 = (16 * ((v11 >> 16) & 0xF00)) | ((v11 >> 16) & 0xF00) | (16 * (v11 >> 28)) | (v11 >> 28);
537       v11 >>= 4;
538       *v7 = (16 * ((v13 << 8) & 0xF000000)) | ((v13 << 8) & 0xF000000) | (16 * (v11 & 0xF0000)) | (v11 & 0xF0000) | v14;
539       v15 = v7 + 1;
540       v16 = v13 << 12;
541       *v15 = (16 * ((v13 << 24) & 0xF000000)) | ((v13 << 24) & 0xF000000) | (16 * (v16 & 0xF0000)) | (v16 & 0xF0000) | (16 * (v13 & 0xF00)) | (v13 & 0xF00) | (16 * ((uint16_t)v13 >> 12)) | ((uint16_t)v13 >> 12);
542       ++v15;
543       v17 = bswap32(*v12);
544       v6 = v12 + 1;
545       v18 = v17;
546       v19 = (16 * ((v17 >> 16) & 0xF00)) | ((v17 >> 16) & 0xF00) | (16 * (v17 >> 28)) | (v17 >> 28);
547       v17 >>= 4;
548       *v15 = (16 * ((v18 << 8) & 0xF000000)) | ((v18 << 8) & 0xF000000) | (16 * (v17 & 0xF0000)) | (v17 & 0xF0000) | v19;
549       ++v15;
550       v20 = v18 << 12;
551       *v15 = (16 * ((v18 << 24) & 0xF000000)) | ((v18 << 24) & 0xF000000) | (16 * (v20 & 0xF0000)) | (v20 & 0xF0000) | (16 * (v18 & 0xF00)) | (v18 & 0xF00) | (16 * ((uint16_t)v18 >> 12)) | ((uint16_t)v18 >> 12);
552       v7 = v15 + 1;
553       v9 = v10 - 1;
554     }
555     while ( v10 != 1 );
556     if ( v33 == 1 )
557       break;
558     v34 = v33 - 1;
559     v21 = (uint32_t *)((char *)v6 + line);
560     v22 = (uint32_t *)((char *)v7 + ext);
561     v23 = wid_64;
562     do
563     {
564       v24 = v23;
565       v25 = bswap32(v21[1]);
566       v26 = v25 >> 4;
567       *v22 = (16 * ((v25 << 8) & 0xF000000)) | ((v25 << 8) & 0xF000000) | (16 * (v26 & 0xF0000)) | (v26 & 0xF0000) | (16 * ((v25 >> 16) & 0xF00)) | ((v25 >> 16) & 0xF00) | (16 * (v25 >> 28)) | (v25 >> 28);
568       v27 = v22 + 1;
569       v28 = v25 << 12;
570       *v27 = (16 * ((v25 << 24) & 0xF000000)) | ((v25 << 24) & 0xF000000) | (16 * (v28 & 0xF0000)) | (v28 & 0xF0000) | (16 * (v25 & 0xF00)) | (v25 & 0xF00) | (16 * ((uint16_t)v25 >> 12)) | ((uint16_t)v25 >> 12);
571       ++v27;
572       v29 = bswap32(*v21);
573       v21 += 2;
574       v30 = v29;
575       v31 = (16 * ((v29 >> 16) & 0xF00)) | ((v29 >> 16) & 0xF00) | (16 * (v29 >> 28)) | (v29 >> 28);
576       v29 >>= 4;
577       *v27 = (16 * ((v30 << 8) & 0xF000000)) | ((v30 << 8) & 0xF000000) | (16 * (v29 & 0xF0000)) | (v29 & 0xF0000) | v31;
578       ++v27;
579       v32 = v30 << 12;
580       *v27 = (16 * ((v30 << 24) & 0xF000000)) | ((v30 << 24) & 0xF000000) | (16 * (v32 & 0xF0000)) | (v32 & 0xF0000) | (16 * (v30 & 0xF00)) | (v30 & 0xF00) | (16 * ((uint16_t)v30 >> 12)) | ((uint16_t)v30 >> 12);
581       v22 = v27 + 1;
582       v23 = v24 - 1;
583     }
584     while ( v24 != 1 );
585     v6 = (uint32_t *)((char *)v21 + line);
586     v7 = (uint32_t *)((char *)v22 + ext);
587     v8 = v34 - 1;
588   }
589   while ( v34 != 1 );
590 }
591
592 //****************************************************************
593 // Size: 0, Format: 2
594
595 wxUint32 Load4bCI (wxUIntPtr dst, wxUIntPtr src, int wid_64, int height, int line, int real_width, int tile)
596 {
597   if (wid_64 < 1) wid_64 = 1;
598   if (height < 1) height = 1;
599   int ext = (real_width - (wid_64 << 4)) << 1;
600
601   if (rdp.tlut_mode == 0)
602   {
603     //in tlut DISABLE mode load CI texture as plain intensity texture instead of palette dereference.
604     //Thanks to angrylion for the advice
605     load4bI ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext);
606     return /*(0 << 16) | */GR_TEXFMT_ALPHA_INTENSITY_44;
607   }
608
609   wxUIntPtr pal = wxPtrToUInt(rdp.pal_8 + (rdp.tiles[tile].palette << 4));
610   if (rdp.tlut_mode == 2)
611   {
612     load4bCI ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext, (uint16_t *)pal);
613     
614     return (1 << 16) | GR_TEXFMT_ARGB_1555;
615   }
616
617     load4bIAPal ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext, (uint16_t *)pal);
618   return (1 << 16) | GR_TEXFMT_ALPHA_INTENSITY_88;
619 }
620
621 //****************************************************************
622 // Size: 0, Format: 3
623 //
624 // ** BY GUGAMAN **
625
626 wxUint32 Load4bIA (wxUIntPtr dst, wxUIntPtr src, int wid_64, int height, int line, int real_width, int tile)
627 {
628   if (rdp.tlut_mode != 0)
629     return Load4bCI (dst, src, wid_64, height, line, real_width, tile);
630
631   if (wid_64 < 1) wid_64 = 1;
632   if (height < 1) height = 1;
633   int ext = (real_width - (wid_64 << 4));
634   load4bIA ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext);
635   return /*(0 << 16) | */GR_TEXFMT_ALPHA_INTENSITY_44;
636 }
637
638 //****************************************************************
639 // Size: 0, Format: 4
640
641 wxUint32 Load4bI (wxUIntPtr dst, wxUIntPtr src, int wid_64, int height, int line, int real_width, int tile)
642 {
643   if (rdp.tlut_mode != 0)
644     return Load4bCI (dst, src, wid_64, height, line, real_width, tile);
645
646   if (wid_64 < 1) wid_64 = 1;
647   if (height < 1) height = 1;
648   int ext = (real_width - (wid_64 << 4));
649   load4bI ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext);
650   
651   return /*(0 << 16) | */GR_TEXFMT_ALPHA_INTENSITY_44;
652 }
653
654 //****************************************************************
655 // Size: 0, Format: 0
656
657 wxUint32 Load4bSelect (wxUIntPtr dst, wxUIntPtr src, int wid_64, int height, int line, int real_width, int tile)
658 {
659   if (rdp.tlut_mode == 0)
660     return Load4bI (dst, src, wid_64, height, line, real_width, tile);
661
662   return Load4bCI (dst, src, wid_64, height, line, real_width, tile);
663 }