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