Created
March 6, 2024 11:16
-
-
Save ogarvey/67b255c4c355e18d84d639aea6015aca to your computer and use it in GitHub Desktop.
Decompiled Tetris Decompress method
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
byte * Decompress(undefined4 param_1,undefined4 param_2,byte *param_3, | |
uint param_4,ushort param_5) | |
{ | |
ushort uVar2; | |
uint uVar1; | |
int iVar3; | |
byte bVar4; | |
uint uVar5; | |
uint uVar6; | |
ushort uVar7; | |
byte *pbVar8; | |
byte *pbVar9; | |
byte *pbVar10; | |
byte *pbVar11; | |
int unaff_A5; | |
if ((param_3 != (byte *)0x0) || | |
(param_3 = (byte *)SysBOLTAlloc(param_4,param_5,param_4,param_5), | |
param_3 != (byte *)0x0)) { | |
pbVar8 = *(byte **)(unaff_A5 + -0x15f0); | |
iVar3 = *(int *)(unaff_A5 + -0x15f8); | |
pbVar11 = param_3; | |
if ((param_5 & 8) == 0) { | |
LAB_00008fac: | |
if ((int)param_4 < 1) goto LAB_0000924e; | |
iVar3 = iVar3 + -1; | |
pbVar10 = pbVar8; | |
if (iVar3 < 0) { | |
NextBlock(); | |
pbVar10 = *(byte **)(unaff_A5 + -0x15f0); | |
iVar3 = *(int *)(unaff_A5 + -0x15f8); | |
} | |
pbVar8 = pbVar10 + 1; | |
bVar4 = *pbVar10; | |
uVar5 = (uint)bVar4; | |
uVar7 = (ushort)bVar4; | |
switch((short)((uVar5 & 0xffff00f0) >> 2) + 0x8fd4) { | |
case 0x8fd4: | |
goto LAB_00009014; | |
case 0x8fd8: | |
LAB_00009014: | |
uVar5 = (uint)(uVar7 & 0x1f); | |
param_4 = (param_4 - uVar5) - 1; | |
pbVar10 = pbVar11; | |
if ((int)uVar5 < iVar3) { | |
iVar3 = (iVar3 - uVar5) + -1; | |
pbVar10 = pbVar8; | |
pbVar9 = pbVar11; | |
do { | |
pbVar8 = pbVar10 + 1; | |
pbVar11 = pbVar9 + 1; | |
*pbVar9 = *pbVar10; | |
uVar7 = (short)uVar5 - 1; | |
uVar5 = (uint)uVar7; | |
pbVar10 = pbVar8; | |
pbVar9 = pbVar11; | |
} while (uVar7 != 0xffff); | |
} | |
else { | |
do { | |
iVar3 = iVar3 + -1; | |
pbVar9 = pbVar8; | |
if (iVar3 < 0) { | |
NextBlock(); | |
pbVar9 = *(byte **)(unaff_A5 + -0x15f0); | |
iVar3 = *(int *)(unaff_A5 + -0x15f8); | |
} | |
pbVar8 = pbVar9 + 1; | |
pbVar11 = pbVar10 + 1; | |
*pbVar10 = *pbVar9; | |
uVar7 = (short)uVar5 - 1; | |
uVar5 = (uint)uVar7; | |
pbVar10 = pbVar11; | |
} while (uVar7 != 0xffff); | |
} | |
goto LAB_00008fac; | |
case 0x8fdc: | |
uVar7 = uVar7 & 0xf; | |
bVar4 = 0; | |
goto LAB_00009076; | |
case 0x8fe0: | |
iVar3 = iVar3 + -1; | |
pbVar10 = pbVar8; | |
if (iVar3 < 0) { | |
NextBlock(); | |
pbVar10 = *(byte **)(unaff_A5 + -0x15f0); | |
iVar3 = *(int *)(unaff_A5 + -0x15f8); | |
} | |
uVar7 = (uVar7 & 0xf) + 2; | |
pbVar8 = pbVar10 + 1; | |
bVar4 = *pbVar10; | |
LAB_00009076: | |
uVar5 = (uint)uVar7; | |
param_4 = (param_4 - uVar5) - 1; | |
pbVar10 = pbVar11; | |
do { | |
pbVar11 = pbVar10 + 1; | |
*pbVar10 = bVar4; | |
uVar7 = (short)uVar5 - 1; | |
uVar5 = (uint)uVar7; | |
pbVar10 = pbVar11; | |
} while (uVar7 != 0xffff); | |
goto LAB_00008fac; | |
case 0x8fe4: | |
goto LAB_00009084; | |
case 0x8fe8: | |
goto LAB_00009084; | |
case 0x8fec: | |
goto LAB_00009084; | |
case 0x8ff0: | |
LAB_00009084: | |
uVar6 = (uint)(ushort)((bVar4 & 7) + 1); | |
pbVar10 = pbVar11 + -(int)(short)((bVar4 >> 3 & 7) + 1); | |
break; | |
case 0x8ff4: | |
iVar3 = iVar3 + -1; | |
pbVar10 = pbVar8; | |
if (iVar3 < 0) { | |
NextBlock(); | |
pbVar10 = *(byte **)(unaff_A5 + -0x15f0); | |
iVar3 = *(int *)(unaff_A5 + -0x15f8); | |
} | |
pbVar8 = pbVar10 + 1; | |
uVar6 = (uint)(ushort)((*pbVar10 & 0x3f) + 2); | |
pbVar10 = pbVar11 + -(int)(short)((CONCAT11(bVar4,*pbVar10) >> 6 & 0x3 f) | |
+ 1); | |
break; | |
case 0x8ff8: | |
iVar3 = iVar3 + -1; | |
pbVar10 = pbVar8; | |
if (iVar3 < 0) { | |
NextBlock(); | |
pbVar10 = *(byte **)(unaff_A5 + -0x15f0); | |
iVar3 = *(int *)(unaff_A5 + -0x15f8); | |
} | |
pbVar8 = pbVar10 + 1; | |
uVar6 = (uint)(ushort)((*pbVar10 & 3) + 2); | |
pbVar10 = pbVar11 + -(int)(short)((CONCAT11(bVar4,*pbVar10) >> 2 & 0x3 ff | |
) + 1); | |
break; | |
case 0x8ffc: | |
iVar3 = iVar3 + -1; | |
if (iVar3 < 0) { | |
NextBlock(); | |
pbVar8 = *(byte **)(unaff_A5 + -0x15f0); | |
iVar3 = *(int *)(unaff_A5 + -0x15f8); | |
} | |
pbVar10 = pbVar8 + 1; | |
uVar2 = (ushort)*pbVar8 << 8; | |
iVar3 = iVar3 + -1; | |
if (iVar3 < 0) { | |
NextBlock(); | |
pbVar10 = *(byte **)(unaff_A5 + -0x15f0); | |
iVar3 = *(int *)(unaff_A5 + -0x15f8); | |
} | |
pbVar8 = pbVar10 + 1; | |
uVar6 = (uint)(ushort)((uVar2 & 0xff00 | (ushort)*pbVar10) - 1); | |
pbVar10 = pbVar11 + -(int)(short)((uVar7 & 0xf) + 1); | |
break; | |
case 0x9000: | |
iVar3 = iVar3 + -1; | |
if (iVar3 < 0) { | |
NextBlock(); | |
pbVar8 = *(byte **)(unaff_A5 + -0x15f0); | |
iVar3 = *(int *)(unaff_A5 + -0x15f8); | |
} | |
pbVar10 = pbVar8 + 1; | |
uVar1 = (uint)*pbVar8 << 8; | |
iVar3 = iVar3 + -1; | |
if (iVar3 < 0) { | |
NextBlock(); | |
pbVar10 = *(byte **)(unaff_A5 + -0x15f0); | |
iVar3 = *(int *)(unaff_A5 + -0x15f8); | |
} | |
pbVar8 = pbVar10 + 1; | |
uVar6 = (uint)(ushort)(((ushort)uVar1 & 0x300 | (ushort)*pbVar10) + 3) ; | |
pbVar10 = pbVar11 + -(int)(short)(((ushort)((uVar1 & 0xff00 | | |
uVar5 << 0x10) >> 10) & | |
0x3ff) + 1); | |
break; | |
case 0x9004: | |
goto LAB_00009192; | |
case 0x9008: | |
LAB_00009192: | |
uVar6 = (uint)(ushort)((bVar4 & 3) + 1); | |
pbVar10 = pbVar11 + -(int)(short)(bVar4 >> 2 & 7); | |
goto LAB_000091d4; | |
case 0x900c: | |
iVar3 = iVar3 + -1; | |
pbVar10 = pbVar8; | |
if (iVar3 < 0) { | |
NextBlock(); | |
pbVar10 = *(byte **)(unaff_A5 + -0x15f0); | |
iVar3 = *(int *)(unaff_A5 + -0x15f8); | |
} | |
pbVar8 = pbVar10 + 1; | |
uVar6 = (uint)(ushort)((*pbVar10 & 0x3f) + 2); | |
pbVar10 = pbVar11 + -(int)(short)(CONCAT11(bVar4,*pbVar10) >> 6 & 0x3f ); | |
goto LAB_000091d4; | |
case 0x9010: | |
iVar3 = iVar3 + -1; | |
if (iVar3 < 0) { | |
NextBlock(); | |
pbVar8 = *(byte **)(unaff_A5 + -0x15f0); | |
iVar3 = *(int *)(unaff_A5 + -0x15f8); | |
} | |
pbVar10 = pbVar8 + 1; | |
uVar1 = (uint)*pbVar8 << 8; | |
iVar3 = iVar3 + -1; | |
if (iVar3 < 0) { | |
NextBlock(); | |
pbVar10 = *(byte **)(unaff_A5 + -0x15f0); | |
iVar3 = *(int *)(unaff_A5 + -0x15f8); | |
} | |
pbVar8 = pbVar10 + 1; | |
uVar6 = (uint)(ushort)(((ushort)uVar1 & 0x300 | (ushort)*pbVar10) + 3) ; | |
pbVar10 = pbVar11 + -(int)(short)((ushort)((uVar1 & 0xff00 | | |
uVar5 << 0x10) >> 10) & 0x3f f | |
); | |
LAB_000091d4: | |
param_4 = (param_4 - uVar6) - 1; | |
pbVar9 = pbVar11; | |
do { | |
pbVar10 = pbVar10 + -1; | |
pbVar11 = pbVar9 + 1; | |
*pbVar9 = *pbVar10; | |
uVar7 = (short)uVar6 - 1; | |
uVar6 = (uint)uVar7; | |
pbVar9 = pbVar11; | |
} while (uVar7 != 0xffff); | |
goto LAB_00008fac; | |
} | |
param_4 = (param_4 - uVar6) - 1; | |
pbVar9 = pbVar11; | |
do { | |
pbVar11 = pbVar9 + 1; | |
*pbVar9 = *pbVar10; | |
uVar7 = (short)uVar6 - 1; | |
uVar6 = (uint)uVar7; | |
pbVar10 = pbVar10 + 1; | |
pbVar9 = pbVar11; | |
} while (uVar7 != 0xffff); | |
goto LAB_00008fac; | |
} | |
while ((uVar7 = (short)param_4 - 1, | |
param_4 = param_4 & 0xffff0000 | (uint)uVar7, uVar7 != 0xffff || | |
(param_4 = param_4 - 0x10000, -1 < (int)param_4))) { | |
iVar3 = iVar3 + -1; | |
pbVar10 = pbVar8; | |
if (iVar3 < 0) { | |
NextBlock(); | |
pbVar10 = *(byte **)(unaff_A5 + -0x15f0); | |
iVar3 = *(int *)(unaff_A5 + -0x15f8); | |
} | |
pbVar8 = pbVar10 + 1; | |
*pbVar11 = *pbVar10; | |
pbVar11 = pbVar11 + 1; | |
} | |
LAB_0000924e: | |
*(int *)(unaff_A5 + -0x15f8) = iVar3; | |
*(byte **)(unaff_A5 + -0x15f0) = pbVar8; | |
} | |
A6 = &DAT_80008000; | |
return param_3; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment