Advertisement
Guest User

Untitled

a guest
Jun 14th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 15.46 KB | None | 0 0
  1. int __usercall graphics_Decompression_@<eax>(int a1@<eax>, int a2@<edx>, int a3@<ecx>, int a4@<ebx>)
  2. {
  3.   int v4; // eax@25
  4.   int v5; // eax@28
  5.   int v6; // eax@28
  6.   int v7; // eax@32
  7.   int v8; // eax@32
  8.   signed int v9; // edx@36
  9.   int v10; // eax@54
  10.   int v11; // eax@55
  11.   int v12; // edx@88
  12.   int v13; // edx@98
  13.   int v14; // eax@103
  14.   signed int v15; // edx@105
  15.   unsigned __int16 v16; // ax@106
  16.   unsigned __int16 v17; // ax@109
  17.   signed int v18; // edx@109
  18.   unsigned __int16 v19; // ax@111
  19.   unsigned __int16 v20; // ax@114
  20.   __int64 v21; // rax@116
  21.   int v22; // eax@117
  22.   unsigned __int16 v24; // [sp+0h] [bp-90h]@40
  23.   unsigned __int16 v25; // [sp+4h] [bp-8Ch]@3
  24.   __int16 v26; // [sp+8h] [bp-88h]@105
  25.   __int16 v27; // [sp+Ah] [bp-86h]@105
  26.   __int16 v28; // [sp+Ch] [bp-84h]@105
  27.   __int16 v29; // [sp+Eh] [bp-82h]@105
  28.   int v30; // [sp+10h] [bp-80h]@1
  29.   int v31; // [sp+14h] [bp-7Ch]@1
  30.   int v32; // [sp+18h] [bp-78h]@1
  31.   int v33; // [sp+1Ch] [bp-74h]@20
  32.   int v34; // [sp+20h] [bp-70h]@20
  33.   int v35; // [sp+24h] [bp-6Ch]@2
  34.   int v36; // [sp+28h] [bp-68h]@2
  35.   int v37; // [sp+2Ch] [bp-64h]@2
  36.   int v38; // [sp+30h] [bp-60h]@2
  37.   int v39; // [sp+34h] [bp-5Ch]@25
  38.   int v40; // [sp+38h] [bp-58h]@53
  39.   int v41; // [sp+3Ch] [bp-54h]@1
  40.   int v42; // [sp+40h] [bp-50h]@25
  41.   int v43; // [sp+44h] [bp-4Ch]@2
  42.   int v44; // [sp+48h] [bp-48h]@88
  43.   int v45; // [sp+4Ch] [bp-44h]@123
  44.   int v46; // [sp+50h] [bp-40h]@36
  45.   int v47; // [sp+54h] [bp-3Ch]@88
  46.   int v48; // [sp+58h] [bp-38h]@88
  47.   int v49; // [sp+5Ch] [bp-34h]@88
  48.   int v50; // [sp+60h] [bp-30h]@88
  49.   char *v51; // [sp+64h] [bp-2Ch]@105
  50.   int v52; // [sp+68h] [bp-28h]@1
  51.   int v53; // [sp+6Ch] [bp-24h]@52
  52.   _WORD *v54; // [sp+70h] [bp-20h]@96
  53.   int v55; // [sp+74h] [bp-1Ch]@1
  54.   int v56; // [sp+78h] [bp-18h]@1
  55.   int v57; // [sp+7Ch] [bp-14h]@15
  56.   int v58; // [sp+80h] [bp-10h]@26
  57.   int v59; // [sp+84h] [bp-Ch]@26
  58.   int v60; // [sp+88h] [bp-8h]@1
  59.   int v61; // [sp+8Ch] [bp-4h]@54
  60.  
  61.   v32 = a1;
  62.   v30 = a2;
  63.   v31 = a4;
  64.   v41 = a3;
  65.   v52 = 0;
  66.   v60 = 0;
  67.   v55 = 0;
  68.   v56 = a3 + 35;
  69.   if ( *(_DWORD *)(a1 + 32) == -1515870811 )
  70.   {
  71.     v35 = (*(_DWORD *)(v32 + 16) >> 16) - *(_WORD *)(v32 + 64);
  72.     v36 = (*(_DWORD *)(v32 + 20) >> 16) - *(_WORD *)(v32 + 66);
  73.     v37 = *(_WORD *)(v32 + 36);
  74.     v38 = *(_WORD *)(v32 + 38);
  75.     v43 = 0;
  76.     *(_WORD *)(v56 + 4) = v35;
  77.     *(_WORD *)(v56 + 6) = v36;
  78.     *(_WORD *)(v56 + 8) = v37;
  79.     *(_WORD *)(v56 + 10) = v38;
  80.     *(_BYTE *)(v56 + 12) = 8 * (*(_BYTE *)(v32 + 42) & 0x1F);
  81.     *(_BYTE *)(v56 + 13) = 8 * (((signed int)*(_WORD *)(v32 + 42) >> 5) & 0x1F);
  82.     *(_BYTE *)(v56 + 14) = 8 * (((signed int)*(_WORD *)(v32 + 42) >> 10) & 0x1F);
  83.     if ( *(_BYTE *)(v32 + 30) & 0x80 )
  84.     {
  85.       v25 = *(_WORD *)(v32 + 30) & 0x300;
  86.       if ( v25 < 0x100u )
  87.       {
  88.         if ( !v25 )
  89.           v43 |= 0x40000000u;
  90.       }
  91.       else if ( v25 <= 0x100u )
  92.       {
  93.         v43 |= 0x50000000u;
  94.       }
  95.       else if ( v25 >= 0x200u )
  96.       {
  97.         if ( v25 <= 0x200u )
  98.         {
  99.           v43 |= 0x60000000u;
  100.         }
  101.         else if ( v25 == 768 )
  102.         {
  103.           v43 |= 0x70000000u;
  104.         }
  105.       }
  106.     }
  107.     *(_DWORD *)v56 = v43;
  108.     v57 = 4;
  109.   }
  110.   else
  111.   {
  112.     if ( *(_WORD *)(v32 + 60) == 262 )
  113.     {
  114.       v55 = v32;
  115.       v32 = dword_55423C;
  116.     }
  117.     else if ( *(_WORD *)(v32 + 60) == 263 )
  118.     {
  119.       v55 = v32;
  120.       v32 = dword_5543B4;
  121.     }
  122.     v33 = v30;
  123.     v34 = v31;
  124.     if ( *(_BYTE *)(v32 + 44) & 0x20 )
  125.     {
  126.       v57 = 3;
  127.     }
  128.     else
  129.     {
  130.       v43 = 0;
  131.       if ( v55 )
  132.       {
  133.         v35 = *(_DWORD *)(v55 + 16) >> 16;
  134.         v36 = *(_DWORD *)(v55 + 20) >> 16;
  135.       }
  136.       else
  137.       {
  138.         v35 = *(_DWORD *)(v32 + 16) >> 16;
  139.         v36 = *(_DWORD *)(v32 + 20) >> 16;
  140.       }
  141.       v39 = (*(_DWORD *)(v32 + 32) >> 24) & 0x1F;
  142.       v42 = (*(_DWORD *)(v32 + 32) >> 24) & 0xE0;
  143.       v37 = *(_WORD *)(v32 + 36);
  144.       v38 = *(_WORD *)(v32 + 38);
  145.       v4 = *(_WORD *)(v32 + 40);
  146.       if ( v4 == -1 )
  147.       {
  148.         LOWORD(v4) = word_5932AC;
  149.         v58 = v4;
  150.         LOWORD(v4) = word_5932AE;
  151.         v59 = v4;
  152.         v43 |= 0x60000000u;
  153.       }
  154.       else if ( v55 )
  155.       {
  156.         v5 = 160 * v39 + 2 * *(_WORD *)(v55 + 40);
  157.         LOWORD(v5) = *(__int16 *)((char *)word_591EA8 + v5);
  158.         v58 = v5;
  159.         v6 = 160 * v39 + 2 * *(_WORD *)(v55 + 40);
  160.         LOWORD(v6) = *(__int16 *)((char *)word_590AA8 + v6);
  161.         v59 = v6;
  162.         v43 |= 0x40000000u;
  163.       }
  164.       else if ( *(_WORD *)(v32 + 40) < 80 && *(_WORD *)(v32 + 40) >= 0 )
  165.       {
  166.         v7 = 160 * v39 + 2 * *(_WORD *)(v32 + 40);
  167.         LOWORD(v7) = *(__int16 *)((char *)word_591EA8 + v7);
  168.         v58 = v7;
  169.         v8 = 160 * v39 + 2 * *(_WORD *)(v32 + 40);
  170.         LOWORD(v8) = *(__int16 *)((char *)word_590AA8 + v8);
  171.         v59 = v8;
  172.       }
  173.       else
  174.       {
  175.         v58 = 0;
  176.         v59 = 250;
  177.       }
  178.       *(_WORD *)(v41 + 8) = v37;
  179.       *(_WORD *)(v41 + 10) = v38;
  180.       *(_WORD *)(v41 + 16) = v58;
  181.       *(_WORD *)(v41 + 18) = v59;
  182.       if ( *(_BYTE *)(v32 + 30) & 8 )
  183.       {
  184.         *(_WORD *)(v41 + 16) = word_5932AA;
  185.         *(_WORD *)(v41 + 18) = word_5932A8;
  186.         *(_BYTE *)(v41 + 20) = 4 * ((*(_BYTE *)(v32 + 42) & 0x1F) + 1);
  187.         *(_BYTE *)(v41 + 21) = 4 * (((signed int)*(_WORD *)(v32 + 42) >> 5) & 0x1F) + 4;
  188.         *(_BYTE *)(v41 + 22) = 4 * (((signed int)*(_WORD *)(v32 + 42) >> 10) & 0x1F) + 4;
  189.       }
  190.       else
  191.       {
  192.         if ( v39 == 31 )
  193.         {
  194.           v9 = (word_554900 + 128) * (*(_WORD *)(v32 + 72) + 128);
  195.           v46 = (v9 - (__CFSHL__(v9 >> 31, 7) + (v9 >> 31 << 7))) >> 7;
  196.         }
  197.         else
  198.         {
  199.           v46 = *(_WORD *)(v32 + 72) + 128;
  200.         }
  201.         *(_BYTE *)(v41 + 20) = (v46 * (unsigned __int8)word_5C3C86
  202.                               - (__CFSHL__(v46 * (unsigned __int8)word_5C3C86 >> 31, 7)
  203.                                + (v46 * (unsigned __int8)word_5C3C86 >> 31 << 7))) >> 7;
  204.         *(_BYTE *)(v41 + 21) = (v46 * HIBYTE(word_5C3C86)
  205.                               - (__CFSHL__(v46 * HIBYTE(word_5C3C86) >> 31, 7)
  206.                                + (v46 * HIBYTE(word_5C3C86) >> 31 << 7))) >> 7;
  207.         *(_BYTE *)(v41 + 22) = (v46 * (unsigned __int8)word_5C3C88
  208.                               - (__CFSHL__(v46 * (unsigned __int8)word_5C3C88 >> 31, 7)
  209.                                + (v46 * (unsigned __int8)word_5C3C88 >> 31 << 7))) >> 7;
  210.       }
  211.       *(_WORD *)(v41 + 23) = 0;
  212.       *(_WORD *)(v41 + 25) = 0;
  213.       *(_WORD *)(v41 + 27) = 4096;
  214.       *(_WORD *)(v41 + 29) = 4096;
  215.       *(_DWORD *)(v41 + 31) = 0;
  216.       if ( *(_BYTE *)(v32 + 30) & 0x80 )
  217.       {
  218.         v24 = *(_WORD *)(v32 + 30) & 0x300;
  219.         if ( v24 < 0x100u )
  220.         {
  221.           if ( !v24 )
  222.             v43 |= 0x40000000u;
  223.         }
  224.         else if ( v24 <= 0x100u )
  225.         {
  226.           v43 |= 0x50000000u;
  227.         }
  228.         else if ( v24 >= 0x200u )
  229.         {
  230.           if ( v24 <= 0x200u )
  231.           {
  232.             v43 |= 0x60000000u;
  233.           }
  234.           else if ( v24 == 768 )
  235.           {
  236.             v43 |= 0x70000000u;
  237.           }
  238.         }
  239.       }
  240.       v53 = 3;
  241.       if ( v42 & 0x80 )
  242.       {
  243.         v53 = 0;
  244.         v40 = (*(_DWORD *)(v32 + 32) >> 16) & 0xFF;
  245.         if ( v42 & 0x40 )
  246.         {
  247.           v10 = 20 * v39 + 2 * v40;
  248.           LOWORD(v10) = *(__int16 *)((char *)word_5B78B0 + v10);
  249.           v61 = v10;
  250.         }
  251.         else
  252.         {
  253.           v11 = 20 * v39 + 2 * v40;
  254.           LOWORD(v11) = *(__int16 *)((char *)word_5B75B0 + v11);
  255.           v61 = v11;
  256.           v43 |= 0x1000000u;
  257.         }
  258.         if ( *(_BYTE *)(v32 + 44) & 1 || *(_BYTE *)(v32 + 30) & 0x40 )
  259.         {
  260.           v33 = 0;
  261.           v34 = 0;
  262.         }
  263.         if ( v39 == 31 && *(_WORD *)(v32 + 60) != 1445 )
  264.         {
  265.           *(_WORD *)(v41 + 4) = v35 - v33;
  266.           *(_WORD *)(v41 + 6) = v36 - v34;
  267.           if ( *(_BYTE *)(v32 + 30) & 0x10 )
  268.           {
  269.             v43 |= 0x800000u;
  270.             v53 = 1;
  271.           }
  272.           if ( *(_BYTE *)(v32 + 30) & 0x20 )
  273.           {
  274.             v43 |= 0x400000u;
  275.             v53 = 1;
  276.           }
  277.         }
  278.         else
  279.         {
  280.           if ( !(*(_BYTE *)(v32 + 44) & 1) && !(*(_BYTE *)(v32 + 30) & 0x40) )
  281.           {
  282.             v35 = 52428 * v35 >> 16;
  283.             v36 = 55705 * v36 >> 16;
  284.           }
  285.           *(_WORD *)(v41 + 8) -= *(_WORD *)(v32 + 28);
  286.           v37 -= *(_WORD *)(v32 + 28);
  287.           if ( *(_BYTE *)(v32 + 30) & 0x10 )
  288.           {
  289.             v43 |= 0x800000u;
  290.             v53 = 1;
  291.             *(_WORD *)(v41 + 4) = v35 - v33 - (v37 - *(_WORD *)(v32 + 64));
  292.           }
  293.           else
  294.           {
  295.             *(_WORD *)(v41 + 4) = v35 - v33 - *(_WORD *)(v32 + 64);
  296.           }
  297.           if ( *(_BYTE *)(v32 + 30) & 0x20 )
  298.           {
  299.             v43 |= 0x400000u;
  300.             v53 = 1;
  301.             *(_WORD *)(v41 + 6) = v36 - v34 - (v38 - *(_WORD *)(v32 + 66));
  302.           }
  303.           else
  304.           {
  305.             *(_WORD *)(v41 + 6) = v36 - v34 - *(_WORD *)(v32 + 66);
  306.           }
  307.         }
  308.         if ( *(_DWORD *)(v32 + 48) == 16777472 )
  309.         {
  310.           v43 |= 0x8000000u;
  311.         }
  312.         else
  313.         {
  314.           v53 = 2;
  315.           *(_WORD *)(v41 + 27) = 16 * *(_WORD *)(v32 + 48);
  316.           *(_WORD *)(v41 + 29) = 16 * (*(_DWORD *)(v32 + 48) >> 16);
  317.         }
  318.         if ( *(_WORD *)(v41 + 4) < 320
  319.           && *(_WORD *)(v41 + 4) + *(_WORD *)(v41 + 8) > 0
  320.           && *(_WORD *)(v41 + 6) < 240
  321.           && *(_WORD *)(v41 + 6) + *(_WORD *)(v41 + 10) > 0 )
  322.         {
  323.           *(_DWORD *)v41 = v43;
  324.           *(_WORD *)(v41 + 12) = v61;
  325.           *(_BYTE *)(v41 + 14) = *(_WORD *)(v32 + 32) >> 8;
  326.           *(_BYTE *)(v41 + 15) = *(_BYTE *)(v32 + 32);
  327.           v57 = v53;
  328.         }
  329.         else
  330.         {
  331.           v57 = 3;
  332.         }
  333.       }
  334.       else
  335.       {
  336.         v53 = 0;
  337.         v44 = sub_41A340(*(_WORD *)(v32 + 60));
  338.         v47 = *(_DWORD *)(v32 + 56);
  339.         v48 = *(_WORD *)(v32 + 64);
  340.         v49 = *(_WORD *)(v32 + 66);
  341.         v50 = *(_WORD *)(v32 + 30);
  342.         if ( v39 == 30 )
  343.         {
  344.           v54 = word_53EF3C;
  345.           LOWORD(v12) = word_53EF3C[1] + word_5B78B0[0];
  346.           v61 = v12;
  347.         }
  348.         else
  349.         {
  350.           if ( v44 < 0 || v44 >= 2 )
  351.             return 3;
  352.           if ( !dword_5932B0[v44] )
  353.           {
  354.             if ( word_554716 )
  355.               dword_5932B0[v44] = (int)*(&off_53EFD0 + 32 * v44);
  356.             else
  357.               dword_5932B0[v44] = *(&dword_53EF60[32 * v44] + v39);
  358.           }
  359.           v54 = (_WORD *)sub_41A211(v44, v32);
  360.           if ( !v54 )
  361.             return 3;
  362.           v13 = 2 * v44;
  363.           LOWORD(v13) = v54[1] + word_53F060[v44];
  364.           v61 = v13;
  365.           v43 |= 0x1000000u;
  366.         }
  367.         if ( *(_DWORD *)(v54 + 7) != v47 )
  368.         {
  369.           if ( !dword_5B7830[v39] )
  370.             return 3;
  371.           v14 = v37 + 3;
  372.           LOBYTE(v14) = (v37 + 3) & 0xFC;
  373.           if ( (unsigned int)(4 * dword_5C3C5C + v38 * v14) >= 0xC000 )
  374.           {
  375.             nullsub_10();
  376.             dword_5C3C5C = 0;
  377.           }
  378.           *(_DWORD *)(v54 + 7) = *(_DWORD *)(v32 + 56);
  379.           v26 = ((v61 & 0xF) << 6) + v54[2] / 2;
  380.           v27 = ((unsigned __int16)(((signed __int16)v61
  381.                                    - (__CFSHL__((signed __int16)v61 >> 31, 4)
  382.                                     + 16 * ((signed __int16)v61 >> 31))) >> 4) << 8)
  383.               + v54[3];
  384.           v15 = v37 + 3;
  385.           LOBYTE(v15) = (v37 + 3) & 0xFC;
  386.           v28 = v15 / 2;
  387.           v29 = v38;
  388.           v51 = (char *)&unk_5B7B30 + 4 * dword_5C3C5C;
  389.           if ( v42 & 0x20 )
  390.           {
  391.             v16 = v37 + 3;
  392.             LOBYTE(v16) = (v37 + 3) & 0xFC;
  393.             sub_418032(
  394.               *(_DWORD *)dword_5B7830[v39] + dword_5B7830[v39],
  395.               dword_5B7830[v39] + (*(_DWORD *)(v32 + 32) & 0xFFFFFF),
  396.               (int)v51,
  397.               v16 | (v38 << 16));
  398.           }
  399.           else if ( v42 & 0x40 )
  400.           {
  401.             if ( v39 == 30 )
  402.             {
  403.               v17 = v37 + 3;
  404.               LOBYTE(v17) = (v37 + 3) & 0xFC;
  405.               sub_4167C8(
  406.                 dword_5B7830[30] + *(_DWORD *)dword_5B7830[30],
  407.                 dword_5B7830[30] + (*(_DWORD *)(v32 + 32) & 0xFFFFFF),
  408.                 (int)v51,
  409.                 v17 | (v38 << 16));
  410.               sub_41B053(&unk_5B7B30, v37);
  411.               v37 >>= 1;
  412.               v18 = v37 + 3;
  413.               LOBYTE(v18) = (v37 + 3) & 0xFC;
  414.               v28 = v18 / 2;
  415.             }
  416.             else
  417.             {
  418.               v51 = (char *)&unk_5B7B30 + 4 * dword_5C3C5C;
  419.               if ( !v52 )
  420.               {
  421.                 v19 = v37 + 3;
  422.                 LOBYTE(v19) = (v37 + 3) & 0xFC;
  423.                 sub_417072(
  424.                   *(_DWORD *)dword_5B7830[v39] + dword_5B7830[v39],
  425.                   dword_5B7830[v39] + (*(_DWORD *)(v32 + 32) & 0xFFFFFF),
  426.                   (v27 << 11) + 2 * v26 + dword_5C5A54,
  427.                   v19 | (v38 << 16));
  428.               }
  429.               v60 = 1;
  430.             }
  431.           }
  432.           else
  433.           {
  434.             v20 = v37 + 3;
  435.             LOBYTE(v20) = (v37 + 3) & 0xFC;
  436.             sub_417C32(
  437.               *(_DWORD *)dword_5B7830[v39] + dword_5B7830[v39],
  438.               dword_5B7830[v39] + (*(_DWORD *)(v32 + 32) & 0xFFFFFF),
  439.               (int)v51,
  440.               v20 | (v38 << 16));
  441.           }
  442.           if ( !(_WORD)v60 )
  443.           {
  444.             HIDWORD(v21) = v51;
  445.             LODWORD(v21) = &v26;
  446.             GPU_UploadToVram(v21);
  447.           }
  448.           v22 = v37 + 3;
  449.           LOBYTE(v22) = (v37 + 3) & 0xFC;
  450.           dword_5C3C5C += (unsigned int)(v38 * v22) >> 2;
  451.         }
  452.         *(_WORD *)(v41 + 12) = v61;
  453.         *(_BYTE *)(v41 + 14) = *((_BYTE *)v54 + 4);
  454.         *(_BYTE *)(v41 + 15) = *((_BYTE *)v54 + 6);
  455.         if ( *(_BYTE *)(v32 + 44) & 1 || *(_BYTE *)(v32 + 30) & 0x40 )
  456.         {
  457.           v33 = 0;
  458.           v34 = 0;
  459.         }
  460.         else
  461.         {
  462.           v35 = 52428 * v35 >> 16;
  463.           v36 = 55705 * v36 >> 16;
  464.         }
  465.         if ( *(_WORD *)(v32 + 28) )
  466.         {
  467.           v45 = 52428 * *(_WORD *)(v32 + 28) >> 16;
  468.           if ( *(_WORD *)(v41 + 8) < v45 )
  469.             v45 = *(_WORD *)(v41 + 8);
  470.           *(_WORD *)(v41 + 8) -= v45;
  471.           *(_BYTE *)(v41 + 14) += v45;
  472.           v37 -= v45;
  473.         }
  474.         if ( v50 & 0x10 )
  475.         {
  476.           v43 |= 0x800000u;
  477.           v53 = 1;
  478.           *(_WORD *)(v41 + 4) = v35 - v33 - (v37 - v48);
  479.         }
  480.         else
  481.         {
  482.           *(_WORD *)(v41 + 4) = v35 - v33 - v48;
  483.         }
  484.         if ( v50 & 0x20 )
  485.         {
  486.           v43 |= 0x400000u;
  487.           v53 = 1;
  488.           *(_WORD *)(v41 + 6) = v36 - v34 - (v38 - v49);
  489.         }
  490.         else
  491.         {
  492.           *(_WORD *)(v41 + 6) = v36 - v34 - v49;
  493.         }
  494.         if ( *(_DWORD *)(v32 + 48) == 16777472 )
  495.         {
  496.           v43 |= 0x8000000u;
  497.         }
  498.         else
  499.         {
  500.           v53 = 2;
  501.           *(_WORD *)(v41 + 27) = 16 * *(_WORD *)(v32 + 48);
  502.           *(_WORD *)(v41 + 29) = 16 * (*(_DWORD *)(v32 + 48) >> 16);
  503.         }
  504.         *(_DWORD *)v41 = v43;
  505.         if ( *(_WORD *)(v41 + 4) < 320
  506.           && *(_WORD *)(v41 + 4) + *(_WORD *)(v41 + 8) > 0
  507.           && *(_WORD *)(v41 + 6) < 240
  508.           && *(_WORD *)(v41 + 6) + *(_WORD *)(v41 + 10) > 0 )
  509.         {
  510.           v57 = v53;
  511.         }
  512.         else
  513.         {
  514.           v57 = 3;
  515.         }
  516.       }
  517.     }
  518.   }
  519.   return v57;
  520. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement