2 * Glide64 - Glide video plugin for Nintendo 64 emulators.
3 * Copyright (c) 2002 Dave2001
4 * Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski
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
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.
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
21 //****************************************************************
23 // Glide64 - Glide Plugin for Nintendo 64 emulators
24 // Project started on December 29th, 2001
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
32 //****************************************************************
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.
38 //****************************************************************
41 static inline void load8bCI(uint8_t *src, uint8_t *dst, int wid_64, int height, int line, int ext, uint16_t *pal)
74 v12 = bswap32(*(uint32_t *)v7);
75 v13 = (uint32_t *)(v7 + 4);
76 ALOWORD(v10) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 15) & 0x1FE)), 1);
78 ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 23) & 0x1FE)), 1);
81 ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v12 & 0x1FE)), 1);
83 ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 7) & 0x1FE)), 1);
87 v7 = (uint8_t *)(v13 + 1);
88 ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 15) & 0x1FE)), 1);
90 ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 23) & 0x1FE)), 1);
93 ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v16 & 0x1FE)), 1);
95 ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 7) & 0x1FE)), 1);
104 v17 = (uint32_t *)&src[(line + (uintptr_t)v7 - (uintptr_t)src) & 0x7FF];
105 v18 = (uint32_t *)((char *)v8 + ext);
110 v21 = bswap32(v17[1]);
111 ALOWORD(v19) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 15) & 0x1FE)), 1);
113 ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 23) & 0x1FE)), 1);
116 ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v21 & 0x1FE)), 1);
118 ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 7) & 0x1FE)), 1);
122 v17 = (uint32_t *)&src[((uintptr_t)v17 + 8 - (uintptr_t)src) & 0x7FF];
123 ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 15) & 0x1FE)), 1);
125 ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 23) & 0x1FE)), 1);
128 ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v24 & 0x1FE)), 1);
130 ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 7) & 0x1FE)), 1);
136 v7 = &src[(line + (uintptr_t)v17 - (uintptr_t)src) & 0x7FF];
137 v8 = (uint32_t *)((char *)v18 + ext);
143 static inline void load8bIA8(uint8_t *src, uint8_t *dst, int wid_64, int height, int line, int ext, uint16_t *pal)
166 v7 = (uint32_t *)src;
167 v8 = (uint32_t *)dst;
178 ALOWORD(v10) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 15) & 0x1FE)), 8);
180 ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 23) & 0x1FE)), 8);
183 ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v12 & 0x1FE)), 8);
185 ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 7) & 0x1FE)), 8);
190 ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 15) & 0x1FE)), 8);
192 ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 23) & 0x1FE)), 8);
195 ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v16 & 0x1FE)), 8);
197 ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 7) & 0x1FE)), 8);
206 v17 = (uint32_t *)((char *)v7 + line);
207 v18 = (uint32_t *)((char *)v8 + ext);
212 v21 = bswap32(v17[1]);
213 ALOWORD(v19) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 15) & 0x1FE)), 8);
215 ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 23) & 0x1FE)), 8);
218 ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v21 & 0x1FE)), 8);
220 ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 7) & 0x1FE)), 8);
225 ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 15) & 0x1FE)), 8);
227 ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 23) & 0x1FE)), 8);
230 ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v24 & 0x1FE)), 8);
232 ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 7) & 0x1FE)), 8);
238 v7 = (uint32_t *)((char *)v17 + line);
239 v8 = (uint32_t *)((char *)v18 + ext);
245 static inline void load8bIA4(uint8_t *src, uint8_t *dst, int wid_64, int height, int line, int ext)
265 v6 = (uint32_t *)src;
266 v7 = (uint32_t *)dst;
275 v11 = (*v6 >> 4) & 0xF0F0F0F;
277 *v7 = (16 * v10 & 0xF0F0F0F0) | v11;
279 v14 = (*v12 >> 4) & 0xF0F0F0F;
280 v15 = 16 * *v12 & 0xF0F0F0F0;
290 v16 = (uint32_t *)((char *)v6 + line);
291 v17 = (uint32_t *)((char *)v7 + ext);
295 *v17 = (16 * v16[1] & 0xF0F0F0F0) | ((v16[1] >> 4) & 0xF0F0F0F);
299 *v19 = (16 * v20 & 0xF0F0F0F0) | ((v20 >> 4) & 0xF0F0F0F);
304 v6 = (uint32_t *)((char *)v16 + line);
305 v7 = (uint32_t *)((char *)v17 + ext);
311 static inline void load8bI(uint8_t *src, uint8_t *dst, int wid_64, int height, int line, int ext)
329 v6 = (uint32_t *)src;
330 v7 = (uint32_t *)dst;
352 v14 = (uint32_t *)((char *)v6 + line);
353 v15 = (uint32_t *)((char *)v7 + ext);
366 v6 = (uint32_t *)((char *)v14 + line);
367 v7 = (uint32_t *)((char *)v15 + ext);
373 //****************************************************************
374 // Size: 1, Format: 2
377 wxUint32 Load8bCI (wxUIntPtr dst, wxUIntPtr src, int wid_64, int height, int line, int real_width, int tile)
379 if (wid_64 < 1) wid_64 = 1;
380 if (height < 1) height = 1;
381 int ext = (real_width - (wid_64 << 3));
382 unsigned short * pal = rdp.pal_8;
384 switch (rdp.tlut_mode) {
385 case 0: //palette is not used
386 //in tlut DISABLE mode load CI texture as plain intensity texture instead of palette dereference.
387 //Thanks to angrylion for the advice
388 load8bI ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext);
389 return /*(0 << 16) | */GR_TEXFMT_ALPHA_8;
390 case 2: //color palette
392 load8bCI ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext, pal);
393 return (1 << 16) | GR_TEXFMT_ARGB_1555;
394 default: //IA palette
396 load8bIA8 ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext, pal);
397 return (1 << 16) | GR_TEXFMT_ALPHA_INTENSITY_88;
401 //****************************************************************
402 // Size: 1, Format: 3
406 wxUint32 Load8bIA (wxUIntPtr dst, wxUIntPtr src, int wid_64, int height, int line, int real_width, int tile)
408 if (rdp.tlut_mode != 0)
409 return Load8bCI (dst, src, wid_64, height, line, real_width, tile);
411 if (wid_64 < 1) wid_64 = 1;
412 if (height < 1) height = 1;
413 int ext = (real_width - (wid_64 << 3));
414 load8bIA4 ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext);
415 return /*(0 << 16) | */GR_TEXFMT_ALPHA_INTENSITY_44;
418 //****************************************************************
419 // Size: 1, Format: 4
423 wxUint32 Load8bI (wxUIntPtr dst, wxUIntPtr src, int wid_64, int height, int line, int real_width, int tile)
425 if (rdp.tlut_mode != 0)
426 return Load8bCI (dst, src, wid_64, height, line, real_width, tile);
428 if (wid_64 < 1) wid_64 = 1;
429 if (height < 1) height = 1;
430 int ext = (real_width - (wid_64 << 3));
431 load8bI ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext);
432 return /*(0 << 16) | */GR_TEXFMT_ALPHA_8;