Glide Plugin GLES2 port from mupen64plus-ae, but with special FrameSkip code
[mupen64plus-pandora.git] / source / gles2glide64 / src / Glide64 / TexLoad4b.h
CommitLineData
98e75f2d 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
42static 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
184static 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
326static 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
491static 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
595wxUint32 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
626wxUint32 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
641wxUint32 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
657wxUint32 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}