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 | |
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 | } |