Skip to content

Instantly share code, notes, and snippets.

@ogarvey
Created March 6, 2024 11:16
Show Gist options
  • Save ogarvey/67b255c4c355e18d84d639aea6015aca to your computer and use it in GitHub Desktop.
Save ogarvey/67b255c4c355e18d84d639aea6015aca to your computer and use it in GitHub Desktop.
Decompiled Tetris Decompress method
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