Skip to content

Instantly share code, notes, and snippets.

@SunboX
Last active March 25, 2025 07:56
Show Gist options
  • Save SunboX/4b698ab12de8394e969ba7f04dfae261 to your computer and use it in GitHub Desktop.
Save SunboX/4b698ab12de8394e969ba7f04dfae261 to your computer and use it in GitHub Desktop.
typedef unsigned char undefined;
typedef unsigned char byte;
typedef unsigned int uint;
typedef unsigned char undefined1;
typedef unsigned short undefined2;
typedef unsigned int undefined4;
typedef unsigned long long undefined8;
int strcmp_custom(byte *str1,byte *str2)
{
uint uintChar1;
bool compareResult;
byte currentChar1;
do {
uintChar1 = (uint)*str1;
currentChar1 = *str2;
compareResult = uintChar1 == 1;
if (uintChar1 != 0) {
compareResult = uintChar1 == currentChar1;
}
str1 = str1 + 1;
str2 = str2 + 1;
} while (compareResult);
return uintChar1 - currentChar1;
}
byte * memchr_custom(uint *buffer,uint searchByte,uint length)
{
uint *bufferPtr;
byte *resultPtr;
uint temp1;
uint temp2;
uint temp3;
uint temp4;
bool cond1;
bool cond2;
bool cond3;
bool cond4;
char charCheck1;
char charCheck2;
char charCheck3;
char charCheck4;
byte *currentPtr;
searchByte = searchByte & 0xff;
if ((int)length < 0x10) {
joined_r0x08000250:
do {
if (length == 0) {
return (byte *)0x0;
}
bufferPtr = (uint *)((int)buffer + 1);
temp1 = *buffer;
length = length - 1;
buffer = bufferPtr;
} while ((byte)temp1 != searchByte);
}
else {
temp1 = (uint)buffer & 7;
while( true ) {
if (temp1 == 0) {
temp1 = searchByte | searchByte << 8;
temp1 = temp1 | temp1 << 0x10;
temp2 = length & 0xfffffff8;
do {
bufferPtr = buffer + 2;
temp2 = temp2 - 8;
temp3 = *buffer ^ temp1;
temp4 = buffer[1] ^ temp1;
charCheck1 = -((char)temp3 == '\0');
charCheck2 = -((char)(temp3 >> 8) == '\0');
charCheck3 = -((char)(temp3 >> 0x10) == '\0');
charCheck4 = -((char)(temp3 >> 0x18) == '\0');
temp3 = CONCAT13(charCheck4,CONCAT12(charCheck3,CONCAT11(charCheck2,charCheck1)));
cond1 = (char)temp4 != '\0';
cond2 = (char)(temp4 >> 8) != '\0';
cond3 = (char)(temp4 >> 0x10) != '\0';
cond4 = (char)(temp4 >> 0x18) != '\0';
temp4 = CONCAT13(cond4 * charCheck4 - !cond4,
CONCAT12(cond3 * charCheck3 - !cond3,
CONCAT11(cond2 * charCheck2 - !cond2,cond1 * charCheck1 - !cond1
)));
if (temp4 != 0) {
if (temp3 == 0) {
resultPtr = (byte *)((int)buffer + 5);
temp3 = temp4;
}
else {
resultPtr = (byte *)((int)buffer + 1);
}
if ((temp3 & 1) == 0) {
cond1 = (temp3 & 0x100) == 0;
currentPtr = resultPtr + 1;
if (cond1) {
currentPtr = resultPtr + 2;
}
resultPtr = currentPtr;
if (cond1 && (temp3 & 0x18000) == 0) {
resultPtr = resultPtr + 1;
}
}
return resultPtr + -1;
}
buffer = bufferPtr;
} while (temp2 != 0);
length = length & 7;
goto joined_r0x08000250;
}
bufferPtr = (uint *)((int)buffer + 1);
length = length - 1;
if ((byte)*buffer == searchByte) break;
temp1 = (uint)bufferPtr & 7;
buffer = bufferPtr;
if (length == 0) {
return (byte *)0x0;
}
}
}
return (byte *)((int)bufferPtr + -1);
}
char * strlen_custom(char *str)
{
char *ptr;
char *currentPos;
char currentChar;
currentPos = str;
do {
ptr = currentPos + 1;
currentChar = *currentPos;
currentPos = ptr;
} while (currentChar != '\0');
return ptr + (-1 - (int)str);
}
ulonglong fp_add(uint aSignificand,uint aExponent,uint bSignificand,uint bExponent)
{
int iVar1;
byte bVar2;
uint uVar3;
uint uVar4;
uint uVar5;
uint uVar6;
uint uVar7;
int iVar8;
uint uVar9;
uint uVar10;
uint uVar11;
uint uVar12;
bool bVar13;
bool bVar14;
bool bVar15;
uVar6 = bExponent ^ 0x80000000;
uVar9 = aExponent << 1;
bExponent = bExponent << 1;
bVar13 = ((aExponent ^ uVar6) & 0x7fffffff) == 0;
bVar14 = bVar13 && aSignificand == bSignificand;
if (!bVar13 || aSignificand != bSignificand) {
bVar14 = uVar9 == 0 && aSignificand == 0;
}
if (!bVar14) {
bVar14 = bExponent == 0 && bSignificand == 0;
}
iVar8 = (int)uVar9 >> 0x15;
if (!bVar14) {
bVar14 = iVar8 == -1;
}
iVar1 = (int)bExponent >> 0x15;
if (!bVar14) {
bVar14 = iVar1 == -1;
}
if (bVar14) {
if (iVar8 == -1 || iVar1 == -1) {
uVar9 = uVar6;
uVar11 = bSignificand;
if (iVar8 == -1) {
uVar9 = aExponent;
uVar11 = aSignificand;
}
if (iVar8 != -1 || iVar1 != -1) {
bSignificand = uVar11;
uVar6 = uVar9;
}
bVar14 = (uVar9 & 0xfffff) == 0;
bVar13 = uVar11 == 0 && bVar14;
if (uVar11 == 0 && bVar14) {
bVar13 = bSignificand == 0 && (uVar6 & 0xfffff) == 0;
}
if (bVar13) {
bVar13 = uVar9 == uVar6;
}
if (!bVar13) {
uVar9 = uVar9 | 0x80000;
}
return CONCAT44(uVar9,uVar11);
}
if (((aExponent ^ uVar6) & 0x7fffffff) != 0 || aSignificand != bSignificand) {
if (uVar9 == 0 && aSignificand == 0) {
aSignificand = bSignificand;
aExponent = uVar6;
}
return CONCAT44(aExponent,aSignificand);
}
if (aExponent != uVar6) {
return 0;
}
if (uVar9 >> 0x15 == 0) {
bVar14 = (aSignificand & 0x80000000) != 0;
uVar6 = aExponent * 2 + (uint)bVar14;
if (CARRY4(aExponent,aExponent) || CARRY4(aExponent * 2,(uint)bVar14)) {
uVar6 = uVar6 | 0x80000000;
}
return CONCAT44(uVar6,aSignificand << 1);
}
if (uVar9 < 0xffc00000) {
return CONCAT44(aExponent + 0x100000,aSignificand);
}
aExponent = aExponent & 0x80000000;
LAB_080004ec:
return (ulonglong)(aExponent | 0x7ff00000) << 0x20;
}
uVar9 = uVar9 >> 0x15;
bExponent = bExponent >> 0x15;
uVar11 = bExponent - uVar9;
bVar14 = uVar11 != 0;
if (bExponent < uVar9) {
uVar11 = -uVar11;
}
uVar10 = aSignificand;
uVar7 = aExponent;
if (bVar14 && uVar9 <= bExponent) {
uVar9 = uVar9 + uVar11;
uVar10 = bSignificand;
uVar7 = uVar6;
bSignificand = aSignificand;
uVar6 = aExponent;
}
if (0x36 < uVar11) {
return CONCAT44(uVar7,uVar10);
}
uVar4 = uVar7 & 0xfffff | 0x100000;
if ((uVar7 & 0x80000000) != 0) {
bVar14 = uVar10 != 0;
uVar10 = -uVar10;
uVar4 = -uVar4 - (uint)bVar14;
}
uVar7 = uVar6 & 0xfffff | 0x100000;
if ((uVar6 & 0x80000000) != 0) {
bVar14 = bSignificand != 0;
bSignificand = -bSignificand;
uVar7 = -uVar7 - (uint)bVar14;
}
if (uVar9 == uVar11) {
uVar7 = uVar7 ^ 0x100000;
if (uVar9 == 0) {
uVar4 = uVar4 ^ 0x100000;
uVar9 = 1;
}
else {
uVar11 = uVar11 - 1;
}
}
uVar6 = -uVar11 + 0x20;
if ((int)uVar11 < 0x21) {
uVar12 = bSignificand << (uVar6 & 0xff);
bSignificand = bSignificand >> (uVar11 & 0xff);
uVar3 = uVar10 + bSignificand;
uVar5 = uVar7 << (uVar6 & 0xff);
uVar6 = uVar3 + uVar5;
uVar4 = uVar4 + CARRY4(uVar10,bSignificand) + ((int)uVar7 >> (uVar11 & 0xff)) +
(uint)CARRY4(uVar3,uVar5);
}
else {
uVar12 = uVar7 << (-uVar11 + 0x40 & 0xff);
if (bSignificand != 0) {
uVar12 = uVar12 | 2;
}
uVar7 = (int)uVar7 >> (uVar11 - 0x20 & 0xff);
uVar6 = uVar10 + uVar7;
uVar4 = uVar4 + ((int)uVar7 >> 0x1f) + (uint)CARRY4(uVar10,uVar7);
}
aExponent = uVar4 & 0x80000000;
uVar11 = uVar4;
if ((int)uVar4 < 0) {
bVar14 = uVar12 == 0;
uVar12 = -uVar12;
uVar11 = -uVar6;
uVar6 = -(uint)!bVar14 - uVar6;
uVar11 = -(uint)(bVar14 <= uVar11) - uVar4;
}
if (0xfffff < uVar11) {
uVar10 = uVar9 - 1;
if (0x1fffff < uVar11) {
uVar10 = uVar11 & 1;
uVar11 = uVar11 >> 1;
bVar2 = (byte)uVar6;
uVar6 = (uint)(uVar10 != 0) << 0x1f | uVar6 >> 1;
uVar12 = (uint)(bVar2 & 1) << 0x1f | uVar12 >> 1;
uVar10 = uVar9;
if (0xffbfffff < uVar9 * 0x200000) goto LAB_080004ec;
}
LAB_080003b8:
bVar14 = 0x7fffffff < uVar12;
if (uVar12 == 0x80000000) {
bVar14 = (uVar6 & 1) != 0;
}
return CONCAT44(uVar11 + uVar10 * 0x100000 + (uint)CARRY4(uVar6,(uint)bVar14) | aExponent,
uVar6 + bVar14);
}
bVar13 = (uVar12 & 0x80000000) != 0;
uVar12 = uVar12 << 1;
uVar10 = uVar6 * 2;
bVar14 = CARRY4(uVar6,uVar6);
uVar6 = uVar6 * 2 + (uint)bVar13;
uVar11 = uVar11 * 2 + (uint)(bVar14 || CARRY4(uVar10,(uint)bVar13));
uVar10 = uVar9 - 2;
if (uVar9 - 1 != 0 && 0xfffff < uVar11) goto LAB_080003b8;
uVar7 = uVar6;
uVar9 = uVar11;
if (uVar11 == 0) {
uVar7 = 0;
uVar9 = uVar6;
}
iVar8 = LZCOUNT(uVar9);
if (uVar11 == 0) {
iVar8 = iVar8 + 0x20;
}
uVar11 = iVar8 - 0xb;
bVar15 = SBORROW4(uVar11,0x20);
uVar6 = iVar8 - 0x2b;
bVar14 = (int)uVar6 < 0;
bVar13 = uVar6 == 0;
if ((int)uVar11 < 0x20) {
bVar15 = SCARRY4(uVar6,0xc);
iVar8 = iVar8 + -0x1f;
bVar14 = iVar8 < 0;
bVar13 = iVar8 == 0;
uVar6 = uVar11;
if (!bVar13 && bVar14 == bVar15) {
uVar7 = uVar9 << (uVar11 & 0xff);
uVar9 = uVar9 >> (0xcU - iVar8 & 0xff);
goto LAB_08000430;
}
}
if (bVar13 || bVar14 != bVar15) {
uVar12 = 0x20 - uVar6;
}
uVar9 = uVar9 << (uVar6 & 0xff);
if (bVar13 || bVar14 != bVar15) {
uVar9 = uVar9 | uVar7 >> (uVar12 & 0xff);
uVar7 = uVar7 << (uVar6 & 0xff);
}
LAB_08000430:
if ((int)uVar11 <= (int)uVar10) {
return CONCAT44(uVar9 + (uVar10 - uVar11) * 0x100000 | aExponent,uVar7);
}
uVar6 = ~(uVar10 - uVar11);
if ((int)uVar6 < 0x1f) {
iVar8 = uVar6 - 0x13;
if (iVar8 != 0 && iVar8 < 0 == SCARRY4(uVar6 - 0x1f,0xc)) {
return CONCAT44(uVar4,uVar7 >> (0x20 - (0xcU - iVar8) & 0xff) | uVar9 << (0xcU - iVar8 & 0xff)
) & 0x80000000ffffffff;
}
uVar6 = uVar6 + 1;
return CONCAT44(aExponent | uVar9 >> (uVar6 & 0xff),
uVar7 >> (uVar6 & 0xff) | uVar9 << (0x20 - uVar6 & 0xff));
}
return CONCAT44(uVar4,uVar9 >> (uVar6 - 0x1f & 0xff)) & 0x80000000ffffffff;
}
ulonglong fp_multiply(uint aSignificand,uint aExponent,uint bSignificand,uint bExponent)
{
int iVar1;
byte bVar2;
uint uVar3;
uint uVar4;
uint uVar5;
int iVar6;
uint uVar7;
uint uVar8;
uint uVar9;
uint uVar10;
uint uVar11;
uint uVar12;
bool bVar13;
bool bVar14;
bool bVar15;
uVar7 = aExponent << 1;
uVar9 = bExponent << 1;
bVar13 = ((aExponent ^ bExponent) & 0x7fffffff) == 0;
bVar14 = bVar13 && aSignificand == bSignificand;
if (!bVar13 || aSignificand != bSignificand) {
bVar14 = uVar7 == 0 && aSignificand == 0;
}
if (!bVar14) {
bVar14 = uVar9 == 0 && bSignificand == 0;
}
iVar6 = (int)uVar7 >> 0x15;
if (!bVar14) {
bVar14 = iVar6 == -1;
}
iVar1 = (int)uVar9 >> 0x15;
if (!bVar14) {
bVar14 = iVar1 == -1;
}
if (bVar14) {
if (iVar6 == -1 || iVar1 == -1) {
uVar9 = bExponent;
uVar7 = bSignificand;
if (iVar6 == -1) {
uVar9 = aExponent;
uVar7 = aSignificand;
}
if (iVar6 != -1 || iVar1 != -1) {
bSignificand = uVar7;
bExponent = uVar9;
}
bVar14 = (uVar9 & 0xfffff) == 0;
bVar13 = uVar7 == 0 && bVar14;
if (uVar7 == 0 && bVar14) {
bVar13 = bSignificand == 0 && (bExponent & 0xfffff) == 0;
}
if (bVar13) {
bVar13 = uVar9 == bExponent;
}
if (!bVar13) {
uVar9 = uVar9 | 0x80000;
}
return CONCAT44(uVar9,uVar7);
}
if (((aExponent ^ bExponent) & 0x7fffffff) != 0 || aSignificand != bSignificand) {
if (uVar7 == 0 && aSignificand == 0) {
aSignificand = bSignificand;
aExponent = bExponent;
}
return CONCAT44(aExponent,aSignificand);
}
if (aExponent != bExponent) {
return 0;
}
if (uVar7 >> 0x15 == 0) {
bVar14 = (aSignificand & 0x80000000) != 0;
uVar9 = aExponent * 2 + (uint)bVar14;
if (CARRY4(aExponent,aExponent) || CARRY4(aExponent * 2,(uint)bVar14)) {
uVar9 = uVar9 | 0x80000000;
}
return CONCAT44(uVar9,aSignificand << 1);
}
if (uVar7 < 0xffc00000) {
return CONCAT44(aExponent + 0x100000,aSignificand);
}
aExponent = aExponent & 0x80000000;
LAB_080004ec:
return (ulonglong)(aExponent | 0x7ff00000) << 0x20;
}
uVar7 = uVar7 >> 0x15;
uVar9 = uVar9 >> 0x15;
uVar10 = uVar9 - uVar7;
bVar14 = uVar10 != 0;
if (uVar9 < uVar7) {
uVar10 = -uVar10;
}
uVar8 = aSignificand;
uVar5 = aExponent;
if (bVar14 && uVar7 <= uVar9) {
uVar7 = uVar7 + uVar10;
uVar8 = bSignificand;
uVar5 = bExponent;
bSignificand = aSignificand;
bExponent = aExponent;
}
if (0x36 < uVar10) {
return CONCAT44(uVar5,uVar8);
}
uVar9 = uVar5 & 0xfffff | 0x100000;
if ((uVar5 & 0x80000000) != 0) {
bVar14 = uVar8 != 0;
uVar8 = -uVar8;
uVar9 = -uVar9 - (uint)bVar14;
}
uVar5 = bExponent & 0xfffff | 0x100000;
if ((bExponent & 0x80000000) != 0) {
bVar14 = bSignificand != 0;
bSignificand = -bSignificand;
uVar5 = -uVar5 - (uint)bVar14;
}
if (uVar7 == uVar10) {
uVar5 = uVar5 ^ 0x100000;
if (uVar7 == 0) {
uVar9 = uVar9 ^ 0x100000;
uVar7 = 1;
}
else {
uVar10 = uVar10 - 1;
}
}
uVar12 = -uVar10 + 0x20;
if ((int)uVar10 < 0x21) {
uVar11 = bSignificand << (uVar12 & 0xff);
bSignificand = bSignificand >> (uVar10 & 0xff);
uVar3 = uVar8 + bSignificand;
uVar4 = uVar5 << (uVar12 & 0xff);
uVar12 = uVar3 + uVar4;
uVar9 = uVar9 + CARRY4(uVar8,bSignificand) + ((int)uVar5 >> (uVar10 & 0xff)) +
(uint)CARRY4(uVar3,uVar4);
}
else {
uVar11 = uVar5 << (-uVar10 + 0x40 & 0xff);
if (bSignificand != 0) {
uVar11 = uVar11 | 2;
}
uVar5 = (int)uVar5 >> (uVar10 - 0x20 & 0xff);
uVar12 = uVar8 + uVar5;
uVar9 = uVar9 + ((int)uVar5 >> 0x1f) + (uint)CARRY4(uVar8,uVar5);
}
aExponent = uVar9 & 0x80000000;
uVar10 = uVar9;
if ((int)uVar9 < 0) {
bVar14 = uVar11 == 0;
uVar11 = -uVar11;
uVar10 = -uVar12;
uVar12 = -(uint)!bVar14 - uVar12;
uVar10 = -(uint)(bVar14 <= uVar10) - uVar9;
}
if (0xfffff < uVar10) {
uVar8 = uVar7 - 1;
if (0x1fffff < uVar10) {
uVar9 = uVar10 & 1;
uVar10 = uVar10 >> 1;
bVar2 = (byte)uVar12;
uVar12 = (uint)(uVar9 != 0) << 0x1f | uVar12 >> 1;
uVar11 = (uint)(bVar2 & 1) << 0x1f | uVar11 >> 1;
uVar8 = uVar7;
if (0xffbfffff < uVar7 * 0x200000) goto LAB_080004ec;
}
LAB_080003b8:
bVar14 = 0x7fffffff < uVar11;
if (uVar11 == 0x80000000) {
bVar14 = (uVar12 & 1) != 0;
}
return CONCAT44(uVar10 + uVar8 * 0x100000 + (uint)CARRY4(uVar12,(uint)bVar14) | aExponent,
uVar12 + bVar14);
}
bVar13 = (uVar11 & 0x80000000) != 0;
uVar11 = uVar11 << 1;
uVar8 = uVar12 * 2;
bVar14 = CARRY4(uVar12,uVar12);
uVar12 = uVar12 * 2 + (uint)bVar13;
uVar10 = uVar10 * 2 + (uint)(bVar14 || CARRY4(uVar8,(uint)bVar13));
uVar8 = uVar7 - 2;
if (uVar7 - 1 != 0 && 0xfffff < uVar10) goto LAB_080003b8;
uVar5 = uVar12;
uVar7 = uVar10;
if (uVar10 == 0) {
uVar5 = 0;
uVar7 = uVar12;
}
iVar6 = LZCOUNT(uVar7);
if (uVar10 == 0) {
iVar6 = iVar6 + 0x20;
}
uVar12 = iVar6 - 0xb;
bVar15 = SBORROW4(uVar12,0x20);
uVar10 = iVar6 - 0x2b;
bVar14 = (int)uVar10 < 0;
bVar13 = uVar10 == 0;
if ((int)uVar12 < 0x20) {
bVar15 = SCARRY4(uVar10,0xc);
iVar6 = iVar6 + -0x1f;
bVar14 = iVar6 < 0;
bVar13 = iVar6 == 0;
uVar10 = uVar12;
if (!bVar13 && bVar14 == bVar15) {
uVar5 = uVar7 << (uVar12 & 0xff);
uVar7 = uVar7 >> (0xcU - iVar6 & 0xff);
goto LAB_08000430;
}
}
if (bVar13 || bVar14 != bVar15) {
uVar11 = 0x20 - uVar10;
}
uVar7 = uVar7 << (uVar10 & 0xff);
if (bVar13 || bVar14 != bVar15) {
uVar7 = uVar7 | uVar5 >> (uVar11 & 0xff);
uVar5 = uVar5 << (uVar10 & 0xff);
}
LAB_08000430:
if ((int)uVar12 <= (int)uVar8) {
return CONCAT44(uVar7 + (uVar8 - uVar12) * 0x100000 | aExponent,uVar5);
}
uVar10 = ~(uVar8 - uVar12);
if ((int)uVar10 < 0x1f) {
iVar6 = uVar10 - 0x13;
if (iVar6 != 0 && iVar6 < 0 == SCARRY4(uVar10 - 0x1f,0xc)) {
return CONCAT44(uVar9,uVar5 >> (0x20 - (0xcU - iVar6) & 0xff) | uVar7 << (0xcU - iVar6 & 0xff)
) & 0x80000000ffffffff;
}
uVar10 = uVar10 + 1;
return CONCAT44(aExponent | uVar7 >> (uVar10 & 0xff),
uVar5 >> (uVar10 & 0xff) | uVar7 << (0x20 - uVar10 & 0xff));
}
return CONCAT44(uVar9,uVar7 >> (uVar10 - 0x1f & 0xff)) & 0x80000000ffffffff;
}
ulonglong FUN_08000524(uint param_1)
{
uint uVar1;
uint uVar2;
int iVar3;
uint uVar4;
uint in_r12;
bool bVar5;
bool bVar6;
bool bVar7;
if (param_1 == 0) {
return 0;
}
uVar1 = 0;
iVar3 = LZCOUNT(param_1);
uVar4 = iVar3 + 0x15;
bVar7 = SBORROW4(uVar4,0x20);
uVar2 = iVar3 - 0xb;
bVar5 = (int)uVar2 < 0;
bVar6 = uVar2 == 0;
if (uVar4 < 0x20) {
bVar7 = SCARRY4(uVar2,0xc);
bVar5 = false;
bVar6 = iVar3 + 1 == 0;
uVar2 = uVar4;
if (!bVar6 && !bVar7) {
uVar1 = param_1 << uVar4;
param_1 = param_1 >> (0xcU - (iVar3 + 1) & 0xff);
goto LAB_08000430;
}
}
if (bVar6 || bVar5 != bVar7) {
in_r12 = 0x20 - uVar2;
}
param_1 = param_1 << (uVar2 & 0xff);
if (bVar6 || bVar5 != bVar7) {
param_1 = param_1 | 0U >> (in_r12 & 0xff);
uVar1 = 0 << (uVar2 & 0xff);
}
LAB_08000430:
if (uVar4 < 0x433) {
return CONCAT44(param_1 + (0x432 - uVar4) * 0x100000,uVar1);
}
uVar2 = ~(0x432 - uVar4);
if (0x1e < (int)uVar2) {
return (ulonglong)(param_1 >> (uVar2 - 0x1f & 0xff));
}
iVar3 = uVar2 - 0x13;
if (iVar3 == 0 || iVar3 < 0 != SCARRY4(uVar2 - 0x1f,0xc)) {
uVar2 = uVar2 + 1;
return CONCAT44(param_1 >> (uVar2 & 0xff),
uVar1 >> (uVar2 & 0xff) | param_1 << (0x20 - uVar2 & 0xff));
}
return (ulonglong)(uVar1 >> (0x20 - (0xcU - iVar3) & 0xff) | param_1 << (0xcU - iVar3 & 0xff));
}
ulonglong FUN_08000544(uint param_1)
{
uint uVar1;
uint uVar2;
uint uVar3;
int iVar4;
uint uVar5;
uint uVar6;
uint in_r12;
bool bVar7;
bool bVar8;
bool bVar9;
if (param_1 == 0) {
return 0;
}
uVar6 = param_1 & 0x80000000;
uVar2 = param_1;
if ((int)uVar6 < 0) {
uVar2 = -param_1;
}
uVar1 = 0;
iVar4 = LZCOUNT(uVar2);
uVar5 = iVar4 + 0x15;
bVar9 = SBORROW4(uVar5,0x20);
uVar3 = iVar4 - 0xb;
bVar7 = (int)uVar3 < 0;
bVar8 = uVar3 == 0;
if (uVar5 < 0x20) {
bVar9 = SCARRY4(uVar3,0xc);
bVar7 = false;
bVar8 = iVar4 + 1 == 0;
uVar3 = uVar5;
if (!bVar8 && !bVar9) {
uVar1 = uVar2 << uVar5;
uVar2 = uVar2 >> (0xcU - (iVar4 + 1) & 0xff);
goto LAB_08000430;
}
}
if (bVar8 || bVar7 != bVar9) {
in_r12 = 0x20 - uVar3;
}
uVar2 = uVar2 << (uVar3 & 0xff);
if (bVar8 || bVar7 != bVar9) {
uVar2 = uVar2 | 0U >> (in_r12 & 0xff);
uVar1 = 0 << (uVar3 & 0xff);
}
LAB_08000430:
if (uVar5 < 0x433) {
return CONCAT44(uVar2 + (0x432 - uVar5) * 0x100000 | uVar6,uVar1);
}
uVar3 = ~(0x432 - uVar5);
if (0x1e < (int)uVar3) {
return CONCAT44(param_1,uVar2 >> (uVar3 - 0x1f & 0xff)) & 0x80000000ffffffff;
}
iVar4 = uVar3 - 0x13;
if (iVar4 == 0 || iVar4 < 0 != SCARRY4(uVar3 - 0x1f,0xc)) {
uVar3 = uVar3 + 1;
return CONCAT44(uVar6 | uVar2 >> (uVar3 & 0xff),
uVar1 >> (uVar3 & 0xff) | uVar2 << (0x20 - uVar3 & 0xff));
}
return CONCAT44(param_1,uVar1 >> (0x20 - (0xcU - iVar4) & 0xff) | uVar2 << (0xcU - iVar4 & 0xff))
& 0x80000000ffffffff;
}
ulonglong FUN_08000568(uint param_1,undefined4 param_2,undefined4 param_3,uint param_4)
{
uint uVar1;
uint uVar2;
uint uVar3;
uint uVar4;
uint uVar5;
int iVar6;
uint uVar7;
uint in_r12;
bool bVar8;
bool bVar9;
bool bVar10;
uVar5 = param_1 << 1;
bVar9 = uVar5 == 0;
uVar1 = (uint)((param_1 & 0x80000000) != 0) << 0x1f;
uVar4 = (uint)((int)uVar5 >> 3) >> 1;
uVar3 = uVar1 | uVar4;
param_1 = param_1 << 0x1d;
if (!bVar9) {
param_4 = uVar5 & 0xff000000;
bVar9 = param_4 == 0;
}
if (!bVar9) {
bVar9 = param_4 == 0xff000000;
}
if (!bVar9) {
return CONCAT44(uVar3,param_1) ^ 0x3800000000000000;
}
if ((uVar5 & 0xffffff) == 0) {
return CONCAT44(uVar3,param_1);
}
if (param_4 == 0xff000000) {
return CONCAT44(uVar3,param_1) | 0x8000000000000;
}
uVar2 = param_1;
uVar5 = uVar4;
if (uVar4 == 0) {
uVar2 = 0;
uVar5 = param_1;
}
iVar6 = LZCOUNT(uVar5);
if (uVar4 == 0) {
iVar6 = iVar6 + 0x20;
}
uVar7 = iVar6 - 0xb;
bVar10 = SBORROW4(uVar7,0x20);
uVar4 = iVar6 - 0x2b;
bVar9 = (int)uVar4 < 0;
bVar8 = uVar4 == 0;
if ((int)uVar7 < 0x20) {
bVar10 = SCARRY4(uVar4,0xc);
iVar6 = iVar6 + -0x1f;
bVar9 = iVar6 < 0;
bVar8 = iVar6 == 0;
uVar4 = uVar7;
if (!bVar8 && bVar9 == bVar10) {
uVar2 = uVar5 << (uVar7 & 0xff);
uVar5 = uVar5 >> (0xcU - iVar6 & 0xff);
goto LAB_08000430;
}
}
if (bVar8 || bVar9 != bVar10) {
in_r12 = 0x20 - uVar4;
}
uVar5 = uVar5 << (uVar4 & 0xff);
if (bVar8 || bVar9 != bVar10) {
uVar5 = uVar5 | uVar2 >> (in_r12 & 0xff);
uVar2 = uVar2 << (uVar4 & 0xff);
}
LAB_08000430:
if ((int)uVar7 < 0x381) {
return CONCAT44(uVar5 + (0x380 - uVar7) * 0x100000 | uVar1,uVar2);
}
uVar4 = ~(0x380 - uVar7);
if (0x1e < (int)uVar4) {
return CONCAT44(uVar3,uVar5 >> (uVar4 - 0x1f & 0xff)) & 0x80000000ffffffff;
}
iVar6 = uVar4 - 0x13;
if (iVar6 == 0 || iVar6 < 0 != SCARRY4(uVar4 - 0x1f,0xc)) {
uVar4 = uVar4 + 1;
return CONCAT44(uVar1 | uVar5 >> (uVar4 & 0xff),
uVar2 >> (uVar4 & 0xff) | uVar5 << (0x20 - uVar4 & 0xff));
}
return CONCAT44(uVar3,uVar2 >> (0x20 - (0xcU - iVar6) & 0xff) | uVar5 << (0xcU - iVar6 & 0xff)) &
0x80000000ffffffff;
}
ulonglong FUN_080005bc(uint param_1,uint param_2)
{
byte bVar1;
uint uVar2;
uint uVar3;
uint uVar4;
int iVar5;
uint uVar6;
int iVar7;
uint uVar8;
uint uVar9;
bool bVar10;
bool bVar11;
bool bVar12;
if (param_1 == 0 && param_2 == 0) {
return CONCAT44(param_2,param_1);
}
uVar8 = param_2 & 0x80000000;
uVar3 = param_2;
if ((int)uVar8 < 0) {
bVar11 = param_1 != 0;
param_1 = -param_1;
uVar3 = -param_2 - (uint)bVar11;
}
iVar7 = 0x432;
uVar9 = uVar3 >> 0x16;
if (uVar9 != 0) {
iVar7 = 3;
if (uVar3 >> 0x19 != 0) {
iVar7 = 6;
}
if (uVar3 >> 0x1c != 0) {
iVar7 = iVar7 + 3;
}
uVar4 = iVar7 - ((int)uVar3 >> 0x1f);
uVar9 = param_1 << (0x20 - uVar4 & 0xff);
param_1 = param_1 >> (uVar4 & 0xff) | uVar3 << (0x20 - uVar4 & 0xff);
uVar3 = uVar3 >> (uVar4 & 0xff);
iVar7 = uVar4 + 0x432;
}
if (0xfffff < uVar3) {
if (0x1fffff < uVar3) {
uVar4 = uVar3 & 1;
uVar3 = uVar3 >> 1;
bVar1 = (byte)param_1;
param_1 = (uint)(uVar4 != 0) << 0x1f | param_1 >> 1;
uVar9 = (uint)(bVar1 & 1) << 0x1f | uVar9 >> 1;
iVar7 = iVar7 + 1;
if (0xffbfffff < (uint)(iVar7 * 0x200000)) {
return (ulonglong)(uVar8 | 0x7ff00000) << 0x20;
}
}
LAB_080003b8:
bVar11 = 0x7fffffff < uVar9;
if (uVar9 == 0x80000000) {
bVar11 = (param_1 & 1) != 0;
}
return CONCAT44(uVar3 + iVar7 * 0x100000 + (uint)CARRY4(param_1,(uint)bVar11) | uVar8,
param_1 + bVar11);
}
bVar10 = (uVar9 & 0x80000000) != 0;
uVar9 = uVar9 << 1;
uVar4 = param_1 * 2;
bVar11 = CARRY4(param_1,param_1);
param_1 = param_1 * 2 + (uint)bVar10;
uVar3 = uVar3 * 2 + (uint)(bVar11 || CARRY4(uVar4,(uint)bVar10));
bVar11 = iVar7 != 0;
iVar7 = iVar7 + -1;
if (bVar11 && 0xfffff < uVar3) goto LAB_080003b8;
uVar2 = param_1;
uVar4 = uVar3;
if (uVar3 == 0) {
uVar2 = 0;
uVar4 = param_1;
}
iVar5 = LZCOUNT(uVar4);
if (uVar3 == 0) {
iVar5 = iVar5 + 0x20;
}
uVar6 = iVar5 - 0xb;
bVar12 = SBORROW4(uVar6,0x20);
uVar3 = iVar5 - 0x2b;
bVar11 = (int)uVar3 < 0;
bVar10 = uVar3 == 0;
if ((int)uVar6 < 0x20) {
bVar12 = SCARRY4(uVar3,0xc);
iVar5 = iVar5 + -0x1f;
bVar11 = iVar5 < 0;
bVar10 = iVar5 == 0;
uVar3 = uVar6;
if (!bVar10 && bVar11 == bVar12) {
uVar2 = uVar4 << (uVar6 & 0xff);
uVar4 = uVar4 >> (0xcU - iVar5 & 0xff);
goto LAB_08000430;
}
}
if (bVar10 || bVar11 != bVar12) {
uVar9 = 0x20 - uVar3;
}
uVar4 = uVar4 << (uVar3 & 0xff);
if (bVar10 || bVar11 != bVar12) {
uVar4 = uVar4 | uVar2 >> (uVar9 & 0xff);
uVar2 = uVar2 << (uVar3 & 0xff);
}
LAB_08000430:
if ((int)uVar6 <= iVar7) {
return CONCAT44(uVar4 + (iVar7 - uVar6) * 0x100000 | uVar8,uVar2);
}
uVar3 = ~(iVar7 - uVar6);
if ((int)uVar3 < 0x1f) {
iVar7 = uVar3 - 0x13;
if (iVar7 != 0 && iVar7 < 0 == SCARRY4(uVar3 - 0x1f,0xc)) {
return CONCAT44(param_2,uVar2 >> (0x20 - (0xcU - iVar7) & 0xff) |
uVar4 << (0xcU - iVar7 & 0xff)) & 0x80000000ffffffff;
}
uVar3 = uVar3 + 1;
return CONCAT44(uVar8 | uVar4 >> (uVar3 & 0xff),
uVar2 >> (uVar3 & 0xff) | uVar4 << (0x20 - uVar3 & 0xff));
}
return CONCAT44(param_2,uVar4 >> (uVar3 - 0x1f & 0xff)) & 0x80000000ffffffff;
}
ulonglong FUN_08000618(undefined4 param_1,uint param_2,uint param_3,uint param_4)
{
ulonglong uVar1;
longlong lVar2;
uint uVar3;
uint uVar4;
int iVar5;
uint uVar6;
uint unaff_r5;
uint uVar7;
uint uVar8;
uint uVar9;
bool bVar10;
bool bVar11;
bool bVar12;
ulonglong uVar13;
uVar13 = CONCAT44(param_2,param_1);
uVar8 = 0x7ff;
uVar4 = param_2 >> 0x14 & 0x7ff;
bVar10 = uVar4 == 0;
if (!bVar10) {
unaff_r5 = param_4 >> 0x14 & 0x7ff;
bVar10 = unaff_r5 == 0;
}
if (!bVar10) {
bVar10 = uVar4 == 0x7ff;
}
if (!bVar10) {
bVar10 = unaff_r5 == 0x7ff;
}
if (bVar10) {
uVar13 = FUN_080007f4();
}
uVar3 = (uint)(uVar13 >> 0x20);
uVar7 = (uint)uVar13;
iVar5 = uVar4 + unaff_r5;
uVar4 = uVar3 ^ param_4;
uVar3 = uVar3 & ~(uVar8 << 0x15);
param_4 = param_4 & ~(uVar8 << 0x15);
bVar10 = (uVar3 & 0xfffff) == 0;
bVar11 = uVar7 == 0 && bVar10;
if (uVar7 != 0 || !bVar10) {
bVar11 = param_3 == 0 && (param_4 & 0xfffff) == 0;
}
uVar3 = uVar3 | 0x100000;
param_4 = param_4 | 0x100000;
if (bVar11) {
uVar7 = uVar7 | param_3;
param_4 = (uVar4 & 0x80000000 | uVar3) ^ param_4;
uVar4 = uVar8 >> 1;
bVar11 = SBORROW4(iVar5,uVar4);
uVar6 = iVar5 - uVar4;
bVar10 = uVar6 == 0;
uVar3 = uVar6;
if (!bVar10 && (int)uVar4 <= iVar5) {
bVar11 = SBORROW4(uVar8,uVar6);
uVar3 = uVar8 - uVar6;
bVar10 = uVar8 == uVar6;
}
if (!bVar10 && (int)uVar3 < 0 == bVar11) {
return CONCAT44(param_4 | uVar6 * 0x100000,uVar7);
}
param_4 = param_4 | 0x100000;
uVar8 = 0;
bVar11 = SBORROW4(uVar6,1);
uVar6 = uVar6 - 1;
bVar10 = uVar6 == 0;
uVar4 = uVar6;
}
else {
uVar1 = (uVar13 & 0xffffffff) * (ulonglong)param_3;
uVar13 = (uVar13 & 0xffffffff) * (ulonglong)param_4 +
(ulonglong)uVar3 * (ulonglong)param_3 + (uVar1 >> 0x20);
uVar9 = (uint)uVar13;
lVar2 = (ulonglong)uVar3 * (ulonglong)param_4 + (uVar13 >> 0x20);
uVar8 = (uint)lVar2;
uVar7 = (uint)((ulonglong)lVar2 >> 0x20);
if ((int)uVar1 != 0) {
uVar9 = uVar9 | 1;
}
uVar6 = (iVar5 + -0x3ff) - (uint)(uVar7 < 0x200);
if (uVar7 < 0x200) {
bVar10 = (uVar9 & 0x80000000) != 0;
uVar9 = uVar9 << 1;
lVar2 = CONCAT44(uVar7 * 2 + (uint)(CARRY4(uVar8,uVar8) || CARRY4(uVar8 * 2,(uint)bVar10)),
uVar8 * 2 + (uint)bVar10);
}
param_4 = uVar4 & 0x80000000 | (int)((ulonglong)lVar2 >> 0x20) << 0xb | (uint)lVar2 >> 0x15;
uVar7 = (uint)lVar2 << 0xb | uVar9 >> 0x15;
uVar8 = uVar9 * 0x800;
bVar12 = 0xfc < uVar6;
bVar11 = SBORROW4(uVar6,0xfd);
uVar3 = uVar6 - 0xfd;
bVar10 = uVar3 == 0;
uVar4 = uVar3;
if (bVar12 && !bVar10) {
bVar12 = 0x6ff < uVar3;
bVar11 = SBORROW4(uVar3,0x700);
uVar4 = uVar6 - 0x7fd;
bVar10 = uVar3 == 0x700;
}
if (!bVar12 || bVar10) {
bVar10 = 0x7fffffff < uVar8;
if (uVar8 == 0x80000000) {
bVar10 = (uVar9 >> 0x15 & 1) != 0;
}
return CONCAT44(param_4 + uVar6 * 0x100000 + (uint)CARRY4(uVar7,(uint)bVar10),uVar7 + bVar10);
}
}
if (!bVar10 && (int)uVar4 < 0 == bVar11) {
return (ulonglong)(param_4 & 0x80000000 | 0x7ff00000) << 0x20;
}
if (uVar6 != 0xffffffca && (int)(uVar6 + 0x36) < 0 == SCARRY4(uVar6,0x36)) {
uVar4 = -uVar6;
uVar3 = uVar4 - 0x20;
if (0x1f < (int)uVar4) {
uVar6 = uVar7 >> (uVar3 & 0xff) | param_4 << (0x20 - uVar3 & 0xff);
uVar4 = (param_4 >> (uVar3 & 0xff) & ~((param_4 & 0x80000000) >> (uVar3 & 0xff))) -
((int)uVar6 >> 0x1f);
if ((uVar8 == 0 && uVar7 << (0x20 - uVar3 & 0xff) == 0) && (uVar6 & 0x7fffffff) == 0) {
uVar4 = uVar4 & ~(uVar6 >> 0x1f);
}
return CONCAT44(param_4,uVar4) & 0x80000000ffffffff;
}
iVar5 = uVar4 - 0x14;
if (iVar5 != 0 && iVar5 < 0 == SCARRY4(uVar3,0xc)) {
uVar4 = 0xc - iVar5;
uVar3 = uVar7 << (uVar4 & 0xff);
uVar4 = uVar7 >> (0x20 - uVar4 & 0xff) | param_4 << (uVar4 & 0xff);
uVar7 = uVar4 + -((int)uVar3 >> 0x1f);
if (uVar8 == 0 && (uVar3 & 0x7fffffff) == 0) {
uVar7 = uVar7 & ~(uVar3 >> 0x1f);
}
return CONCAT44((param_4 & 0x80000000) + (uint)CARRY4(uVar4,-((int)uVar3 >> 0x1f)),uVar7);
}
uVar9 = uVar7 << (uVar6 + 0x20 & 0xff);
uVar7 = uVar7 >> (uVar4 & 0xff) | param_4 << (uVar6 + 0x20 & 0xff);
uVar3 = uVar7 + -((int)uVar9 >> 0x1f);
if (uVar8 == 0 && (uVar9 & 0x7fffffff) == 0) {
uVar3 = uVar3 & ~(uVar9 >> 0x1f);
}
return CONCAT44((param_4 & 0x80000000) +
((param_4 & 0x7fffffff) >> (uVar4 & 0xff)) +
(uint)CARRY4(uVar7,-((int)uVar9 >> 0x1f)),uVar3);
}
return (ulonglong)(param_4 & 0x80000000) << 0x20;
}
ulonglong FUN_080007f4(uint param_1,uint param_2,uint param_3,uint param_4)
{
bool bVar1;
uint uVar2;
uint unaff_r4;
uint uVar3;
uint uVar4;
uint in_r12;
bool bVar5;
bool bVar6;
uVar3 = in_r12 & param_4 >> 0x14;
if (unaff_r4 != in_r12 && uVar3 != in_r12) {
bVar1 = (param_2 & 0x7fffffff) == 0;
bVar5 = param_1 == 0 && bVar1;
if (param_1 != 0 || !bVar1) {
bVar5 = param_3 == 0 && (param_4 & 0x7fffffff) == 0;
}
if (bVar5) {
return (ulonglong)((param_2 ^ param_4) & 0x80000000) << 0x20;
}
if (unaff_r4 == 0) {
uVar4 = param_2 & 0x80000000;
do {
uVar2 = param_1 & 0x80000000;
param_1 = param_1 << 1;
param_2 = param_2 * 2 + (uint)(uVar2 != 0);
} while ((param_2 & 0x100000) == 0);
param_2 = param_2 | uVar4;
if (uVar3 != 0) {
return CONCAT44(param_2,param_1);
}
}
do {
uVar3 = param_3 & 0x80000000;
param_3 = param_3 << 1;
param_4 = param_4 * 2 + (uint)(uVar3 != 0);
} while ((param_4 & 0x100000) == 0);
return CONCAT44(param_2,param_1);
}
bVar1 = param_1 == 0;
bVar5 = (param_2 & 0x7fffffff) == 0;
bVar6 = bVar1 && bVar5;
if (bVar1 && bVar5) {
param_2 = param_4;
param_1 = param_3;
}
if (!bVar1 || !bVar5) {
bVar6 = param_3 == 0 && (param_4 & 0x7fffffff) == 0;
}
uVar4 = param_2;
if (((!bVar6) && ((unaff_r4 != in_r12 || (param_1 == 0 && (param_2 & 0xfffff) == 0)))) &&
((uVar3 != in_r12 ||
(param_1 = param_3, uVar4 = param_4, param_3 == 0 && (param_4 & 0xfffff) == 0)))) {
return (ulonglong)((param_2 ^ param_4) & 0x80000000 | 0x7ff00000) << 0x20;
}
return CONCAT44(uVar4,param_1) | 0x7ff8000000000000;
}
ulonglong FUN_0800086c(undefined4 param_1,uint param_2,uint param_3,uint param_4)
{
uint uVar1;
uint uVar2;
uint uVar3;
uint uVar4;
uint uVar5;
uint uVar6;
int iVar7;
uint uVar8;
uint unaff_r5;
uint uVar9;
uint uVar10;
uint uVar11;
uint uVar12;
bool bVar13;
bool bVar14;
bool bVar15;
undefined8 uVar16;
uVar16 = CONCAT44(param_2,param_1);
uVar12 = 0x7ff;
uVar6 = param_2 >> 0x14 & 0x7ff;
bVar13 = uVar6 == 0;
if (!bVar13) {
unaff_r5 = param_4 >> 0x14 & 0x7ff;
bVar13 = unaff_r5 == 0;
}
if (!bVar13) {
bVar13 = uVar6 == 0x7ff;
}
if (!bVar13) {
bVar13 = unaff_r5 == 0x7ff;
}
if (bVar13) {
uVar16 = FUN_080009da();
}
uVar8 = (uint)((ulonglong)uVar16 >> 0x20);
uVar10 = (uint)uVar16;
iVar7 = uVar6 - unaff_r5;
if (param_3 == 0 && (param_4 & 0xfffff) == 0) {
uVar6 = (uVar8 ^ param_4) & 0x80000000 | uVar8 & 0xfffff;
bVar15 = SCARRY4(iVar7,uVar12 >> 1);
uVar8 = iVar7 + (uVar12 >> 1);
bVar13 = (int)uVar8 < 0;
bVar14 = uVar8 == 0;
if (!bVar14 && bVar13 == bVar15) {
bVar15 = SBORROW4(uVar12,uVar8);
bVar13 = (int)(uVar12 - uVar8) < 0;
bVar14 = uVar12 == uVar8;
}
if (!bVar14 && bVar13 == bVar15) {
return CONCAT44(uVar6 | uVar8 * 0x100000,uVar10);
}
uVar6 = uVar6 | 0x100000;
uVar12 = 0;
bVar14 = SBORROW4(uVar8,1);
uVar8 = uVar8 - 1;
bVar13 = uVar8 == 0;
uVar3 = uVar8;
}
else {
uVar3 = (param_4 << 0xc) >> 4 | 0x10000000 | param_3 >> 0x18;
uVar12 = param_3 << 8;
uVar9 = (uVar8 << 0xc) >> 4 | 0x10000000 | uVar10 >> 0x18;
uVar10 = uVar10 * 0x100;
uVar6 = (uVar8 ^ param_4) & 0x80000000;
bVar13 = uVar3 <= uVar9;
if (uVar9 == uVar3) {
bVar13 = uVar12 <= uVar10;
}
iVar7 = iVar7 + (uint)bVar13;
uVar8 = iVar7 + 0x3fd;
if (bVar13 == false) {
uVar3 = uVar3 >> 1;
uVar12 = (uint)((param_3 >> 0x18 & 1) != 0) << 0x1f | uVar12 >> 1;
}
uVar11 = uVar10 - uVar12;
uVar9 = (uVar9 - uVar3) - (uint)(uVar10 < uVar12);
uVar4 = uVar3 >> 1;
uVar1 = (uint)((uVar3 & 1) != 0) << 0x1f | uVar12 >> 1;
uVar10 = 0x100000;
uVar3 = 0x80000;
while( true ) {
bVar13 = uVar1 <= uVar11;
if (uVar4 < uVar9 || uVar9 - uVar4 < (uint)bVar13) {
uVar11 = uVar11 - uVar1;
uVar10 = uVar10 | uVar3;
uVar9 = (uVar9 - uVar4) - (uint)!bVar13;
}
uVar5 = uVar4 >> 1;
uVar1 = (uint)((uVar4 & 1) != 0) << 0x1f | uVar1 >> 1;
bVar14 = uVar1 <= uVar11;
bVar13 = uVar9 - uVar5 < (uint)bVar14;
uVar12 = uVar9;
if (uVar5 < uVar9 || bVar13) {
uVar11 = uVar11 - uVar1;
uVar12 = (uVar9 - uVar5) - (uint)!bVar14;
}
if (uVar5 < uVar9 || bVar13) {
uVar10 = uVar10 | uVar3 >> 1;
}
uVar9 = uVar4 >> 2;
uVar2 = (uint)((uVar5 & 1) != 0) << 0x1f | uVar1 >> 1;
bVar14 = uVar2 <= uVar11;
bVar13 = uVar12 - uVar9 < (uint)bVar14;
uVar5 = uVar12;
if (uVar9 < uVar12 || bVar13) {
uVar11 = uVar11 - uVar2;
uVar5 = (uVar12 - uVar9) - (uint)!bVar14;
}
if (uVar9 < uVar12 || bVar13) {
uVar10 = uVar10 | uVar3 >> 2;
}
uVar4 = uVar4 >> 3;
uVar1 = (uint)((uVar9 & 1) != 0) << 0x1f | uVar2 >> 1;
bVar14 = uVar1 <= uVar11;
bVar13 = uVar5 - uVar4 < (uint)bVar14;
uVar9 = uVar5;
if (uVar4 < uVar5 || bVar13) {
uVar11 = uVar11 - uVar1;
uVar9 = (uVar5 - uVar4) - (uint)!bVar14;
}
if (uVar4 < uVar5 || bVar13) {
uVar10 = uVar10 | uVar3 >> 3;
}
uVar12 = uVar9 | uVar11;
if (uVar12 == 0) break;
uVar9 = uVar9 << 4 | uVar11 >> 0x1c;
uVar11 = uVar11 << 4;
uVar4 = uVar4 << 3 | uVar1 >> 0x1d;
uVar1 = (uVar2 >> 1) << 3;
uVar3 = uVar3 >> 4;
if (uVar3 == 0) {
if ((uVar6 & 0x100000) != 0) goto LAB_0800098a;
uVar6 = uVar6 | uVar10;
uVar10 = 0;
uVar3 = 0x80000000;
}
}
if ((uVar6 & 0x100000) == 0) {
uVar6 = uVar6 | uVar10;
uVar10 = 0;
}
LAB_0800098a:
bVar15 = 0xfc < uVar8;
bVar14 = SBORROW4(uVar8,0xfd);
uVar5 = iVar7 + 0x300;
bVar13 = uVar5 == 0;
uVar3 = uVar5;
if (bVar15 && !bVar13) {
bVar15 = 0x6ff < uVar5;
bVar14 = SBORROW4(uVar5,0x700);
uVar3 = iVar7 - 0x400;
bVar13 = uVar5 == 0x700;
}
if (!bVar15 || bVar13) {
bVar13 = uVar4 <= uVar9;
if (uVar9 == uVar4) {
bVar13 = uVar1 <= uVar11;
}
if (uVar9 == uVar4 && uVar11 == uVar1) {
bVar13 = (uVar10 & 1) != 0;
}
return CONCAT44(uVar6 + uVar8 * 0x100000 + (uint)CARRY4(uVar10,(uint)bVar13),uVar10 + bVar13);
}
}
if (!bVar13 && (int)uVar3 < 0 == bVar14) {
return (ulonglong)(uVar6 & 0x80000000 | 0x7ff00000) << 0x20;
}
if (uVar8 == 0xffffffca || (int)(uVar8 + 0x36) < 0 != SCARRY4(uVar8,0x36)) {
return (ulonglong)(uVar6 & 0x80000000) << 0x20;
}
uVar3 = -uVar8;
uVar9 = uVar3 - 0x20;
if (0x1f < (int)uVar3) {
uVar3 = uVar10 >> (uVar9 & 0xff) | uVar6 << (0x20 - uVar9 & 0xff);
uVar8 = (uVar6 >> (uVar9 & 0xff) & ~((uVar6 & 0x80000000) >> (uVar9 & 0xff))) -
((int)uVar3 >> 0x1f);
if ((uVar12 == 0 && uVar10 << (0x20 - uVar9 & 0xff) == 0) && (uVar3 & 0x7fffffff) == 0) {
uVar8 = uVar8 & ~(uVar3 >> 0x1f);
}
return CONCAT44(uVar6,uVar8) & 0x80000000ffffffff;
}
iVar7 = uVar3 - 0x14;
if (iVar7 != 0 && iVar7 < 0 == SCARRY4(uVar9,0xc)) {
uVar8 = 0xc - iVar7;
uVar3 = uVar10 << (uVar8 & 0xff);
uVar10 = uVar10 >> (0x20 - uVar8 & 0xff) | uVar6 << (uVar8 & 0xff);
uVar8 = uVar10 + -((int)uVar3 >> 0x1f);
if (uVar12 == 0 && (uVar3 & 0x7fffffff) == 0) {
uVar8 = uVar8 & ~(uVar3 >> 0x1f);
}
return CONCAT44((uVar6 & 0x80000000) + (uint)CARRY4(uVar10,-((int)uVar3 >> 0x1f)),uVar8);
}
uVar9 = uVar10 << (uVar8 + 0x20 & 0xff);
uVar10 = uVar10 >> (uVar3 & 0xff) | uVar6 << (uVar8 + 0x20 & 0xff);
uVar8 = uVar10 + -((int)uVar9 >> 0x1f);
if (uVar12 == 0 && (uVar9 & 0x7fffffff) == 0) {
uVar8 = uVar8 & ~(uVar9 >> 0x1f);
}
return CONCAT44((uVar6 & 0x80000000) +
((uVar6 & 0x7fffffff) >> (uVar3 & 0xff)) +
(uint)CARRY4(uVar10,-((int)uVar9 >> 0x1f)),uVar8);
}
ulonglong FUN_080009da(uint param_1,uint param_2,uint param_3,uint param_4)
{
bool bVar1;
uint uVar2;
uint unaff_r4;
uint uVar3;
uint uVar4;
uint in_r12;
bool bVar5;
uVar3 = in_r12 & param_4 >> 0x14;
uVar4 = param_2;
if (unaff_r4 != in_r12 || uVar3 != in_r12) {
if (unaff_r4 == in_r12) {
if ((param_1 == 0 && (param_2 & 0xfffff) == 0) &&
(param_1 = param_3, uVar4 = param_4, uVar3 != in_r12)) {
LAB_0800084c:
return (ulonglong)((param_2 ^ param_4) & 0x80000000 | 0x7ff00000) << 0x20;
}
}
else if (uVar3 == in_r12) {
param_1 = param_3;
uVar4 = param_4;
if (param_3 == 0 && (param_4 & 0xfffff) == 0) {
LAB_08000810:
return (ulonglong)((param_2 ^ param_4) & 0x80000000) << 0x20;
}
}
else {
bVar1 = (param_2 & 0x7fffffff) == 0;
bVar5 = param_1 == 0 && bVar1;
if (param_1 != 0 || !bVar1) {
bVar5 = param_3 == 0 && (param_4 & 0x7fffffff) == 0;
}
if (!bVar5) {
if (unaff_r4 == 0) {
uVar4 = param_2 & 0x80000000;
do {
uVar2 = param_1 & 0x80000000;
param_1 = param_1 << 1;
param_2 = param_2 * 2 + (uint)(uVar2 != 0);
} while ((param_2 & 0x100000) == 0);
param_2 = param_2 | uVar4;
if (uVar3 != 0) {
return CONCAT44(param_2,param_1);
}
}
do {
uVar4 = param_3 & 0x80000000;
param_3 = param_3 << 1;
param_4 = param_4 * 2 + (uint)(uVar4 != 0);
} while ((param_4 & 0x100000) == 0);
return CONCAT44(param_2,param_1);
}
if (param_1 != 0 || (param_2 & 0x7fffffff) != 0) goto LAB_0800084c;
if (param_3 != 0 || (param_4 & 0x7fffffff) != 0) goto LAB_08000810;
}
}
return CONCAT44(uVar4,param_1) | 0x7ff8000000000000;
}
uint FUN_08000a4c(uint param_1,uint param_2,uint param_3,uint param_4)
{
uint uVar1;
bool bVar2;
bool bVar3;
if (((int)(param_2 << 1) >> 0x15 == -1 || (int)(param_4 << 1) >> 0x15 == -1) &&
((((int)(param_2 << 1) >> 0x15 == -1 && (param_1 != 0 || (param_2 & 0xfffff) != 0)) ||
(((int)(param_4 << 1) >> 0x15 == -1 && (param_3 != 0 || (param_4 & 0xfffff) != 0)))))) {
return 1;
}
bVar2 = (param_2 & 0x7fffffff) == 0;
bVar3 = param_1 == 0 && bVar2;
if (param_1 == 0 && bVar2) {
bVar3 = param_3 == 0 && (param_4 & 0x7fffffff) == 0;
}
if (!bVar3) {
bVar3 = param_2 == param_4;
}
if (bVar3) {
bVar3 = param_1 == param_3;
}
if (!bVar3) {
uVar1 = param_2 ^ param_4;
bVar2 = uVar1 == 0;
if (-1 < (int)uVar1) {
bVar2 = param_2 == param_4;
}
bVar3 = -1 < (int)uVar1 && param_4 <= param_2;
if (bVar2) {
bVar3 = param_3 <= param_1;
}
param_4 = (int)param_4 >> 0x1f;
if (!bVar3) {
param_4 = ~param_4;
}
return param_4 | 1;
}
return 0;
}
void FUN_08000ac8(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
FUN_08000ad8(param_3,param_4,param_1,param_2);
return;
}
undefined4 FUN_08000ad8(undefined4 param_1)
{
FUN_08000a4c();
return param_1;
}
bool FUN_08000ae8(void)
{
char in_ZR;
FUN_08000ad8();
return in_ZR != '\0';
}
bool FUN_08000afc(void)
{
char in_CY;
FUN_08000ad8();
return in_CY == '\0';
}
bool FUN_08000b10(void)
{
undefined1 in_ZR;
undefined1 in_CY;
FUN_08000ad8();
return !(bool)in_CY || (bool)in_ZR;
}
bool FUN_08000b24(void)
{
undefined1 in_ZR;
undefined1 in_CY;
FUN_08000ac8();
return !(bool)in_CY || (bool)in_ZR;
}
bool FUN_08000b38(void)
{
char in_CY;
FUN_08000ac8();
return in_CY == '\0';
}
undefined4 FUN_08000b4c(int param_1,uint param_2,int param_3,uint param_4)
{
if ((((int)(param_2 << 1) >> 0x15 != -1) || (param_1 == 0 && (param_2 & 0xfffff) == 0)) &&
(((int)(param_4 << 1) >> 0x15 != -1 || (param_3 == 0 && (param_4 & 0xfffff) == 0)))) {
return 0;
}
return 1;
}
uint FUN_08000b78(uint param_1,uint param_2)
{
uint uVar1;
int iVar2;
uint uVar3;
iVar2 = param_2 * 2 + 0x200000;
if (param_2 * 2 < 0xffe00000) {
if (-1 < iVar2) {
return 0;
}
uVar1 = iVar2 >> 0x15;
uVar3 = -uVar1 - 0x3e1;
if (uVar1 < 0xfffffc20 && uVar3 != 0) {
uVar1 = (param_2 << 0xb | 0x80000000 | param_1 >> 0x15) >> (uVar3 & 0xff);
if ((param_2 & 0x80000000) != 0) {
uVar1 = -uVar1;
}
return uVar1;
}
}
else if (param_1 != 0 || (param_2 & 0xfffff) != 0) {
return 0;
}
param_2 = param_2 & 0x80000000;
if (param_2 == 0) {
param_2 = 0x7fffffff;
}
return param_2;
}
uint FUN_08000bc8(uint param_1,uint param_2)
{
int iVar1;
uint uVar2;
if ((param_2 & 0x80000000) != 0) {
return 0;
}
iVar1 = param_2 * 2 + 0x200000;
if (param_2 * 2 < 0xffe00000) {
if (-1 < iVar1) {
return 0;
}
uVar2 = -(iVar1 >> 0x15) - 0x3e1;
if (-1 < (int)uVar2) {
return (param_2 << 0xb | 0x80000000 | param_1 >> 0x15) >> (uVar2 & 0xff);
}
}
else if (param_1 != 0 || (param_2 & 0xfffff) != 0) {
return 0;
}
return 0xffffffff;
}
uint FUN_08000c08(uint param_1,uint param_2)
{
uint uVar1;
uint uVar2;
uint uVar3;
uint in_r12;
bool bVar4;
bool bVar5;
uVar2 = param_2 * 2;
bVar5 = uVar2 < 0x70000000;
uVar3 = uVar2 + 0x90000000;
uVar1 = uVar3;
if (!bVar5) {
in_r12 = uVar2 + 0x8fe00000;
uVar1 = in_r12;
}
bVar4 = uVar1 == 0;
if (!bVar5 && uVar3 >= 0x200000) {
bVar4 = in_r12 == 0x1fc00000;
}
if (((bVar5 || uVar3 < 0x200000) || 0x1fc00000 < in_r12) || bVar4) {
if ((param_2 & 0x40000000) != 0) {
if (((int)uVar2 >> 0x15 == -1) && (param_1 != 0 || (param_2 & 0xfffff) != 0)) {
return 0x7fc00000;
}
return param_2 & 0x80000000 | 0x7f800000;
}
if ((int)(uVar2 + 0x92e00000) < 0 != SCARRY4(uVar3,0x2e00000)) {
return param_2 & 0x80000000;
}
uVar2 = 0x18 - (uVar2 + 0x92e00000 >> 0x15);
uVar1 = param_1 >> (uVar2 & 0xff);
if (param_1 << (0x20 - uVar2 & 0xff) != 0) {
uVar1 = uVar1 | 1;
}
uVar3 = param_2 & 0x1fffff | 0x100000;
param_1 = uVar1 | uVar3 << (0x20 - uVar2 & 0xff);
uVar3 = (uVar3 >> (uVar2 & 0xff)) << 1;
}
uVar1 = (param_2 & 0x80000000 | param_1 >> 0x1d) + uVar3 * 4 + (uint)(0x7fffffff < param_1 * 8);
if (param_1 * 8 == 0x80000000) {
uVar1 = uVar1 & 0xfffffffe;
}
return uVar1;
}
undefined8 FUN_08000ca8(int param_1,int param_2,int param_3,int param_4)
{
undefined8 uVar1;
if ((param_4 == 0) && (param_3 == 0)) {
if (param_2 != 0 || param_1 != 0) {
param_2 = -1;
param_1 = -1;
}
return CONCAT44(param_2,param_1);
}
uVar1 = FUN_08014de0();
return uVar1;
}
void FUN_08000cdc(void)
{
if ((DAT_08000cf0 != DAT_08000cec) && (DAT_08000cf4 != (code *)0x0)) {
// WARNING: Could not recover jumptable at 0x08000ce8. Too many branches
// WARNING: Treating indirect jump as call
(*DAT_08000cf4)();
return;
}
return;
}
undefined4 FUN_08000d1c(undefined4 param_1)
{
char *pcVar1;
pcVar1 = DAT_08000d38;
if (*DAT_08000d38 == '\0') {
param_1 = FUN_08000cdc();
if (DAT_08000d3c != 0) {
param_1 = DAT_08000d40;
}
*pcVar1 = '\x01';
}
return param_1;
}
void FUN_08000d44(void)
{
if (((DAT_08000d14 - DAT_08000d10 >> 2) - (DAT_08000d14 - DAT_08000d10 >> 0x1f) >> 1 != 0) &&
(DAT_08000d18 != (code *)0x0)) {
// WARNING: Could not recover jumptable at 0x08000d0c. Too many branches
// WARNING: Treating indirect jump as call
(*DAT_08000d18)();
return;
}
return;
}
void Enable_ADC_DMA(void)
{
int iVar1;
iVar1 = DAT_08000dc4;
*(uint *)(DAT_08000dc4 + 0x30) = *(uint *)(DAT_08000dc4 + 0x30) | 4;
*(uint *)(iVar1 + 0x30) = *(uint *)(iVar1 + 0x30) | 0x80;
*(uint *)(iVar1 + 0x30) = *(uint *)(iVar1 + 0x30) | 1;
*(uint *)(iVar1 + 0x30) = *(uint *)(iVar1 + 0x30) | 2;
return;
}
void Configure_DAC_DMA(void)
{
int iVar1;
uint uVar2;
iVar1 = DAT_08000e1c;
*(uint *)(DAT_08000e1c + 0x30) = *(uint *)(DAT_08000e1c + 0x30) | 0x400000;
uVar2 = *(uint *)(iVar1 + 0x30);
*(uint *)(iVar1 + 0x30) = *(uint *)(iVar1 + 0x30) | 0x200000;
FUN_08002e78(0x11,0,0,*(uint *)(iVar1 + 0x30) & 0x200000,uVar2 & 0x400000);
FUN_08002e98(0x11);
FUN_08002e78(0x38,0,0);
FUN_08002e98(0x38);
return;
}
void FUN_08000e20(int *param_1)
{
undefined4 *puVar1;
undefined4 uVar2;
undefined4 uVar3;
undefined4 uVar4;
puVar1 = DAT_08000e48;
if (*param_1 != DAT_08000e44) {
return;
}
uVar2 = DAT_08000e4c[1];
uVar3 = DAT_08000e4c[2];
uVar4 = DAT_08000e4c[3];
*DAT_08000e48 = *DAT_08000e4c;
puVar1[1] = uVar2;
puVar1[2] = uVar3;
puVar1[3] = uVar4;
*DAT_08000e50 = 1;
return;
}
void FUN_08000e54(int *param_1)
{
if (*param_1 == DAT_08000e68) {
*DAT_08000e6c = 1;
}
return;
}
void SystemHalt(void)
{
disableIRQinterrupts();
do {
// WARNING: Do nothing block with infinite loop
} while( true );
}
void Init_ClockSystem(void)
{
undefined4 *puVar1;
int iVar2;
undefined4 local_20;
undefined4 local_1c;
undefined4 local_18;
undefined4 local_14;
undefined4 local_10;
undefined4 local_c;
puVar1 = DAT_08000ed4;
local_18 = 0;
local_14 = 0;
local_10 = 0;
local_c = 0;
local_20 = 0;
local_1c = 0;
*DAT_08000ed4 = DAT_08000ed8;
puVar1[1] = 0x4f;
puVar1[2] = 0;
puVar1[3] = 0x40;
puVar1[4] = 0;
puVar1[6] = 0;
iVar2 = FUN_080032bc();
if (iVar2 != 0) {
// WARNING: Subroutine does not return
SystemHalt();
}
local_18 = 0x1000;
iVar2 = FUN_0800332e(DAT_08000ed4,&local_18);
if (iVar2 == 0) {
local_20 = 0x20;
local_1c = 0;
iVar2 = FUN_0800342c(DAT_08000ed4,&local_20);
if (iVar2 == 0) {
return;
}
// WARNING: Subroutine does not return
SystemHalt();
}
// WARNING: Subroutine does not return
SystemHalt();
}
void Configure_ADC_Channels(void)
{
undefined4 *puVar1;
int iVar2;
undefined4 local_18;
undefined4 local_14;
undefined4 local_10;
undefined4 local_c;
puVar1 = DAT_08000f84;
local_18 = 0;
local_14 = 0;
local_10 = 0;
local_c = 0;
*DAT_08000f84 = DAT_08000f88;
puVar1[1] = 0x10000;
puVar1[2] = 0;
puVar1[4] = 1;
*(undefined1 *)(puVar1 + 6) = 0;
*(undefined1 *)(puVar1 + 8) = 0;
puVar1[0xb] = 0x10000000;
puVar1[10] = 0x8000000;
puVar1[3] = 0;
puVar1[7] = 4;
*(undefined1 *)(puVar1 + 0xc) = 1;
puVar1[5] = 0;
iVar2 = FUN_08003e74();
if (iVar2 != 0) {
// WARNING: Subroutine does not return
SystemHalt();
}
local_18 = 10;
local_14 = 1;
local_10 = 3;
iVar2 = FUN_08004244(DAT_08000f84,&local_18);
if (iVar2 != 0) {
// WARNING: Subroutine does not return
SystemHalt();
}
local_18 = 0xb;
local_14 = 2;
iVar2 = FUN_08004244(DAT_08000f84,&local_18);
if (iVar2 != 0) {
// WARNING: Subroutine does not return
SystemHalt();
}
local_18 = 8;
local_14 = 3;
iVar2 = FUN_08004244(DAT_08000f84,&local_18);
if (iVar2 == 0) {
local_18 = 4;
local_14 = 4;
iVar2 = FUN_08004244(DAT_08000f84,&local_18);
if (iVar2 == 0) {
return;
}
// WARNING: Subroutine does not return
SystemHalt();
}
// WARNING: Subroutine does not return
SystemHalt();
}
void Calibrate_ADC(void)
{
undefined4 *puVar1;
int iVar2;
undefined4 local_20;
undefined4 local_1c;
undefined4 local_18;
undefined4 local_14;
undefined4 local_10;
undefined4 local_c;
puVar1 = DAT_08000ff0;
local_18 = 0;
local_14 = 0;
local_10 = 0;
local_c = 0;
local_20 = 0;
local_1c = 0;
*DAT_08000ff0 = DAT_08000ff4;
puVar1[1] = 0x54;
puVar1[2] = 0;
puVar1[3] = 500;
puVar1[4] = 0;
puVar1[6] = 0;
iVar2 = FUN_080032bc();
if (iVar2 != 0) {
// WARNING: Subroutine does not return
SystemHalt();
}
local_18 = 0x1000;
iVar2 = FUN_0800332e(DAT_08000ff0,&local_18);
if (iVar2 == 0) {
local_20 = 0x20;
local_1c = 0;
iVar2 = FUN_0800342c(DAT_08000ff0,&local_20);
if (iVar2 == 0) {
return;
}
// WARNING: Subroutine does not return
SystemHalt();
}
// WARNING: Subroutine does not return
SystemHalt();
}
void Init_ControlLEDs(void)
{
undefined4 *puVar1;
int iVar2;
puVar1 = DAT_08001028;
*DAT_08001028 = 0x50000000;
*(undefined1 *)(puVar1 + 1) = 6;
*(undefined1 *)((int)puVar1 + 7) = 2;
*(undefined1 *)((int)puVar1 + 6) = 0;
*(undefined1 *)((int)puVar1 + 9) = 2;
*(undefined1 *)((int)puVar1 + 10) = 0;
*(undefined1 *)((int)puVar1 + 0xb) = 0;
*(undefined1 *)(puVar1 + 3) = 0;
*(undefined1 *)((int)puVar1 + 0xe) = 0;
*(undefined1 *)((int)puVar1 + 0xf) = 0;
iVar2 = FUN_0800562c();
if (iVar2 == 0) {
return;
}
// WARNING: Subroutine does not return
SystemHalt();
}
void Init_GPIO_Ports(void)
{
int iVar1;
undefined4 local_50;
undefined4 local_4c;
undefined4 local_48;
undefined4 local_44;
undefined4 local_40;
undefined4 local_3c;
undefined4 local_38;
undefined4 local_24;
undefined4 local_20;
undefined4 local_1c;
undefined4 local_18;
undefined4 local_14;
undefined4 local_10;
undefined4 local_c;
FUN_08012484(&local_3c,0,0x34);
local_50 = 0;
local_4c = 0;
local_48 = 0;
local_44 = 0;
local_40 = 0;
*(uint *)(DAT_080010d0 + 0x40) = *(uint *)(DAT_080010d0 + 0x40) | 0x10000000;
*DAT_080010d4 = *DAT_080010d4 | 0xc000;
local_3c = 1;
local_38 = 0x10000;
local_24 = 2;
local_20 = 0x400000;
local_1c = 8;
local_18 = 0x150;
local_14 = 2;
local_10 = 7;
local_c = 2;
iVar1 = FUN_08002020(&local_3c);
if (iVar1 != 0) {
// WARNING: Subroutine does not return
SystemHalt();
}
local_50 = 0xf;
local_4c = 2;
local_48 = 0;
local_44 = 0x1400;
local_40 = 0x1000;
iVar1 = FUN_08001870(&local_50,5);
if (iVar1 == 0) {
return;
}
// WARNING: Subroutine does not return
SystemHalt();
}
void Setup_MIDI_UART(void)
{
undefined4 *puVar1;
int iVar2;
puVar1 = DAT_08001104;
*DAT_08001104 = DAT_08001108;
puVar1[1] = 0x1c200;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
puVar1[5] = 0xc;
puVar1[6] = 0;
puVar1[7] = 0;
iVar2 = FUN_08003742();
if (iVar2 == 0) {
return;
}
// WARNING: Subroutine does not return
SystemHalt();
}
// Main drum processing loop - handles sensor input and MIDI output
void DrumProcessor_Run(void)
{
int initStatus;
// Enable ADC clock
*(uint *)(RCC_BASE + 0x40) = *(uint *)(RCC_BASE + 0x40) | 0x10000000;
// Start analog-to-digital conversion
ADC_StartConversion();
// heck if DMA transfer completed
if (*(int *)(DMA1_BASE + 0x54) == EXPECTED_DMA_TRANSFER_SIZE) {
// eset DMA transfer counter
*(undefined4 *)(DMA1_BASE + 0x54) = 0;
// Trigger DMA complete callback
(**(code **)(DMA_CALLBACK_TABLE + 4))();
do {
// WARNING: Do nothing block with infinite loop
// Fallback infinite loop if DMA fails
} while( true );
}
// Hardware initialization sequence
Init_Timer3();
Configure_DAC_Interface();
Init_GPIO_Ports();
Enable_ADC_DMA();
Configure_DAC_DMA();
Setup_MIDI_UART();
Init_ClockSystem();
Configure_ADC_Channels();
Calibrate_ADC();
Init_ControlLEDs();
Enable_ButtonInterrupts();
processDrumHits();
initStatus = Init_AudioBuffer(AUDIO_BUFFER_ADDR,DEFAULT_BUFFER_SIZE,4);
if (initStatus != 0) {
// WARNING: Subroutine does not return
SystemHalt();
}
DAC_UpdateOutput(DAC_CHANNEL_LEFT);
DAC_UpdateOutput(DAC_CHANNEL_RIGHT);
enableIRQinterrupts();
do {
do {
} while (*sensorDataReadyFlag == '\0');
processDrumHitsExtended(currentDrumKitProfile);
*sensorDataReadyFlag = '\0';
} while( true );
}
undefined4 FUN_080011d0(int param_1)
{
undefined4 uVar1;
undefined4 local_18;
undefined4 uStack_14;
undefined4 local_10;
undefined4 uStack_c;
if (param_1 != 0) {
local_10 = *(undefined4 *)(DAT_08001204 + 0x20);
uStack_c = *(undefined4 *)(DAT_08001204 + 0x24);
local_18 = *(undefined4 *)(DAT_08001204 + 0x28);
uStack_14 = *(undefined4 *)(DAT_08001204 + 0x2c);
uVar1 = FUN_0800a028(param_1,&local_18);
return uVar1;
}
return 0;
}
int FUN_08001208(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
uint *puVar1;
int iVar2;
uint uVar3;
iVar2 = FUN_08009ed8(DAT_080012d8,1,param_2,param_4,param_4);
puVar1 = DAT_080012dc;
if (iVar2 == 0) {
FUN_0800a084(param_1,0x30,0x12);
}
else {
*DAT_080012dc = *DAT_080012dc | 0x40000000;
uVar3 = *DAT_080012d8;
puVar1[2] = uVar3;
puVar1[3] = uVar3;
puVar1 = DAT_080012e0;
*DAT_080012e0 = *DAT_080012e0 | 0x40000000;
puVar1[2] = uVar3 + 0xc;
puVar1[3] = uVar3 + 0xc;
puVar1 = DAT_080012e4;
*DAT_080012e4 = *DAT_080012e4 | 0x40000000;
puVar1[2] = uVar3 + 0x54;
puVar1[3] = uVar3 + 0x54;
puVar1 = DAT_080012e8;
*DAT_080012e8 = *DAT_080012e8 | 0x40000000;
puVar1[2] = uVar3 + 0xdc;
puVar1[3] = uVar3 + 0x9c;
puVar1 = DAT_080012ec;
*DAT_080012ec = *DAT_080012ec | 0x40000000;
puVar1[2] = uVar3 + 0x91c;
puVar1[3] = uVar3 + 0x91c;
puVar1 = DAT_080012f0;
*DAT_080012f0 = *DAT_080012f0 | 0x40000000;
puVar1[2] = uVar3 + 0x9dc;
puVar1[3] = uVar3 + 0x99c;
puVar1 = DAT_080012f4;
*DAT_080012f4 = *DAT_080012f4 | 0x40000000;
puVar1[2] = uVar3 + 0xa3c;
puVar1[3] = uVar3 + 0xa3c;
puVar1 = DAT_080012f8;
*DAT_080012f8 = *DAT_080012f8 | 0x40000000;
puVar1[2] = uVar3 + 0xa54;
puVar1[3] = uVar3 + 0xa54;
puVar1 = DAT_080012fc;
*DAT_080012fc = *DAT_080012fc | 0x40000000;
puVar1[2] = uVar3 + 0xad4;
puVar1[3] = uVar3 + 0xad4;
}
return iVar2;
}
int FUN_08001300(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
int iVar1;
int iVar2;
int iVar3;
int iVar4;
iVar2 = FUN_08009f80(DAT_08001378,1,param_2,param_4,param_4);
iVar1 = DAT_0800137c;
if (iVar2 == 0) {
FUN_0800a084(param_1,0x30,0x13);
}
else {
iVar4 = *DAT_08001378;
*(int *)(DAT_0800137c + 8) = iVar4;
*(int *)(iVar1 + 0xc) = iVar4;
iVar1 = DAT_08001380;
*(int *)(DAT_08001380 + 8) = iVar4 + 0x20c;
*(int *)(iVar1 + 0xc) = iVar4 + 0x20c;
iVar1 = DAT_08001384;
*(int *)(DAT_08001384 + 8) = iVar4 + 0x250;
*(int *)(iVar1 + 0xc) = iVar4 + 0x250;
iVar1 = DAT_08001388;
iVar3 = iVar4 + 0x3d0;
*(int *)(DAT_08001388 + 8) = iVar3;
*(int *)(iVar1 + 0xc) = iVar3;
iVar1 = DAT_0800138c;
*(int *)(DAT_0800138c + 8) = iVar3;
*(int *)(iVar1 + 0xc) = iVar3;
iVar1 = DAT_08001390;
*(int *)(DAT_08001390 + 8) = iVar4;
*(int *)(iVar1 + 0xc) = iVar4;
iVar1 = DAT_08001394;
*(int *)(DAT_08001394 + 8) = iVar3;
*(int *)(iVar1 + 0xc) = iVar3;
iVar1 = DAT_08001398;
*(int *)(DAT_08001398 + 8) = iVar4;
*(int *)(iVar1 + 0xc) = iVar4;
iVar1 = DAT_0800139c;
*(int *)(DAT_0800139c + 8) = iVar4 + 0x80;
*(int *)(iVar1 + 0xc) = iVar4 + 0x80;
iVar1 = DAT_080013a0;
*(int *)(DAT_080013a0 + 8) = iVar4 + 0x98;
*(int *)(iVar1 + 0xc) = iVar4 + 0x98;
}
return iVar2;
}
void FUN_080013a4(void)
{
FUN_0800a06c();
return;
}
void FUN_080013ac(undefined4 param_1,undefined4 param_2)
{
FUN_0800a264(param_1,param_2,DAT_080013c8,1,5,0);
return;
}
void FUN_080013cc(int param_1)
{
if (param_1 == 0) {
*DAT_080013e0 = DAT_080013e4;
}
FUN_0800a090();
return;
}
void FUN_080013e8(int param_1)
{
if (param_1 == 0) {
*DAT_080013fc = DAT_08001400;
}
FUN_0800a17c();
return;
}
byte FUN_08001404(undefined4 param_1,undefined4 param_2)
{
byte bVar1;
byte bVar2;
byte bVar3;
int iVar4;
iVar4 = FUN_0800a2e8();
if (iVar4 == 0) {
bVar3 = 0;
}
else {
bVar1 = FUN_08001208(iVar4,param_2);
bVar2 = FUN_08001300(iVar4,param_2);
bVar3 = FUN_0800a484(param_1);
bVar3 = bVar3 & bVar1 & bVar2;
}
return bVar3;
}
uint FUN_08001434(undefined4 *param_1,int param_2,int param_3)
{
uint uVar1;
int iVar2;
uint uVar3;
undefined1 auStack_50 [4];
undefined1 auStack_4c [2];
ushort local_4a;
undefined1 auStack_44 [2];
ushort local_42;
uVar1 = FUN_080013ac(param_1,0);
if ((uVar1 & 0xff) == 0) {
iVar2 = FUN_080011d0(auStack_50);
if (iVar2 == 0) {
uVar1 = FUN_080013a4(*param_1);
}
else {
uVar3 = 0;
while (param_2 != 0) {
if (local_42 <= uVar3) {
uVar3 = 0;
goto LAB_08001498;
}
FUN_08009eb8(auStack_44,uVar3,*(undefined4 *)(param_2 + uVar3 * 4));
uVar3 = uVar3 + 1 & 0xffff;
}
uVar3 = 0;
LAB_08001498:
for (; (param_3 != 0 && (uVar3 < local_4a)); uVar3 = uVar3 + 1 & 0xffff) {
FUN_08009eb8(auStack_4c,uVar3,*(undefined4 *)(param_3 + uVar3 * 4));
}
iVar2 = FUN_08001404(*param_1,auStack_50);
if (iVar2 == 0) {
uVar1 = FUN_080013a4(*param_1);
}
}
}
return uVar1;
}
void FUN_080014c2(void)
{
FUN_0800a4e4();
return;
}
void ADC_Init(void)
{
int iVar1;
iVar1 = ADC1;
*(uint *)(ADC1 + 0x44) = *(uint *)(ADC1 + 0x44) | 0x4000;
*(uint *)(iVar1 + 0x40) = *(uint *)(iVar1 + 0x40) | 0x10000000;
return;
}
// WARNING: Globals starting with '_' overlap smaller symbols at the same address
void ADC_Init(int *adcConfig)
{
int i;
undefined4 local_24;
undefined4 local_20;
undefined4 local_1c;
undefined4 local_18;
undefined4 local_14;
undefined4 *rccReg;
local_1c = 0;
local_18 = 0;
local_14 = 0;
if (*adcConfig == 0x40012000) {
_DAT_40023844 = _DAT_40023844 | 0x100;
_DAT_40023830 = _DAT_40023830 | 7;
local_24 = 3;
local_20 = 3;
FUN_08002710(DAT_08001684,&local_24,_DAT_40023830,_DAT_40023830 & 2);
local_24 = 0x10;
local_20 = 3;
local_1c = 0;
FUN_08002710(DAT_08001688,&local_24);
local_24 = 1;
local_20 = 3;
local_1c = 0;
FUN_08002710(DAT_0800168c,&local_24);
rccReg = DAT_08001690;
*DAT_08001690 = DAT_08001694;
rccReg[1] = 0;
rccReg[2] = 0;
rccReg[3] = 0;
rccReg[4] = 0x400;
rccReg[5] = 0x1000;
rccReg[6] = 0x4000;
rccReg[7] = 0x100;
rccReg[8] = 0x20000;
rccReg[9] = 0;
i = FUN_080029e8();
rccReg = DAT_08001690;
if (i != 0) {
// WARNING: Subroutine does not return
SystemHalt();
}
adcConfig[0xe] = (int)DAT_08001690;
rccReg[0xe] = adcConfig;
FUN_08002e78(0x12,0);
FUN_08002e98(0x12);
}
return;
}
void FUN_08001698(int *param_1)
{
int iVar1;
iVar1 = DAT_08001708;
if (*param_1 == DAT_08001700) {
*(uint *)(DAT_08001708 + 0x40) = *(uint *)(DAT_08001708 + 0x40) | 2;
FUN_08002e78(0x1d,0,0,*(uint *)(iVar1 + 0x40) & 2);
FUN_08002e98(0x1d);
}
else if (*param_1 == DAT_08001704) {
*(uint *)(DAT_08001708 + 0x40) = *(uint *)(DAT_08001708 + 0x40) | 4;
FUN_08002e78(0x1e,2,0,*(uint *)(iVar1 + 0x40) & 4);
FUN_08002e98(0x1e);
}
return;
}
void FUN_0800170c(int *param_1)
{
undefined4 *puVar1;
int iVar2;
undefined4 local_24;
undefined4 local_20;
undefined4 local_1c;
undefined4 local_18;
undefined4 local_14;
iVar2 = DAT_080017b8;
local_1c = 0;
if (*param_1 == DAT_080017b8) {
*(uint *)(DAT_080017b8 + 0x1f440) = *(uint *)(DAT_080017b8 + 0x1f440) | 0x20000;
*(uint *)(iVar2 + 0x1f430) = *(uint *)(iVar2 + 0x1f430) | 1;
local_24 = 0xc;
local_20 = 2;
local_18 = 3;
local_14 = 7;
FUN_08002710(DAT_080017bc,&local_24);
puVar1 = DAT_080017c0;
*DAT_080017c0 = DAT_080017c4;
puVar1[1] = 0x8000000;
puVar1[2] = 0x40;
puVar1[3] = 0;
puVar1[4] = 0x400;
puVar1[5] = 0;
puVar1[6] = 0;
puVar1[7] = 0;
puVar1[8] = 0;
puVar1[9] = 0;
iVar2 = FUN_080029e8();
puVar1 = DAT_080017c0;
if (iVar2 != 0) {
// WARNING: Subroutine does not return
SystemHalt();
}
param_1[0xe] = (int)DAT_080017c0;
puVar1[0xe] = param_1;
FUN_08002e78(0x26,3,0);
FUN_08002e98(0x26);
}
return;
}
void FUN_080017c8(int *param_1)
{
int iVar1;
int iVar2;
uint uVar3;
undefined4 local_80 [23];
undefined4 local_24;
undefined4 local_20;
undefined4 local_1c;
undefined4 local_18;
undefined4 local_14;
local_24 = 0;
local_20 = 0;
local_1c = 0;
local_18 = 0;
local_14 = 0;
FUN_08012484(local_80,0,0x5c);
if (*param_1 == 0x50000000) {
local_80[0] = 0x100;
iVar2 = FUN_08001a1c(local_80);
iVar1 = DAT_08001868;
if (iVar2 != 0) {
// WARNING: Subroutine does not return
SystemHalt();
}
*(uint *)(DAT_08001868 + 0x30) = *(uint *)(DAT_08001868 + 0x30) | 1;
uVar3 = *(uint *)(iVar1 + 0x30) & 1;
local_24 = 0x1800;
local_20 = 2;
local_1c = 0;
local_18 = 3;
local_14 = 10;
FUN_08002710(DAT_0800186c,&local_24);
*(uint *)(iVar1 + 0x34) = *(uint *)(iVar1 + 0x34) | 0x80;
*(uint *)(iVar1 + 0x44) = *(uint *)(iVar1 + 0x44) | 0x4000;
FUN_08002e78(0x43,0,0,*(uint *)(iVar1 + 0x44) & 0x4000,uVar3);
FUN_08002e98(0x43);
}
return;
}
undefined4 FUN_08001870(uint *param_1,uint param_2)
{
uint *puVar1;
int iVar2;
int iVar3;
undefined4 uVar4;
uint uVar5;
puVar1 = DAT_080019bc;
if (param_1 == (uint *)0x0) {
return 1;
}
if (((*DAT_080019bc & 0xf) < param_2) &&
(*(char *)DAT_080019bc = (char)param_2, (*puVar1 & 0xf) != param_2)) {
return 1;
}
if ((*param_1 & 2) != 0) {
if ((*param_1 & 4) != 0) {
DAT_080019c0[2] = DAT_080019c0[2] | 0x1c00;
}
if ((*param_1 & 8) != 0) {
DAT_080019c0[2] = DAT_080019c0[2] | 0xe000;
}
DAT_080019c0[2] = DAT_080019c0[2] & 0xffffff0f | param_1[2];
}
if ((*param_1 & 1) == 0) {
LAB_08001940:
puVar1 = DAT_080019bc;
if ((param_2 < (*DAT_080019bc & 0xf)) &&
(*(char *)DAT_080019bc = (char)param_2, (*puVar1 & 0xf) != param_2)) {
return 1;
}
if ((*param_1 & 4) != 0) {
DAT_080019c0[2] = DAT_080019c0[2] & 0xffffe3ff | param_1[3];
}
if ((*param_1 & 8) != 0) {
DAT_080019c0[2] = DAT_080019c0[2] & 0xffff1fff | param_1[4] << 3;
}
uVar5 = FUN_08001e90();
*DAT_080019c8 = uVar5 >> *(sbyte *)(DAT_080019c4 + ((DAT_080019c0[2] << 0x18) >> 0x1c));
FUN_08002ec8(*DAT_080019cc);
uVar4 = 0;
}
else {
uVar5 = param_1[1];
if (uVar5 == 1) {
if ((*DAT_080019c0 & 0x20000) == 0) {
return 1;
}
}
else if (uVar5 - 2 < 2) {
if ((*DAT_080019c0 & 0x2000000) == 0) {
return 1;
}
}
else if ((*DAT_080019c0 & 2) == 0) {
return 1;
}
DAT_080019c0[2] = uVar5 | DAT_080019c0[2] & 0xfffffffc;
iVar2 = getCurrentTime();
do {
if ((DAT_080019c0[2] & 0xc) == param_1[1] * 4) goto LAB_08001940;
iVar3 = getCurrentTime();
} while ((uint)(iVar3 - iVar2) < 0x1389);
uVar4 = 3;
}
return uVar4;
}
undefined4 FUN_080019d0(void)
{
return *DAT_080019d8;
}
uint FUN_080019dc(void)
{
uint uVar1;
uVar1 = FUN_080019d0();
return uVar1 >> *(sbyte *)(DAT_080019f8 + ((uint)(*(int *)(DAT_080019f4 + 8) << 0x13) >> 0x1d));
}
uint FUN_080019fc(void)
{
uint uVar1;
uVar1 = FUN_080019d0();
return uVar1 >> *(sbyte *)(DAT_08001a18 + ((uint)(*(int *)(DAT_08001a14 + 8) << 0x10) >> 0x1d));
}
undefined4 FUN_08001a1c(uint *param_1)
{
uint *puVar1;
int iVar2;
int iVar3;
uint uVar4;
uint uVar5;
uint uVar6;
uVar6 = *param_1 & 1;
if (uVar6 != 0) {
DAT_08001c84[0x23] = DAT_08001c84[0x23] & 0xf9ffffff | param_1[0xe];
if (param_1[0xe] == 0) {
uVar6 = 1;
}
else {
uVar6 = 0;
}
}
if (((*param_1 & 2) != 0) &&
(DAT_08001c84[0x23] = DAT_08001c84[0x23] & 0xe7ffffff | param_1[0xf], param_1[0xf] == 0)) {
uVar6 = 1;
}
uVar5 = *param_1 & 4;
if (uVar5 != 0) {
DAT_08001c84[0x23] = DAT_08001c84[0x23] & 0xffcfffff | param_1[0xc];
if (param_1[0xc] == 0x100000) {
uVar6 = 1;
}
if (param_1[0xc] == 0) {
uVar5 = 1;
}
else {
uVar5 = 0;
}
}
if ((*param_1 & 8) != 0) {
DAT_08001c84[0x23] = DAT_08001c84[0x23] & 0xff3fffff | param_1[0xd];
if (param_1[0xd] == 0x400000) {
uVar6 = 1;
}
if (param_1[0xd] == 0) {
uVar5 = 1;
}
}
if ((*param_1 & 0x20) != 0) {
DAT_08001c84[0x10] = DAT_08001c84[0x10] | 0x10000000;
*DAT_08001c8c = *DAT_08001c8c | 0x100;
iVar2 = getCurrentTime();
while (iVar3 = DAT_08001c90, puVar1 = DAT_08001c84, (*DAT_08001c8c & 0x100) == 0) {
iVar3 = getCurrentTime();
if (2 < (uint)(iVar3 - iVar2)) {
return 3;
}
}
if (((DAT_08001c84[0x1c] & 0x300) != 0) &&
((param_1[0x10] & 0x300) != (DAT_08001c84[0x1c] & 0x300))) {
uVar4 = DAT_08001c84[0x1c];
*(undefined4 *)(DAT_08001c90 + 0xe40) = 1;
*(undefined4 *)(iVar3 + 0xe40) = 0;
puVar1[0x1c] = uVar4 & 0xfffffcff;
if ((puVar1[0x1c] & 1) != 0) {
iVar2 = getCurrentTime();
while ((DAT_08001c84[0x1c] & 2) == 0) {
iVar3 = getCurrentTime();
if (5000 < (uint)(iVar3 - iVar2)) {
return 3;
}
}
}
}
if ((param_1[0x10] & 0x300) == 0x300) {
DAT_08001c84[2] = param_1[0x10] & 0xffffcff | DAT_08001c84[2] & 0xffe0ffff;
}
else {
DAT_08001c84[2] = DAT_08001c84[2] & 0xffe0ffff;
}
DAT_08001c84[0x1c] = DAT_08001c84[0x1c] | param_1[0x10] & 0xfff;
}
if ((*param_1 & 0x10) != 0) {
*(uint *)(DAT_08001c88 + 0x1e0) = (uint)(byte)param_1[0x16];
}
if ((*param_1 & 0x80) != 0) {
DAT_08001c84[0x25] = DAT_08001c84[0x25] & 0xff3fffff | param_1[0x13];
}
if ((*param_1 & 0x40) != 0) {
DAT_08001c84[0x25] = DAT_08001c84[0x25] & 0xfbffffff | param_1[0x12];
}
if (((*param_1 & 0x100) != 0) &&
(DAT_08001c84[0x25] = DAT_08001c84[0x25] & 0xf7ffffff | param_1[0x15],
param_1[0x15] == 0x8000000)) {
uVar5 = 1;
}
if ((*param_1 & 0x200) != 0) {
DAT_08001c84[0x25] = DAT_08001c84[0x25] & 0xefffffff | param_1[0x11];
}
if (((((*param_1 & 0x400) != 0) &&
(DAT_08001c84[0x25] = DAT_08001c84[0x25] & 0xdfffffff | param_1[0x14],
param_1[0x14] == 0x20000000)) || (uVar6 != 0)) || (*param_1 == 0x800)) {
*(undefined4 *)(DAT_08001c90 + 0x68) = 0;
iVar2 = getCurrentTime();
while ((*DAT_08001c84 & 0x8000000) != 0) {
iVar3 = getCurrentTime();
if (2 < (uint)(iVar3 - iVar2)) {
return 3;
}
}
if ((((*param_1 & 1) != 0) && (param_1[0xe] == 0)) ||
(((*param_1 & 2) != 0 && (param_1[0xf] == 0)))) {
DAT_08001e88[0x21] =
param_1[1] | param_1[2] << 6 | DAT_08001e88[0x21] & 0x30000 |
DAT_08001e88[0x21] & 0xf000000 | param_1[5] << 0x1c;
}
puVar1 = DAT_08001e88;
if ((((*param_1 & 4) != 0) && (param_1[0xc] == 0x100000)) ||
(((*param_1 & 8) != 0 && (param_1[0xd] == 0x400000)))) {
DAT_08001e88[0x21] =
param_1[1] | param_1[2] << 6 | DAT_08001e88[0x21] & 0x30000 | param_1[4] << 0x18 |
DAT_08001e88[0x21] & 0x70000000;
puVar1[0x23] = puVar1[0x23] & 0xffffffe0 | param_1[10] - 1;
}
if (((*param_1 & 0x400) != 0) && (param_1[0x14] == 0x20000000)) {
DAT_08001e88[0x21] =
param_1[1] | param_1[2] << 6 | ((param_1[3] >> 1) - 1) * 0x10000 |
(((DAT_08001e88[0x21] << 0xe) >> 0x1e) + 1) * 0x2000000 | DAT_08001e88[0x21] & 0x70000000
;
}
if ((*param_1 & 0x800) != 0) {
DAT_08001e88[0x21] =
param_1[1] | param_1[2] << 6 | ((param_1[3] >> 1) - 1) * 0x10000 | param_1[4] << 0x18 |
param_1[5] << 0x1c;
}
*(undefined4 *)(DAT_08001e8c + 0x68) = 1;
iVar2 = getCurrentTime();
while ((*DAT_08001e88 & 0x8000000) == 0) {
iVar3 = getCurrentTime();
if (2 < (uint)(iVar3 - iVar2)) {
return 3;
}
}
}
if (uVar5 != 1) {
return 0;
}
*(undefined4 *)(DAT_08001e8c + 0x70) = 0;
iVar2 = getCurrentTime();
do {
puVar1 = DAT_08001e88;
if ((*DAT_08001e88 & 0x20000000) == 0) {
if ((((*param_1 & 4) != 0) && (param_1[0xc] == 0)) ||
(((*param_1 & 8) != 0 && (param_1[0xd] == 0)))) {
DAT_08001e88[0x22] =
param_1[6] | param_1[7] << 6 | DAT_08001e88[0x22] & 0x30000 | param_1[9] << 0x18;
puVar1[0x23] = puVar1[0x23] & 0xffffe0ff | (param_1[0xb] - 1) * 0x100;
}
if (((*param_1 & 0x100) != 0) && (param_1[0x15] == 0x8000000)) {
DAT_08001e88[0x22] =
param_1[6] | param_1[7] << 6 | ((param_1[8] >> 1) - 1) * 0x10000 |
DAT_08001e88[0x22] & 0xf000000;
}
*(undefined4 *)(DAT_08001e8c + 0x70) = 1;
iVar2 = getCurrentTime();
do {
if ((*DAT_08001e88 & 0x20000000) != 0) {
return 0;
}
iVar3 = getCurrentTime();
} while ((uint)(iVar3 - iVar2) < 3);
return 3;
}
iVar3 = getCurrentTime();
} while ((uint)(iVar3 - iVar2) < 3);
return 3;
}
uint FUN_08001e90(void)
{
uint uVar1;
undefined4 in_r3;
uint uVar2;
uVar2 = *(uint *)(DAT_08002014 + 8) & 0xc;
if (uVar2 == 8) {
uVar2 = *(uint *)(DAT_08002014 + 4) & 0x3f;
if ((*(uint *)(DAT_08002014 + 4) & 0x400000) == 0) {
uVar1 = (uint)(*(int *)(DAT_08002014 + 4) << 0x11) >> 0x17;
uVar1 = FUN_08000ca8(uVar1 * 16000000,
(((uint)(uVar1 * 0x20 < uVar1) * -0x3f -
(uint)(uVar1 * 0x7c0 < uVar1 * 0x1f)) * 8 +
(uint)CARRY4(uVar1 * 0x3d08,uVar1)) * 0x400 | uVar1 * 0x3d09 >> 0x16,
uVar2,0,in_r3);
}
else {
uVar1 = (uint)(*(int *)(DAT_08002014 + 4) << 0x11) >> 0x17;
uVar1 = FUN_08000ca8(uVar1 * 8000000,
(((uint)(uVar1 * 0x20 < uVar1) * -0x3f -
(uint)(uVar1 * 0x7c0 < uVar1 * 0x1f)) * 8 +
(uint)CARRY4(uVar1 * 0x3d08,uVar1)) * 0x200,uVar2,0,in_r3);
}
uVar1 = uVar1 / ((((uint)(*(int *)(DAT_08002014 + 4) << 0xe) >> 0x1e) + 1) * 2);
}
else if (uVar2 == 0xc) {
uVar2 = *(uint *)(DAT_08002014 + 4) & 0x3f;
if ((*(uint *)(DAT_08002014 + 4) & 0x400000) == 0) {
uVar1 = (uint)(*(int *)(DAT_08002014 + 4) << 0x11) >> 0x17;
uVar1 = FUN_08000ca8(uVar1 * 16000000,
(((uint)(uVar1 * 0x20 < uVar1) * -0x3f -
(uint)(uVar1 * 0x7c0 < uVar1 * 0x1f)) * 8 +
(uint)CARRY4(uVar1 * 0x3d08,uVar1)) * 0x400 | uVar1 * 0x3d09 >> 0x16,
uVar2,0,in_r3);
}
else {
uVar1 = (uint)(*(int *)(DAT_08002014 + 4) << 0x11) >> 0x17;
uVar1 = FUN_08000ca8(uVar1 * 8000000,
(((uint)(uVar1 * 0x20 < uVar1) * -0x3f -
(uint)(uVar1 * 0x7c0 < uVar1 * 0x1f)) * 8 +
(uint)CARRY4(uVar1 * 0x3d08,uVar1)) * 0x200,uVar2,0,in_r3);
}
uVar1 = uVar1 / ((uint)(*(int *)(DAT_08002014 + 4) << 1) >> 0x1d);
}
else {
uVar1 = DAT_0800201c;
if (uVar2 == 4) {
uVar1 = DAT_08002018;
}
}
return uVar1;
}
undefined4 FUN_08002020(uint *param_1)
{
uint *puVar1;
uint *puVar2;
int iVar3;
int iVar4;
undefined4 uVar5;
uint uVar6;
bool bVar7;
puVar1 = DAT_0800229c;
if (param_1 == (uint *)0x0) {
return 1;
}
if ((*param_1 & 1) != 0) {
if ((((DAT_0800229c[2] & 0xc) == 4) ||
(((DAT_0800229c[2] & 0xc) == 8 && ((DAT_0800229c[1] & 0x400000) != 0)))) ||
(((DAT_0800229c[2] & 0xc) == 0xc && ((DAT_0800229c[1] & 0x400000) != 0)))) {
if (((*DAT_0800229c & 0x20000) != 0) && (param_1[1] == 0)) {
return 1;
}
}
else {
if (param_1[1] == 0x10000) {
*DAT_0800229c = *DAT_0800229c | 0x10000;
}
else if (param_1[1] == 0x50000) {
*DAT_0800229c = *DAT_0800229c | 0x40000;
*puVar1 = *puVar1 | 0x10000;
}
else {
*DAT_0800229c = *DAT_0800229c & 0xfffeffff;
*puVar1 = *puVar1 & 0xfffbffff;
}
if (param_1[1] == 0) {
iVar3 = getCurrentTime();
while ((*DAT_0800229c & 0x20000) != 0) {
iVar4 = getCurrentTime();
if (100 < (uint)(iVar4 - iVar3)) {
return 3;
}
}
}
else {
iVar3 = getCurrentTime();
while ((*DAT_0800229c & 0x20000) == 0) {
iVar4 = getCurrentTime();
if (100 < (uint)(iVar4 - iVar3)) {
return 3;
}
}
}
}
}
if ((*param_1 & 2) != 0) {
if ((((DAT_0800229c[2] & 0xc) == 0) ||
(((DAT_0800229c[2] & 0xc) == 8 && ((DAT_0800229c[1] & 0x400000) == 0)))) ||
(((DAT_0800229c[2] & 0xc) == 0xc && ((DAT_0800229c[1] & 0x400000) == 0)))) {
if (((*DAT_0800229c & 2) != 0) && (param_1[3] != 1)) {
return 1;
}
*DAT_0800229c = *DAT_0800229c & 0xffffff07 | param_1[4] << 3;
}
else if (param_1[3] == 0) {
*DAT_080022a0 = 0;
iVar3 = getCurrentTime();
while ((*DAT_0800229c & 2) != 0) {
iVar4 = getCurrentTime();
if (2 < (uint)(iVar4 - iVar3)) {
return 3;
}
}
}
else {
*DAT_080022a0 = 1;
iVar3 = getCurrentTime();
while ((*DAT_0800229c & 2) == 0) {
iVar4 = getCurrentTime();
if (2 < (uint)(iVar4 - iVar3)) {
return 3;
}
}
*DAT_0800229c = *DAT_0800229c & 0xffffff07 | param_1[4] << 3;
}
}
if ((*param_1 & 8) != 0) {
if (param_1[5] == 0) {
DAT_080022a0[0x3a0] = 0;
iVar3 = getCurrentTime();
while ((DAT_0800229c[0x1d] & 2) != 0) {
iVar4 = getCurrentTime();
if (2 < (uint)(iVar4 - iVar3)) {
return 3;
}
}
}
else {
DAT_080022a0[0x3a0] = 1;
iVar3 = getCurrentTime();
while ((DAT_0800229c[0x1d] & 2) == 0) {
iVar4 = getCurrentTime();
if (2 < (uint)(iVar4 - iVar3)) {
return 3;
}
}
}
}
if ((*param_1 & 4) != 0) {
bVar7 = (DAT_0800229c[0x10] & 0x10000000) == 0;
if (bVar7) {
DAT_0800229c[0x10] = DAT_0800229c[0x10] | 0x10000000;
}
if ((*DAT_080022a4 & 0x100) == 0) {
*DAT_08002458 = *DAT_08002458 | 0x100;
iVar3 = getCurrentTime();
while ((*DAT_08002458 & 0x100) == 0) {
iVar4 = getCurrentTime();
if (2 < (uint)(iVar4 - iVar3)) {
return 3;
}
}
}
puVar2 = DAT_0800245c;
puVar1 = DAT_0800229c;
if (param_1[2] == 1) {
DAT_0800245c[0x1c] = DAT_0800245c[0x1c] | 1;
}
else if (param_1[2] == 5) {
DAT_0800245c[0x1c] = DAT_0800245c[0x1c] | 4;
puVar2[0x1c] = puVar2[0x1c] | 1;
}
else {
DAT_0800229c[0x1c] = DAT_0800229c[0x1c] & 0xfffffffe;
puVar1[0x1c] = puVar1[0x1c] & 0xfffffffb;
}
if (param_1[2] == 0) {
iVar3 = getCurrentTime();
while ((DAT_0800245c[0x1c] & 2) != 0) {
iVar4 = getCurrentTime();
if (5000 < (uint)(iVar4 - iVar3)) {
return 3;
}
}
}
else {
iVar3 = getCurrentTime();
while ((DAT_0800229c[0x1c] & 2) == 0) {
iVar4 = getCurrentTime();
if (5000 < (uint)(iVar4 - iVar3)) {
return 3;
}
}
}
if (bVar7) {
DAT_0800245c[0x10] = DAT_0800245c[0x10] & 0xefffffff;
}
}
uVar6 = param_1[6];
if (uVar6 == 0) {
uVar5 = 0;
}
else if ((DAT_0800245c[2] & 0xc) == 8) {
if (uVar6 == 1) {
uVar5 = 1;
}
else {
uVar6 = DAT_0800245c[1];
if ((uVar6 & 0x400000) == param_1[7]) {
if ((uVar6 & 0x3f) == param_1[8]) {
if ((uVar6 & 0x7fc0) == param_1[9] * 0x40) {
if ((uVar6 & 0x30000) == ((param_1[10] >> 1) - 1) * 0x10000) {
if ((uVar6 & 0xf000000) == param_1[0xb] * 0x1000000) {
if ((uVar6 & 0x70000000) == param_1[0xc] * 0x10000000) {
uVar5 = 0;
}
else {
uVar5 = 1;
}
}
else {
uVar5 = 1;
}
}
else {
uVar5 = 1;
}
}
else {
uVar5 = 1;
}
}
else {
uVar5 = 1;
}
}
else {
uVar5 = 1;
}
}
}
else if (uVar6 == 2) {
*(undefined4 *)(DAT_08002460 + 0x60) = 0;
iVar3 = getCurrentTime();
do {
if ((*DAT_0800245c & 0x2000000) == 0) {
DAT_0800245c[1] =
param_1[7] | param_1[8] | param_1[9] << 6 | ((param_1[10] >> 1) - 1) * 0x10000 |
param_1[0xb] << 0x18 | param_1[0xc] << 0x1c;
*(undefined4 *)(DAT_08002460 + 0x60) = 1;
iVar3 = getCurrentTime();
do {
if ((*DAT_0800245c & 0x2000000) != 0) {
return 0;
}
iVar4 = getCurrentTime();
} while ((uint)(iVar4 - iVar3) < 3);
return 3;
}
iVar4 = getCurrentTime();
} while ((uint)(iVar4 - iVar3) < 3);
uVar5 = 3;
}
else {
*(undefined4 *)(DAT_08002460 + 0x60) = 0;
iVar3 = getCurrentTime();
do {
if ((*DAT_0800245c & 0x2000000) == 0) {
return 0;
}
iVar4 = getCurrentTime();
} while ((uint)(iVar4 - iVar3) < 3);
uVar5 = 3;
}
return uVar5;
}
void FUN_08002464(undefined4 *param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
int iVar1;
iVar1 = DAT_08002490;
*(uint *)(DAT_08002490 + 0x10) = *(uint *)(DAT_08002490 + 0x10) & 0xfffffcff;
*(uint *)(iVar1 + 0x10) = *(uint *)(iVar1 + 0x10) | 0x300;
*(uint *)(iVar1 + 0x10) = *(uint *)(iVar1 + 0x10) | 1;
*param_1 = param_3;
InstructionSynchronizationBarrier(0xf);
param_1[1] = param_4;
return;
}
void FUN_08002494(undefined4 *param_1,undefined4 param_2)
{
int iVar1;
iVar1 = DAT_080024b4;
*(uint *)(DAT_080024b4 + 0x10) = *(uint *)(DAT_080024b4 + 0x10) & 0xfffffcff;
*(uint *)(iVar1 + 0x10) = *(uint *)(iVar1 + 0x10) | 0x200;
*(uint *)(iVar1 + 0x10) = *(uint *)(iVar1 + 0x10) | 1;
*param_1 = param_2;
return;
}
void FUN_080024b8(undefined2 *param_1,undefined2 param_2)
{
int iVar1;
iVar1 = DAT_080024d8;
*(uint *)(DAT_080024d8 + 0x10) = *(uint *)(DAT_080024d8 + 0x10) & 0xfffffcff;
*(uint *)(iVar1 + 0x10) = *(uint *)(iVar1 + 0x10) | 0x100;
*(uint *)(iVar1 + 0x10) = *(uint *)(iVar1 + 0x10) | 1;
*param_1 = param_2;
return;
}
void FUN_080024dc(undefined1 *param_1,undefined1 param_2)
{
int iVar1;
iVar1 = DAT_080024f8;
*(uint *)(DAT_080024f8 + 0x10) = *(uint *)(DAT_080024f8 + 0x10) & 0xfffffcff;
*(undefined4 *)(iVar1 + 0x10) = *(undefined4 *)(iVar1 + 0x10);
*(uint *)(iVar1 + 0x10) = *(uint *)(iVar1 + 0x10) | 1;
*param_1 = param_2;
return;
}
void FUN_080024fc(void)
{
if ((*(uint *)(DAT_0800259c + 0xc) & 0x10) != 0) {
*(uint *)(DAT_080025a0 + 0x1c) = *(uint *)(DAT_080025a0 + 0x1c) | 0x10;
*(undefined4 *)(DAT_0800259c + 0xc) = 0x10;
}
if ((*(uint *)(DAT_0800259c + 0xc) & 0x20) != 0) {
*(uint *)(DAT_080025a0 + 0x1c) = *(uint *)(DAT_080025a0 + 0x1c) | 8;
*(undefined4 *)(DAT_0800259c + 0xc) = 0x20;
}
if ((*(uint *)(DAT_0800259c + 0xc) & 0x40) != 0) {
*(uint *)(DAT_080025a0 + 0x1c) = *(uint *)(DAT_080025a0 + 0x1c) | 4;
*(undefined4 *)(DAT_0800259c + 0xc) = 0x40;
}
if ((*(uint *)(DAT_0800259c + 0xc) & 0x80) != 0) {
*(uint *)(DAT_080025a0 + 0x1c) = *(uint *)(DAT_080025a0 + 0x1c) | 2;
*(undefined4 *)(DAT_0800259c + 0xc) = 0x80;
}
if ((*(uint *)(DAT_0800259c + 0xc) & 0x100) != 0) {
*(uint *)(DAT_080025a0 + 0x1c) = *(uint *)(DAT_080025a0 + 0x1c) | 1;
*(undefined4 *)(DAT_0800259c + 0xc) = 0x100;
}
if ((*(uint *)(DAT_0800259c + 0xc) & 2) != 0) {
*(uint *)(DAT_080025a0 + 0x1c) = *(uint *)(DAT_080025a0 + 0x1c) | 0x20;
*(undefined4 *)(DAT_0800259c + 0xc) = 2;
}
return;
}
undefined4 FUN_080025a4(void)
{
int iVar1;
int iVar2;
iVar2 = DAT_080025d0;
iVar1 = DAT_080025cc;
if (-1 < *(int *)(DAT_080025cc + 0x10)) {
return 0;
}
*(int *)(DAT_080025cc + 4) = DAT_080025d0;
*(int *)(iVar1 + 4) = iVar2 + -0x77777778;
if (-1 < *(int *)(iVar1 + 0x10)) {
return 0;
}
return 1;
}
undefined4 FUN_080025d4(void)
{
*(uint *)(DAT_080025e4 + 0x10) = *(uint *)(DAT_080025e4 + 0x10) | 0x80000000;
return 0;
}
undefined4 FUN_080025e8(uint param_1)
{
int iVar1;
int iVar2;
*(undefined4 *)(DAT_08002640 + 0x1c) = 0;
iVar1 = getCurrentTime();
while ((*(uint *)(DAT_08002644 + 0xc) & 0x10000) != 0) {
if ((param_1 != 0xffffffff) &&
((param_1 == 0 || (iVar2 = getCurrentTime(), param_1 < (uint)(iVar2 - iVar1))))) {
return 3;
}
}
if ((*(uint *)(DAT_08002644 + 0xc) & 1) != 0) {
*(undefined4 *)(DAT_08002644 + 0xc) = 1;
}
if ((*(uint *)(DAT_08002644 + 0xc) & 0x1f2) == 0) {
return 0;
}
FUN_080024fc();
return 1;
}
int FUN_08002648(int param_1,undefined4 param_2,uint param_3,undefined4 param_4)
{
int iVar1;
undefined8 uVar2;
undefined4 uVar3;
if (*(char *)(DAT_080026bc + 0x18) == '\x01') {
iVar1 = 2;
}
else {
*(undefined1 *)(DAT_080026bc + 0x18) = 1;
uVar3 = param_4;
uVar2 = FUN_080025e8(50000);
iVar1 = (int)uVar2;
if (iVar1 == 0) {
if (param_1 == 0) {
FUN_080024dc(param_2,param_3 & 0xff);
}
else if (param_1 == 1) {
FUN_080024b8(param_2,param_3 & 0xffff);
}
else if (param_1 == 2) {
FUN_08002494(param_2,param_3);
}
else {
FUN_08002464(param_2,(int)((ulonglong)uVar2 >> 0x20),param_3,param_4,uVar3);
}
iVar1 = FUN_080025e8(50000);
*(uint *)(DAT_080026c0 + 0x10) = *(uint *)(DAT_080026c0 + 0x10) & 0xfffffffe;
}
*(undefined1 *)(DAT_080026bc + 0x18) = 0;
}
return iVar1;
}
void FUN_080026c4(int param_1,uint param_2)
{
int iVar1;
iVar1 = DAT_0800270c;
if (param_2 == 1) {
param_2 = 0x100;
}
else if (param_2 == 2) {
param_2 = 0x200;
}
else if (param_2 != 0) {
param_2 = 0x300;
}
*(uint *)(DAT_0800270c + 0x10) = *(uint *)(DAT_0800270c + 0x10) & 0xfffffcff;
*(uint *)(iVar1 + 0x10) = *(uint *)(iVar1 + 0x10) | param_2;
*(uint *)(iVar1 + 0x10) = *(uint *)(iVar1 + 0x10) & 0xffffff07;
*(uint *)(iVar1 + 0x10) = *(uint *)(iVar1 + 0x10) | param_1 << 3 | 2;
*(uint *)(iVar1 + 0x10) = *(uint *)(iVar1 + 0x10) | 0x10000;
return;
}
// WARNING: Removing unreachable block (ram,0x080028de)
void FUN_08002710(uint *param_1,uint *param_2)
{
uint *puVar1;
uint *puVar2;
uint uVar3;
int iVar4;
uint uVar5;
uint uVar6;
uint uVar7;
int iVar8;
uVar5 = 0;
do {
uVar3 = 1 << (uVar5 & 0xff);
uVar7 = *param_2 & uVar3;
if ((uVar3 & ~*param_2) == 0) {
if ((param_2[1] & 3) - 1 < 2) {
param_1[2] = param_2[3] << (uVar5 << 1 & 0xff) | param_1[2] & ~(3 << (uVar5 << 1 & 0xff));
param_1[1] = ((param_2[1] << 0x1b) >> 0x1f) << (uVar5 & 0xff) | param_1[1] & ~uVar3;
}
if ((param_2[1] & 3) != 3) {
param_1[3] = param_2[2] << (uVar5 << 1 & 0xff) | param_1[3] & ~(3 << (uVar5 << 1 & 0xff));
}
if ((param_2[1] & 3) == 2) {
iVar8 = (uVar5 >> 3) + 8;
iVar4 = (uVar5 & 7) << 2;
param_1[iVar8] = param_2[4] << iVar4 | param_1[iVar8] & ~(0xf << iVar4);
}
*param_1 = (param_2[1] & 3) << (uVar5 << 1 & 0xff) | *param_1 & ~(3 << (uVar5 << 1 & 0xff));
if ((param_2[1] & 0x30000) != 0) {
*(uint *)(DAT_080028e8 + 0x44) = *(uint *)(DAT_080028e8 + 0x44) | 0x4000;
iVar8 = (uVar5 & 3) << 2;
if (param_1 == DAT_080028ec) {
iVar4 = 0;
}
else if (param_1 == DAT_080028ec + 0x100) {
iVar4 = 1;
}
else if (param_1 == DAT_080028ec + 0x200) {
iVar4 = 2;
}
else if (param_1 == DAT_080028ec + 0x300) {
iVar4 = 3;
}
else if (param_1 == DAT_080028ec + 0x400) {
iVar4 = 4;
}
else if (param_1 == DAT_080028ec + 0x500) {
iVar4 = 5;
}
else if (param_1 == DAT_080028ec + 0x600) {
iVar4 = 6;
}
else {
iVar4 = 7;
}
*(uint *)(DAT_080028e0 + ((uVar5 >> 2) + 2) * 4) =
iVar4 << iVar8 | *(uint *)(DAT_080028e0 + ((uVar5 >> 2) + 2) * 4) & ~(0xf << iVar8);
puVar1 = DAT_080028e4;
uVar3 = ~uVar7;
uVar6 = DAT_080028e4[2] & ~uVar7;
if ((param_2[1] & 0x100000) != 0) {
uVar6 = uVar7 | DAT_080028e4[2];
}
DAT_080028e4[2] = uVar6;
puVar2 = DAT_080028e4;
uVar6 = uVar3 & puVar1[3];
if ((param_2[1] & 0x200000) != 0) {
uVar6 = uVar7 | puVar1[3];
}
DAT_080028e4[3] = uVar6;
puVar1 = DAT_080028e4;
uVar6 = uVar3 & puVar2[1];
if ((param_2[1] & 0x20000) != 0) {
uVar6 = uVar7 | puVar2[1];
}
DAT_080028e4[1] = uVar6;
uVar3 = uVar3 & *puVar1;
if ((param_2[1] & 0x10000) != 0) {
uVar3 = uVar7 | *puVar1;
}
*DAT_080028e4 = uVar3;
}
}
uVar5 = uVar5 + 1;
} while (uVar5 < 0x10);
return;
}
void FUN_080028f0(int *param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
*(uint *)*param_1 = *(uint *)*param_1 & 0xfffbffff;
*(undefined4 *)(*param_1 + 4) = param_4;
if (param_1[2] == 0x40) {
*(undefined4 *)(*param_1 + 8) = param_3;
*(undefined4 *)(*param_1 + 0xc) = param_2;
}
else {
*(undefined4 *)(*param_1 + 8) = param_2;
*(undefined4 *)(*param_1 + 0xc) = param_3;
}
return;
}
uint FUN_0800291c(uint *param_1)
{
uint uVar1;
uint uVar2;
uVar2 = *param_1;
uVar1 = (uVar2 & 0xff) - 0x10;
param_1[0x17] =
(uint)*(byte *)(DAT_08002954 + (uint)((ulonglong)DAT_08002950 * (ulonglong)uVar1 >> 0x24));
if (uVar1 < 0x60) {
param_1[0x16] = uVar2 & 0xfffffc00;
}
else {
param_1[0x16] = (uVar2 & 0xfffffc00) + 4;
}
return param_1[0x16];
}
undefined4 FUN_08002958(int param_1)
{
uint uVar1;
uVar1 = *(uint *)(param_1 + 0x28);
if (*(int *)(param_1 + 0x18) == 0) {
if (uVar1 == 1) {
if (*(int *)(param_1 + 0x2c) == 0x1800000) {
return 1;
}
return 0;
}
if ((uVar1 != 2) && (uVar1 != 0)) {
return 0;
}
if ((*(uint *)(param_1 + 0x2c) & 0x1000000) != 0) {
return 1;
}
return 0;
}
if (*(int *)(param_1 + 0x18) == 0x2000) {
switch(uVar1) {
case 0:
case 2:
return 1;
case 1:
goto switchD_080029a2_caseD_1;
case 3:
if (*(int *)(param_1 + 0x2c) == 0x1800000) {
return 1;
}
return 0;
default:
return 0;
}
}
if (2 < uVar1) {
if (uVar1 != 3) {
return 0;
}
if ((*(uint *)(param_1 + 0x2c) & 0x1000000) != 0) {
return 1;
}
return 0;
}
return 1;
switchD_080029a2_caseD_1:
if ((*(uint *)(param_1 + 0x2c) & 0x1000000) != 0) {
return 1;
}
return 0;
}
undefined4 FUN_080029e8(int *param_1)
{
int iVar1;
int iVar2;
undefined4 uVar3;
uint uVar4;
uint *puVar5;
iVar1 = getCurrentTime();
if (param_1 == (int *)0x0) {
uVar3 = 1;
}
else {
*(undefined1 *)((int)param_1 + 0x35) = 2;
*(undefined1 *)(param_1 + 0xd) = 0;
*(uint *)*param_1 = *(uint *)*param_1 & 0xfffffffe;
do {
puVar5 = (uint *)*param_1;
if ((*puVar5 & 1) == 0) {
uVar4 = param_1[1] | param_1[2] | param_1[3] | param_1[4] | param_1[5] | param_1[6] |
param_1[7] | param_1[8] | DAT_08002ab0 & *puVar5;
if (param_1[9] == 4) {
uVar4 = uVar4 | param_1[0xb] | param_1[0xc];
}
*puVar5 = uVar4;
iVar1 = *param_1;
uVar4 = *(uint *)(iVar1 + 0x14) & 0xfffffff8 | param_1[9];
if (((param_1[9] == 4) && (uVar4 = uVar4 | param_1[10], param_1[0xb] != 0)) &&
(iVar2 = FUN_08002958(param_1), iVar2 != 0)) {
param_1[0x15] = 0x40;
*(undefined1 *)((int)param_1 + 0x35) = 1;
return 1;
}
*(uint *)(iVar1 + 0x14) = uVar4;
iVar1 = FUN_0800291c(param_1);
*(int *)(iVar1 + 8) = 0x3f << (param_1[0x17] & 0xffU);
param_1[0x15] = 0;
*(undefined1 *)((int)param_1 + 0x35) = 1;
return 0;
}
iVar2 = getCurrentTime();
} while ((uint)(iVar2 - iVar1) < 6);
param_1[0x15] = 0x20;
uVar3 = 3;
*(undefined1 *)((int)param_1 + 0x35) = 3;
}
return uVar3;
}
undefined4 FUN_08002ab4(undefined4 *param_1)
{
undefined4 uVar1;
int iVar2;
iVar2 = param_1[0x16];
if (*(char *)(param_1 + 0xd) == '\x01') {
uVar1 = 2;
}
else {
*(undefined1 *)(param_1 + 0xd) = 1;
if (*(char *)((int)param_1 + 0x35) == '\x01') {
*(undefined1 *)((int)param_1 + 0x35) = 2;
param_1[0x15] = 0;
FUN_080028f0(param_1);
*(int *)(iVar2 + 8) = 0x3f << (param_1[0x17] & 0xff);
*(uint *)*param_1 = *(uint *)*param_1 | 0x16;
if (param_1[0x10] != 0) {
*(uint *)*param_1 = *(uint *)*param_1 | 8;
}
*(uint *)*param_1 = *(uint *)*param_1 | 1;
uVar1 = 0;
}
else {
*(undefined1 *)(param_1 + 0xd) = 0;
uVar1 = 2;
}
}
return uVar1;
}
undefined4 FUN_08002b1e(int *param_1)
{
int iVar1;
undefined4 uVar2;
int iVar3;
int iVar4;
iVar4 = param_1[0x16];
iVar1 = getCurrentTime();
if (*(char *)((int)param_1 + 0x35) == '\x02') {
*(uint *)*param_1 = *(uint *)*param_1 & 0xffffffe9;
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 0xffffff7f;
if ((param_1[0x10] != 0) || (param_1[0x12] != 0)) {
*(uint *)*param_1 = *(uint *)*param_1 & 0xfffffff7;
}
*(uint *)*param_1 = *(uint *)*param_1 & 0xfffffffe;
do {
if ((*(uint *)*param_1 & 1) == 0) {
*(int *)(iVar4 + 8) = 0x3f << (param_1[0x17] & 0xffU);
*(undefined1 *)((int)param_1 + 0x35) = 1;
*(undefined1 *)(param_1 + 0xd) = 0;
return 0;
}
iVar3 = getCurrentTime();
} while ((uint)(iVar3 - iVar1) < 6);
param_1[0x15] = 0x20;
uVar2 = 3;
*(undefined1 *)((int)param_1 + 0x35) = 3;
*(undefined1 *)(param_1 + 0xd) = 0;
}
else {
param_1[0x15] = 0x80;
*(undefined1 *)(param_1 + 0xd) = 0;
uVar2 = 1;
}
return uVar2;
}
undefined4 FUN_08002bb2(undefined4 *param_1)
{
if (*(char *)((int)param_1 + 0x35) != '\x02') {
param_1[0x15] = 0x80;
return 1;
}
*(undefined1 *)((int)param_1 + 0x35) = 5;
*(uint *)*param_1 = *(uint *)*param_1 & 0xfffffffe;
return 0;
}
void ADC_HandleConversionComplete(int *param_1)
{
ulonglong uVar1;
uint *puVar2;
uint uVar3;
uint uVar4;
uint uVar5;
uint *puVar6;
uint local_1c;
local_1c = 0;
uVar4 = *DAT_08002dac;
uVar1 = (ulonglong)DAT_08002db0;
puVar6 = (uint *)param_1[0x16];
uVar5 = *puVar6;
if (((8 << (param_1[0x17] & 0xffU) & uVar5) != 0) &&
(puVar2 = (uint *)*param_1, (*puVar2 & 4) != 0)) {
*puVar2 = *puVar2 & 0xfffffffb;
puVar6[2] = 8 << (param_1[0x17] & 0xffU);
param_1[0x15] = param_1[0x15] | 1;
}
uVar3 = 1 << (param_1[0x17] & 0xffU);
if (((uVar3 & uVar5) != 0) && ((*(uint *)(*param_1 + 0x14) & 0x80) != 0)) {
puVar6[2] = uVar3;
param_1[0x15] = param_1[0x15] | 2;
}
uVar3 = 4 << (param_1[0x17] & 0xffU);
if (((uVar3 & uVar5) != 0) && ((*(uint *)*param_1 & 2) != 0)) {
puVar6[2] = uVar3;
param_1[0x15] = param_1[0x15] | 4;
}
uVar3 = 0x10 << (param_1[0x17] & 0xffU);
if (((uVar3 & uVar5) != 0) && ((*(uint *)*param_1 & 8) != 0)) {
puVar6[2] = uVar3;
puVar2 = (uint *)*param_1;
if ((*puVar2 & 0x40000) == 0) {
if ((*puVar2 & 0x100) == 0) {
*puVar2 = *puVar2 & 0xfffffff7;
}
if ((code *)param_1[0x10] != (code *)0x0) {
(*(code *)param_1[0x10])(param_1);
}
}
else if ((*puVar2 & 0x80000) == 0) {
if ((code *)param_1[0x10] != (code *)0x0) {
(*(code *)param_1[0x10])(param_1);
}
}
else if ((code *)param_1[0x12] != (code *)0x0) {
(*(code *)param_1[0x12])(param_1);
}
}
uVar3 = 0x20 << (param_1[0x17] & 0xffU);
if (((uVar3 & uVar5) != 0) && ((*(uint *)*param_1 & 0x10) != 0)) {
puVar6[2] = uVar3;
if (*(char *)((int)param_1 + 0x35) == '\x05') {
*(uint *)*param_1 = *(uint *)*param_1 & 0xffffffe9;
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 0xffffff7f;
if ((param_1[0x10] != 0) || (param_1[0x12] != 0)) {
*(uint *)*param_1 = *(uint *)*param_1 & 0xfffffff7;
}
puVar6[2] = 0x3f << (param_1[0x17] & 0xffU);
*(undefined1 *)((int)param_1 + 0x35) = 1;
*(undefined1 *)(param_1 + 0xd) = 0;
if ((code *)param_1[0x14] == (code *)0x0) {
return;
}
(*(code *)param_1[0x14])(param_1);
return;
}
puVar6 = (uint *)*param_1;
if ((*puVar6 & 0x40000) == 0) {
if ((*puVar6 & 0x100) == 0) {
*puVar6 = *puVar6 & 0xffffffef;
*(undefined1 *)((int)param_1 + 0x35) = 1;
*(undefined1 *)(param_1 + 0xd) = 0;
}
if ((code *)param_1[0xf] != (code *)0x0) {
(*(code *)param_1[0xf])(param_1);
}
}
else if ((*puVar6 & 0x80000) == 0) {
if ((code *)param_1[0x11] != (code *)0x0) {
(*(code *)param_1[0x11])(param_1);
}
}
else if ((code *)param_1[0xf] != (code *)0x0) {
(*(code *)param_1[0xf])(param_1);
}
}
if (param_1[0x15] != 0) {
if ((param_1[0x15] & 1U) != 0) {
*(undefined1 *)((int)param_1 + 0x35) = 5;
*(uint *)*param_1 = *(uint *)*param_1 & 0xfffffffe;
do {
local_1c = local_1c + 1;
if ((uint)(uVar1 * uVar4 >> 0x2a) < local_1c) break;
} while ((*(uint *)*param_1 & 1) != 0);
*(undefined1 *)((int)param_1 + 0x35) = 1;
*(undefined1 *)(param_1 + 0xd) = 0;
}
if ((code *)param_1[0x13] != (code *)0x0) {
(*(code *)param_1[0x13])(param_1);
}
}
return;
}
void ADC_StartConversion(void)
{
*(undefined4 *)(ADC1 + 0x20) = 1;
return;
}
void FUN_08002dd0(uint param_1)
{
if (-1 < (int)param_1) {
*(int *)(DAT_08002de8 + (param_1 >> 5) * 4) = 1 << (param_1 & 0x1f);
}
return;
}
void FUN_08002dec(uint param_1,int param_2)
{
if (-1 < (int)param_1) {
*(char *)(param_1 + 0xe000e400) = (char)(param_2 << 4);
return;
}
*(char *)(DAT_08002e10 + (param_1 & 0xf)) = (char)(param_2 << 4);
return;
}
uint FUN_08002e14(uint param_1,uint param_2,uint param_3)
{
uint uVar1;
param_1 = param_1 & 7;
uVar1 = 7 - param_1;
if (3 < uVar1) {
uVar1 = 4;
}
if (param_1 + 4 < 7) {
param_1 = 0;
}
else {
param_1 = param_1 - 3;
}
return (param_2 & ~(-1 << (uVar1 & 0xff))) << (param_1 & 0xff) |
param_3 & ~(-1 << (param_1 & 0xff));
}
void DAC_Init(uint param_1)
{
*(uint *)(DAC_CR + 0xc) = *(uint *)(DAC_CR + 0xc) & 0xf8ff | (param_1 & 7) << 8 | 0x5fa0000;
return;
}
void FUN_08002e78(undefined4 param_1)
{
undefined4 uVar1;
uVar1 = FUN_08002e14((uint)(*(int *)(DAT_08002e94 + 0xc) << 0x15) >> 0x1d);
FUN_08002dec(param_1,uVar1);
return;
}
void FUN_08002e98(void)
{
FUN_08002dd0();
return;
}
// WARNING: Globals starting with '_' overlap smaller symbols at the same address
undefined4 configureSysExInterrupt(int priority)
{
if (priority - 1U < 0x1000000) {
_DAT_e000e014 = priority - 1U;
*(undefined1 *)(DAT_08002ec4 + 0x23) = 0xf0;
_sysExStatus = 0;
_sysExConfig = 7;
return 0;
}
return 1;
}
undefined4 FUN_08002ec8(uint param_1)
{
int iVar1;
undefined4 uVar2;
iVar1 = configureSysExInterrupt(*DAT_08002f0c / (1000 / *DAT_08002f08));
if (iVar1 == 0) {
if (param_1 < 0x10) {
FUN_08002e78(0xffffffff,param_1,0);
*DAT_08002f10 = param_1;
uVar2 = 0;
}
else {
uVar2 = 1;
}
}
else {
uVar2 = 1;
}
return uVar2;
}
undefined4 Configure_DAC_Interface(void)
{
uint *puVar1;
puVar1 = DAT_08002f44;
*DAT_08002f44 = *DAT_08002f44 | 0x200;
*puVar1 = *puVar1 | 0x400;
*puVar1 = *puVar1 | 0x100;
DAC_Init(3);
FUN_08002ec8(0xf);
ADC_Init();
return 0;
}
void FUN_08002f48(void)
{
*DAT_08002f58 = (uint)*DAT_08002f5c + *DAT_08002f58;
return;
}
undefined4 getCurrentTime(void)
{
return *DAT_08002f68;
}
void FUN_08002f6c(uint param_1)
{
int iVar1;
int iVar2;
iVar1 = getCurrentTime();
if (param_1 != 0xffffffff) {
param_1 = param_1 + *DAT_08002f90;
}
do {
iVar2 = getCurrentTime();
} while ((uint)(iVar2 - iVar1) < param_1);
return;
}
void FUN_08002f94(int param_1,uint param_2,int param_3)
{
uint uVar1;
uVar1 = *(uint *)(param_1 + 0x20);
*(uint *)(param_1 + 0x20) = *(uint *)(param_1 + 0x20) & 0xfffffffe;
*(uint *)(param_1 + 0x18) = *(uint *)(param_1 + 0x18) & 0xffffff0f | param_3 << 4;
*(uint *)(param_1 + 0x20) = uVar1 & 0xfffffff5 | param_2;
return;
}
void FUN_08002fba(int param_1,int param_2,int param_3)
{
uint uVar1;
uVar1 = *(uint *)(param_1 + 0x20);
*(uint *)(param_1 + 0x20) = *(uint *)(param_1 + 0x20) & 0xffffffef;
*(uint *)(param_1 + 0x18) = *(uint *)(param_1 + 0x18) & 0xffff0fff | param_3 << 0xc;
*(uint *)(param_1 + 0x20) = uVar1 & 0xffffff5f | param_2 << 4;
return;
}
void FUN_08002fe2(int param_1,uint param_2)
{
*(uint *)(param_1 + 8) = *(uint *)(param_1 + 8) & 0xffffff8f | param_2 | 7;
return;
}
undefined4 DAC_UpdateOutput(int *param_1)
{
uint *puVar1;
if (*(char *)((int)param_1 + 0x3d) != '\x01') {
return 1;
}
*(undefined1 *)((int)param_1 + 0x3d) = 2;
*(uint *)(*param_1 + 0xc) = *(uint *)(*param_1 + 0xc) | 1;
puVar1 = (uint *)*param_1;
if (((((puVar1 != DAT_08003078) && (puVar1 != (uint *)0x40000000)) &&
(puVar1 != DAT_08003078 + -0x3f00)) &&
((puVar1 != DAT_08003078 + -0x3e00 && (puVar1 != DAT_08003078 + -0x3d00)))) &&
((puVar1 != DAT_08003078 + 0x100 &&
((puVar1 != DAT_08003078 + 0x1000 && (puVar1 != DAT_08003078 + -0x3a00)))))) {
*puVar1 = *puVar1 | 1;
return 0;
}
if ((puVar1[2] & 7) != 6) {
*puVar1 = *puVar1 | 1;
return 0;
}
return 0;
}
void FUN_0800307c(void)
{
return;
}
void FUN_0800307e(void)
{
return;
}
void FUN_08003080(void)
{
return;
}
void FUN_08003082(void)
{
return;
}
void FUN_08003084(int *param_1)
{
int iVar1;
uint uVar2;
uint uVar3;
iVar1 = *param_1;
uVar3 = *(uint *)(iVar1 + 0xc);
uVar2 = *(uint *)(iVar1 + 0x10);
if (((uVar2 & 2) != 0) && ((uVar3 & 2) != 0)) {
*(undefined4 *)(iVar1 + 0x10) = 0xfffffffd;
*(undefined1 *)(param_1 + 7) = 1;
if ((*(uint *)(*param_1 + 0x18) & 3) == 0) {
FUN_0800307c();
FUN_08003080(param_1);
}
else {
FUN_0800307e();
}
*(undefined1 *)(param_1 + 7) = 0;
}
if (((uVar2 & 4) != 0) && ((uVar3 & 4) != 0)) {
*(undefined4 *)(*param_1 + 0x10) = 0xfffffffb;
*(undefined1 *)(param_1 + 7) = 2;
if ((*(uint *)(*param_1 + 0x18) & 0x300) == 0) {
FUN_0800307c(param_1);
FUN_08003080(param_1);
}
else {
FUN_0800307e(param_1);
}
*(undefined1 *)(param_1 + 7) = 0;
}
if (((uVar2 & 8) != 0) && ((uVar3 & 8) != 0)) {
*(undefined4 *)(*param_1 + 0x10) = 0xfffffff7;
*(undefined1 *)(param_1 + 7) = 4;
if ((*(uint *)(*param_1 + 0x1c) & 3) == 0) {
FUN_0800307c(param_1);
FUN_08003080(param_1);
}
else {
FUN_0800307e(param_1);
}
*(undefined1 *)(param_1 + 7) = 0;
}
if (((uVar2 & 0x10) != 0) && ((uVar3 & 0x10) != 0)) {
*(undefined4 *)(*param_1 + 0x10) = 0xffffffef;
*(undefined1 *)(param_1 + 7) = 8;
if ((*(uint *)(*param_1 + 0x1c) & 0x300) == 0) {
FUN_0800307c(param_1);
FUN_08003080(param_1);
}
else {
FUN_0800307e(param_1);
}
*(undefined1 *)(param_1 + 7) = 0;
}
if (((uVar2 & 1) != 0) && ((uVar3 & 1) != 0)) {
*(undefined4 *)(*param_1 + 0x10) = 0xfffffffe;
FUN_08000e54(param_1);
}
if (((uVar2 & 0x80) != 0) && ((uVar3 & 0x80) != 0)) {
*(undefined4 *)(*param_1 + 0x10) = 0xffffff7f;
FUN_080034ba(param_1);
}
if (((uVar2 & 0x40) != 0) && ((uVar3 & 0x40) != 0)) {
*(undefined4 *)(*param_1 + 0x10) = 0xffffffbf;
FUN_08003082(param_1);
}
if (((uVar2 & 0x20) != 0) && ((uVar3 & 0x20) != 0)) {
*(undefined4 *)(*param_1 + 0x10) = 0xffffffdf;
FUN_080034b8(param_1);
}
return;
}
void FUN_080031e4(uint *param_1,uint *param_2)
{
uint uVar1;
uVar1 = *param_1;
if (((((param_1 == DAT_080032b8) || (param_1 == (uint *)0x40000000)) ||
(param_1 == DAT_080032b8 + -0x3f00)) ||
((param_1 == DAT_080032b8 + -0x3e00 || (param_1 == DAT_080032b8 + -0x3d00)))) ||
(param_1 == DAT_080032b8 + 0x100)) {
uVar1 = uVar1 & 0xffffff8f | param_2[1];
}
if (((((param_1 == DAT_080032b8) || (param_1 == (uint *)0x40000000)) ||
((param_1 == DAT_080032b8 + -0x3f00 ||
(((param_1 == DAT_080032b8 + -0x3e00 || (param_1 == DAT_080032b8 + -0x3d00)) ||
(param_1 == DAT_080032b8 + 0x100)))))) ||
((param_1 == DAT_080032b8 + 0x1000 || (param_1 == DAT_080032b8 + 0x1100)))) ||
((param_1 == DAT_080032b8 + 0x1200 ||
(((param_1 == DAT_080032b8 + -0x3a00 || (param_1 == DAT_080032b8 + -0x3900)) ||
(param_1 == DAT_080032b8 + -0x3800)))))) {
uVar1 = uVar1 & 0xfffffcff | param_2[3];
}
*param_1 = uVar1 & 0xffffff7f | param_2[5];
param_1[0xb] = param_2[2];
param_1[10] = *param_2;
if ((param_1 == DAT_080032b8) || (param_1 == DAT_080032b8 + 0x100)) {
param_1[0xc] = param_2[4];
}
param_1[5] = 1;
if ((param_1[4] & 1) != 0) {
param_1[4] = param_1[4] & 0xfffffffe;
}
return;
}
undefined4 FUN_080032bc(undefined4 *param_1)
{
if (param_1 != (undefined4 *)0x0) {
if (*(char *)((int)param_1 + 0x3d) == '\0') {
*(undefined1 *)(param_1 + 0xf) = 0;
FUN_08001698();
}
*(undefined1 *)((int)param_1 + 0x3d) = 2;
FUN_080031e4(*param_1,param_1 + 1);
*(undefined1 *)((int)param_1 + 0x46) = 1;
*(undefined1 *)((int)param_1 + 0x3e) = 1;
*(undefined1 *)((int)param_1 + 0x3f) = 1;
*(undefined1 *)(param_1 + 0x10) = 1;
*(undefined1 *)((int)param_1 + 0x41) = 1;
*(undefined1 *)((int)param_1 + 0x42) = 1;
*(undefined1 *)((int)param_1 + 0x43) = 1;
*(undefined1 *)(param_1 + 0x11) = 1;
*(undefined1 *)((int)param_1 + 0x45) = 1;
*(undefined1 *)((int)param_1 + 0x3d) = 1;
return 0;
}
return 1;
}
void FUN_08003314(int param_1,uint param_2,uint param_3,int param_4)
{
*(uint *)(param_1 + 8) = param_3 | param_4 << 8 | param_2 | *(uint *)(param_1 + 8) & 0xffff00ff;
return;
}
undefined4 FUN_0800332e(int *param_1,uint *param_2)
{
undefined4 uVar1;
uint uVar2;
if ((char)param_1[0xf] == '\x01') {
return 2;
}
*(undefined1 *)(param_1 + 0xf) = 1;
*(undefined1 *)((int)param_1 + 0x3d) = 2;
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) & 0xffff0088;
uVar2 = *param_2;
if (uVar2 == 0x60) {
FUN_08002fba(*param_1,param_2[1],param_2[3]);
FUN_08002fe2(*param_1,0x60);
uVar1 = 0;
}
else if (uVar2 < 0x61) {
if (uVar2 == 0x40) {
FUN_08002f94(*param_1,param_2[1],param_2[3]);
FUN_08002fe2(*param_1,0x40);
uVar1 = 0;
}
else if (uVar2 < 0x41) {
if (uVar2 != 0x20) {
if (uVar2 < 0x21) {
if ((uVar2 != 0) && (uVar2 != 0x10)) {
uVar1 = 1;
goto LAB_080033cc;
}
}
else if (uVar2 != 0x30) {
uVar1 = 1;
goto LAB_080033cc;
}
}
FUN_08002fe2(*param_1,uVar2);
uVar1 = 0;
}
else if (uVar2 == 0x50) {
FUN_08002f94(*param_1,param_2[1],param_2[3]);
FUN_08002fe2(*param_1,0x50);
uVar1 = 0;
}
else {
uVar1 = 1;
}
}
else if (uVar2 == 0x1000) {
uVar1 = 0;
}
else if (uVar2 == 0x2000) {
FUN_08003314(*param_1,param_2[2],param_2[1],param_2[3]);
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) | 0x4000;
uVar1 = 0;
}
else if (uVar2 == 0x70) {
FUN_08003314(*param_1,param_2[2],param_2[1],param_2[3]);
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) | 0x77;
uVar1 = 0;
}
else {
uVar1 = 1;
}
LAB_080033cc:
*(undefined1 *)((int)param_1 + 0x3d) = 1;
*(undefined1 *)(param_1 + 0xf) = 0;
return uVar1;
}
undefined4 FUN_0800342c(int *param_1,uint *param_2)
{
int iVar1;
int iVar2;
if ((char)param_1[0xf] != '\x01') {
*(undefined1 *)(param_1 + 0xf) = 1;
*(undefined1 *)((int)param_1 + 0x3d) = 2;
iVar1 = *param_1;
*(uint *)(iVar1 + 4) = *param_2 | *(uint *)(iVar1 + 4) & 0xffffff8f;
iVar2 = *param_1;
if (((((iVar2 == DAT_080034b4) || (iVar2 == 0x40000000)) || (iVar2 == DAT_080034b4 + -0xfc00))
|| ((iVar2 == DAT_080034b4 + -0xf800 || (iVar2 == DAT_080034b4 + -0xf400)))) ||
((iVar2 == DAT_080034b4 + 0x400 ||
((iVar2 == DAT_080034b4 + 0x4000 || (iVar2 == DAT_080034b4 + -0xe800)))))) {
*(uint *)(iVar2 + 8) = param_2[1] | *(uint *)(iVar1 + 8) & 0xffffff7f;
}
*(undefined1 *)((int)param_1 + 0x3d) = 1;
*(undefined1 *)(param_1 + 0xf) = 0;
return 0;
}
return 2;
}
void FUN_080034b8(void)
{
return;
}
void FUN_080034ba(void)
{
return;
}
void FUN_080034bc(void)
{
*(uint *)(DAT_080034cc + 0x88) = *(uint *)(DAT_080034cc + 0x88) | 0xf00000;
return;
}
void FUN_080034d0(int *param_1)
{
bool bVar1;
uint *puVar2;
uint *puVar3;
do {
puVar3 = (uint *)(*param_1 + 0xc);
ExclusiveAccess(puVar3);
puVar2 = (uint *)(*param_1 + 0xc);
bVar1 = (bool)hasExclusiveAccess(puVar2);
} while (!bVar1);
*puVar2 = *puVar3 & 0xffffff3f;
*(undefined1 *)((int)param_1 + 0x41) = 0x20;
return;
}
void FUN_080034f0(int *param_1)
{
bool bVar1;
uint *puVar2;
uint *puVar3;
do {
puVar3 = (uint *)(*param_1 + 0xc);
ExclusiveAccess(puVar3);
puVar2 = (uint *)(*param_1 + 0xc);
bVar1 = (bool)hasExclusiveAccess(puVar2);
} while (!bVar1);
*puVar2 = *puVar3 & 0xfffffedf;
do {
puVar3 = (uint *)(*param_1 + 0x14);
ExclusiveAccess(puVar3);
puVar2 = (uint *)(*param_1 + 0x14);
bVar1 = (bool)hasExclusiveAccess(puVar2);
} while (!bVar1);
*puVar2 = *puVar3 & 0xfffffffe;
if (param_1[0xc] == 1) {
do {
puVar3 = (uint *)(*param_1 + 0xc);
ExclusiveAccess(puVar3);
puVar2 = (uint *)(*param_1 + 0xc);
bVar1 = (bool)hasExclusiveAccess(puVar2);
} while (!bVar1);
*puVar2 = *puVar3 & 0xffffffef;
}
*(undefined1 *)((int)param_1 + 0x42) = 0x20;
param_1[0xc] = 0;
return;
}
undefined4 FUN_0800354c(int *param_1)
{
short sVar1;
byte *pbVar2;
if (*(char *)((int)param_1 + 0x41) != '!') {
return 2;
}
if ((param_1[2] == 0x1000) && (param_1[4] == 0)) {
*(uint *)(*param_1 + 4) = *(ushort *)param_1[8] & 0x1ff;
param_1[8] = param_1[8] + 2;
}
else {
pbVar2 = (byte *)param_1[8];
param_1[8] = (int)(pbVar2 + 1);
*(uint *)(*param_1 + 4) = (uint)*pbVar2;
}
sVar1 = *(short *)((int)param_1 + 0x26) + -1;
*(short *)((int)param_1 + 0x26) = sVar1;
if (sVar1 == 0) {
*(uint *)(*param_1 + 0xc) = *(uint *)(*param_1 + 0xc) & 0xffffff7f;
*(uint *)(*param_1 + 0xc) = *(uint *)(*param_1 + 0xc) | 0x40;
}
return 0;
}
void FUN_080035ac(int *param_1)
{
uint uVar1;
uint uVar2;
*(uint *)(*param_1 + 0x10) = *(uint *)(*param_1 + 0x10) & 0xffffcfff | param_1[3];
*(uint *)(*param_1 + 0xc) =
*(uint *)(*param_1 + 0xc) & 0xffff69f3 | param_1[4] | param_1[2] | param_1[5] | param_1[7];
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 0xfffffcff | param_1[6];
if ((*param_1 == DAT_080036b4) || (*param_1 == DAT_080036b4 + 0x400)) {
uVar1 = FUN_080019fc();
}
else {
uVar1 = FUN_080019dc();
}
if (param_1[7] == 0x8000) {
uVar2 = param_1[1];
uVar1 = FUN_08000ca8(uVar1 * 0x19,
(((uint)CARRY4(uVar1,uVar1) + (uint)CARRY4(uVar1 * 2,uVar1)) * 8 |
uVar1 * 3 >> 0x1d) + (uint)CARRY4(uVar1 * 0x18,uVar1),uVar2 * 2,
CARRY4(uVar2,uVar2));
uVar2 = (uint)((ulonglong)DAT_080036b8 * (ulonglong)uVar1 >> 0x25);
uVar1 = (uint)((ulonglong)DAT_080036b8 * (ulonglong)((uVar1 + uVar2 * -100) * 8 + 0x32) >> 0x25)
;
*(uint *)(*param_1 + 8) = (uVar1 & 7) + (uVar1 & 0xf8) * 2 + uVar2 * 0x10;
}
else {
uVar1 = FUN_08000ca8(uVar1 * 0x19,
(((uint)CARRY4(uVar1,uVar1) + (uint)CARRY4(uVar1 * 2,uVar1)) * 8 |
uVar1 * 3 >> 0x1d) + (uint)CARRY4(uVar1 * 0x18,uVar1),param_1[1] << 2,
(uint)param_1[1] >> 0x1e);
uVar2 = (uint)((ulonglong)DAT_080036b8 * (ulonglong)uVar1 >> 0x25);
uVar1 = (uint)((ulonglong)DAT_080036b8 * (ulonglong)((uVar1 + uVar2 * -100) * 0x10 + 0x32) >>
0x25);
*(uint *)(*param_1 + 8) = (uVar1 & 0xf) + (uVar1 & 0xf0) + uVar2 * 0x10;
}
return;
}
undefined4 FUN_080036bc(undefined4 *param_1,uint param_2,uint param_3,int param_4,uint param_5)
{
uint *puVar1;
undefined8 uVar2;
do {
do {
if (((param_2 & ~*(uint *)*param_1) == 0) != param_3) {
return 0;
}
} while (param_5 == 0xffffffff);
uVar2 = getCurrentTime();
if (param_5 < (uint)((int)uVar2 - param_4)) {
return 3;
}
if (param_5 == 0) {
return 3;
}
puVar1 = (uint *)*param_1;
} while (((((puVar1[3] & 4) == 0) || (param_2 == 0x80)) || (param_2 == 0x40)) ||
((*puVar1 & 8) == 0));
FUN_080034f0(param_1,(int)((ulonglong)uVar2 >> 0x20),*puVar1,puVar1[1]);
param_1[0x11] = 8;
*(undefined1 *)(param_1 + 0x10) = 0;
return 1;
}
undefined4 FUN_08003742(int *param_1)
{
if (param_1 != (int *)0x0) {
if (*(char *)((int)param_1 + 0x41) == '\0') {
*(undefined1 *)(param_1 + 0x10) = 0;
FUN_0800170c();
}
*(undefined1 *)((int)param_1 + 0x41) = 0x24;
*(uint *)(*param_1 + 0xc) = *(uint *)(*param_1 + 0xc) & 0xffffdfff;
FUN_080035ac(param_1);
*(uint *)(*param_1 + 0x10) = *(uint *)(*param_1 + 0x10) & 0xffffb7ff;
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 0xffffffd5;
*(uint *)(*param_1 + 0xc) = *(uint *)(*param_1 + 0xc) | 0x2000;
param_1[0x11] = 0;
*(undefined1 *)((int)param_1 + 0x41) = 0x20;
*(undefined1 *)((int)param_1 + 0x42) = 0x20;
param_1[0xd] = 0;
return 0;
}
return 1;
}
undefined4 FUN_080037a2(int *param_1,ushort *param_2,int param_3,undefined4 param_4)
{
undefined4 uVar1;
int iVar2;
ushort *puVar3;
ushort *puVar4;
if (*(char *)((int)param_1 + 0x41) == ' ') {
if (param_2 == (ushort *)0x0) {
uVar1 = 1;
}
else if (param_3 == 0) {
uVar1 = 1;
}
else {
param_1[0x11] = 0;
*(undefined1 *)((int)param_1 + 0x41) = 0x21;
uVar1 = getCurrentTime();
*(short *)(param_1 + 9) = (short)param_3;
*(short *)((int)param_1 + 0x26) = (short)param_3;
puVar3 = param_2;
if (param_1[2] == 0x1000) {
if (param_1[4] == 0) {
puVar3 = (ushort *)0x0;
}
else {
param_2 = (ushort *)0x0;
}
}
else {
param_2 = (ushort *)0x0;
}
while (*(short *)((int)param_1 + 0x26) != 0) {
iVar2 = FUN_080036bc(param_1,0x80,0,uVar1,param_4);
if (iVar2 != 0) {
*(undefined1 *)((int)param_1 + 0x41) = 0x20;
return 3;
}
if (puVar3 == (ushort *)0x0) {
puVar4 = param_2 + 1;
*(uint *)(*param_1 + 4) = *param_2 & 0x1ff;
}
else {
*(uint *)(*param_1 + 4) = (uint)(byte)*puVar3;
puVar3 = (ushort *)((int)puVar3 + 1);
puVar4 = param_2;
}
*(short *)((int)param_1 + 0x26) = *(short *)((int)param_1 + 0x26) + -1;
param_2 = puVar4;
}
iVar2 = FUN_080036bc(param_1,0x40,0,uVar1,param_4);
if (iVar2 == 0) {
*(undefined1 *)((int)param_1 + 0x41) = 0x20;
uVar1 = 0;
}
else {
*(undefined1 *)((int)param_1 + 0x41) = 0x20;
uVar1 = 3;
}
}
}
else {
uVar1 = 2;
}
return uVar1;
}
undefined4 FUN_08003870(int *param_1,int param_2,int param_3,undefined4 param_4)
{
bool bVar1;
undefined4 uVar2;
uint *puVar3;
uint *puVar4;
if (*(char *)((int)param_1 + 0x41) == ' ') {
if (param_2 == 0) {
uVar2 = 1;
}
else if (param_3 == 0) {
uVar2 = 1;
}
else {
param_1[8] = param_2;
*(short *)(param_1 + 9) = (short)param_3;
*(short *)((int)param_1 + 0x26) = (short)param_3;
param_1[0x11] = 0;
*(undefined1 *)((int)param_1 + 0x41) = 0x21;
*(undefined4 *)(param_1[0xe] + 0x3c) = DAT_080038e8;
*(undefined4 *)(param_1[0xe] + 0x40) = DAT_080038ec;
*(undefined4 *)(param_1[0xe] + 0x4c) = DAT_080038f0;
*(undefined4 *)(param_1[0xe] + 0x50) = 0;
FUN_08002ab4(param_1[0xe],param_2,*param_1 + 4,param_3,param_4);
*(undefined4 *)*param_1 = 0xffffffbf;
do {
puVar4 = (uint *)(*param_1 + 0x14);
ExclusiveAccess(puVar4);
puVar3 = (uint *)(*param_1 + 0x14);
bVar1 = (bool)hasExclusiveAccess(puVar3);
} while (!bVar1);
*puVar3 = *puVar4 | 0x80;
uVar2 = 0;
}
}
else {
uVar2 = 2;
}
return uVar2;
}
undefined4 FUN_08003940(int *param_1)
{
*(uint *)(*param_1 + 0xc) = *(uint *)(*param_1 + 0xc) & 0xffffffbf;
*(undefined1 *)((int)param_1 + 0x41) = 0x20;
FUN_08007538();
return 0;
}
void FUN_0800395a(void)
{
return;
}
void FUN_0800395c(int param_1)
{
FUN_0800395a(*(undefined4 *)(param_1 + 0x38));
return;
}
void FUN_08003966(void)
{
return;
}
void FUN_08003968(void)
{
return;
}
void FUN_0800396a(int param_1)
{
int *piVar1;
piVar1 = *(int **)(param_1 + 0x38);
if ((*(char *)((int)piVar1 + 0x41) == '!') && ((*(uint *)(*piVar1 + 0x14) & 0x80) != 0)) {
*(undefined2 *)((int)piVar1 + 0x26) = 0;
FUN_080034d0(piVar1);
}
if ((*(char *)((int)piVar1 + 0x42) == '\"') && ((*(uint *)(*piVar1 + 0x14) & 0x40) != 0)) {
*(undefined2 *)((int)piVar1 + 0x2e) = 0;
FUN_080034f0(piVar1);
}
piVar1[0x11] = piVar1[0x11] | 0x10;
FUN_08003968(piVar1);
return;
}
void FUN_080039d2(void)
{
return;
}
undefined4 FUN_080039d4(int *param_1)
{
bool bVar1;
uint *puVar2;
uint uVar3;
short sVar4;
int iVar5;
uint *puVar6;
if (*(char *)((int)param_1 + 0x42) != '\"') {
return 2;
}
iVar5 = param_1[2];
if ((iVar5 == 0x1000) && (param_1[4] == 0)) {
*(ushort *)param_1[10] = (ushort)((uint)(*(int *)(*param_1 + 4) << 0x17) >> 0x17);
param_1[10] = param_1[10] + 2;
}
else {
if ((iVar5 == 0x1000) || ((iVar5 == 0 && (param_1[4] == 0)))) {
*(byte *)param_1[10] = (byte)*(undefined4 *)(*param_1 + 4);
}
else {
*(byte *)param_1[10] = (byte)*(undefined4 *)(*param_1 + 4) & 0x7f;
}
param_1[10] = param_1[10] + 1;
}
sVar4 = *(short *)((int)param_1 + 0x2e) + -1;
*(short *)((int)param_1 + 0x2e) = sVar4;
if (sVar4 != 0) {
return 0;
}
*(uint *)(*param_1 + 0xc) = *(uint *)(*param_1 + 0xc) & 0xffffffdf;
*(uint *)(*param_1 + 0xc) = *(uint *)(*param_1 + 0xc) & 0xfffffeff;
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 0xfffffffe;
*(undefined1 *)((int)param_1 + 0x42) = 0x20;
param_1[0xd] = 0;
if (param_1[0xc] == 1) {
param_1[0xc] = 0;
do {
puVar6 = (uint *)(*param_1 + 0xc);
ExclusiveAccess(puVar6);
puVar2 = (uint *)(*param_1 + 0xc);
bVar1 = (bool)hasExclusiveAccess(puVar2);
} while (!bVar1);
*puVar2 = *puVar6 & 0xffffffef;
puVar2 = (uint *)*param_1;
uVar3 = *puVar2;
if ((uVar3 & 0x10) != 0) {
uVar3 = *puVar2;
puVar2 = (uint *)puVar2[1];
}
FUN_080039d2(param_1,(short)param_1[0xb],uVar3,puVar2);
}
else {
FUN_08003966();
}
return 0;
}
void FUN_08003abc(int *param_1)
{
bool bVar1;
uint uVar2;
int iVar3;
uint uVar4;
uint *puVar5;
uint uVar6;
uint *puVar7;
puVar5 = (uint *)*param_1;
uVar6 = *puVar5;
uVar2 = puVar5[3];
if ((uVar6 & 0xf) == 0) {
if (((uVar6 & 0x20) != 0) && ((uVar2 & 0x20) != 0)) {
FUN_080039d4(param_1);
return;
}
}
else {
uVar4 = puVar5[5] & 1;
if ((uVar4 != 0) || ((uVar2 & 0x120) != 0)) {
if (((uVar6 & 1) != 0) && ((uVar2 & 0x100) != 0)) {
param_1[0x11] = param_1[0x11] | 1;
}
if (((uVar6 & 4) != 0) && (uVar4 != 0)) {
param_1[0x11] = param_1[0x11] | 2;
}
if (((uVar6 & 2) != 0) && (uVar4 != 0)) {
param_1[0x11] = param_1[0x11] | 4;
}
if (((uVar6 & 8) != 0) && (((uVar2 & 0x20) != 0 || (uVar4 != 0)))) {
param_1[0x11] = param_1[0x11] | 8;
}
if (param_1[0x11] == 0) {
return;
}
if (((uVar6 & 0x20) != 0) && ((uVar2 & 0x20) != 0)) {
FUN_080039d4(param_1);
}
if (((param_1[0x11] & 8U) == 0) && ((*(uint *)(*param_1 + 0x14) & 0x40) == 0)) {
FUN_08003968(param_1);
param_1[0x11] = 0;
return;
}
FUN_080034f0(param_1);
if ((*(uint *)(*param_1 + 0x14) & 0x40) == 0) {
FUN_08003968(param_1);
return;
}
do {
puVar7 = (uint *)(*param_1 + 0x14);
ExclusiveAccess(puVar7);
puVar5 = (uint *)(*param_1 + 0x14);
bVar1 = (bool)hasExclusiveAccess(puVar5);
} while (!bVar1);
*puVar5 = *puVar7 & 0xffffffbf;
if (param_1[0xf] != 0) {
*(undefined4 *)(param_1[0xf] + 0x50) = DAT_08003d3c;
iVar3 = FUN_08002bb2(param_1[0xf]);
if (iVar3 == 0) {
return;
}
(**(code **)(param_1[0xf] + 0x50))();
return;
}
FUN_08003968(param_1);
return;
}
}
if (((param_1[0xc] == 1) && ((uVar6 & 0x10) != 0)) && ((uVar2 & 0x10) != 0)) {
if ((puVar5[5] & 0x40) == 0) {
if ((*(short *)((int)param_1 + 0x2e) != 0) &&
((short)param_1[0xb] != *(short *)((int)param_1 + 0x2e))) {
do {
puVar7 = (uint *)(*param_1 + 0xc);
ExclusiveAccess(puVar7);
puVar5 = (uint *)(*param_1 + 0xc);
bVar1 = (bool)hasExclusiveAccess(puVar5);
} while (!bVar1);
*puVar5 = *puVar7 & 0xfffffedf;
do {
puVar7 = (uint *)(*param_1 + 0x14);
ExclusiveAccess(puVar7);
puVar5 = (uint *)(*param_1 + 0x14);
bVar1 = (bool)hasExclusiveAccess(puVar5);
} while (!bVar1);
*puVar5 = *puVar7 & 0xfffffffe;
*(undefined1 *)((int)param_1 + 0x42) = 0x20;
param_1[0xc] = 0;
do {
puVar7 = (uint *)(*param_1 + 0xc);
ExclusiveAccess(puVar7);
puVar5 = (uint *)(*param_1 + 0xc);
bVar1 = (bool)hasExclusiveAccess(puVar5);
} while (!bVar1);
*puVar5 = *puVar7 & 0xffffffef;
param_1[0xd] = 2;
FUN_080039d2(param_1);
}
}
else {
uVar2 = *(uint *)(*(int *)param_1[0xf] + 4);
uVar6 = uVar2 & 0xffff;
if ((uVar6 != 0) && (uVar6 < *(ushort *)(param_1 + 0xb))) {
*(short *)((int)param_1 + 0x2e) = (short)uVar2;
if (((int *)param_1[0xf])[7] != 0x100) {
do {
puVar7 = (uint *)(*param_1 + 0xc);
ExclusiveAccess(puVar7);
puVar5 = (uint *)(*param_1 + 0xc);
bVar1 = (bool)hasExclusiveAccess(puVar5);
} while (!bVar1);
*puVar5 = *puVar7 & 0xfffffeff;
do {
puVar7 = (uint *)(*param_1 + 0x14);
ExclusiveAccess(puVar7);
puVar5 = (uint *)(*param_1 + 0x14);
bVar1 = (bool)hasExclusiveAccess(puVar5);
} while (!bVar1);
*puVar5 = *puVar7 & 0xfffffffe;
do {
puVar7 = (uint *)(*param_1 + 0x14);
ExclusiveAccess(puVar7);
puVar5 = (uint *)(*param_1 + 0x14);
bVar1 = (bool)hasExclusiveAccess(puVar5);
} while (!bVar1);
*puVar5 = *puVar7 & 0xffffffbf;
*(undefined1 *)((int)param_1 + 0x42) = 0x20;
param_1[0xc] = 0;
do {
puVar7 = (uint *)(*param_1 + 0xc);
ExclusiveAccess(puVar7);
puVar5 = (uint *)(*param_1 + 0xc);
bVar1 = (bool)hasExclusiveAccess(puVar5);
} while (!bVar1);
*puVar5 = *puVar7 & 0xffffffef;
FUN_08002b1e(param_1[0xf]);
}
param_1[0xd] = 2;
FUN_080039d2(param_1,(short)param_1[0xb] - *(short *)((int)param_1 + 0x2e));
}
}
}
else if (((uVar6 & 0x80) == 0) || ((uVar2 & 0x80) == 0)) {
if (((uVar6 & 0x40) != 0) && ((uVar2 & 0x40) != 0)) {
FUN_08003940(param_1);
}
}
else {
FUN_0800354c(param_1);
}
return;
}
void FUN_08003d40(int *param_1)
{
int iVar1;
iVar1 = DAT_08003e6c;
*(uint *)(DAT_08003e6c + 4) = *(uint *)(DAT_08003e6c + 4) & 0xfffcffff;
*(uint *)(iVar1 + 4) = *(uint *)(iVar1 + 4) | param_1[1];
*(uint *)(*param_1 + 4) = *(uint *)(*param_1 + 4) & 0xfffffeff;
*(uint *)(*param_1 + 4) = *(uint *)(*param_1 + 4) | param_1[4] << 8;
*(uint *)(*param_1 + 4) = *(uint *)(*param_1 + 4) & 0xfcffffff;
*(uint *)(*param_1 + 4) = *(uint *)(*param_1 + 4) | param_1[2];
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) & 0xfffff7ff;
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) | param_1[3];
if (param_1[10] == DAT_08003e70) {
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) & 0xf0ffffff;
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) & 0xcfffffff;
}
else {
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) & 0xf0ffffff;
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) | param_1[10];
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) & 0xcfffffff;
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) | param_1[0xb];
}
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) & 0xfffffffd;
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) | (uint)*(byte *)(param_1 + 6) << 1;
if ((char)param_1[8] == '\0') {
*(uint *)(*param_1 + 4) = *(uint *)(*param_1 + 4) & 0xfffff7ff;
}
else {
*(uint *)(*param_1 + 4) = *(uint *)(*param_1 + 4) | 0x800;
*(uint *)(*param_1 + 4) = *(uint *)(*param_1 + 4) & 0xffff1fff;
*(uint *)(*param_1 + 4) = *(uint *)(*param_1 + 4) | (param_1[9] + -1) * 0x2000;
}
*(uint *)(*param_1 + 0x2c) = *(uint *)(*param_1 + 0x2c) & 0xff0fffff;
*(uint *)(*param_1 + 0x2c) = *(uint *)(*param_1 + 0x2c) | (param_1[7] + -1) * 0x100000;
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) & 0xfffffdff;
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) | (uint)*(byte *)(param_1 + 0xc) << 9;
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) & 0xfffffbff;
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) | param_1[5] << 10;
return;
}
bool FUN_08003e74(int param_1)
{
bool bVar1;
if (param_1 == 0) {
return true;
}
if (*(int *)(param_1 + 0x40) == 0) {
ADC_Init();
*(undefined4 *)(param_1 + 0x44) = 0;
*(undefined1 *)(param_1 + 0x3c) = 0;
}
bVar1 = (*(uint *)(param_1 + 0x40) & 0x10) == 0;
if (bVar1) {
*(uint *)(param_1 + 0x40) = *(uint *)(param_1 + 0x40) & 0xffffeefd | 2;
FUN_08003d40(param_1);
*(undefined4 *)(param_1 + 0x44) = 0;
*(uint *)(param_1 + 0x40) = *(uint *)(param_1 + 0x40) & 0xfffffffc | 1;
}
*(undefined1 *)(param_1 + 0x3c) = 0;
return !bVar1;
}
undefined4 Init_AudioBuffer(int *param_1,undefined4 param_2,undefined4 param_3)
{
undefined4 uVar1;
int iVar2;
int local_c;
if ((char)param_1[0xf] == '\x01') {
uVar1 = 2;
}
else {
*(undefined1 *)(param_1 + 0xf) = 1;
iVar2 = *param_1;
if ((*(uint *)(iVar2 + 8) & 1) == 0) {
*(uint *)(iVar2 + 8) = *(uint *)(iVar2 + 8) | 1;
for (local_c = (uint)((ulonglong)DAT_0800404c * (ulonglong)*DAT_08004048 >> 0x32) * 3;
local_c != 0; local_c = local_c + -1) {
}
}
iVar2 = *param_1;
if ((*(uint *)(iVar2 + 8) & 0x100) != 0) {
*(uint *)(iVar2 + 8) = *(uint *)(iVar2 + 8) & 0xfffffeff;
}
if ((*(uint *)(*param_1 + 8) & 1) == 0) {
param_1[0x10] = param_1[0x10] | 0x10;
param_1[0x11] = param_1[0x11] | 1;
uVar1 = 0;
}
else {
param_1[0x10] = param_1[0x10] & 0xfffff8feU | 0x100;
if ((*(uint *)(*param_1 + 4) & 0x400) != 0) {
param_1[0x10] = param_1[0x10] & 0xffffcfffU | 0x1000;
}
if ((param_1[0x10] & 0x1000U) == 0) {
param_1[0x11] = 0;
}
else {
param_1[0x11] = param_1[0x11] & 0xfffffff9;
}
*(undefined1 *)(param_1 + 0xf) = 0;
*(undefined4 *)(param_1[0xe] + 0x3c) = DAT_08004050;
*(undefined4 *)(param_1[0xe] + 0x40) = DAT_08004054;
*(undefined4 *)(param_1[0xe] + 0x4c) = DAT_08004058;
*(undefined4 *)*param_1 = 0xffffffdd;
*(uint *)(*param_1 + 4) = *(uint *)(*param_1 + 4) | 0x4000000;
*(uint *)(*param_1 + 8) = *(uint *)(*param_1 + 8) | 0x100;
FUN_08002ab4(param_1[0xe],*param_1 + 0x4c,param_2,param_3);
if ((*(uint *)(DAT_0800405c + 4) & 0x1f) == 0) {
iVar2 = *param_1;
if ((iVar2 != DAT_08004060) &&
((iVar2 != DAT_08004060 + 0x100 || ((*(uint *)(DAT_08004060 + 0x304) & 0x1f) != 0)))) {
if (iVar2 != DAT_08004064) {
return 0;
}
if ((*(uint *)(DAT_08004064 + 0x104) & 0x10) != 0) {
return 0;
}
}
if ((*(uint *)(iVar2 + 8) & 0x30000000) == 0) {
*(uint *)(iVar2 + 8) = *(uint *)(iVar2 + 8) | 0x40000000;
uVar1 = 0;
}
else {
uVar1 = 0;
}
}
else {
iVar2 = *param_1;
if (iVar2 == DAT_08004060) {
if ((*(uint *)(iVar2 + 8) & 0x30000000) == 0) {
*(uint *)(iVar2 + 8) = *(uint *)(iVar2 + 8) | 0x40000000;
uVar1 = 0;
}
else {
uVar1 = 0;
}
}
else {
uVar1 = 0;
}
}
}
}
return uVar1;
}
void FUN_08004068(void)
{
return;
}
void FUN_0800406a(int param_1)
{
FUN_08004068(*(undefined4 *)(param_1 + 0x38));
return;
}
void FUN_08004074(void)
{
return;
}
void FUN_08004076(void)
{
return;
}
void FUN_08004078(int *param_1)
{
uint *puVar1;
int iVar2;
uint uVar3;
uint uVar4;
puVar1 = (uint *)*param_1;
uVar4 = *puVar1;
uVar3 = puVar1[1];
if (((uVar4 & 2) != 0) && ((uVar3 & 0x20) != 0)) {
if ((param_1[0x10] & 0x10U) == 0) {
param_1[0x10] = param_1[0x10] | 0x200;
}
if ((((puVar1[2] & 0x30000000) == 0) && ((char)param_1[6] == '\0')) &&
(((puVar1[0xb] & 0xf00000) == 0 || ((puVar1[2] & 0x400) == 0)))) {
puVar1[1] = puVar1[1] & 0xffffffdf;
param_1[0x10] = param_1[0x10] & 0xfffffeff;
if ((param_1[0x10] & 0x1000U) == 0) {
param_1[0x10] = param_1[0x10] | 1;
}
}
FUN_08000e20(param_1);
*(undefined4 *)*param_1 = 0xffffffed;
}
if (((uVar4 & 4) != 0) && ((uVar3 & 0x80) != 0)) {
if ((param_1[0x10] & 0x10U) == 0) {
param_1[0x10] = param_1[0x10] | 0x2000;
}
iVar2 = *param_1;
if (((*(uint *)(iVar2 + 8) & 0x300000) == 0) &&
(((((*(uint *)(iVar2 + 0x38) & 0x300000) == 0 || ((*(uint *)(iVar2 + 8) & 0x400) == 0)) &&
((*(uint *)(iVar2 + 4) & 0x400) == 0)) &&
(((*(uint *)(iVar2 + 8) & 0x30000000) == 0 && ((char)param_1[6] == '\0')))))) {
*(uint *)(iVar2 + 4) = *(uint *)(iVar2 + 4) & 0xffffff7f;
param_1[0x10] = param_1[0x10] & 0xffffefff;
if ((param_1[0x10] & 0x100U) == 0) {
param_1[0x10] = param_1[0x10] | 1;
}
}
FUN_080043f0(param_1);
*(undefined4 *)*param_1 = 0xfffffff3;
}
if ((((uVar4 & 1) != 0) && ((uVar3 & 0x40) != 0)) && ((*(uint *)*param_1 & 1) != 0)) {
param_1[0x10] = param_1[0x10] | 0x10000;
FUN_08004074(param_1);
*(undefined4 *)*param_1 = 0xfffffffe;
}
if (((uVar4 & 0x20) != 0) && ((uVar3 & 0x4000000) != 0)) {
param_1[0x11] = param_1[0x11] | 2;
*(undefined4 *)*param_1 = 0xffffffdf;
FUN_08004076(param_1);
*(undefined4 *)*param_1 = 0xffffffdf;
}
return;
}
void FUN_080041ba(int param_1)
{
int iVar1;
iVar1 = *(int *)(param_1 + 0x38);
*(undefined4 *)(iVar1 + 0x40) = 0x40;
*(uint *)(iVar1 + 0x44) = *(uint *)(iVar1 + 0x44) | 4;
FUN_08004076();
return;
}
undefined8 FUN_08004244(int *param_1,uint *param_2)
{
int iVar1;
undefined4 uVar2;
uint uVar3;
int local_c;
if ((char)param_1[0xf] == '\x01') {
uVar2 = 2;
}
else {
*(undefined1 *)(param_1 + 0xf) = 1;
uVar3 = *param_2;
if (uVar3 < 10) {
*(uint *)(*param_1 + 0x10) =
*(uint *)(*param_1 + 0x10) & ~(7 << ((uVar3 & 0xffff) * 3 & 0xff));
*(uint *)(*param_1 + 0x10) =
param_2[2] << ((uint)(ushort)*param_2 * 3 & 0xff) | *(uint *)(*param_1 + 0x10);
}
else {
*(uint *)(*param_1 + 0xc) =
*(uint *)(*param_1 + 0xc) & ~(7 << ((uVar3 & 0xffff) * 3 - 0x1e & 0xff));
*(uint *)(*param_1 + 0xc) =
param_2[2] << ((uint)(ushort)*param_2 * 3 - 0x1e & 0xff) | *(uint *)(*param_1 + 0xc);
}
uVar3 = param_2[1];
if (uVar3 < 7) {
*(uint *)(*param_1 + 0x34) = *(uint *)(*param_1 + 0x34) & ~(0x1f << (uVar3 * 5 - 5 & 0xff));
*(uint *)(*param_1 + 0x34) =
(uint)(ushort)*param_2 << (param_2[1] * 5 - 5 & 0xff) | *(uint *)(*param_1 + 0x34);
}
else if (uVar3 < 0xd) {
*(uint *)(*param_1 + 0x30) = *(uint *)(*param_1 + 0x30) & ~(0x1f << (uVar3 * 5 - 0x23 & 0xff))
;
*(uint *)(*param_1 + 0x30) =
(uint)(ushort)*param_2 << (param_2[1] * 5 - 0x23 & 0xff) | *(uint *)(*param_1 + 0x30);
}
else {
*(uint *)(*param_1 + 0x2c) = *(uint *)(*param_1 + 0x2c) & ~(0x1f << (uVar3 * 5 - 0x41 & 0xff))
;
*(uint *)(*param_1 + 0x2c) =
(uint)(ushort)*param_2 << (param_2[1] * 5 - 0x41 & 0xff) | *(uint *)(*param_1 + 0x2c);
}
iVar1 = DAT_080043e0;
if ((*param_1 == DAT_080043dc) && (*param_2 == 0x12)) {
*(uint *)(DAT_080043e0 + 4) = *(uint *)(DAT_080043e0 + 4) & 0xff7fffff;
*(uint *)(iVar1 + 4) = *(uint *)(iVar1 + 4) | 0x400000;
}
iVar1 = DAT_080043e0;
if ((*param_1 == DAT_080043dc) &&
(((uint *)*param_2 == DAT_080043e4 || ((uint *)*param_2 == (uint *)0x11)))) {
*(uint *)(DAT_080043e0 + 4) = *(uint *)(DAT_080043e0 + 4) & 0xffbfffff;
*(uint *)(iVar1 + 4) = *(uint *)(iVar1 + 4) | 0x800000;
param_2 = (uint *)*param_2;
if (param_2 == DAT_080043e4) {
param_2 = (uint *)((ulonglong)DAT_080043ec * (ulonglong)*DAT_080043e8);
for (local_c = (uint)((ulonglong)DAT_080043ec * (ulonglong)*DAT_080043e8 >> 0x32) * 10;
local_c != 0; local_c = local_c + -1) {
}
}
}
uVar2 = 0;
*(undefined1 *)(param_1 + 0xf) = 0;
}
return CONCAT44(param_2,uVar2);
}
void FUN_080043f0(void)
{
return;
}
undefined4 FUN_080043f2(undefined1 *param_1,int param_2,undefined1 param_3)
{
undefined4 uVar1;
if (param_1 != (undefined1 *)0x0) {
*(undefined4 *)(param_1 + 0x2b8) = 0;
*(undefined4 *)(param_1 + 0x2c4) = 0;
*(undefined4 *)(param_1 + 0x2d0) = 0;
if (param_2 != 0) {
*(int *)(param_1 + 0x2b4) = param_2;
}
param_1[0x29c] = 1;
*param_1 = param_3;
uVar1 = FUN_08006ed0(param_1);
return uVar1;
}
return 3;
}
undefined4 FUN_08004420(int param_1,int param_2)
{
undefined4 uVar1;
undefined2 local_a;
local_a = 0;
if (param_2 == 0) {
uVar1 = 3;
}
else {
*(int *)(param_1 + 0x2b8) = param_2;
if (*(int *)(param_2 + 0x2c) != 0) {
uVar1 = (**(code **)(*(int *)(param_1 + (*(int *)(param_1 + 0x2d4) + 0xae) * 4) + 0x2c))
(&local_a);
*(undefined4 *)(param_1 + 0x2d0) = uVar1;
}
*(int *)(param_1 + 0x2d8) = *(int *)(param_1 + 0x2d8) + 1;
uVar1 = 0;
}
return uVar1;
}
void FUN_08004460(void)
{
FUN_08006fe2();
return;
}
undefined4 FUN_08004468(int param_1)
{
undefined4 uVar1;
if (*(undefined4 **)(param_1 + 0x2b8) == (undefined4 *)0x0) {
uVar1 = 0;
}
else {
uVar1 = (*(code *)**(undefined4 **)(param_1 + 0x2b8))();
}
return uVar1;
}
int FUN_0800447a(int param_1)
{
int iVar1;
iVar1 = (**(code **)(*(int *)(param_1 + 0x2b8) + 4))();
if (iVar1 != 0) {
iVar1 = 3;
}
return iVar1;
}
void FUN_0800448c(int param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
byte bVar1;
int iVar2;
iVar2 = param_1 + 0x2aa;
FUN_080047de(iVar2);
*(undefined4 *)(param_1 + 0x294) = 1;
*(uint *)(param_1 + 0x298) = (uint)*(ushort *)(param_1 + 0x2b0);
bVar1 = *(byte *)(param_1 + 0x2aa);
if ((bVar1 & 0x1f) == 1) {
FUN_08004c22(param_1,iVar2,param_3,1,param_4);
}
else if ((bVar1 & 0x1f) == 2) {
FUN_08004ca6(param_1,iVar2);
}
else if ((bVar1 & 0x1f) == 0) {
FUN_08004bac(param_1,iVar2);
}
else {
FUN_08007018(param_1,bVar1 & 0x80);
}
return;
}
int FUN_080044e4(int param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
int iVar1;
code *pcVar2;
*(undefined1 *)(param_1 + 0x29c) = 1;
*(undefined4 *)(param_1 + 0x294) = 0;
*(undefined4 *)(param_1 + 4) = 0;
*(undefined4 *)(param_1 + 0x2a4) = 0;
*(undefined1 *)(param_1 + 0x2a0) = 0;
if (*(int *)(param_1 + 0x2b8) == 0) {
iVar1 = 0;
}
else {
pcVar2 = *(code **)(*(int *)(param_1 + 0x2b8) + 4);
if (pcVar2 == (code *)0x0) {
iVar1 = 0;
}
else {
iVar1 = (*pcVar2)(param_1,0,param_3,pcVar2,param_4);
if (iVar1 != 0) {
iVar1 = 3;
}
}
}
FUN_08006ff2(param_1,0,0,0x40);
*(undefined2 *)(param_1 + 0x164) = 1;
*(undefined4 *)(param_1 + 0x160) = 0x40;
FUN_08006ff2(param_1,0x80,0,0x40);
*(undefined2 *)(param_1 + 0x24) = 1;
*(undefined4 *)(param_1 + 0x20) = 0x40;
return iVar1;
}
undefined4 FUN_08004548(int param_1,undefined1 param_2)
{
*(undefined1 *)(param_1 + 0x10) = param_2;
return 0;
}
undefined4 FUN_0800454e(int param_1)
{
if (*(char *)(param_1 + 0x29c) != '\x04') {
*(undefined1 *)(param_1 + 0x29d) = *(undefined1 *)(param_1 + 0x29c);
}
*(undefined1 *)(param_1 + 0x29c) = 4;
return 0;
}
undefined4 FUN_0800456c(int param_1)
{
if (*(char *)(param_1 + 0x29c) == '\x04') {
*(undefined1 *)(param_1 + 0x29c) = *(undefined1 *)(param_1 + 0x29d);
}
return 0;
}
undefined4 FUN_08004586(int param_1)
{
code *pcVar1;
if (((*(char *)(param_1 + 0x29c) == '\x03') && (*(int *)(param_1 + 0x2b8) != 0)) &&
(pcVar1 = *(code **)(*(int *)(param_1 + 0x2b8) + 0x1c), pcVar1 != (code *)0x0)) {
(*pcVar1)();
}
return 0;
}
undefined4 FUN_080045a8(int param_1)
{
undefined4 uVar1;
int iVar2;
code *pcVar3;
iVar2 = *(int *)(param_1 + (*(int *)(param_1 + 0x2d4) + 0xae) * 4);
if (iVar2 == 0) {
uVar1 = 3;
}
else if (*(char *)(param_1 + 0x29c) == '\x03') {
pcVar3 = *(code **)(iVar2 + 0x20);
if (pcVar3 == (code *)0x0) {
uVar1 = 0;
}
else {
(*pcVar3)();
uVar1 = 0;
}
}
else {
uVar1 = 0;
}
return uVar1;
}
undefined4 FUN_080045d6(int param_1)
{
undefined4 uVar1;
int iVar2;
code *pcVar3;
iVar2 = *(int *)(param_1 + (*(int *)(param_1 + 0x2d4) + 0xae) * 4);
if (iVar2 == 0) {
uVar1 = 3;
}
else if (*(char *)(param_1 + 0x29c) == '\x03') {
pcVar3 = *(code **)(iVar2 + 0x24);
if (pcVar3 == (code *)0x0) {
uVar1 = 0;
}
else {
(*pcVar3)();
uVar1 = 0;
}
}
else {
uVar1 = 0;
}
return uVar1;
}
undefined4 FUN_08004604(void)
{
return 0;
}
int FUN_08004608(int param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
int iVar1;
code *pcVar2;
*(undefined1 *)(param_1 + 0x29c) = 1;
if (*(int *)(param_1 + 0x2b8) == 0) {
iVar1 = 0;
}
else {
pcVar2 = *(code **)(*(int *)(param_1 + 0x2b8) + 4);
iVar1 = (*pcVar2)(param_1,*(undefined1 *)(param_1 + 4),param_3,pcVar2,param_4);
if (iVar1 != 0) {
iVar1 = 3;
}
}
return iVar1;
}
undefined4 FUN_08004628(void)
{
return 0;
}
undefined4 FUN_0800462c(void)
{
return 0;
}
undefined4 FUN_08004630(int param_1,uint param_2,undefined4 param_3,undefined4 param_4)
{
int iVar1;
undefined4 uVar2;
uint uVar3;
uint uVar4;
byte bVar5;
int iVar6;
if (param_2 != 0) {
iVar1 = FUN_0800462c(param_1,param_2 & 0x7f,param_3,param_4,param_4);
if (iVar1 != 0) {
return 0;
}
if (*(char *)(param_1 + 0x29c) != '\x03') {
return 0;
}
if (*(int *)(*(int *)(param_1 + 0x2b8) + 0x18) == 0) {
return 0;
}
*(undefined4 *)(param_1 + 0x2d4) = 0;
uVar2 = (**(code **)(*(int *)(param_1 + 0x2b8) + 0x18))(param_1,param_2);
return uVar2;
}
if (*(int *)(param_1 + 0x294) != 3) {
return 0;
}
uVar4 = *(uint *)(param_1 + 0x160);
if (uVar4 < *(uint *)(param_1 + 0x15c)) {
uVar3 = *(uint *)(param_1 + 0x15c) - uVar4;
*(uint *)(param_1 + 0x15c) = uVar3;
if (uVar3 <= uVar4) {
uVar4 = uVar3;
}
FUN_08004f3a(param_1,param_3,uVar4);
return 0;
}
bVar5 = *(byte *)(param_1 + 0x2aa) & 0x1f;
if (bVar5 == 1) {
iVar1 = FUN_08004628(param_1,*(undefined1 *)(param_1 + 0x2ae));
LAB_08004686:
if (iVar1 != 0) goto LAB_08004692;
}
else {
if (bVar5 == 2) {
iVar1 = FUN_0800462c(param_1,*(undefined1 *)(param_1 + 0x2ae),uVar4,2,param_4);
goto LAB_08004686;
}
iVar1 = 0;
}
if ((*(char *)(param_1 + 0x29c) == '\x03') &&
(iVar6 = *(int *)(param_1 + (iVar1 + 0xae) * 4), *(int *)(iVar6 + 0x10) != 0)) {
*(int *)(param_1 + 0x2d4) = iVar1;
(**(code **)(iVar6 + 0x10))(param_1);
}
LAB_08004692:
FUN_08004f4a(param_1);
return 0;
}
uint FUN_080046f4(int param_1,uint param_2,undefined4 param_3,undefined4 param_4)
{
uint uVar1;
int iVar2;
uint uVar3;
if (param_2 == 0) {
if (*(int *)(param_1 + 0x294) == 2) {
uVar3 = *(uint *)(param_1 + 0x1c);
uVar1 = *(uint *)(param_1 + 0x20);
if (uVar1 < uVar3) {
*(uint *)(param_1 + 0x1c) = uVar3 - uVar1;
FUN_08004f2a(param_1,param_3);
FUN_08007058(param_1,0,0);
}
else if (((uVar3 == uVar1) && (uVar1 <= *(uint *)(param_1 + 0x18))) &&
(*(uint *)(param_1 + 0x18) < *(uint *)(param_1 + 0x298))) {
FUN_08004f2a(param_1,0);
*(undefined4 *)(param_1 + 0x298) = 0;
FUN_08007058(param_1,0,0,0);
}
else {
if ((*(char *)(param_1 + 0x29c) == '\x03') &&
(*(int *)(*(int *)(param_1 + 0x2b8) + 0xc) != 0)) {
*(undefined4 *)(param_1 + 0x2d4) = 0;
(**(code **)(*(int *)(param_1 + 0x2b8) + 0xc))(param_1);
}
FUN_08007018(param_1,0x80);
FUN_08004f60(param_1);
}
}
uVar1 = (uint)*(byte *)(param_1 + 0x2a0);
if (uVar1 != 0) {
*(undefined1 *)(param_1 + 0x2a0) = 0;
uVar1 = 0;
}
}
else {
iVar2 = FUN_0800462c(param_1,param_2 | 0x80,param_3,param_4,param_4);
if (iVar2 == 0) {
uVar1 = 0;
if (*(char *)(param_1 + 0x29c) == '\x03') {
if (*(int *)(*(int *)(param_1 + 0x2b8) + 0x14) != 0) {
*(undefined4 *)(param_1 + 0x2d4) = 0;
uVar1 = (**(code **)(*(int *)(param_1 + 0x2b8) + 0x14))(param_1,param_2);
}
}
}
else {
uVar1 = 0;
}
}
return uVar1;
}
char FUN_080047ca(char *param_1)
{
char cVar1;
cVar1 = '\0';
for (; *param_1 != '\0'; param_1 = param_1 + 1) {
cVar1 = cVar1 + '\x01';
}
return cVar1;
}
void FUN_080047de(undefined1 *param_1,undefined1 *param_2)
{
*param_1 = *param_2;
param_1[1] = param_2[1];
*(undefined2 *)(param_1 + 2) = *(undefined2 *)(param_2 + 2);
*(undefined2 *)(param_1 + 4) = *(undefined2 *)(param_2 + 4);
*(undefined2 *)(param_1 + 6) = *(undefined2 *)(param_2 + 6);
return;
}
void FUN_08004806(undefined4 param_1)
{
FUN_08007018(param_1,0x80);
FUN_08007018(param_1,0);
return;
}
void FUN_0800481a(int param_1,int param_2)
{
ushort uVar1;
int iVar2;
code *pcVar3;
ushort local_12 [3];
local_12[0] = 0;
switch(*(ushort *)(param_2 + 2) >> 8) {
case 1:
iVar2 = (*(code *)**(undefined4 **)(param_1 + 0x2b4))(*(undefined1 *)(param_1 + 0x10),local_12);
break;
case 2:
if (*(char *)(param_1 + 0x10) == '\0') {
iVar2 = (**(code **)(*(int *)(param_1 + 0x2b8) + 0x28))(local_12);
*(undefined1 *)(iVar2 + 1) = 2;
}
else {
iVar2 = (**(code **)(*(int *)(param_1 + 0x2b8) + 0x2c))(local_12);
*(undefined1 *)(iVar2 + 1) = 2;
}
break;
case 3:
switch((char)*(ushort *)(param_2 + 2)) {
case '\0':
pcVar3 = *(code **)(*(int *)(param_1 + 0x2b4) + 4);
if (pcVar3 == (code *)0x0) {
FUN_08004806(param_1,param_2);
return;
}
iVar2 = (*pcVar3)(*(undefined1 *)(param_1 + 0x10),local_12);
break;
case '\x01':
pcVar3 = *(code **)(*(int *)(param_1 + 0x2b4) + 8);
if (pcVar3 == (code *)0x0) {
FUN_08004806(param_1,param_2);
return;
}
iVar2 = (*pcVar3)(*(undefined1 *)(param_1 + 0x10),local_12);
break;
case '\x02':
pcVar3 = *(code **)(*(int *)(param_1 + 0x2b4) + 0xc);
if (pcVar3 == (code *)0x0) {
FUN_08004806(param_1,param_2);
return;
}
iVar2 = (*pcVar3)(*(undefined1 *)(param_1 + 0x10),local_12);
break;
case '\x03':
pcVar3 = *(code **)(*(int *)(param_1 + 0x2b4) + 0x10);
if (pcVar3 == (code *)0x0) {
FUN_08004806(param_1,param_2);
return;
}
iVar2 = (*pcVar3)(*(undefined1 *)(param_1 + 0x10),local_12);
break;
case '\x04':
pcVar3 = *(code **)(*(int *)(param_1 + 0x2b4) + 0x14);
if (pcVar3 == (code *)0x0) {
FUN_08004806(param_1,param_2);
return;
}
iVar2 = (*pcVar3)(*(undefined1 *)(param_1 + 0x10),local_12);
break;
case '\x05':
pcVar3 = *(code **)(*(int *)(param_1 + 0x2b4) + 0x18);
if (pcVar3 == (code *)0x0) {
FUN_08004806(param_1,param_2);
return;
}
iVar2 = (*pcVar3)(*(undefined1 *)(param_1 + 0x10),local_12);
break;
default:
FUN_08004806(param_1,param_2);
return;
}
break;
default:
FUN_08004806(param_1,param_2);
return;
case 6:
if (*(char *)(param_1 + 0x10) != '\0') {
FUN_08004806(param_1,param_2);
return;
}
iVar2 = (**(code **)(*(int *)(param_1 + 0x2b8) + 0x34))(local_12);
break;
case 7:
if (*(char *)(param_1 + 0x10) != '\0') {
FUN_08004806(param_1,param_2);
return;
}
iVar2 = (**(code **)(*(int *)(param_1 + 0x2b8) + 0x30))(local_12);
*(undefined1 *)(iVar2 + 1) = 7;
break;
case 0xf:
pcVar3 = *(code **)(*(int *)(param_1 + 0x2b4) + 0x1c);
if (pcVar3 == (code *)0x0) {
FUN_08004806(param_1,param_2);
return;
}
iVar2 = (*pcVar3)(*(undefined1 *)(param_1 + 0x10),local_12);
}
uVar1 = *(ushort *)(param_2 + 6);
if (uVar1 == 0) {
FUN_08004f4a(param_1);
}
else if (local_12[0] == 0) {
FUN_08004806(param_1,param_2);
}
else {
if (local_12[0] <= uVar1) {
uVar1 = local_12[0];
}
local_12[0] = uVar1;
FUN_08004f10(param_1,iVar2);
}
return;
}
void FUN_080049c6(int param_1,int param_2,undefined4 param_3,undefined4 param_4)
{
ushort uVar1;
if (((*(short *)(param_2 + 4) != 0) || (*(short *)(param_2 + 6) != 0)) ||
(uVar1 = *(ushort *)(param_2 + 2), 0x7f < uVar1)) {
FUN_08004806(param_1);
return;
}
if (*(char *)(param_1 + 0x29c) == '\x03') {
FUN_08004806();
return;
}
*(char *)(param_1 + 0x29e) = (char)(uVar1 & 0x7f);
FUN_08007038(param_1,uVar1 & 0x7f,param_3,*(char *)(param_1 + 0x29c),param_4);
FUN_08004f4a(param_1);
if ((uVar1 & 0x7f) != 0) {
*(undefined1 *)(param_1 + 0x29c) = 2;
return;
}
*(undefined1 *)(param_1 + 0x29c) = 1;
return;
}
uint FUN_08004a18(int param_1,int param_2)
{
uint uVar1;
uVar1 = (uint)*(byte *)(param_2 + 2);
*DAT_08004ae0 = *(byte *)(param_2 + 2);
if (uVar1 < 2) {
if (*(char *)(param_1 + 0x29c) == '\x02') {
if (uVar1 == 0) {
FUN_08004f4a();
}
else {
*(uint *)(param_1 + 4) = uVar1;
uVar1 = FUN_08004468(param_1,uVar1);
if (uVar1 == 0) {
FUN_08004f4a(param_1);
*(undefined1 *)(param_1 + 0x29c) = 3;
}
else {
FUN_08004806(param_1,param_2);
*(undefined1 *)(param_1 + 0x29c) = 2;
}
}
}
else if (*(char *)(param_1 + 0x29c) == '\x03') {
if (uVar1 == 0) {
*(undefined1 *)(param_1 + 0x29c) = 2;
*(undefined4 *)(param_1 + 4) = 0;
FUN_0800447a(param_1,0);
FUN_08004f4a(param_1);
}
else if (uVar1 == *(uint *)(param_1 + 4)) {
FUN_08004f4a();
uVar1 = 0;
}
else {
FUN_0800447a(param_1,*(uint *)(param_1 + 4) & 0xff);
*(uint *)(param_1 + 4) = (uint)*DAT_08004ae0;
uVar1 = FUN_08004468(param_1);
if (uVar1 == 0) {
FUN_08004f4a(param_1);
}
else {
FUN_08004806(param_1,param_2);
FUN_0800447a(param_1,*(undefined1 *)(param_1 + 4));
*(undefined1 *)(param_1 + 0x29c) = 2;
}
}
}
else {
FUN_08004806();
FUN_0800447a(param_1,*DAT_08004ae0);
uVar1 = 3;
}
}
else {
FUN_08004806();
uVar1 = 3;
}
return uVar1;
}
void FUN_08004ae4(int param_1,int param_2,undefined4 param_3,undefined4 param_4)
{
byte bVar1;
if (*(short *)(param_2 + 6) == 1) {
bVar1 = *(byte *)(param_1 + 0x29c);
if (bVar1 < 3) {
if (bVar1 != 0) {
*(undefined4 *)(param_1 + 8) = 0;
FUN_08004f10(param_1,(undefined4 *)(param_1 + 8),1,0,param_4);
return;
}
}
else if (bVar1 == 3) {
FUN_08004f10(param_1,param_1 + 4,1,3,param_4);
return;
}
FUN_08004806();
}
else {
FUN_08004806();
}
return;
}
void FUN_08004b24(int param_1,int param_2,undefined4 param_3,undefined4 param_4)
{
int iVar1;
if (*(byte *)(param_1 + 0x29c) - 1 < 3) {
if (*(short *)(param_2 + 6) == 2) {
*(undefined4 *)(param_1 + 0xc) = 0;
iVar1 = *(int *)(param_1 + 0x2a4);
if (iVar1 != 0) {
iVar1 = 2;
*(undefined4 *)(param_1 + 0xc) = 2;
}
FUN_08004f10(param_1,param_1 + 0xc,2,iVar1,param_4);
}
else {
FUN_08004806();
}
}
else {
FUN_08004806();
}
return;
}
void FUN_08004b5c(int param_1,int param_2)
{
if (*(short *)(param_2 + 2) == 1) {
*(undefined4 *)(param_1 + 0x2a4) = 1;
FUN_08004f4a();
}
else if (*(short *)(param_2 + 2) == 2) {
*(char *)(param_1 + 0x2a0) = (char)((ushort)*(undefined2 *)(param_2 + 4) >> 8);
FUN_08004f4a();
}
else {
FUN_08004806();
}
return;
}
void FUN_08004b86(int param_1,int param_2)
{
if (*(byte *)(param_1 + 0x29c) - 1 < 3) {
if (*(short *)(param_2 + 2) == 1) {
*(undefined4 *)(param_1 + 0x2a4) = 0;
FUN_08004f4a();
}
}
else {
FUN_08004806();
}
return;
}
uint FUN_08004bac(int param_1,byte *param_2)
{
uint uVar1;
uint uVar2;
uVar1 = *param_2 & 0x60;
if ((uVar1 == 0x20) || (uVar1 == 0x40)) {
uVar2 = (**(code **)(*(int *)(param_1 + (*(int *)(param_1 + 0x2d4) + 0xae) * 4) + 8))();
}
else if ((*param_2 & 0x60) == 0) {
uVar2 = (uint)param_2[1];
switch(uVar2) {
case 0:
FUN_08004b24();
break;
case 1:
FUN_08004b86();
uVar2 = uVar1;
break;
default:
FUN_08004806();
uVar2 = uVar1;
break;
case 3:
FUN_08004b5c();
uVar2 = uVar1;
break;
case 5:
FUN_080049c6();
uVar2 = uVar1;
break;
case 6:
FUN_0800481a();
uVar2 = uVar1;
break;
case 8:
FUN_08004ae4();
uVar2 = uVar1;
break;
case 9:
uVar2 = FUN_08004a18();
}
}
else {
FUN_08004806();
uVar2 = 0;
}
return uVar2;
}
int FUN_08004c22(int param_1,byte *param_2)
{
byte bVar1;
int iVar2;
bVar1 = *param_2 & 0x60;
if (((bVar1 == 0x20) || (bVar1 == 0x40)) || ((*param_2 & 0x60) == 0)) {
if (*(byte *)(param_1 + 0x29c) - 1 < 3) {
if (param_2[4] < 2) {
iVar2 = FUN_08004628(param_1);
if (iVar2 == 0) {
if (*(int *)(*(int *)(param_1 + 0x2b8) + 8) == 0) {
iVar2 = 3;
}
else {
*(undefined4 *)(param_1 + 0x2d4) = 0;
iVar2 = (**(code **)(*(int *)(param_1 + 0x2b8) + 8))(param_1,param_2);
}
}
else {
iVar2 = 3;
}
if ((*(short *)(param_2 + 6) == 0) && (iVar2 == 0)) {
FUN_08004f4a(param_1);
}
}
else {
FUN_08004806(param_1,param_2);
iVar2 = 0;
}
}
else {
FUN_08004806(param_1,param_2);
iVar2 = 0;
}
}
else {
FUN_08004806();
iVar2 = 0;
}
return iVar2;
}
uint FUN_08004ca6(int param_1,byte *param_2)
{
ushort uVar1;
byte bVar2;
byte bVar3;
int iVar4;
code *pcVar5;
uint uVar6;
undefined4 *puVar7;
uint uVar8;
uVar1 = *(ushort *)(param_2 + 4);
bVar3 = (byte)uVar1;
uVar8 = (uint)bVar3;
uVar6 = *param_2 & 0x60;
if ((uVar6 == 0x20) || (uVar6 == 0x40)) {
iVar4 = FUN_0800462c(param_1,uVar8);
if (iVar4 == 0) {
*(undefined4 *)(param_1 + 0x2d4) = 0;
pcVar5 = *(code **)(*(int *)(param_1 + 0x2b8) + 8);
uVar6 = 0;
if (pcVar5 != (code *)0x0) {
uVar6 = (*pcVar5)(param_1,param_2);
}
}
else {
uVar6 = 0;
}
}
else if ((*param_2 & 0x60) == 0) {
bVar2 = param_2[1];
if (bVar2 == 1) {
if (*(char *)(param_1 + 0x29c) == '\x02') {
if ((uVar8 == 0) || (uVar8 == 0x80)) {
FUN_08004806(param_1,param_2);
}
else {
FUN_08007018(param_1,uVar8);
FUN_08007018(param_1,0x80);
}
}
else if (*(char *)(param_1 + 0x29c) == '\x03') {
if (*(short *)(param_2 + 2) == 0) {
if ((uVar1 & 0x7f) != 0) {
FUN_08007028(param_1,uVar8);
}
FUN_08004f4a(param_1);
iVar4 = FUN_0800462c(param_1,uVar8);
if (iVar4 == 0) {
*(undefined4 *)(param_1 + 0x2d4) = 0;
pcVar5 = *(code **)(*(int *)(param_1 + 0x2b8) + 8);
if (pcVar5 == (code *)0x0) {
uVar6 = 0;
}
else {
uVar6 = (*pcVar5)(param_1,param_2);
}
}
}
}
else {
FUN_08004806();
}
}
else if (bVar2 == 3) {
if (*(char *)(param_1 + 0x29c) == '\x02') {
if ((uVar8 == 0) || (uVar8 == 0x80)) {
FUN_08004806(param_1,param_2);
}
else {
FUN_08007018(param_1,uVar8);
FUN_08007018(param_1,0x80);
}
}
else if (*(char *)(param_1 + 0x29c) == '\x03') {
if ((((*(short *)(param_2 + 2) == 0) && (uVar8 != 0)) && (uVar8 != 0x80)) &&
(*(short *)(param_2 + 6) == 0)) {
FUN_08007018(param_1,uVar8);
}
FUN_08004f4a(param_1);
}
else {
FUN_08004806();
}
}
else if (bVar2 == 0) {
uVar6 = 0;
if (*(char *)(param_1 + 0x29c) == '\x02') {
if ((uVar8 == 0) || (uVar8 == 0x80)) {
if ((uVar1 & 0x80) == 0) {
puVar7 = (undefined4 *)((uVar8 & 0x7f) * 0x14 + param_1 + 0x154);
}
else {
puVar7 = (undefined4 *)((uVar8 & 0x7f) * 0x14 + param_1 + 0x14);
}
*puVar7 = 0;
FUN_08004f10(param_1,puVar7,2);
}
else {
FUN_08004806();
}
}
else if (*(char *)(param_1 + 0x29c) == '\x03') {
if ((char)bVar3 < '\0') {
if (*(short *)(param_1 + (uVar8 & 0xf) * 0x14 + 0x24) == 0) {
FUN_08004806();
return 0;
}
}
else if (*(short *)(param_1 + (uVar8 & 0xf) * 0x14 + 0x164) == 0) {
FUN_08004806();
return 0;
}
if ((char)bVar3 < '\0') {
puVar7 = (undefined4 *)((uVar8 & 0x7f) * 0x14 + param_1 + 0x14);
}
else {
puVar7 = (undefined4 *)((uVar8 & 0x7f) * 0x14 + param_1 + 0x154);
}
if ((uVar8 == 0) || (uVar8 == 0x80)) {
*puVar7 = 0;
}
else {
iVar4 = FUN_08006f38(param_1,uVar8);
if (iVar4 == 0) {
*puVar7 = 0;
}
else {
*puVar7 = 1;
}
}
FUN_08004f10(param_1,puVar7,2);
}
else {
FUN_08004806();
}
}
else {
FUN_08004806();
}
}
else {
FUN_08004806();
uVar6 = 0;
}
return uVar6;
}
void FUN_08004ed6(char *param_1,undefined1 *param_2,short *param_3)
{
short sVar1;
uint uVar2;
if (param_1 != (char *)0x0) {
sVar1 = FUN_080047ca();
sVar1 = (sVar1 + 1) * 2;
*param_3 = sVar1;
*param_2 = (char)sVar1;
param_2[1] = 3;
uVar2 = 2;
for (; *param_1 != '\0'; param_1 = param_1 + 1) {
param_2[uVar2] = *param_1;
param_2[uVar2 + 1 & 0xff] = 0;
uVar2 = uVar2 + 2 & 0xff;
}
return;
}
return;
}
undefined4 FUN_08004f10(int param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
*(undefined4 *)(param_1 + 0x294) = 2;
*(undefined4 *)(param_1 + 0x18) = param_3;
*(undefined4 *)(param_1 + 0x1c) = param_3;
transmitMidiPacket(param_1,0,param_2,param_3,param_4);
return 0;
}
undefined4 FUN_08004f2a(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
transmitMidiPacket(param_1,0,param_2,param_3,param_4);
return 0;
}
undefined4 FUN_08004f3a(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
FUN_08007058(param_1,0,param_2,param_3,param_4);
return 0;
}
undefined4 FUN_08004f4a(int param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
*(undefined4 *)(param_1 + 0x294) = 4;
transmitMidiPacket(param_1,0,0,0,param_4);
return 0;
}
undefined4 FUN_08004f60(int param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
*(undefined4 *)(param_1 + 0x294) = 5;
FUN_08007058(param_1,0,0,0,param_4);
return 0;
}
undefined4 FUN_08005040(int param_1)
{
FUN_08007008(param_1,0x40);
if (*(int *)(param_1 + 700) != 0) {
FUN_08006fcc();
*(undefined4 *)(param_1 + 700) = 0;
}
return 0;
}
bool FUN_08005060(int param_1)
{
int iVar1;
FUN_08006ff2(param_1,0x81,2,0x40);
FUN_08006ff2(param_1,1,2,0x40);
FUN_08007058(param_1,1,DAT_080050a0,0x40);
iVar1 = FUN_08006fc4(0x10);
*(int *)(param_1 + 700) = iVar1;
if (iVar1 != 0) {
*(undefined1 *)(iVar1 + 0xc) = 0;
}
return iVar1 == 0;
}
// Checks whether the MIDI device is in transmit state (state 3)
// and if the associated packet buffer has not yet been marked for transmission.
// If both conditions are met, it marks the packet as “ready” and calls the
// lower-level transmit function with command code 0x81.
//
// Parameters:
// midiDevice - pointer to the MIDI device context structure.
// packetData - parameter representing MIDI packet data (could be a pointer/ or an encoded
// value depending on the system design).
// packetLength - additional parameter for the MIDI packet (possibly its length).
undefined4 sendMidiPacket(int midiDevice,undefined4 packetData,undefined4 packetLength)
{
if (*(char *)(midiDevice + 0x29c) != '\x03') {
return 0;
}
if (*(char *)(*(int *)(midiDevice + 700) + 0xc) == '\0') {
*(undefined1 *)(*(int *)(midiDevice + 700) + 0xc) = 1;
transmitMidiPacket(midiDevice,0x81,packetData,packetLength);
}
return 0;
}
undefined4 FUN_080050dc(undefined4 param_1)
{
undefined4 uVar1;
uVar1 = DAT_08005108;
processSysExMessageTable(DAT_08005108,0x40);
FUN_08012484(uVar1,0,0x40);
FUN_08007058(param_1,1,uVar1,0x40);
return 0;
}
void Enable_ButtonInterrupts(void)
{
int iVar1;
undefined4 in_r3;
iVar1 = FUN_080043f2(DAT_08005144,DAT_08005140,0,in_r3,in_r3);
if (iVar1 != 0) {
// WARNING: Subroutine does not return
SystemHalt();
}
iVar1 = FUN_08004420(DAT_08005144,DAT_08005148);
if (iVar1 == 0) {
iVar1 = FUN_08004460(DAT_08005144);
if (iVar1 == 0) {
return;
}
// WARNING: Subroutine does not return
SystemHalt();
}
// WARNING: Subroutine does not return
SystemHalt();
}
void FUN_08005170(uint param_1,int param_2,uint param_3)
{
byte bVar1;
uint uVar2;
uVar2 = 0;
if (param_3 == 0) {
return;
}
do {
bVar1 = (byte)(param_1 >> 0x18);
if (param_1 < 0xa0000000) {
*(byte *)(param_2 + uVar2 * 2) = (bVar1 >> 4) + 0x30;
}
else {
*(byte *)(param_2 + uVar2 * 2) = (bVar1 >> 4) + 0x37;
}
param_1 = param_1 << 4;
*(undefined1 *)(param_2 + uVar2 * 2 + 1) = 0;
uVar2 = uVar2 + 1 & 0xff;
} while (uVar2 < param_3);
return;
}
void FUN_080051b8(void)
{
int iVar1;
int iVar2;
undefined4 in_r3;
undefined4 uVar3;
iVar1 = DAT_080051ec;
uVar3 = *(undefined4 *)(DAT_080051e8 + 0xa14);
iVar2 = *(int *)(DAT_080051e8 + 0xa10) + *(int *)(DAT_080051e8 + 0xa18);
if (iVar2 != 0) {
FUN_08005170(iVar2,DAT_080051ec,8,*(int *)(DAT_080051e8 + 0xa18),in_r3);
FUN_08005170(uVar3,iVar1 + 0x10,4);
}
return;
}
undefined4 FUN_08005204(undefined4 param_1,undefined4 param_2)
{
undefined4 uVar1;
undefined4 uVar2;
uVar2 = lookupSensorFlag(DAT_08005234);
uVar1 = DAT_08005238;
appendToBuffer(DAT_08005238,0x40,DAT_08005240,DAT_0800523c,uVar2);
uVar2 = DAT_08005244;
FUN_08004ed6(uVar1,DAT_08005244,param_2);
return uVar2;
}
undefined4 FUN_08005248(undefined4 param_1,undefined4 param_2)
{
undefined4 uVar1;
uVar1 = DAT_0800525c;
FUN_08004ed6(DAT_08005260,DAT_0800525c,param_2);
return uVar1;
}
int FUN_080052ac(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
uint *puVar1;
int iVar2;
uint uVar3;
iVar2 = FUN_08009ed8(DAT_08005344,1,param_2,param_4,param_4);
puVar1 = DAT_08005348;
if (iVar2 == 0) {
FUN_0800a084(param_1,0x30,0x12);
}
else {
*DAT_08005348 = *DAT_08005348 | 0x40000000;
uVar3 = *DAT_08005344;
puVar1[2] = uVar3;
puVar1[3] = uVar3;
puVar1 = DAT_0800534c;
*DAT_0800534c = *DAT_0800534c | 0x40000000;
puVar1[2] = uVar3 + 0x300;
puVar1[3] = uVar3 + 0x300;
puVar1 = DAT_08005350;
*DAT_08005350 = *DAT_08005350 | 0x40000000;
puVar1[2] = uVar3 + 0x380;
puVar1[3] = uVar3 + 0x340;
puVar1 = DAT_08005354;
*DAT_08005354 = *DAT_08005354 | 0x40000000;
puVar1[2] = uVar3 + 0x530;
puVar1[3] = uVar3 + 0x530;
puVar1 = DAT_08005358;
*DAT_08005358 = *DAT_08005358 | 0x40000000;
puVar1[2] = uVar3 + 0x5b8;
puVar1[3] = uVar3 + 0x578;
puVar1 = DAT_0800535c;
*DAT_0800535c = *DAT_0800535c | 0x40000000;
puVar1[2] = uVar3 + 0x5f0;
puVar1[3] = uVar3 + 0x5f0;
}
return iVar2;
}
int FUN_08005360(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
int iVar1;
int iVar2;
int iVar3;
int iVar4;
iVar2 = FUN_08009f80(DAT_080053d4,1,param_2,param_4,param_4);
iVar1 = DAT_080053d8;
if (iVar2 == 0) {
FUN_0800a084(param_1,0x30,0x13);
}
else {
iVar4 = *DAT_080053d4;
*(int *)(DAT_080053d8 + 8) = iVar4 + 0x50;
*(int *)(iVar1 + 0xc) = iVar4 + 0x50;
iVar1 = DAT_080053dc;
*(int *)(DAT_080053dc + 8) = iVar4 + 0xb0;
*(int *)(iVar1 + 0xc) = iVar4 + 0xb0;
iVar1 = DAT_080053e0;
*(int *)(DAT_080053e0 + 8) = iVar4 + 0x80;
*(int *)(iVar1 + 0xc) = iVar4 + 0x80;
iVar1 = DAT_080053e4;
*(int *)(DAT_080053e4 + 8) = iVar4;
*(int *)(iVar1 + 0xc) = iVar4;
iVar1 = DAT_080053e8;
*(int *)(DAT_080053e8 + 8) = iVar4 + 0x110;
*(int *)(iVar1 + 0xc) = iVar4 + 0x110;
iVar1 = DAT_080053ec;
*(int *)(DAT_080053ec + 8) = iVar4;
*(int *)(iVar1 + 0xc) = iVar4;
iVar1 = DAT_080053f0;
iVar3 = iVar4 + 0x48;
*(int *)(DAT_080053f0 + 8) = iVar3;
*(int *)(iVar1 + 0xc) = iVar3;
iVar1 = DAT_080053f4;
*(int *)(DAT_080053f4 + 8) = iVar4 + 0x90;
*(int *)(iVar1 + 0xc) = iVar4 + 0x90;
iVar1 = DAT_080053f8;
*(int *)(DAT_080053f8 + 8) = iVar3;
*(int *)(iVar1 + 0xc) = iVar3;
}
return iVar2;
}
void FUN_080053fc(void)
{
FUN_0800a06c();
return;
}
void FUN_08005404(undefined4 param_1,undefined4 param_2)
{
FUN_0800a264(param_1,param_2,DAT_08005420,1,5,0);
return;
}
void FUN_08005424(int param_1)
{
if (param_1 == 0) {
*DAT_08005438 = DAT_0800543c;
}
FUN_0800a090();
return;
}
void FUN_08005440(int param_1)
{
if (param_1 == 0) {
*DAT_08005454 = DAT_08005458;
}
FUN_0800a17c();
return;
}
byte FUN_0800545c(undefined4 param_1,undefined4 param_2)
{
byte bVar1;
byte bVar2;
byte bVar3;
int iVar4;
iVar4 = FUN_0800a2e8();
if (iVar4 == 0) {
bVar3 = 0;
}
else {
bVar1 = FUN_080052ac(iVar4,param_2);
bVar2 = FUN_08005360(iVar4,param_2);
bVar3 = FUN_0800a484(param_1);
bVar3 = bVar3 & bVar1 & bVar2;
}
return bVar3;
}
uint FUN_0800548c(undefined4 *param_1,int param_2,int param_3)
{
uint uVar1;
int iVar2;
uint uVar3;
undefined1 auStack_50 [4];
undefined1 auStack_4c [2];
ushort local_4a;
undefined1 auStack_44 [2];
ushort local_42;
uVar1 = FUN_08005404(param_1,0);
if ((uVar1 & 0xff) == 0) {
iVar2 = FUN_08005524(auStack_50);
if (iVar2 == 0) {
uVar1 = FUN_080053fc(*param_1);
}
else {
uVar3 = 0;
while (param_2 != 0) {
if (local_42 <= uVar3) {
uVar3 = 0;
goto LAB_080054f0;
}
FUN_08009eb8(auStack_44,uVar3,*(undefined4 *)(param_2 + uVar3 * 4));
uVar3 = uVar3 + 1 & 0xffff;
}
uVar3 = 0;
LAB_080054f0:
for (; (param_3 != 0 && (uVar3 < local_4a)); uVar3 = uVar3 + 1 & 0xffff) {
FUN_08009eb8(auStack_4c,uVar3,*(undefined4 *)(param_3 + uVar3 * 4));
}
iVar2 = FUN_0800545c(*param_1,auStack_50);
if (iVar2 == 0) {
uVar1 = FUN_080053fc(*param_1);
}
}
}
return uVar1;
}
void FUN_0800551a(void)
{
FUN_0800a4e4();
return;
}
undefined4 FUN_08005524(int param_1)
{
undefined4 uVar1;
undefined4 local_18;
undefined4 uStack_14;
undefined4 local_10;
undefined4 uStack_c;
if (param_1 != 0) {
local_10 = *(undefined4 *)(DAT_08005558 + 0x20);
uStack_c = *(undefined4 *)(DAT_08005558 + 0x24);
local_18 = *(undefined4 *)(DAT_08005558 + 0x28);
uStack_14 = *(undefined4 *)(DAT_08005558 + 0x2c);
uVar1 = FUN_0800a028(param_1,&local_18);
return uVar1;
}
return 0;
}
undefined4 FUN_0800555c(int *param_1,uint param_2)
{
undefined4 uVar1;
uint uVar2;
uint uVar3;
int iVar4;
iVar4 = *param_1;
if ((uint)param_1[param_2 * 9 + 9] < (uint)param_1[param_2 * 9 + 10]) {
uVar1 = 1;
}
else {
uVar2 = param_1[param_2 * 9 + 9] - param_1[param_2 * 9 + 10];
uVar3 = param_1[param_2 * 9 + 7];
if (uVar2 <= (uint)param_1[param_2 * 9 + 7]) {
uVar3 = uVar2;
}
while (uVar3 + 3 >> 2 <= (*(uint *)(iVar4 + param_2 * 0x20 + 0x918) & 0xffff)) {
uVar2 = param_1[param_2 * 9 + 9];
if ((uVar2 <= (uint)param_1[param_2 * 9 + 10]) || (uVar2 == 0)) break;
uVar2 = uVar2 - param_1[param_2 * 9 + 10];
uVar3 = param_1[param_2 * 9 + 7];
if (uVar2 <= (uint)param_1[param_2 * 9 + 7]) {
uVar3 = uVar2;
}
FUN_080068e6(iVar4,param_1[param_2 * 9 + 8],param_2 & 0xff,uVar3 & 0xffff,
*(undefined1 *)((int)param_1 + 6));
param_1[param_2 * 9 + 8] = param_1[param_2 * 9 + 8] + uVar3;
param_1[param_2 * 9 + 10] = param_1[param_2 * 9 + 10] + uVar3;
}
if ((uint)param_1[param_2 * 9 + 10] < (uint)param_1[param_2 * 9 + 9]) {
uVar1 = 0;
}
else {
*(uint *)(iVar4 + 0x834) = *(uint *)(iVar4 + 0x834) & ~(1 << (param_2 & 0xf));
uVar1 = 0;
}
}
return uVar1;
}
undefined4 FUN_0800562c(int *param_1)
{
byte bVar1;
uint uVar2;
int iVar3;
undefined4 uVar4;
if (param_1 == (int *)0x0) {
uVar4 = 1;
}
else {
iVar3 = *param_1;
if (*(char *)((int)param_1 + 0x495) == '\0') {
*(undefined1 *)(param_1 + 0x125) = 0;
FUN_080017c8();
}
*(undefined1 *)((int)param_1 + 0x495) = 3;
if (iVar3 == 0x50000000) {
*(undefined1 *)((int)param_1 + 6) = 0;
}
FUN_08006454(*param_1);
iVar3 = FUN_080062d0(*param_1,param_1[1],param_1[2],param_1[3],(char)param_1[4]);
if (iVar3 == 0) {
iVar3 = FUN_08006d12(*param_1,0);
if (iVar3 == 0) {
for (uVar2 = 0; bVar1 = *(byte *)(param_1 + 1), uVar2 < bVar1; uVar2 = uVar2 + 1 & 0xff) {
*(undefined1 *)((int)param_1 + uVar2 * 0x24 + 0x15) = 1;
*(char *)(param_1 + uVar2 * 9 + 5) = (char)uVar2;
*(short *)((int)param_1 + uVar2 * 0x24 + 0x2e) = (short)uVar2;
*(undefined1 *)(param_1 + uVar2 * 9 + 6) = 0;
param_1[uVar2 * 9 + 7] = 0;
param_1[uVar2 * 9 + 8] = 0;
param_1[uVar2 * 9 + 9] = 0;
}
for (uVar2 = 0; uVar2 < bVar1; uVar2 = uVar2 + 1 & 0xff) {
*(undefined1 *)((int)param_1 + uVar2 * 0x24 + 0x255) = 0;
*(char *)(param_1 + uVar2 * 9 + 0x95) = (char)uVar2;
*(undefined1 *)(param_1 + uVar2 * 9 + 0x96) = 0;
param_1[uVar2 * 9 + 0x97] = 0;
param_1[uVar2 * 9 + 0x98] = 0;
param_1[uVar2 * 9 + 0x99] = 0;
}
iVar3 = FUN_08006500(*param_1,param_1[1],param_1[2],param_1[3],(char)param_1[4]);
if (iVar3 == 0) {
*(undefined1 *)((int)param_1 + 0x11) = 0;
*(undefined1 *)((int)param_1 + 0x495) = 1;
if ((char)param_1[3] == '\x01') {
FUN_08006260(param_1);
}
FUN_08006c90(*param_1);
uVar4 = 0;
}
else {
*(undefined1 *)((int)param_1 + 0x495) = 2;
uVar4 = 1;
}
}
else {
*(undefined1 *)((int)param_1 + 0x495) = 2;
uVar4 = 1;
}
}
else {
*(undefined1 *)((int)param_1 + 0x495) = 2;
uVar4 = 1;
}
}
return uVar4;
}
undefined4 FUN_0800573e(int *param_1)
{
int iVar1;
iVar1 = *param_1;
if ((char)param_1[0x125] != '\x01') {
*(undefined1 *)(param_1 + 0x125) = 1;
if (((*(uint *)(iVar1 + 0xc) & 0x40) != 0) && (*(char *)((int)param_1 + 0xd) == '\x01')) {
*(uint *)(iVar1 + 0x38) = *(uint *)(iVar1 + 0x38) | 0x10000;
}
FUN_08006448(*param_1);
FUN_08006c74(*param_1);
*(undefined1 *)(param_1 + 0x125) = 0;
return 0;
}
return 2;
}
undefined4 FUN_08005782(int *param_1)
{
undefined4 uVar1;
int iVar2;
iVar2 = *param_1;
if ((char)param_1[0x125] == '\x01') {
uVar1 = 2;
}
else {
*(undefined1 *)(param_1 + 0x125) = 1;
FUN_08006454(iVar2);
FUN_08006c90(*param_1);
FUN_08006460(*param_1,0x10);
if (((*(uint *)(iVar2 + 0xc) & 0x40) != 0) && (*(char *)((int)param_1 + 0xd) == '\x01')) {
*(uint *)(iVar2 + 0x38) = *(uint *)(iVar2 + 0x38) & 0xfffeffff;
}
uVar1 = 0;
*(undefined1 *)(param_1 + 0x125) = 0;
}
return uVar1;
}
undefined4 FUN_080057d0(int *param_1,uint param_2)
{
int iVar1;
uint uVar2;
int iVar3;
uint uVar4;
iVar1 = *param_1;
uVar4 = *(uint *)(iVar1 + 0x40);
iVar3 = iVar1 + param_2 * 0x20;
uVar2 = *(uint *)(iVar3 + 0xb08);
if (*(char *)((int)param_1 + 6) == '\x01') {
if ((uVar2 & 8) == 0) {
if ((uVar2 & 0x20) == 0) {
if ((uVar2 & 0x28) == 0) {
if ((DAT_080058d0 < uVar4) && ((uVar2 & 0x8000) != 0)) {
*(undefined4 *)(iVar3 + 0xb08) = 0x8000;
}
else {
iVar3 = param_1[param_2 * 9 + 0x9d] - (*(uint *)(iVar3 + 0xb10) & 0x7ffff);
param_1[param_2 * 9 + 0x9a] = iVar3;
if (param_2 == 0) {
if (param_1[0x99] == 0) {
FUN_08006d90(iVar1,1,param_1 + 0x127);
}
else {
param_1[0x98] = param_1[0x98] + iVar3;
}
}
FUN_08006e00(param_1,param_2 & 0xff);
}
}
}
else {
*(undefined4 *)(iVar3 + 0xb08) = 0x20;
}
}
else if ((DAT_080058d0 < uVar4) && ((uVar2 & 0x8000) != 0)) {
*(undefined4 *)(iVar3 + 0xb08) = 0x8000;
}
}
else if (uVar4 == DAT_080058cc) {
if ((uVar2 & 0x8000) == 0) {
if ((uVar2 & 0x20) != 0) {
*(undefined4 *)(iVar3 + 0xb08) = 0x20;
}
FUN_08006e00(param_1,param_2 & 0xff);
}
else {
*(undefined4 *)(iVar3 + 0xb08) = 0x8000;
}
}
else {
if ((param_2 == 0) && (param_1[0x99] == 0)) {
FUN_08006d90(iVar1,0,param_1 + 0x127);
}
FUN_08006e00(param_1,param_2 & 0xff);
}
return 0;
}
undefined4 FUN_080058d4(int *param_1,int param_2,undefined4 param_3,undefined4 param_4)
{
int iVar1;
uint uVar2;
uVar2 = *(uint *)(*param_1 + 0x40);
iVar1 = *param_1 + param_2 * 0x20;
if ((DAT_08005920 < uVar2) && ((*(uint *)(iVar1 + 0xb08) & 0x8000) != 0)) {
*(undefined4 *)(iVar1 + 0xb08) = 0x8000;
}
FUN_08006df0(param_1);
if ((DAT_08005920 < uVar2) && (*(char *)((int)param_1 + 6) == '\x01')) {
FUN_08006d90(*param_1,1,param_1 + 0x127,1,param_4);
}
return 0;
}
undefined4 FUN_08005924(undefined4 *param_1,undefined1 param_2)
{
if (*(char *)(param_1 + 0x125) != '\x01') {
*(undefined1 *)(param_1 + 0x125) = 1;
*(undefined1 *)((int)param_1 + 0x11) = param_2;
FUN_08006c54(*param_1);
*(undefined1 *)(param_1 + 0x125) = 0;
return 0;
}
return 2;
}
undefined4 FUN_0800594a(undefined4 *param_1,uint param_2,uint param_3,int param_4)
{
int iVar1;
undefined4 uVar2;
undefined4 *puVar3;
if ((param_2 & 0x80) == 0) {
iVar1 = (param_2 & 0xf) * 9 + 0x95;
*(undefined1 *)((int)param_1 + (param_2 & 0xf) * 0x24 + 0x255) = 0;
}
else {
iVar1 = (param_2 & 0xf) * 9 + 5;
*(undefined1 *)((int)param_1 + (param_2 & 0xf) * 0x24 + 0x15) = 1;
}
puVar3 = param_1 + iVar1;
*(char *)puVar3 = (char)(param_2 & 0xf);
puVar3[2] = param_3 & 0x7ff;
*(char *)(puVar3 + 1) = (char)param_4;
if (*(char *)((int)puVar3 + 1) != '\0') {
*(short *)((int)puVar3 + 0x1a) = (short)(param_2 & 0xf);
}
if (param_4 == 2) {
*(undefined1 *)((int)puVar3 + 5) = 0;
}
if (*(char *)(param_1 + 0x125) == '\x01') {
uVar2 = 2;
}
else {
*(undefined1 *)(param_1 + 0x125) = 1;
FUN_080066ae(*param_1);
uVar2 = 0;
*(undefined1 *)(param_1 + 0x125) = 0;
}
return uVar2;
}
undefined4 FUN_080059d6(undefined4 *param_1,uint param_2)
{
int iVar1;
undefined4 uVar2;
if ((param_2 & 0x80) == 0) {
iVar1 = (param_2 & 0xf) * 9 + 0x95;
*(undefined1 *)((int)param_1 + (param_2 & 0xf) * 0x24 + 0x255) = 0;
}
else {
iVar1 = (param_2 & 0xf) * 9 + 5;
*(undefined1 *)((int)param_1 + (param_2 & 0xf) * 0x24 + 0x15) = 1;
}
*(byte *)(param_1 + iVar1) = (byte)param_2 & 0xf;
if (*(char *)(param_1 + 0x125) == '\x01') {
uVar2 = 2;
}
else {
*(undefined1 *)(param_1 + 0x125) = 1;
FUN_08006748(*param_1);
uVar2 = 0;
*(undefined1 *)(param_1 + 0x125) = 0;
}
return uVar2;
}
undefined4 FUN_08005a46(undefined4 *param_1,uint param_2,undefined4 param_3,undefined4 param_4)
{
param_2 = param_2 & 0xf;
param_1[param_2 * 9 + 0x98] = param_3;
param_1[param_2 * 9 + 0x99] = param_4;
param_1[param_2 * 9 + 0x9a] = 0;
*(undefined1 *)((int)param_1 + param_2 * 0x24 + 0x255) = 0;
*(char *)(param_1 + param_2 * 9 + 0x95) = (char)param_2;
if (*(char *)((int)param_1 + 6) == '\x01') {
param_1[param_2 * 9 + 0x9c] = param_3;
}
FUN_08006914(*param_1,param_1 + param_2 * 9 + 0x95);
return 0;
}
undefined4 FUN_08005a90(undefined4 *param_1,uint param_2,undefined4 param_3,undefined4 param_4)
{
param_2 = param_2 & 0xf;
param_1[param_2 * 9 + 8] = param_3;
param_1[param_2 * 9 + 9] = param_4;
param_1[param_2 * 9 + 10] = 0;
*(undefined1 *)((int)param_1 + param_2 * 0x24 + 0x15) = 1;
*(char *)(param_1 + param_2 * 9 + 5) = (char)param_2;
if (*(char *)((int)param_1 + 6) == '\x01') {
param_1[param_2 * 9 + 0xc] = param_3;
}
FUN_08006914(*param_1,param_1 + param_2 * 9 + 5);
return 0;
}
undefined4 FUN_08005ada(undefined4 *param_1,uint param_2)
{
int iVar1;
undefined4 uVar2;
uint uVar3;
uVar3 = param_2 & 0xf;
if (*(byte *)(param_1 + 1) < uVar3) {
uVar2 = 1;
}
else {
if ((param_2 & 0x80) == 0) {
iVar1 = param_2 * 9 + 0x95;
*(undefined1 *)((int)param_1 + param_2 * 0x24 + 0x255) = 0;
}
else {
iVar1 = uVar3 * 9 + 5;
*(undefined1 *)((int)param_1 + uVar3 * 0x24 + 0x15) = 1;
}
*(undefined1 *)((int)(param_1 + iVar1) + 2) = 1;
*(char *)(param_1 + iVar1) = (char)uVar3;
if (*(char *)(param_1 + 0x125) == '\x01') {
uVar2 = 2;
}
else {
*(undefined1 *)(param_1 + 0x125) = 1;
FUN_08006b9e(*param_1);
if (uVar3 == 0) {
FUN_08006d90(*param_1,*(undefined1 *)((int)param_1 + 6),param_1 + 0x127);
}
uVar2 = 0;
*(undefined1 *)(param_1 + 0x125) = 0;
}
}
return uVar2;
}
undefined4 FUN_08005b60(undefined4 *param_1,uint param_2)
{
int iVar1;
undefined4 uVar2;
uint uVar3;
uVar3 = param_2 & 0xf;
if (uVar3 <= *(byte *)(param_1 + 1)) {
if ((param_2 & 0x80) == 0) {
iVar1 = uVar3 * 9 + 0x95;
*(undefined1 *)((int)param_1 + uVar3 * 0x24 + 0x255) = 0;
}
else {
iVar1 = uVar3 * 9 + 5;
*(undefined1 *)((int)param_1 + uVar3 * 0x24 + 0x15) = 1;
}
*(undefined1 *)((int)(param_1 + iVar1) + 2) = 0;
*(char *)(param_1 + iVar1) = (char)uVar3;
if (*(char *)(param_1 + 0x125) == '\x01') {
uVar2 = 2;
}
else {
*(undefined1 *)(param_1 + 0x125) = 1;
FUN_08006bf8(*param_1);
uVar2 = 0;
*(undefined1 *)(param_1 + 0x125) = 0;
}
return uVar2;
}
return 1;
}
void FUN_08005bd4(undefined4 *param_1,uint param_2,undefined4 param_3,undefined4 param_4)
{
int iVar1;
if ((param_2 & 0x80) == 0) {
iVar1 = (param_2 & 0xf) * 9 + 0x95;
}
else {
iVar1 = (param_2 & 0xf) * 9 + 5;
}
FUN_08006828(*param_1,param_1 + iVar1,param_3,param_4,param_4);
return;
}
void FUN_08005c08(int *param_1)
{
undefined1 uVar1;
int iVar2;
uint uVar3;
uint uVar4;
undefined4 uVar5;
int iVar6;
uint uVar7;
uint uVar8;
iVar6 = *param_1;
iVar2 = FUN_08006d0a(iVar6);
if ((iVar2 == 0) && (iVar2 = FUN_08006cac(*param_1), iVar2 != 0)) {
param_1[0x135] = (uint)(*(int *)(iVar6 + 0x808) << 10) >> 0x12;
uVar3 = FUN_08006cac(*param_1);
if ((uVar3 & 2) != 0) {
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 2;
}
uVar3 = FUN_08006cac(*param_1);
if ((uVar3 & 0x10) != 0) {
*(uint *)(*param_1 + 0x18) = *(uint *)(*param_1 + 0x18) & 0xffffffef;
uVar3 = *(uint *)(iVar6 + 0x20);
uVar7 = uVar3 & 0xf;
if ((uVar3 & 0x1e0000) == 0x40000) {
if ((uVar3 & 0x7ff0) != 0) {
FUN_08006b58(iVar6,param_1[uVar7 * 9 + 0x98],(uVar3 << 0x11) >> 0x15);
uVar3 = uVar3 >> 4 & 0x7ff;
param_1[uVar7 * 9 + 0x98] = param_1[uVar7 * 9 + 0x98] + uVar3;
param_1[uVar7 * 9 + 0x9a] = param_1[uVar7 * 9 + 0x9a] + uVar3;
}
}
else if ((uVar3 & 0x1e0000) == 0xc0000) {
FUN_08006b58(iVar6,param_1 + 0x127,8);
param_1[uVar7 * 9 + 0x9a] = param_1[uVar7 * 9 + 0x9a] + ((uVar3 << 0x11) >> 0x15);
}
*(uint *)(*param_1 + 0x18) = *(uint *)(*param_1 + 0x18) | 0x10;
}
uVar3 = FUN_08006cac(*param_1);
if ((uVar3 & 0x80000) != 0) {
uVar7 = FUN_08006cb4(*param_1);
uVar3 = 0;
for (; uVar7 != 0; uVar7 = uVar7 >> 1) {
if ((uVar7 & 1) != 0) {
uVar4 = FUN_08006cd4(*param_1,uVar3 & 0xff);
if ((uVar4 & 1) != 0) {
*(undefined4 *)(iVar6 + uVar3 * 0x20 + 0xb08) = 1;
FUN_080057d0(param_1,uVar3);
}
if ((uVar4 & 8) != 0) {
*(undefined4 *)(iVar6 + uVar3 * 0x20 + 0xb08) = 8;
FUN_080058d4(param_1,uVar3);
}
if ((uVar4 & 0x10) != 0) {
*(undefined4 *)(iVar6 + uVar3 * 0x20 + 0xb08) = 0x10;
}
if ((uVar4 & 2) != 0) {
if ((*(uint *)(iVar6 + 0x14) & 0x80) != 0) {
*(uint *)(iVar6 + 0x804) = *(uint *)(iVar6 + 0x804) | 0x400;
}
if (*(char *)((int)param_1 + uVar3 * 0x24 + 599) == '\x01') {
*(undefined1 *)((int)param_1 + uVar3 * 0x24 + 599) = 0;
FUN_08006ea0(param_1,uVar3 & 0xff);
}
*(undefined4 *)(iVar6 + uVar3 * 0x20 + 0xb08) = 2;
}
if ((uVar4 & 0x20) != 0) {
*(undefined4 *)(iVar6 + uVar3 * 0x20 + 0xb08) = 0x20;
}
if ((uVar4 & 0x2000) != 0) {
*(undefined4 *)(iVar6 + uVar3 * 0x20 + 0xb08) = 0x2000;
}
}
uVar3 = uVar3 + 1;
}
}
uVar3 = FUN_08006cac(*param_1);
if ((uVar3 & 0x40000) != 0) {
uVar7 = FUN_08006cc4(*param_1);
uVar3 = 0;
for (; uVar7 != 0; uVar7 = uVar7 >> 1) {
if ((uVar7 & 1) != 0) {
uVar8 = uVar3 & 0xff;
uVar4 = FUN_08006ce6(*param_1,uVar8);
if ((uVar4 & 1) != 0) {
*(uint *)(iVar6 + 0x834) = *(uint *)(iVar6 + 0x834) & ~(1 << (uVar3 & 0xf));
*(undefined4 *)(iVar6 + uVar3 * 0x20 + 0x908) = 1;
if (*(char *)((int)param_1 + 6) == '\x01') {
param_1[uVar3 * 9 + 8] = param_1[uVar3 * 9 + 8] + param_1[uVar3 * 9 + 7];
if ((uVar3 == 0) && (param_1[9] == 0)) {
FUN_08006d90(*param_1,1,param_1 + 0x127);
}
}
FUN_08006e18(param_1,uVar8);
}
if ((uVar4 & 8) != 0) {
*(undefined4 *)(iVar6 + uVar3 * 0x20 + 0x908) = 8;
}
if ((uVar4 & 0x10) != 0) {
*(undefined4 *)(iVar6 + uVar3 * 0x20 + 0x908) = 0x10;
}
if ((uVar4 & 0x40) != 0) {
*(undefined4 *)(iVar6 + uVar3 * 0x20 + 0x908) = 0x40;
}
if ((uVar4 & 2) != 0) {
FUN_08006460(iVar6,uVar3);
if (*(char *)((int)param_1 + uVar3 * 0x24 + 0x17) == '\x01') {
*(undefined1 *)((int)param_1 + uVar3 * 0x24 + 0x17) = 0;
FUN_08006eac(param_1,uVar8);
}
*(undefined4 *)(iVar6 + uVar3 * 0x20 + 0x908) = 2;
}
if ((uVar4 & 0x80) != 0) {
FUN_0800555c(param_1,uVar3);
}
}
uVar3 = uVar3 + 1;
}
}
iVar2 = FUN_08006cac(*param_1);
if (iVar2 < 0) {
*(uint *)(iVar6 + 0x804) = *(uint *)(iVar6 + 0x804) & 0xfffffffe;
if ((char)param_1[0x133] == '\x01') {
*(undefined1 *)(param_1 + 0x133) = 0;
FUN_08006f64(param_1);
}
else {
FUN_08006e94(param_1);
}
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 0x80000000;
}
uVar3 = FUN_08006cac(*param_1);
if ((uVar3 & 0x800) != 0) {
if ((*(uint *)(iVar6 + 0x808) & 1) != 0) {
FUN_08006e64(param_1);
}
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 0x800;
}
uVar3 = FUN_08006cac(*param_1);
if ((uVar3 & 0x8000000) != 0) {
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 0x8000000;
if ((char)param_1[0x133] == '\0') {
*(undefined1 *)(param_1 + 0x133) = 1;
param_1[0x134] = (uint)(*(int *)(*param_1 + 0x54) << 0x1a) >> 0x1c;
FUN_08006f64(param_1);
}
else {
FUN_08006e64(param_1);
}
}
uVar3 = FUN_08006cac(*param_1);
if ((uVar3 & 0x1000) != 0) {
*(uint *)(iVar6 + 0x804) = *(uint *)(iVar6 + 0x804) & 0xfffffffe;
FUN_08006460(*param_1,0x10);
for (uVar3 = 0; uVar3 < *(byte *)(param_1 + 1); uVar3 = uVar3 + 1) {
iVar2 = iVar6 + uVar3 * 0x20;
*(undefined4 *)(iVar2 + 0x908) = 0xfb7f;
*(uint *)(iVar2 + 0x900) = *(uint *)(iVar2 + 0x900) & 0xffdfffff;
*(undefined4 *)(iVar2 + 0xb08) = 0xfb7f;
*(uint *)(iVar2 + 0xb00) = *(uint *)(iVar2 + 0xb00) & 0xffdfffff;
*(uint *)(iVar2 + 0xb00) = *(uint *)(iVar2 + 0xb00) | 0x8000000;
}
*(uint *)(iVar6 + 0x81c) = *(uint *)(iVar6 + 0x81c) | 0x10001;
if (*(char *)((int)param_1 + 0xf) == '\0') {
*(uint *)(iVar6 + 0x814) = *(uint *)(iVar6 + 0x814) | 0x202b;
*(uint *)(iVar6 + 0x810) = *(uint *)(iVar6 + 0x810) | 0xb;
}
else {
*(uint *)(iVar6 + 0x884) = *(uint *)(iVar6 + 0x884) | 0xb;
*(uint *)(iVar6 + 0x844) = *(uint *)(iVar6 + 0x844) | 0xb;
}
*(uint *)(iVar6 + 0x800) = *(uint *)(iVar6 + 0x800) & 0xfffff80f;
FUN_08006d90(*param_1,*(undefined1 *)((int)param_1 + 6),param_1 + 0x127);
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 0x1000;
}
uVar3 = FUN_08006cac(*param_1);
if ((uVar3 & 0x2000) != 0) {
FUN_08006d74(*param_1);
uVar1 = FUN_0800668c(*param_1);
*(undefined1 *)((int)param_1 + 7) = uVar1;
iVar2 = *param_1;
uVar5 = FUN_080019d0();
FUN_08006364(iVar2,uVar5,*(undefined1 *)((int)param_1 + 7));
FUN_08006e3a(param_1);
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 0x2000;
}
uVar3 = FUN_08006cac(*param_1);
if ((uVar3 & 8) != 0) {
FUN_08006e2e(param_1);
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 8;
}
uVar3 = FUN_08006cac(*param_1);
if ((uVar3 & 0x80) != 0) {
*(uint *)(iVar6 + 0x18) = *(uint *)(iVar6 + 0x18) & 0xffffff7f;
for (uVar3 = 1; uVar3 < *(byte *)(param_1 + 1); uVar3 = uVar3 + 1) {
if (*(char *)((int)param_1 + uVar3 * 0x24 + 599) == '\x01') {
FUN_08005bd4(param_1,uVar3 & 0xff);
}
}
}
uVar3 = FUN_08006cac(*param_1);
if ((uVar3 & 0x100000) != 0) {
for (uVar3 = 1; uVar3 < *(byte *)(param_1 + 1); uVar3 = uVar3 + 1) {
if (((char)param_1[uVar3 * 9 + 6] == '\x01') && (*(int *)(iVar6 + uVar3 * 0x20 + 0x900) < 0)
) {
*(undefined1 *)((int)param_1 + uVar3 * 0x24 + 0x17) = 1;
FUN_08005bd4(param_1,(uVar3 | 0xffffff80) & 0xff);
}
}
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 0x100000;
}
uVar3 = FUN_08006cac(*param_1);
if ((uVar3 & 0x200000) != 0) {
for (uVar3 = 1; uVar3 < *(byte *)(param_1 + 1); uVar3 = uVar3 + 1) {
uVar7 = *(uint *)(iVar6 + uVar3 * 0x20 + 0xb00);
if ((((char)param_1[uVar3 * 9 + 0x96] == '\x01') && ((int)uVar7 < 0)) &&
((uVar7 & 0x10000) == (param_1[0x135] & 1U))) {
*(undefined1 *)((int)param_1 + uVar3 * 0x24 + 599) = 1;
*(uint *)(iVar6 + 0x18) = *(uint *)(iVar6 + 0x18) | 0x80;
if ((*(uint *)(iVar6 + 0x14) & 0x80) == 0) {
*(uint *)(iVar6 + 0x804) = *(uint *)(iVar6 + 0x804) | 0x200;
break;
}
}
}
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 0x200000;
}
uVar3 = FUN_08006cac(*param_1);
if ((uVar3 & 0x40000000) != 0) {
FUN_08006eb8(param_1);
*(uint *)(*param_1 + 0x14) = *(uint *)(*param_1 + 0x14) & 0x40000000;
}
uVar3 = FUN_08006cac(*param_1);
if ((uVar3 & 4) != 0) {
uVar3 = *(uint *)(*param_1 + 4);
if ((uVar3 & 4) != 0) {
FUN_08006ec4(param_1);
}
*(uint *)(*param_1 + 4) = *(uint *)(*param_1 + 4) | uVar3;
}
}
return;
}
undefined4 FUN_0800620c(int *param_1,int param_2,int param_3)
{
uint uVar1;
uint uVar2;
int iVar3;
iVar3 = *param_1;
if (param_2 == 0) {
*(uint *)(iVar3 + 0x28) = *(uint *)(iVar3 + 0x24) | param_3 << 0x10;
}
else {
uVar1 = *(uint *)(iVar3 + 0x24) + (*(uint *)(iVar3 + 0x28) >> 0x10);
for (uVar2 = 0; uVar2 < param_2 - 1U; uVar2 = uVar2 + 1 & 0xff) {
uVar1 = uVar1 + (*(uint *)(iVar3 + (uVar2 + 0x40) * 4 + 4) >> 0x10);
}
*(uint *)(iVar3 + (param_2 + 0x3f) * 4 + 4) = uVar1 | param_3 << 0x10;
}
return 0;
}
undefined4 FUN_08006258(int *param_1,undefined4 param_2)
{
*(undefined4 *)(*param_1 + 0x24) = param_2;
return 0;
}
void FUN_08006260(int *param_1)
{
int iVar1;
iVar1 = *param_1;
param_1[0x136] = 1;
*(undefined1 *)(param_1 + 0x133) = 0;
*(uint *)(iVar1 + 0x18) = *(uint *)(iVar1 + 0x18) | 0x8000000;
*(uint *)(iVar1 + 0x54) = *(uint *)(iVar1 + 0x54) | 0x10000003;
return;
}
undefined4 FUN_08006286(int param_1)
{
uint local_4;
local_4 = 0;
do {
local_4 = local_4 + 1;
if (0xf000000 < local_4) {
return 3;
}
} while (-1 < *(int *)(param_1 + 0x10));
local_4 = 0;
*(uint *)(param_1 + 0x10) = *(uint *)(param_1 + 0x10) | 1;
do {
local_4 = local_4 + 1;
if (0xf000000 < local_4) {
return 3;
}
} while ((*(uint *)(param_1 + 0x10) & 1) != 0);
return 0;
}
void FUN_080062d0(int param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,char param_5)
{
undefined1 uStack_a;
undefined1 local_7;
undefined1 local_3;
local_7 = (char)((uint)param_3 >> 8);
if (local_7 == '\x01') {
*(uint *)(param_1 + 0x38) = *(uint *)(param_1 + 0x38) & 0xfffeffff;
*(uint *)(param_1 + 0xc) = *(uint *)(param_1 + 0xc) & 0xffbdffbf;
*(uint *)(param_1 + 0xc) = *(uint *)(param_1 + 0xc) & 0xffcfffff;
if (param_5 == '\x01') {
*(uint *)(param_1 + 0xc) = *(uint *)(param_1 + 0xc) | 0x100000;
}
FUN_08006286(param_1);
}
else {
*(uint *)(param_1 + 0xc) = *(uint *)(param_1 + 0xc) | 0x40;
FUN_08006286(param_1);
local_3 = (char)((uint)param_4 >> 8);
if (local_3 == '\0') {
*(uint *)(param_1 + 0x38) = *(uint *)(param_1 + 0x38) | 0x10000;
}
else {
*(uint *)(param_1 + 0x38) = *(uint *)(param_1 + 0x38) & 0xfffeffff;
}
}
uStack_a = (char)((uint)param_2 >> 0x10);
if (uStack_a == '\x01') {
*(uint *)(param_1 + 8) = *(uint *)(param_1 + 8) | 6;
*(uint *)(param_1 + 8) = *(uint *)(param_1 + 8) | 0x20;
}
return;
}
undefined4 FUN_08006364(int param_1,int param_2,int param_3)
{
int iVar1;
if (param_3 == 2) {
if (DAT_08006410 < (uint)(DAT_0800640c + param_2)) {
if (DAT_08006418 < (uint)(DAT_08006414 + param_2)) {
if (DAT_0800641c < param_2 - 16000000U) {
if (param_2 + 0xfef98c80U < DAT_08006420) {
iVar1 = 0xc;
}
else if (DAT_08006428 < (uint)(DAT_08006424 + param_2)) {
if ((uint)(DAT_0800642c + param_2) < DAT_08006430) {
iVar1 = 10;
}
else if ((uint)(DAT_08006434 + param_2) < DAT_08006438) {
iVar1 = 9;
}
else if (param_2 + 0xfe91ca00U < DAT_0800643c) {
iVar1 = 8;
}
else if ((uint)(DAT_08006440 + param_2) < DAT_08006444) {
iVar1 = 7;
}
else {
iVar1 = 6;
}
}
else {
iVar1 = 0xb;
}
}
else {
iVar1 = 0xd;
}
}
else {
iVar1 = 0xe;
}
}
else {
iVar1 = 0xf;
}
}
else {
iVar1 = 9;
}
*(uint *)(param_1 + 0xc) = *(uint *)(param_1 + 0xc) & 0xffffc3ff;
*(uint *)(param_1 + 0xc) = *(uint *)(param_1 + 0xc) | iVar1 << 10;
return 0;
}
undefined4 FUN_08006448(int param_1)
{
*(uint *)(param_1 + 8) = *(uint *)(param_1 + 8) | 1;
return 0;
}
undefined4 FUN_08006454(int param_1)
{
*(uint *)(param_1 + 8) = *(uint *)(param_1 + 8) & 0xfffffffe;
return 0;
}
undefined4 FUN_08006460(int param_1,int param_2)
{
uint local_4;
local_4 = 0;
do {
local_4 = local_4 + 1;
if (0xf000000 < local_4) {
return 3;
}
} while (-1 < *(int *)(param_1 + 0x10));
local_4 = 0;
*(uint *)(param_1 + 0x10) = param_2 << 6 | 0x20;
do {
local_4 = local_4 + 1;
if (0xf000000 < local_4) {
return 3;
}
} while ((*(uint *)(param_1 + 0x10) & 0x20) != 0);
return 0;
}
undefined4 FUN_080064aa(int param_1)
{
uint local_4;
local_4 = 0;
do {
local_4 = local_4 + 1;
if (0xf000000 < local_4) {
return 3;
}
} while (-1 < *(int *)(param_1 + 0x10));
local_4 = 0;
*(undefined4 *)(param_1 + 0x10) = 0x10;
do {
local_4 = local_4 + 1;
if (0xf000000 < local_4) {
return 3;
}
} while ((*(uint *)(param_1 + 0x10) & 0x10) != 0);
return 0;
}
undefined4 FUN_080064f0(int param_1,uint param_2)
{
*(uint *)(param_1 + 0x800) = param_2 | *(uint *)(param_1 + 0x800);
return 0;
}
int FUN_08006500(uint *param_1,uint param_2,uint *param_3,undefined4 param_4)
{
int iVar1;
int iVar2;
uint *puVar3;
uint uVar4;
char cStack_a;
char cStack_9;
char local_7;
char local_6;
char local_2;
puVar3 = param_3;
for (uVar4 = 0; uVar4 < 0xf; uVar4 = uVar4 + 1) {
puVar3 = param_1 + uVar4 + 0x40;
puVar3[1] = 0;
}
local_2 = (char)((uint)param_4 >> 0x10);
if (local_2 == '\0') {
param_1[0x201] = param_1[0x201] | 2;
param_1[0xe] = param_1[0xe] & 0xffdfffff;
*param_1 = *param_1 | 0x40;
*param_1 = *param_1 | 0x80;
}
else {
param_1[0xe] = param_1[0xe] | 0x200000;
}
param_1[0x380] = 0;
local_7 = (char)((uint)param_3 >> 8);
if (local_7 == '\x01') {
cStack_9 = (char)(param_2 >> 0x18);
if (cStack_9 == '\0') {
FUN_080064f0(param_1,0,puVar3,0,param_4);
}
else {
FUN_080064f0(param_1,1,puVar3,cStack_9,param_4);
}
}
else {
FUN_080064f0(param_1,3,puVar3,local_7,param_4);
}
iVar1 = FUN_08006460(param_1,0x10);
if (iVar1 != 0) {
iVar1 = 1;
}
iVar2 = FUN_080064aa(param_1);
if (iVar2 != 0) {
iVar1 = 1;
}
param_1[0x204] = 0;
param_1[0x205] = 0;
param_1[0x207] = 0;
for (uVar4 = 0; uVar4 < (param_2 & 0xff); uVar4 = uVar4 + 1) {
if ((int)param_1[uVar4 * 8 + 0x240] < 0) {
if (uVar4 == 0) {
param_1[0x240] = 0x8000000;
}
else {
param_1[uVar4 * 8 + 0x240] = 0x48000000;
}
}
else {
param_1[uVar4 * 8 + 0x240] = 0;
}
param_1[uVar4 * 8 + 0x244] = 0;
param_1[uVar4 * 8 + 0x242] = 0xfb7f;
}
for (uVar4 = 0; uVar4 < (param_2 & 0xff); uVar4 = uVar4 + 1) {
if ((int)param_1[uVar4 * 8 + 0x2c0] < 0) {
if (uVar4 == 0) {
param_1[0x2c0] = 0x8000000;
}
else {
param_1[uVar4 * 8 + 0x2c0] = 0x48000000;
}
}
else {
param_1[uVar4 * 8 + 0x2c0] = 0;
}
param_1[uVar4 * 8 + 0x2c4] = 0;
param_1[uVar4 * 8 + 0x2c2] = 0xfb7f;
}
param_1[0x204] = param_1[0x204] & 0xfffffeff;
param_1[6] = 0;
param_1[5] = 0xbfffffff;
cStack_a = (char)(param_2 >> 0x10);
if (cStack_a == '\0') {
param_1[6] = param_1[6] | 0x10;
}
param_1[6] = DAT_08006688 | param_1[6];
local_6 = (char)((uint)param_3 >> 0x10);
if (local_6 != '\0') {
param_1[6] = param_1[6] | 8;
}
if (local_2 == '\x01') {
param_1[6] = param_1[6] | 0x40000004;
}
return iVar1;
}
undefined4 FUN_0800668c(int param_1)
{
uint uVar1;
uVar1 = *(uint *)(param_1 + 0x808) & 6;
if (uVar1 == 2) {
return 2;
}
if (uVar1 != 6) {
if (uVar1 == 0) {
return 0;
}
return 0xf;
}
return 2;
}
undefined4 FUN_080066ae(int param_1,byte *param_2)
{
uint uVar1;
uVar1 = (uint)*param_2;
if (param_2[1] == 1) {
*(uint *)(param_1 + 0x81c) = 1 << (uVar1 & 0xf) & 0xffffU | *(uint *)(param_1 + 0x81c);
param_1 = param_1 + uVar1 * 0x20;
if ((*(uint *)(param_1 + 0x900) & 0x8000) == 0) {
*(uint *)(param_1 + 0x900) =
*(uint *)(param_1 + 0x900) |
*(uint *)(param_2 + 8) & 0x7ff | (uint)param_2[4] << 0x12 | uVar1 << 0x16 | 0x10008000;
}
}
else {
*(uint *)(param_1 + 0x81c) = *(uint *)(param_1 + 0x81c) | (1 << (uVar1 & 0xf)) << 0x10;
param_1 = param_1 + uVar1 * 0x20;
if ((*(uint *)(param_1 + 0xb00) & 0x8000) == 0) {
*(uint *)(param_1 + 0xb00) =
*(uint *)(param_1 + 0xb00) | *(uint *)(param_2 + 8) & 0x7ff | (uint)param_2[4] << 0x12 |
0x10008000;
}
}
return 0;
}
undefined4 FUN_08006748(int param_1,byte *param_2)
{
int iVar1;
if (param_2[1] == 1) {
iVar1 = param_1 + (uint)*param_2 * 0x20;
if (*(int *)(iVar1 + 0x900) < 0) {
*(uint *)(iVar1 + 0x900) = *(uint *)(iVar1 + 0x900) | 0x8000000;
*(uint *)(iVar1 + 0x900) = *(uint *)(iVar1 + 0x900) | 0x40000000;
}
*(uint *)(param_1 + 0x83c) = *(uint *)(param_1 + 0x83c) & ~(1 << (*param_2 & 0xf) & 0xffffU);
*(uint *)(param_1 + 0x81c) = *(uint *)(param_1 + 0x81c) & ~(1 << (*param_2 & 0xf) & 0xffffU);
*(uint *)(iVar1 + 0x900) = DAT_08006824 & *(uint *)(iVar1 + 0x900);
}
else {
iVar1 = param_1 + (uint)*param_2 * 0x20;
if (*(int *)(iVar1 + 0xb00) < 0) {
*(uint *)(iVar1 + 0xb00) = *(uint *)(iVar1 + 0xb00) | 0x8000000;
*(uint *)(iVar1 + 0xb00) = *(uint *)(iVar1 + 0xb00) | 0x40000000;
}
*(uint *)(param_1 + 0x83c) = *(uint *)(param_1 + 0x83c) & ~((1 << (*param_2 & 0xf)) << 0x10);
*(uint *)(param_1 + 0x81c) = *(uint *)(param_1 + 0x81c) & ~((1 << (*param_2 & 0xf)) << 0x10);
*(uint *)(iVar1 + 0xb00) = DAT_08006820 & *(uint *)(iVar1 + 0xb00);
}
return 0;
}
undefined1 FUN_08006828(int param_1,byte *param_2)
{
int iVar1;
uint local_c;
local_c = 0;
if (param_2[1] == 1) {
iVar1 = param_1 + (uint)*param_2 * 0x20;
if (*(int *)(iVar1 + 0x900) < 0) {
*(uint *)(iVar1 + 0x900) = *(uint *)(iVar1 + 0x900) | 0x8000000;
iVar1 = param_1 + (uint)*param_2 * 0x20;
*(uint *)(iVar1 + 0x900) = *(uint *)(iVar1 + 0x900) | 0x40000000;
do {
local_c = local_c + 1;
if (10000 < local_c) {
return 1;
}
} while (*(int *)(param_1 + (uint)*param_2 * 0x20 + 0x900) < 0);
}
}
else {
iVar1 = param_1 + (uint)*param_2 * 0x20;
if (*(int *)(iVar1 + 0xb00) < 0) {
*(uint *)(iVar1 + 0xb00) = *(uint *)(iVar1 + 0xb00) | 0x8000000;
iVar1 = param_1 + (uint)*param_2 * 0x20;
*(uint *)(iVar1 + 0xb00) = *(uint *)(iVar1 + 0xb00) | 0x40000000;
do {
local_c = local_c + 1;
if (10000 < local_c) {
return 1;
}
} while (*(int *)(param_1 + (uint)*param_2 * 0x20 + 0xb00) < 0);
}
}
return 0;
}
undefined4 FUN_080068e6(int param_1,undefined4 *param_2,int param_3,int param_4,char param_5)
{
uint uVar1;
if (param_5 == '\0') {
for (uVar1 = 0; uVar1 < param_4 + 3U >> 2; uVar1 = uVar1 + 1) {
*(undefined4 *)(param_1 + param_3 * 0x1000 + 0x1000) = *param_2;
param_2 = param_2 + 1;
}
}
return 0;
}
undefined4 FUN_08006914(int param_1,byte *param_2,int param_3)
{
uint uVar1;
uint uVar2;
int iVar3;
uVar1 = (uint)*param_2;
if (param_2[1] == 1) {
if (*(int *)(param_2 + 0x10) == 0) {
iVar3 = param_1 + uVar1 * 0x20;
*(uint *)(iVar3 + 0x910) = *(uint *)(iVar3 + 0x910) & 0xe007ffff;
*(uint *)(iVar3 + 0x910) = *(uint *)(iVar3 + 0x910) | 0x80000;
*(uint *)(iVar3 + 0x910) = *(uint *)(iVar3 + 0x910) & 0xfff80000;
}
else {
iVar3 = param_1 + uVar1 * 0x20;
*(uint *)(iVar3 + 0x910) = *(uint *)(iVar3 + 0x910) & 0xfff80000;
*(uint *)(iVar3 + 0x910) = *(uint *)(iVar3 + 0x910) & 0xe007ffff;
if (uVar1 == 0) {
if (*(uint *)(param_2 + 8) < *(uint *)(param_2 + 0x10)) {
*(uint *)(param_2 + 0x10) = *(uint *)(param_2 + 8);
}
*(uint *)(iVar3 + 0x910) = *(uint *)(iVar3 + 0x910) | 0x80000;
}
else {
uVar2 = ((*(int *)(param_2 + 0x10) + *(uint *)(param_2 + 8)) - 1) / *(uint *)(param_2 + 8);
*(uint *)(iVar3 + 0x910) = DAT_08006b54 & uVar2 << 0x13 | *(uint *)(iVar3 + 0x910);
if (param_2[4] == 1) {
*(uint *)(iVar3 + 0x910) = *(uint *)(iVar3 + 0x910) & 0x9fffffff;
*(uint *)(iVar3 + 0x910) = *(uint *)(iVar3 + 0x910) | (uVar2 & 3) << 0x1d;
}
}
*(uint *)(iVar3 + 0x910) = *(uint *)(iVar3 + 0x910) | *(uint *)(param_2 + 0x10) & 0x7ffff;
}
if (param_3 == 1) {
if (*(int *)(param_2 + 0x1c) != 0) {
*(int *)(param_1 + uVar1 * 0x20 + 0x914) = *(int *)(param_2 + 0x1c);
}
if (param_2[4] == 1) {
if ((*(uint *)(param_1 + 0x808) & 0x100) == 0) {
iVar3 = param_1 + uVar1 * 0x20;
*(uint *)(iVar3 + 0x900) = *(uint *)(iVar3 + 0x900) | 0x20000000;
}
else {
iVar3 = param_1 + uVar1 * 0x20;
*(uint *)(iVar3 + 0x900) = *(uint *)(iVar3 + 0x900) | 0x10000000;
}
}
param_1 = param_1 + uVar1 * 0x20;
*(uint *)(param_1 + 0x900) = *(uint *)(param_1 + 0x900) | 0x84000000;
}
else {
iVar3 = param_1 + uVar1 * 0x20;
*(uint *)(iVar3 + 0x900) = *(uint *)(iVar3 + 0x900) | 0x84000000;
if (param_2[4] == 1) {
if ((*(uint *)(param_1 + 0x808) & 0x100) == 0) {
*(uint *)(iVar3 + 0x900) = *(uint *)(iVar3 + 0x900) | 0x20000000;
}
else {
*(uint *)(iVar3 + 0x900) = *(uint *)(iVar3 + 0x900) | 0x10000000;
}
FUN_080068e6(param_1,*(undefined4 *)(param_2 + 0xc),*param_2,*(undefined2 *)(param_2 + 0x10)
,param_3);
}
else if (*(int *)(param_2 + 0x10) != 0) {
*(uint *)(param_1 + 0x834) = *(uint *)(param_1 + 0x834) | 1 << (*param_2 & 0xf);
}
}
}
else {
iVar3 = param_1 + uVar1 * 0x20;
*(uint *)(iVar3 + 0xb10) = *(uint *)(iVar3 + 0xb10) & 0xfff80000;
*(uint *)(iVar3 + 0xb10) = *(uint *)(iVar3 + 0xb10) & 0xe007ffff;
if (uVar1 == 0) {
if (*(int *)(param_2 + 0x10) != 0) {
*(undefined4 *)(param_2 + 0x10) = *(undefined4 *)(param_2 + 8);
}
*(uint *)(param_2 + 0x20) = *(uint *)(param_2 + 8);
*(uint *)(iVar3 + 0xb10) = *(uint *)(param_2 + 8) & 0x7ffff | *(uint *)(iVar3 + 0xb10);
*(uint *)(iVar3 + 0xb10) = *(uint *)(iVar3 + 0xb10) | 0x80000;
}
else if (*(int *)(param_2 + 0x10) == 0) {
*(uint *)(iVar3 + 0xb10) = *(uint *)(iVar3 + 0xb10) | *(uint *)(param_2 + 8) & 0x7ffff;
*(uint *)(iVar3 + 0xb10) = *(uint *)(iVar3 + 0xb10) | 0x80000;
}
else {
uVar2 = *(uint *)(param_2 + 8);
uVar1 = ((*(int *)(param_2 + 0x10) + uVar2) - 1) / uVar2 & 0xffff;
*(uint *)(param_2 + 0x20) = uVar1 * uVar2;
*(uint *)(iVar3 + 0xb10) = DAT_08006b54 & uVar1 << 0x13 | *(uint *)(iVar3 + 0xb10);
*(uint *)(iVar3 + 0xb10) = *(uint *)(iVar3 + 0xb10) | *(uint *)(param_2 + 0x20) & 0x7ffff;
}
if ((param_3 == 1) && (*(int *)(param_2 + 0xc) != 0)) {
*(int *)(iVar3 + 0xb14) = *(int *)(param_2 + 0xc);
}
if (param_2[4] == 1) {
if ((*(uint *)(param_1 + 0x808) & 0x100) == 0) {
*(uint *)(iVar3 + 0xb00) = *(uint *)(iVar3 + 0xb00) | 0x20000000;
}
else {
*(uint *)(iVar3 + 0xb00) = *(uint *)(iVar3 + 0xb00) | 0x10000000;
}
}
*(uint *)(iVar3 + 0xb00) = *(uint *)(iVar3 + 0xb00) | 0x84000000;
}
return 0;
}
void FUN_08006b58(int param_1,undefined4 *param_2,uint param_3)
{
byte bVar1;
uint uVar2;
uint uVar3;
uVar2 = param_3 & 3;
for (uVar3 = 0; uVar3 < param_3 >> 2; uVar3 = uVar3 + 1) {
*param_2 = *(undefined4 *)(param_1 + 0x1000);
param_2 = param_2 + 1;
}
if (uVar2 != 0) {
uVar3 = *(uint *)(param_1 + 0x1000);
bVar1 = 0;
do {
*(char *)param_2 = (char)(uVar3 >> ((bVar1 & 0x1f) << 3));
bVar1 = bVar1 + 1;
uVar2 = uVar2 - 1 & 0xffff;
param_2 = (undefined4 *)((int)param_2 + 1);
} while (uVar2 != 0);
}
return;
}
undefined4 FUN_08006b9e(int param_1,byte *param_2)
{
uint uVar1;
uVar1 = (uint)*param_2;
if (param_2[1] == 1) {
param_1 = param_1 + uVar1 * 0x20;
if ((-1 < *(int *)(param_1 + 0x900)) && (uVar1 != 0)) {
*(uint *)(param_1 + 0x900) = *(uint *)(param_1 + 0x900) & 0xbfffffff;
}
*(uint *)(param_1 + 0x900) = *(uint *)(param_1 + 0x900) | 0x200000;
}
else {
param_1 = param_1 + uVar1 * 0x20;
if ((-1 < *(int *)(param_1 + 0xb00)) && (uVar1 != 0)) {
*(uint *)(param_1 + 0xb00) = *(uint *)(param_1 + 0xb00) & 0xbfffffff;
}
*(uint *)(param_1 + 0xb00) = *(uint *)(param_1 + 0xb00) | 0x200000;
}
return 0;
}
undefined4 FUN_08006bf8(int param_1,byte *param_2)
{
if (param_2[1] == 1) {
param_1 = param_1 + (uint)*param_2 * 0x20;
*(uint *)(param_1 + 0x900) = *(uint *)(param_1 + 0x900) & 0xffdfffff;
if ((byte)(param_2[4] - 2) < 2) {
*(uint *)(param_1 + 0x900) = *(uint *)(param_1 + 0x900) | 0x10000000;
}
}
else {
param_1 = param_1 + (uint)*param_2 * 0x20;
*(uint *)(param_1 + 0xb00) = *(uint *)(param_1 + 0xb00) & 0xffdfffff;
if ((byte)(param_2[4] - 2) < 2) {
*(uint *)(param_1 + 0xb00) = *(uint *)(param_1 + 0xb00) | 0x10000000;
}
}
return 0;
}
undefined4 FUN_08006c54(int param_1,uint param_2)
{
*(uint *)(param_1 + 0x800) = *(uint *)(param_1 + 0x800) & 0xfffff80f;
*(uint *)(param_1 + 0x800) = *(uint *)(param_1 + 0x800) | (param_2 & 0x7f) << 4;
return 0;
}
undefined4 FUN_08006c74(int param_1)
{
*(uint *)(param_1 + 0xe00) = *(uint *)(param_1 + 0xe00) & 0xfffffffc;
*(uint *)(param_1 + 0x804) = *(uint *)(param_1 + 0x804) & 0xfffffffd;
return 0;
}
undefined4 FUN_08006c90(int param_1)
{
*(uint *)(param_1 + 0xe00) = *(uint *)(param_1 + 0xe00) & 0xfffffffc;
*(uint *)(param_1 + 0x804) = *(uint *)(param_1 + 0x804) | 2;
return 0;
}
uint FUN_08006cac(int param_1)
{
return *(uint *)(param_1 + 0x18) & *(uint *)(param_1 + 0x14);
}
uint FUN_08006cb4(int param_1)
{
return (*(uint *)(param_1 + 0x81c) & *(uint *)(param_1 + 0x818)) >> 0x10;
}
uint FUN_08006cc4(int param_1)
{
return *(uint *)(param_1 + 0x81c) & *(uint *)(param_1 + 0x818) & 0xffff;
}
uint FUN_08006cd4(int param_1,int param_2)
{
return *(uint *)(param_1 + 0x814) & *(uint *)(param_1 + param_2 * 0x20 + 0xb08);
}
uint FUN_08006ce6(int param_1,uint param_2)
{
return *(uint *)(param_1 + param_2 * 0x20 + 0x908) &
((*(uint *)(param_1 + 0x834) >> (param_2 & 0xf) & 1) << 7 | *(uint *)(param_1 + 0x810));
}
uint FUN_08006d0a(int param_1)
{
return *(uint *)(param_1 + 0x14) & 1;
}
bool FUN_08006d12(int param_1,int param_2)
{
int iVar1;
uint uVar2;
*(uint *)(param_1 + 0xc) = *(uint *)(param_1 + 0xc) & 0x9fffffff;
if (param_2 == 1) {
*(uint *)(param_1 + 0xc) = *(uint *)(param_1 + 0xc) | 0x20000000;
uVar2 = 0;
do {
FUN_08002f6c(10);
uVar2 = uVar2 + 10;
iVar1 = FUN_08006d0a(param_1);
if (iVar1 == 1) break;
} while (uVar2 < 200);
}
else {
if (param_2 != 0) {
return true;
}
*(uint *)(param_1 + 0xc) = *(uint *)(param_1 + 0xc) | 0x40000000;
uVar2 = 0;
do {
FUN_08002f6c(10);
uVar2 = uVar2 + 10;
iVar1 = FUN_08006d0a(param_1);
if (iVar1 == 0) break;
} while (uVar2 < 200);
}
return uVar2 == 200;
}
undefined4 FUN_08006d74(int param_1)
{
*(uint *)(param_1 + 0x900) = *(uint *)(param_1 + 0x900) & 0xfffff800;
*(uint *)(param_1 + 0x804) = *(uint *)(param_1 + 0x804) | 0x100;
return 0;
}
undefined4 FUN_08006d90(int param_1,int param_2,undefined4 param_3)
{
if ((*(uint *)(param_1 + 0x40) <= DAT_08006dec) || (-1 < *(int *)(param_1 + 0xb00))) {
*(undefined4 *)(param_1 + 0xb10) = 0;
*(uint *)(param_1 + 0xb10) = *(uint *)(param_1 + 0xb10) | 0x80000;
*(uint *)(param_1 + 0xb10) = *(uint *)(param_1 + 0xb10) | 0x18;
*(uint *)(param_1 + 0xb10) = *(uint *)(param_1 + 0xb10) | 0x60000000;
if (param_2 == 1) {
*(undefined4 *)(param_1 + 0xb14) = param_3;
*(uint *)(param_1 + 0xb00) = *(uint *)(param_1 + 0xb00) | 0x80008000;
}
}
return 0;
}
void FUN_08006df0(int param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
FUN_0800448c(*(undefined4 *)(param_1 + 0x4e0),param_1 + 0x49c,param_3,param_4,param_4);
return;
}
void FUN_08006e00(int param_1,int param_2,undefined4 param_3,undefined4 param_4)
{
int iVar1;
iVar1 = param_1 + param_2 * 0x24;
FUN_08004630(*(undefined4 *)(param_1 + 0x4e0),param_2,*(undefined4 *)(iVar1 + 0x260),iVar1,param_4
);
return;
}
void FUN_08006e18(int param_1,int param_2,undefined4 param_3,undefined4 param_4)
{
int iVar1;
iVar1 = param_1 + param_2 * 0x24;
FUN_080046f4(*(undefined4 *)(param_1 + 0x4e0),param_2,*(undefined4 *)(iVar1 + 0x20),iVar1,param_4)
;
return;
}
void FUN_08006e2e(int param_1)
{
FUN_08004586(*(undefined4 *)(param_1 + 0x4e0));
return;
}
void FUN_08006e3a(int param_1)
{
char cVar1;
cVar1 = *(char *)(param_1 + 7);
if (cVar1 != '\0') {
if (cVar1 != '\x02') {
// WARNING: Subroutine does not return
SystemHalt();
}
cVar1 = '\x01';
}
FUN_08004548(*(undefined4 *)(param_1 + 0x4e0),cVar1);
FUN_080044e4(*(undefined4 *)(param_1 + 0x4e0));
return;
}
void FUN_08006e64(int *param_1)
{
FUN_0800454e(param_1[0x138]);
*(uint *)(*param_1 + 0xe00) = *(uint *)(*param_1 + 0xe00) | 1;
if (*(char *)((int)param_1 + 0xb) != '\0') {
*(uint *)(DAT_08006e90 + 0x10) = *(uint *)(DAT_08006e90 + 0x10) | 6;
}
return;
}
void FUN_08006e94(int param_1)
{
FUN_0800456c(*(undefined4 *)(param_1 + 0x4e0));
return;
}
void FUN_08006ea0(int param_1)
{
FUN_080045d6(*(undefined4 *)(param_1 + 0x4e0));
return;
}
void FUN_08006eac(int param_1)
{
FUN_080045a8(*(undefined4 *)(param_1 + 0x4e0));
return;
}
void FUN_08006eb8(int param_1)
{
FUN_08004604(*(undefined4 *)(param_1 + 0x4e0));
return;
}
void FUN_08006ec4(int param_1)
{
FUN_08004608(*(undefined4 *)(param_1 + 0x4e0));
return;
}
undefined4 FUN_08006ed0(char *param_1)
{
undefined4 *puVar1;
int iVar2;
puVar1 = DAT_08006f34;
if (*param_1 != '\0') {
return 0;
}
DAT_08006f34[0x138] = param_1;
*(undefined4 **)(param_1 + 0x2c8) = puVar1;
*puVar1 = 0x50000000;
*(undefined1 *)(puVar1 + 1) = 6;
*(undefined1 *)((int)puVar1 + 7) = 2;
*(undefined1 *)((int)puVar1 + 6) = 0;
*(undefined1 *)((int)puVar1 + 9) = 2;
*(undefined1 *)((int)puVar1 + 10) = 0;
*(undefined1 *)((int)puVar1 + 0xb) = 0;
*(undefined1 *)(puVar1 + 3) = 0;
*(undefined1 *)((int)puVar1 + 0xe) = 1;
*(undefined1 *)((int)puVar1 + 0xf) = 0;
iVar2 = FUN_0800562c();
puVar1 = DAT_08006f34;
if (iVar2 == 0) {
FUN_08006258(DAT_08006f34,0x80);
FUN_0800620c(puVar1,0,0x40);
FUN_0800620c(puVar1,1,0x80);
return 0;
}
// WARNING: Subroutine does not return
SystemHalt();
}
undefined1 FUN_08006f38(int param_1,uint param_2)
{
if ((param_2 & 0x80) == 0) {
return *(undefined1 *)(*(int *)(param_1 + 0x2c8) + (param_2 & 0x7f) * 0x24 + 0x256);
}
return *(undefined1 *)(*(int *)(param_1 + 0x2c8) + (param_2 & 0x7f) * 0x24 + 0x16);
}
void FUN_08006f64(int *param_1,int param_2)
{
if (param_2 == 0) {
if (*(char *)((int)param_1 + 0xb) != '\0') {
Init_GPIO_Ports();
*(uint *)(DAT_08006fc0 + 0x10) = *(uint *)(DAT_08006fc0 + 0x10) & 0xfffffff9;
}
*(uint *)(*param_1 + 0xe00) = *(uint *)(*param_1 + 0xe00) & 0xfffffffe;
FUN_0800456c(param_1[0x138]);
}
else if (param_2 == 1) {
*(uint *)(*param_1 + 0xe00) = *(uint *)(*param_1 + 0xe00) | 1;
FUN_0800454e(param_1[0x138]);
if (*(char *)((int)param_1 + 0xb) != '\0') {
*(uint *)(DAT_08006fc0 + 0x10) = *(uint *)(DAT_08006fc0 + 0x10) | 6;
}
}
return;
}
undefined4 FUN_08006fc4(void)
{
return DAT_08006fc8;
}
void FUN_08006fcc(void)
{
return;
}
undefined4 FUN_08006fce(undefined4 param_1)
{
switch(param_1) {
case 0:
case 3:
goto switchD_08006fd2_caseD_0;
default:
param_1 = 3;
switchD_08006fd2_caseD_0:
return param_1;
case 2:
return 1;
}
}
void FUN_08006fe2(int param_1)
{
FUN_0800573e(*(undefined4 *)(param_1 + 0x2c8));
FUN_08006fce();
return;
}
void FUN_08006ff2(int param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
FUN_0800594a(*(undefined4 *)(param_1 + 0x2c8),param_2,param_4,param_3,param_4);
FUN_08006fce();
return;
}
void FUN_08007008(int param_1)
{
FUN_080059d6(*(undefined4 *)(param_1 + 0x2c8));
FUN_08006fce();
return;
}
void FUN_08007018(int param_1)
{
FUN_08005ada(*(undefined4 *)(param_1 + 0x2c8));
FUN_08006fce();
return;
}
void FUN_08007028(int param_1)
{
FUN_08005b60(*(undefined4 *)(param_1 + 0x2c8));
FUN_08006fce();
return;
}
void FUN_08007038(int param_1)
{
FUN_08005924(*(undefined4 *)(param_1 + 0x2c8));
FUN_08006fce();
return;
}
void transmitMidiPacket(int param_1)
{
FUN_08005a90(*(undefined4 *)(param_1 + 0x2c8));
FUN_08006fce();
return;
}
void FUN_08007058(int param_1)
{
FUN_08005a46(*(undefined4 *)(param_1 + 0x2c8));
FUN_08006fce();
return;
}
undefined4 FUN_08007068(void)
{
return 1;
}
undefined4 FUN_0800706c(void)
{
undefined4 *puVar1;
puVar1 = (undefined4 *)FUN_08012560();
*puVar1 = 0x16;
return 0xffffffff;
}
void FUN_0800707c(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
FUN_0800706c(param_1,0xffffffff,param_3,param_4,param_4);
do {
// WARNING: Do nothing block with infinite loop
} while( true );
}
int FUN_08007088(undefined1 param_1,undefined1 *param_2,int param_3)
{
int iVar1;
for (iVar1 = 0; iVar1 < param_3; iVar1 = iVar1 + 1) {
*param_2 = param_1;
param_2 = param_2 + 1;
}
return param_3;
}
int FUN_080070a8(undefined4 param_1,undefined4 param_2,int param_3)
{
int iVar1;
for (iVar1 = 0; iVar1 < param_3; iVar1 = iVar1 + 1) {
}
return param_3;
}
undefined4 FUN_080070c4(void)
{
return 0xffffffff;
}
undefined4 FUN_080070ca(undefined4 param_1,int param_2)
{
*(undefined4 *)(param_2 + 4) = 0x2000;
return 0;
}
undefined4 FUN_080070d4(void)
{
return 1;
}
undefined4 FUN_080070d8(void)
{
return 0;
}
uint FUN_080070dc(int param_1)
{
int iVar1;
int iVar2;
uint uVar3;
undefined4 *puVar4;
iVar2 = DAT_08007118;
iVar1 = DAT_08007114;
if (*DAT_0800711c == 0) {
*DAT_0800711c = DAT_08007120;
}
uVar3 = *DAT_0800711c;
if ((uint)(iVar1 - iVar2) < param_1 + uVar3) {
puVar4 = (undefined4 *)FUN_08012560();
*puVar4 = 0xc;
uVar3 = 0xffffffff;
}
else {
*DAT_0800711c = param_1 + uVar3;
}
return uVar3;
}
undefined4 * FUN_08007124(undefined4 *param_1,uint param_2)
{
undefined4 uVar1;
undefined4 uVar2;
undefined4 uVar3;
undefined4 *puVar4;
undefined4 *puVar5;
puVar4 = DAT_08007160;
if (param_2 < 0x20) {
puVar4 = DAT_08007160 + param_2 * 6;
uVar1 = puVar4[1];
uVar2 = puVar4[2];
uVar3 = puVar4[3];
*param_1 = *puVar4;
param_1[1] = uVar1;
param_1[2] = uVar2;
param_1[3] = uVar3;
uVar1 = puVar4[5];
param_1[4] = puVar4[4];
param_1[5] = uVar1;
}
else {
uVar1 = DAT_08007160[1];
uVar2 = DAT_08007160[2];
uVar3 = DAT_08007160[3];
puVar5 = DAT_08007160 + 4;
*param_1 = *DAT_08007160;
param_1[1] = uVar1;
param_1[2] = uVar2;
param_1[3] = uVar3;
uVar1 = puVar4[5];
param_1[4] = *puVar5;
param_1[5] = uVar1;
}
return param_1;
}
undefined4 * extractSensorControlParameters(undefined4 *param_1,uint param_2)
{
undefined4 uVar1;
undefined4 uVar2;
undefined4 uVar3;
int iVar4;
undefined4 uVar5;
undefined4 uVar6;
undefined4 *puVar7;
iVar4 = 0;
while( true ) {
if (0x1f < iVar4) {
uVar2 = DAT_080071c8[1];
uVar3 = DAT_080071c8[2];
uVar6 = DAT_080071c8[3];
uVar1 = DAT_080071c8[4];
uVar5 = DAT_080071c8[5];
*param_1 = *DAT_080071c8;
param_1[1] = uVar2;
param_1[2] = uVar3;
param_1[3] = uVar6;
param_1[4] = uVar1;
param_1[5] = uVar5;
return param_1;
}
if (*(byte *)(DAT_080071c4 + iVar4 * 0x18 + 0xc) == param_2) break;
iVar4 = iVar4 + 1;
}
puVar7 = (undefined4 *)(DAT_080071c4 + iVar4 * 0x18);
uVar1 = puVar7[1];
uVar2 = puVar7[2];
uVar5 = puVar7[3];
*param_1 = *puVar7;
param_1[1] = uVar1;
param_1[2] = uVar2;
param_1[3] = uVar5;
uVar1 = puVar7[5];
param_1[4] = puVar7[4];
param_1[5] = uVar1;
return param_1;
}
undefined4
lookupSensorFlag(undefined4 targetFlagString,undefined4 param_2,undefined4 param_3,
undefined4 cmpModifier)
{
int cmpResult;
int i;
i = 0;
while( true ) {
if (0x1f < i) {
return *(undefined4 *)(SENSOR_FLAG_TABLE + 0x10);
}
cmpResult = strcmp_custom(targetFlagString,*(undefined4 *)(SENSOR_FLAG_TABLE + i * 0x18),
SENSOR_FLAG_TABLE,i * 3,cmpModifier);
if (cmpResult == 0) break;
i = i + 1;
}
return *(undefined4 *)(SENSOR_FLAG_TABLE + i * 0x18 + 0x10);
}
undefined4
convertFixedPointToFloat
(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
int iVar1;
int iVar2;
iVar2 = 0;
while( true ) {
if (0x1f < iVar2) {
return *(undefined4 *)(DAT_0800723c + 8);
}
iVar1 = strcmp_custom(param_1,*(undefined4 *)(DAT_0800723c + iVar2 * 0x18),DAT_0800723c,
iVar2 * 3,param_4);
if (iVar1 == 0) break;
iVar2 = iVar2 + 1;
}
return *(undefined4 *)(DAT_0800723c + iVar2 * 0x18 + 8);
}
void resetSensorSubsystem(void)
{
undefined4 uVar1;
undefined4 in_r3;
int iVar2;
int iVar3;
int iVar4;
uint in_fpscr;
float fVar5;
FUN_080025a4();
FUN_080026c4(7,2);
FUN_08002648(2,DAT_080072bc,0x556,0,in_r3);
iVar4 = DAT_080072c0;
for (iVar3 = 0; iVar3 < 0x20; iVar3 = iVar3 + 1) {
iVar2 = DAT_080072c4 + iVar3 * 0x18;
uVar1 = *(undefined4 *)(iVar2 + 0x14);
*(undefined4 *)(iVar2 + 0x10) = uVar1;
if (*(char *)(iVar2 + 4) == '\0') {
*(undefined4 *)(DAT_080072c4 + iVar3 * 0x18 + 8) = 0;
}
else {
fVar5 = (float)VectorUnsignedToFloat(uVar1,(byte)(in_fpscr >> 0x15) & 3);
*(float *)(DAT_080072c4 + iVar3 * 0x18 + 8) = fVar5 * DAT_080072c8;
}
FUN_08002648(2,iVar4,uVar1,0,in_r3);
iVar4 = iVar4 + 4;
}
FUN_080025d4();
return;
}
void Init_Timer3(void)
{
undefined4 *puVar1;
undefined4 uVar2;
int iVar3;
int iVar4;
uint in_fpscr;
float fVar5;
if (*DAT_0800732c == 0x556) {
puVar1 = DAT_08007330;
for (iVar4 = 0; iVar4 < 0x20; iVar4 = iVar4 + 1) {
uVar2 = *puVar1;
iVar3 = DAT_08007334 + iVar4 * 0x18;
*(undefined4 *)(iVar3 + 0x10) = uVar2;
if (*(char *)(iVar3 + 4) == '\0') {
*(undefined4 *)(DAT_08007334 + iVar4 * 0x18 + 8) = 0;
}
else {
fVar5 = (float)VectorUnsignedToFloat(uVar2,(byte)(in_fpscr >> 0x15) & 3);
*(float *)(DAT_08007334 + iVar4 * 0x18 + 8) = fVar5 * DAT_08007338;
}
puVar1 = puVar1 + 1;
}
}
else {
resetSensorSubsystem();
}
return;
}
void FUN_0800733c(void)
{
undefined4 in_r3;
int iVar1;
int iVar2;
FUN_080025a4();
FUN_080026c4(7,2);
FUN_08002648(2,DAT_08007384,0x556,0,in_r3);
iVar2 = DAT_08007388;
for (iVar1 = 0; iVar1 < 0x20; iVar1 = iVar1 + 1) {
FUN_08002648(2,iVar2,*(undefined4 *)(DAT_0800738c + iVar1 * 0x18 + 0x10),0,in_r3);
iVar2 = iVar2 + 4;
}
FUN_080025d4();
return;
}
void processSensorSubcommand(undefined4 param_1)
{
uint in_fpscr;
undefined1 auStack_20 [4];
char local_1c;
float local_18;
char local_14;
undefined4 local_10;
undefined4 local_c;
extractSensorControlParameters(auStack_20,param_1);
if (local_14 != -1) {
local_10 = local_c;
if (local_1c != '\0') {
local_18 = (float)VectorUnsignedToFloat(local_c,(byte)(in_fpscr >> 0x15) & 3);
local_18 = local_18 * DAT_080073cc;
}
FUN_0800733c();
}
return;
}
void FUN_080073d0(undefined4 param_1,undefined4 param_2)
{
int iVar1;
int iVar2;
uint in_fpscr;
float fVar3;
undefined1 auStack_74 [100];
iVar2 = 0;
while( true ) {
if (0x1f < iVar2) {
return;
}
iVar1 = strcmp_custom(param_1,*(undefined4 *)(DAT_0800745c + iVar2 * 0x18));
if (iVar1 == 0) break;
iVar2 = iVar2 + 1;
}
iVar1 = DAT_0800745c + iVar2 * 0x18;
*(undefined4 *)(iVar1 + 0x10) = param_2;
if (*(char *)(iVar1 + 4) != '\0') {
fVar3 = (float)VectorUnsignedToFloat(param_2,(byte)(in_fpscr >> 0x15) & 3);
*(float *)(DAT_0800745c + iVar2 * 0x18 + 8) = fVar3 * DAT_08007460;
}
FUN_0800733c();
if (*(char *)(DAT_0800745c + iVar2 * 0x18 + 4) != '\0') {
FUN_08000568(*(undefined4 *)(DAT_0800745c + iVar2 * 0x18 + 8));
updateMidiBuffer(auStack_74,DAT_08007464,param_1);
return;
}
updateMidiBuffer(auStack_74,DAT_08007468,param_1,param_2);
return;
}
undefined4 FUN_0800746c(undefined4 param_1)
{
undefined2 uVar1;
int iVar2;
undefined4 local_94;
char local_90;
undefined4 local_8c;
undefined4 local_84;
undefined1 auStack_7c [100];
undefined1 auStack_18 [4];
undefined1 auStack_14 [8];
FUN_08008074(auStack_18);
FUN_08009954(auStack_14);
FUN_080037a2(DAT_080074e8,DAT_080074e4,0x17,1000);
for (iVar2 = 0; iVar2 < 0x20; iVar2 = iVar2 + 1) {
FUN_08007124(&local_94,iVar2);
if (local_90 == '\0') {
updateMidiBuffer(auStack_7c,DAT_080074ec,local_94,local_84);
}
else {
FUN_08000568(local_8c);
updateMidiBuffer(auStack_7c,DAT_080074f0,local_94);
}
uVar1 = strlen_custom(auStack_7c);
FUN_080037a2(DAT_080074e8,auStack_7c,uVar1,1000);
}
return param_1;
}
void FUN_080074f4(void)
{
undefined4 uVar1;
FUN_08008074(DAT_08007520);
FUN_08009954(DAT_08007524);
uVar1 = FUN_08008600();
*DAT_08007528 = uVar1;
FUN_08009756(DAT_0800752c);
FUN_080098a8(DAT_08007530);
FUN_0800746c(DAT_08007534);
return;
}
void FUN_08007538(int param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
ushort *puVar1;
short sVar2;
int iVar3;
puVar1 = DAT_080075c4;
if (param_1 == DAT_080075c0) {
iVar3 = (uint)*(ushort *)(param_1 + 0x24) + (uint)*DAT_080075c4;
*DAT_080075c4 =
(short)iVar3 + (short)(int)((longlong)DAT_080075c8 * (longlong)iVar3 >> 0x25) * -100;
if (*puVar1 == *DAT_080075cc) {
*DAT_080075d4 = 0;
}
else {
if (*puVar1 < *DAT_080075cc) {
sVar2 = *DAT_080075cc - *puVar1;
}
else {
sVar2 = 100 - *DAT_080075c4;
}
iVar3 = FUN_08003870(DAT_080075c0,DAT_080075d0 + (uint)*DAT_080075c4,sVar2,DAT_080075d0,
param_4);
if (iVar3 != 0) {
*DAT_080075d4 = 0;
// WARNING: Subroutine does not return
SystemHalt();
}
}
}
return;
}
void sendMidiNoteOn(undefined4 param_1,int sensorPtr,undefined4 param_3,undefined4 noteVelocity)
{
int noteEventFlag;
int baseValue;
baseValue = GLOBAL_NOTE_BASE_VALUE;
sendMidiCommand(*(undefined4 *)(sensorPtr + 0x34),GLOBAL_NOTE_BASE_VALUE,0x11,noteVelocity,
noteVelocity);
sendMidiCommand(*(undefined4 *)(sensorPtr + 0x30),baseValue + 0x44,0x60);
sendMidiCommand(*(undefined4 *)(sensorPtr + 0x38),baseValue + 0x1c4,0x12);
noteEventFlag = lookupSensorFlag(GLOBAL_NOTE_EVENT_FLAG);
if (noteEventFlag == 1) {
finalizeSensorNoteOn(*GLOBAL_MIDI_OUTPUT,baseValue);
}
return;
}
void sendMidiNoteOff(undefined4 param_1,undefined4 noteValue)
{
int noteOffFlag;
noteOffFlag = lookupSensorFlag(GLOBAL_NOTE_OFF_FLAG);
if (noteOffFlag == 1) {
transmitMidiNoteOffMessage(*GLOBAL_NOTE_OFF_DESTINATION,noteValue);
}
return;
}
// Processes incoming Piezo sensor data and updates the corresponding MIDI output.
// It retrieves the current time, loads calibration data, extracts sensor channel readings,
// combines them into a final sensor value, and if a sensor trigger is detected, it resets
// the sensor state and issues a MIDI command (using a command code 0x11).
//
// Parameters:
// midiId - an identifier or channel value for the outgoing MIDI message (original param_1)
// sensorPtr - pointer to the sensor data structure (original param_2)
void processPiezoSensorData(undefined4 midiId,int sensorPtr)
{
char triggerState;
int sensorFlag1;
int sensorFlag2;
int sensorFlag3;
int tempIndex;
undefined4 calibData;
undefined4 *sensorDataPtr;
int triggerDuration;
undefined4 tempStack1;
undefined4 tempStack2;
undefined4 currentMidiId;
int currentTime;
int triggerStartTime;
int triggerEndTime;
undefined4 processedSensorValue;
undefined4 tempStack11c;
undefined4 tempStack118;
undefined4 tempStack114;
undefined4 sensorOutputValue;
undefined4 sensorLow [2];
undefined4 sensorMid [2];
undefined4 sensorHigh [2];
undefined4 localCalibration;
undefined4 uStack_ec;
undefined4 uStack_e8;
int sensorTimer;
undefined4 tempStack_e0;
undefined4 local_dc;
undefined4 localData_d8;
undefined4 localData_d4;
undefined4 tempStack_d0;
undefined4 tempStack_cc;
undefined4 sensorCalibValue;
undefined4 processedChannelValue;
undefined4 tempStack_c0;
undefined4 tempStack_bc;
undefined4 tempStack_b8;
undefined4 sensorFlagData;
undefined4 sensorDataArray [30];
undefined4 savedSensorConfig;
undefined1 savedSensorMode;
bool conditionFlag;
int globalSensorValue;
undefined4 sensorConfig;
undefined1 sensorMode;
undefined4 tempValue;
// Save the MIDI identifier for later use.
currentMidiId = midiId;
// Retrieve the current time or sensor timestamp.
currentTime = getCurrentTime();
// Load calibration data from a global pointer.
calibData = *GLOBAL_CALIBRATION_PTR;
// Fill local calibration structure from the calibration data.
loadCalibrationValues(&localCalibration,calibData);
sensorConfig = GLOBAL_SENSOR_CONFIG;
// Read a sensor mode or threshold flag from the sensor structure.
sensorMode = *(undefined1 *)(sensorPtr + 0x1e);
sensorFlag1 = lookupSensorFlag(GLOBAL_SENSOR_CONFIG);
sensorFlag2 = lookupSensorFlag(sensorConfig);
sensorFlag3 = lookupSensorFlag(sensorConfig);
triggerState = lookupSensorFlag(sensorConfig);
readSensorChannel(sensorHigh,calibData,sensorPtr,2);
readSensorChannel(sensorMid,calibData,sensorPtr,1);
readSensorChannel(sensorLow,calibData,sensorPtr,0);
sensorConfig = combineSensorValues(sensorHigh[0],sensorLow[0]);
sensorConfig = combineSensorValues(sensorMid[0],sensorConfig);
if (triggerState == '\x01') {
resetSensorState(sensorPtr);
globalSensorValue = GLOBAL_SENSOR_THRESHOLD;
sendMidiCommand(*(undefined4 *)(sensorPtr + 0x34),GLOBAL_SENSOR_THRESHOLD,0x11);
sendMidiCommand(*(undefined4 *)(sensorPtr + 0x30),globalSensorValue + 0x44,0x60);
sendMidiCommand(*(undefined4 *)(sensorPtr + 0x38),globalSensorValue + 0x1c4,0x12);
triggerStartTime = getCurrentTime();
globalSensorValue = calibrateThreshold(GLOBAL_SENSOR_CALIBRATION_DATA,globalSensorValue);
triggerEndTime = getCurrentTime();
tempIndex = lookupSensorFlag(GLOBAL_SENSOR_STATUS);
if ((tempIndex == 1) &&
(tempIndex = lookupSensorFlag(GLOBAL_SENSOR_EVENT_STATUS), tempIndex == 1)) {
triggerDuration = triggerEndTime - triggerStartTime;
notifySensorEvent(*GLOBAL_SENSOR_EVENT_HANDLER,0xc,0);
}
if (globalSensorValue == 0) {
return;
}
computeCalibratedSensorOutput
(sensorConfig,&processedSensorValue,GLOBAL_SENSOR_CALIBRATION_DATA,globalSensorValue);
localData_d8 = processedSensorValue;
localData_d4 = tempStack11c;
tempValue = localData_d4;
tempStack_d0 = tempStack118;
tempStack_cc = tempStack114;
sensorCalibValue = sensorOutputValue;
processedChannelValue = processedSensorValue;
tempStack_c0 = tempStack11c;
tempStack_bc = tempStack118;
tempStack_b8 = tempStack114;
sensorFlagData = sensorOutputValue;
localData_d4._0_1_ = (char)tempStack11c;
tempStack_e0._0_2_ = CONCAT11((char)localData_d4,(undefined1)tempStack_e0);
local_dc = sensorOutputValue;
conditionFlag = (char)localData_d4 != '\0';
localData_d4 = tempValue;
savedSensorConfig = sensorConfig;
savedSensorMode = sensorMode;
if (conditionFlag) {
triggerDuration = sensorTimer;
tempStack1 = tempStack_e0;
tempStack2 = sensorOutputValue;
applySensorCalibrationCorrection(calibData,localCalibration,uStack_ec,uStack_e8);
}
for (tempIndex = 0; tempIndex < 6; tempIndex = tempIndex + 1) {
sensorDataPtr = (undefined4 *)(globalSensorValue + tempIndex * 0x14);
sensorConfig = sensorDataPtr[1];
calibData = sensorDataPtr[2];
tempValue = sensorDataPtr[3];
sensorDataArray[tempIndex * 5] = *sensorDataPtr;
sensorDataArray[tempIndex * 5 + 1] = sensorConfig;
sensorDataArray[tempIndex * 5 + 2] = calibData;
sensorDataArray[tempIndex * 5 + 3] = tempValue;
sensorDataArray[tempIndex * 5 + 4] = sensorDataPtr[4];
}
}
if (sensorFlag1 == 0) {
sendMidiNoteOff(currentMidiId,sensorPtr);
}
if (sensorFlag2 == 2) {
resetSensorState(sensorPtr);
sendMidiNoteOn(currentMidiId,sensorPtr);
}
if (sensorFlag3 == 3) {
resetSensorState(sensorPtr);
sensorConfig = currentMidiId;
sendMidiNoteOff(currentMidiId,sensorPtr);
sendMidiNoteOn(sensorConfig,sensorPtr);
}
if (triggerState == '\x01') {
sensorConfig = *GLOBAL_SENSOR_EVENT_HANDLER;
copyBuffer(&triggerDuration,&tempStack_bc,0x8c);
calibData = computeSensorExpressionValue
(GLOBAL_SENSOR_OUTPUT_CONFIG,sensorPtr,processedChannelValue,tempStack_c0)
;
copyBuffer(&triggerDuration,&tempStack_b8,0x88);
applySensorExpressionOutput
(calibData,sensorConfig,processedChannelValue,tempStack_c0,tempStack_bc);
}
sensorFlag1 = lookupSensorFlag(GLOBAL_SENSOR_STATUS);
if ((sensorFlag1 == 1) &&
(sensorFlag1 = lookupSensorFlag(GLOBAL_SENSOR_EVENT_STATUS), sensorFlag1 == 1)) {
sensorConfig = *GLOBAL_SENSOR_EVENT_HANDLER;
triggerDuration = getCurrentTime();
triggerDuration = triggerDuration - currentTime;
notifySensorEvent(sensorConfig,0xf,0);
}
return;
}
// Converts a raw sensor value into a normalized float reading.
float convertSensorRawValue(undefined4 param_1,undefined4 rawValue)
{
uint fpscr;
float convertedValue;
// Convert the raw unsigned value to a float.
convertedValue = (float)VectorUnsignedToFloat(rawValue,(byte)(fpscr >> 0x15) & 3);
// Normalize the converted value by dividing it by the global scale factor.
return convertedValue / GLOBAL_SENSOR_SCALE_FACTOR;
}
// Checks sensor curve conditions by iterating through curve indices (0–3). At each index, it
// computes a combined sensor value using global curve data and a sensor flag lookup (converted to a
// float). If, at index 2, the computed value exceeds a baseline value (converted from sensorRecord
// offset 8) then the condition is met and the function returns 2; otherwise, if no valid index is
// found, it returns 0xffffffff.
undefined4 evaluateSensorCurveCondition(undefined4 sensorConfig,int sensorRecord)
{
int controlCode;
undefined4 lookupValue;
uint index;
float computedValue;
float baselineValue;
undefined4 globalCurveData;
index = 0;
while( true ) {
if (3 < (int)index) {
return 0xffffffff;
}
// mapControlEventCode returns a control code for the given index.
controlCode = mapControlEventCode(*GLOBAL_CONTROL_FLAG,index & 0xff);
// Retrieve the global curve value corresponding to the current index.
globalCurveData = *(undefined4 *)(GLOBAL_CURVE_VALUES + index * 4);
if (controlCode == 1) {
lookupValue = lookupSensorFlag(GLOBAL_SENSOR_FLAG_SET_A);
lookupValue = convertSensorRawValue(sensorConfig,lookupValue);
}
else {
lookupValue = lookupSensorFlag(GLOBAL_SENSOR_FLAG_SET_B);
lookupValue = convertSensorRawValue(sensorConfig,lookupValue);
}
// Combine the global curve value with the converted lookup value.
computedValue = (float)combineSensorValues(globalCurveData,lookupValue);
// At index 2, compare the computed value with a baseline value from
// sensorRecord offset 8.
if (((controlCode != 0) && (index == 2)) &&
(baselineValue = (float)convertSensorRawValue(sensorConfig,*(undefined4 *)(sensorRecord + 8))
, baselineValue != computedValue &&
baselineValue < computedValue == (NAN(baselineValue) || NAN(computedValue)))) break;
index = index + 1;
}
return 2;
}
void FUN_08007978(undefined4 param_1,int param_2)
{
bool bVar1;
int iVar2;
undefined4 uVar3;
undefined1 uVar4;
uint uVar5;
uint in_fpscr;
float fVar6;
undefined4 uVar7;
undefined4 uVar8;
int iVar9;
float fVar10;
float fVar11;
float local_68;
ushort local_64;
float local_60;
ushort local_5c;
float local_58;
ushort local_54;
undefined4 local_50;
undefined4 local_4c;
float local_48;
float local_44;
undefined4 local_40;
undefined4 uStack_3c;
uVar3 = *DAT_08007b74;
loadCalibrationValues(&local_50,uVar3);
readSensorChannel(&local_58,uVar3,param_2,2);
readSensorChannel(&local_60,uVar3,param_2,1);
readSensorChannel(&local_68,uVar3,param_2,0);
fVar6 = (float)getBaseSensorReading(uVar3,param_2,0);
fVar11 = fVar6 * DAT_08007b78 * DAT_08007b7c;
in_fpscr = in_fpscr & 0xfffffff;
fVar6 = DAT_08007b80;
if (local_58 != 0.0 && local_58 < 0.0 == NAN(local_58)) {
fVar6 = local_58;
}
if (fVar6 < local_60) {
uVar4 = 1;
fVar6 = local_60;
}
else {
uVar4 = 2;
}
if (fVar6 < local_68) {
uVar4 = 0;
}
else if (fVar6 < fVar11) {
uVar4 = 0;
}
if (local_58 != local_60 && local_58 < local_60 == (NAN(local_58) || NAN(local_60))) {
local_5c = local_54;
}
uVar5 = (uint)local_5c;
if ((local_58 < local_68) && (local_60 < local_68)) {
uVar5 = (uint)local_64;
local_58 = local_68;
}
uVar7 = combineSensorValues(local_58,local_60);
fVar6 = (float)combineSensorValues(uVar7,fVar11);
fVar11 = (float)combineSensorValues(local_44,local_48);
uVar8 = VectorUnsignedToFloat(local_50,(byte)(in_fpscr >> 0x15) & 3);
uVar7 = VectorUnsignedToFloat(local_4c,(byte)(in_fpscr >> 0x15) & 3);
uVar7 = combineSensorValues(uVar7,uVar8);
iVar9 = VectorFloatToUnsigned(uVar7,3);
iVar2 = getCurrentTime();
fVar10 = (float)VectorUnsignedToFloat((iVar2 - iVar9) - 6,(byte)(in_fpscr >> 0x15) & 3);
fVar10 = fVar10 / DAT_08007b84;
if (fVar10 != 1.0 && fVar10 < 1.0 == NAN(fVar10)) {
fVar10 = 1.0;
}
fVar10 = (float)normalizeSensorExpressionValue(1.0 - fVar10,0x40000000);
fVar10 = 1.0 - fVar10;
if ((uint)(iVar2 - iVar9) < 6) {
fVar10 = DAT_08007b80;
}
fVar11 = (1.0 - fVar10) * fVar11 * DAT_08007b88;
if (fVar6 == fVar11 || fVar6 < fVar11 != (NAN(fVar6) || NAN(fVar11))) {
bVar1 = false;
}
else {
bVar1 = true;
iVar2 = getCurrentTime();
if ((uint)(iVar2 - iVar9) < 6) {
return;
}
}
if (bVar1) {
FUN_080084b8(param_2);
*(undefined1 *)(param_2 + 0x1e) = uVar4;
FUN_080094e0(fVar6,uVar3,*(int *)(param_2 + 0x20) + uVar5,param_2);
local_48 = local_60;
local_44 = fVar6;
local_4c = getCurrentTime();
local_50 = getCurrentTime();
local_40 = CONCAT31(local_40._1_3_,uVar4);
applySensorCalibrationCorrection(uVar3,local_50,local_4c,local_48,local_44,local_40,uStack_3c);
}
return;
}
// Processes sensor data for drum hits by extracting sensor data, updating the sensor message
// counter, updating control events, and eventually triggering sensor MIDI processing if needed.
void processSensorDrumHits(undefined4 midiChannel,int sensorDataPtr)
{
int controlEventIndex;
undefined4 iVar;
int iVar1;
int i;
uint loopCount;
int iVar2;
undefined4 sensorValue;
undefined4 sensorDataArray [4];
float channelReading [2];
// For each of 4 sensor channels, process the raw sensor value.
for (i = 0; i < 4; i = i + 1) {
sensorValue = convertSensorRawValue(midiChannel,*(undefined4 *)(sensorDataPtr + i * 4));
// Temporary sensor data array
sensorDataArray[i] = sensorValue;
}
// Update the sensor message counter.
sensorValue = *GLOBAL_SENSOR_STRUCTURE;
incrementSensorMessageCounter(sensorValue);
// Process sensor data and get a sensor flag result.
i = evaluateSensorCurveCondition(midiChannel,sensorDataPtr);
if (i != -1) {
// Find an available control event index.
controlEventIndex = findNextAvailableControlEventIndex(sensorValue);
if (controlEventIndex == 0xff) {
return;
}
// Get pointer to the control event record.
controlEventIndex = getControlEventBufferAddress(sensorValue,controlEventIndex);
if ((*(char *)(controlEventIndex + 0x1c) == '\0') &&
(*(char *)(controlEventIndex + 0x1d) == '\0')) {
*(char *)(controlEventIndex + 0x1e) = (char)i;
iVar = getCurrentTime();
*(undefined4 *)(controlEventIndex + 0x18) = iVar;
iVar = getSensorMessageCounter(sensorValue);
*(undefined4 *)(controlEventIndex + 0x20) = iVar;
*(undefined1 *)(controlEventIndex + 0x1c) = 1;
}
}
// Process sensor data array (e.g. for additional calibration or logging).
FUN_08009440(sensorValue,sensorDataArray);
// If a global flag indicates pending processing, reset it and update sensor
// MIDI processing.
if (*GLOBAL_SENSOR_PROCESS_FLAG != '\0') {
*GLOBAL_SENSOR_PROCESS_FLAG = '\0';
updateSensorMidiProcessing(*GLOBAL_MIDI_OUTPUT_PTR);
}
// Process control events for index 0.
for (loopCount = 0; (int)loopCount < 1; loopCount = loopCount + 1) {
i = getControlEventBufferAddress(sensorValue,loopCount & 0xff);
if (*(char *)(i + 0x1d) != '\0') {
controlEventIndex = lookupSensorFlag(GLOBAL_SENSOR_FLAG_A);
if ((controlEventIndex == 1) &&
(controlEventIndex = lookupSensorFlag(GLOBAL_SENSOR_FLAG_B), controlEventIndex == 1)) {
controlEventIndex = getCurrentTime();
notifySensorEvent(*GLOBAL_MIDI_OUTPUT_PTR,0x1a,0,0,controlEventIndex - *(int *)(i + 0x18));
}
readSensorChannel(channelReading,sensorValue,i,3);
// Compare the channel reading with a global threshold.
if ((channelReading[0] == GLOBAL_SENSOR_THRESHOLD_VAL ||
channelReading[0] < GLOBAL_SENSOR_THRESHOLD_VAL !=
(NAN(channelReading[0]) || NAN(GLOBAL_SENSOR_THRESHOLD_VAL))) ||
(controlEventIndex = lookupSensorFlag(GLOBAL_SENSOR_FLAG_C), controlEventIndex != 1)) {
FUN_08009670(*GLOBAL_SENSOR_STRUCTURE,0);
}
else {
FUN_08009670(*GLOBAL_SENSOR_STRUCTURE,1);
}
*(undefined1 *)(i + 0x1d) = 0;
FUN_08007978(midiChannel,i);
}
}
// Check sensor control flag and, if set, reset it and trigger further
// processing.
sensorValue = *GLOBAL_SENSOR_STRUCTURE;
i = getSensorControlFlag(sensorValue);
if (i != 0) {
setSensorControlFlag(sensorValue,0);
FUN_08009990(GLOBAL_SENSOR_CONTROL_RESET_PARAM);
i = getSensorDataBufferBase(sensorValue);
for (controlEventIndex = 0; controlEventIndex < 6; controlEventIndex = controlEventIndex + 1) {
iVar2 = i + controlEventIndex * 0x38;
if ((*(int *)(iVar2 + 0x20) != 0) && (*(char *)(iVar2 + 0x2c) != '\0')) {
processPiezoSensorData(midiChannel);
*(undefined1 *)(iVar2 + 0x2c) = 0;
iVar1 = lookupSensorFlag(GLOBAL_SENSOR_FLAG_B);
if ((iVar1 == 1) && (iVar1 = lookupSensorFlag(GLOBAL_SENSOR_FLAG_A), iVar1 == 1)) {
sensorValue = *GLOBAL_MIDI_OUTPUT_PTR;
iVar1 = getCurrentTime();
notifySensorEvent(sensorValue,0x21,0,0,iVar1 - *(int *)(*(int *)(iVar2 + 0x20) + 0x18));
}
}
}
}
return;
}
// Processes drum hit sensor data by invoking a drum-hit processing routine.
void processDrumHits(void)
{
FUN_0800746c(GLOBAL_DRUM_HIT_DATA);
return;
}
// Processes drum hits by calling processSensorDrumHits with additional parameters.
void processDrumHitsExtended
(undefined4 unusedParam,undefined4 param_2,undefined4 param3,undefined4 param4)
{
processSensorDrumHits(GLOBAL_DRUM_HIT_CONFIG,unusedParam,param3,param4,param4);
return;
}
// Updates global drum hit sensor data by reading values from a source and storing them into global
// locations.
void updateDrumHitSensorData(void)
{
undefined4 newValue;
undefined4 *sourcePtr;
sourcePtr = GLOBAL_DRUM_HIT_SOURCE;
newValue = FUN_080013cc(*GLOBAL_DRUM_HIT_SOURCE,0);
*GLOBAL_DRUM_HIT_DEST1 = newValue;
newValue = FUN_080013e8(*sourcePtr,0);
*GLOBAL_DRUM_HIT_DEST2 = newValue;
return;
}
uint computeSensorCurveIndex(undefined4 param_1,undefined4 targetCurveId)
{
int cmpResult;
uint index;
undefined4 localCurveIdArray [6];
localCurveIdArray[0] = *GLOBAL_SENSOR_CURVE_ID_ARRAY;
localCurveIdArray[1] = GLOBAL_SENSOR_CURVE_ID_ARRAY[1];
localCurveIdArray[2] = GLOBAL_SENSOR_CURVE_ID_ARRAY[2];
localCurveIdArray[3] = GLOBAL_SENSOR_CURVE_ID_ARRAY[3];
localCurveIdArray[4] = GLOBAL_SENSOR_CURVE_ID_ARRAY[4];
localCurveIdArray[5] = GLOBAL_SENSOR_CURVE_ID_ARRAY[5];
index = 0;
while( true ) {
if (5 < (int)index) {
return 0;
}
cmpResult = strcmp_custom(targetCurveId,localCurveIdArray[index]);
if (cmpResult == 0) break;
index = index + 1;
}
return index & 0xff;
}
undefined4 *
computeCalibratedSensorOutput(undefined4 *outputRecord,undefined4 sensorInput,int sensorRecordsBase)
{
int curveIndex;
undefined4 uVar1;
undefined4 uVar2;
undefined4 uVar3;
int recordAddr;
int i;
int bestCandidateIndex;
undefined4 *bestRecordPtr;
int flaggedRecordIndex;
float currentCoeff;
float recordReading;
float bestReading;
float curveCoeffs [4];
undefined4 curveOffset;
undefined4 curveGain;
// Convert global fixed-point curve coefficients to floats.
curveCoeffs[0] = (float)convertFixedPointToFloat(GLOBAL_SENSOR_CURVE_COEFF0);
curveCoeffs[1] = (float)convertFixedPointToFloat(GLOBAL_SENSOR_CURVE_COEFF1);
curveCoeffs[2] = (float)convertFixedPointToFloat(GLOBAL_SENSOR_CURVE_COEFF2);
curveCoeffs[3] = (float)convertFixedPointToFloat(GLOBAL_SENSOR_CURVE_COEFF3);
// Convert offset and gain values.
curveOffset = convertFixedPointToFloat(GLOBAL_SENSOR_CURVE_OFFSET);
curveGain = convertFixedPointToFloat(GLOBAL_SENSOR_CURVE_GAIN);
flaggedRecordIndex = -1;
bestCandidateIndex = -1;
bestReading = GLOBAL_SENSOR_CURVE_BASE;
// Iterate over the 6 sensor records.
for (i = 0; i < 6; i = i + 1) {
recordAddr = sensorRecordsBase + i * 0x14;
// If the record flag (at offset 4) equals 2, store its index.
//
if (*(char *)(recordAddr + 4) == '\x02') {
flaggedRecordIndex = i;
}
// Determine the curve index for this record.
curveIndex = computeSensorCurveIndex(sensorInput,*(undefined4 *)(sensorRecordsBase + i * 0x14));
// Get the sensor reading from offset 0x10.
recordReading = *(float *)(recordAddr + 0x10);
currentCoeff = curveCoeffs[curveIndex];
// If the record's reading is both less than the current coefficient and less
// than the best so far...
if ((recordReading != currentCoeff &&
recordReading < currentCoeff == (NAN(recordReading) || NAN(currentCoeff))) &&
(recordReading != bestReading &&
recordReading < bestReading == (NAN(recordReading) || NAN(bestReading)))) {
bestCandidateIndex = i;
bestReading = recordReading;
}
}
// If no candidate was found, use the record flagged with 0x02.
if (bestCandidateIndex == -1) {
bestRecordPtr = (undefined4 *)(sensorRecordsBase + flaggedRecordIndex * 0x14);
// Copy the selected record's five fields into the output record.
uVar1 = bestRecordPtr[1];
uVar2 = bestRecordPtr[2];
uVar3 = bestRecordPtr[3];
*outputRecord = *bestRecordPtr;
outputRecord[1] = uVar1;
outputRecord[2] = uVar2;
outputRecord[3] = uVar3;
outputRecord[4] = bestRecordPtr[4];
}
else {
bestRecordPtr = (undefined4 *)(sensorRecordsBase + bestCandidateIndex * 0x14);
// Copy the selected record's five fields into the output record.
uVar1 = bestRecordPtr[1];
uVar2 = bestRecordPtr[2];
uVar3 = bestRecordPtr[3];
*outputRecord = *bestRecordPtr;
outputRecord[1] = uVar1;
outputRecord[2] = uVar2;
outputRecord[3] = uVar3;
outputRecord[4] = bestRecordPtr[4];
}
return outputRecord;
}
// Adjusts and calibrates the sensor threshold value based on global calibration data.
int calibrateThreshold(undefined4 param_1,undefined4 rawThreshold)
{
undefined2 uVar1;
uint tempUnsigned;
undefined4 tempRecordPtr;
undefined4 tmp1;
undefined4 uVar2;
int recordAddr;
undefined4 tmp2;
undefined4 uVar3;
undefined4 tmp3;
undefined4 tmp4;
undefined4 uVar4;
int ii;
undefined4 *record;
undefined4 *tempRecord;
float delta;
float normalizedValue;
undefined1 local_9c [100];
undefined4 calibrationArray [6];
int temp;
temp = GLOBAL_CALIB_BASE;
// Use globals for calibration:
*(undefined4 *)(GLOBAL_CALIB_BASE + 4) = rawThreshold;
recordAddr = GLOBAL_CALIB_DATA_ADDR;
*(int *)(GLOBAL_CALIB_DATA_ADDR + 4) = GLOBAL_CALIB_DEFAULT;
*(undefined4 **)(recordAddr + 0x20) = GLOBAL_CALIB_PTR;
// Call a helper function to validate calibration.
temp = FUN_080014c2(*GLOBAL_CALIB_SOURCE,temp);
if (temp == 1) {
// Copy calibration coefficients from global array.
calibrationArray[0] = *GLOBAL_CALIB_ARRAY;
calibrationArray[1] = GLOBAL_CALIB_ARRAY[1];
calibrationArray[2] = GLOBAL_CALIB_ARRAY[2];
calibrationArray[3] = GLOBAL_CALIB_ARRAY[3];
calibrationArray[4] = GLOBAL_CALIB_ARRAY[4];
calibrationArray[5] = GLOBAL_CALIB_ARRAY[5];
normalizedValue = GLOBAL_CALIB_OFFSET;
// For each of the 6 calibration records, update calibration data.
for (temp = 0; temp < 6; temp = temp + 1) {
recordAddr = GLOBAL_CALIB_RECORD_BASE + temp * 0x14;
*(undefined4 *)(GLOBAL_CALIB_RECORD_BASE + temp * 0x14) = calibrationArray[temp];
*(undefined4 *)(recordAddr + 0x10) = *(undefined4 *)(GLOBAL_CALIB_DEFAULT + temp * 4);
*(undefined4 *)(recordAddr + 8) = *GLOBAL_CALIB_PTR;
delta = (float)FUN_0800e914();
normalizedValue = normalizedValue + delta;
}
// Normalize each calibration record’s reading.
for (temp = 0; temp < 6; temp = temp + 1) {
recordAddr = GLOBAL_CALIB_RECORD_BASE + temp * 0x14;
delta = (float)FUN_0800e914(*(undefined4 *)(recordAddr + 0x10));
*(float *)(recordAddr + 0x10) = delta / normalizedValue;
*(char *)(recordAddr + 4) = (char)temp;
}
temp = 0;
// Bubble-sort the calibration records based on the normalized reading.
while (recordAddr = temp, temp = GLOBAL_CALIB_RECORD_BASE, recordAddr < 6) {
for (ii = recordAddr + 1; temp = recordAddr + 1, ii < 6; ii = ii + 1) {
if ((int)((uint)(*(float *)(GLOBAL_CALIB_RECORD_BASE + recordAddr * 0x14 + 0x10) <
*(float *)(GLOBAL_CALIB_RECORD_BASE + ii * 0x14 + 0x10)) << 0x1f) < 0) {
// Swap records.
tempRecord = (undefined4 *)(GLOBAL_CALIB_RECORD_BASE + recordAddr * 0x14);
// Swap 5 fields.
tempRecordPtr = *tempRecord;
tmp1 = tempRecord[1];
tmp2 = tempRecord[2];
tmp3 = tempRecord[3];
tmp4 = tempRecord[4];
record = (undefined4 *)(GLOBAL_CALIB_RECORD_BASE + ii * 0x14);
uVar2 = record[1];
uVar3 = record[2];
uVar4 = record[3];
*tempRecord = *record;
tempRecord[1] = uVar2;
tempRecord[2] = uVar3;
tempRecord[3] = uVar4;
tempRecord[4] = record[4];
*record = tempRecordPtr;
record[1] = tmp1;
record[2] = tmp2;
record[3] = tmp3;
record[4] = tmp4;
}
}
}
}
else {
// If calibration validation failed, update the MIDI buffer with an error
// string.
tempUnsigned = FUN_080013a4(*GLOBAL_CALIB_SOURCE);
updateMidiBuffer(local_9c,GLOBAL_MIDI_UPDATE_PARAM,tempUnsigned & 0xff,tempUnsigned >> 8);
uVar1 = strlen_custom(local_9c);
FUN_080037a2(GLOBAL_MIDI_ERROR_OUTPUT,local_9c,uVar1,0xffffffff);
temp = 0;
}
return temp;
}
undefined4 FUN_08008074(undefined4 param_1)
{
char *pcVar1;
undefined4 *puVar2;
undefined2 uVar3;
undefined4 uVar4;
undefined4 uVar5;
undefined4 *puVar6;
undefined4 uVar7;
int iVar8;
undefined4 *puVar9;
undefined4 local_7c;
undefined4 uStack_78;
undefined4 uStack_74;
undefined4 uStack_70;
undefined4 local_6c;
undefined4 uStack_68;
undefined2 local_64;
uVar4 = FUN_08001434(DAT_08008154,DAT_08008150,0);
pcVar1 = DAT_08008158;
*(undefined4 *)DAT_08008158 = uVar4;
puVar2 = DAT_08008164;
if (*pcVar1 == '\0') {
puVar6 = (undefined4 *)*DAT_0800815c;
if ((puVar6 == (undefined4 *)0x0) ||
(puVar9 = (undefined4 *)*DAT_08008160, puVar9 == (undefined4 *)0x0)) {
FUN_080037a2(DAT_08008170,DAT_08008174,0x32,0xffffffff);
}
else {
uVar4 = puVar6[1];
uVar5 = puVar6[2];
uVar7 = puVar6[3];
*DAT_08008164 = *puVar6;
puVar2[1] = uVar4;
puVar2[2] = uVar5;
puVar2[3] = uVar7;
uVar4 = puVar6[5];
uVar5 = puVar6[6];
puVar2[4] = puVar6[4];
puVar2[5] = uVar4;
puVar2[6] = uVar5;
puVar2 = DAT_08008168;
uVar4 = puVar9[1];
uVar5 = puVar9[2];
uVar7 = puVar9[3];
*DAT_08008168 = *puVar9;
puVar2[1] = uVar4;
puVar2[2] = uVar5;
puVar2[3] = uVar7;
uVar4 = puVar9[5];
uVar5 = puVar9[6];
puVar2[4] = puVar9[4];
puVar2[5] = uVar4;
puVar2[6] = uVar5;
uVar4 = puVar9[8];
uVar5 = puVar9[9];
uVar7 = puVar9[10];
puVar2[7] = puVar9[7];
puVar2[8] = uVar4;
puVar2[9] = uVar5;
puVar2[10] = uVar7;
uVar4 = puVar9[0xc];
uVar5 = puVar9[0xd];
puVar2[0xb] = puVar9[0xb];
puVar2[0xc] = uVar4;
puVar2[0xd] = uVar5;
for (iVar8 = 0; iVar8 < 0x83; iVar8 = iVar8 + 1) {
*(undefined4 *)(DAT_08008178 + iVar8 * 4) = DAT_0800817c;
}
DAT_08008164[1] = DAT_08008178;
puVar2 = DAT_08008168;
DAT_08008168[1] = DAT_08008180;
puVar2[8] = DAT_08008184;
iVar8 = calibrateThreshold(param_1);
if (iVar8 == 0) {
local_7c = *DAT_08008188;
uStack_78 = DAT_08008188[1];
uStack_74 = DAT_08008188[2];
uStack_70 = DAT_08008188[3];
local_6c = DAT_08008188[4];
uStack_68 = DAT_08008188[5];
local_64 = (undefined2)DAT_08008188[6];
uVar3 = strlen_custom(&local_7c);
FUN_080037a2(DAT_08008170,&local_7c,uVar3,0xffffffff);
}
}
}
else {
FUN_080037a2(DAT_08008170,DAT_0800816c,0x32,0xffffffff);
}
return param_1;
}
void FUN_08008194(undefined4 param_1,undefined4 param_2,undefined4 param_3)
{
float local_14 [2];
FUN_0800d1e4(param_2,param_3,local_14,0);
if (local_14[0] != 0.0 && local_14[0] < 0.0 == NAN(local_14[0])) {
FUN_0800e090(1.0 / local_14[0],param_2,param_2,param_3);
}
return;
}
void resetSensorState(int param_1)
{
int iVar1;
int iVar2;
int iVar3;
int iVar4;
bool bVar5;
int iVar6;
undefined4 uVar7;
float *pfVar8;
int iVar9;
uint in_fpscr;
float fVar10;
undefined4 local_1c74;
float local_1c70;
float local_1c6c;
int local_1c68;
undefined4 local_1c64;
float local_1c60;
int local_1c5c;
float local_1c58;
int aiStack_1c54 [509];
undefined1 auStack_1460 [4];
undefined4 local_145c;
undefined4 local_1458;
undefined4 local_1454;
float local_1450 [1036];
float local_420 [257];
for (iVar1 = 0; iVar1 < 0x40; iVar1 = iVar1 + 1) {
for (iVar6 = 0; iVar6 < 4; iVar6 = iVar6 + 1) {
local_420[iVar6 + iVar1 * 4] = *(float *)(*(int *)(param_1 + iVar6 * 4 + 4) + iVar1 * 4);
}
}
FUN_08012484(local_1450 + 0xc,0,0x1000);
for (iVar1 = 0; iVar1 < 4; iVar1 = iVar1 + 1) {
if (iVar1 != 3) {
for (iVar6 = 0; iVar6 < 0x40; iVar6 = iVar6 + 1) {
local_1450[iVar6 + iVar1 * 0x100 + 0xc] = local_420[iVar1 + iVar6 * 4];
}
}
}
iVar6 = 0;
local_1450[9] = 0.0;
local_1450[10] = 0.0;
local_1450[0xb] = 0.0;
local_1450[6] = 0.0;
local_1450[7] = 0.0;
local_1450[8] = 0.0;
local_1450[3] = 0.0;
local_1450[4] = 0.0;
local_1450[5] = 0.0;
local_1450[0] = 0.0;
local_1450[1] = 0.0;
local_1450[2] = 0.0;
local_145c = 0;
local_1458 = 0;
local_1454 = 0;
iVar1 = 0;
do {
if (3 < iVar6) {
FUN_08008194(auStack_1460,local_1450 + 6,3);
FUN_08008194(auStack_1460,local_1450 + 3,3);
iVar6 = *(int *)(param_1 + 0x34);
sendMidiCommand(local_1450 + 9,iVar6,3);
sendMidiCommand(local_1450 + 6,iVar6 + 0xc,3);
sendMidiCommand(local_1450 + 3,iVar6 + 0x18,3);
sendMidiCommand(local_1450,iVar6 + 0x24,3);
sendMidiCommand(&local_145c,iVar6 + 0x30,3);
FUN_0800d168(local_1450 + 9,3,iVar6 + 0x3c);
iVar1 = FUN_08009676(*DAT_080084b4);
if (iVar1 == 0) {
uVar7 = 0;
}
else {
uVar7 = 0x3f800000;
}
*(undefined4 *)(iVar6 + 0x40) = uVar7;
return;
}
if (iVar6 != 3) {
pfVar8 = local_1450 + iVar6 * 0x100 + 0xc;
FUN_0800d1e4(pfVar8,0x40,local_1450 + iVar1 + 9,&local_1c74);
fVar10 = (float)VectorUnsignedToFloat(local_1c74,(byte)(in_fpscr >> 0x15) & 3);
local_1450[iVar1] = fVar10 * DAT_080084b0;
local_1c70 = 0.0;
FUN_0800e1d0(pfVar8,pfVar8,0x40,&local_1c70);
local_1450[iVar1 + 6] = local_1c70;
fVar10 = *pfVar8;
for (iVar4 = 1; iVar4 < 0x40; iVar4 = iVar4 + 1) {
local_1450[iVar1 + 3] = local_1450[iVar1 + 3] + ABS(pfVar8[iVar4] - fVar10);
fVar10 = pfVar8[iVar4];
}
if (iVar6 == 0) {
for (iVar4 = 0; iVar4 < 0x40; iVar4 = iVar4 + 1) {
(&local_1c6c)[iVar4 * 2 + 3] = pfVar8[iVar4];
(&local_1c5c)[iVar4 * 2] = iVar4;
}
for (iVar4 = 0; iVar4 < 0x3f; iVar4 = iVar4 + 1) {
iVar9 = 0;
while (iVar3 = iVar9, iVar3 < 0x3f - iVar4) {
iVar9 = iVar3 + 1;
in_fpscr = in_fpscr & 0xfffffff;
if ((&local_1c6c)[iVar3 * 2 + 3] < (&local_1c6c)[iVar9 * 2 + 3]) {
local_1c6c = (&local_1c6c)[iVar3 * 2 + 3];
local_1c68 = (&local_1c5c)[iVar3 * 2];
iVar2 = (&local_1c5c)[iVar9 * 2];
(&local_1c6c)[iVar3 * 2 + 3] = (&local_1c6c)[iVar9 * 2 + 3];
(&local_1c5c)[iVar3 * 2] = iVar2;
(&local_1c6c)[iVar9 * 2 + 3] = local_1c6c;
(&local_1c5c)[iVar9 * 2] = local_1c68;
}
}
}
local_1c6c = 0.0;
local_1c68 = 0;
local_1c64 = 0;
iVar4 = 0;
iVar9 = 0;
while ((iVar9 < 0x40 && (iVar4 < 3))) {
for (iVar3 = 0; iVar3 < iVar4; iVar3 = iVar3 + 1) {
iVar2 = VectorFloatToSignedFixed((&local_1c6c)[iVar3],0x20,6);
if (((&local_1c5c)[iVar9 * 2] - iVar2) + 4U < 9) {
bVar5 = false;
goto LAB_080083b6;
}
}
bVar5 = true;
LAB_080083b6:
if (bVar5) {
fVar10 = (float)VectorSignedToFloat((&local_1c5c)[iVar9 * 2],
(byte)(in_fpscr >> 0x15) & 3);
(&local_1c6c)[iVar4] = fVar10 * DAT_080084b0;
iVar4 = iVar4 + 1;
}
iVar9 = iVar9 + 1;
}
if (2 < iVar4) {
iVar4 = 3;
}
sendMidiCommand(&local_1c6c,&local_145c,iVar4);
}
iVar1 = iVar1 + 1;
}
iVar6 = iVar6 + 1;
} while( true );
}
void FUN_080084b8(int param_1)
{
undefined4 uVar1;
undefined4 uVar2;
int iVar3;
uint in_fpscr;
float fVar4;
float local_120;
undefined1 auStack_11c [4];
undefined1 auStack_118 [260];
if (*DAT_080085ac == '\0') {
for (iVar3 = 0; iVar3 < 0x40; iVar3 = iVar3 + 1) {
fVar4 = (float)VectorSignedToFloat(iVar3,(byte)(in_fpscr >> 0x15) & 3);
fVar4 = (float)FUN_0800dffc((fVar4 * DAT_080085b0) / DAT_080085b4);
*(float *)(DAT_080085c0 + iVar3 * 4) = DAT_080085bc - fVar4 * DAT_080085b8;
}
*DAT_080085ac = '\x01';
}
for (iVar3 = 0; iVar3 < 4; iVar3 = iVar3 + 1) {
if (iVar3 != 3) {
copyBuffer(auStack_118,*(undefined4 *)(param_1 + iVar3 * 4 + 4),0x100);
uVar1 = DAT_080085c8;
FUN_0800e11c(auStack_118,DAT_080085c0,DAT_080085c8,0x40);
uVar2 = DAT_080085d0;
FUN_0800d5c8(*DAT_080085cc + 0x10,uVar1,DAT_080085d0,0);
uVar1 = DAT_080085c4;
FUN_0800ddb4(uVar2,DAT_080085c4,0x20);
FUN_0800d1e4(uVar1,0x20,&local_120,auStack_11c);
if (local_120 != DAT_080085d4 &&
local_120 < DAT_080085d4 == (NAN(local_120) || NAN(DAT_080085d4))) {
FUN_0800e090(1.0 / local_120,uVar1,uVar1,0x20);
}
uVar1 = DAT_080085c4;
sendMidiCommand(DAT_080085c4,*(undefined4 *)(param_1 + (iVar3 + 8) * 4 + 4),0x20);
sendMidiCommand(uVar1,*(int *)(param_1 + 0x30) + iVar3 * 0x80,0x20);
}
}
return;
}
void FUN_080085d8(void)
{
undefined4 uVar1;
int iVar2;
uVar1 = updateGlobalSystemStatus();
*DAT_080085f4 = uVar1;
iVar2 = lookupSensorFlag(DAT_080085f8);
if (iVar2 != 0) {
iVar2 = 1;
}
*DAT_080085fc = (char)iVar2;
return;
}
undefined4 FUN_08008600(void)
{
int iVar1;
DataMemoryBarrier(0x1b);
if (((*DAT_08008628 & 1) == 0) && (iVar1 = FUN_0800e8c0(DAT_08008628), iVar1 != 0)) {
FUN_0800e8d8(DAT_08008628);
}
return DAT_0800862c;
}
void handleSysExMessage(undefined4 param_1,undefined4 status,char data1,undefined1 data2,
undefined1 data3)
{
ushort uVar1;
char cVar2;
ushort *puVar3;
uint uVar4;
uint i;
uint dataLength;
char messageData [8];
switch(status) {
case 4:
messageData[0] = data1;
messageData[1] = data2;
messageData[2] = data3;
dataLength = 3;
break;
case 5:
messageData[0] = data1;
dataLength = 1;
break;
case 6:
messageData[0] = data1;
messageData[1] = data2;
dataLength = 2;
break;
case 7:
messageData[0] = data1;
messageData[1] = data2;
messageData[2] = data3;
dataLength = 3;
break;
default:
goto switchD_0800863e_caseD_4;
}
for (i = 0; i < dataLength; i = i + 1 & 0xff) {
cVar2 = messageData[i];
if (*sysExInProgress == '\0') {
if (cVar2 == -0x10) {
*sysExInProgress = '\x01';
puVar3 = sysExIndex;
*sysExIndex = 0;
*puVar3 = 1;
*sysExBuffer = 0xf0;
}
}
else {
uVar1 = *sysExIndex;
uVar4 = uVar1 + 1;
*sysExIndex = (ushort)uVar4;
sysExBuffer[uVar1] = cVar2;
if (0xff < (uVar4 & 0xffff)) {
*sysExInProgress = '\0';
*sysExIndex = 0;
return;
}
if (cVar2 == -9) {
*sysExInProgress = '\0';
*sysExComplete = 1;
}
}
}
switchD_0800863e_caseD_4:
return;
}
void processSensorExpressionMode0(undefined4 param_1,undefined4 param_2,undefined4 param_3)
{
undefined4 local_20 [6];
extractSensorControlParameters(local_20);
FUN_080073d0(local_20[0],param_3);
return;
}
void processSensorExpressionMode1(float param_1)
{
undefined4 uVar1;
undefined4 local_28 [7];
extractSensorControlParameters(local_28);
uVar1 = VectorFloatToUnsigned(param_1 * DAT_08008748,3);
FUN_080073d0(local_28[0],uVar1);
return;
}
void updateMidiDeviceStatus(void)
{
if (*(char *)(DAT_0800876c + 0x29c) == '\x03') {
resetSensorSubsystem(DAT_08008774);
}
else {
resetSensorSubsystem(DAT_08008770);
}
return;
}
// Checks the current time against the last MIDI transmission time and, if conditions are met and
// the MIDI queue is nonempty, attempts to transmit a MIDI packet.
// On successful transmission it updates the packet index and resets the error counter; on failure,
// it increments an error counter and logs the error.
void updateMidiChannel(void)
{
int currentTime;
ushort uVar1;
undefined4 in_r3;
currentTime = getCurrentTime();
if ((1 < (uint)(currentTime - *GLOBAL_MIDI_LAST_TX_TIME)) &&
((uint)*GLOBAL_MIDI_QUEUE_HEAD != (uint)*GLOBAL_MIDI_PACKET_INDEX)) {
currentTime = transmitMidiPacket(GLOBAL_MIDI_DEVICE_HANDLE,0x81,
GLOBAL_MIDI_PACKET_BUFFER_BASE +
(uint)*GLOBAL_MIDI_PACKET_INDEX * 4,4,in_r3);
if (currentTime == 0) {
currentTime = *GLOBAL_MIDI_PACKET_INDEX + 1;
uVar1 = (ushort)currentTime & 0x7ff;
if (currentTime == 0) {
uVar1 = -(ushort)((uint)(currentTime * -0x200000) >> 0x15);
}
*GLOBAL_MIDI_PACKET_INDEX = uVar1;
currentTime = getCurrentTime();
*GLOBAL_MIDI_LAST_TX_TIME = currentTime;
*GLOBAL_MIDI_ERROR_COUNTER = '\0';
}
else {
// Increment error counter and log the error.
*GLOBAL_MIDI_ERROR_COUNTER = *GLOBAL_MIDI_ERROR_COUNTER + '\x01';
FUN_08012370(DAT_080087f8);
}
}
return;
}
// Constructs an event record by combining three event type bytes into the lower 24 bits, preserving
// the current upper byte, and then writes the record (with an associated event parameter) into the
// global event buffer if the newly computed event ID differs from the last stored ID.
void notifySensorEvent(undefined4 param_1,undefined1 eventTypeByte1,undefined1 eventTypeByte2,
undefined1 eventTypeByte3,undefined4 eventParameter)
{
ushort newEventId;
int newEventCounter;
undefined4 *eventRecordPtr;
undefined4 local_eventRecord;
undefined4 eventRecord;
// Preserve the current (upper) byte of the event record.
eventRecord = local_eventRecord;
// Compute the new event counter and derive a 16-bit event ID.
newEventCounter = *GLOBAL_EVENT_COUNTER + 1;
newEventId = (ushort)((uint)(newEventCounter * 0x80000) >> 0x13);
if (newEventCounter == 0) {
newEventId = -(ushort)((uint)(newEventCounter * -0x80000) >> 0x13);
}
// If the new event ID differs from the last stored event ID, update the event
// buffer.
if (*GLOBAL_LAST_EVENT_ID != newEventId) {
// Set the lower 24 bits of eventRecord to the concatenation of eventTypeByte3,
// eventTypeByte2, and eventTypeByte1.
// The upper 8 bits are preserved from the original eventRecord.
local_eventRecord._3_1_ = SUB41(eventRecord,3);
local_eventRecord._0_3_ = CONCAT12(eventTypeByte3,CONCAT11(eventTypeByte2,eventTypeByte1));
// Compute pointer to the event record slot (each record is 8 bytes).
eventRecordPtr = (undefined4 *)(GLOBAL_EVENT_BUFFER + (uint)*GLOBAL_EVENT_COUNTER * 8);
*eventRecordPtr = local_eventRecord;
eventRecordPtr[1] = eventParameter;
*GLOBAL_EVENT_COUNTER = newEventId;
}
return;
}
// Adjusts the effective control parameter based on a flag and then notifies the sensor event with a
// fixed command (3) along with the flag and extra parameter.
void applySensorControlParameters
(undefined4 midiOutput,undefined4 param_2,char controlFlag,undefined4 backupParameter
,undefined1 extraFlag,undefined4 effectiveParameter)
{
// If the control flag is set, override the effective parameter with
// backupParameter.
if (controlFlag != '\0') {
effectiveParameter = backupParameter;
}
notifySensorEvent(midiOutput,3,controlFlag != '\0',extraFlag,effectiveParameter);
return;
}
// Sends a fixed alternate sensor message by notifying a sensor event with command type 10 and a
// fixed event parameter (0x556).
void handleAlternateSensorMessage(undefined4 midiOutput)
{
notifySensorEvent(midiOutput,10,0,0,0x556);
return;
}
void transmitMidiNoteOffMessage(undefined4 midiDestination,int noteOffTable)
{
undefined4 noteOffFlagValue;
uint innerIndex;
int totalEventCount;
uint outerIndex;
noteOffFlagValue = lookupSensorFlag(NOTE_OFF_IDENTIFIER);
notifySensorEvent(midiDestination,0x10,0,0,noteOffFlagValue);
totalEventCount = 0;
for (outerIndex = 0; outerIndex < 4; outerIndex = outerIndex + 1 & 0xff) {
for (innerIndex = 0; innerIndex < 0x40; innerIndex = innerIndex + 1 & 0xff) {
notifySensorEvent(midiDestination,6,1,0,
*(undefined4 *)
(*(int *)(noteOffTable + outerIndex * 4 + 4) + innerIndex * 4));
totalEventCount = totalEventCount + 1;
}
}
notifySensorEvent(midiDestination,0x11,0,0,totalEventCount);
return;
}
void sendMidiMessage(undefined4 param_1,undefined1 manufacturerId,undefined1 deviceId,int payload,
uint payloadLength)
{
byte crcChecksum;
byte ii;
int headerLength;
uint i;
uint uVar1;
uint uVar2;
uint uVar3;
undefined1 uVar4;
undefined1 local_618 [512];
undefined1 sysExMessage [512];
byte local_218 [8];
byte sysExHeader [516];
// SysEx header construction
// Manufacturer ID (example: 0x4F for a specific vendor)
sysExHeader[0] = 0x4f;
sysExHeader[1] = manufacturerId;
if (payload == 0) {
sysExHeader[2] = deviceId;
headerLength = 3;
}
else {
sysExHeader[2] = (char)payload;
sysExHeader[3] = deviceId;
headerLength = 4;
}
// Add payload length and checksum placeholder
uVar2 = headerLength + 1;
// Payload length (example: fixed to 5 bytes)
sysExHeader[headerLength] = 5;
// Encode payload data (7-bit format)
for (i = 0; i < 5; i = i + 1 & 0xff) {
// 7-bit encoding
local_218[4 - i] = (byte)(payloadLength >> (i * 7 & 0xff)) & 0x7f;
}
// Append payload to SysEx message
for (i = 0; i < 5; i = i + 1 & 0xff) {
sysExHeader[uVar2] = local_218[i];
uVar2 = uVar2 + 1 & 0xffff;
}
// Calculate checksum
crcChecksum = 0;
for (i = 0; i < uVar2; i = i + 1 & 0xffff) {
// Sum of all bytes (7-bit)
crcChecksum = crcChecksum + sysExHeader[i] & 0x7f;
}
// Append checksum
sysExHeader[uVar2] = crcChecksum;
// Construct SysEx message with start and end markers
// SysEx start byte
sysExMessage[0] = 0xf0;
// Copy payload
copyBuffer(sysExMessage + 1,sysExHeader,uVar2 + 1 & 0xffff);
uVar3 = uVar2 + 3 & 0xffff;
// SysEx end byte
sysExMessage[uVar2 + 2 & 0xffff] = 0xf7;
// Split SysEx message into MIDI packets
i = 0;
uVar2 = 0;
do {
if (uVar3 <= i) {
// Send MIDI packets
sendMidiPacket(DAT_08008a5c,local_618);
return;
}
uVar1 = uVar3 - i & 0xffff;
if (uVar1 < 3) {
if (uVar1 == 2) {
crcChecksum = 2;
uVar4 = 6;
}
else if (uVar1 == 3) {
crcChecksum = 3;
uVar4 = 7;
}
else {
if (uVar1 != 1) {
return;
}
crcChecksum = 1;
uVar4 = 5;
}
}
else {
crcChecksum = 3;
uVar4 = 4;
}
// Construct MIDI packet
local_618[uVar2] = uVar4;
for (ii = 0; uVar2 = uVar2 + 1 & 0xffff, ii < 3; ii = ii + 1) {
if (ii < crcChecksum) {
local_618[uVar2] = sysExMessage[i];
i = i + 1 & 0xffff;
}
else {
// Pad with zeros if necessary
local_618[uVar2] = 0;
}
}
} while( true );
}
// Checks if enough time has passed since the last MIDI send and, if a pending message exists, sends
// the next MIDI message from the message buffer, then updates the message index.
void processPendingMidiMessage(undefined4 midiOutput)
{
int currentTime;
uint midiMsgWord;
ushort newMsgIndex;
uint *messagePtr;
undefined1 midiDataByte2;
undefined1 midiDataByte3;
currentTime = getCurrentTime();
if ((1 < (uint)(currentTime - *GLOBAL_LAST_MIDI_SEND_TIME)) &&
((uint)*GLOBAL_MIDI_MSG_INDEX != (uint)*GLOBAL_MIDI_QUEUE_COUNT)) {
messagePtr = (uint *)(GLOBAL_MIDI_MSG_BUFFER + (uint)*GLOBAL_MIDI_MSG_INDEX * 8);
midiMsgWord = *messagePtr;
midiDataByte3 = (undefined1)(midiMsgWord >> 0x10);
midiDataByte2 = (undefined1)(midiMsgWord >> 8);
sendMidiMessage(midiOutput,midiMsgWord & 0xff,midiDataByte2,midiDataByte3,messagePtr[1]);
*GLOBAL_LAST_MIDI_SEND_TIME = currentTime;
currentTime = *GLOBAL_MIDI_MSG_INDEX + 1;
newMsgIndex = (ushort)((uint)(currentTime * 0x80000) >> 0x13);
if (currentTime == 0) {
newMsgIndex = -(ushort)((uint)(currentTime * -0x80000) >> 0x13);
}
*GLOBAL_MIDI_MSG_INDEX = newMsgIndex;
}
return;
}
// Finalizes a sensor-generated MIDI Note On event by sending a header event, followed by a series
// of note data events, and finally a footer event indicating the total count of note data items.
void finalizeSensorNoteOn(undefined4 midiOutput,int noteDataBuffer)
{
undefined4 noteOnId;
uint noteCount;
// Lookup the sensor Note On identifier from a global table.
noteOnId = lookupSensorFlag(GLOBAL_SENSOR_NOTE_ON_IDENTIFIER);
// Send a header event with command code 0x10.
notifySensorEvent(midiOutput,0x10,0,0,noteOnId);
// Loop through the note data (0x83 items) and send each as a note event.
for (noteCount = 0; noteCount < 0x83; noteCount = noteCount + 1 & 0xff) {
notifySensorEvent(midiOutput,6,1,0,*(undefined4 *)(noteDataBuffer + noteCount * 4));
}
// Send a footer event with command code 0x11, including the total count.
notifySensorEvent(midiOutput,0x11,0,0,0x83);
return;
}
// Constructs an additional MIDI command from the given command bytes and updates the additional
// MIDI command buffer. If the computed new command index matches a target value, the sensor
// subsystem is reset.
void sendAdditionalMidiCommand
(undefined4 midiChannel,undefined1 cmdByte2,undefined1 cmdByte3,undefined1 cmdByte4)
{
ushort newCmdIndex;
int currentCmdCounter;
undefined4 additionalCmd;
// Construct the additional MIDI command:
// Lower byte is fixed as 9, then cmdByte2, then cmdByte3, then cmdByte4
// (highest).
additionalCmd = CONCAT13(cmdByte4,CONCAT12(cmdByte3,CONCAT11(cmdByte2,9)));
// Increment the additional command counter and compute a new command index.
currentCmdCounter = *GLOBAL_ADDITIONAL_MIDI_CMD_COUNTER + 1;
newCmdIndex = (ushort)((uint)(currentCmdCounter * 0x200000) >> 0x15);
if (currentCmdCounter == 0) {
newCmdIndex = -(ushort)((uint)(currentCmdCounter * -0x200000) >> 0x15);
}
// If the new index matches the target index, reset the sensor subsystem.
if (*GLOBAL_MIDI_CMD_TARGET_INDEX == newCmdIndex) {
resetSensorSubsystem(GLOBAL_MIDI_CMD_RESET_PARAM);
}
else {
// Otherwise, store the additional command in the command buffer at the current
// index.
*(undefined4 *)
(GLOBAL_ADDITIONAL_MIDI_CMD_BUFFER + (uint)*GLOBAL_ADDITIONAL_MIDI_CMD_COUNTER * 4) =
additionalCmd;
*GLOBAL_ADDITIONAL_MIDI_CMD_COUNTER = newCmdIndex;
}
return;
}
// Sends a control message by issuing an additional MIDI command with a fixed SysEx byte (0x99) and
// then registers a control event with the given parameters.
void transmitControlMessage
(undefined4 midiChannel,undefined4 eventCode,undefined4 eventModifier,
undefined4 eventParameter,undefined1 extraFlag)
{
// Send additional MIDI command:
// The constructed command will have fixed byte 0x99 as the second byte,
// followed by eventCode and eventModifier.
sendAdditionalMidiCommand(midiChannel,0x99,(char)eventCode,(char)eventModifier);
// Register the control event using the provided parameters.
registerControlEvent(*GLOBAL_CONTROL_EVENT_BASE,eventCode,eventModifier,eventParameter,extraFlag);
return;
}
// Processes an incoming sensor/MIDI message from a buffer, validates its checksum, extracts a
// payload, and dispatches processing based on command type and sub-command.
void processSensorMidiMessage(undefined4 midiOutput,int messageBuffer,uint messageLength)
{
byte computedChecksum;
uint checksumIndex;
uint payloadValue;
uint payloadLength;
undefined4 controlParam1;
undefined4 controlParam2;
undefined4 controlParam3;
undefined4 controlParam4;
undefined4 controlParam5;
undefined4 controlParam6;
char commandType;
undefined1 subCommand;
// The message must be at least 3 bytes long.
if (messageLength < 3) {
return;
}
// Check that the second byte equals the signature 'O'
if (*(char *)(messageBuffer + 1) != 'O') {
return;
}
// Read command type (third byte) and sub-command (fourth byte)
commandType = *(char *)(messageBuffer + 2);
subCommand = *(undefined1 *)(messageBuffer + 3);
// Read payload length from sixth byte.
payloadLength = (uint)*(byte *)(messageBuffer + 5);
// Verify that the total message length is sufficient to include the payload and
// checksum.
if ((int)messageLength <= (int)(payloadLength + 6)) {
return;
}
computedChecksum = 0;
// Compute checksum over bytes 1 .. (payloadLength+5 - 1)
for (checksumIndex = 1; (int)checksumIndex < (int)((payloadLength + 7 & 0xff) - 1);
checksumIndex = checksumIndex + 1 & 0xffff) {
computedChecksum = computedChecksum + *(char *)(messageBuffer + checksumIndex) & 0x7f;
}
// If the computed checksum does not match the transmitted checksum, abort.
if (computedChecksum != *(byte *)(messageBuffer + (payloadLength + 6 & 0xff))) {
return;
}
// Assemble a multi-byte value from the payload (each payload byte contributes 7
// bits).
payloadValue = 0;
for (checksumIndex = 0; checksumIndex < payloadLength; checksumIndex = checksumIndex + 1 & 0xff) {
payloadValue = payloadValue |
(*(byte *)(messageBuffer + checksumIndex + 6) & 0x7f) <<
(((payloadLength - 1) - checksumIndex) * 7 & 0xff);
}
switch(commandType) {
case '\x01':
// Depending on the command modifier (byte at offset 4), call one of two
// routines.
if (*(char *)(messageBuffer + 4) == '\0') {
processSensorExpressionMode0(midiOutput,subCommand,payloadValue);
}
else if (*(char *)(messageBuffer + 4) == '\x01') {
processSensorExpressionMode1(payloadValue,midiOutput,subCommand);
}
// Extract control parameters based on the sub-command.
extractSensorControlParameters(&controlParam1,subCommand);
if ((char)controlParam4 == -1) {
return;
}
applySensorControlParameters
(midiOutput,controlParam1,controlParam2,controlParam3,controlParam4,controlParam5,
controlParam6);
break;
case '\x02':
// For command type 2, simply extract control parameters.
extractSensorControlParameters(&controlParam1,subCommand);
if ((char)controlParam4 == -1) {
return;
}
applySensorControlParameters
(midiOutput,controlParam1,controlParam2,controlParam3,controlParam4,controlParam5,
controlParam6);
break;
case '\x03':
// For command type 3, call a reset routine.
resetSensorSubsystem();
goto transmit_label;
case '\a':
// For command type 7, notify a sensor event.
notifySensorEvent(midiOutput,8,0,0,0);
break;
case '\t':
// For command type 9, update sensor sub-command processing.
processSensorSubcommand(subCommand);
break;
case '\n':
// For command type 10, handle an alternate sensor message.
handleAlternateSensorMessage(midiOutput);
}
if (commandType == '\x04') {
// For command type 4, process a special sensor event.
processSpecialSensorEvent(*GLOBAL_SYSTEM_STATUS_PTR);
}
transmit_label:
// In all cases, transmit a control message.
transmitControlMessage(midiOutput,0x28,0,1,1);
return;
}
// Assembles a sensor MIDI message by copying a header, appending sensor data, appending a trailer,
// then processes the assembled message and resets the assembly flag.
void assembleSensorMidiMessage(undefined4 midiOutput,int sensorDataBuffer,uint dataLength)
{
int bytesAppended;
uint byteIndex;
int currentBufferOffset;
undefined4 headerField0;
undefined4 headerField1;
undefined4 headerField2;
undefined4 headerField3;
undefined4 headerField4;
undefined4 headerField5;
undefined1 headerField6;
// Copy header from global header table (GLOBAL_MIDI_MESSAGE_HEADER)
headerField0 = *GLOBAL_MIDI_MESSAGE_HEADER;
headerField1 = GLOBAL_MIDI_MESSAGE_HEADER[1];
headerField2 = GLOBAL_MIDI_MESSAGE_HEADER[2];
headerField3 = GLOBAL_MIDI_MESSAGE_HEADER[3];
headerField4 = GLOBAL_MIDI_MESSAGE_HEADER[4];
headerField5 = GLOBAL_MIDI_MESSAGE_HEADER[5];
headerField6 = (undefined1)GLOBAL_MIDI_MESSAGE_HEADER[6];
currentBufferOffset = 0x18;
// Append each byte of sensor data to the header buffer using appendToBuffer.
for (byteIndex = 0; byteIndex < dataLength; byteIndex = byteIndex + 1 & 0xffff) {
bytesAppended =
appendToBuffer((int)&headerField0 + currentBufferOffset,0x200 - currentBufferOffset,
GLOBAL_MIDI_MESSAGE_MIDDLE,*(undefined1 *)(sensorDataBuffer + byteIndex));
currentBufferOffset = currentBufferOffset + bytesAppended;
}
// Append the trailer from a global trailer value.
appendToBuffer((int)&headerField0 + currentBufferOffset,0x200 - currentBufferOffset,
GLOBAL_MIDI_MESSAGE_TRAILER);
// Process the assembled sensor MIDI message.
processSensorMidiMessage(midiOutput,sensorDataBuffer,dataLength);
// Reset a global flag indicating message assembly is complete.
*GLOBAL_MIDI_MESSAGE_FLAG = 0;
return;
}
// Triggers a MIDI effect by sending an additional MIDI command and updating effect status.
void triggerMidiEffect(undefined4 midiOutput,undefined4 effectParam,undefined1 param_3)
{
sendAdditionalMidiCommand(midiOutput,0x89,(char)effectParam,param_3);
updateMidiEffectStatus(*GLOBAL_MIDI_EFFECT_DATA,effectParam);
return;
}
// Checks device and control event status, processes pending MIDI messages, and triggers MIDI
// effects based on control event timing.
void updateSensorMidiProcessing(undefined4 midiOutput)
{
int currentTime;
int controlEventTimestamp;
byte eventIndex;
currentTime = isControlEventActive(*GLOBAL_CONTROL_EVENT_DATA);
if (currentTime == 0) {
currentTime = getCurrentTime();
// If device status is not "transmit-ready" (3) then reset sensor subsystem.
if (*(char *)(GLOBAL_DEVICE_STATUS + 0x29c) != '\x03') {
resetSensorSubsystem(GLOBAL_SENSOR_RESET_PARAM);
updateMidiDeviceStatus(midiOutput);
}
// Process pending MIDI messages if the MIDI queue pointers match.
if (*GLOBAL_MIDI_QUEUE_HEAD == *GLOBAL_MIDI_QUEUE_TAIL) {
processPendingMidiMessage(midiOutput);
}
// If a MIDI message has been assembled, process it.
if (*GLOBAL_MIDI_ASSEMBLY_FLAG != '\0') {
assembleSensorMidiMessage(midiOutput,DAT_08008e60,*DAT_08008e5c);
*GLOBAL_MIDI_ASSEMBLY_FLAG = '\0';
}
updateMidiChannel(midiOutput);
// Loop through control event indices.
for (eventIndex = 0; (eventIndex & 0x80) == 0; eventIndex = eventIndex + 1) {
controlEventTimestamp = checkControlEventStatus(*GLOBAL_CONTROL_EVENT_DATA,eventIndex);
if ((controlEventTimestamp != 0) &&
(controlEventTimestamp = getControlEventTimestamp(*GLOBAL_CONTROL_EVENT_DATA,eventIndex),
100 < (uint)(currentTime - controlEventTimestamp))) {
triggerMidiEffect(midiOutput,eventIndex,0x40);
updateMidiEffectStatus(*GLOBAL_CONTROL_EVENT_DATA,eventIndex);
}
}
}
return;
}
void applySensorExpressionOutput
(float sensorExpr,undefined4 midiCmdBuffer,undefined4 param_3,uint outputType,
undefined4 rawExprParam,undefined4 unusedParam2,float exprScalingFactor)
{
undefined1 sensorOutputFlag;
int tempInt;
uint in_fpscr;
undefined4 floatFactor;
float tempFloat1;
uint vectorResult2;
uint vectorResult;
float tempFloat2;
undefined1 stackControlFlag;
byte noteValueByte;
undefined1 midiBuffer [100];
undefined1 controlDataBuffer [12];
uint currentTimeThreshold;
undefined4 *controlDataPtr;
byte currentSensorFlag;
byte *midiNoteBufferPtr;
ushort outputDelay;
// Mask outputType to 8 bits.
outputType = outputType & 0xff;
if (outputType != 0) {
if (outputType == 4) {
sensorOutputFlag = lookupSensorFlag(SENSOR_FLAG_OUTPUT_TYPE4);
}
else {
sensorOutputFlag = 0x26;
}
if (outputType == 1) {
sensorOutputFlag = lookupSensorFlag(SENSOR_FLAG_OUTPUT_TYPE1);
}
if (outputType == 2) {
floatFactor = convertFixedPointToFloat(SENSOR_EXPR_BASE_FP);
tempFloat1 = (float)normalizeSensorExpressionValue(rawExprParam,floatFactor);
vectorResult = VectorFloatToUnsigned(tempFloat1 * SENSOR_EXPR_SCALING,3);
tempFloat2 = (float)VectorSignedToFloat(vectorResult & 0xff,(byte)(in_fpscr >> 0x15) & 3);
tempFloat1 = (float)convertFixedPointToFloat(SENSOR_EXPR_FACTOR_FP);
midiNoteBufferPtr = GLOBAL_MIDI_NOTE_BUFFER;
vectorResult = VectorFloatToUnsigned(tempFloat2 * exprScalingFactor * tempFloat1,3);
noteValueByte = (byte)vectorResult;
*GLOBAL_MIDI_NOTE_BUFFER = noteValueByte;
if ((vectorResult & 0x80) != 0) {
*midiNoteBufferPtr = 0x7f;
}
tempInt = lookupSensorFlag(SENSOR_FLAG_COND1);
if ((tempInt != 0) &&
(currentSensorFlag = *GLOBAL_MIDI_NOTE_BUFFER,
vectorResult = lookupSensorFlag(SENSOR_FLAG_COMPARISON), vectorResult < currentSensorFlag))
{
sensorOutputFlag = lookupSensorFlag(SENSOR_FLAG_ALTERNATE);
}
}
vectorResult2 = VectorFloatToUnsigned(sensorExpr * SENSOR_EXPR_SCALING,3);
vectorResult = vectorResult2 & 0xff;
if ((vectorResult2 & 0x80) != 0) {
vectorResult = 0x7f;
}
prepareControlDataBuffer(controlDataBuffer,*GLOBAL_CONTROL_DATA,sensorOutputFlag);
vectorResult2 = getCurrentTime();
controlDataPtr = GLOBAL_CONTROL_DATA;
if (vectorResult2 < currentTimeThreshold) {
if (*GLOBAL_CONTROL_FLAG != '\0') {
updateMidiBuffer(midiBuffer,GLOBAL_CONTROL_PARAM,sensorOutputFlag);
}
}
else {
outputDelay = *(ushort *)(GLOBAL_OUTPUT_DELAY_ARRAY + outputType * 2);
floatFactor = *GLOBAL_CONTROL_DATA;
tempInt = getCurrentTime();
scheduleControlEvent(floatFactor,sensorOutputFlag,tempInt + (uint)outputDelay);
tempInt = checkControlEventStatus(*controlDataPtr,sensorOutputFlag);
if (((tempInt != 0) &&
(triggerMidiEffect(midiCmdBuffer,sensorOutputFlag,0x40), outputType == 5)) &&
(tempInt = checkControlEventStatus(*controlDataPtr,0x28), tempInt != 0)) {
triggerMidiEffect(midiCmdBuffer,0x28,0x40);
}
tempInt = lookupSensorFlag(SENSOR_FLAG_EXTRA);
if ((tempInt != 0) && (outputType == 2)) {
sendAdditionalMidiCommand
(midiCmdBuffer,*GLOBAL_MIDI_PARAM_A,*GLOBAL_MIDI_PARAM_B,*GLOBAL_MIDI_NOTE_BUFFER)
;
}
transmitControlMessage
(midiCmdBuffer,sensorOutputFlag,vectorResult,stackControlFlag,outputType);
if ((outputType == 5) && (tempInt = lookupSensorFlag(SENSOR_FLAG_ALT_COND), tempInt == 0)) {
sensorOutputFlag = lookupSensorFlag(SENSOR_FLAG_OUTPUT_TYPE1);
transmitControlMessage(midiCmdBuffer,sensorOutputFlag,vectorResult,stackControlFlag,5);
}
else if (outputType == 5) {
sensorOutputFlag = lookupSensorFlag(SENSOR_FLAG_ALT_OUTPUT);
transmitControlMessage(midiCmdBuffer,sensorOutputFlag,vectorResult,stackControlFlag,5);
}
}
}
return;
}
void sendSysExMessage(undefined4 sysExParam,undefined4 dataByte1,undefined4 dataByte2,
undefined4 dataByte3)
{
handleSysExMessage(DAT_080090a4,sysExParam,dataByte1,dataByte2,dataByte3);
return;
}
// Iterates over a table of SysEx message entries and sends a SysEx message for each entry whose
// nibble value (low 4 bits) is in the range [4,7].
void processSysExMessageTable(int messageTableBase,uint tableSize)
{
uint nibbleValue;
int entryOffset;
uint index;
if ((tableSize & 3) == 0) {
for (index = 0; index < tableSize >> 2; index = index + 1 & 0xffff) {
entryOffset = messageTableBase + index * 4;
nibbleValue = *(byte *)(messageTableBase + index * 4) & 0xf;
if (nibbleValue - 4 < 4) {
sendSysExMessage(nibbleValue,*(undefined1 *)(entryOffset + 1),
*(undefined1 *)(entryOffset + 2),*(undefined1 *)(entryOffset + 3));
}
}
return;
}
return;
}
// Performs data synchronization, writes a hardware mask, then halts in an infinite loop.
void lockSystemAndHalt(void)
{
DataSynchronizationBarrier(0xf);
*(uint *)(GLOBAL_HARDWARE_REGISTER + 0xc) =
GLOBAL_HARDWARE_MASK | *(uint *)(GLOBAL_HARDWARE_REGISTER + 0xc) & 0x700;
DataSynchronizationBarrier(0xf);
do {
// WARNING: Do nothing block with infinite loop
// Infinite loop: system halted.
} while( true );
}
// Uses memory barriers and checks the control flag; if an update is pending, it refreshes global
// control data.
undefined4 refreshControlData(void)
{
int status;
DataMemoryBarrier(0x1b);
if (((*GLOBAL_CONTROL_FLAG & 1) == 0) && (status = FUN_0800e8c0(GLOBAL_CONTROL_FLAG), status != 0)
) {
FUN_080098a8(GLOBAL_CONTROL_DATA);
FUN_0800e8d8(GLOBAL_CONTROL_FLAG);
}
return GLOBAL_CONTROL_DATA;
}
// Calls refreshControlData and then commits the updated control data.
void commitControlDataUpdate(void)
{
undefined4 updatedData;
updatedData = refreshControlData();
*GLOBAL_COMMIT_LOCATION = updatedData;
return;
}
// Sets the sensor control flag byte at a fixed offset within the sensor structure.
void setSensorControlFlag(int sensorDataPtr,undefined1 flagValue)
{
*(undefined1 *)(sensorDataPtr + 0xcde) = flagValue;
return;
}
// Retrieves the sensor control flag byte from the sensor structure.
undefined1 getSensorControlFlag(int sensorDataPtr)
{
return *(undefined1 *)(sensorDataPtr + 0xcde);
}
// Returns a pointer (offset) to the sensor data buffer.
int getSensorDataBufferBase(int sensorBasePtr)
{
return sensorBasePtr + 0xa98;
}
// Increments the sensor message counter stored at a fixed offset in the sensor structure.
void incrementSensorMessageCounter(int sensorDataPtr)
{
*(int *)(sensorDataPtr + 0xce0) = *(int *)(sensorDataPtr + 0xce0) + 1;
if (*(int *)(sensorDataPtr + 0xce0) == -1) {
*(undefined4 *)(sensorDataPtr + 0xce0) = 0;
}
return;
}
// Returns the current sensor message counter.
undefined4 getSensorMessageCounter(int sensorDataPtr)
{
return *(undefined4 *)(sensorDataPtr + 0xce0);
}
// Resets and reinitializes various fields in the sensor data structure and its sub-buffers.
int initializeSensorDataStructures(int sensorBasePtr)
{
undefined4 tempVal;
int i;
int ii;
int recordIndex;
*(undefined1 *)(sensorBasePtr + 0xca8) = 0;
*(undefined1 *)(sensorBasePtr + 0xca9) = 0;
// Initialize 4 sensor sub-records.
for (recordIndex = 0; recordIndex < 4; recordIndex = recordIndex + 1) {
i = sensorBasePtr + recordIndex * 0x1c;
*(undefined4 *)(i + 0x9ec) = 0;
*(undefined4 *)(i + 0x9f0) = 0;
*(undefined4 *)(i + 0x9f4) = 0;
*(undefined4 *)(i + 0x9f8) = 0;
*(undefined4 *)(i + 0x9fc) = 0;
*(undefined4 *)(i + 0xa00) = 0;
*(undefined4 *)(i + 0xa04) = 0;
*(undefined4 *)(i + 0x9f8) = 0;
tempVal = thunk_FUN_0800e8de(0x1000);
*(undefined4 *)(i + 0x9fc) = tempVal;
*(undefined1 *)(i + 0xa00) = 0;
*(undefined1 *)(i + 0xa01) = 0;
*(undefined4 *)(i + 0x9f4) = 0;
*(undefined4 *)(i + 0x9f0) = 0;
*(undefined4 *)(i + 0xa04) = 0;
}
// Initialize 0x80 sensor records.
for (recordIndex = 0; recordIndex < 0x80; recordIndex = recordIndex + 1) {
i = sensorBasePtr + recordIndex * 0x14;
*(undefined4 *)(sensorBasePtr + recordIndex * 0x14) = 0;
*(undefined4 *)(i + 4) = 0;
*(undefined4 *)(i + 8) = 0;
*(undefined4 *)(i + 0xc) = 0;
*(undefined4 *)(i + 0x10) = 0;
}
*(undefined4 *)(sensorBasePtr + 0xcb8) = 0;
*(undefined4 *)(sensorBasePtr + 0xcbc) = 0;
*(undefined4 *)(sensorBasePtr + 0xcd8) = 0;
*(undefined1 *)(sensorBasePtr + 0xcdc) = 0;
*(undefined4 *)(sensorBasePtr + 0xcd4) = 0;
*(undefined1 *)(sensorBasePtr + 0xcdd) = 0;
*(undefined4 *)(sensorBasePtr + 0xccc) = 0;
*(undefined4 *)(sensorBasePtr + 0xcc0) = 0;
*(undefined4 *)(sensorBasePtr + 0xcc4) = 0;
*(undefined4 *)(sensorBasePtr + 0xcc8) = 0;
*(undefined4 *)(sensorBasePtr + 0xce0) = 0;
*(undefined1 *)(sensorBasePtr + 0xcab) = 0;
*(undefined1 *)(sensorBasePtr + 0xcaa) = 0;
*(undefined1 *)(sensorBasePtr + 0xcde) = 0;
// Initialize 6 additional sensor sub-structures.
for (recordIndex = 0; recordIndex < 6; recordIndex = recordIndex + 1) {
i = sensorBasePtr + recordIndex * 0x38;
FUN_08012484((undefined4 *)(i + 0xa98),0,0x38);
tempVal = getSensorMessageCounter(sensorBasePtr);
*(undefined4 *)(i + 0xa9c) = tempVal;
*(undefined1 *)(i + 0xaa0) = 0;
*(undefined4 *)(i + 0xa98) = 0;
tempVal = getCurrentTime();
*(undefined4 *)(i + 0xaa4) = tempVal;
*(undefined1 *)(i + 0xabc) = 0;
*(undefined4 *)(i + 0xac0) = 0;
*(undefined1 *)(i + 0xac4) = 0;
*(undefined4 *)(i + 0xab8) = 0;
*(undefined4 *)(i + 0xac8) = 0;
*(undefined4 *)(i + 0xacc) = 0;
}
// Initialize 1 additional control structure.
for (recordIndex = 0; recordIndex < 1; recordIndex = recordIndex + 1) {
i = sensorBasePtr + recordIndex * 0x3c;
FUN_08012484(i + 0xa5c,0,0x3c);
*(undefined1 *)(i + 0xa79) = 0;
*(undefined1 *)(i + 0xa78) = 0;
tempVal = getSensorMessageCounter(sensorBasePtr);
*(undefined4 *)(i + 0xa7c) = tempVal;
tempVal = thunk_FUN_0800e8de(0x180);
*(undefined4 *)(i + 0xa8c) = tempVal;
tempVal = thunk_FUN_0800e8de(0x44);
*(undefined4 *)(i + 0xa90) = tempVal;
tempVal = thunk_FUN_0800e8de(0x48);
*(undefined4 *)(i + 0xa94) = tempVal;
for (i = 0; i < 4; i = i + 1) {
tempVal = thunk_FUN_0800e8de(0x100);
ii = recordIndex * 0xf + i;
*(undefined4 *)(sensorBasePtr + (ii + 0x296) * 4 + 8) = tempVal;
tempVal = thunk_FUN_0800e8de(0x84);
*(undefined4 *)(sensorBasePtr + (ii + 0x29e) * 4 + 8) = tempVal;
}
}
return sensorBasePtr;
}
// Uses memory barriers and conditionally updates the global system status.
undefined4 updateGlobalSystemStatus(void)
{
int status;
DataMemoryBarrier(0x1b);
if (((*GLOBAL_SYSTEM_STATUS_FLAG & 1) == 0) &&
(status = FUN_0800e8c0(GLOBAL_SYSTEM_STATUS_FLAG), status != 0)) {
initializeSensorDataStructures(GLOBAL_SYSTEM_STATUS_DATA);
FUN_0800e8d8(GLOBAL_SYSTEM_STATUS_FLAG);
}
return GLOBAL_SYSTEM_STATUS_DATA;
}
void updateMidiEffectStatus(int param_1,int param_2)
{
*(undefined1 *)(param_1 + param_2 * 0x14) = 0;
return;
}
undefined1 checkControlEventStatus(int param_1,int param_2)
{
return *(undefined1 *)(param_1 + param_2 * 0x14);
}
// Returns the timestamp from a control event record for a given index.
undefined4 getControlEventTimestamp(int controlEventBase,int eventIndex)
{
return *(undefined4 *)(controlEventBase + eventIndex * 0x14 + 4);
}
// Maps an input control event code to a standardized output code.
undefined4 mapControlEventCode(undefined4 param_1,int eventCode)
{
if (eventCode == 1) {
return 1;
}
if (eventCode != 3) {
return 2;
}
return 0;
}
// Registers a control event by marking it active, storing the current time, and saving event
// parameters.
void registerControlEvent
(int controlEventBase,int eventIndex,undefined1 eventData,undefined4 eventCode,
undefined1 extraParam)
{
undefined1 standardizedOutputCode;
undefined4 time;
int eventRecordAddr;
eventRecordAddr = controlEventBase + eventIndex * 0x14;
*(undefined1 *)(controlEventBase + eventIndex * 0x14) = 1;
time = getCurrentTime();
*(undefined4 *)(eventRecordAddr + 4) = time;
*(undefined1 *)(eventRecordAddr + 8) = eventData;
*(char *)(eventRecordAddr + 0x10) = (char)eventCode;
standardizedOutputCode = mapControlEventCode(controlEventBase,eventCode);
*(undefined1 *)(eventRecordAddr + 0x11) = standardizedOutputCode;
*(undefined1 *)(eventRecordAddr + 0x12) = extraParam;
return;
}
// Computes the address of a control event record based on an index.
int getControlEventBufferAddress(int controlBase,int eventIndex)
{
return controlBase + eventIndex * 0x3c + 0xa5c;
}
// Scans control event records for an available (free) index; returns 0xff if none available.
uint findNextAvailableControlEventIndex(int controlBase)
{
uint index;
index = 0;
while( true ) {
if (0 < (int)index) {
index = 0;
while( true ) {
if (0 < (int)index) {
return 0xff;
}
if (*(char *)(controlBase + index * 0x3c + 0xa79) == '\0') break;
index = index + 1;
}
return index & 0xff;
}
if ((*(char *)(controlBase + index * 0x3c + 0xa78) != '\0') &&
(*(char *)(controlBase + index * 0x3c + 0xa79) == '\0')) break;
index = index + 1;
}
return index & 0xff;
}
void FUN_08009440(int param_1,int param_2)
{
ushort uVar1;
int iVar2;
int iVar3;
iVar2 = 0;
while( true ) {
if (0 < iVar2) {
return;
}
if (*(char *)(param_1 + iVar2 * 0x3c + 0xa78) != '\0') break;
iVar2 = iVar2 + 1;
}
do {
for (iVar3 = 0; iVar3 < 4; iVar3 = iVar3 + 1) {
*(undefined4 *)
(*(int *)(param_1 + (iVar2 * 0xf + iVar3 + 0x296) * 4 + 8) +
(uint)*(ushort *)(param_1 + iVar2 * 0x3c + 0xa70) * 4) = *(undefined4 *)(param_2 + iVar3 * 4)
;
}
iVar3 = param_1 + iVar2 * 0x3c;
uVar1 = *(short *)(iVar3 + 0xa70) + 1;
*(ushort *)(iVar3 + 0xa70) = uVar1;
if (0x40 < uVar1) {
*(undefined2 *)(iVar3 + 0xa70) = 0;
*(undefined1 *)(iVar3 + 0xa78) = 0;
*(undefined1 *)(iVar3 + 0xa79) = 1;
}
do {
iVar2 = iVar2 + 1;
if (0 < iVar2) {
return;
}
} while (*(char *)(param_1 + iVar2 * 0x3c + 0xa78) == '\0');
} while( true );
}
undefined4
FUN_080094e0(undefined4 param_1,int param_2,undefined4 param_3,int param_4,undefined4 param_5)
{
undefined4 uVar1;
uint uVar2;
*(undefined4 *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xa98) = param_1;
*(undefined4 *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xa9c) = param_3;
*(undefined1 *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xaa0) =
*(undefined1 *)(param_4 + 0x1e);
uVar1 = getCurrentTime();
*(undefined4 *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xaa4) = uVar1;
*(undefined2 *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xaac) = 0;
*(undefined2 *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xaae) = 0;
*(undefined2 *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xab0) = 0;
*(undefined4 *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xaa8) = 0;
*(undefined4 *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xab4) = 0;
*(int *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xab8) = param_4;
*(undefined1 *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xabc) = 0;
*(undefined4 *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xac0) = 0;
*(undefined1 *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xac4) = 0;
*(undefined4 *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xac8) = 0;
*(undefined4 *)(param_2 + *(int *)(param_2 + 0xcc0) * 0x38 + 0xacc) = 0;
*(int *)(param_2 + 0xcc0) = *(int *)(param_2 + 0xcc0) + 1;
uVar2 = *(uint *)(param_2 + 0xcc0);
if (5 < uVar2) {
*(undefined4 *)(param_2 + 0xcc0) = 0;
}
setSensorControlFlag(param_2,1,0,uVar2,param_5);
return 1;
}
undefined4 * readSensorChannel(undefined4 *param_1,undefined4 param_2,int param_3,int param_4)
{
undefined4 local_10;
undefined4 local_c;
local_c = 0;
local_10 = 0;
FUN_0800d1e4(*(undefined4 *)(param_3 + param_4 * 4 + 4),0x40,&local_c,&local_10);
*param_1 = local_c;
param_1[1] = local_10;
return param_1;
}
float getBaseSensorReading(undefined4 param_1,int param_2,int param_3)
{
int iVar1;
float fVar2;
fVar2 = DAT_08009668;
for (iVar1 = 0; iVar1 < 0x40; iVar1 = iVar1 + 1) {
fVar2 = fVar2 + *(float *)(*(int *)(param_2 + param_3 * 4 + 4) + iVar1 * 4);
}
return fVar2 * DAT_0800966c;
}
void FUN_08009670(int param_1,undefined1 param_2)
{
*(undefined1 *)(param_1 + 0xcdc) = param_2;
return;
}
undefined1 FUN_08009676(int param_1)
{
return *(undefined1 *)(param_1 + 0xcdc);
}
void applySensorCalibrationCorrection
(int sensorCalibPtr,undefined4 correction0,undefined4 correction1,
undefined4 correction2,undefined4 correction3,undefined4 correction4,
undefined4 correction5)
{
*(undefined4 *)(sensorCalibPtr + 0xc90) = correction0;
*(undefined4 *)(sensorCalibPtr + 0xc94) = correction1;
*(undefined4 *)(sensorCalibPtr + 0xc98) = correction2;
*(undefined4 *)(sensorCalibPtr + 0xc9c) = correction3;
*(undefined4 *)(sensorCalibPtr + 0xca0) = correction4;
*(undefined4 *)(sensorCalibPtr + 0xca4) = correction5;
return;
}
undefined4 * loadCalibrationValues(undefined4 *param_1,int param_2)
{
undefined4 uVar1;
undefined4 uVar2;
undefined4 uVar3;
uVar1 = *(undefined4 *)(param_2 + 0xc94);
uVar2 = *(undefined4 *)(param_2 + 0xc98);
uVar3 = *(undefined4 *)(param_2 + 0xc9c);
*param_1 = *(undefined4 *)(param_2 + 0xc90);
param_1[1] = uVar1;
param_1[2] = uVar2;
param_1[3] = uVar3;
uVar1 = *(undefined4 *)(param_2 + 0xca4);
param_1[4] = *(undefined4 *)(param_2 + 0xca0);
param_1[5] = uVar1;
return param_1;
}
void scheduleControlEvent(int param_1,int param_2,undefined4 param_3)
{
*(undefined4 *)(param_1 + param_2 * 0x14 + 0xc) = param_3;
return;
}
undefined4 * prepareControlDataBuffer(undefined4 *param_1,int param_2,int param_3)
{
undefined4 uVar1;
undefined4 uVar2;
undefined4 uVar3;
undefined4 *puVar4;
puVar4 = (undefined4 *)(param_2 + param_3 * 0x14);
uVar1 = puVar4[1];
uVar2 = puVar4[2];
uVar3 = puVar4[3];
*param_1 = *puVar4;
param_1[1] = uVar1;
param_1[2] = uVar2;
param_1[3] = uVar3;
param_1[4] = puVar4[4];
return param_1;
}
// WARNING: Globals starting with '_' overlap smaller symbols at the same address
void processSpecialSensorEvent(void)
{
code *pcVar1;
_DAT_40023840 = _DAT_40023840 | 0x10000000;
ADC_StartConversion();
_DAT_42470e3c = 1;
_DAT_40002854 = 0xdeadbeef;
FUN_08005782(DAT_08009744);
FUN_08002f6c(300);
disableIRQinterrupts();
lockSystemAndHalt();
software_bkpt(0xef);
// WARNING: Does not return
pcVar1 = (code *)software_udf(0xad,0x8009742);
(*pcVar1)();
}
undefined1 isControlEventActive(int param_1)
{
return *(undefined1 *)(param_1 + 0xcac);
}
void FUN_08009756(void)
{
return;
}
float computeSensorExpressionValue
(undefined4 param_1,undefined4 sensorRecord,undefined4 targetCurveId)
{
int sensorCurveIndex;
undefined4 sensorChannelConfig;
float baseSensorReading;
float coeffB;
float coeffC;
float scaledReading;
float channelMidReading [2];
undefined4 channelLowRaw [2];
float channelHighReading [2];
// Get the sensor curve index for the target curve.
sensorCurveIndex = computeSensorCurveIndex(GLOBAL_SENSOR_CURVE_TABLE,targetCurveId);
// Get the sensor channel configuration from a global pointer.
sensorChannelConfig = *GLOBAL_SENSOR_CHANNEL_CONFIG;
// Read sensor channel values:
// Channel index 2 (assumed "high" reading)
readSensorChannel(channelHighReading,sensorChannelConfig,sensorRecord,2);
// Channel index 0 (assumed "low" reading)
readSensorChannel(channelLowRaw,sensorChannelConfig,sensorRecord,0);
// Channel index 1 (assumed "mid" reading)
readSensorChannel(channelMidReading,sensorChannelConfig,sensorRecord,1);
// Get a base sensor reading (e.g. a primary measurement) from a helper
// function.
baseSensorReading = (float)getBaseSensorReading(sensorChannelConfig,sensorRecord,0);
// Scale the base reading by two global scaling factors.
scaledReading = baseSensorReading * SENSOR_EXPRESSION_SCALE1 * SENSOR_EXPRESSION_SCALE2;
// Get coefficients from global fixed‐point values converted to float.
baseSensorReading = (float)convertFixedPointToFloat(SENSOR_EXPR_COEFF_A);
coeffB = (float)convertFixedPointToFloat(SENSOR_EXPR_COEFF_B);
coeffC = (float)convertFixedPointToFloat(SENSOR_EXPR_COEFF_C);
// Combine the scaled reading with the low channel reading.
scaledReading = (float)combineSensorValues(scaledReading,channelLowRaw[0]);
// Compute expression value based on sensor curve index.
if ((sensorCurveIndex - 2U & 0xff) < 2) {
// For curve index 2 or 3:
baseSensorReading = channelHighReading[0] * baseSensorReading + coeffB * scaledReading;
if (sensorCurveIndex == 3) {
baseSensorReading = baseSensorReading * SENSOR_EXPR_MULTIPLIER;
}
}
else {
// For curve index 1:
if (sensorCurveIndex == 1) {
baseSensorReading = (channelMidReading[0] + scaledReading + channelHighReading[0]) * coeffC;
}
else {
// Default expression value.
baseSensorReading = SENSOR_EXPR_DEFAULT;
if ((sensorCurveIndex - 4U & 0xff) < 2) {
baseSensorReading = (channelHighReading[0] + channelMidReading[0] + scaledReading) * coeffC;
}
}
}
// Get a limit or reference value.
sensorChannelConfig = convertFixedPointToFloat(SENSOR_EXPR_LIMIT);
baseSensorReading = (float)normalizeSensorExpressionValue(baseSensorReading,sensorChannelConfig);
// Final adjustment: if the expression value is 1.0 (or less than 1.0) then,
// if it's negative, use the default expression value; otherwise, clamp to 1.0.
if (baseSensorReading == 1.0 || baseSensorReading < 1.0 != NAN(baseSensorReading)) {
if ((int)((uint)(baseSensorReading < 0.0) << 0x1f) < 0) {
baseSensorReading = SENSOR_EXPR_DEFAULT;
}
}
else {
baseSensorReading = 1.0;
}
return baseSensorReading;
}
int FUN_080098a8(int param_1)
{
int iVar1;
iVar1 = FUN_0800d3f4(param_1 + 0x10,0x40);
if (iVar1 == 0) {
FUN_0800dd80(param_1 + 0x28,0x40,2,DAT_08009910,DAT_0800990c,0x40);
}
return param_1;
}
void FUN_0800991c(void)
{
undefined4 *puVar1;
undefined4 uVar2;
puVar1 = DAT_08009944;
uVar2 = FUN_08005424(*DAT_08009944,0);
*DAT_08009948 = uVar2;
uVar2 = FUN_08005440(*puVar1,0);
*DAT_0800994c = uVar2;
uVar2 = FUN_08008600();
*DAT_08009950 = uVar2;
return;
}
undefined4 FUN_08009954(undefined4 param_1)
{
char cVar1;
cVar1 = FUN_0800548c(DAT_08009980,DAT_0800997c,0);
if (cVar1 != '\0') {
FUN_080037a2(DAT_08009988,DAT_08009984,0x32,0xffffffff);
}
return param_1;
}
// WARNING: Heritage AFTER dead removal. Example location: s1 : 0x08009c26
// WARNING: Restarted to delay deadcode elimination for space: register
void FUN_08009990(void)
{
byte bVar1;
int iVar2;
int iVar3;
int iVar4;
int iVar5;
undefined4 uVar6;
uint uVar7;
undefined4 uVar8;
undefined4 uVar9;
uint uVar10;
uint uVar11;
undefined4 *puVar12;
undefined4 *puVar13;
undefined4 uVar14;
float *pfVar15;
byte bVar16;
byte bVar17;
uint in_fpscr;
uint uVar18;
float extraout_s0;
undefined8 in_d0;
float fVar19;
float fVar20;
float fVar21;
float fVar22;
float fVar23;
float fVar24;
float fVar25;
undefined8 uVar26;
undefined8 uVar27;
float local_a8;
float local_a4 [25];
uVar14 = *DAT_08009cc8;
iVar2 = getSensorDataBufferBase(uVar14);
puVar13 = DAT_08009ccc;
puVar12 = (undefined4 *)*DAT_08009cd0;
uVar6 = puVar12[1];
uVar8 = puVar12[2];
uVar9 = puVar12[3];
*DAT_08009ccc = *puVar12;
puVar13[1] = uVar6;
puVar13[2] = uVar8;
puVar13[3] = uVar9;
uVar6 = puVar12[5];
uVar8 = puVar12[6];
puVar13[4] = puVar12[4];
puVar13[5] = uVar6;
puVar13[6] = uVar8;
puVar13 = DAT_08009cd8;
puVar12 = (undefined4 *)*DAT_08009cd4;
uVar6 = puVar12[1];
uVar8 = puVar12[2];
uVar9 = puVar12[3];
*DAT_08009cd8 = *puVar12;
puVar13[1] = uVar6;
puVar13[2] = uVar8;
puVar13[3] = uVar9;
uVar6 = puVar12[5];
uVar8 = puVar12[6];
puVar13[4] = puVar12[4];
puVar13[5] = uVar6;
puVar13[6] = uVar8;
uVar6 = puVar12[8];
uVar8 = puVar12[9];
uVar9 = puVar12[10];
puVar13[7] = puVar12[7];
puVar13[8] = uVar6;
puVar13[9] = uVar8;
puVar13[10] = uVar9;
uVar6 = puVar12[0xc];
uVar8 = puVar12[0xd];
puVar13[0xb] = puVar12[0xb];
puVar13[0xc] = uVar6;
puVar13[0xd] = uVar8;
iVar3 = lookupSensorFlag(DAT_08009cdc);
if ((iVar3 == 1) && (iVar3 = lookupSensorFlag(DAT_08009ce0), iVar3 == 4)) {
notifySensorEvent(*DAT_08009ce4,0x24,0,0);
}
uVar11 = 0;
do {
if (5 < uVar11) {
iVar3 = lookupSensorFlag(DAT_08009db4);
if ((iVar3 == 1) && (iVar3 = lookupSensorFlag(DAT_08009dd0), iVar3 == 4)) {
notifySensorEvent(*DAT_08009dd4,0x25,0,0);
}
*(undefined4 *)(DAT_08009db8 + 4) = DAT_08009dbc;
iVar3 = DAT_08009dc0;
*(int *)(DAT_08009dc0 + 4) = DAT_08009dc4;
*(undefined4 *)(iVar3 + 0x20) = DAT_08009dc8;
iVar3 = FUN_0800551a(*DAT_08009dcc);
if (iVar3 == 1) {
for (iVar3 = 0; iVar3 < 6; iVar3 = iVar3 + 1) {
fVar21 = *(float *)(DAT_08009dc4 + iVar3 * 4);
convertFixedPointToFloat(DAT_08009ddc);
extraout_s0 = (float)in_d0;
in_fpscr = in_fpscr & 0xfffffff | (uint)(extraout_s0 < fVar21) << 0x1f |
(uint)(extraout_s0 == fVar21) << 0x1e | (uint)(fVar21 <= extraout_s0) << 0x1d;
if ((((int)in_fpscr < 0) &&
(iVar4 = iVar2 + iVar3 * 0x38, *(char *)(iVar4 + 0x2c) == '\0')) &&
(iVar5 = getCurrentTime(), (uint)(iVar5 - *(int *)(iVar4 + 0xc)) < 10)) {
*(float *)(iVar4 + 0x28) = fVar21;
*(undefined1 *)(iVar4 + 0x24) = 1;
*(undefined1 *)(iVar4 + 0x2c) = 1;
sendMidiCommand(DAT_08009dc8,*(undefined4 *)(*(int *)(iVar4 + 0x20) + 0x38),0x12);
}
}
}
else {
uVar11 = FUN_080053fc(*DAT_08009dcc);
updateMidiBuffer(local_a4,DAT_08009dd8,uVar11 & 0xff,uVar11 >> 8);
}
return;
}
puVar13 = (undefined4 *)(iVar2 + uVar11 * 0x38);
iVar3 = puVar13[8];
if (iVar3 != 0) {
fVar21 = (float)puVar13[0xc];
uVar18 = in_fpscr & 0xfffffff | (uint)(fVar21 == 0.0) << 0x1e;
fVar23 = DAT_08009cec;
fVar24 = DAT_08009cec;
if ((byte)(uVar18 >> 0x1e) == 0) {
fVar22 = (float)puVar13[0xd];
uVar18 = in_fpscr & 0xfffffff | (uint)(fVar22 == 0.0) << 0x1e;
if ((byte)(uVar18 >> 0x1e) != 0) {
uVar7 = 0;
fVar21 = DAT_08009cec;
fVar22 = DAT_08009cec;
goto LAB_08009a42;
}
}
else {
uVar7 = 0;
fVar21 = DAT_08009cec;
fVar22 = DAT_08009cec;
LAB_08009a42:
for (; uVar7 < 3; uVar7 = uVar7 + 1) {
if (uVar7 == 2) {
for (uVar10 = 0; uVar10 < 0x20; uVar10 = uVar10 + 1) {
fVar19 = *(float *)(*(int *)(iVar3 + 0x2c) + uVar10 * 4);
fVar20 = (float)VectorUnsignedToFloat(uVar10,(byte)(uVar18 >> 0x15) & 3);
fVar21 = fVar21 + fVar19 * fVar20 * DAT_08009ce8;
fVar24 = fVar24 + fVar19;
}
}
else if (uVar7 == 1) {
for (uVar10 = 0; uVar10 < 0x20; uVar10 = uVar10 + 1) {
fVar19 = *(float *)(*(int *)(iVar3 + 0x28) + uVar10 * 4);
fVar20 = (float)VectorUnsignedToFloat(uVar10,(byte)(uVar18 >> 0x15) & 3);
fVar22 = fVar22 + fVar19 * fVar20 * DAT_08009ce8;
fVar23 = fVar23 + fVar19;
}
}
}
if (fVar24 != 0.0 && fVar24 < 0.0 == NAN(fVar24)) {
fVar21 = fVar21 / fVar24;
}
uVar7 = uVar18 & 0xfffffff | (uint)(fVar23 < 0.0) << 0x1f | (uint)(fVar23 == 0.0) << 0x1e;
uVar18 = uVar7 | (uint)NAN(fVar23) << 0x1c;
bVar1 = (byte)(uVar7 >> 0x18);
if (!(bool)(bVar1 >> 6 & 1) && bVar1 >> 7 == ((byte)(uVar18 >> 0x1c) & 1)) {
fVar22 = fVar22 / fVar23;
}
local_a8 = 0.0;
local_a4[0] = 0.0;
for (uVar7 = 0; uVar7 < 4; uVar7 = uVar7 + 1) {
if (uVar7 - 1 < 2) {
if (uVar7 == 2) {
pfVar15 = &local_a8;
fVar19 = fVar24;
fVar20 = fVar21;
}
else {
pfVar15 = local_a4;
fVar19 = fVar23;
fVar20 = fVar22;
}
for (uVar10 = 0; uVar10 < 0x20; uVar10 = uVar10 + 1) {
fVar25 = (float)VectorUnsignedToFloat(uVar10,(byte)(uVar18 >> 0x15) & 3);
fVar25 = fVar25 * DAT_08009ce8;
uVar26 = FUN_08000568(*(undefined4 *)
(*(int *)(puVar13[8] + (uVar7 + 8) * 4 + 4) + uVar10 * 4));
uVar6 = FUN_08000568(fVar25 - fVar20);
in_d0 = FUN_0800ea90(uVar6,(int)((ulonglong)in_d0 >> 0x20),(int)DAT_08009cc0);
uVar26 = FUN_08000618((int)uVar26,(int)((ulonglong)uVar26 >> 0x20),(int)in_d0,
(int)((ulonglong)in_d0 >> 0x20));
uVar27 = FUN_08000568(*pfVar15);
fp_multiply((int)uVar27,(int)((ulonglong)uVar27 >> 0x20),(int)uVar26,
(int)((ulonglong)uVar26 >> 0x20));
fVar25 = (float)FUN_08000c08();
*pfVar15 = fVar25;
}
uVar10 = uVar18 & 0xfffffff | (uint)(fVar19 < 0.0) << 0x1f |
(uint)(fVar19 == 0.0) << 0x1e;
uVar18 = uVar10 | (uint)NAN(fVar19) << 0x1c;
bVar1 = (byte)(uVar10 >> 0x18);
if (!(bool)(bVar1 >> 6 & 1) && bVar1 >> 7 == ((byte)(uVar18 >> 0x1c) & 1)) {
FUN_0800ea48(*pfVar15 / fVar19);
*pfVar15 = (float)in_d0;
}
}
}
puVar13[0xc] = fVar21;
puVar13[0xd] = fVar22;
}
iVar4 = getSensorMessageCounter(uVar14);
iVar3 = DAT_08009cf4;
fVar23 = (float)VectorUnsignedToFloat(iVar4 - puVar13[1],(byte)(uVar18 >> 0x15) & 3);
fVar23 = fVar23 / DAT_08009cf0;
uVar6 = *puVar13;
if (fVar23 != 1.0 && fVar23 < 1.0 == NAN(fVar23)) {
fVar23 = 1.0;
}
fVar23 = 1.0 - (1.0 - fVar23);
uVar18 = uVar18 & 0xfffffff | (uint)(fVar23 < 1.0) << 0x1f | (uint)(fVar23 == 1.0) << 0x1e;
in_fpscr = uVar18 | (uint)NAN(fVar23) << 0x1c;
bVar1 = (byte)(uVar18 >> 0x18);
bVar16 = bVar1 >> 7;
bVar17 = (byte)(in_fpscr >> 0x1c) & 1;
if ((bool)(bVar1 >> 6 & 1) || bVar16 != bVar17) {
if (bVar16 == bVar17) {
fVar23 = 1.0;
}
}
else {
fVar23 = 1.0;
}
*(float *)(DAT_08009cf4 + uVar11 * 4) = fVar23;
*(undefined4 *)(iVar3 + (uVar11 + 6) * 4) = uVar6;
*(float *)(iVar3 + (uVar11 + 0xc) * 4) = fVar21;
*(float *)(iVar3 + (uVar11 + 0x12) * 4) = fVar22;
iVar3 = lookupSensorFlag(DAT_08009cdc);
if ((iVar3 == 1) &&
(iVar3 = lookupSensorFlag(DAT_08009ce0), puVar13 = DAT_08009ce4, iVar3 == 4)) {
notifySensorEvent(*DAT_08009ce4,6,1,0);
notifySensorEvent(*puVar13,6,1,0);
notifySensorEvent(*puVar13,6,1,0);
notifySensorEvent(*puVar13,6,1,0);
}
}
uVar11 = uVar11 + 1;
} while( true );
}
void entry(void)
{
int iVar1;
uint uVar2;
int iVar3;
undefined4 *puVar4;
undefined4 *puVar5;
int iVar6;
code *UNRECOVERED_JUMPTABLE;
FUN_080034bc();
iVar3 = DAT_08009e2c;
uVar2 = DAT_08009e28;
iVar1 = DAT_08009e24;
for (iVar6 = 0; puVar4 = DAT_08009e34, puVar5 = DAT_08009e30, (uint)(iVar1 + iVar6) < uVar2;
iVar6 = iVar6 + 4) {
*(undefined4 *)(iVar1 + iVar6) = *(undefined4 *)(iVar3 + iVar6);
}
for (; puVar5 < puVar4; puVar5 = puVar5 + 1) {
*puVar5 = 0;
}
FUN_0801256c();
UNRECOVERED_JUMPTABLE = (code *)0x8009e1e;
DrumProcessor_Run();
// WARNING: Could not recover jumptable at 0x08009e1e. Too many branches
// WARNING: Treating indirect jump as call
(*UNRECOVERED_JUMPTABLE)();
return;
}
uint FUN_08009e3c(uint *param_1,int param_2)
{
int iVar1;
uint uVar2;
uint uVar3;
uint uVar4;
uint uVar5;
if (param_1 == (uint *)0x0) {
return 0;
}
if (((*param_1 & 0x17fffff) == DAT_08009ea0) && (param_2 != 0)) {
uVar5 = param_1[6];
uVar3 = *(int *)(uVar5 + 4) + 0x1fU & 0xffffffe0;
}
else {
uVar5 = param_1[6];
uVar3 = *(uint *)(uVar5 + 4);
}
uVar4 = (uint)((char)param_1[5] == '\x01');
uVar2 = param_1[5] >> 8;
if (uVar4 < param_1[5] >> 8) {
do {
if (uVar4 == 1) {
if (uVar2 == 2) break;
uVar4 = 2;
}
iVar1 = uVar4 * 4;
uVar4 = uVar4 + 1;
uVar3 = *(int *)(uVar5 + iVar1) * uVar3;
} while (uVar2 != uVar4);
}
return uVar3 & ~((int)uVar3 >> 0x1f);
}
uint FUN_08009ea4(uint param_1)
{
uint uVar1;
if (param_1 != 0) {
if (*(int *)(param_1 + 4) != 0) {
uVar1 = (uint)*(ushort *)(param_1 + 2);
if (uVar1 != 0) {
uVar1 = 1;
}
return uVar1;
}
param_1 = 0;
}
return param_1;
}
int FUN_08009eb8(int param_1,int param_2,undefined4 param_3)
{
int *piVar1;
if (param_1 != 0) {
piVar1 = (int *)(param_1 + 4);
if (*piVar1 == 0) {
return 0;
}
if (*(short *)(param_1 + 2) == 0) {
return 0;
}
param_1 = 1;
*(undefined4 *)(*piVar1 + param_2 * 0x1c + 4) = param_3;
}
return param_1;
}
bool FUN_08009ed8(undefined4 *param_1,uint param_2,int *param_3)
{
int *piVar1;
int *piVar2;
int iVar3;
uint uVar4;
int *piVar5;
int iVar6;
uint uVar7;
if (param_3 == (int *)0x0) {
return false;
}
if ((param_1 != (undefined4 *)0x0) && (param_2 != 0)) {
if (*param_3 == DAT_08009f7c) {
iVar6 = FUN_08009ea4(param_3 + 1);
if ((iVar6 != 0) && (param_2 == *(ushort *)((int)param_3 + 6))) {
iVar6 = 0;
piVar5 = param_1 + -1;
uVar7 = 0;
do {
iVar3 = param_3[2] + iVar6;
iVar6 = iVar6 + 0x1c;
iVar3 = *(int *)(iVar3 + 4);
if (iVar3 == 0) break;
uVar7 = uVar7 + 1;
piVar5 = piVar5 + 1;
*piVar5 = iVar3;
} while (param_2 != uVar7);
return param_2 == uVar7;
}
}
else {
piVar5 = (int *)param_3[1];
if (piVar5 != (int *)0x0) {
iVar6 = *piVar5;
if (iVar6 != DAT_08009f7c) {
*param_1 = piVar5;
return param_2 == 1;
}
piVar1 = param_1 + -1;
piVar2 = piVar5;
uVar7 = 0;
do {
uVar4 = uVar7;
piVar2 = piVar2 + 1;
if (*piVar2 == iVar6) {
if (param_2 == uVar4) {
return true;
}
return false;
}
piVar1 = piVar1 + 1;
*piVar1 = *piVar2;
uVar7 = uVar4 + 1;
} while (param_2 != uVar4 + 1);
if (piVar5[uVar4 + 2] == iVar6) {
return true;
}
}
}
}
return false;
}
bool FUN_08009f80(undefined4 *param_1,uint param_2,int *param_3)
{
int *piVar1;
int *piVar2;
int iVar3;
uint uVar4;
int *piVar5;
int iVar6;
uint uVar7;
if (param_3 == (int *)0x0) {
return false;
}
if ((param_1 != (undefined4 *)0x0) && (param_2 != 0)) {
if (*param_3 == DAT_0800a024) {
iVar6 = FUN_08009ea4(param_3 + 3);
if ((iVar6 != 0) && (param_2 == *(ushort *)((int)param_3 + 0xe))) {
iVar6 = 0;
piVar5 = param_1 + -1;
uVar7 = 0;
do {
iVar3 = param_3[4] + iVar6;
iVar6 = iVar6 + 0x1c;
iVar3 = *(int *)(iVar3 + 4);
if (iVar3 == 0) break;
uVar7 = uVar7 + 1;
piVar5 = piVar5 + 1;
*piVar5 = iVar3;
} while (param_2 != uVar7);
return param_2 == uVar7;
}
}
else {
piVar5 = (int *)param_3[8];
if (piVar5 != (int *)0x0) {
iVar6 = *piVar5;
if (iVar6 != DAT_0800a024) {
*param_1 = piVar5;
return param_2 == 1;
}
piVar1 = param_1 + -1;
piVar2 = piVar5;
uVar7 = 0;
do {
uVar4 = uVar7;
piVar2 = piVar2 + 1;
if (*piVar2 == iVar6) {
if (param_2 == uVar4) {
return true;
}
return false;
}
piVar1 = piVar1 + 1;
*piVar1 = *piVar2;
uVar7 = uVar4 + 1;
} while (param_2 != uVar4 + 1);
if (piVar5[uVar4 + 2] == iVar6) {
return true;
}
}
}
}
return false;
}
undefined4 FUN_0800a028(undefined4 *param_1,undefined4 *param_2,undefined4 *param_3)
{
undefined4 uVar1;
if (param_1 == (undefined4 *)0x0) {
return 0;
}
if (param_2 != (undefined4 *)0x0) {
if (param_3 != (undefined4 *)0x0) {
*param_1 = DAT_0800a068;
uVar1 = param_2[1];
param_1[1] = *param_2;
param_1[2] = uVar1;
uVar1 = param_3[1];
param_1[3] = *param_3;
param_1[4] = uVar1;
return 1;
}
return 0;
}
return 0;
}
uint FUN_0800a06c(uint *param_1)
{
uint uVar1;
if ((DAT_0800a080 & ~*param_1) == 0) {
uVar1 = param_1[3];
param_1[3] = 0;
return uVar1;
}
return 0x1010;
}
void FUN_0800a084(int param_1)
{
if (param_1 != 0) {
FUN_0800a974(param_1 + 0xc);
return;
}
return;
}
undefined4 FUN_0800a090(uint *param_1,undefined2 *param_2)
{
undefined4 uVar1;
int iVar2;
undefined2 uVar3;
uint uVar4;
int iVar5;
int iVar6;
undefined4 *puVar7;
uint uVar8;
undefined4 uVar9;
int *piVar10;
int iVar11;
int iVar12;
ushort *puVar13;
int iVar14;
undefined4 uVar15;
if ((DAT_0800a178 & ~*param_1) != 0) {
return 0;
}
if (((short)param_1[0xc] != 0) && (puVar13 = (ushort *)param_1[0xd], puVar13 != (ushort *)0x0)) {
iVar14 = 0;
uVar8 = 0;
while( true ) {
uVar3 = (undefined2)uVar8;
if (*puVar13 <= uVar8) break;
if ((*(int *)(puVar13 + 2) == 0) ||
(piVar10 = *(int **)(*(int *)(puVar13 + 2) + uVar8 * 4), piVar10 == (int *)0x0)) break;
iVar12 = piVar10[3];
iVar6 = *(int *)(*(int *)(puVar13 + 4) + 4);
iVar11 = *(int *)(*(int *)(puVar13 + 4) + 8);
uVar4 = piVar10[2];
uVar1 = FUN_0800cef0(*(undefined4 *)piVar10[6]);
iVar2 = piVar10[6];
iVar5 = iVar11 + uVar8 * 8;
uVar15 = *(undefined4 *)(iVar2 + 8);
puVar7 = (undefined4 *)(iVar6 + iVar14);
if (iVar5 != 0) {
*(undefined4 *)(iVar11 + uVar8 * 8) = 0;
iVar2 = *piVar10;
*(int *)(iVar5 + 4) = iVar2;
if ((iVar2 == 0) || (*(short *)(iVar2 + 2) == 0)) {
iVar2 = piVar10[6];
iVar5 = 0;
}
else {
*(undefined4 *)(iVar11 + uVar8 * 8) = 1;
iVar2 = piVar10[6];
}
}
uVar9 = *(undefined4 *)(iVar2 + 4);
puVar7[2] = iVar5;
*(undefined1 *)(puVar7 + 5) = 1;
*puVar7 = uVar1;
puVar7[3] = 0;
puVar7[4] = uVar9;
puVar7[5] = puVar7[5] & 0xff | uVar4 & 0xffffff00;
puVar7[6] = iVar12;
puVar7[1] = uVar15;
uVar8 = uVar8 + 1;
iVar14 = iVar14 + 0x1c;
}
if ((uVar8 & 0xffff) != 0) {
uVar1 = *(undefined4 *)(*(int *)(puVar13 + 4) + 4);
goto LAB_0800a158;
}
}
FUN_0800a974(param_1 + 3,0x11,0x18);
uVar3 = 0;
uVar1 = 0;
LAB_0800a158:
if (param_2 != (undefined2 *)0x0) {
*param_2 = uVar3;
}
return uVar1;
}
undefined4 FUN_0800a17c(uint *param_1,undefined2 *param_2)
{
undefined4 uVar1;
undefined2 uVar2;
int iVar3;
uint uVar4;
int iVar5;
int iVar6;
int iVar7;
undefined4 *puVar8;
uint uVar9;
undefined4 uVar10;
int *piVar11;
int iVar12;
uint uVar13;
int iVar14;
undefined4 uVar15;
if ((DAT_0800a260 & ~*param_1) != 0) {
return 0;
}
if (1 < (ushort)param_1[0xc]) {
iVar14 = 0;
uVar13 = param_1[0xd];
uVar9 = 0;
while( true ) {
uVar2 = (undefined2)uVar9;
if (*(ushort *)(uVar13 + 0xc) <= uVar9) break;
if ((*(int *)(uVar13 + 0x10) == 0) ||
(piVar11 = *(int **)(*(int *)(uVar13 + 0x10) + uVar9 * 4), piVar11 == (int *)0x0)) break;
iVar7 = *(int *)(*(int *)(uVar13 + 0x14) + 4);
iVar12 = *(int *)(*(int *)(uVar13 + 0x14) + 8);
uVar4 = piVar11[2];
iVar5 = piVar11[3];
uVar1 = FUN_0800cef0(*(undefined4 *)piVar11[6]);
iVar3 = piVar11[6];
iVar6 = iVar12 + uVar9 * 8;
uVar15 = *(undefined4 *)(iVar3 + 8);
puVar8 = (undefined4 *)(iVar7 + iVar14);
if (iVar6 != 0) {
*(undefined4 *)(iVar12 + uVar9 * 8) = 0;
iVar3 = *piVar11;
*(int *)(iVar6 + 4) = iVar3;
if ((iVar3 == 0) || (*(short *)(iVar3 + 2) == 0)) {
iVar3 = piVar11[6];
iVar6 = 0;
}
else {
*(undefined4 *)(iVar12 + uVar9 * 8) = 1;
iVar3 = piVar11[6];
}
}
uVar10 = *(undefined4 *)(iVar3 + 4);
*puVar8 = uVar1;
*(undefined1 *)(puVar8 + 5) = 1;
puVar8[1] = uVar15;
puVar8[4] = uVar10;
puVar8[5] = puVar8[5] & 0xff | uVar4 & 0xffffff00;
puVar8[2] = iVar6;
puVar8[3] = 0;
puVar8[6] = iVar5;
uVar9 = uVar9 + 1;
iVar14 = iVar14 + 0x1c;
}
if ((uVar9 & 0xffff) != 0) {
uVar1 = *(undefined4 *)(*(int *)(uVar13 + 0x14) + 4);
goto LAB_0800a23e;
}
}
FUN_0800a974(param_1 + 3,0x11,0x18);
uVar2 = 0;
uVar1 = 0;
LAB_0800a23e:
if (param_2 != (undefined2 *)0x0) {
*param_2 = uVar2;
}
return uVar1;
}
uint FUN_0800a264(int *param_1,undefined4 param_2,int param_3,undefined4 param_4,undefined1 param_5,
undefined1 param_6)
{
int iVar1;
undefined4 uVar2;
int iVar3;
uint uVar4;
uint uVar5;
undefined4 local_24 [2];
if (param_1 == (int *)0x0) {
return 0x1010;
}
*param_1 = param_3;
iVar1 = FUN_0800a964();
if (iVar1 == 0) {
uVar5 = 0x30;
}
else {
iVar1 = FUN_0800d044(param_4,param_5,0);
iVar3 = FUN_0800d044(1,5,0);
if (iVar1 == iVar3) {
local_24[0] = DAT_0800a2e4;
iVar1 = FUN_0800a98c(local_24);
if (iVar1 != 0) {
uVar4 = 0;
uVar5 = uVar4;
goto LAB_0800a28a;
}
uVar5 = 2;
}
else {
uVar5 = 1;
}
}
*param_1 = 0;
uVar4 = 0x10;
LAB_0800a28a:
uVar2 = FUN_0800d044(param_4,param_5,param_6);
*(undefined4 *)(param_3 + 8) = uVar2;
return uVar5 | uVar4 << 8;
}
uint * FUN_0800a2e8(uint *param_1,int *param_2)
{
int *piVar1;
int iVar2;
int iVar3;
undefined4 uVar4;
undefined4 uVar5;
int iVar6;
undefined4 uVar7;
undefined2 uVar8;
int iVar9;
int *piVar10;
uint uVar11;
uint uVar12;
undefined2 uVar13;
int iVar14;
undefined4 *puVar15;
undefined4 *puVar16;
if ((DAT_0800a47c & ~*param_1) != 0) {
return (uint *)0x0;
}
if (param_2 == (int *)0x0) {
FUN_0800a974(param_1 + 3,0x10,0x11);
return (uint *)0x0;
}
iVar6 = *param_2;
if (iVar6 == DAT_0800a480) {
uVar8 = (undefined2)param_2[3];
uVar12 = (uint)*(ushort *)((int)param_2 + 0xe);
piVar10 = (int *)param_2[4];
piVar1 = param_2 + 1;
uVar11 = (uint)*(ushort *)((int)param_2 + 6);
param_2 = (int *)param_2[2];
uVar13 = (short)*piVar1;
if (*param_1 != DAT_0800a47c) goto LAB_0800a322;
}
else {
iVar14 = param_2[1];
iVar2 = FUN_08009e3c(param_2,1);
piVar10 = param_2 + 7;
iVar9 = param_2[8];
iVar3 = FUN_08009e3c(piVar10,1);
if (iVar2 == 0) {
param_2 = (int *)0x0;
}
uVar11 = (uint)(iVar2 != 0);
if (iVar3 == 0) {
piVar10 = (int *)0x0;
uVar12 = 0;
}
else {
if (iVar9 == 0) {
FUN_0800a974(param_1 + 3,0x10,0x13);
return (uint *)0x0;
}
uVar12 = 1;
}
if (iVar14 == 0) {
if (iVar2 != 0) {
FUN_0800a974(param_1 + 3,0x10,0x12);
return (uint *)0x0;
}
}
else {
iVar2 = 0;
}
uVar8 = (undefined2)iVar2;
uVar13 = uVar8;
if (*param_1 != DAT_0800a47c) goto LAB_0800a322;
}
if (*(ushort *)((int)param_1 + 0x22) < uVar11) {
if (iVar6 != DAT_0800a480) {
FUN_0800a974(param_1 + 3,0x16,0x12);
return (uint *)0x0;
}
LAB_0800a388:
param_1[9] = (uint)param_2;
*(short *)((int)param_1 + 0x22) = (short)uVar11;
*(undefined2 *)(param_1 + 8) = uVar13;
param_1[0xb] = (uint)piVar10;
}
else {
if (iVar6 == DAT_0800a480) goto LAB_0800a388;
if (uVar11 != 0) {
iVar6 = 0;
do {
puVar16 = (undefined4 *)((int)param_2 + iVar6);
puVar15 = (undefined4 *)(param_1[9] + iVar6);
uVar4 = puVar16[1];
uVar5 = puVar16[2];
uVar7 = puVar16[3];
*puVar15 = *puVar16;
puVar15[1] = uVar4;
puVar15[2] = uVar5;
puVar15[3] = uVar7;
uVar4 = puVar16[5];
uVar5 = puVar16[6];
iVar6 = iVar6 + 0x1c;
puVar15[4] = puVar16[4];
puVar15[5] = uVar4;
puVar15[6] = uVar5;
} while (uVar11 * 0x1c - iVar6 != 0);
}
*(short *)((int)param_1 + 0x22) = (short)uVar11;
*(undefined2 *)(param_1 + 8) = uVar13;
if (*(ushort *)((int)param_1 + 0x2a) < uVar12) {
FUN_0800a974(param_1 + 3,0x16,0x13);
return (uint *)0x0;
}
if (uVar12 != 0) {
iVar6 = 0;
do {
puVar16 = (undefined4 *)((int)piVar10 + iVar6);
uVar4 = puVar16[1];
uVar5 = puVar16[2];
uVar7 = puVar16[3];
puVar15 = (undefined4 *)(param_1[0xb] + iVar6);
*puVar15 = *puVar16;
puVar15[1] = uVar4;
puVar15[2] = uVar5;
puVar15[3] = uVar7;
uVar4 = puVar16[5];
uVar5 = puVar16[6];
iVar6 = iVar6 + 0x1c;
puVar15[4] = puVar16[4];
puVar15[5] = uVar4;
puVar15[6] = uVar5;
} while (iVar6 != uVar12 * 0x1c);
}
}
*(short *)((int)param_1 + 0x2a) = (short)uVar12;
*(undefined2 *)(param_1 + 10) = uVar8;
FUN_0800a9e0(param_1);
LAB_0800a322:
param_1[4] = 3;
return param_1;
}
undefined4 FUN_0800a484(uint *param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
uint uVar1;
uint uVar2;
uVar1 = *param_1;
if ((DAT_0800a4e0 & ~uVar1) != 0) {
return 0;
}
if ((param_1[4] & 2) == 0) {
FUN_0800a974(param_1 + 3,0x11,0x10,param_1[4],param_4);
return 0;
}
if ((uVar1 == (uVar1 & DAT_0800a4e0)) && (FUN_0800a9fc(), param_1[0x10] != 0)) {
uVar1 = param_1[0xe];
while (uVar1 != 0) {
(*(code *)param_1[0x10])(0,uVar1,param_1[0x11]);
uVar2 = *(uint *)(uVar1 + 0x10);
if (uVar2 == uVar1) {
return 1;
}
uVar1 = uVar2;
if (uVar2 == 0) {
return 1;
}
}
}
return 1;
}
ushort FUN_0800a4e4(uint *param_1,uint *param_2,uint *param_3)
{
uint uVar1;
int iVar2;
int *piVar3;
int iVar4;
uint uVar5;
ushort uVar6;
int iVar7;
uint uVar8;
uint uVar9;
ushort *puVar10;
int iVar11;
int iVar12;
ushort *puVar13;
uint local_34;
if ((DAT_0800a7c0 & ~*param_1) != 0) {
return 0;
}
if ((short)param_1[0xc] == 0) {
param_1[6] = 0;
if ((param_1[4] & 3) != 3) goto LAB_0800a782;
}
else {
puVar13 = (ushort *)param_1[0xd];
uVar9 = 0;
param_1[6] = 0;
if ((param_1[4] & 3) != 3) {
LAB_0800a782:
FUN_0800a974(param_1 + 3,0x11,0x30);
return 0;
}
if (((param_2 != (uint *)0x0) && (puVar13 != (ushort *)0x0)) && (*puVar13 != 0)) {
local_34 = *(uint *)param_2[6];
LAB_0800a536:
do {
if ((*(int *)(puVar13 + 2) == 0) ||
(iVar7 = *(int *)(*(int *)(puVar13 + 2) + uVar9 * 4), iVar7 == 0)) break;
iVar12 = **(int **)(puVar13 + 4);
iVar11 = iVar12 + uVar9 * 0x10;
if (iVar11 == 0) goto LAB_0800a756;
uVar8 = *(uint *)(*(int *)(iVar7 + 0x18) + 4);
uVar1 = FUN_08009e3c(param_2,1);
if (uVar8 < uVar1) {
LAB_0800a798:
FUN_0800a974(param_1 + 3,0x12,0x18);
return 0;
}
iVar2 = *(int *)(iVar7 + 0xc);
uVar1 = param_2[6];
if (((*(int *)(iVar2 + 0xc) != *(int *)(uVar1 + 0xc)) ||
(*(int *)(iVar2 + 8) != *(int *)(uVar1 + 8))) ||
(*(int *)(iVar2 + 4) != *(int *)(uVar1 + 4))) goto LAB_0800a798;
uVar1 = FUN_0800d020(**(undefined4 **)(iVar7 + 0x18),(*(undefined4 **)(iVar7 + 0x18))[1]);
uVar8 = FUN_0800d050(iVar7);
if (uVar1 < uVar8) goto LAB_0800a798;
uVar1 = FUN_0800cef0(**(undefined4 **)(iVar7 + 0x18));
if (((uVar1 ^ *param_2) & 0x1ffffff) != 0) {
FUN_0800a974(param_1 + 3,0x12,0x19);
return 0;
}
if (param_2[1] == 0) goto LAB_0800a756;
uVar1 = *(uint *)param_2[6];
if (uVar1 == 0) {
FUN_0800a974(param_1 + 3,0x12,0x21);
return 0;
}
if (local_34 < uVar1) {
local_34 = uVar1;
}
iVar2 = FUN_0800d050(iVar7);
*(int *)(iVar11 + 8) = iVar2;
iVar4 = *(int *)param_2[6];
*(int *)(iVar11 + 0xc) = iVar2 * iVar4;
uVar1 = param_2[1];
*(uint *)(iVar11 + 4) = uVar1;
*(uint *)(iVar12 + uVar9 * 0x10) = iVar2 * iVar4 + uVar1;
piVar3 = *(int **)(iVar7 + 0x18);
uVar9 = uVar9 + 1;
param_2 = param_2 + 7;
if (*piVar3 << 2 < 0) {
if (*puVar13 <= uVar9) break;
goto LAB_0800a536;
}
piVar3[2] = uVar1 + (piVar3[2] - piVar3[3]);
*(undefined4 *)(*(int *)(iVar7 + 0x18) + 0xc) = *(undefined4 *)(iVar11 + 4);
} while (uVar9 < *puVar13);
uVar6 = (ushort)param_1[0xc];
if (param_3 == (uint *)0x0) {
*(ushort *)(param_1 + 6) = (ushort)local_34;
}
else {
if ((uVar6 < 2) || (uVar9 = param_1[0xd], *(short *)(uVar9 + 0xc) == 0)) {
LAB_0800a7b0:
FUN_0800a974(param_1 + 3,0x13,0x18);
return 0;
}
uVar1 = 0;
LAB_0800a64a:
do {
if ((*(int *)(uVar9 + 0x10) == 0) ||
(iVar7 = *(int *)(*(int *)(uVar9 + 0x10) + uVar1 * 4), iVar7 == 0)) break;
iVar11 = **(int **)(uVar9 + 0x14);
iVar12 = iVar11 + uVar1 * 0x10;
if (iVar12 == 0) {
LAB_0800a930:
FUN_0800a974(param_1 + 3,0x13,0x17);
return 0;
}
uVar5 = *(uint *)(*(int *)(iVar7 + 0x18) + 4);
uVar8 = FUN_08009e3c(param_3,1);
if (uVar5 < uVar8) goto LAB_0800a7b0;
iVar2 = *(int *)(iVar7 + 0xc);
uVar8 = param_3[6];
if (((*(int *)(iVar2 + 0xc) != *(int *)(uVar8 + 0xc)) ||
(*(int *)(iVar2 + 8) != *(int *)(uVar8 + 8))) ||
(*(int *)(iVar2 + 4) != *(int *)(uVar8 + 4))) goto LAB_0800a7b0;
uVar8 = FUN_0800d020(**(undefined4 **)(iVar7 + 0x18),(*(undefined4 **)(iVar7 + 0x18))[1]);
uVar5 = FUN_0800d050(iVar7);
if (uVar8 < uVar5) goto LAB_0800a7b0;
uVar8 = FUN_0800cef0(**(undefined4 **)(iVar7 + 0x18));
if (((uVar8 ^ *param_3) & 0x1ffffff) != 0) {
FUN_0800a974(param_1 + 3,0x13,0x19);
return 0;
}
if (param_3[1] == 0) goto LAB_0800a930;
uVar8 = *(uint *)param_3[6];
if (uVar8 == 0) {
FUN_0800a974(param_1 + 3,0x13,0x21);
return 0;
}
if (local_34 < uVar8) {
local_34 = uVar8;
}
iVar2 = FUN_0800d050(iVar7);
*(int *)(iVar12 + 8) = iVar2;
iVar4 = *(int *)param_3[6];
*(int *)(iVar12 + 0xc) = iVar2 * iVar4;
uVar8 = param_3[1];
*(uint *)(iVar12 + 4) = uVar8;
*(uint *)(iVar11 + uVar1 * 0x10) = iVar2 * iVar4 + uVar8;
piVar3 = *(int **)(iVar7 + 0x18);
uVar1 = uVar1 + 1;
param_3 = param_3 + 7;
if (*piVar3 << 2 < 0) {
if (*(ushort *)(uVar9 + 0xc) <= uVar1) break;
goto LAB_0800a64a;
}
piVar3[2] = uVar8 + (piVar3[2] - piVar3[3]);
*(undefined4 *)(*(int *)(iVar7 + 0x18) + 0xc) = *(undefined4 *)(iVar12 + 4);
} while (uVar1 < *(ushort *)(uVar9 + 0xc));
uVar6 = (ushort)param_1[0xc];
*(ushort *)(param_1 + 6) = (ushort)local_34;
}
if (uVar6 == 0) {
puVar13 = (ushort *)0x0;
puVar10 = (ushort *)0x0;
}
else {
puVar13 = (ushort *)param_1[0xd];
if (uVar6 == 1) {
puVar10 = (ushort *)0x0;
}
else {
puVar10 = puVar13 + 6;
}
}
if ((ushort)local_34 <= *(ushort *)((int)param_1 + 0x1a)) {
return *(ushort *)((int)param_1 + 0x1a);
}
do {
if (puVar13 != (ushort *)0x0) {
for (uVar9 = 0;
((uVar9 < *puVar13 && (*(int *)(puVar13 + 2) != 0)) &&
(iVar7 = *(int *)(*(int *)(puVar13 + 2) + uVar9 * 4), iVar7 != 0)); uVar9 = uVar9 + 1)
{
piVar3 = *(int **)(iVar7 + 0x18);
iVar12 = **(int **)(puVar13 + 4);
iVar11 = iVar12 + uVar9 * 0x10;
if (*piVar3 << 2 < 0) {
FUN_0800cdac(*(undefined4 *)(iVar11 + 4),piVar3[2],*(undefined4 *)(iVar11 + 8));
}
else {
piVar3[2] = *(int *)(iVar11 + 4) + (piVar3[2] - piVar3[3]);
*(undefined4 *)(*(int *)(iVar7 + 0x18) + 0xc) = *(undefined4 *)(iVar11 + 4);
}
uVar1 = *(uint *)(iVar12 + uVar9 * 0x10);
uVar8 = *(int *)(iVar11 + 4) + *(int *)(iVar11 + 8);
if (uVar1 <= uVar8) {
uVar8 = uVar1 - *(int *)(iVar11 + 0xc);
}
*(uint *)(iVar11 + 4) = uVar8;
}
}
FUN_0800aa24(param_1);
if (puVar10 != (ushort *)0x0) {
for (uVar9 = 0;
((uVar9 < *puVar10 && (*(int *)(puVar10 + 2) != 0)) &&
(iVar7 = *(int *)(*(int *)(puVar10 + 2) + uVar9 * 4), iVar7 != 0)); uVar9 = uVar9 + 1)
{
iVar12 = **(int **)(puVar10 + 4);
iVar11 = iVar12 + uVar9 * 0x10;
if (**(int **)(iVar7 + 0x18) << 2 < 0) {
FUN_0800cdac((*(int **)(iVar7 + 0x18))[2],*(undefined4 *)(iVar11 + 4),
*(undefined4 *)(iVar11 + 8));
uVar1 = *(uint *)(iVar12 + uVar9 * 0x10);
uVar8 = *(int *)(iVar11 + 4) + *(int *)(iVar11 + 8);
if (uVar1 <= uVar8) {
uVar8 = uVar1 - *(int *)(iVar11 + 0xc);
}
*(uint *)(iVar11 + 4) = uVar8;
}
else {
uVar1 = *(uint *)(iVar12 + uVar9 * 0x10);
uVar8 = *(int *)(iVar11 + 4) + *(int *)(iVar11 + 8);
if (uVar1 <= uVar8) {
uVar8 = uVar1 - *(int *)(iVar11 + 0xc);
}
*(uint *)(iVar11 + 4) = uVar8;
iVar12 = *(int *)(iVar7 + 0x18);
*(uint *)(iVar12 + 8) = uVar8 + (*(int *)(iVar12 + 8) - *(int *)(iVar12 + 0xc));
*(undefined4 *)(*(int *)(iVar7 + 0x18) + 0xc) = *(undefined4 *)(iVar11 + 4);
}
}
}
uVar6 = *(short *)((int)param_1 + 0x1a) + 1;
*(ushort *)((int)param_1 + 0x1a) = uVar6;
} while (uVar6 < (ushort)param_1[6]);
return uVar6;
}
}
LAB_0800a756:
FUN_0800a974(param_1 + 3,0x12,0x17);
return 0;
}
undefined4 FUN_0800a964(void)
{
return 1;
}
undefined4 FUN_0800a974(uint *param_1,char param_2,int param_3)
{
if ((char)*param_1 != '\0') {
return 0;
}
*(char *)param_1 = param_2;
*param_1 = *param_1 & 0xff | param_3 << 8;
return 1;
}
char * FUN_0800a98c(char *param_1)
{
uint uVar1;
char cStack_3;
char cStack_2;
char cStack_1;
if (param_1 != (char *)0x0) {
if (*param_1 == '\x03') {
if (((((DAT_0800a9dc & 0xff) == 3) &&
(cStack_3 = (char)(DAT_0800a9dc >> 8), param_1[1] == cStack_3)) &&
(cStack_2 = (char)(DAT_0800a9dc >> 0x10), param_1[2] == cStack_2)) &&
(cStack_1 = (char)(DAT_0800a9dc >> 0x18), param_1[3] == cStack_1)) {
uVar1 = 0;
}
else {
uVar1 = 1;
}
return (char *)(uVar1 ^ 1);
}
param_1 = (char *)0x0;
}
return param_1;
}
int FUN_0800a9e0(int param_1)
{
int iVar1;
int iVar2;
int iVar3;
iVar1 = 0;
iVar3 = *(int *)(param_1 + 0x38);
while( true ) {
if (iVar3 == 0) {
return iVar1;
}
iVar2 = *(int *)(iVar3 + 0x10);
*(int *)(iVar3 + 0xc) = param_1;
iVar1 = iVar1 + 1;
if (iVar2 == iVar3) break;
iVar3 = iVar2;
if (iVar2 == 0) {
return iVar1;
}
}
return iVar1;
}
int FUN_0800a9fc(int param_1)
{
int iVar1;
int iVar2;
int iVar3;
iVar3 = 0;
iVar2 = *(int *)(param_1 + 0x38);
while( true ) {
if (iVar2 == 0) {
return iVar3;
}
if ((*(int *)(iVar2 + 4) << 0x1f < 0) && (*(code **)(iVar2 + 0x20) != (code *)0x0)) {
(**(code **)(iVar2 + 0x20))(iVar2);
iVar3 = iVar3 + 1;
}
iVar1 = *(int *)(iVar2 + 0x10);
if (iVar1 == iVar2) break;
iVar2 = iVar1;
if (iVar1 == 0) {
return iVar3;
}
}
return iVar3;
}
int FUN_0800aa24(int param_1)
{
int iVar1;
int iVar2;
int iVar3;
code *pcVar4;
pcVar4 = *(code **)(param_1 + 0x40);
if (pcVar4 == (code *)0x0) {
iVar1 = *(int *)(param_1 + 0x38);
*(int *)(param_1 + 0x3c) = iVar1;
if (iVar1 != 0) {
iVar3 = 0;
do {
(**(code **)(iVar1 + 0x14))(iVar1);
iVar2 = *(int *)(iVar1 + 0x10);
if (iVar2 == iVar1) {
*(undefined4 *)(param_1 + 0x3c) = 0;
return iVar3 + 1;
}
*(int *)(param_1 + 0x3c) = iVar2;
iVar3 = iVar3 + 1;
iVar1 = iVar2;
} while (iVar2 != 0);
return iVar3;
}
}
else {
iVar1 = *(int *)(param_1 + 0x38);
*(int *)(param_1 + 0x3c) = iVar1;
if (iVar1 != 0) {
(*pcVar4)(1,iVar1,*(undefined4 *)(param_1 + 0x44));
iVar1 = *(int *)(param_1 + 0x3c);
if (iVar1 != 0) {
iVar3 = 0;
do {
(*pcVar4)(2,iVar1,*(undefined4 *)(param_1 + 0x44));
iVar2 = *(int *)(param_1 + 0x3c);
(**(code **)(iVar2 + 0x14))(iVar2);
iVar1 = *(int *)(iVar2 + 0x10);
if (iVar2 == iVar1) {
(*pcVar4)(3,*(undefined4 *)(param_1 + 0x3c),*(undefined4 *)(param_1 + 0x44));
*(undefined4 *)(param_1 + 0x3c) = 0;
return iVar3 + 1;
}
(*pcVar4)(3);
iVar3 = iVar3 + 1;
*(int *)(param_1 + 0x3c) = iVar1;
} while (iVar1 != 0);
return iVar3;
}
}
}
return 0;
}
void FUN_0800aab8(int param_1)
{
code *pcVar1;
ushort uVar2;
short sVar3;
short sVar4;
short sVar5;
short sVar6;
short sVar7;
short sVar8;
short sVar9;
short sVar10;
short sVar11;
short sVar12;
short sVar13;
short sVar14;
short sVar15;
int iVar16;
int iVar17;
uint uVar18;
int iVar19;
uint *puVar20;
uint uVar21;
undefined4 *puVar22;
uint uVar23;
uint uVar24;
uint uVar25;
uint uVar26;
uint uVar27;
uint uVar28;
int *piVar29;
undefined4 *puVar30;
undefined4 *puVar31;
int iVar32;
ushort *puVar33;
int local_a8;
short local_84;
undefined4 local_80;
undefined4 local_7c;
int local_2c;
puVar33 = *(ushort **)(param_1 + 0x18);
uVar2 = *puVar33;
if (uVar2 != 0) {
iVar19 = *(int *)(puVar33 + 2);
puVar31 = *(undefined4 **)(iVar19 + 4);
if (puVar31 != (undefined4 *)0x0) {
puVar31 = (undefined4 *)*puVar31;
}
if (uVar2 != 1) {
puVar30 = *(undefined4 **)(iVar19 + 0x10);
if (puVar30 != (undefined4 *)0x0) {
puVar30 = (undefined4 *)*puVar30;
}
if (uVar2 != 2) {
piVar29 = *(int **)(iVar19 + 0x1c);
if (piVar29 == (int *)0x0) {
if (*(ushort *)(iVar19 + 0x18) < 2) {
// WARNING: Does not return
pcVar1 = (code *)software_udf(0xff,0x800ad8e);
(*pcVar1)();
}
iVar19 = 0;
iVar32 = 0;
local_2c = 0;
}
else {
iVar32 = *piVar29;
if (*(ushort *)(iVar19 + 0x18) < 2) {
local_2c = 0;
}
else {
local_2c = piVar29[1];
}
iVar19 = piVar29[2];
}
iVar17 = puVar31[3];
iVar16 = puVar30[3];
sVar3 = *(short *)(iVar17 + 4);
puVar20 = *(uint **)(param_1 + 0x3c);
sVar4 = *(short *)(iVar16 + 4);
uVar23 = *(uint *)(param_1 + 0x28);
uVar26 = *(uint *)(param_1 + 0x2c);
sVar5 = *(short *)(iVar16 + 0xc);
sVar6 = *(short *)(iVar16 + 8);
uVar24 = *puVar20;
uVar27 = puVar20[1];
sVar7 = *(short *)(iVar17 + 0xc);
sVar8 = *(short *)(iVar17 + 8);
uVar25 = *(uint *)(param_1 + 0x30);
uVar28 = *(uint *)(param_1 + 0x34);
uVar18 = puVar20[2];
uVar21 = puVar20[3];
sVar9 = *(short *)(param_1 + 0x1c);
sVar10 = *(short *)(param_1 + 0x44);
sVar11 = *(short *)(param_1 + 0x4c);
sVar12 = *(short *)(param_1 + 0x50);
sVar13 = **(short **)(param_1 + 0x58);
sVar14 = (*(short **)(param_1 + 0x58))[2];
local_a8 = *(int *)(param_1 + 0x20);
local_84 = (short)*(undefined4 *)(*(int *)(iVar32 + 0xc) + 4);
sVar15 = (short)*(undefined4 *)(*(int *)(iVar32 + 0xc) + 8);
if (iVar19 == 0) {
if (local_a8 != 0) {
local_a8 = *(int *)(local_a8 + 8);
}
local_80 = 1;
local_7c = 0;
}
else {
puVar22 = *(undefined4 **)(iVar19 + 0x18);
if (puVar22 == (undefined4 *)0x0) {
if (local_a8 != 0) {
local_a8 = *(int *)(local_a8 + 8);
}
local_80 = 1;
local_7c = 0;
}
else {
local_a8 = puVar22[2];
local_7c = FUN_0800cfd0(*puVar22,puVar22[1]);
puVar22 = *(undefined4 **)(iVar19 + 0x18);
if (puVar22 == (undefined4 *)0x0) {
puVar33 = *(ushort **)(param_1 + 0x18);
local_80 = 1;
uVar2 = *puVar33;
}
else {
local_80 = FUN_0800cfd0(*puVar22,puVar22[1]);
puVar33 = *(ushort **)(param_1 + 0x18);
uVar2 = *puVar33;
}
}
}
iVar16 = (int)(short)(((short)uVar25 + -1) * (local_84 + -1) + local_84);
iVar19 = (int)(short)(((short)uVar28 + -1) * (sVar15 + -1) + sVar15);
if (3 < uVar2) {
piVar29 = *(int **)(*(int *)(puVar33 + 2) + 0x28);
if (piVar29 == (int *)0x0) {
// WARNING: Does not return
pcVar1 = (code *)software_udf(0xff,0x800ad94);
(*pcVar1)();
}
iVar17 = *piVar29;
if (iVar17 != 0) {
iVar17 = *(int *)(*(int *)(iVar17 + 0x18) + 8);
}
FUN_0800b894(*(undefined4 *)(puVar31[6] + 8),*(undefined4 *)(puVar30[6] + 8),
*(undefined4 *)(*(int *)(iVar32 + 0x18) + 8),
*(undefined4 *)(*(int *)(local_2c + 0x18) + 8),
*(undefined4 *)(*(int *)(piVar29[1] + 0x18) + 8),iVar17,(int)sVar3,(int)sVar4
,(int)sVar8,(int)sVar7,(int)sVar6,(int)sVar5,(int)local_84,(int)sVar15,
uVar27 & 0xffff,uVar24 & 0xffff,uVar23 & 0xffff,uVar26 & 0xffff,iVar19,iVar16
,uVar25 & 0xffff,uVar28 & 0xffff,(int)sVar9,
(int)(short)((short)((int)((sVar8 - iVar16) + (uVar27 & 0xffff) +
(uVar21 & 0xffff)) / (int)(uVar23 & 0xffff)) + 1),
(int)(short)((short)((int)((sVar7 - iVar19) + (uVar24 & 0xffff) +
(uVar18 & 0xffff)) / (int)(uVar26 & 0xffff)) + 1),
*(undefined4 *)(param_1 + 0x24),local_a8,local_7c,local_80,
*(undefined4 *)(param_1 + 0x5c),(int)sVar10,(int)*(short *)(param_1 + 0x48),
(int)sVar11,(int)sVar12,(int)sVar14,(int)sVar13);
return;
}
}
}
}
// WARNING: Does not return
pcVar1 = (code *)software_udf(0xff,0x800ad42);
(*pcVar1)();
}
void FUN_0800af78(int param_1)
{
uint uVar1;
int *piVar2;
code *pcVar3;
short sVar4;
undefined4 uVar5;
float fVar6;
uint uVar7;
int iVar8;
byte *pbVar9;
undefined4 *puVar10;
uint uVar11;
undefined1 *puVar12;
uint uVar13;
int iVar14;
uint *puVar15;
uint uVar16;
uint uVar17;
int iVar18;
int iVar19;
byte *pbVar20;
byte *pbVar21;
byte *pbVar22;
uint uVar23;
ushort *puVar24;
byte *pbVar25;
int iVar26;
undefined1 *puVar27;
undefined1 *puVar28;
undefined1 *puVar29;
undefined1 *puVar30;
uint in_fpscr;
float fVar31;
float fVar32;
float fVar33;
float fVar34;
float fVar35;
uint *local_44;
fVar6 = DAT_0800b35c;
sVar4 = **(short **)(param_1 + 0x18);
if ((sVar4 == 0) || (puVar24 = *(ushort **)(*(short **)(param_1 + 0x18) + 2), sVar4 == 1)) {
// WARNING: Does not return
pcVar3 = (code *)software_udf(0xff,0x800af8c);
(*pcVar3)();
}
local_44 = *(uint **)(puVar24 + 8);
if (local_44 != (uint *)0x0) {
local_44 = (uint *)*local_44;
}
uVar17 = (uint)*puVar24;
uVar7 = 0;
for (uVar13 = 0;
((uVar17 != uVar13 && (*(int *)(puVar24 + 2) != 0)) &&
(iVar14 = *(int *)(*(int *)(puVar24 + 2) + uVar13 * 4), iVar14 != 0)); uVar13 = uVar13 + 1) {
if ((uint)(**(int **)(iVar14 + 0x18) << 0xb) >> 0x1c == 1) {
uVar23 = 1;
}
else {
uVar23 = 2;
}
uVar7 = uVar7 | uVar23;
}
iVar14 = *(int *)local_44[6];
puVar27 = (undefined1 *)((int *)local_44[6])[2];
if ((uint)(iVar14 << 0xb) >> 0x1c == 1) {
if (uVar7 == 1) {
uVar7 = 0;
while( true ) {
if (uVar17 <= uVar7) {
return;
}
if (*(int *)(puVar24 + 2) == 0) break;
iVar14 = *(int *)(*(int *)(puVar24 + 2) + uVar7 * 4);
if (iVar14 == 0) {
return;
}
iVar8 = *(int *)(param_1 + 0x1c);
iVar18 = *(int *)(*(int *)(iVar14 + 0x14) + iVar8 * 4);
uVar23 = *(int *)(*(int *)(iVar14 + 0xc) + iVar8 * 4) * iVar18;
iVar8 = *(int *)(local_44[3] + iVar8 * 4);
uVar13 = FUN_0800cfd0(**(undefined4 **)(iVar14 + 0x18),(*(undefined4 **)(iVar14 + 0x18))[1])
;
uVar17 = *(uint *)(*(int *)(iVar14 + 0x18) + 8);
uVar13 = uVar23 * (uVar13 / uVar23) + uVar17;
puVar29 = puVar27;
for (; uVar17 < uVar13; uVar17 = uVar17 + uVar23) {
FUN_0800cdac(uVar17,puVar29,uVar23);
puVar29 = puVar29 + iVar8 * iVar18;
}
uVar17 = (uint)*puVar24;
puVar27 = puVar27 + uVar23;
uVar7 = uVar7 + 1;
}
return;
}
if ((int)(uVar7 << 0x1e) < 0) {
return;
}
uVar7 = *local_44;
if (uVar7 != 0) goto LAB_0800b086;
LAB_0800b072:
fVar34 = 1.0;
}
else {
if (uVar7 == 1) {
return;
}
uVar7 = *local_44;
if (uVar7 == 0) {
fVar34 = 1.0;
fVar35 = 1.0;
goto LAB_0800b0ac;
}
LAB_0800b086:
if ((*(undefined4 **)(uVar7 + 4) == (undefined4 *)0x0) || (*(short *)(uVar7 + 2) == 0))
goto LAB_0800b072;
fVar34 = *(float *)**(undefined4 **)(uVar7 + 4);
}
fVar35 = 1.0 / fVar34;
LAB_0800b0ac:
iVar14 = iVar14 << 8;
uVar13 = 0;
do {
if (((uVar17 <= uVar13) || (*(int *)(puVar24 + 2) == 0)) ||
(puVar15 = *(uint **)(*(int *)(puVar24 + 2) + uVar13 * 4), puVar15 == (uint *)0x0)) {
return;
}
iVar18 = *(int *)(param_1 + 0x1c);
iVar8 = *(int *)(puVar15[5] + iVar18 * 4);
iVar26 = *(int *)(local_44[3] + iVar18 * 4) * iVar8;
iVar19 = *(int *)puVar15[6];
uVar23 = iVar8 * *(int *)(puVar15[3] + iVar18 * 4);
uVar17 = FUN_0800cfd0(iVar19,((int *)puVar15[6])[1]);
pbVar20 = *(byte **)(puVar15[6] + 8);
pbVar25 = pbVar20 + uVar23 * (uVar17 / uVar23);
if ((uint)(iVar19 << 0xb) >> 0x1c == 1) {
uVar17 = uVar23;
if ((int)uVar23 < 0) {
uVar17 = uVar23 + 3;
}
iVar8 = (int)uVar17 >> 2;
if (iVar14 < 0) {
if (uVar7 == 0) {
iVar18 = 0;
}
else if (*(int *)(uVar7 + 4) == 0) {
iVar18 = 0;
}
else if (*(short *)(uVar7 + 2) == 0) {
iVar18 = 0;
}
else {
iVar18 = (int)**(char **)(*(int *)(uVar7 + 4) + 4);
}
if ((pbVar20 < pbVar25) && (3 < (int)uVar23)) {
fVar32 = (float)VectorSignedToFloat(iVar18,(byte)(in_fpscr >> 0x15) & 3);
puVar29 = puVar27;
do {
iVar18 = 0;
pbVar22 = pbVar20;
puVar30 = puVar29;
do {
while( true ) {
fVar31 = (float)VectorSignedToFloat((uint)*pbVar22,(byte)(in_fpscr >> 0x15) & 3);
fVar31 = fVar32 + fVar31 * fVar35;
in_fpscr = in_fpscr & 0xfffffff;
if (fVar31 < 0.0) break;
uVar5 = SignedSaturate((int)(fVar31 + 0.5),7);
SignedDoesSaturate((int)(fVar31 + 0.5),7);
iVar18 = iVar18 + 1;
*puVar30 = (char)uVar5;
pbVar22 = pbVar22 + 1;
puVar30 = puVar30 + 1;
if (iVar8 <= iVar18) goto LAB_0800b3d4;
}
iVar19 = (int)(fVar31 - fVar6);
uVar5 = SignedSaturate(iVar19,7);
SignedDoesSaturate(iVar19,7);
iVar18 = iVar18 + 1;
*puVar30 = (char)uVar5;
pbVar22 = pbVar22 + 1;
puVar30 = puVar30 + 1;
} while (iVar18 < iVar8);
LAB_0800b3d4:
iVar18 = iVar8;
if ((int)uVar23 < 4) {
iVar18 = 1;
}
pbVar20 = pbVar20 + iVar18;
puVar29 = puVar29 + iVar18 + (iVar26 - iVar8);
} while (pbVar20 < pbVar25);
}
}
else {
if (((uVar7 == 0) || (*(int *)(uVar7 + 4) == 0)) || (*(short *)(uVar7 + 2) == 0)) {
fVar32 = 0.5;
}
else {
fVar32 = (float)VectorSignedToFloat((uint)**(byte **)(*(int *)(uVar7 + 4) + 4),
(byte)(in_fpscr >> 0x15) & 3);
fVar32 = fVar32 + 0.5;
}
if ((pbVar20 < pbVar25) && (puVar29 = puVar27, 3 < (int)uVar23)) {
do {
iVar18 = 0;
pbVar22 = pbVar20;
puVar30 = puVar29;
do {
fVar31 = (float)VectorSignedToFloat((uint)*pbVar22,(byte)(in_fpscr >> 0x15) & 3);
iVar19 = (int)(fVar32 + fVar31 * fVar35);
uVar5 = UnsignedSaturate(iVar19,8);
UnsignedDoesSaturate(iVar19,8);
iVar18 = iVar18 + 1;
*puVar30 = (char)uVar5;
pbVar22 = pbVar22 + 1;
puVar30 = puVar30 + 1;
} while (iVar18 < iVar8);
iVar18 = iVar8;
if ((int)uVar23 < 4) {
iVar18 = 1;
}
pbVar20 = pbVar20 + iVar18;
puVar29 = puVar29 + iVar18 + (iVar26 - iVar8);
} while (pbVar20 < pbVar25);
}
}
puVar29 = puVar27 + iVar8;
}
else {
uVar17 = *puVar15;
if (uVar17 == 0) {
fVar32 = 1.0;
uVar11 = 0;
}
else {
puVar10 = *(undefined4 **)(uVar17 + 4);
if (puVar10 == (undefined4 *)0x0) {
fVar32 = 1.0;
uVar11 = 0;
}
else if (*(short *)(uVar17 + 2) == 0) {
fVar32 = 1.0;
uVar11 = 0;
}
else {
fVar32 = *(float *)*puVar10;
uVar11 = (uint)*(char *)puVar10[1];
}
}
if (uVar7 == 0) {
uVar16 = 0;
}
else if (*(int *)(uVar7 + 4) == 0) {
uVar16 = 0;
}
else {
uVar16 = (uint)*(ushort *)(uVar7 + 2);
if (uVar16 != 0) {
uVar16 = (uint)**(char **)(*(int *)(uVar7 + 4) + 4);
}
}
uVar1 = in_fpscr & 0xfffffff;
in_fpscr = uVar1 | (uint)(fVar34 == fVar32) << 0x1e;
if (((byte)(in_fpscr >> 0x1e) == 0) || (uVar11 != uVar16)) {
if (iVar14 < 0) {
if (uVar17 != 0) {
piVar2 = (int *)(uVar17 + 4);
if (*piVar2 == 0) {
uVar17 = 0;
}
else {
uVar17 = (uint)*(ushort *)(uVar17 + 2);
if (uVar17 != 0) {
uVar17 = (uint)**(char **)(*piVar2 + 4);
}
}
}
if (uVar7 == 0) {
uVar11 = 0;
}
else if (*(int *)(uVar7 + 4) == 0) {
uVar11 = 0;
}
else {
uVar11 = (uint)*(ushort *)(uVar7 + 2);
if (uVar11 != 0) {
uVar11 = (uint)**(char **)(*(int *)(uVar7 + 4) + 4);
}
}
in_fpscr = uVar1 | (uint)(fVar34 == fVar32) << 0x1e;
if (((byte)(in_fpscr >> 0x1e) == 0) || (uVar17 != uVar11)) {
if ((pbVar20 < pbVar25) && (0 < (int)uVar23)) {
puVar29 = puVar27 + uVar23;
fVar31 = (float)VectorSignedToFloat(uVar11,(byte)(in_fpscr >> 0x15) & 3);
puVar30 = puVar29;
puVar28 = puVar27;
pbVar22 = pbVar20;
do {
do {
fVar33 = (float)VectorSignedToFloat((int)(char)*pbVar20 - uVar17,
(byte)(in_fpscr >> 0x15) & 3);
fVar33 = fVar31 + fVar33 * fVar32 * fVar35;
in_fpscr = in_fpscr & 0xfffffff;
if (fVar33 < 0.0) {
fVar33 = fVar33 - fVar6;
}
else {
fVar33 = fVar33 + 0.5;
}
uVar5 = SignedSaturate((int)fVar33,7);
SignedDoesSaturate((int)fVar33,7);
puVar12 = puVar27 + 1;
*puVar27 = (char)uVar5;
pbVar20 = pbVar20 + 1;
puVar27 = puVar12;
} while (puVar12 != puVar30);
pbVar20 = pbVar22 + uVar23;
puVar27 = puVar28 + iVar26;
puVar30 = puVar30 + iVar26;
puVar28 = puVar27;
pbVar22 = pbVar20;
} while (pbVar20 < pbVar25);
goto LAB_0800b298;
}
}
else {
puVar29 = puVar27;
if (pbVar20 < pbVar25) {
do {
pbVar22 = pbVar20 + uVar23;
FUN_0800cdac(pbVar20,puVar29,uVar23);
pbVar20 = pbVar22;
puVar29 = puVar29 + iVar26;
} while (pbVar22 < pbVar25);
goto LAB_0800b456;
}
}
}
else {
uVar11 = 0;
if (((uVar17 != 0) && (*(int *)(uVar17 + 4) != 0)) && (*(short *)(uVar17 + 2) != 0)) {
uVar11 = (uint)**(byte **)(*(int *)(uVar17 + 4) + 4);
}
uVar17 = uVar7;
if (uVar7 != 0) {
if (*(int *)(uVar7 + 4) == 0) {
uVar17 = 0;
}
else {
uVar17 = (uint)*(ushort *)(uVar7 + 2);
if (*(ushort *)(uVar7 + 2) != 0) {
uVar17 = (uint)**(byte **)(*(int *)(uVar7 + 4) + 4);
}
}
}
in_fpscr = uVar1 | (uint)(fVar34 == fVar32) << 0x1e;
if (((byte)(in_fpscr >> 0x1e) == 0) || (uVar11 != uVar17)) {
if ((pbVar20 < pbVar25) && (0 < (int)uVar23)) {
fVar31 = (float)VectorSignedToFloat(uVar17,(byte)(in_fpscr >> 0x15) & 3);
pbVar9 = pbVar20 + uVar23;
puVar29 = puVar27;
puVar30 = puVar27;
pbVar22 = pbVar9;
while( true ) {
do {
pbVar21 = pbVar20 + 1;
fVar33 = (float)VectorSignedToFloat(*pbVar20 - uVar11,(byte)(in_fpscr >> 0x15) & 3
);
iVar8 = (int)(fVar31 + 0.5 + fVar33 * fVar32 * fVar35);
uVar5 = UnsignedSaturate(iVar8,8);
UnsignedDoesSaturate(iVar8,8);
*puVar29 = (char)uVar5;
pbVar20 = pbVar21;
puVar29 = puVar29 + 1;
} while (pbVar21 != pbVar9);
pbVar9 = pbVar21 + uVar23;
puVar29 = puVar30 + iVar26;
if (pbVar25 <= pbVar22) break;
pbVar20 = pbVar22;
puVar30 = puVar29;
pbVar22 = pbVar22 + uVar23;
}
}
}
else {
puVar29 = puVar27;
if (pbVar20 < pbVar25) {
do {
pbVar22 = pbVar20 + uVar23;
FUN_0800cdac(pbVar20,puVar29,uVar23);
pbVar20 = pbVar22;
puVar29 = puVar29 + iVar26;
} while (pbVar22 < pbVar25);
goto LAB_0800b456;
}
}
}
}
else {
puVar29 = puVar27;
if (pbVar20 < pbVar25) {
do {
pbVar22 = pbVar20 + uVar23;
FUN_0800cdac(pbVar20,puVar29,uVar23);
pbVar20 = pbVar22;
puVar29 = puVar29 + iVar26;
} while (pbVar22 < pbVar25);
LAB_0800b456:
puVar29 = puVar27 + uVar23;
goto LAB_0800b298;
}
}
puVar29 = puVar27 + uVar23;
}
LAB_0800b298:
uVar17 = (uint)*puVar24;
uVar13 = uVar13 + 1;
puVar27 = puVar29;
} while( true );
}
void FUN_0800b894(float *param_1,int param_2,int param_3,float *param_4,float *param_5,int param_6,
short param_7,short param_8,short param_9,short param_10,short param_11,
short param_12,short param_13,short param_14,ushort param_15,ushort param_16,
ushort param_17,ushort param_18,short param_19)
{
short sVar1;
short sVar2;
int iVar3;
float fVar4;
int iVar5;
uint uVar6;
uint uVar7;
float *pfVar8;
int iVar9;
float *pfVar10;
float *pfVar11;
ushort uVar12;
short sVar13;
uint uVar14;
int iVar15;
int iVar16;
int iVar17;
int iVar18;
uint uVar19;
int iVar20;
float *pfVar21;
int iVar22;
int iVar23;
float *pfVar24;
int iVar25;
int iVar26;
int iVar27;
int iVar28;
uint uVar29;
int iVar30;
uint uVar31;
int iVar32;
uint uVar33;
uint uVar34;
int iVar35;
float *pfVar36;
float fVar37;
float fVar38;
short in_stack_0000004c;
ushort in_stack_00000050;
code *in_stack_00000054;
int in_stack_00000058;
int in_stack_0000005c;
int in_stack_00000060;
code *in_stack_00000064;
undefined2 in_stack_00000068;
short in_stack_0000006c;
undefined2 in_stack_00000070;
short in_stack_00000074;
undefined2 in_stack_00000078;
short in_stack_0000007c;
int local_124;
uint local_120;
float *local_11c;
uint local_118;
float *local_110;
int local_10c;
int local_e8;
float *local_e4;
float *local_e0;
uint local_dc;
int local_d8;
uint local_d0;
float *local_c8;
float *local_b8;
int local_94;
float *local_90;
uint local_88;
int local_74;
fVar4 = DAT_0800baa0;
iVar25 = (int)in_stack_0000004c;
uVar14 = (uint)in_stack_0000006c;
iVar5 = (int)param_8;
iVar9 = iVar5 * iVar25 * uVar14;
uVar33 = (uint)param_17;
uVar6 = (uint)param_13;
iVar30 = (int)param_9;
iVar22 = (int)param_7;
uVar7 = (uint)param_15;
uVar34 = (uint)param_18;
local_d0 = (uint)param_16;
local_d8 = -local_d0;
local_dc = (uint)in_stack_0000007c;
if (param_12 < 1) {
return;
}
iVar15 = iVar22 * uVar6 * (int)param_14 * 4;
iVar16 = (ushort)(param_8 - 1) + 1;
iVar17 = iVar22 * uVar34 * iVar30;
pfVar10 = param_5 + iVar9;
iVar27 = iVar22 * 4;
local_c8 = (float *)(local_d8 * iVar30 * iVar27 + (int)param_1);
iVar3 = -uVar7;
sVar2 = 0;
local_e4 = param_5;
local_94 = in_stack_00000058;
sVar1 = 0;
local_88 = local_dc;
local_74 = param_2;
LAB_0800b9f8:
uVar12 = in_stack_00000050 - 1;
if (0 < (short)in_stack_00000050) goto LAB_0800bad4;
do {
in_stack_00000050 = uVar12;
if ((int)((uint)uVar12 << 0x10) < 0) {
pfVar8 = local_e4 + -(iVar25 * iVar5 * local_dc);
if (pfVar8 < param_5) {
pfVar8 = pfVar8 + iVar9;
}
if (((param_5 < pfVar8) && (uVar14 != local_dc)) &&
(pfVar11 = local_e4, pfVar21 = pfVar8, pfVar8 < pfVar10)) {
do {
pfVar24 = pfVar21 + 1;
*pfVar11 = *pfVar21;
pfVar11 = pfVar11 + 1;
pfVar21 = pfVar24;
} while (pfVar24 < pfVar10);
local_e4 = (float *)((int)local_e4 + ((int)pfVar10 + (-1 - (int)pfVar8) & 0xfffffffcU) + 4);
}
sVar2 = (sVar2 + in_stack_0000006c) - (short)local_dc;
local_dc = (uint)(short)((short)local_dc + in_stack_00000074);
for (local_e4 = local_e4 + iVar25 * in_stack_00000074 * iVar5; pfVar10 <= local_e4;
local_e4 = local_e4 + -iVar9) {
}
}
while( true ) {
if ((int)uVar14 <= (int)local_dc) {
sVar1 = sVar1 + 1;
local_d8 = local_d8 + uVar34;
local_d0 = local_d0 - uVar34;
local_c8 = local_c8 + iVar17;
local_dc = (uint)(short)((short)local_dc - in_stack_00000074);
(*in_stack_00000064)
(param_5,in_stack_0000004c,in_stack_0000006c - sVar2,param_8,in_stack_00000068,
in_stack_0000006c,in_stack_00000078,local_88 & 0xffff,in_stack_00000070,
in_stack_00000074,param_11,1,local_74);
iVar18 = local_88 - (int)in_stack_00000074;
local_88 = (uint)(short)((ushort)iVar18 & ~(ushort)(iVar18 >> 0x1f));
local_74 = local_74 + iVar5 * param_11 * 4;
if (param_12 <= sVar1) {
return;
}
goto LAB_0800b9f8;
}
uVar12 = in_stack_00000050 - 1;
local_d8 = local_d8 + uVar34;
local_d0 = local_d0 - uVar34;
local_c8 = local_c8 + iVar17;
if (param_12 <= sVar1) {
return;
}
if ((short)in_stack_00000050 < 1) break;
LAB_0800bad4:
uVar19 = local_d0;
local_e0 = param_1;
if (-1 < local_d8) {
local_e0 = local_c8;
uVar19 = 0;
}
if ((int)param_19 < (int)((int)param_10 + local_d0)) {
iVar18 = (int)param_19 - uVar19;
}
else {
iVar18 = ((int)param_10 + local_d0) - uVar19;
}
local_90 = param_4;
if ((param_6 == 0) || (param_3 + 0xf8000000U < 0x1000000)) {
if (0 < iVar5) {
iVar32 = param_3;
pfVar8 = local_e4;
do {
fVar37 = fVar4;
if (param_4 != (float *)0x0) {
fVar37 = *local_90;
local_90 = local_90 + 1;
}
if (iVar25 != 0) {
local_120 = uVar7 + iVar30;
local_10c = 0;
local_124 = iVar3;
local_11c = (float *)((int)local_e0 + iVar27 * iVar3);
local_118 = uVar7;
local_110 = pfVar8;
do {
if (local_124 < 0) {
iVar28 = uVar6 * uVar19 + local_118;
uVar29 = local_118;
pfVar11 = local_e0;
}
else {
uVar29 = 0;
pfVar11 = local_11c;
iVar28 = uVar6 * uVar19;
}
if (local_120 < uVar6) {
iVar35 = local_120 - uVar29;
}
else {
iVar35 = uVar6 - uVar29;
}
pfVar21 = (float *)(iVar28 * iVar27 + iVar32);
uVar29 = iVar22 * iVar35;
fVar38 = fVar37;
if (0 < iVar18) {
uVar31 = uVar29 & 0xfffffff0;
iVar23 = (uVar31 - 1 >> 4) + 1;
iVar28 = 0;
do {
if ((int)uVar31 < 1) {
iVar20 = 0;
}
else {
iVar20 = 0;
pfVar24 = pfVar21;
pfVar36 = pfVar11;
do {
iVar20 = iVar20 + 0x10;
fVar38 = fVar38 + pfVar36[1] * pfVar24[1] + *pfVar36 * *pfVar24 +
pfVar36[2] * pfVar24[2] + pfVar36[3] * pfVar24[3] +
pfVar36[4] * pfVar24[4] + pfVar36[5] * pfVar24[5] +
pfVar36[6] * pfVar24[6] + pfVar36[7] * pfVar24[7] +
pfVar36[8] * pfVar24[8] + pfVar36[9] * pfVar24[9] +
pfVar36[10] * pfVar24[10] + pfVar36[0xb] * pfVar24[0xb] +
pfVar36[0xc] * pfVar24[0xc] + pfVar36[0xd] * pfVar24[0xd]
+ pfVar36[0xe] * pfVar24[0xe] +
pfVar36[0xf] * pfVar24[0xf];
pfVar24 = pfVar24 + 0x10;
pfVar36 = pfVar36 + 0x10;
} while (iVar20 < (int)uVar31);
pfVar11 = pfVar11 + iVar23 * 0x10;
pfVar21 = pfVar21 + iVar23 * 0x10;
iVar20 = iVar23 * 0x10;
}
iVar26 = iVar20;
pfVar24 = pfVar21;
pfVar36 = pfVar11;
if (uVar29 - iVar20 != 0 && iVar20 <= (int)uVar29) {
do {
iVar26 = iVar26 + 1;
fVar38 = fVar38 + *pfVar24 * *pfVar36;
pfVar24 = pfVar24 + 1;
pfVar36 = pfVar36 + 1;
} while (uVar29 - iVar26 != 0);
pfVar21 = pfVar21 + (uVar29 - iVar20);
pfVar11 = pfVar11 + (uVar29 - iVar20);
}
iVar28 = iVar28 + 1;
pfVar11 = (float *)((int)pfVar11 + (iVar30 - iVar35) * iVar27);
pfVar21 = (float *)((int)pfVar21 + (uVar6 - iVar35) * iVar27);
} while (iVar18 != iVar28);
}
*local_110 = fVar38;
local_124 = local_124 + uVar33;
local_110 = local_110 + iVar5;
local_118 = local_118 - uVar33;
local_11c = local_11c + uVar33 * iVar22;
local_120 = local_120 - uVar33;
local_10c = local_10c + 1;
} while (iVar25 != local_10c);
}
iVar32 = iVar32 + iVar15;
pfVar8 = pfVar8 + 1;
} while (pfVar8 != local_e4 + iVar16);
}
}
else if (0 < iVar5) {
local_b8 = local_e4;
local_e8 = param_3;
do {
FUN_0800cdac(local_e8,param_6,iVar15);
fVar37 = fVar4;
if (param_4 != (float *)0x0) {
fVar37 = *local_90;
local_90 = local_90 + 1;
}
if (iVar25 != 0) {
local_120 = uVar7 + iVar30;
local_110 = local_b8;
local_10c = 0;
local_124 = iVar3;
local_11c = (float *)((int)local_e0 + iVar27 * iVar3);
local_118 = uVar7;
do {
if (local_124 < 0) {
iVar32 = uVar6 * uVar19 + local_118;
pfVar8 = local_e0;
uVar29 = local_118;
}
else {
pfVar8 = local_11c;
iVar32 = uVar6 * uVar19;
uVar29 = 0;
}
if (local_120 < uVar6) {
iVar28 = local_120 - uVar29;
}
else {
iVar28 = uVar6 - uVar29;
}
pfVar11 = (float *)(iVar32 * iVar27 + param_6);
uVar29 = iVar22 * iVar28;
fVar38 = fVar37;
if (0 < iVar18) {
uVar31 = uVar29 & 0xfffffff0;
iVar32 = (uVar31 - 1 >> 4) + 1;
iVar35 = 0;
do {
if ((int)uVar31 < 1) {
iVar23 = 0;
}
else {
iVar23 = 0;
pfVar21 = pfVar8;
pfVar24 = pfVar11;
do {
iVar23 = iVar23 + 0x10;
fVar38 = fVar38 + pfVar21[1] * pfVar24[1] + *pfVar21 * *pfVar24 +
pfVar21[2] * pfVar24[2] + pfVar21[3] * pfVar24[3] +
pfVar21[4] * pfVar24[4] + pfVar21[5] * pfVar24[5] +
pfVar21[6] * pfVar24[6] + pfVar21[7] * pfVar24[7] +
pfVar21[8] * pfVar24[8] + pfVar21[9] * pfVar24[9] +
pfVar21[10] * pfVar24[10] + pfVar21[0xb] * pfVar24[0xb] +
pfVar21[0xc] * pfVar24[0xc] + pfVar21[0xd] * pfVar24[0xd] +
pfVar21[0xe] * pfVar24[0xe] + pfVar21[0xf] * pfVar24[0xf];
pfVar21 = pfVar21 + 0x10;
pfVar24 = pfVar24 + 0x10;
} while (iVar23 < (int)uVar31);
pfVar8 = pfVar8 + iVar32 * 0x10;
pfVar11 = pfVar11 + iVar32 * 0x10;
iVar23 = iVar32 * 0x10;
}
pfVar21 = pfVar11;
iVar20 = iVar23;
pfVar24 = pfVar8;
if (uVar29 - iVar23 != 0 && iVar23 <= (int)uVar29) {
do {
iVar20 = iVar20 + 1;
fVar38 = fVar38 + *pfVar21 * *pfVar24;
pfVar21 = pfVar21 + 1;
pfVar24 = pfVar24 + 1;
} while (uVar29 - iVar20 != 0);
pfVar11 = pfVar11 + (uVar29 - iVar23);
pfVar8 = pfVar8 + (uVar29 - iVar23);
}
iVar35 = iVar35 + 1;
pfVar8 = (float *)((int)pfVar8 + (iVar30 - iVar28) * iVar27);
pfVar11 = (float *)((int)pfVar11 + (uVar6 - iVar28) * iVar27);
} while (iVar18 != iVar35);
}
*local_110 = fVar38;
local_124 = local_124 + uVar33;
local_110 = local_110 + iVar5;
local_118 = local_118 - uVar33;
local_11c = local_11c + uVar33 * iVar22;
local_120 = local_120 - uVar33;
local_10c = local_10c + 1;
} while (iVar25 != local_10c);
}
local_e8 = local_e8 + iVar15;
local_b8 = local_b8 + 1;
} while (local_b8 != local_e4 + iVar16);
}
if (0 < iVar25) {
if (in_stack_00000054 == (code *)0x0) {
sVar13 = 0;
do {
local_e4 = local_e4 + iVar5;
pfVar8 = pfVar10;
if (pfVar10 <= local_e4) {
pfVar8 = (float *)(iVar9 * -4);
}
sVar13 = sVar13 + 1;
if (pfVar10 <= local_e4) {
local_e4 = (float *)((int)local_e4 + (int)pfVar8);
}
} while (sVar13 < iVar25);
}
else {
iVar18 = 0;
do {
iVar32 = local_94 + in_stack_0000005c;
(*in_stack_00000054)(local_e4,local_e4,iVar5,local_94);
local_94 = iVar32;
if (in_stack_00000060 <= iVar32 - in_stack_00000058) {
local_94 = in_stack_00000058;
}
local_e4 = local_e4 + iVar5;
pfVar8 = pfVar10;
if (pfVar10 <= local_e4) {
pfVar8 = (float *)(iVar9 * -4);
}
if (pfVar10 <= local_e4) {
local_e4 = (float *)((int)local_e4 + (int)pfVar8);
}
iVar18 = (int)(short)((short)iVar18 + 1);
} while (iVar25 != iVar18);
}
}
local_dc = (uint)(short)((short)local_dc + 1);
in_stack_00000050 = uVar12;
}
} while( true );
}
void FUN_0800c19c(int param_1,int param_2,int param_3,int param_4,ushort param_5,ushort param_6,
ushort param_7,ushort param_8,ushort param_9,ushort param_10,ushort param_11,
ushort param_12,int param_13)
{
short sVar1;
uint uVar2;
uint uVar3;
uint uVar4;
uint uVar5;
uint uVar6;
uint uVar7;
uint uVar8;
uint uVar9;
uint uVar10;
int iVar11;
uint uVar12;
float *pfVar13;
uint uVar14;
int iVar15;
int iVar16;
uint uVar17;
int iVar18;
int iVar19;
float fVar20;
float fVar21;
uint local_6c;
uint local_60;
uint local_54;
uint local_50;
int local_40;
int local_3c;
local_6c = (uint)param_6;
uVar7 = (uint)param_9;
uVar8 = (uint)param_10;
uVar12 = (uint)param_8;
uVar17 = (uint)param_5;
uVar14 = (uint)param_7;
uVar9 = (uint)param_11;
uVar10 = (uint)param_12;
if (((param_8 == 0 && param_7 == 0) &&
((int)(((int)(short)(param_11 - 1) * (int)(short)param_9 + (uVar17 - param_2) + -1) * 0x10000)
< 0)) &&
((int)(((int)(short)(param_12 - 1) * (int)(short)param_10 + (local_6c - param_3) + -1) *
0x10000) < 0)) {
if (((uVar10 != 0) && (uVar9 != 0)) && (param_4 != 0)) {
if (param_4 == 1) {
iVar19 = 0;
uVar12 = 0;
do {
uVar6 = 0;
iVar18 = 0;
uVar14 = uVar17;
do {
iVar11 = (int)(short)uVar6;
fVar21 = DAT_0800c504;
for (sVar1 = (short)uVar12; (int)sVar1 < (int)(short)local_6c; sVar1 = sVar1 + 1) {
if (iVar11 < (short)uVar14) {
pfVar13 = (float *)(param_1 + (sVar1 * param_2 + iVar11) * 4);
iVar15 = iVar11;
do {
fVar20 = *pfVar13;
pfVar13 = pfVar13 + 1;
iVar15 = iVar15 + 1;
if (fVar21 < fVar20 != (NAN(fVar21) || NAN(fVar20))) {
fVar21 = fVar20;
}
} while ((int)(short)iVar15 < (int)(short)uVar14);
}
}
*(float *)(param_13 + (iVar18 + uVar9 * iVar19) * 4) = fVar21;
iVar18 = (int)(short)((short)iVar18 + 1);
uVar14 = uVar14 + uVar7 & 0xffff;
uVar6 = uVar6 + uVar7 & 0xffff;
} while (iVar18 < (int)uVar9);
iVar19 = (int)(short)((short)iVar19 + 1);
local_6c = local_6c + uVar8 & 0xffff;
uVar12 = uVar12 + uVar8 & 0xffff;
} while (iVar19 < (int)uVar10);
}
else {
iVar19 = 0;
uVar12 = 0;
do {
uVar6 = 0;
iVar18 = 0;
uVar14 = uVar17;
do {
iVar11 = 0;
iVar15 = (int)(short)uVar6;
fVar21 = DAT_0800c504;
sVar1 = (short)uVar12;
do {
for (; (int)sVar1 < (int)(short)local_6c; sVar1 = sVar1 + 1) {
if (iVar15 < (short)uVar14) {
pfVar13 = (float *)(param_1 + (param_4 * (param_2 * sVar1 + iVar15) + iVar11) * 4)
;
iVar16 = iVar15;
do {
fVar20 = *pfVar13;
iVar16 = iVar16 + 1;
if (fVar21 < fVar20 != (NAN(fVar21) || NAN(fVar20))) {
fVar21 = fVar20;
}
pfVar13 = pfVar13 + param_4;
} while ((int)(short)iVar16 < (int)(short)uVar14);
}
}
iVar16 = param_4 * (iVar18 + iVar19 * uVar9) + iVar11;
iVar11 = (int)(short)((short)iVar11 + 1);
*(float *)(param_13 + iVar16 * 4) = fVar21;
fVar21 = DAT_0800c504;
sVar1 = (short)uVar12;
} while (iVar11 < param_4);
iVar18 = (int)(short)((short)iVar18 + 1);
uVar14 = uVar14 + uVar7 & 0xffff;
uVar6 = uVar6 + uVar7 & 0xffff;
} while (iVar18 < (int)uVar9);
iVar19 = (int)(short)((short)iVar19 + 1);
local_6c = local_6c + uVar8 & 0xffff;
uVar12 = uVar12 + uVar8 & 0xffff;
} while (iVar19 < (int)uVar10);
}
}
}
else if (((uVar10 != 0) && (uVar9 != 0)) && (param_4 != 0)) {
if (param_4 != 1) {
local_6c = local_6c - uVar12;
uVar12 = -uVar12;
local_40 = 0;
do {
local_50 = uVar12 & 0xffff;
uVar5 = local_50;
local_54 = local_6c & 0xffff;
uVar3 = local_54;
local_54._0_2_ = (short)local_6c;
local_50._0_2_ = (short)uVar12;
local_3c = 0;
uVar12 = uVar17 - uVar14;
uVar6 = -uVar14;
do {
local_60 = uVar6 & 0xffff;
uVar4 = local_60;
local_6c = uVar12 & 0xffff;
uVar2 = local_6c;
local_6c._0_2_ = (short)uVar12;
uVar12 = (uint)(short)local_6c;
local_60._0_2_ = (short)uVar6;
iVar19 = (int)(short)local_60;
iVar18 = 0;
fVar21 = DAT_0800c504;
sVar1 = (short)local_50;
do {
for (; iVar11 = (int)sVar1, iVar11 < (short)local_54; sVar1 = sVar1 + 1) {
if (((iVar19 < (int)uVar12) && (-1 < iVar11)) && (iVar11 < param_3)) {
iVar15 = iVar19;
if (iVar19 < 0) {
do {
iVar15 = (int)(short)((short)iVar15 + 1);
} while (iVar15 < (int)(uVar12 & (int)uVar12 >> 0x1f));
if ((int)uVar12 <= iVar15) goto LAB_0800c490;
}
do {
iVar16 = (int)(short)((short)iVar15 + 1);
if ((iVar15 < param_2) &&
(fVar20 = *(float *)(param_1 +
(param_4 * (param_2 * iVar11 + iVar15) + iVar18) * 4),
fVar21 < fVar20 != (NAN(fVar21) || NAN(fVar20)))) {
fVar21 = fVar20;
}
iVar15 = iVar16;
} while (iVar16 < (int)uVar12);
}
LAB_0800c490:
}
iVar11 = param_4 * (local_3c + local_40 * uVar9) + iVar18;
iVar18 = (int)(short)((short)iVar18 + 1);
*(float *)(param_13 + iVar11 * 4) = fVar21;
fVar21 = DAT_0800c504;
sVar1 = (short)local_50;
} while (iVar18 < param_4);
uVar12 = uVar2 + uVar7;
local_3c = (int)(short)((short)local_3c + 1);
uVar6 = uVar4 + uVar7;
} while (local_3c < (int)uVar9);
local_6c = uVar3 + uVar8;
local_40 = (int)(short)((short)local_40 + 1);
uVar12 = uVar5 + uVar8;
if ((int)uVar10 <= local_40) {
return;
}
} while( true );
}
local_6c = local_6c - uVar12;
local_50 = 0;
do {
local_54 = local_6c & 0xffff;
sVar1 = (short)local_6c;
iVar19 = 0;
uVar12 = uVar17 - uVar14;
uVar6 = -uVar14;
do {
local_60 = uVar6 & 0xffff;
uVar3 = local_60;
local_60._0_2_ = (short)uVar6;
iVar18 = (int)(short)local_60;
uVar6 = (uint)(short)uVar12;
fVar21 = DAT_0800c504;
if ((int)(short)(sVar1 - param_6) < (int)sVar1) {
iVar11 = (int)(short)(sVar1 - param_6);
do {
if (((iVar18 < (int)uVar6) && (-1 < iVar11)) && (iVar11 < param_3)) {
iVar15 = iVar18;
if (iVar18 < 0) {
do {
iVar15 = (int)(short)((short)iVar15 + 1);
} while (iVar15 < (int)(uVar6 & (int)uVar6 >> 0x1f));
if ((int)uVar6 <= iVar15) goto LAB_0800c2a8;
}
do {
if ((iVar15 < param_2) &&
(fVar20 = *(float *)(param_1 + (param_2 * iVar11 + iVar15) * 4),
fVar21 < fVar20 != (NAN(fVar21) || NAN(fVar20)))) {
fVar21 = fVar20;
}
iVar15 = (int)(short)((short)iVar15 + 1);
} while (iVar15 < (int)uVar6);
}
LAB_0800c2a8:
iVar11 = (int)(short)((short)iVar11 + 1);
} while (iVar11 < sVar1);
}
*(float *)(param_13 + (iVar19 + uVar9 * local_50) * 4) = fVar21;
uVar6 = uVar3 + uVar7;
iVar19 = (int)(short)((short)iVar19 + 1);
uVar12 = (uVar12 & 0xffff) + uVar7;
} while (iVar19 < (int)uVar9);
local_50 = (uint)(short)((short)local_50 + 1);
local_6c = local_54 + uVar8;
} while ((int)local_50 < (int)uVar10);
}
return;
}
void FUN_0800c5ec(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
undefined4 param_5,undefined4 param_6)
{
FUN_0800d080(param_2,param_1,param_6,param_5);
return;
}
void FUN_0800c608(uint *param_1)
{
int iVar1;
uint uVar2;
uint uVar3;
float *pfVar4;
float *pfVar5;
float *pfVar6;
uint uVar7;
float *pfVar8;
float *pfVar9;
float *pfVar10;
int iVar11;
float fVar12;
float *local_30;
uVar3 = param_1[5];
local_30 = (float *)*param_1;
pfVar10 = (float *)param_1[1];
pfVar5 = local_30 + uVar3 * param_1[6];
if (local_30 < pfVar5) {
uVar7 = param_1[4];
do {
pfVar8 = (float *)param_1[2];
if (local_30 < local_30 + uVar3) {
iVar11 = (uVar7 - 0x10 >> 4) + 1;
pfVar9 = local_30;
do {
uVar2 = uVar7;
pfVar4 = pfVar8;
pfVar6 = pfVar10;
fVar12 = DAT_0800c8b8;
if (0xf < uVar7) {
do {
uVar2 = uVar2 - 0x10;
fVar12 = fVar12 + pfVar6[1] * pfVar4[1] + *pfVar6 * *pfVar4 + pfVar6[2] * pfVar4[2] +
pfVar6[3] * pfVar4[3] + pfVar6[4] * pfVar4[4] +
pfVar6[5] * pfVar4[5] + pfVar6[6] * pfVar4[6] +
pfVar6[7] * pfVar4[7] + pfVar6[8] * pfVar4[8] +
pfVar6[9] * pfVar4[9] + pfVar6[10] * pfVar4[10] +
pfVar6[0xb] * pfVar4[0xb] + pfVar6[0xc] * pfVar4[0xc] +
pfVar6[0xd] * pfVar4[0xd] + pfVar6[0xe] * pfVar4[0xe] +
pfVar6[0xf] * pfVar4[0xf];
pfVar6 = pfVar6 + 0x10;
pfVar4 = pfVar4 + 0x10;
} while (0xf < uVar2);
uVar2 = uVar7 & 0xf;
pfVar4 = pfVar8 + iVar11 * 0x10;
pfVar6 = pfVar10 + iVar11 * 0x10;
}
if (3 < uVar2) {
fVar12 = fVar12 + pfVar6[1] * pfVar4[1] + *pfVar6 * *pfVar4 + pfVar6[2] * pfVar4[2] +
pfVar6[3] * pfVar4[3];
if ((3 < uVar2 - 4) &&
(fVar12 = fVar12 + pfVar6[5] * pfVar4[5] + pfVar6[4] * pfVar4[4] +
pfVar6[6] * pfVar4[6] + pfVar6[7] * pfVar4[7], 3 < uVar2 - 8)) {
fVar12 = fVar12 + pfVar4[9] * pfVar6[9] + pfVar4[8] * pfVar6[8] +
pfVar4[10] * pfVar6[10] + pfVar4[0xb] * pfVar6[0xb];
}
iVar1 = (uVar2 - 4 >> 2) + 1;
pfVar4 = pfVar4 + iVar1 * 4;
pfVar6 = pfVar6 + iVar1 * 4;
uVar2 = uVar2 & 3;
}
if (((uVar2 != 0) && (fVar12 = fVar12 + *pfVar6 * *pfVar4, uVar2 != 1)) &&
(fVar12 = fVar12 + pfVar6[1] * pfVar4[1], uVar2 != 2)) {
fVar12 = fVar12 + pfVar4[2] * pfVar6[2];
}
pfVar8 = pfVar8 + uVar7;
*pfVar9 = fVar12;
pfVar9 = pfVar9 + 1;
} while (pfVar9 < local_30 + uVar3);
uVar3 = param_1[5];
}
if (((float *)param_1[3] != (float *)0x0) && (uVar3 != 0)) {
*local_30 = *local_30 + *(float *)param_1[3];
uVar3 = param_1[5];
if (1 < uVar3) {
uVar7 = 1;
pfVar8 = local_30;
do {
pfVar8 = pfVar8 + 1;
iVar11 = uVar7 * 4;
uVar7 = uVar7 + 1;
*pfVar8 = *(float *)(param_1[3] + iVar11) + *pfVar8;
uVar3 = param_1[5];
} while (uVar7 < uVar3);
}
}
uVar7 = param_1[4];
local_30 = local_30 + uVar3;
pfVar10 = pfVar10 + uVar7;
} while (local_30 < pfVar5);
}
return;
}
void FUN_0800c8bc(float *param_1,int param_2,byte *param_3,int param_4,int param_5,float *param_6,
uint param_7,int param_8,int param_9)
{
float *pfVar1;
float *pfVar2;
float *pfVar3;
float *pfVar4;
float *pfVar5;
float *pfVar6;
bool bVar7;
byte *pbVar8;
byte *pbVar9;
byte *pbVar10;
byte bVar11;
float *pfVar12;
byte *pbVar13;
float *pfVar14;
uint uVar15;
int iVar16;
float *pfVar17;
uint uVar18;
byte *pbVar19;
float *pfVar20;
float *pfVar21;
float *pfVar22;
float fVar23;
float *local_44;
if (param_5 != 0) {
FUN_0800cdac(param_4,param_5,0x40);
param_4 = param_5;
}
if (param_1 + param_8 * param_9 <= param_1) {
return;
}
uVar15 = param_7 >> 3;
pfVar22 = (float *)(param_2 + uVar15 * 0x20);
pfVar20 = (float *)(param_2 + (param_7 & 0xfffffffe) * 4);
param_2 = param_2 + 0x20;
local_44 = param_1;
do {
pfVar21 = local_44 + param_8;
pfVar12 = local_44;
pbVar13 = param_3;
if (local_44 < pfVar21) {
do {
while( true ) {
pbVar19 = pbVar13;
fVar23 = DAT_0800cb08;
pfVar14 = (float *)(param_2 - 0x20);
if (uVar15 != 0) {
pbVar19 = pbVar13 + uVar15 * 4;
iVar16 = param_2;
do {
bVar11 = *pbVar13;
pfVar14 = (float *)(iVar16 + -0x1c);
pbVar8 = pbVar13 + 1;
pfVar17 = (float *)(iVar16 + -0x20);
pfVar1 = (float *)(iVar16 + -0x18);
pfVar2 = (float *)(iVar16 + -0x14);
pfVar3 = (float *)(iVar16 + -0x10);
pfVar4 = (float *)(iVar16 + -0xc);
pfVar5 = (float *)(iVar16 + -8);
pfVar6 = (float *)(iVar16 + -4);
pbVar9 = pbVar13 + 2;
pbVar10 = pbVar13 + 3;
pbVar13 = pbVar13 + 4;
iVar16 = iVar16 + 0x20;
fVar23 = fVar23 + *(float *)(param_4 + (bVar11 & 0xf) * 4) * *pfVar14 +
*(float *)(param_4 + (uint)(bVar11 >> 4) * 4) * *pfVar17 +
*(float *)(param_4 + (uint)(*pbVar8 >> 4) * 4) * *pfVar1 +
*(float *)(param_4 + (*pbVar8 & 0xf) * 4) * *pfVar2 +
*(float *)(param_4 + (uint)(*pbVar9 >> 4) * 4) * *pfVar3 +
*(float *)(param_4 + (*pbVar9 & 0xf) * 4) * *pfVar4 +
*(float *)(param_4 + (uint)(*pbVar10 >> 4) * 4) * *pfVar5 +
*(float *)(param_4 + (*pbVar10 & 0xf) * 4) * *pfVar6;
pfVar14 = pfVar22;
} while (pbVar13 != pbVar19);
}
if (pfVar14 < pfVar20) {
uVar18 = (int)pfVar20 + (-1 - (int)pfVar14);
pbVar13 = pbVar19 + -1;
pfVar17 = pfVar14;
do {
pbVar13 = pbVar13 + 1;
fVar23 = fVar23 + *(float *)(param_4 + (*pbVar13 & 0xf) * 4) * pfVar17[1] +
*(float *)(param_4 + (uint)(*pbVar13 >> 4) * 4) * *pfVar17;
pfVar17 = pfVar17 + 2;
} while (pbVar13 != pbVar19 + (uVar18 >> 3));
iVar16 = (uVar18 >> 3) + 1;
pbVar19 = pbVar19 + iVar16;
pfVar14 = pfVar14 + iVar16 * 2;
}
if ((param_7 & 1) != 0) break;
*pfVar12 = fVar23;
pfVar12 = pfVar12 + 1;
pbVar13 = pbVar19;
if (pfVar21 <= pfVar12) goto LAB_0800ca74;
}
*pfVar12 = fVar23 + *(float *)(param_4 + (uint)(*pbVar19 >> 4) * 4) * *pfVar14;
pfVar12 = pfVar12 + 1;
pbVar13 = pbVar19 + 1;
} while (pfVar12 < pfVar21);
LAB_0800ca74:
pfVar12 = local_44 + param_8;
}
if ((param_6 != (float *)0x0) && (param_8 != 0)) {
pfVar17 = pfVar12 + -param_8;
pfVar14 = param_6;
do {
fVar23 = *pfVar14;
pfVar14 = pfVar14 + 1;
*pfVar17 = *pfVar17 + fVar23;
pfVar17 = pfVar17 + 1;
} while (pfVar17 != pfVar12);
}
if (param_1 + param_8 * param_9 <= pfVar12) {
return;
}
pfVar20 = pfVar20 + param_7;
pfVar22 = pfVar22 + param_7;
param_2 = param_2 + param_7 * 4;
bVar7 = pfVar21 <= local_44;
local_44 = pfVar12;
if (bVar7) {
pfVar20 = param_6;
pfVar22 = pfVar12 + -param_8;
do {
do {
*pfVar22 = *pfVar20 + *pfVar22;
pfVar22 = pfVar22 + 1;
pfVar20 = pfVar20 + 1;
} while (pfVar22 != pfVar12);
pfVar20 = param_6;
pfVar22 = pfVar12 + -param_8;
} while( true );
}
} while( true );
}
void FUN_0800cb0c(float *param_1,float *param_2,byte *param_3,int param_4,int param_5,float *param_6
,uint param_7,int param_8,int param_9)
{
float *pfVar1;
float *pfVar2;
float *pfVar3;
float *pfVar4;
float *pfVar5;
float *pfVar6;
float *pfVar7;
uint uVar8;
float *pfVar9;
float *pfVar10;
float *pfVar11;
byte *pbVar12;
byte *pbVar13;
float *pfVar14;
byte *pbVar15;
float *pfVar16;
float *pfVar17;
uint uVar18;
float *pfVar19;
float fVar20;
pfVar11 = param_1 + param_8 * param_9;
if (param_5 != 0) {
FUN_0800cdac(param_4,param_5,0x400);
param_4 = param_5;
}
if (pfVar11 <= param_1) {
return;
}
uVar18 = param_7 >> 3;
pfVar17 = param_2 + uVar18 * 8;
pfVar14 = param_1 + param_8;
pfVar16 = param_2 + 8;
uVar8 = param_7 & 7;
pbVar12 = param_3;
pfVar19 = param_1;
if (pfVar14 <= param_1) goto joined_r0x0800cce2;
do {
do {
pfVar10 = param_2;
pbVar15 = pbVar12;
fVar20 = DAT_0800cd64;
if (uVar18 != 0) {
pbVar15 = pbVar12 + uVar18 * 8;
pfVar9 = pfVar16;
do {
pfVar10 = pfVar9 + -7;
pfVar1 = pfVar9 + -8;
pfVar2 = pfVar9 + -6;
pfVar3 = pfVar9 + -5;
pfVar4 = pfVar9 + -4;
pfVar5 = pfVar9 + -3;
pfVar6 = pfVar9 + -2;
pfVar7 = pfVar9 + -1;
pbVar13 = pbVar12 + 8;
pfVar9 = pfVar9 + 8;
fVar20 = fVar20 + *(float *)(param_4 + (uint)pbVar12[1] * 4) * *pfVar10 +
*(float *)(param_4 + (uint)*pbVar12 * 4) * *pfVar1 +
*(float *)(param_4 + (uint)pbVar12[2] * 4) * *pfVar2 +
*(float *)(param_4 + (uint)pbVar12[3] * 4) * *pfVar3 +
*(float *)(param_4 + (uint)pbVar12[4] * 4) * *pfVar4 +
*(float *)(param_4 + (uint)pbVar12[5] * 4) * *pfVar5 +
*(float *)(param_4 + (uint)pbVar12[6] * 4) * *pfVar6 +
*(float *)(param_4 + (uint)pbVar12[7] * 4) * *pfVar7;
pfVar10 = pfVar17;
pbVar12 = pbVar13;
} while (pbVar13 != pbVar15);
}
if (uVar8 != 0) {
fVar20 = fVar20 + *(float *)(param_4 + (uint)*pbVar15 * 4) * *pfVar10;
if (((((uVar8 != 1) &&
(fVar20 = fVar20 + *(float *)(param_4 + (uint)pbVar15[1] * 4) * pfVar10[1], uVar8 != 2
)) && (fVar20 = fVar20 + *(float *)(param_4 + (uint)pbVar15[2] * 4) * pfVar10[2],
uVar8 != 3)) &&
((fVar20 = fVar20 + pfVar10[3] * *(float *)(param_4 + (uint)pbVar15[3] * 4), uVar8 != 4
&& (fVar20 = fVar20 + pfVar10[4] * *(float *)(param_4 + (uint)pbVar15[4] * 4),
uVar8 != 5)))) &&
(fVar20 = fVar20 + pfVar10[5] * *(float *)(param_4 + (uint)pbVar15[5] * 4), uVar8 != 6))
{
fVar20 = fVar20 + *(float *)(param_4 + (uint)pbVar15[6] * 4) * pfVar10[6];
}
pbVar15 = pbVar15 + uVar8;
}
*param_1 = fVar20;
param_1 = param_1 + 1;
pbVar12 = pbVar15;
} while (param_1 < pfVar14);
param_1 = pfVar19 + param_8;
joined_r0x0800cce2:
do {
if ((param_6 != (float *)0x0) && (param_8 != 0)) {
pfVar9 = param_1 + -param_8;
pfVar10 = param_6;
do {
fVar20 = *pfVar10;
pfVar10 = pfVar10 + 1;
*pfVar9 = *pfVar9 + fVar20;
pfVar9 = pfVar9 + 1;
} while (param_1 != pfVar9);
}
if (pfVar11 <= param_1) {
return;
}
pfVar17 = pfVar17 + param_7;
pfVar16 = pfVar16 + param_7;
if (pfVar14 <= pfVar19) {
pfVar11 = param_6;
pfVar14 = param_1 + -param_8;
do {
do {
*pfVar14 = *pfVar11 + *pfVar14;
pfVar14 = pfVar14 + 1;
pfVar11 = pfVar11 + 1;
} while (pfVar14 != param_1);
pfVar11 = param_6;
pfVar14 = param_1 + -param_8;
} while( true );
}
pfVar14 = param_1 + param_8;
param_2 = pfVar16 + -8;
pbVar12 = param_3;
pfVar19 = param_1;
} while (pfVar14 <= param_1);
} while( true );
}
undefined8 FUN_0800cdac(char *param_1,char *param_2,uint param_3)
{
char cVar1;
char *pcVar2;
char *pcVar3;
char *pcVar4;
char *pcVar5;
undefined4 uVar6;
uint uVar7;
undefined4 uVar8;
undefined4 uVar9;
undefined4 uVar10;
undefined4 uVar11;
undefined4 uVar12;
undefined4 uVar13;
undefined4 uVar14;
int iVar15;
pcVar2 = param_1;
pcVar4 = param_2;
if ((param_1 != param_2) && (param_3 != 0)) {
if ((param_1 < param_2) && (pcVar3 = param_1 + param_3, param_2 < pcVar3)) {
param_2 = param_2 + param_3;
if (param_1 < pcVar3) {
do {
pcVar3 = pcVar3 + -1;
cVar1 = *pcVar3;
param_2 = param_2 + -1;
*param_2 = cVar1;
} while (param_1 != pcVar3);
return CONCAT44((int)cVar1,param_1);
}
}
else {
if (3 < param_3) {
uVar7 = (uint)param_2 & 3;
param_3 = param_3 - (4 - uVar7);
*param_2 = *param_1;
pcVar2 = param_1 + 1;
pcVar4 = param_2 + 1;
if (uVar7 != 3) {
param_2[1] = param_1[1];
pcVar2 = param_1 + 2;
pcVar4 = param_2 + 2;
if (0 < (int)(2 - uVar7)) {
param_2[2] = param_1[2];
pcVar2 = param_1 + 3;
pcVar4 = param_2 + 3;
if (uVar7 == 0) {
pcVar2 = param_1 + 4;
pcVar4 = param_2 + 4;
param_2[3] = param_1[3];
}
}
}
if (uVar7 == ((uint)param_1 & 3)) {
iVar15 = (param_3 >> 6) - 1;
if (param_3 >> 6 != 0) {
do {
uVar6 = *(undefined4 *)(pcVar2 + 4);
uVar8 = *(undefined4 *)(pcVar2 + 8);
uVar9 = *(undefined4 *)(pcVar2 + 0xc);
uVar11 = *(undefined4 *)(pcVar2 + 0x10);
uVar10 = *(undefined4 *)(pcVar2 + 0x14);
uVar12 = *(undefined4 *)(pcVar2 + 0x18);
uVar13 = *(undefined4 *)(pcVar2 + 0x1c);
pcVar3 = pcVar2 + 0x20;
*(undefined4 *)pcVar4 = *(undefined4 *)pcVar2;
*(undefined4 *)(pcVar4 + 4) = uVar6;
*(undefined4 *)(pcVar4 + 8) = uVar8;
*(undefined4 *)(pcVar4 + 0xc) = uVar9;
*(undefined4 *)(pcVar4 + 0x10) = uVar11;
*(undefined4 *)(pcVar4 + 0x14) = uVar10;
*(undefined4 *)(pcVar4 + 0x18) = uVar12;
*(undefined4 *)(pcVar4 + 0x1c) = uVar13;
uVar6 = *(undefined4 *)(pcVar2 + 0x24);
uVar8 = *(undefined4 *)(pcVar2 + 0x28);
uVar9 = *(undefined4 *)(pcVar2 + 0x2c);
uVar11 = *(undefined4 *)(pcVar2 + 0x30);
uVar10 = *(undefined4 *)(pcVar2 + 0x34);
uVar12 = *(undefined4 *)(pcVar2 + 0x38);
uVar13 = *(undefined4 *)(pcVar2 + 0x3c);
pcVar2 = pcVar2 + 0x40;
*(undefined4 *)(pcVar4 + 0x20) = *(undefined4 *)pcVar3;
*(undefined4 *)(pcVar4 + 0x24) = uVar6;
*(undefined4 *)(pcVar4 + 0x28) = uVar8;
*(undefined4 *)(pcVar4 + 0x2c) = uVar9;
*(undefined4 *)(pcVar4 + 0x30) = uVar11;
*(undefined4 *)(pcVar4 + 0x34) = uVar10;
*(undefined4 *)(pcVar4 + 0x38) = uVar12;
*(undefined4 *)(pcVar4 + 0x3c) = uVar13;
pcVar4 = pcVar4 + 0x40;
iVar15 = iVar15 + -1;
} while (iVar15 != -1);
}
if ((param_3 & 0x20) != 0) {
uVar6 = *(undefined4 *)pcVar2;
uVar8 = *(undefined4 *)(pcVar2 + 4);
uVar9 = *(undefined4 *)(pcVar2 + 8);
uVar11 = *(undefined4 *)(pcVar2 + 0xc);
uVar10 = *(undefined4 *)(pcVar2 + 0x10);
uVar12 = *(undefined4 *)(pcVar2 + 0x14);
uVar13 = *(undefined4 *)(pcVar2 + 0x18);
uVar14 = *(undefined4 *)(pcVar2 + 0x1c);
pcVar2 = pcVar2 + 0x20;
*(undefined4 *)pcVar4 = uVar6;
*(undefined4 *)(pcVar4 + 4) = uVar8;
*(undefined4 *)(pcVar4 + 8) = uVar9;
*(undefined4 *)(pcVar4 + 0xc) = uVar11;
*(undefined4 *)(pcVar4 + 0x10) = uVar10;
*(undefined4 *)(pcVar4 + 0x14) = uVar12;
*(undefined4 *)(pcVar4 + 0x18) = uVar13;
*(undefined4 *)(pcVar4 + 0x1c) = uVar14;
pcVar4 = pcVar4 + 0x20;
}
if ((param_3 & 0x10) != 0) {
uVar6 = *(undefined4 *)pcVar2;
uVar8 = *(undefined4 *)(pcVar2 + 4);
uVar9 = *(undefined4 *)(pcVar2 + 8);
uVar11 = *(undefined4 *)(pcVar2 + 0xc);
pcVar2 = pcVar2 + 0x10;
*(undefined4 *)pcVar4 = uVar6;
*(undefined4 *)(pcVar4 + 4) = uVar8;
*(undefined4 *)(pcVar4 + 8) = uVar9;
*(undefined4 *)(pcVar4 + 0xc) = uVar11;
pcVar4 = pcVar4 + 0x10;
}
if ((param_3 & 8) != 0) {
uVar6 = *(undefined4 *)pcVar2;
uVar8 = *(undefined4 *)(pcVar2 + 4);
pcVar2 = pcVar2 + 8;
*(undefined4 *)pcVar4 = uVar6;
*(undefined4 *)(pcVar4 + 4) = uVar8;
pcVar4 = pcVar4 + 8;
}
}
else {
for (uVar7 = param_3 >> 4; uVar7 != 0; uVar7 = uVar7 - 1) {
uVar6 = *(undefined4 *)pcVar2;
uVar8 = *(undefined4 *)(pcVar2 + 4);
pcVar3 = pcVar2 + 0xc;
uVar9 = *(undefined4 *)(pcVar2 + 8);
pcVar2 = pcVar2 + 0x10;
uVar11 = *(undefined4 *)pcVar3;
*(undefined4 *)pcVar4 = uVar6;
*(undefined4 *)(pcVar4 + 4) = uVar8;
*(undefined4 *)(pcVar4 + 8) = uVar9;
*(undefined4 *)(pcVar4 + 0xc) = uVar11;
pcVar4 = pcVar4 + 0x10;
}
if ((param_3 & 8) != 0) {
pcVar3 = pcVar2 + 4;
uVar6 = *(undefined4 *)pcVar2;
pcVar2 = pcVar2 + 8;
uVar8 = *(undefined4 *)pcVar3;
*(undefined4 *)pcVar4 = uVar6;
*(undefined4 *)(pcVar4 + 4) = uVar8;
pcVar4 = pcVar4 + 8;
}
}
pcVar3 = pcVar2;
pcVar5 = pcVar4;
if ((param_3 & 4) != 0) {
pcVar3 = pcVar2 + 4;
pcVar5 = pcVar4 + 4;
*(undefined4 *)pcVar4 = *(undefined4 *)pcVar2;
}
pcVar2 = pcVar3;
pcVar4 = pcVar5;
if ((param_3 & 2) != 0) {
pcVar2 = pcVar3 + 2;
pcVar4 = pcVar5 + 2;
*(undefined2 *)pcVar5 = *(undefined2 *)pcVar3;
}
if ((param_3 & 1) != 0) {
*pcVar4 = *pcVar2;
}
return CONCAT44(pcVar4,pcVar2);
}
*param_2 = *param_1;
pcVar2 = param_1 + 1;
pcVar4 = param_2 + 1;
if (param_3 != 1) {
param_2[1] = param_1[1];
pcVar2 = param_1 + 2;
pcVar4 = param_2 + 2;
if (param_3 != 2) {
param_2[2] = param_1[2];
return CONCAT44(param_2 + 3,param_1 + 3);
}
}
}
}
return CONCAT44(pcVar4,pcVar2);
}
uint FUN_0800cef0(uint param_1)
{
uint uVar1;
uint uVar2;
if ((param_1 << 0xb) >> 0x1c == 2) {
uVar1 = DAT_0800cfcc & param_1 | 0x40000;
}
else {
uVar2 = param_1 & 0x1ffffff;
uVar1 = uVar2;
if (uVar2 != DAT_0800cfb0) {
if ((int)DAT_0800cfb0 < (int)uVar2) {
if (uVar2 != DAT_0800cfc4) {
if ((int)DAT_0800cfc4 < (int)uVar2) {
if ((uVar2 != DAT_0800cfc8) && (uVar2 != DAT_0800cfc8 + 0x7f1)) {
uVar1 = DAT_0800cfc8 - 0xf;
if (uVar2 != uVar1) {
uVar1 = 0x40;
}
return param_1 & 0x68000000 | uVar1;
}
}
else if (((uVar2 != DAT_0800cfc4 - 0x387) && (uVar2 != DAT_0800cfc4 - 7)) &&
(uVar1 = DAT_0800cfc4 - 0x407, uVar2 != DAT_0800cfc4 - 0x407)) {
uVar1 = 0x40;
}
}
}
else if (uVar2 != DAT_0800cfb4) {
if ((int)DAT_0800cfb4 < (int)uVar2) {
if (((uVar2 != DAT_0800cfb8) && (uVar2 != DAT_0800cfb8 + 0x1f400)) &&
(uVar1 = DAT_0800cfbc, uVar2 != DAT_0800cfbc)) {
uVar1 = 0x40;
}
}
else if (uVar2 != DAT_0800cfb4 - 0x400) {
if ((int)(DAT_0800cfb4 - 0x400) < (int)uVar2) {
uVar1 = DAT_0800cfc0;
if (uVar2 != DAT_0800cfc0) {
uVar1 = 0x40;
}
return param_1 & 0x68000000 | uVar1;
}
if ((uVar2 != DAT_0800cfb4 - 0x800) &&
(uVar1 = DAT_0800cfb4 - 0x780, uVar2 != DAT_0800cfb4 - 0x780)) {
uVar1 = 0x40;
}
}
}
}
}
return param_1 & 0x68000000 | uVar1;
}
uint FUN_0800cfd0(int param_1,int param_2)
{
uint uVar1;
uint uVar2;
int iVar3;
uint uVar4;
bool bVar5;
if (param_2 == 0) {
return 0;
}
uVar2 = (uint)(param_1 << 0x12) >> 0x19;
bVar5 = -1 < (-0x111 >> ((uint)(param_1 << 0xb) >> 0x1c)) << 0x1f;
uVar4 = (uint)(param_1 << 9) >> 0x1e;
uVar1 = param_1 >> 7;
if (bVar5) {
uVar1 = uVar1 & 0x7f;
}
if (bVar5) {
uVar1 = (int)uVar1 >> uVar4;
}
if (bVar5) {
iVar3 = uVar2 << (uVar1 & 0xff);
}
else {
iVar3 = 0;
}
return ((uVar2 * param_2 + 7 & 0xfffffff8) >> uVar4) + 7 + iVar3 >> 3;
}
uint FUN_0800d020(int param_1,int param_2)
{
if (param_2 != 0) {
return ((((uint)(param_1 << 0x12) >> 0x19) * param_2 + 7 & 0xfffffff8) >>
((uint)(param_1 << 9) >> 0x1e)) + 7 >> 3;
}
return 0;
}
uint FUN_0800d044(int param_1,int param_2,int param_3)
{
return param_3 << 8 | param_2 << 0x10 | param_1 << 0x18;
}
uint FUN_0800d050(int param_1)
{
uint uVar1;
uVar1 = *(int *)(*(int *)(param_1 + 0x14) + 0xc) * *(int *)(*(int *)(param_1 + 0xc) + 0xc);
if ((**(uint **)(param_1 + 0x18) & 0x17fffff) == DAT_0800d07c) {
uVar1 = uVar1 + 7 >> 3;
}
return uVar1;
}
void FUN_0800d080(int param_1,float *param_2,int param_3,uint param_4,float *param_5,float *param_6)
{
float *pfVar1;
float *pfVar2;
float *pfVar3;
uint uVar4;
uint uVar5;
float *pfVar6;
float *pfVar7;
float fVar8;
float fVar9;
float fVar10;
if (param_6 == (float *)0x0) {
if (param_4 != 0) {
pfVar3 = (float *)(param_1 + param_3 * 4);
uVar4 = 0;
do {
uVar5 = uVar4 + param_3;
if (uVar4 < uVar5) {
pfVar1 = pfVar3 + -param_3;
pfVar2 = param_2;
pfVar7 = param_5;
do {
fVar9 = *pfVar1;
pfVar1 = pfVar1 + 1;
fVar8 = *pfVar7;
pfVar7 = pfVar7 + 1;
*pfVar2 = fVar9 * fVar8;
pfVar2 = pfVar2 + 1;
} while (pfVar1 != pfVar3);
}
param_2 = param_2 + param_3;
pfVar3 = pfVar3 + param_3;
uVar4 = uVar5;
} while (uVar5 < param_4);
return;
}
}
else if (param_4 != 0) {
pfVar3 = (float *)(param_1 + param_3 * 4);
uVar4 = 0;
do {
uVar5 = uVar4 + param_3;
if (uVar4 < uVar5) {
pfVar1 = pfVar3 + -param_3;
pfVar6 = param_2 + uVar4;
pfVar2 = param_5;
pfVar7 = param_6;
do {
fVar8 = *pfVar1;
pfVar1 = pfVar1 + 1;
fVar9 = *pfVar2;
pfVar2 = pfVar2 + 1;
fVar10 = *pfVar7;
pfVar7 = pfVar7 + 1;
*pfVar6 = fVar10 + fVar8 * fVar9;
pfVar6 = pfVar6 + 1;
} while (pfVar1 != pfVar3);
}
pfVar3 = pfVar3 + param_3;
uVar4 = uVar5;
} while (uVar5 < param_4);
}
return;
}
void sendMidiCommand(undefined4 *param_1,undefined4 *param_2,uint param_3)
{
undefined4 *puVar1;
undefined4 uVar2;
undefined4 *puVar3;
uint uVar4;
uint uVar5;
uVar5 = param_3 >> 2;
if (uVar5 != 0) {
puVar3 = param_1 + 4;
puVar1 = param_2 + 4;
uVar4 = uVar5;
do {
puVar1[-4] = puVar3[-4];
puVar1[-3] = puVar3[-3];
puVar1[-2] = puVar3[-2];
puVar1[-1] = puVar3[-1];
uVar4 = uVar4 - 1;
puVar3 = puVar3 + 4;
puVar1 = puVar1 + 4;
} while (uVar4 != 0);
param_1 = param_1 + uVar5 * 4;
param_2 = param_2 + uVar5 * 4;
}
param_3 = param_3 & 3;
if ((param_3 != 0) && (*param_2 = *param_1, param_3 != 1)) {
uVar2 = param_1[1];
param_2[1] = uVar2;
if (param_3 != 2) {
uVar2 = param_1[2];
}
if (param_3 != 2) {
param_2[2] = uVar2;
}
}
return;
}
void FUN_0800d168(float *param_1,uint param_2,float *param_3)
{
float *pfVar1;
float *pfVar2;
float *pfVar3;
float *pfVar4;
float *pfVar5;
uint uVar6;
uint uVar7;
uint in_fpscr;
float fVar8;
float fVar9;
uVar7 = param_2 >> 2;
fVar9 = DAT_0800d1e0;
if (uVar7 != 0) {
pfVar5 = param_1 + 4;
uVar6 = uVar7;
do {
pfVar1 = pfVar5 + -4;
pfVar2 = pfVar5 + -3;
pfVar3 = pfVar5 + -2;
pfVar4 = pfVar5 + -1;
uVar6 = uVar6 - 1;
pfVar5 = pfVar5 + 4;
fVar9 = fVar9 + *pfVar1 + *pfVar2 + *pfVar3 + *pfVar4;
} while (uVar6 != 0);
param_1 = param_1 + uVar7 * 4;
}
uVar7 = param_2 & 3;
if ((uVar7 != 0) && (fVar9 = fVar9 + *param_1, uVar7 != 1)) {
fVar9 = fVar9 + param_1[1];
if (uVar7 != 2) {
fVar9 = fVar9 + param_1[2];
}
}
fVar8 = (float)VectorUnsignedToFloat(param_2,(byte)(in_fpscr >> 0x15) & 3);
*param_3 = fVar9 / fVar8;
return;
}
void FUN_0800d1e4(float *param_1,int param_2,float *param_3,uint *param_4)
{
int iVar1;
int iVar2;
uint uVar3;
uint uVar4;
float *pfVar5;
uint uVar6;
uint uVar7;
float fVar8;
float fVar9;
uVar6 = param_2 - 1;
uVar7 = uVar6 >> 2;
fVar9 = *param_1;
pfVar5 = param_1 + 1;
if (uVar7 == 0) {
uVar4 = 0;
}
else {
param_1 = param_1 + 5;
uVar3 = 4;
uVar4 = 0;
do {
iVar2 = (uint)(fVar9 < param_1[-4]) << 0x1f;
if (iVar2 < 0) {
fVar9 = param_1[-4];
}
iVar1 = (uint)(fVar9 < param_1[-3]) << 0x1f;
if (iVar2 < 0) {
uVar4 = uVar3 - 3;
}
if (iVar1 < 0) {
fVar9 = param_1[-3];
}
iVar2 = (uint)(fVar9 < param_1[-2]) << 0x1f;
if (iVar1 < 0) {
uVar4 = uVar3 - 2;
}
if (iVar2 < 0) {
fVar9 = param_1[-2];
}
iVar1 = (uint)(fVar9 < param_1[-1]) << 0x1f;
if (iVar2 < 0) {
uVar4 = uVar3 - 1;
}
if (iVar1 < 0) {
uVar4 = uVar3;
}
uVar3 = uVar3 + 4;
if (iVar1 < 0) {
fVar9 = param_1[-1];
}
param_1 = param_1 + 4;
} while (uVar3 != (uVar7 + 1) * 4);
pfVar5 = pfVar5 + uVar7 * 4;
}
uVar7 = uVar6 & 3;
if (uVar7 != 0) {
fVar8 = *pfVar5;
if (fVar8 != fVar9 && fVar8 < fVar9 == (NAN(fVar8) || NAN(fVar9))) {
uVar4 = param_2 - uVar7;
fVar9 = fVar8;
}
iVar2 = uVar7 - 1;
if (iVar2 != 0) {
if ((int)((uint)(fVar9 < pfVar5[1]) << 0x1f) < 0) {
uVar4 = param_2 - iVar2;
fVar9 = pfVar5[1];
}
if ((iVar2 != 1) && ((int)((uint)(fVar9 < pfVar5[2]) << 0x1f) < 0)) {
uVar4 = uVar6;
fVar9 = pfVar5[2];
}
}
}
*param_3 = fVar9;
*param_4 = uVar4;
return;
}
undefined4 FUN_0800d3f4(undefined4 param_1,uint param_2)
{
undefined4 uVar1;
code *UNRECOVERED_JUMPTABLE;
UNRECOVERED_JUMPTABLE = DAT_0800d464;
if (param_2 != 0x200) {
if (param_2 < 0x201) {
UNRECOVERED_JUMPTABLE = DAT_0800d460;
if (param_2 != 0x80) {
if (param_2 < 0x81) {
UNRECOVERED_JUMPTABLE = DAT_0800d458;
if ((param_2 != 0x20) && (UNRECOVERED_JUMPTABLE = DAT_0800d450, param_2 != 0x40)) {
return 0xffffffff;
}
}
else {
UNRECOVERED_JUMPTABLE = DAT_0800d448;
if (param_2 != 0x100) {
return 0xffffffff;
}
}
}
}
else {
UNRECOVERED_JUMPTABLE = DAT_0800d45c;
if (param_2 != 0x800) {
if (param_2 == 0x1000) {
// WARNING: Could not recover jumptable at 0x0800d41a. Too many branches
// WARNING: Treating indirect jump as call
uVar1 = (*DAT_0800d44c)();
return uVar1;
}
UNRECOVERED_JUMPTABLE = DAT_0800d454;
if (param_2 != 0x400) {
return 0xffffffff;
}
}
}
}
// WARNING: Could not recover jumptable at 0x0800d40a. Too many branches
// WARNING: Treating indirect jump as call
uVar1 = (*UNRECOVERED_JUMPTABLE)();
return uVar1;
}
void FUN_0800d51c(ushort *param_1,float *param_2,float *param_3)
{
int iVar1;
float *pfVar2;
int iVar3;
float fVar4;
float fVar5;
float fVar6;
float fVar7;
float fVar8;
float fVar9;
fVar8 = *param_2;
fVar6 = param_2[1];
iVar1 = *(int *)(param_1 + 10);
iVar3 = *param_1 - 1;
*param_3 = (fVar8 + fVar6) * 0.5;
param_3[1] = (fVar8 - fVar6) * 0.5;
if (iVar3 != 0) {
pfVar2 = param_2 + iVar3 * 2 + -2;
iVar1 = iVar1 + 0x10;
param_3 = param_3 + 4;
param_2 = param_2 + 4;
do {
fVar7 = *(float *)(iVar1 + -8);
fVar6 = pfVar2[3];
fVar9 = param_2[-1];
fVar5 = *(float *)(iVar1 + -4);
fVar4 = param_2[-2] - pfVar2[2];
fVar8 = fVar6 + fVar9;
iVar3 = iVar3 + -1;
param_3[-2] = (((pfVar2[2] + param_2[-2]) - fVar7 * fVar4) - fVar5 * fVar8) * 0.5;
param_3[-1] = (((fVar9 - fVar6) + fVar5 * fVar4) - fVar7 * fVar8) * 0.5;
pfVar2 = pfVar2 + -2;
param_2 = param_2 + 2;
iVar1 = iVar1 + 8;
param_3 = param_3 + 2;
} while (iVar3 != 0);
}
return;
}
void FUN_0800d5c8(ushort *param_1,float *param_2,float *param_3,int param_4)
{
int iVar1;
float *pfVar2;
float *pfVar3;
int iVar4;
float fVar5;
float fVar6;
float fVar7;
float fVar8;
float fVar9;
float fVar10;
if (param_4 != 0) {
FUN_0800d51c();
FUN_0800dc50(param_1,param_3,param_4,1);
return;
}
FUN_0800dc50(param_1,param_2,0,1);
iVar1 = *(int *)(param_1 + 10);
fVar8 = param_2[1] + param_2[1];
fVar9 = *param_2 + *param_2;
iVar4 = *param_1 - 1;
*param_3 = (fVar9 + fVar8) * 0.5;
param_3[1] = (fVar9 - fVar8) * 0.5;
iVar1 = iVar1 + 0x10;
param_3 = param_3 + 4;
pfVar2 = param_2 + 4;
pfVar3 = param_2 + iVar4 * 2;
do {
fVar7 = *(float *)(iVar1 + -8);
fVar8 = pfVar3[1];
fVar10 = pfVar2[-1];
fVar6 = *(float *)(iVar1 + -4);
fVar5 = *pfVar3 - pfVar2[-2];
fVar9 = fVar8 + fVar10;
iVar4 = iVar4 + -1;
param_3[-2] = (*pfVar3 + pfVar2[-2] + fVar7 * fVar5 + fVar6 * fVar9) * 0.5;
param_3[-1] = (((fVar10 - fVar8) + fVar6 * fVar5) - fVar7 * fVar9) * 0.5;
pfVar2 = pfVar2 + 2;
iVar1 = iVar1 + 8;
param_3 = param_3 + 2;
pfVar3 = pfVar3 + -2;
} while (iVar4 != 0);
return;
}
void FUN_0800d600(ushort *param_1,int param_2)
{
ushort uVar1;
ushort uVar2;
float *pfVar3;
float *pfVar4;
int iVar5;
float *pfVar6;
int iVar7;
float *pfVar8;
int iVar9;
float fVar10;
float fVar11;
float fVar12;
float fVar13;
float fVar14;
float fVar15;
float fVar16;
float fVar17;
float fVar18;
float fVar19;
float fVar20;
float fVar21;
float fVar22;
float fVar23;
float fVar24;
float fVar25;
uVar1 = *param_1;
pfVar4 = *(float **)(param_1 + 2);
pfVar8 = (float *)(param_2 + (uint)uVar1 * 4);
uVar2 = uVar1 >> 1;
if (uVar1 >> 3 != 0) {
iVar5 = param_2 + 0x10;
iVar7 = param_2 + (uint)uVar2 * 4 + 0x10;
pfVar6 = pfVar8 + uVar2 + 4;
iVar9 = iVar5 + (uint)(uVar1 >> 3) * 0x10;
pfVar3 = pfVar8;
do {
fVar14 = *pfVar3;
fVar15 = pfVar3[1];
fVar19 = pfVar6[-4];
fVar18 = pfVar6[-3];
fVar22 = pfVar6[-2];
fVar21 = pfVar6[-1];
fVar17 = *(float *)(iVar5 + -0x10);
fVar10 = pfVar3[2];
fVar11 = pfVar3[3];
fVar23 = *(float *)(iVar7 + -0x10);
fVar16 = *(float *)(iVar7 + -0xc);
fVar24 = *(float *)(iVar5 + -0xc);
fVar20 = *(float *)(iVar5 + -8);
fVar25 = *(float *)(iVar5 + -4);
fVar12 = *(float *)(iVar7 + -8);
fVar13 = *(float *)(iVar7 + -4);
*(float *)(iVar5 + -0x10) = fVar17 + fVar14;
*(float *)(iVar5 + -0xc) = fVar24 + fVar15;
*(float *)(iVar5 + -8) = fVar20 + fVar10;
*(float *)(iVar5 + -4) = fVar25 + fVar11;
*(float *)(iVar7 + -4) = fVar13 + fVar21;
*(float *)(iVar7 + -0x10) = fVar23 + fVar19;
*(float *)(iVar7 + -0xc) = fVar16 + fVar18;
*(float *)(iVar7 + -8) = fVar12 + fVar22;
fVar24 = fVar24 - fVar15;
fVar19 = fVar19 - fVar23;
fVar18 = fVar18 - fVar16;
fVar16 = pfVar4[1];
fVar15 = *pfVar4;
fVar17 = fVar17 - fVar14;
pfVar3[1] = fVar24 * fVar15 - fVar17 * fVar16;
*pfVar3 = fVar17 * fVar15 + fVar24 * fVar16;
pfVar6[-4] = fVar19 * fVar16 - fVar18 * fVar15;
pfVar6[-3] = fVar18 * fVar16 + fVar19 * fVar15;
fVar14 = pfVar4[3];
fVar22 = fVar22 - fVar12;
fVar20 = fVar20 - fVar10;
fVar21 = fVar21 - fVar13;
fVar25 = fVar25 - fVar11;
fVar10 = pfVar4[2];
iVar5 = iVar5 + 0x10;
pfVar3[2] = fVar20 * fVar10 + fVar25 * fVar14;
iVar7 = iVar7 + 0x10;
pfVar3[3] = fVar25 * fVar10 - fVar20 * fVar14;
pfVar6[-2] = fVar22 * fVar14 - fVar21 * fVar10;
pfVar6[-1] = fVar21 * fVar14 + fVar22 * fVar10;
pfVar6 = pfVar6 + 4;
pfVar4 = pfVar4 + 4;
pfVar3 = pfVar3 + 4;
} while (iVar5 != iVar9);
pfVar4 = *(float **)(param_1 + 2);
}
FUN_0800e328(param_2,uVar2,pfVar4,2);
FUN_0800e328(pfVar8,uVar2,*(undefined4 *)(param_1 + 2),2);
return;
}
void FUN_0800d7a4(ushort *param_1,float *param_2)
{
ushort uVar1;
float *pfVar2;
uint uVar3;
uint uVar4;
int iVar5;
float *pfVar6;
uint uVar7;
float *pfVar8;
float *pfVar9;
float *pfVar10;
float *pfVar11;
float *pfVar12;
float *pfVar13;
float *pfVar14;
int iVar15;
float *pfVar16;
float *pfVar17;
float *pfVar18;
float fVar19;
float fVar20;
float fVar21;
float fVar22;
float fVar23;
float fVar24;
float fVar25;
float fVar26;
float fVar27;
float fVar28;
float fVar29;
float fVar30;
float fVar31;
float fVar32;
float fVar33;
float fVar34;
float fVar35;
float fVar36;
float fVar37;
float fVar38;
float fVar39;
float fVar40;
float *local_80;
float *local_7c;
float *local_78;
float *local_74;
float *local_70;
float *local_6c;
float *local_68;
uVar1 = *param_1;
iVar5 = *(int *)(param_1 + 2);
uVar7 = (uint)(uVar1 >> 1);
pfVar2 = param_2 + uVar7 * 2;
fVar20 = pfVar2[1];
pfVar11 = param_2 + uVar7;
fVar30 = *pfVar11;
fVar21 = pfVar11[1];
fVar26 = *param_2 + *pfVar2;
pfVar14 = pfVar2 + uVar7;
fVar22 = *pfVar14;
fVar19 = pfVar14[1];
fVar32 = *param_2 - *pfVar2;
*param_2 = fVar30 + fVar26 + fVar22;
fVar28 = param_2[1] + fVar20;
fVar20 = param_2[1] - fVar20;
local_78 = param_2 + 2;
local_68 = pfVar11 + 2;
local_6c = pfVar2 + 2;
uVar3 = (uint)(uVar1 >> 2);
local_7c = (float *)(iVar5 + 8);
local_80 = (float *)(iVar5 + 0x18);
local_74 = (float *)(iVar5 + 0x10);
local_70 = pfVar14 + 2;
uVar4 = uVar3 - 2 >> 1;
param_2[1] = fVar28 + pfVar11[1] + pfVar14[1];
*pfVar11 = (fVar21 + fVar32) - fVar19;
pfVar11[1] = (fVar20 - fVar30) + fVar22;
*pfVar2 = (fVar26 - fVar30) - fVar22;
pfVar2[1] = (fVar28 - fVar21) - fVar19;
*pfVar14 = (fVar32 - fVar21) + fVar19;
pfVar14[1] = (fVar30 + fVar20) - fVar22;
if (uVar4 != 0) {
pfVar17 = pfVar11 + -3;
pfVar10 = pfVar11 + 4;
iVar15 = iVar5 + 0x20;
iVar5 = iVar5 + 0x30;
pfVar13 = pfVar2 + 4;
pfVar8 = pfVar14 + (uVar7 - 3);
pfVar18 = param_2 + 4;
pfVar9 = pfVar2 + -3;
pfVar12 = pfVar14 + -3;
pfVar6 = pfVar14 + 4;
uVar7 = uVar4;
pfVar16 = local_74;
do {
fVar33 = pfVar10[-2];
fVar22 = pfVar6[-2];
fVar21 = pfVar6[-1];
fVar34 = pfVar10[-1];
fVar32 = pfVar18[-2] + pfVar13[-2];
fVar27 = pfVar18[-1] + pfVar13[-1];
fVar19 = pfVar18[-1] - pfVar13[-1];
fVar25 = pfVar18[-2] - pfVar13[-2];
pfVar18[-2] = fVar33 + fVar32 + fVar22;
pfVar18[-1] = fVar27 + pfVar10[-1] + pfVar6[-1];
fVar40 = pfVar9[2];
fVar37 = pfVar8[2];
fVar24 = pfVar8[1];
fVar20 = pfVar9[1];
fVar29 = pfVar17[2] + pfVar12[2];
fVar26 = pfVar17[2] - pfVar12[2];
fVar23 = pfVar17[1] + pfVar12[1];
fVar28 = pfVar17[1] - pfVar12[1];
pfVar17[2] = fVar40 + fVar29 + fVar37;
pfVar17[1] = fVar23 + pfVar9[1] + pfVar8[1];
fVar31 = pfVar16[-1];
fVar38 = pfVar16[-2];
fVar35 = (fVar40 - fVar37) + fVar28;
fVar36 = (fVar26 - fVar20) + fVar24;
fVar39 = (fVar34 + fVar25) - fVar21;
fVar30 = (fVar19 - fVar33) + fVar22;
pfVar10[-2] = fVar39 * fVar38 + fVar30 * fVar31;
pfVar10[-1] = fVar30 * fVar38 - fVar39 * fVar31;
pfVar9[1] = fVar35 * fVar31 + fVar36 * fVar38;
pfVar9[2] = fVar36 * fVar31 - fVar35 * fVar38;
fVar30 = *(float *)(iVar15 + -0x10);
fVar31 = (fVar29 - fVar40) - fVar37;
fVar23 = (fVar23 - fVar20) - fVar24;
fVar29 = *(float *)(iVar15 + -0xc);
fVar32 = (fVar32 - fVar33) - fVar22;
fVar27 = (fVar27 - fVar34) - fVar21;
pfVar13[-2] = fVar32 * fVar30 + fVar27 * fVar29;
pfVar13[-1] = fVar27 * fVar30 - fVar32 * fVar29;
pfVar12[1] = fVar31 * fVar29 - fVar23 * fVar30;
pfVar12[2] = -(fVar31 * fVar30) - fVar23 * fVar29;
fVar21 = (fVar25 - fVar34) + fVar21;
fVar26 = (fVar24 - fVar20) - fVar26;
fVar20 = *(float *)(iVar5 + -0x18);
fVar30 = *(float *)(iVar5 + -0x14);
fVar28 = (fVar40 - fVar37) - fVar28;
fVar22 = (fVar33 + fVar19) - fVar22;
uVar7 = uVar7 - 1;
pfVar6[-2] = fVar21 * fVar20 + fVar22 * fVar30;
pfVar6[-1] = fVar22 * fVar20 - fVar21 * fVar30;
pfVar18 = pfVar18 + 2;
pfVar8[2] = fVar26 * fVar30 - fVar28 * fVar20;
pfVar8[1] = fVar28 * fVar30 + fVar26 * fVar20;
pfVar17 = pfVar17 + -2;
pfVar16 = pfVar16 + 2;
pfVar10 = pfVar10 + 2;
pfVar9 = pfVar9 + -2;
iVar15 = iVar15 + 0x10;
pfVar13 = pfVar13 + 2;
pfVar12 = pfVar12 + -2;
iVar5 = iVar5 + 0x18;
pfVar6 = pfVar6 + 2;
pfVar8 = pfVar8 + -2;
} while (uVar7 != 0);
local_78 = local_78 + uVar4 * 2;
local_7c = local_7c + uVar4 * 2;
local_68 = local_68 + uVar4 * 2;
local_74 = local_74 + uVar4 * 4;
local_6c = local_6c + uVar4 * 2;
local_70 = local_70 + uVar4 * 2;
local_80 = local_80 + uVar4 * 6;
}
fVar27 = *local_68;
fVar22 = *local_70;
fVar20 = local_70[1];
fVar25 = local_68[1];
fVar23 = *local_78 + *local_6c;
fVar32 = local_78[1] + local_6c[1];
fVar26 = local_78[1] - local_6c[1];
fVar24 = *local_78 - *local_6c;
*local_78 = fVar27 + fVar23 + fVar22;
local_78[1] = fVar32 + local_68[1] + local_70[1];
fVar19 = *local_7c;
fVar21 = local_7c[1];
fVar30 = (fVar26 - fVar27) + fVar22;
fVar28 = (fVar25 + fVar24) - fVar20;
*local_68 = fVar28 * fVar19 + fVar30 * fVar21;
local_68[1] = fVar30 * fVar19 - fVar28 * fVar21;
fVar30 = (fVar23 - fVar27) - fVar22;
fVar19 = local_74[1];
fVar21 = *local_74;
fVar28 = (fVar32 - fVar25) - fVar20;
local_6c[1] = fVar28 * fVar21 - fVar30 * fVar19;
*local_6c = fVar30 * fVar21 + fVar28 * fVar19;
fVar19 = local_80[1];
fVar21 = *local_80;
fVar20 = (fVar24 - fVar25) + fVar20;
fVar22 = (fVar27 + fVar26) - fVar22;
local_70[1] = fVar22 * fVar21 - fVar20 * fVar19;
*local_70 = fVar20 * fVar21 + fVar22 * fVar19;
FUN_0800e328(param_2,uVar3,*(undefined4 *)(param_1 + 2),4);
FUN_0800e328(pfVar11,uVar3,*(undefined4 *)(param_1 + 2),4);
FUN_0800e328(pfVar2,uVar3,*(undefined4 *)(param_1 + 2),4);
FUN_0800e328(pfVar14,uVar3,*(undefined4 *)(param_1 + 2),4);
return;
}
void FUN_0800dc50(ushort *param_1,int param_2,int param_3,int param_4)
{
int iVar1;
uint uVar2;
uint uVar3;
uint in_fpscr;
float fVar4;
uVar3 = (uint)*param_1;
if (param_3 == 1) {
if (uVar3 != 0) {
iVar1 = param_2 + 0xc;
uVar2 = 0;
do {
uVar2 = uVar2 + 1;
*(float *)(iVar1 + -8) = -*(float *)(iVar1 + -8);
iVar1 = iVar1 + 8;
} while (uVar3 != uVar2);
goto LAB_0800dc62;
}
if (param_4 == 0) {
return;
}
}
else {
LAB_0800dc62:
if (uVar3 == 0x100) {
LAB_0800dd12:
FUN_0800d7a4(param_1,param_2);
}
else {
if (uVar3 < 0x101) {
if (uVar3 == 0x40) goto LAB_0800dc9a;
if (uVar3 < 0x41) {
if (uVar3 == 0x10) goto LAB_0800dc74;
if (uVar3 == 0x20) goto LAB_0800dd12;
}
else if (uVar3 == 0x80) {
LAB_0800dc74:
FUN_0800d600(param_1,param_2);
}
goto joined_r0x0800dcaa;
}
if (uVar3 == 0x800) goto LAB_0800dd12;
if (uVar3 < 0x801) {
if (uVar3 == 0x200) goto LAB_0800dc9a;
if (uVar3 == 0x400) goto LAB_0800dc74;
}
else if (uVar3 == 0x1000) {
LAB_0800dc9a:
FUN_0800e328(param_2,uVar3,*(undefined4 *)(param_1 + 2),1,param_4);
}
}
joined_r0x0800dcaa:
if (param_4 == 0) goto joined_r0x0800dcba;
}
FUN_0800dd40(param_2,param_1[6],*(undefined4 *)(param_1 + 4));
joined_r0x0800dcba:
if (param_3 == 1) {
fVar4 = (float)VectorUnsignedToFloat(uVar3,(byte)(in_fpscr >> 0x15) & 3);
if (uVar3 != 0) {
uVar2 = 0;
iVar1 = param_2 + 8;
do {
uVar2 = uVar2 + 1;
*(float *)(iVar1 + -8) = *(float *)(iVar1 + -8) * (1.0 / fVar4);
*(float *)(iVar1 + -4) = -(*(float *)(iVar1 + -4) * (1.0 / fVar4));
iVar1 = iVar1 + 8;
} while (uVar3 != uVar2);
return;
}
}
return;
}
void FUN_0800dd40(int param_1,uint param_2,int param_3)
{
uint uVar1;
int iVar2;
uint uVar3;
int iVar4;
uint uVar5;
undefined4 uVar6;
if (param_2 != 0) {
uVar5 = 0;
do {
uVar3 = (uint)(*(ushort *)(param_3 + 2 + uVar5 * 2) >> 2);
uVar1 = (uint)(*(ushort *)(param_3 + uVar5 * 2) >> 2);
uVar6 = *(undefined4 *)(param_1 + uVar1 * 4);
*(undefined4 *)(param_1 + uVar1 * 4) = *(undefined4 *)(param_1 + uVar3 * 4);
*(undefined4 *)(param_1 + uVar3 * 4) = uVar6;
iVar2 = uVar1 * 4 + 4;
iVar4 = uVar3 * 4 + 4;
uVar5 = uVar5 + 2;
uVar6 = *(undefined4 *)(param_1 + iVar2);
*(undefined4 *)(param_1 + iVar2) = *(undefined4 *)(param_1 + iVar4);
*(undefined4 *)(param_1 + iVar4) = uVar6;
} while (uVar5 < param_2);
return;
}
return;
}
undefined4
FUN_0800dd80(undefined1 *param_1,int param_2,uint param_3,undefined4 param_4,undefined4 param_5,
uint param_6)
{
if (param_6 == param_3 * (param_6 / param_3)) {
*(short *)(param_1 + 2) = (short)param_2;
*(undefined4 *)(param_1 + 4) = param_4;
FUN_08012484(param_5,0,(param_2 + -1 + param_6) * 4,param_4,param_4);
*(undefined4 *)(param_1 + 8) = param_5;
*param_1 = (char)param_3;
return 0;
}
return 0xfffffffe;
}
void FUN_0800ddb4(float *param_1,float *param_2,uint param_3)
{
float *pfVar1;
float *pfVar2;
uint uVar3;
uint uVar4;
float fVar5;
uVar4 = param_3 >> 2;
if (uVar4 != 0) {
pfVar1 = param_1 + 8;
pfVar2 = param_2 + 4;
uVar3 = uVar4;
do {
fVar5 = pfVar1[-8] * pfVar1[-8] + pfVar1[-7] * pfVar1[-7];
if (fVar5 < 0.0 == NAN(fVar5)) {
if ((int)((uint)(fVar5 < 0.0) << 0x1f) < 0) {
FUN_0800ea48();
}
pfVar2[-4] = SQRT(fVar5);
}
else {
pfVar2[-4] = 0.0;
}
fVar5 = pfVar1[-6] * pfVar1[-6] + pfVar1[-5] * pfVar1[-5];
if (fVar5 < 0.0 == NAN(fVar5)) {
if ((int)((uint)(fVar5 < 0.0) << 0x1f) < 0) {
FUN_0800ea48();
}
pfVar2[-3] = SQRT(fVar5);
}
else {
pfVar2[-3] = 0.0;
}
fVar5 = pfVar1[-4] * pfVar1[-4] + pfVar1[-3] * pfVar1[-3];
if (fVar5 < 0.0 == NAN(fVar5)) {
if ((int)((uint)(fVar5 < 0.0) << 0x1f) < 0) {
FUN_0800ea48();
}
pfVar2[-2] = SQRT(fVar5);
}
else {
pfVar2[-2] = 0.0;
}
fVar5 = pfVar1[-2] * pfVar1[-2] + pfVar1[-1] * pfVar1[-1];
if (fVar5 < 0.0 == NAN(fVar5)) {
if ((int)((uint)(fVar5 < 0.0) << 0x1f) < 0) {
FUN_0800ea48();
}
pfVar2[-1] = SQRT(fVar5);
}
else {
pfVar2[-1] = 0.0;
}
uVar3 = uVar3 - 1;
pfVar1 = pfVar1 + 8;
pfVar2 = pfVar2 + 4;
} while (uVar3 != 0);
param_1 = param_1 + uVar4 * 8;
param_2 = param_2 + uVar4 * 4;
}
param_3 = param_3 & 3;
if (param_3 != 0) {
fVar5 = param_1[1] * param_1[1] + *param_1 * *param_1;
if (fVar5 < 0.0 == NAN(fVar5)) {
if ((int)((uint)(fVar5 < 0.0) << 0x1f) < 0) {
FUN_0800ea48();
}
*param_2 = SQRT(fVar5);
}
else {
*param_2 = 0.0;
}
if (param_3 != 1) {
fVar5 = param_1[3] * param_1[3] + param_1[2] * param_1[2];
if (fVar5 < 0.0 == NAN(fVar5)) {
if ((int)((uint)(fVar5 < 0.0) << 0x1f) < 0) {
FUN_0800ea48();
}
param_2[1] = SQRT(fVar5);
}
else {
param_2[1] = 0.0;
}
if (param_3 != 2) {
fVar5 = param_1[4] * param_1[4] + param_1[5] * param_1[5];
if (fVar5 < 0.0 == NAN(fVar5)) {
if ((int)((uint)(fVar5 < 0.0) << 0x1f) < 0) {
FUN_0800ea48();
}
param_2[2] = SQRT(fVar5);
}
else {
param_2[2] = 0.0;
}
}
}
}
return;
}
float FUN_0800dffc(float param_1)
{
uint in_fpscr;
float fVar1;
int iVar2;
float fVar3;
uint uVar4;
fVar1 = param_1 * DAT_0800e084 + 0.25;
iVar2 = (int)fVar1;
if (fVar1 < 0.0) {
iVar2 = iVar2 + -1;
}
fVar3 = (float)VectorSignedToFloat(iVar2,(byte)((in_fpscr & 0xfffffff) >> 0x15) & 3);
fVar1 = (fVar1 - fVar3) * DAT_0800e088;
uVar4 = VectorFloatToUnsigned(fVar1,3);
uVar4 = uVar4 & 0xffff;
if (uVar4 < 0x200) {
fVar3 = (float)VectorUnsignedToFloat(uVar4,(byte)((in_fpscr & 0xfffffff) >> 0x15) & 3);
iVar2 = uVar4 + 1;
}
else {
iVar2 = 1;
uVar4 = 0;
fVar3 = DAT_0800e088;
}
fVar1 = fVar1 - fVar3;
return (1.0 - fVar1) * *(float *)(DAT_0800e08c + uVar4 * 4) +
fVar1 * *(float *)(DAT_0800e08c + iVar2 * 4);
}
void FUN_0800e090(float param_1,float *param_2,float *param_3,uint param_4)
{
float *pfVar1;
float *pfVar2;
uint uVar3;
uint uVar4;
float fVar5;
float fVar6;
float fVar7;
uVar4 = param_4 >> 2;
if (uVar4 != 0) {
pfVar2 = param_2 + 4;
pfVar1 = param_3 + 4;
uVar3 = uVar4;
do {
fVar5 = pfVar2[-2];
fVar6 = pfVar2[-1];
fVar7 = pfVar2[-4];
uVar3 = uVar3 - 1;
pfVar1[-3] = param_1 * pfVar2[-3];
pfVar1[-2] = param_1 * fVar5;
pfVar1[-1] = param_1 * fVar6;
pfVar1[-4] = fVar7 * param_1;
pfVar2 = pfVar2 + 4;
pfVar1 = pfVar1 + 4;
} while (uVar3 != 0);
param_2 = param_2 + uVar4 * 4;
param_3 = param_3 + uVar4 * 4;
}
param_4 = param_4 & 3;
if (((param_4 != 0) && (*param_3 = *param_2 * param_1, param_4 != 1)) &&
(param_3[1] = param_2[1] * param_1, param_4 != 2)) {
param_3[2] = param_2[2] * param_1;
}
return;
}
void FUN_0800e11c(float *param_1,float *param_2,float *param_3,uint param_4)
{
float *pfVar1;
float *pfVar2;
float *pfVar3;
uint uVar4;
uint uVar5;
uVar5 = param_4 >> 2;
if (uVar5 != 0) {
pfVar1 = param_3 + 4;
pfVar2 = param_2 + 4;
pfVar3 = param_1 + 4;
uVar4 = uVar5;
do {
uVar4 = uVar4 - 1;
pfVar1[-4] = pfVar3[-4] * pfVar2[-4];
pfVar1[-3] = pfVar3[-3] * pfVar2[-3];
pfVar1[-2] = pfVar3[-2] * pfVar2[-2];
pfVar1[-1] = pfVar3[-1] * pfVar2[-1];
pfVar1 = pfVar1 + 4;
pfVar2 = pfVar2 + 4;
pfVar3 = pfVar3 + 4;
} while (uVar4 != 0);
param_1 = param_1 + uVar5 * 4;
param_2 = param_2 + uVar5 * 4;
param_3 = param_3 + uVar5 * 4;
}
param_4 = param_4 & 3;
if (((param_4 != 0) && (*param_3 = *param_2 * *param_1, param_4 != 1)) &&
(param_3[1] = param_1[1] * param_2[1], param_4 != 2)) {
param_3[2] = param_1[2] * param_2[2];
}
return;
}
void FUN_0800e1d0(float *param_1,float *param_2,uint param_3,float *param_4)
{
float *pfVar1;
float *pfVar2;
uint uVar3;
uint uVar4;
float fVar5;
uVar4 = param_3 >> 2;
fVar5 = DAT_0800e280;
if (uVar4 != 0) {
pfVar2 = param_1 + 4;
pfVar1 = param_2 + 4;
uVar3 = uVar4;
do {
uVar3 = uVar3 - 1;
fVar5 = pfVar2[-1] * pfVar1[-1] +
pfVar2[-2] * pfVar1[-2] + pfVar2[-3] * pfVar1[-3] + pfVar2[-4] * pfVar1[-4] + fVar5;
pfVar2 = pfVar2 + 4;
pfVar1 = pfVar1 + 4;
} while (uVar3 != 0);
param_1 = param_1 + uVar4 * 4;
param_2 = param_2 + uVar4 * 4;
}
param_3 = param_3 & 3;
if (((param_3 != 0) && (fVar5 = fVar5 + *param_2 * *param_1, param_3 != 1)) &&
(fVar5 = fVar5 + param_2[1] * param_1[1], param_3 != 2)) {
fVar5 = fVar5 + param_1[2] * param_2[2];
}
*param_4 = fVar5;
return;
}
undefined4 FUN_0800e284(undefined2 *param_1,uint param_2)
{
undefined4 uVar1;
int iVar2;
*param_1 = (short)param_2;
*(undefined4 *)(param_1 + 2) = 0;
iVar2 = DAT_0800e324;
if (param_2 != 0x100) {
if (param_2 < 0x101) {
iVar2 = DAT_0800e31c;
if (param_2 != 0x40) {
if (param_2 < 0x41) {
iVar2 = DAT_0800e320;
if ((param_2 != 0x10) && (iVar2 = DAT_0800e310, param_2 != 0x20)) {
return 0xffffffff;
}
}
else {
iVar2 = DAT_0800e30c;
if (param_2 != 0x80) {
return 0xffffffff;
}
}
}
}
else {
iVar2 = DAT_0800e314;
if (param_2 != 0x800) {
if (param_2 < 0x801) {
iVar2 = DAT_0800e318;
if ((param_2 != 0x200) && (iVar2 = DAT_0800e308, param_2 != 0x400)) {
return 0xffffffff;
}
}
else {
iVar2 = DAT_0800e304;
if (param_2 != 0x1000) {
return 0xffffffff;
}
}
}
}
}
param_1[6] = *(undefined2 *)(iVar2 + 0xc);
uVar1 = *(undefined4 *)(iVar2 + 8);
*(undefined4 *)(param_1 + 2) = *(undefined4 *)(iVar2 + 4);
*(undefined4 *)(param_1 + 4) = uVar1;
return 0;
}
void FUN_0800e328(int param_1,uint param_2,int param_3,uint param_4)
{
float fVar1;
float *pfVar2;
float *pfVar3;
float *pfVar4;
float *pfVar5;
float *pfVar6;
float *pfVar7;
uint uVar8;
float *pfVar9;
float *pfVar10;
uint uVar11;
int iVar12;
uint uVar13;
uint uVar14;
float fVar15;
float fVar16;
float fVar17;
float fVar18;
float fVar19;
float fVar20;
float fVar21;
float fVar22;
float fVar23;
float fVar24;
float fVar25;
float fVar26;
float fVar27;
float fVar28;
float fVar29;
float fVar30;
float fVar31;
float fVar32;
float fVar33;
float fVar34;
float fVar35;
float fVar36;
float fVar37;
float fVar38;
float fVar39;
float fVar40;
float fVar41;
float fVar42;
float fVar43;
float fVar44;
float fVar45;
float fVar46;
float fVar47;
float *local_a4;
float *local_a0;
float *local_9c;
float *local_98;
float *local_94;
float *local_90;
float *local_8c;
float *local_88;
uint local_78;
fVar1 = DAT_0800e63c;
uVar11 = param_2;
local_78 = param_4;
while( true ) {
uVar8 = uVar11 >> 3;
pfVar5 = (float *)(param_1 + uVar8 * 0x20);
pfVar7 = pfVar5 + uVar8 * 4;
pfVar6 = pfVar7 + uVar8 * -6;
pfVar2 = (float *)(uVar8 * 8 + 4 + param_1);
pfVar4 = (float *)(uVar8 * 0x10 + 4 + param_1);
pfVar10 = pfVar6 + uVar8 * 8;
pfVar9 = pfVar5 + uVar8 * 2;
uVar13 = 0;
pfVar3 = (float *)(param_1 + 4);
do {
fVar16 = *pfVar10;
fVar43 = pfVar3[-1];
fVar30 = *pfVar5;
fVar42 = pfVar4[-1];
fVar31 = *pfVar7;
fVar20 = *pfVar6;
fVar15 = fVar42 + fVar31;
fVar18 = fVar20 + fVar16;
fVar28 = pfVar2[-1] + *pfVar9;
fVar27 = fVar43 + fVar30;
fVar33 = fVar28 + fVar18;
fVar25 = fVar27 + fVar15;
fVar36 = pfVar2[-1] - *pfVar9;
pfVar3[-1] = fVar25 + fVar33;
*pfVar5 = fVar25 - fVar33;
fVar20 = fVar20 - fVar16;
fVar26 = *pfVar2 - pfVar9[1];
fVar44 = pfVar6[1] - pfVar10[1];
fVar21 = *pfVar3 + pfVar5[1];
fVar42 = fVar42 - fVar31;
fVar23 = *pfVar3 - pfVar5[1];
fVar33 = pfVar6[1] + pfVar10[1];
fVar16 = *pfVar4 + pfVar7[1];
fVar25 = (fVar26 + fVar44) * fVar1;
fVar34 = *pfVar4 - pfVar7[1];
fVar31 = (fVar36 - fVar20) * fVar1;
fVar43 = fVar43 - fVar30;
fVar30 = *pfVar2 + pfVar9[1];
fVar26 = (fVar26 - fVar44) * fVar1;
fVar20 = (fVar36 + fVar20) * fVar1;
fVar27 = fVar27 - fVar15;
fVar28 = fVar28 - fVar18;
fVar15 = fVar30 + fVar33;
fVar18 = fVar21 + fVar16;
fVar30 = fVar30 - fVar33;
fVar21 = fVar21 - fVar16;
fVar33 = fVar43 + fVar31;
fVar16 = fVar34 + fVar25;
fVar43 = fVar43 - fVar31;
fVar34 = fVar34 - fVar25;
fVar25 = fVar23 + fVar26;
fVar23 = fVar23 - fVar26;
fVar31 = fVar42 + fVar20;
fVar42 = fVar42 - fVar20;
uVar13 = uVar13 + uVar11;
*pfVar3 = fVar18 + fVar15;
pfVar5[1] = fVar18 - fVar15;
pfVar3 = pfVar3 + uVar11 * 2;
pfVar4[-1] = fVar27 + fVar30;
pfVar5 = pfVar5 + uVar11 * 2;
*pfVar7 = fVar27 - fVar30;
*pfVar4 = fVar21 - fVar28;
pfVar7[1] = fVar28 + fVar21;
pfVar4 = pfVar4 + uVar11 * 2;
pfVar2[-1] = fVar33 + fVar16;
pfVar7 = pfVar7 + uVar11 * 2;
*pfVar10 = fVar33 - fVar16;
*pfVar9 = fVar43 + fVar34;
*pfVar6 = fVar43 - fVar34;
*pfVar2 = fVar25 - fVar31;
pfVar10[1] = fVar31 + fVar25;
pfVar2 = pfVar2 + uVar11 * 2;
pfVar9[1] = fVar23 - fVar42;
pfVar10 = pfVar10 + uVar11 * 2;
pfVar6[1] = fVar42 + fVar23;
pfVar9 = pfVar9 + uVar11 * 2;
pfVar6 = pfVar6 + uVar11 * 2;
} while (uVar13 < param_2);
if (uVar8 < 8) break;
local_88 = (float *)(param_1 + uVar8 * 0x20 + 8);
local_94 = (float *)(param_1 + uVar8 * 0x30 + 8);
local_90 = (float *)(param_1 + uVar8 * 0x28 + 8);
local_98 = (float *)(param_1 + uVar8 * 0x18 + 8);
local_9c = (float *)(param_1 + uVar8 * 0x38 + 8);
local_a4 = (float *)(param_1 + uVar8 * 0x10 + 0xc);
local_a0 = (float *)(param_1 + 0xc);
local_8c = (float *)(param_1 + uVar8 * 8 + 8);
iVar12 = 0;
uVar13 = 1;
do {
iVar12 = iVar12 + local_78;
pfVar7 = (float *)(param_3 + iVar12 * 8);
pfVar2 = pfVar7 + iVar12 * 2;
pfVar3 = pfVar2 + iVar12 * 2;
pfVar4 = pfVar3 + iVar12 * 2;
pfVar5 = pfVar4 + iVar12 * 2;
pfVar6 = pfVar5 + iVar12 * 2 + iVar12 * 2;
fVar27 = pfVar6[iVar12 * -6 + 1];
fVar15 = *pfVar3;
fVar26 = pfVar6[iVar12 * -8 + 1];
fVar21 = pfVar6[iVar12 * -0xc + 1];
fVar23 = pfVar6[iVar12 * -10 + 1];
fVar16 = *pfVar2;
fVar25 = *pfVar7;
fVar43 = pfVar6[1];
fVar30 = pfVar6[iVar12 * -2 + 1];
fVar28 = pfVar6[iVar12 * -4 + 1];
fVar20 = *pfVar6;
fVar33 = pfVar5[iVar12 * 2];
fVar18 = *pfVar5;
fVar31 = *pfVar4;
pfVar3 = local_94;
pfVar2 = local_90;
pfVar7 = local_8c;
pfVar4 = local_88;
pfVar5 = local_98;
pfVar6 = local_9c;
pfVar9 = local_a0;
pfVar10 = local_a4;
uVar14 = uVar13;
do {
fVar29 = *pfVar4;
fVar45 = *pfVar3;
fVar24 = pfVar9[-1];
fVar22 = pfVar10[-1];
fVar38 = fVar24 + fVar29;
fVar44 = *pfVar7 + *pfVar2;
fVar34 = fVar22 + fVar45;
fVar36 = *pfVar5 + *pfVar6;
fVar17 = fVar38 + fVar34;
fVar32 = fVar44 + fVar36;
fVar42 = *pfVar7 - *pfVar2;
fVar37 = *pfVar5 - *pfVar6;
pfVar9[-1] = fVar17 + fVar32;
fVar24 = fVar24 - fVar29;
fVar22 = fVar22 - fVar45;
fVar45 = pfVar7[1] - pfVar2[1];
fVar46 = pfVar5[1] - pfVar6[1];
fVar38 = fVar38 - fVar34;
fVar35 = pfVar5[1] + pfVar6[1];
fVar39 = *pfVar10 + pfVar3[1];
fVar34 = pfVar7[1] + pfVar2[1];
fVar19 = *pfVar9 + pfVar4[1];
fVar44 = fVar44 - fVar36;
fVar29 = fVar19 + fVar39;
fVar47 = fVar34 + fVar35;
fVar19 = fVar19 - fVar39;
fVar40 = (fVar45 - fVar46) * fVar1;
fVar39 = (fVar45 + fVar46) * fVar1;
fVar46 = *pfVar10 - pfVar3[1];
fVar34 = fVar34 - fVar35;
fVar17 = fVar17 - fVar32;
fVar41 = (fVar42 + fVar37) * fVar1;
fVar45 = fVar29 - fVar47;
fVar37 = (fVar42 - fVar37) * fVar1;
fVar35 = *pfVar9 - pfVar4[1];
fVar36 = fVar38 + fVar34;
fVar42 = fVar35 + fVar40;
fVar38 = fVar38 - fVar34;
fVar35 = fVar35 - fVar40;
fVar32 = fVar19 - fVar44;
fVar34 = fVar22 + fVar41;
fVar44 = fVar44 + fVar19;
fVar22 = fVar22 - fVar41;
fVar19 = fVar46 + fVar39;
fVar46 = fVar46 - fVar39;
fVar39 = fVar24 + fVar37;
fVar24 = fVar24 - fVar37;
fVar37 = fVar42 - fVar34;
fVar40 = fVar39 + fVar19;
fVar34 = fVar34 + fVar42;
fVar39 = fVar39 - fVar19;
fVar42 = fVar24 + fVar46;
fVar24 = fVar24 - fVar46;
fVar19 = fVar35 - fVar22;
fVar22 = fVar22 + fVar35;
*pfVar9 = fVar29 + fVar47;
uVar14 = uVar14 + uVar11;
*pfVar4 = fVar31 * fVar17 + fVar27 * fVar45;
pfVar4[1] = fVar31 * fVar45 - fVar27 * fVar17;
pfVar9 = pfVar9 + uVar11 * 2;
pfVar10[-1] = fVar16 * fVar36 + fVar23 * fVar32;
*pfVar10 = fVar16 * fVar32 - fVar23 * fVar36;
pfVar4 = pfVar4 + uVar11 * 2;
*pfVar3 = fVar33 * fVar38 + fVar30 * fVar44;
pfVar3[1] = fVar33 * fVar44 - fVar30 * fVar38;
pfVar10 = pfVar10 + uVar11 * 2;
*pfVar7 = fVar25 * fVar40 + fVar21 * fVar37;
pfVar7[1] = fVar25 * fVar37 - fVar21 * fVar40;
pfVar3 = pfVar3 + uVar11 * 2;
*pfVar6 = fVar20 * fVar39 + fVar43 * fVar34;
pfVar6[1] = fVar20 * fVar34 - fVar43 * fVar39;
pfVar7 = pfVar7 + uVar11 * 2;
*pfVar2 = fVar18 * fVar42 + fVar28 * fVar19;
pfVar6 = pfVar6 + uVar11 * 2;
pfVar2[1] = fVar18 * fVar19 - fVar28 * fVar42;
*pfVar5 = fVar15 * fVar24 + fVar26 * fVar22;
pfVar5[1] = fVar15 * fVar22 - fVar26 * fVar24;
pfVar2 = pfVar2 + uVar11 * 2;
pfVar5 = pfVar5 + uVar11 * 2;
} while (uVar14 < param_2);
local_88 = local_88 + 2;
local_8c = local_8c + 2;
local_90 = local_90 + 2;
local_94 = local_94 + 2;
local_98 = local_98 + 2;
local_9c = local_9c + 2;
local_a0 = local_a0 + 2;
local_a4 = local_a4 + 2;
uVar13 = uVar13 + 1;
} while (uVar8 != uVar13);
local_78 = (local_78 & 0x1fff) << 3;
uVar11 = uVar8;
}
return;
}
undefined4 FUN_0800e8c0(int *param_1)
{
code *pcVar1;
if (*param_1 << 0x1f < 0) {
return 0;
}
if (*(char *)((int)param_1 + 1) != '\0') {
// WARNING: Does not return
pcVar1 = (code *)software_udf(0xff,0x800e8cc);
(*pcVar1)();
}
*(undefined1 *)((int)param_1 + 1) = 1;
return 1;
}
void FUN_0800e8d8(undefined4 *param_1)
{
*param_1 = 1;
return;
}
void FUN_0800e8de(int param_1)
{
int iVar1;
code *pcVar2;
if (param_1 == 0) {
param_1 = 1;
}
while (iVar1 = FUN_08010b28(param_1), iVar1 == 0) {
pcVar2 = (code *)FUN_0800e904();
if (pcVar2 == (code *)0x0) {
pcVar2 = (code *)FUN_08010588();
}
(*pcVar2)();
}
return;
}
void thunk_FUN_0800e8de(int param_1)
{
int iVar1;
code *pcVar2;
if (param_1 == 0) {
param_1 = 1;
}
while (iVar1 = FUN_08010b28(param_1), iVar1 == 0) {
pcVar2 = (code *)FUN_0800e904();
if (pcVar2 == (code *)0x0) {
pcVar2 = (code *)FUN_08010588();
}
(*pcVar2)();
}
return;
}
undefined4 FUN_0800e904(void)
{
DataMemoryBarrier(0x1b);
return *DAT_0800e910;
}
undefined4 FUN_0800e914(float param_1)
{
undefined4 uVar1;
int iVar2;
undefined4 *puVar3;
undefined4 uVar4;
uVar4 = FUN_0800ebc8();
iVar2 = FUN_0800eb80(param_1);
uVar1 = DAT_0800e984;
if (iVar2 != 0) {
if (param_1 != DAT_0800e97c && param_1 < DAT_0800e97c == (NAN(param_1) || NAN(DAT_0800e97c))) {
puVar3 = (undefined4 *)FUN_08012560();
*puVar3 = 0x22;
return uVar1;
}
if ((int)((uint)(param_1 < DAT_0800e980) << 0x1f) < 0) {
puVar3 = (undefined4 *)FUN_08012560();
uVar4 = DAT_0800e988;
*puVar3 = 0x22;
}
}
return uVar4;
}
float normalizeSensorExpressionValue(float param_1,float param_2)
{
int iVar1;
undefined4 *puVar2;
float fVar3;
fVar3 = (float)FUN_0800ee2c();
if (NAN(param_2)) {
return fVar3;
}
if (param_1 == 0.0) {
if (param_2 == 0.0) {
return 1.0;
}
iVar1 = FUN_0800eb80(param_2);
if (iVar1 == 0) {
return fVar3;
}
if (-1 < (int)((uint)(param_2 < 0.0) << 0x1f)) {
return fVar3;
}
}
else {
iVar1 = FUN_0800eb80();
if (((iVar1 == 0) && (iVar1 = FUN_0800eb80(param_1), iVar1 != 0)) &&
(iVar1 = FUN_0800eb80(param_2), iVar1 != 0)) {
if (NAN(fVar3)) {
puVar2 = (undefined4 *)FUN_08012560();
*puVar2 = 0x21;
return fVar3;
}
}
else {
if (fVar3 != 0.0) {
return fVar3;
}
iVar1 = FUN_0800eb80(param_1);
if (iVar1 == 0) {
return fVar3;
}
iVar1 = FUN_0800eb80(param_2);
if (iVar1 == 0) {
return fVar3;
}
}
}
puVar2 = (undefined4 *)FUN_08012560();
*puVar2 = 0x22;
return fVar3;
}
float FUN_0800ea48(float param_1)
{
float fVar1;
undefined4 *puVar2;
float fVar3;
fVar3 = (float)FUN_0800edb0();
fVar1 = DAT_0800ea88;
if ((!NAN(param_1)) && ((int)((uint)(param_1 < DAT_0800ea88) << 0x1f) < 0)) {
puVar2 = (undefined4 *)FUN_08012560();
*puVar2 = 0x21;
return fVar1 / fVar1;
}
return fVar3;
}
undefined8 FUN_0800ea90(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
undefined4 uVar1;
int iVar2;
undefined4 *puVar3;
undefined8 uVar4;
undefined4 uVar5;
uVar4 = FUN_0800f4b0();
uVar1 = (undefined4)uVar4;
uVar5 = (undefined4)((ulonglong)uVar4 >> 0x20);
iVar2 = FUN_08000b4c(param_3,param_4,param_3,param_4);
if (iVar2 != 0) {
return uVar4;
}
iVar2 = FUN_08000ae8();
if (iVar2 == 0) {
iVar2 = FUN_0800ebb0(uVar1);
if (((iVar2 == 0) && (iVar2 = FUN_0800ebb0(param_1), iVar2 != 0)) &&
(iVar2 = FUN_0800ebb0(param_3), iVar2 != 0)) {
iVar2 = FUN_08000b4c(uVar1,uVar5,uVar1,uVar5);
if (iVar2 != 0) {
puVar3 = (undefined4 *)FUN_08012560();
*puVar3 = 0x21;
return uVar4;
}
goto LAB_0800eb62;
}
iVar2 = FUN_08000ae8(uVar1,uVar5,0,0);
if (iVar2 == 0) {
return uVar4;
}
iVar2 = FUN_0800ebb0(param_1);
if (iVar2 == 0) {
return uVar4;
}
iVar2 = FUN_0800ebb0(param_3);
}
else {
iVar2 = FUN_08000ae8(param_3,param_4,0,0);
if (iVar2 != 0) {
return DAT_0800eb78;
}
iVar2 = FUN_0800ebb0(param_3);
if (iVar2 == 0) {
return uVar4;
}
iVar2 = FUN_08000afc(param_3,param_4,0,0);
}
if (iVar2 == 0) {
return uVar4;
}
LAB_0800eb62:
puVar3 = (undefined4 *)FUN_08012560();
*puVar3 = 0x22;
return uVar4;
}
bool FUN_0800eb80(uint param_1)
{
return (param_1 & 0x7fffffff) < 0x7f800000;
}
uint FUN_0800eb94(uint param_1)
{
return param_1 & 0x7fffffff;
}
undefined4 FUN_0800eba4(void)
{
return DAT_0800ebac;
}
uint FUN_0800ebb0(void)
{
undefined8 in_d0;
undefined4 uStack_4;
uStack_4 = (uint)((ulonglong)in_d0 >> 0x20);
return (uStack_4 | 0x80000000) + 0x100000 >> 0x1f;
}
// WARNING: Removing unreachable block (ram,0x0801015e)
float FUN_0800ebc8(float param_1)
{
undefined4 *puVar1;
float fVar2;
int iVar3;
uint in_fpscr;
float fVar4;
float fVar5;
float fVar6;
fVar2 = ABS(param_1);
if (0x7f800000 < (uint)fVar2) {
return param_1 + param_1;
}
iVar3 = (int)param_1 >> 0x1f;
if (fVar2 != INFINITY) {
fVar5 = DAT_08010190;
if ((DAT_0800ed68 < (int)param_1) ||
(((int)param_1 < 0 && (fVar5 = DAT_08010184, (uint)DAT_0800ed94 < (uint)fVar2)))) {
puVar1 = (undefined4 *)FUN_08012560();
*puVar1 = 0x22;
return fVar5 * fVar5;
}
if ((uint)DAT_0800ed6c < (uint)fVar2) {
if ((uint)DAT_0800ed70 < (uint)fVar2) {
iVar3 = (int)(*(float *)(DAT_0800eda0 + iVar3 * -4) + param_1 * DAT_0800eda4);
fVar6 = (float)VectorSignedToFloat(iVar3,(byte)(in_fpscr >> 0x15) & 3);
fVar4 = param_1 + -fVar6 * DAT_0800eda8;
fVar6 = fVar6 * DAT_0800edac;
}
else {
fVar4 = param_1 - *(float *)(DAT_0800ed74 + iVar3 * -4);
fVar6 = *(float *)(DAT_0800ed78 + iVar3 * -4);
iVar3 = (-iVar3 ^ 1U) + iVar3;
}
param_1 = fVar4 - fVar6;
fVar2 = param_1 * param_1;
fVar5 = param_1 + -(DAT_0800ed88 +
(DAT_0800ed8c +
(DAT_0800ed84 + (DAT_0800ed80 + fVar2 * DAT_0800ed7c) * fVar2) * fVar2) *
fVar2) * fVar2;
fVar2 = param_1 * fVar5;
if (iVar3 != 0) {
fVar2 = 1.0 - ((fVar6 - fVar2 / (2.0 - fVar5)) - fVar4);
if (iVar3 + 0x7d < 0 == SCARRY4(iVar3,0x7d)) {
return (float)((int)fVar2 + iVar3 * 0x800000);
}
return (float)((int)fVar2 + (iVar3 + 100) * 0x800000) * DAT_0800ed9c;
}
}
else {
if (((uint)fVar2 < 0x34000000) &&
(fVar2 = param_1 + DAT_0800ed90, fVar2 != 1.0 && fVar2 < 1.0 == NAN(fVar2))) {
return param_1 + 1.0;
}
fVar2 = param_1 * param_1;
fVar5 = param_1 + -fVar2 * (DAT_0800ed88 +
fVar2 * (DAT_0800ed8c +
fVar2 * (DAT_0800ed84 +
fVar2 * (DAT_0800ed80 + fVar2 * DAT_0800ed7c))));
fVar2 = param_1 * fVar5;
}
return 1.0 - (fVar2 / (fVar5 - 2.0) - param_1);
}
if (-iVar3 != 0) {
param_1 = DAT_0800ed98;
}
return param_1;
}
float FUN_0800edb0(float param_1)
{
return SQRT(param_1);
}
float combineSensorValues(float param_1,float param_2)
{
int iVar1;
iVar1 = FUN_0800edf4();
if ((iVar1 != 0) &&
((iVar1 = FUN_0800edf4(param_2), iVar1 == 0 ||
(param_1 != param_2 && param_1 < param_2 == (NAN(param_1) || NAN(param_2)))))) {
return param_1;
}
return param_2;
}
bool FUN_0800edf4(uint param_1)
{
param_1 = param_1 & 0x7fffffff;
if (param_1 == 0) {
return (bool)2;
}
if (0x7effffff < param_1 - 0x800000) {
if (DAT_0800ee28 < param_1 - 1) {
return param_1 == 0x7f800000;
}
return (bool)3;
}
return (bool)4;
}
float FUN_0800ee2c(float param_1,float param_2)
{
int iVar1;
int iVar2;
undefined4 *puVar3;
float fVar4;
int iVar5;
float fVar6;
uint uVar7;
uint uVar8;
float fVar9;
float fVar10;
uint in_fpscr;
float extraout_s0;
float extraout_s0_00;
float fVar11;
float fVar12;
float fVar13;
float fVar14;
float fVar15;
float fVar16;
float fVar17;
fVar9 = ABS(param_2);
if (fVar9 == 0.0) {
uVar7 = (uint)param_1 ^ 0x400000;
}
else {
fVar10 = ABS(param_1);
if (((uint)fVar10 < 0x7f800001) && ((uint)fVar9 < 0x7f800001)) {
if ((int)param_1 < 0) {
if (0x4b7fffff < (uint)fVar9) {
if (fVar9 == INFINITY) goto LAB_0800f096;
iVar1 = 2;
goto LAB_0800f0c0;
}
if (0x3f7fffff < (uint)fVar9) {
uVar8 = 0x96 - ((int)fVar9 >> 0x17);
uVar7 = (int)fVar9 >> (uVar8 & 0xff);
if ((float)(uVar7 << (uVar8 & 0xff)) != fVar9) {
if (fVar9 == 1.0) {
LAB_0800f0fc:
if (-1 < (int)param_2) {
return param_1;
}
return 1.0 / param_1;
}
if (param_2 == 2.0) goto LAB_0800f144;
goto LAB_0800f130;
}
if (fVar9 == 1.0) goto LAB_0800f0fc;
if (param_2 == 2.0) goto LAB_0800f144;
iVar1 = 2 - (uVar7 & 1);
goto LAB_0800f0c0;
}
if (param_2 == 2.0) {
LAB_0800f144:
return param_1 * param_1;
}
if (param_2 != 0.5) goto LAB_0800f130;
iVar2 = FUN_0800eb94();
if (fVar10 == INFINITY) {
return extraout_s0;
}
iVar1 = 0;
fVar11 = extraout_s0;
if (fVar10 == 0.0) goto LAB_0800f0e6;
LAB_0800ef02:
if (fVar10 != 1.0) {
if (iVar1 == 0 && (int)param_1 < 0) {
return (param_1 - param_1) / (param_1 - param_1);
}
fVar16 = DAT_08010184;
if (0x4d000000 < (uint)fVar9) {
if ((uint)DAT_0800f168 < (uint)fVar10) {
if ((uint)fVar10 <= (uint)DAT_0800f16c) {
fVar11 = fVar11 - 1.0;
fVar9 = -(DAT_0800f178 *
fVar11 * fVar11 * (-(DAT_0800f170 + -fVar11 * 0.25) * fVar11 + 0.5)) +
fVar11 * DAT_0800f174;
fVar10 = (float)((uint)(fVar9 + fVar11 * DAT_0800f17c) & 0xfffff000);
fVar9 = fVar9 - (fVar10 + -fVar11 * DAT_0800f17c);
goto LAB_0800ef86;
}
if (0 < (int)param_2) goto LAB_0800f3c0;
}
else if ((int)param_2 < 0) {
LAB_0800f3c0:
iVar2 = 0;
fVar16 = DAT_08010190;
goto LAB_0801015c;
}
iVar2 = 0;
goto LAB_0801015c;
}
if (((uint)param_1 & 0x7f800000) == 0) {
fVar10 = fVar11 * DAT_0800f1a4;
iVar5 = -0x18;
}
else {
iVar5 = 0;
}
uVar7 = (uint)fVar10 & 0x7fffff;
iVar5 = ((int)fVar10 >> 0x17) + -0x7f + iVar5;
fVar10 = (float)(uVar7 | 0x3f800000);
fVar9 = DAT_0800f470;
fVar11 = DAT_0800f470;
if (DAT_0800f468 < (int)uVar7) {
if (DAT_0800f46c < (int)uVar7) {
iVar5 = iVar5 + 1;
fVar10 = (float)((int)fVar10 - 0x800000);
fVar14 = 1.0;
iVar2 = 0;
}
else {
fVar14 = 1.5;
iVar2 = 0x200000;
fVar9 = DAT_0800f4a8;
fVar11 = DAT_0800f4a4;
}
}
else {
fVar14 = 1.0;
iVar2 = 0;
}
fVar12 = 1.0 / (fVar10 + fVar14);
fVar6 = (float)(((int)fVar10 >> 1 | 0x20000000U) + 0x40000 + iVar2);
fVar13 = (fVar10 - fVar14) * fVar12;
fVar17 = (float)VectorSignedToFloat(iVar5,(byte)(in_fpscr >> 0x15) & 3);
fVar4 = (float)((uint)fVar13 & DAT_0800f474);
fVar15 = fVar13 * fVar13;
fVar12 = ((fVar10 - fVar14) + -fVar4 * fVar6 + -fVar4 * (fVar10 - (fVar6 - fVar14))) *
fVar12;
fVar14 = (fVar13 + fVar4) * fVar12 +
fVar15 * fVar15 *
(DAT_0800f48c +
(DAT_0800f488 +
(DAT_0800f484 +
(DAT_0800f480 + (DAT_0800f478 + fVar15 * DAT_0800f47c) * fVar15) * fVar15) *
fVar15) * fVar15);
fVar10 = (float)((uint)(fVar4 * fVar4 + 3.0 + fVar14) & DAT_0800f474);
fVar6 = (fVar14 - ((fVar10 - 3.0) + -fVar4 * fVar4)) * fVar13 + fVar12 * fVar10;
fVar14 = (float)((uint)(fVar6 + fVar4 * fVar10) & DAT_0800f474);
fVar9 = (fVar6 - (fVar14 + -fVar4 * fVar10)) * DAT_0800f490 + fVar14 * DAT_0800f494 +
fVar9;
fVar10 = (float)((uint)(fVar9 + fVar14 * DAT_0800f498 + fVar11 + fVar17) & DAT_0800f474);
fVar9 = fVar9 - (((fVar10 - fVar17) - fVar11) + -fVar14 * DAT_0800f498);
LAB_0800ef86:
fVar11 = fVar10 * (float)((uint)param_2 & 0xfffff000);
fVar10 = fVar9 * param_2 + (param_2 - (float)((uint)param_2 & 0xfffff000)) * fVar10;
fVar14 = -1.0;
fVar9 = fVar10 + fVar11;
if (iVar1 != 1 || -1 < (int)param_1) {
fVar14 = 1.0;
}
fVar4 = ABS(fVar9);
if ((int)fVar9 < 1) {
if ((uint)fVar4 <= (uint)DAT_0800f49c) {
if (fVar4 != DAT_0800f49c) goto LAB_0800efda;
if (fVar9 - fVar11 < fVar10 != (NAN(fVar9 - fVar11) || NAN(fVar10))) {
uVar8 = (int)fVar9 + 0x8000;
uVar7 = (uVar8 * 2 >> 0x18) - 0x7f;
fVar16 = (float)(DAT_0800f4a0 >> (uVar7 & 0xff) & uVar8);
iVar1 = (int)(uVar8 & 0x7fffff | 0x800000) >> (0x17 - uVar7 & 0xff);
LAB_0800f378:
iVar1 = -iVar1;
goto LAB_0800f37a;
}
}
iVar1 = (uint)(fVar14 < 0.0) << 0x1f;
if (iVar1 < 0) {
iVar2 = 1;
}
if (-1 < iVar1) {
iVar2 = 0;
}
goto LAB_0801015c;
}
if ((uint)fVar4 < 0x43000001) {
if (fVar4 == 128.0) {
fVar4 = fVar9 - fVar11;
fVar16 = fVar10 + DAT_0800f4ac;
if (fVar16 != fVar4 && fVar16 < fVar4 == (NAN(fVar16) || NAN(fVar4)))
goto LAB_0800f446;
uVar8 = (int)fVar9 + 0x8000;
uVar7 = ((int)uVar8 >> 0x17) - 0x7f;
fVar16 = (float)(DAT_0800f4a0 >> (uVar7 & 0xff) & uVar8);
iVar1 = (int)(uVar8 & 0x7fffff | 0x800000) >> (0x17 - uVar7 & 0xff);
}
else {
LAB_0800efda:
if ((uint)fVar4 < 0x3f000001) {
iVar2 = 0;
iVar1 = 0;
goto LAB_0800efe6;
}
uVar7 = (0x800000 >> (((int)fVar4 >> 0x17) - 0x7eU & 0xff)) + (int)fVar9;
uVar8 = (uVar7 * 2 >> 0x18) - 0x7f;
iVar1 = (int)(uVar7 & 0x7fffff | 0x800000) >> (0x17 - uVar8 & 0xff);
fVar16 = (float)(DAT_0800f4a0 >> (uVar8 & 0xff) & uVar7);
if ((int)fVar9 < 0) goto LAB_0800f378;
}
LAB_0800f37a:
fVar11 = fVar11 - fVar16;
iVar2 = iVar1 << 0x17;
fVar9 = fVar10 + fVar11;
LAB_0800efe6:
fVar9 = (float)((uint)fVar9 & 0xfffff000);
fVar16 = fVar9 * DAT_0800f180 + (fVar10 - (fVar9 - fVar11)) * DAT_0800f19c;
fVar11 = fVar16 + fVar9 * DAT_0800f184;
fVar10 = fVar11 * fVar11;
fVar16 = fVar16 - (fVar11 + -fVar9 * DAT_0800f184);
fVar9 = fVar11 + -(DAT_0800f198 +
(DAT_0800f194 +
(DAT_0800f190 + (DAT_0800f18c + fVar10 * DAT_0800f188) * fVar10) *
fVar10) * fVar10) * fVar10;
fVar9 = (float)((int)(1.0 - (((fVar11 * fVar9) / (fVar9 - 2.0) -
(fVar16 + fVar11 * fVar16)) - fVar11)) + iVar2);
if ((int)fVar9 < 0x800000) {
fVar9 = (float)FUN_08010194(iVar1);
}
return fVar9 * fVar14;
}
LAB_0800f446:
iVar1 = (uint)(fVar14 < 0.0) << 0x1f;
if (iVar1 < 0) {
iVar2 = 1;
}
fVar16 = DAT_08010190;
if (-1 < iVar1) {
iVar2 = 0;
}
LAB_0801015c:
fVar9 = fVar16;
if (iVar2 != 0) {
fVar9 = -fVar16;
}
puVar3 = (undefined4 *)FUN_08012560();
*puVar3 = 0x22;
return fVar9 * fVar16;
}
}
else {
if (fVar9 == INFINITY) {
LAB_0800f096:
if (fVar10 == 1.0) {
return 1.0;
}
if (0x3f800000 < (uint)fVar10) {
if (-1 < (int)param_2) {
return param_2;
}
return DAT_0800f1a0;
}
if (-1 < (int)param_2) {
return DAT_0800f1a0;
}
return -param_2;
}
if (fVar9 == 1.0) goto LAB_0800f0fc;
if (param_2 == 2.0) goto LAB_0800f144;
if (param_2 == 0.5) {
fVar9 = (float)FUN_0800edb0();
return fVar9;
}
LAB_0800f130:
iVar1 = 0;
LAB_0800f0c0:
iVar2 = FUN_0800eb94(param_1);
fVar11 = extraout_s0_00;
if ((fVar10 != INFINITY) && (fVar10 != 0.0)) goto LAB_0800ef02;
}
if ((int)param_2 < 0) {
fVar11 = 1.0 / fVar11;
}
if (-1 < (int)param_1) {
return fVar11;
}
LAB_0800f0e6:
if (fVar10 == 1.0 && iVar1 == 0) {
return (fVar11 - fVar11) / (fVar11 - fVar11);
}
if (iVar1 != 1) {
return fVar11;
}
return -fVar11;
}
if (param_1 != 1.0) goto LAB_0800ee54;
uVar7 = (uint)param_2 ^ 0x400000;
}
if (uVar7 * 2 < 0xff800001) {
return 1.0;
}
LAB_0800ee54:
return param_1 + param_2;
}
/*
Unable to decompile 'FUN_0800f4b0'
Cause:
Low-level Error: Overlapping input varnodes
*/
float FUN_08010194(float param_1,int param_2)
{
float fVar1;
uint uVar2;
fVar1 = ABS(param_1);
if (fVar1 == 0.0) {
return param_1;
}
if (0x7f7fffff < (uint)fVar1) {
return param_1 + param_1;
}
if (((uint)param_1 & 0x7f800000) == 0) {
param_1 = param_1 * DAT_0801025c;
if (param_2 < DAT_08010260) {
return param_1 * DAT_08010270;
}
uVar2 = ((uint)((int)param_1 << 1) >> 0x18) - 0x19;
}
else {
uVar2 = (uint)fVar1 >> 0x17;
}
if ((param_2 < 0xc351) && (param_2 = uVar2 + param_2, param_2 < 0xff)) {
if (0 < param_2) {
return (float)((uint)param_1 & 0x807fffff | param_2 * 0x800000);
}
if (param_2 + 0x16 < 0 != SCARRY4(param_2,0x16)) {
fVar1 = DAT_08010270;
if ((int)param_1 < 0) {
fVar1 = DAT_08010274;
}
return fVar1 * DAT_08010270;
}
return (float)((uint)param_1 & 0x807fffff | (param_2 + 0x19) * 0x800000) * DAT_0801026c;
}
fVar1 = DAT_08010264;
if ((int)param_1 < 0) {
fVar1 = DAT_08010268;
}
return fVar1 * DAT_08010264;
}
longlong FUN_08010278(void)
{
ulonglong in_d0;
return ((ulonglong)((uint)(in_d0 >> 0x20) & 0x7fffffff) << 0x20) + (in_d0 & 0xffffffff);
}
ulonglong FUN_08010288(int param_1)
{
uint uVar1;
uint uVar2;
ulonglong in_d0;
ulonglong uVar3;
uVar1 = (uint)((int)(in_d0 >> 0x20) << 1) >> 0x15;
if (uVar1 == 0) {
if ((in_d0 & 0x7fffffff00000000) == 0 && (int)in_d0 == 0) {
return in_d0;
}
in_d0 = FUN_08000618();
uVar3 = in_d0;
if (param_1 < DAT_08010394) goto LAB_0801035c;
uVar1 = ((uint)((int)(in_d0 >> 0x20) << 1) >> 0x15) - 0x36;
}
else if (uVar1 == 0x7ff) {
uVar3 = fp_multiply();
return uVar3;
}
uVar2 = (uint)(in_d0 >> 0x20);
if ((50000 < param_1) || (param_1 = param_1 + uVar1, 0x7fe < param_1)) {
if ((longlong)in_d0 < 0) {
uVar3 = FUN_08000618(DAT_08010378,DAT_0801037c,DAT_08010370,DAT_08010374);
}
else {
uVar3 = FUN_08000618(DAT_08010370,DAT_08010374,DAT_08010370,DAT_08010374);
}
return uVar3;
}
if (0 < param_1) {
return CONCAT44(uVar2 & 0x800fffff | param_1 * 0x100000,(int)in_d0);
}
if (param_1 + 0x35 < 0 == SCARRY4(param_1,0x35)) {
uVar3 = FUN_08000618((int)in_d0,uVar2 & 0x800fffff | (param_1 + 0x36) * 0x100000,0,DAT_08010398)
;
return uVar3;
}
uVar3 = CONCAT44(DAT_08010384,DAT_08010380);
if ((longlong)in_d0 < 0) {
uVar3 = CONCAT44(DAT_0801038c,DAT_08010388);
}
LAB_0801035c:
uVar3 = FUN_08000618((int)uVar3,(int)(uVar3 >> 0x20),DAT_08010380,DAT_08010384);
return uVar3;
}
char * FUN_08010588(undefined4 param_1,undefined4 param_2,uint param_3,int *param_4,int *param_5)
{
char *pcVar1;
undefined4 uVar2;
char cVar3;
int iVar4;
int iVar5;
int iVar6;
uint uVar7;
int *piVar8;
uint in_lr;
undefined4 uVar9;
longlong extraout_d0;
undefined8 uVar10;
uint uStack_30;
int *piStack_2c;
piVar8 = param_4;
FUN_08012508(6);
uVar10 = FUN_0800707c(1);
iVar5 = (int)((ulonglong)uVar10 >> 0x20);
iVar6 = (int)((ulonglong)extraout_d0 >> 0x20);
uVar9 = (undefined4)extraout_d0;
if (extraout_d0 < 0) {
iVar4 = iVar6 + -0x80000000;
iVar6 = iVar4;
}
else {
iVar4 = 0;
}
cVar3 = (char)iVar4;
if (extraout_d0 < 0) {
cVar3 = '-';
}
*(char *)piVar8 = cVar3;
uVar7 = in_lr & 0xffffffdf;
if (uVar7 == 0x46) {
uVar2 = 3;
}
else {
if (uVar7 == 0x45) {
iVar5 = iVar5 + 1;
}
uVar2 = 2;
}
uStack_30 = param_3;
piStack_2c = piVar8;
pcVar1 = (char *)FUN_08012700(uVar9,(int)uVar10,uVar2,iVar5,param_4,&uStack_30,&piStack_2c);
if (uVar7 == 0x47) {
if ((param_3 & 1) == 0) goto LAB_0801061a;
piVar8 = (int *)(pcVar1 + iVar5);
}
else {
piVar8 = (int *)(pcVar1 + iVar5);
if (uVar7 == 0x46) {
if ((*pcVar1 == '0') && (iVar4 = FUN_08000ae8(uVar9,iVar6,0,0), iVar4 == 0)) {
*param_4 = 1 - iVar5;
}
piVar8 = (int *)((int)piVar8 + *param_4);
}
}
iVar6 = FUN_08000ae8(uVar9,iVar6,0,0);
if (iVar6 != 0) {
piStack_2c = piVar8;
}
while (piStack_2c < piVar8) {
*(char *)piStack_2c = '0';
piStack_2c = (int *)((int)piStack_2c + 1);
}
LAB_0801061a:
*param_5 = (int)piStack_2c - (int)pcVar1;
return pcVar1;
}
char * FUN_08010596(undefined4 param_1,int param_2,uint param_3,char *param_4,int *param_5,
uint param_6,int *param_7)
{
char *pcVar1;
undefined4 uVar2;
char cVar3;
int iVar4;
int iVar5;
char *pcVar6;
undefined4 uVar7;
longlong in_d0;
uint uStack_28;
char *local_24;
iVar5 = (int)((ulonglong)in_d0 >> 0x20);
uVar7 = (undefined4)in_d0;
if (in_d0 < 0) {
iVar4 = iVar5 + -0x80000000;
iVar5 = iVar4;
}
else {
iVar4 = 0;
}
cVar3 = (char)iVar4;
if (in_d0 < 0) {
cVar3 = '-';
}
*param_4 = cVar3;
param_6 = param_6 & 0xffffffdf;
if (param_6 == 0x46) {
uVar2 = 3;
}
else {
if (param_6 == 0x45) {
param_2 = param_2 + 1;
}
uVar2 = 2;
}
uStack_28 = param_3;
local_24 = param_4;
pcVar1 = (char *)FUN_08012700(uVar7,param_1,uVar2,param_2,param_5,&uStack_28,&local_24);
if (param_6 == 0x47) {
if ((param_3 & 1) == 0) goto LAB_0801061a;
pcVar6 = pcVar1 + param_2;
}
else {
pcVar6 = pcVar1 + param_2;
if (param_6 == 0x46) {
if ((*pcVar1 == '0') && (iVar4 = FUN_08000ae8(uVar7,iVar5,0,0), iVar4 == 0)) {
*param_5 = 1 - param_2;
}
pcVar6 = pcVar6 + *param_5;
}
}
iVar5 = FUN_08000ae8(uVar7,iVar5,0,0);
if (iVar5 != 0) {
local_24 = pcVar6;
}
while (local_24 < pcVar6) {
*local_24 = '0';
local_24 = local_24 + 1;
}
LAB_0801061a:
*param_7 = (int)local_24 - (int)pcVar1;
return pcVar1;
}
int FUN_08010660(undefined1 *param_1,uint param_2,undefined4 param_3)
{
bool bVar1;
char cVar2;
undefined1 *puVar3;
undefined1 uVar4;
undefined1 *puVar5;
undefined1 *puVar6;
int iVar7;
undefined1 *puVar8;
undefined4 uStack_1c;
undefined4 uStack_18;
uStack_18 = param_3;
uStack_1c = param_2;
if ((int)param_2 < 0) {
param_2 = -param_2;
uVar4 = 0x2d;
}
else {
uVar4 = 0x2b;
}
*param_1 = (char)param_3;
param_1[1] = uVar4;
if ((int)param_2 < 10) {
param_1[2] = 0x30;
param_1[3] = (char)param_2 + '0';
puVar3 = param_1 + 4;
}
else {
puVar5 = (undefined1 *)((int)&uStack_1c + 3);
puVar3 = puVar5;
do {
puVar6 = puVar3;
cVar2 = (char)(param_2 / 10);
puVar6[-1] = (char)param_2 + cVar2 * -10 + '0';
bVar1 = 99 < (int)param_2;
param_2 = param_2 / 10;
puVar3 = puVar6 + -1;
} while (bVar1);
puVar6[-2] = cVar2 + '0';
puVar3 = param_1 + 1;
for (puVar8 = puVar6 + -2; puVar8 < puVar5; puVar8 = puVar8 + 1) {
puVar3 = puVar3 + 1;
*puVar3 = *puVar8;
}
iVar7 = (int)&uStack_18 + (1 - (int)puVar6);
if (puVar5 < puVar6 + -2) {
iVar7 = 0;
}
puVar3 = param_1 + iVar7 + 2;
}
return (int)puVar3 - (int)param_1;
}
uint FUN_080106d4(undefined4 param_1,uint *param_2,undefined4 param_3,code *param_4,int *param_5)
{
undefined4 *puVar1;
undefined4 uVar2;
int iVar3;
int iVar4;
int iVar5;
undefined4 uVar6;
uint *puVar7;
uint *puVar8;
uint uVar9;
uint uVar10;
byte bVar11;
uint uVar12;
char local_35;
uint local_34;
uint local_30;
uint local_2c [2];
puVar1 = (undefined4 *)FUN_080125bc();
uVar6 = *puVar1;
uVar2 = strlen_custom(uVar6);
local_30 = 0;
puVar7 = (uint *)(*param_5 + 7U & 0xfffffff8);
bVar11 = (byte)param_2[6];
uVar12 = *param_2;
*param_5 = (int)(puVar7 + 2);
uVar9 = *puVar7;
uVar10 = puVar7[1];
param_2[0x12] = uVar9;
param_2[0x13] = uVar10;
iVar3 = FUN_08000b4c(uVar9,uVar10 & 0x7fffffff,0xffffffff,DAT_0801099c);
if ((iVar3 == 0) &&
(iVar3 = FUN_08000b10(uVar9,uVar10 & 0x7fffffff,0xffffffff,DAT_0801099c), iVar3 == 0)) {
iVar3 = FUN_08000afc(uVar9,uVar10,0,0);
puVar7 = DAT_080109a0;
puVar8 = DAT_080109a4;
if (iVar3 != 0) {
*(undefined1 *)((int)param_2 + 0x43) = 0x2d;
puVar7 = DAT_080109a0;
puVar8 = DAT_080109a4;
}
LAB_0801075e:
if (bVar11 < 0x48) {
puVar7 = puVar8;
}
param_2[4] = 3;
*param_2 = uVar12 & 0xfffffffb;
uVar12 = 0;
}
else {
iVar3 = FUN_08000b4c(uVar9,uVar10,uVar9,uVar10);
if (iVar3 != 0) {
puVar7 = DAT_080109a8;
puVar8 = DAT_080109ac;
if ((int)uVar10 < 0) {
*(undefined1 *)((int)param_2 + 0x43) = 0x2d;
puVar7 = DAT_080109a8;
puVar8 = DAT_080109ac;
}
goto LAB_0801075e;
}
if (param_2[1] == 0xffffffff) {
uVar10 = 6;
LAB_080107c2:
param_2[1] = uVar10;
}
else if (((bVar11 & 0xdf) == 0x47) && (param_2[1] == 0)) {
uVar10 = 1;
goto LAB_080107c2;
}
uVar12 = uVar12 | 0x400;
*param_2 = uVar12;
puVar7 = (uint *)FUN_08010596(uVar9,param_1,param_2[1],uVar12,&local_35,&local_34,bVar11,
&local_30,0);
if ((bVar11 & 0xdf) == 0x47) {
if (((int)(local_34 + 3) < 0 != SCARRY4(local_34,3)) || ((int)param_2[1] < (int)local_34)) {
bVar11 = bVar11 - 2;
goto LAB_08010804;
}
bVar11 = 0x67;
LAB_08010884:
if ((int)local_34 < (int)local_30) {
if ((int)local_34 < 1) {
iVar3 = 2 - local_34;
}
else {
iVar3 = 1;
}
uVar12 = local_30 + iVar3;
LAB_08010866:
param_2[4] = uVar12;
}
else {
param_2[4] = local_34;
if ((int)(*param_2 << 0x1f) < 0) {
uVar12 = local_34 + 1;
goto LAB_08010866;
}
}
LAB_08010868:
param_2[0x16] = local_34;
uVar12 = 0;
}
else {
if (0x65 < bVar11) {
if (bVar11 != 0x66) goto LAB_08010884;
uVar12 = param_2[1];
if ((int)local_34 < 1) {
if ((uVar12 == 0) && (-1 < (int)(*param_2 << 0x1f))) {
uVar12 = 1;
}
else {
uVar12 = uVar12 + 2;
}
}
else {
param_2[4] = local_34;
if ((uVar12 == 0) && (-1 < (int)(*param_2 << 0x1f))) goto LAB_08010868;
uVar12 = uVar12 + 1 + local_34;
}
goto LAB_08010866;
}
LAB_08010804:
local_34 = local_34 - 1;
uVar12 = FUN_08010660(param_2 + 0x14,local_34,bVar11);
param_2[4] = local_30 + uVar12;
if ((1 < (int)local_30) || ((int)(*param_2 << 0x1f) < 0)) {
param_2[4] = local_30 + uVar12 + 1;
}
}
if (local_35 != '\0') {
*(undefined1 *)((int)param_2 + 0x43) = 0x2d;
}
}
iVar3 = FUN_08010c7c(param_1,param_2,local_2c,param_3,param_4);
uVar9 = local_30;
if (iVar3 == -1) {
return 0xffffffff;
}
if ((int)(*param_2 << 0x15) < 0) {
if (bVar11 < 0x66) {
if (((int)local_30 < 2) && (-1 < (int)(*param_2 << 0x1f))) {
iVar5 = 1;
LAB_08010ac2:
iVar3 = (*param_4)(param_1,param_3,puVar7,iVar5);
if (iVar3 == -1) {
return 0xffffffff;
}
}
else {
iVar3 = (*param_4)(param_1,param_3,puVar7,1);
if (iVar3 == -1) {
return 0xffffffff;
}
iVar3 = (*param_4)(param_1,param_3,uVar6,uVar2);
if (iVar3 == -1) {
return 0xffffffff;
}
iVar5 = uVar9 - 1;
iVar3 = FUN_08000ae8(param_2[0x12],param_2[0x13],0,0);
if (iVar3 == 0) {
puVar7 = (uint *)((int)puVar7 + 1);
goto LAB_08010ac2;
}
for (iVar3 = 0; iVar3 < iVar5; iVar3 = iVar3 + 1) {
iVar4 = (*param_4)(param_1,param_3,(int)param_2 + 0x1a,1);
if (iVar4 == -1) {
return 0xffffffff;
}
}
}
puVar7 = param_2 + 0x14;
}
else {
iVar3 = FUN_08000ae8(param_2[0x12],param_2[0x13],0,0);
uVar12 = local_30;
if (iVar3 != 0) {
iVar3 = (*param_4)(param_1,param_3,DAT_080109b0,1);
uVar12 = local_30;
if (iVar3 == -1) {
return 0xffffffff;
}
if (((int)local_34 < (int)local_30) || ((int)(*param_2 << 0x1f) < 0)) {
iVar3 = (*param_4)(param_1,param_3,uVar6,uVar2);
if (iVar3 == -1) {
return 0xffffffff;
}
for (iVar3 = 0; iVar3 < (int)(uVar12 - 1); iVar3 = iVar3 + 1) {
iVar5 = (*param_4)(param_1,param_3,(int)param_2 + 0x1a,1);
if (iVar5 == -1) {
return 0xffffffff;
}
}
}
goto LAB_08010910;
}
if (0 < (int)local_34) {
uVar9 = param_2[0x16];
if ((int)local_30 <= (int)param_2[0x16]) {
uVar9 = local_30;
}
if ((0 < (int)uVar9) && (iVar3 = (*param_4)(param_1,param_3,puVar7), iVar3 == -1)) {
return 0xffffffff;
}
for (iVar3 = 0; uVar10 = param_2[0x16],
iVar3 < (int)(uVar10 - (uVar9 & ~((int)uVar9 >> 0x1f))); iVar3 = iVar3 + 1) {
iVar5 = (*param_4)(param_1,param_3,(int)param_2 + 0x1a,1);
if (iVar5 == -1) {
return 0xffffffff;
}
}
if ((((int)local_34 < (int)uVar12) || ((int)(*param_2 << 0x1f) < 0)) &&
(iVar3 = (*param_4)(param_1,param_3,uVar6,uVar2), iVar3 == -1)) {
return 0xffffffff;
}
uVar9 = uVar12 - local_34;
if ((int)(uVar12 - uVar10) <= (int)(uVar12 - local_34)) {
uVar9 = uVar12 - uVar10;
}
if ((0 < (int)uVar9) &&
(iVar3 = (*param_4)(param_1,param_3,uVar10 + (int)puVar7,uVar9), iVar3 == -1)) {
return 0xffffffff;
}
for (iVar3 = 0; iVar3 < (int)((uVar12 - local_34) - (uVar9 & ~((int)uVar9 >> 0x1f)));
iVar3 = iVar3 + 1) {
iVar5 = (*param_4)(param_1,param_3,(int)param_2 + 0x1a,1);
if (iVar5 == -1) {
return 0xffffffff;
}
}
goto LAB_08010910;
}
iVar3 = (*param_4)(param_1,param_3,DAT_080109b0,1);
uVar12 = local_30;
if (iVar3 == -1) {
return 0xffffffff;
}
if ((local_30 == 0 && local_34 == 0) && (-1 < (int)(*param_2 << 0x1f))) goto LAB_08010910;
iVar3 = (*param_4)(param_1,param_3,uVar6,uVar2);
if (iVar3 == -1) {
return 0xffffffff;
}
for (iVar3 = 0; -iVar3 != local_34 && iVar3 <= (int)-local_34; iVar3 = iVar3 + 1) {
iVar5 = (*param_4)(param_1,param_3,(int)param_2 + 0x1a,1);
if (iVar5 == -1) {
return 0xffffffff;
}
}
}
}
else {
uVar12 = param_2[4];
}
iVar3 = (*param_4)(param_1,param_3,puVar7,uVar12);
if (iVar3 == -1) {
return 0xffffffff;
}
LAB_08010910:
if ((int)(*param_2 << 0x1e) < 0) {
for (iVar3 = 0; iVar3 < (int)(param_2[3] - local_2c[0]); iVar3 = iVar3 + 1) {
iVar5 = (*param_4)(param_1,param_3,(int)param_2 + 0x19,1);
if (iVar5 == -1) {
return 0xffffffff;
}
}
}
if ((int)param_2[3] < (int)local_2c[0]) {
return local_2c[0];
}
return param_2[3];
}
void FUN_08010b28(undefined4 param_1)
{
FUN_08010b7c(*DAT_08010b34,param_1);
return;
}
uint FUN_08010b38(undefined4 param_1,undefined4 param_2)
{
int *piVar1;
int iVar2;
uint uVar3;
uint uVar4;
piVar1 = DAT_08010b78;
if (*DAT_08010b78 == 0) {
iVar2 = FUN_08012540();
*piVar1 = iVar2;
}
uVar3 = FUN_08012540(param_1,param_2);
if ((uVar3 == 0xffffffff) ||
((uVar4 = uVar3 + 3 & 0xfffffffc, uVar3 != uVar4 &&
(iVar2 = FUN_08012540(param_1,uVar4 - uVar3), iVar2 == -1)))) {
uVar4 = 0xffffffff;
}
return uVar4;
}
uint FUN_08010b7c(undefined4 *param_1,uint param_2)
{
uint *puVar1;
int iVar2;
uint uVar3;
uint uVar4;
uint uVar5;
uint *puVar6;
uint *puVar7;
uint uVar8;
puVar6 = DAT_08010c78;
uVar8 = (param_2 + 3 & 0xfffffffc) + 8;
if (uVar8 < 0xc) {
uVar8 = 0xc;
}
if (((int)uVar8 < 0) || (uVar8 < param_2)) {
*param_1 = 0xc;
}
else {
FUN_08011428();
puVar7 = (uint *)*puVar6;
for (puVar1 = (uint *)*puVar6; puVar1 != (uint *)0x0; puVar1 = (uint *)puVar1[1]) {
uVar4 = *puVar1 - uVar8;
if (-1 < (int)uVar4) {
if (uVar4 < 0xc) {
uVar8 = puVar1[1];
if (puVar7 == puVar1) {
*puVar6 = uVar8;
}
if (puVar7 != puVar1) {
puVar7[1] = uVar8;
}
}
else {
uVar3 = (int)puVar1 + uVar8;
*puVar1 = uVar8;
if (puVar7 != puVar1) {
puVar7[1] = uVar3;
}
uVar5 = puVar1[1];
if (puVar7 == puVar1) {
*puVar6 = uVar3;
}
*(uint *)((int)puVar1 + uVar8) = uVar4;
*(uint *)(uVar3 + 4) = uVar5;
}
goto LAB_08010c24;
}
puVar7 = puVar1;
}
puVar1 = (uint *)FUN_08010b38(param_1,uVar8);
if (puVar1 != (uint *)0xffffffff) {
*puVar1 = uVar8;
LAB_08010c24:
FUN_08011434(param_1);
puVar6 = puVar1 + 1;
uVar8 = (int)puVar1 + 0xbU & 0xfffffff8;
iVar2 = uVar8 - (int)puVar6;
if (iVar2 != 0) {
puVar6 = (uint *)((int)puVar6 - uVar8);
}
if (iVar2 == 0) {
return uVar8;
}
*(uint **)((int)puVar1 + iVar2) = puVar6;
return uVar8;
}
puVar1 = (uint *)*puVar6;
for (puVar7 = (uint *)*puVar6; puVar7 != (uint *)0x0; puVar7 = (uint *)puVar7[1]) {
puVar1 = puVar7;
}
if ((puVar1 != (uint *)0x0) &&
(uVar4 = *puVar1, iVar2 = FUN_08012540(param_1,0), (int)puVar1 + uVar4 == iVar2)) {
uVar4 = *puVar1;
iVar2 = FUN_08010b38(param_1,uVar8 - uVar4);
if (iVar2 != -1) {
*puVar1 = *puVar1 + (uVar8 - uVar4);
puVar7 = (uint *)*puVar6;
if (((uint *)*puVar6)[1] == 0) {
*puVar6 = 0;
}
else {
do {
puVar6 = puVar7;
puVar7 = (uint *)puVar6[1];
} while (puVar7 != puVar1);
puVar6[1] = 0;
}
goto LAB_08010c24;
}
}
*param_1 = 0xc;
FUN_08011434(param_1);
}
return 0;
}
undefined4
FUN_08010c7c(undefined4 param_1,uint *param_2,uint *param_3,undefined4 param_4,code *param_5)
{
int iVar1;
undefined4 uVar2;
uint uVar3;
uint uVar4;
bool bVar5;
uVar4 = param_2[4];
if ((int)param_2[4] < (int)param_2[2]) {
uVar4 = param_2[2];
}
*param_3 = uVar4;
if (*(char *)((int)param_2 + 0x43) != '\0') {
*param_3 = uVar4 + 1;
}
if ((int)(*param_2 << 0x1a) < 0) {
*param_3 = *param_3 + 2;
}
uVar4 = *param_2 & 6;
if (uVar4 == 0) {
for (; (int)uVar4 < (int)(param_2[3] - *param_3); uVar4 = uVar4 + 1) {
iVar1 = (*param_5)(param_1,param_4,(int)param_2 + 0x19,1);
if (iVar1 == -1) goto LAB_08010d20;
}
}
uVar3 = (uint)*(byte *)((int)param_2 + 0x43);
if (uVar3 != 0) {
uVar3 = 1;
}
if ((int)(*param_2 << 0x1a) < 0) {
*(undefined1 *)((int)param_2 + uVar3 + 0x43) = 0x30;
*(undefined1 *)((int)param_2 + uVar3 + 0x44) = *(undefined1 *)((int)param_2 + 0x45);
uVar3 = uVar3 + 2;
}
iVar1 = (*param_5)(param_1,param_4,(int)param_2 + 0x43,uVar3);
if (iVar1 == -1) {
LAB_08010d20:
uVar2 = 0xffffffff;
}
else {
bVar5 = (*param_2 & 6) == 4;
if (bVar5) {
uVar4 = param_2[3] - *param_3;
}
if (bVar5) {
uVar4 = uVar4 & ~((int)uVar4 >> 0x1f);
}
else {
uVar4 = 0;
}
if ((int)param_2[4] < (int)param_2[2]) {
uVar4 = uVar4 + (param_2[2] - param_2[4]);
}
for (uVar3 = 0; uVar4 != uVar3; uVar3 = uVar3 + 1) {
iVar1 = (*param_5)(param_1,param_4,(int)param_2 + 0x1a,1);
if (iVar1 == -1) goto LAB_08010d20;
}
uVar2 = 0;
}
return uVar2;
}
code * FUN_08010d58(undefined4 param_1,uint *param_2,undefined4 param_3,code *param_4,int *param_5)
{
bool bVar1;
int iVar2;
code *pcVar3;
int iVar4;
undefined1 *puVar5;
undefined4 uVar6;
uint uVar7;
uint uVar8;
uint *puVar9;
undefined4 *puVar10;
uint uVar11;
undefined1 *puVar12;
byte bVar13;
code *local_24;
iVar2 = DAT_08010f8c;
bVar13 = (byte)param_2[6];
puVar5 = (undefined1 *)((int)param_2 + 0x43);
local_24 = param_4;
if (0x78 < bVar13) {
switchD_08010d94_caseD_65:
*(byte *)((int)param_2 + 0x42) = bVar13;
LAB_08010e00:
puVar5 = (undefined1 *)((int)param_2 + 0x42);
uVar7 = 1;
LAB_08010f3e:
param_2[4] = uVar7;
*(undefined1 *)((int)param_2 + 0x43) = 0;
goto LAB_08010e9e;
}
if (bVar13 < 99) {
if (bVar13 == 0) goto LAB_08010f1c;
if (bVar13 == 0x58) goto LAB_08010ec8;
goto switchD_08010d94_caseD_65;
}
switch(bVar13) {
case 99:
uVar6 = *(undefined4 *)*param_5;
*param_5 = (int)((undefined4 *)*param_5 + 1);
*(char *)((int)param_2 + 0x42) = (char)uVar6;
goto LAB_08010e00;
case 100:
case 0x69:
puVar9 = (uint *)*param_5;
uVar7 = *param_2;
*param_5 = (int)(puVar9 + 1);
if (((int)(uVar7 << 0x18) < 0) || (-1 < (int)(uVar7 << 0x19))) {
uVar7 = *puVar9;
}
else {
uVar7 = (uint)(short)*puVar9;
}
if ((int)uVar7 < 0) {
uVar7 = -uVar7;
*(undefined1 *)((int)param_2 + 0x43) = 0x2d;
}
uVar8 = 10;
iVar2 = DAT_08010f8c;
goto LAB_08010e52;
default:
goto switchD_08010d94_caseD_65;
case 0x6e:
puVar10 = (undefined4 *)*param_5;
uVar8 = *param_2;
uVar7 = param_2[5];
*param_5 = (int)(puVar10 + 1);
puVar9 = (uint *)*puVar10;
if (((int)(uVar8 << 0x18) < 0) || (-1 < (int)(uVar8 << 0x19))) {
*puVar9 = uVar7;
}
else {
*(short *)puVar9 = (short)uVar7;
}
LAB_08010f1c:
param_2[4] = 0;
goto LAB_08010e9e;
case 0x6f:
case 0x75:
uVar7 = *(uint *)*param_5;
if ((-1 < (int)(*param_2 << 0x18)) && ((int)(*param_2 << 0x19) < 0)) {
uVar7 = uVar7 & 0xffff;
}
*param_5 = (int)((uint *)*param_5 + 1);
if (bVar13 == 0x6f) {
uVar8 = 8;
}
else {
uVar8 = 10;
}
break;
case 0x70:
*param_2 = *param_2 | 0x20;
case 0x78:
bVar13 = 0x78;
iVar2 = DAT_08010f90;
LAB_08010ec8:
*(byte *)((int)param_2 + 0x45) = bVar13;
uVar8 = *param_2;
uVar7 = *(uint *)*param_5;
if ((-1 < (int)(uVar8 << 0x18)) && ((int)(uVar8 << 0x19) < 0)) {
uVar7 = uVar7 & 0xffff;
}
*param_5 = (int)((uint *)*param_5 + 1);
if ((int)(uVar8 << 0x1f) < 0) {
*param_2 = uVar8 | 0x20;
}
if (uVar7 == 0) {
*param_2 = *param_2 & 0xffffffdf;
}
uVar8 = 0x10;
break;
case 0x73:
puVar10 = (undefined4 *)*param_5;
*param_5 = (int)(puVar10 + 1);
puVar5 = (undefined1 *)*puVar10;
iVar2 = memchr_custom(puVar5,0,param_2[1],puVar10,param_1,param_2,param_3);
if (iVar2 != 0) {
param_2[1] = iVar2 - (int)puVar5;
}
uVar7 = param_2[1];
goto LAB_08010f3e;
}
*(undefined1 *)((int)param_2 + 0x43) = 0;
LAB_08010e52:
uVar11 = param_2[1];
param_2[2] = uVar11;
puVar12 = puVar5;
if (((int)uVar11 < 0) || (*param_2 = *param_2 & 0xfffffffb, uVar11 != 0 || uVar7 != 0)) {
do {
puVar12 = puVar12 + -1;
*puVar12 = *(undefined1 *)(iVar2 + (uVar7 - uVar8 * (uVar7 / uVar8)));
bVar1 = uVar8 <= uVar7;
uVar7 = uVar7 / uVar8;
} while (bVar1);
}
if (((uVar8 == 8) && ((int)(*param_2 << 0x1f) < 0)) && ((int)param_2[1] <= (int)param_2[4])) {
puVar12[-1] = 0x30;
puVar12 = puVar12 + -1;
}
param_2[4] = (int)puVar5 - (int)puVar12;
puVar5 = puVar12;
LAB_08010e9e:
iVar2 = FUN_08010c7c(param_1,param_2,&local_24,param_3,param_4);
if ((iVar2 == -1) || (iVar2 = (*param_4)(param_1,param_3,puVar5,param_2[4]), iVar2 == -1)) {
LAB_08010eb2:
pcVar3 = (code *)0xffffffff;
}
else {
if ((int)(*param_2 << 0x1e) < 0) {
for (iVar2 = 0; iVar2 < (int)(param_2[3] - (int)local_24); iVar2 = iVar2 + 1) {
iVar4 = (*param_4)(param_1,param_3,(int)param_2 + 0x19,1);
if (iVar4 == -1) goto LAB_08010eb2;
}
}
pcVar3 = (code *)param_2[3];
if ((int)param_2[3] < (int)local_24) {
pcVar3 = local_24;
}
}
return pcVar3;
}
undefined4 FUN_08010f94(undefined4 param_1,uint *param_2,int *param_3,undefined4 *param_4)
{
byte bVar1;
uint uVar2;
uint *puVar3;
uint uVar4;
int iVar5;
undefined4 *puVar6;
uint *puVar7;
uint *puVar8;
int iVar9;
int iVar10;
int unaff_r11;
bool bVar11;
undefined4 uVar12;
undefined8 uVar13;
int local_38;
int local_30;
uint *local_2c;
undefined4 uVar14;
uVar4 = param_2[2];
uVar2 = uVar4 - 1;
if (0x15c < uVar2) {
unaff_r11 = uVar4 - 0x15d;
uVar4 = 0x15d;
}
if (0x15c < uVar2) {
param_2[2] = uVar4;
}
uVar4 = 0;
puVar3 = param_2 + 7;
*param_2 = *param_2 | 0x780;
local_30 = 0;
local_2c = (uint *)0x0;
if (uVar2 < 0x15d) {
unaff_r11 = 0;
}
iVar10 = 0;
iVar9 = 0;
local_38 = 0;
puVar8 = puVar3;
LAB_08010fde:
do {
if (param_2[2] == 0) break;
bVar1 = *(byte *)*param_3;
uVar2 = (uint)bVar1;
if (0x4e < uVar2) {
if (uVar2 < 0x6f) {
if (0x60 < uVar2) {
iVar5 = -0x61;
goto LAB_08011026;
}
if (uVar2 == 0x54) goto LAB_080111b8;
bVar11 = uVar2 == 0x59;
}
else {
if (uVar2 == 0x74) {
LAB_080111b8:
if (uVar4 == 6) {
uVar4 = 7;
goto LAB_08011126;
}
break;
}
bVar11 = uVar2 == 0x79;
}
if ((bVar11) && (uVar4 == 7)) {
uVar4 = 8;
goto LAB_08011126;
}
break;
}
if (uVar2 < 0x41) {
if (0xe < (uVar2 - 0x2b & 0xff)) break;
switch(uVar2 - 0x2b) {
case 0:
case 2:
if (-1 < (int)(*param_2 << 0x18)) goto switchD_08011074_caseD_1;
*param_2 = *param_2 & 0xffffff7f;
break;
default:
goto switchD_08011074_caseD_1;
case 3:
if (-1 < (int)(*param_2 << 0x16)) goto switchD_08011074_caseD_1;
*param_2 = *param_2 & 0xfffffd7f;
local_38 = iVar9;
break;
case 5:
if (-1 < (int)(*param_2 << 0x17)) goto switchD_08011074_caseD_6;
*param_2 = *param_2 & 0xffffff7f;
iVar9 = iVar9 + 1;
if (unaff_r11 != 0) {
unaff_r11 = unaff_r11 + -1;
param_2[2] = param_2[2] + 1;
}
goto LAB_080110f2;
case 6:
case 7:
case 8:
case 9:
case 10:
case 0xb:
case 0xc:
case 0xd:
case 0xe:
switchD_08011074_caseD_6:
if (iVar10 + uVar4 != 0) goto switchD_08011074_caseD_1;
*param_2 = *param_2 & 0xfffffe7f;
uVar4 = 0;
iVar10 = 0;
}
}
else {
iVar5 = -0x41;
LAB_08011026:
switch(uVar2 + iVar5) {
case 0:
if (iVar10 == 1) {
iVar10 = 2;
break;
}
default:
goto switchD_08011074_caseD_1;
case 4:
uVar2 = *param_2;
if ((uVar2 & 0x500) != 0x400) {
if (-1 < (int)(uVar2 << 0x15)) goto switchD_08011074_caseD_1;
if (iVar9 == 0) {
LAB_080113ac:
iVar9 = 0;
goto LAB_08011006;
}
}
bVar11 = -1 < (int)(uVar2 << 0x16);
iVar5 = uVar2 << 0x16;
if (bVar11) {
iVar5 = local_38;
}
if (bVar11) {
iVar5 = iVar9 - iVar5;
}
if (bVar11) {
local_30 = iVar5;
local_2c = puVar8;
}
*param_2 = uVar2 & 0xfffff87f | 0x180;
iVar9 = 0;
break;
case 5:
if (uVar4 != 2) goto switchD_08011074_caseD_1;
uVar4 = 3;
break;
case 8:
if (uVar4 == 0) {
if (iVar9 != 0) goto LAB_08010ffe;
if ((*param_2 & 0x700) != 0x700) goto LAB_080113ac;
*param_2 = *param_2 & 0xfffff87f;
uVar4 = 1;
}
else {
if (uVar4 != 3) {
bVar11 = uVar4 == 5;
LAB_0801116c:
if (!bVar11) goto switchD_08011074_caseD_1;
}
LAB_08011170:
uVar4 = uVar4 + 1 & 0xff;
}
break;
case 0xd:
if (iVar10 == 0) {
if ((iVar9 != 0) || ((*param_2 & 0x700) != 0x700)) {
LAB_08011166:
if (uVar4 != 1) {
bVar11 = uVar4 == 4;
goto LAB_0801116c;
}
goto LAB_08011170;
}
*param_2 = *param_2 & 0xfffff87f;
iVar10 = 1;
}
else {
if (iVar10 != 2) goto LAB_08011166;
iVar10 = 3;
}
}
}
LAB_08011126:
*(byte *)puVar8 = bVar1;
puVar8 = (uint *)((int)puVar8 + 1);
LAB_080110f2:
param_2[2] = param_2[2] - 1;
param_2[4] = param_2[4] + 1;
iVar5 = param_3[1];
param_3[1] = iVar5 + -1;
if (0 < iVar5 + -1) {
*param_3 = *param_3 + 1;
goto LAB_08010fde;
}
iVar5 = (*(code *)param_2[0x60])(param_1,param_3);
} while (iVar5 == 0);
switchD_08011074_caseD_1:
if (iVar9 != 0) {
LAB_08010ffe:
*param_2 = *param_2 & 0xfffffeff;
}
LAB_08011006:
if (iVar10 - 1U < 2) {
while (puVar3 < puVar8) {
puVar8 = (uint *)((int)puVar8 + -1);
(*(code *)param_2[0x5f])(param_1,*(byte *)puVar8,param_3);
param_2[4] = param_2[4] - 1;
}
return 1;
}
if (uVar4 - 1 < 7) {
uVar2 = uVar4;
puVar7 = puVar8;
if (uVar4 < 3) {
while (puVar3 < puVar8) {
puVar8 = (uint *)((int)puVar8 + -1);
(*(code *)param_2[0x5f])(param_1,*(byte *)puVar8,param_3);
param_2[4] = param_2[4] - 1;
}
return 1;
}
while (uVar2 = uVar2 - 1 & 0xff, uVar2 != 2) {
(*(code *)param_2[0x5f])(param_1,*(byte *)((int)puVar7 + -1),param_3);
param_2[4] = param_2[4] - 1;
puVar7 = (uint *)((int)puVar7 + -1);
}
puVar8 = (uint *)((int)puVar8 - (uVar4 - 3 & 0xff));
}
puVar7 = puVar8;
if ((int)(*param_2 << 0x17) < 0) {
if ((int)(*param_2 << 0x15) < 0) {
while (puVar3 < puVar8) {
puVar8 = (uint *)((int)puVar8 + -1);
(*(code *)param_2[0x5f])(param_1,*(byte *)puVar8,param_3);
param_2[4] = param_2[4] - 1;
}
return 1;
}
bVar1 = *(byte *)((int)puVar8 + -1);
puVar7 = (uint *)((int)puVar8 + -1);
param_2[4] = param_2[4] - 1;
if ((bVar1 != 0x65) && (bVar1 != 0x45)) {
(*(code *)param_2[0x5f])(param_1,bVar1,param_3);
bVar1 = *(byte *)((int)puVar8 + -2);
puVar7 = (uint *)((int)puVar8 + -2);
param_2[4] = param_2[4] - 1;
}
(*(code *)param_2[0x5f])(param_1,bVar1,param_3);
}
if ((*param_2 & 0x10) != 0) {
return 0;
}
*(byte *)puVar7 = 0;
if ((*param_2 & 0x600) == 0x400) {
iVar10 = local_38 - iVar9;
local_2c = puVar7;
if (iVar9 != local_38) {
LAB_08011364:
if ((uint *)((int)param_2 + 0x16f) <= local_2c) {
local_2c = (uint *)((int)param_2 + 0x16e);
}
updateMidiBuffer(local_2c,DAT_080113b4,iVar10);
}
}
else if (local_30 != 0) {
iVar10 = thunk_FUN_0801223c(param_1,(byte *)((int)local_2c + 1),0,10);
iVar10 = iVar10 - local_30;
goto LAB_08011364;
}
uVar13 = FUN_08012230(param_1,puVar3,0);
uVar14 = (undefined4)((ulonglong)uVar13 >> 0x20);
uVar12 = (undefined4)uVar13;
uVar2 = *param_2;
puVar6 = (undefined4 *)*param_4;
if ((uVar2 & 2) == 0) {
*param_4 = puVar6 + 1;
if ((uVar2 & 4) == 0) {
puVar6 = (undefined4 *)*puVar6;
iVar9 = FUN_08000b4c(uVar12,uVar14,uVar12,uVar14);
if (iVar9 == 0) {
uVar12 = FUN_08000c08(uVar12,uVar14);
*puVar6 = uVar12;
}
else {
uVar12 = FUN_0800eba4(DAT_080113b8);
*puVar6 = uVar12;
}
goto LAB_08011344;
}
}
else {
*param_4 = puVar6 + 1;
}
*(undefined8 *)*puVar6 = uVar13;
LAB_08011344:
param_2[3] = param_2[3] + 1;
return 0;
}
int appendToBuffer(undefined1 *param_1,int param_2,undefined4 param_3)
{
int iVar1;
undefined4 *puVar2;
undefined1 *local_80 [2];
int local_78;
undefined2 local_74;
undefined2 local_72;
undefined1 *local_70;
int local_6c;
undefined4 local_1c;
puVar2 = (undefined4 *)*DAT_08011424;
if (param_2 < 0) {
*puVar2 = 0x8b;
iVar1 = -1;
}
else {
local_74 = 0x208;
local_1c = 0;
if (param_2 == 0) {
local_78 = 0;
}
else {
local_78 = param_2 + -1;
}
local_72 = 0xffff;
local_80[0] = param_1;
local_70 = param_1;
local_6c = local_78;
iVar1 = FUN_08013a30(puVar2,local_80,param_3);
if (iVar1 + 1 < 0 != SCARRY4(iVar1,1)) {
*puVar2 = 0x8b;
}
if (param_2 != 0) {
*local_80[0] = 0;
}
}
return iVar1;
}
void FUN_08011428(void)
{
FUN_080125b6(DAT_08011430);
return;
}
void FUN_08011434(void)
{
FUN_080125b8(DAT_0801143c);
return;
}
void updateMidiBuffer(undefined1 *param_1,undefined4 param_2)
{
undefined1 *local_80 [2];
undefined4 local_78;
undefined4 local_74;
undefined1 *local_70;
undefined4 local_6c;
undefined4 local_1c;
local_6c = 0x7fffffff;
local_78 = 0x7fffffff;
local_74 = DAT_08011480;
local_1c = 0;
local_80[0] = param_1;
local_70 = param_1;
FUN_08013a30(*DAT_0801147c,local_80,param_2);
*local_80[0] = 0;
return;
}
undefined4 * FUN_08011484(undefined4 *param_1,undefined2 param_2,undefined2 param_3)
{
undefined4 *puVar1;
undefined4 *puVar2;
*param_1 = 0;
param_1[1] = 0;
param_1[4] = 0;
param_1[5] = 0;
param_1[2] = 0;
*(undefined2 *)(param_1 + 3) = param_2;
param_1[0x19] = 0;
*(undefined2 *)((int)param_1 + 0xe) = param_3;
param_1[6] = 0;
puVar2 = (undefined4 *)FUN_08012484(param_1 + 0x17,0,8);
param_1[9] = DAT_080114dc;
param_1[10] = DAT_080114e0;
param_1[0xb] = DAT_080114e4;
param_1[0xc] = DAT_080114e8;
puVar1 = DAT_080114ec;
param_1[8] = param_1;
if (((param_1 != puVar1) && (param_1 != puVar1 + 0x1a)) && (param_1 != puVar1 + 0x34)) {
return puVar2;
}
return param_1 + 0x16;
}
void FUN_08011548(void)
{
int iVar1;
iVar1 = DAT_0801157c;
*DAT_08011578 = DAT_08011580;
FUN_08011484(iVar1,4,0);
FUN_08011484(iVar1 + 0x68,9,1);
FUN_08011484(iVar1 + 0xd0,0x12,2);
return;
}
void FUN_08011584(void)
{
FUN_080125b6(DAT_0801158c);
return;
}
void FUN_0801159c(int param_1)
{
FUN_08011584();
if (*(int *)(param_1 + 0x20) == 0) {
*(undefined4 *)(param_1 + 0x20) = DAT_080115c4;
if (*DAT_080115c8 == 0) {
FUN_08011548();
}
}
FUN_080125b8(DAT_08011598);
return;
}
int FUN_080115cc(undefined4 param_1,int param_2,uint param_3)
{
int iVar1;
uint uVar2;
if (param_2 != 0) {
if (param_3 == 0) {
FUN_08013274();
iVar1 = 0;
}
else {
uVar2 = FUN_0801497c();
if (((uVar2 < param_3) || (iVar1 = param_2, param_3 <= uVar2 >> 1)) &&
(iVar1 = FUN_08010b7c(param_1,param_3), iVar1 != 0)) {
if (uVar2 <= param_3) {
param_3 = uVar2;
}
copyBuffer(iVar1,param_2,param_3);
FUN_08013274(param_1,param_2);
}
}
return iVar1;
}
iVar1 = FUN_08010b7c(param_1,param_3);
return iVar1;
}
undefined8 FUN_08011628(undefined4 param_1,int param_2,int param_3)
{
int iVar1;
undefined8 uVar2;
uVar2 = FUN_08014700(param_1);
if ((param_3 != 0) && (iVar1 = 0x6b - ((uint)(param_2 << 1) >> 0x15), 0 < iVar1)) {
uVar2 = FUN_08000618((int)uVar2,(int)((ulonglong)uVar2 >> 0x20),0,iVar1 * 0x100000 + 0x3ff00000)
;
}
return uVar2;
}
ulonglong FUN_08012230(undefined4 *param_1,byte *param_2,undefined4 *param_3)
{
byte bVar1;
bool bVar2;
uint uVar3;
undefined4 *puVar4;
int iVar5;
int iVar6;
byte *pbVar7;
byte *pbVar8;
int iVar9;
uint uVar10;
uint uVar11;
uint uVar12;
uint uVar13;
int iVar14;
int iVar15;
int iVar16;
uint uVar17;
int iVar18;
undefined4 uVar19;
int iVar20;
bool bVar21;
bool bVar22;
undefined4 uVar23;
ulonglong uVar24;
undefined8 uVar25;
undefined8 uVar26;
ulonglong uVar27;
longlong lVar28;
undefined8 local_88;
uint local_80;
int local_7c;
uint local_78;
uint local_74;
byte *local_70;
int local_68;
uint local_60;
int local_5c;
uint local_54;
int local_4c;
byte *local_3c;
int local_38;
int local_34;
uint local_30;
uint local_2c;
local_38 = 0;
for (pbVar7 = param_2; bVar1 = *pbVar7, bVar1 != 0x2b; pbVar7 = pbVar7 + 1) {
if (0x2b < bVar1) {
if (bVar1 == 0x2d) {
local_68 = 1;
goto LAB_08011704;
}
LAB_08011698:
local_68 = 0;
local_3c = pbVar7;
goto LAB_0801169c;
}
if (bVar1 < 0xe) {
if (bVar1 < 9) {
if (bVar1 != 0) goto LAB_08011698;
goto LAB_08011710;
}
}
else if (bVar1 != 0x20) goto LAB_08011698;
}
local_68 = 0;
LAB_08011704:
local_3c = pbVar7 + 1;
if (pbVar7[1] == 0) goto LAB_08011710;
LAB_0801169c:
pbVar7 = local_3c;
if (*local_3c == 0x30) {
if ((local_3c[1] & 0xdf) == 0x58) {
uVar3 = FUN_080133d8(param_1,&local_3c,DAT_080118f8,&local_34,&local_38,local_68,DAT_08012238)
;
uVar3 = uVar3 & 0xf;
uVar24 = 0;
if (uVar3 != 0) {
if (uVar3 == 6) {
local_68 = 0;
local_3c = pbVar7 + 1;
uVar24 = 0;
}
else {
if (local_38 != 0) {
FUN_080148f4(&local_30,0x35);
FUN_080140a8(param_1,local_38);
}
uVar10 = 0;
uVar11 = 0;
switch(uVar3) {
case 1:
case 5:
uVar10 = local_30;
uVar11 = local_2c & 0xffefffff | (local_34 + 0x433) * 0x100000;
break;
case 2:
uVar10 = local_30;
uVar11 = local_2c;
break;
case 3:
uVar11 = DAT_08011900;
break;
case 4:
uVar10 = 0xffffffff;
uVar11 = 0x7fffffff;
}
uVar24 = CONCAT44(uVar11,uVar10);
if ((uVar11 & 0x7ff00000) == 0) {
puVar4 = (undefined4 *)FUN_08012560();
*puVar4 = 0x22;
uVar24 = CONCAT44(uVar11,uVar10);
}
}
}
}
else {
do {
pbVar8 = local_3c + 1;
pbVar7 = local_3c + 1;
local_3c = pbVar8;
} while (*pbVar7 == 0x30);
uVar24 = 0;
if (*pbVar7 != 0) {
bVar21 = true;
goto LAB_080117a0;
}
}
goto LAB_080116da;
}
bVar21 = false;
LAB_080117a0:
iVar18 = 0;
local_70 = local_3c;
local_74 = 0;
iVar20 = 0;
while( true ) {
uVar3 = (uint)*local_3c;
uVar10 = uVar3 - 0x30;
if (9 < (uVar10 & 0xff)) break;
uVar3 = uVar10 & 0xff;
if (iVar20 < 9) {
uVar3 = local_74;
}
local_3c = local_3c + 1;
if (iVar20 < 9) {
local_74 = uVar3 * 10 + uVar10;
}
else {
iVar18 = iVar18 * 10 + uVar10;
}
iVar20 = iVar20 + 1;
}
iVar5 = FUN_08012494(local_3c,DAT_080118fc,1);
iVar15 = iVar20;
if (iVar5 == 0) {
uVar3 = (uint)local_3c[1];
if (iVar20 != 0) {
uVar10 = 0;
local_78 = 0;
local_3c = local_3c + 1;
goto LAB_08011840;
}
uVar11 = 0;
local_3c = local_3c + 1;
while (uVar3 == 0x30) {
uVar11 = uVar11 + 1;
uVar3 = (uint)local_3c[1];
local_3c = local_3c + 1;
}
if (uVar3 - 0x31 < 9) {
uVar10 = 0;
local_70 = local_3c;
iVar15 = 0;
local_78 = uVar11;
do {
iVar5 = uVar3 - 0x30;
uVar3 = uVar10 + 1;
if (iVar5 != 0) {
local_78 = local_78 + uVar3;
iVar14 = iVar15;
while (iVar9 = iVar14 + 1, iVar9 - iVar15 < (int)uVar3) {
if (iVar14 < 9) {
local_74 = local_74 * 10;
iVar14 = iVar9;
}
else {
iVar14 = iVar9;
if (iVar9 < 0x11) {
iVar18 = iVar18 * 10;
}
}
}
uVar10 = uVar10 & ~((int)uVar10 >> 0x1f);
iVar14 = iVar15 + uVar10;
iVar15 = iVar15 + 1 + uVar10;
if (iVar14 < 9) {
local_74 = local_74 * 10 + iVar5;
}
else if (iVar14 < 0x10) {
iVar18 = iVar18 * 10 + iVar5;
}
uVar3 = 0;
}
uVar10 = uVar3;
uVar3 = (uint)local_3c[1];
local_3c = local_3c + 1;
LAB_08011840:
} while (uVar3 - 0x30 < 10);
bVar22 = true;
uVar11 = uVar10;
goto LAB_080117d2;
}
if ((uVar3 == 0x65) || (uVar3 == 0x45)) {
local_78 = 0;
bVar22 = true;
goto LAB_080117dc;
}
bVar22 = true;
LAB_0801195a:
uVar24 = 0;
if (bVar21 || uVar11 != 0) goto LAB_080116da;
if (bVar22) goto LAB_08011710;
if (uVar3 == 0x69) {
LAB_080119be:
iVar20 = FUN_0801381c(&local_3c,DAT_08011bec);
if (iVar20 == 0) goto LAB_08011710;
local_3c = local_3c + -1;
iVar20 = FUN_0801381c(&local_3c,DAT_08011bf0);
if (iVar20 == 0) {
local_3c = local_3c + 1;
}
uVar24 = 0;
goto LAB_080116da;
}
if (uVar3 < 0x6a) {
if (uVar3 == 0x49) goto LAB_080119be;
bVar21 = uVar3 == 0x4e;
}
else {
bVar21 = uVar3 == 0x6e;
}
if ((bVar21) && (iVar20 = FUN_0801381c(&local_3c,DAT_08011be4), iVar20 != 0)) {
if ((*local_3c == 0x28) &&
(iVar20 = FUN_08013844(&local_3c,DAT_08011be8,&local_30), iVar20 == 5)) {
uVar24 = (ulonglong)local_30;
}
else {
uVar24 = FUN_080125e0(DAT_08011bf4);
}
goto LAB_080116da;
}
LAB_08011710:
if (param_3 == (undefined4 *)0x0) {
return 0;
}
local_68 = 0;
local_3c = param_2;
uVar24 = 0;
}
else {
local_78 = 0;
bVar22 = false;
uVar11 = 0;
LAB_080117d2:
if ((uVar3 == 0x65) || (pbVar7 = local_3c, uVar3 == 0x45)) {
if (iVar15 == 0) {
LAB_080117dc:
if (!bVar21 && uVar11 == 0) goto LAB_08011710;
iVar15 = 0;
}
param_2 = local_3c;
uVar3 = (uint)local_3c[1];
if (uVar3 == 0x2b) {
bVar2 = false;
LAB_080118ea:
uVar3 = (uint)local_3c[2];
local_3c = local_3c + 2;
}
else {
if (uVar3 == 0x2d) {
bVar2 = true;
goto LAB_080118ea;
}
bVar2 = false;
local_3c = local_3c + 1;
}
pbVar7 = param_2;
if (9 < uVar3 - 0x30) goto LAB_08011804;
while (pbVar7 = local_3c, uVar3 == 0x30) {
uVar3 = (uint)local_3c[1];
local_3c = local_3c + 1;
}
if (8 < uVar3 - 0x31) goto LAB_08011804;
while( true ) {
local_7c = uVar3 - 0x30;
pbVar8 = local_3c + 1;
uVar3 = (uint)local_3c[1];
local_3c = pbVar8;
if (9 < uVar3 - 0x30) break;
uVar3 = local_7c * 10 + uVar3;
}
iVar5 = 19999;
if (((int)pbVar8 - (int)pbVar7 < 9) && (local_7c < 20000)) {
iVar5 = local_7c;
}
if (bVar2) {
iVar5 = -iVar5;
}
}
else {
LAB_08011804:
local_3c = pbVar7;
iVar5 = 0;
}
if (iVar15 == 0) goto LAB_0801195a;
uVar3 = iVar5 - local_78;
if (iVar20 == 0) {
iVar20 = iVar15;
}
iVar14 = iVar15;
if (0xf < iVar15) {
iVar14 = 0x10;
}
uVar24 = FUN_08000524(local_74);
if (iVar15 < 10) {
LAB_08011a1e:
iVar18 = DAT_08011bf8;
uVar19 = (undefined4)(uVar24 >> 0x20);
if (uVar3 != 0) {
if ((int)uVar3 < 1) {
if ((int)(uVar3 + 0x16) < 0 != SCARRY4(uVar3,0x16)) goto LAB_08011a72;
puVar4 = (undefined4 *)(DAT_08011bf8 + (local_78 - iVar5) * 8);
uVar24 = FUN_0800086c((int)uVar24,uVar19,*puVar4,puVar4[1]);
}
else {
if ((int)uVar3 < 0x17) {
uVar26 = *(undefined8 *)(DAT_08011bf8 + uVar3 * 8);
}
else {
if (0x25 - iVar15 < (int)uVar3) goto LAB_08011a72;
puVar4 = (undefined4 *)(DAT_08011bf8 + (0xf - iVar15) * 8);
uVar26 = FUN_08000618(*puVar4,puVar4[1],(int)uVar24,uVar19);
uVar24 = *(ulonglong *)(iVar18 + (uVar3 - (0xf - iVar15)) * 8);
}
uVar24 = FUN_08000618((int)uVar26,(int)((ulonglong)uVar26 >> 0x20),(int)uVar24,
(int)(uVar24 >> 0x20));
}
}
}
else {
iVar9 = DAT_08011bf8 + iVar14 * 8;
uVar26 = FUN_08000618((int)uVar24,(int)(uVar24 >> 0x20),*(undefined4 *)(iVar9 + -0x48),
*(undefined4 *)(iVar9 + -0x44));
uVar25 = FUN_08000524(iVar18);
uVar24 = fp_multiply((int)uVar26,(int)((ulonglong)uVar26 >> 0x20),(int)uVar25,
(int)((ulonglong)uVar25 >> 0x20));
if (iVar15 < 0x10) goto LAB_08011a1e;
LAB_08011a72:
uVar19 = (undefined4)(uVar24 >> 0x20);
uVar10 = (iVar15 - iVar14) + uVar3;
if ((int)uVar10 < 1) {
if (uVar10 == 0) {
LAB_08011b88:
local_80 = 0;
LAB_08011c7c:
local_74 = FUN_08014178(param_1,local_70,iVar20,iVar15,local_74);
if (local_74 != 0) {
iVar5 = local_78 - iVar5;
if (-1 < (int)uVar3) {
iVar5 = 0;
}
iVar15 = 0;
uVar10 = uVar3 & ~((int)uVar3 >> 0x1f);
iVar20 = 0;
LAB_08011cae:
uVar11 = (uint)(uVar24 >> 0x20);
uVar12 = (uint)uVar24;
iVar18 = FUN_08014028(param_1,*(undefined4 *)(local_74 + 4));
if (iVar18 == 0) goto LAB_08011aae;
copyBuffer(iVar18 + 0xc,local_74 + 0xc,(*(int *)(local_74 + 0x10) + 2) * 4);
local_38 = FUN_080147e0(uVar12,param_1,&local_34,&local_30);
if (local_38 == 0) goto LAB_08011aae;
iVar20 = FUN_080142a4(param_1,1);
if (iVar20 == 0) {
LAB_08011cf8:
iVar20 = 0;
goto LAB_08011aae;
}
if (local_34 < 0) {
uVar17 = uVar10 - local_34;
iVar14 = iVar5;
}
else {
uVar17 = uVar10;
iVar14 = local_34 + iVar5;
}
iVar16 = (local_34 - local_80) + local_30 + -1;
iVar9 = 0x36 - local_30;
if (iVar16 < DAT_08011ec0) {
uVar13 = DAT_08011ec0 - iVar16;
iVar9 = iVar9 - uVar13;
if ((int)uVar13 < 0x20) {
local_54 = 1 << (uVar13 & 0xff);
local_60 = 0;
}
else {
local_60 = 1 << (0xfffffbe2U - iVar16 & 0xff);
local_54 = 1;
}
}
else {
local_60 = 0;
local_54 = 1;
}
iVar16 = iVar14 + iVar9;
iVar9 = uVar17 + iVar9 + local_80;
iVar6 = iVar14;
if (iVar16 <= iVar14) {
iVar6 = iVar16;
}
if (iVar9 <= iVar6) {
iVar6 = iVar9;
}
if (0 < iVar6) {
iVar16 = iVar16 - iVar6;
iVar9 = iVar9 - iVar6;
iVar14 = iVar14 - iVar6;
}
if (0 < iVar5) {
iVar20 = FUN_08014414(param_1,iVar20,iVar5);
if (iVar20 == 0) goto LAB_08011cf8;
iVar6 = FUN_080142d0(param_1,iVar20,local_38);
if (iVar6 == 0) goto LAB_08011aae;
FUN_080140a8(param_1,local_38);
local_38 = iVar6;
}
if ((0 < iVar16) && (local_38 = FUN_080144c8(param_1,local_38,iVar16), local_38 == 0))
goto LAB_08011aae;
if (((0 < (int)uVar3) && (iVar18 = FUN_08014414(param_1,iVar18,uVar10), iVar18 == 0)) ||
((0 < iVar9 && (iVar18 = FUN_080144c8(param_1,iVar18,iVar9), iVar18 == 0)))) {
iVar18 = 0;
goto LAB_08011aae;
}
if (((0 < iVar14) && (iVar20 = FUN_080144c8(param_1,iVar20,iVar14), iVar20 == 0)) ||
(iVar15 = FUN_080145d8(param_1,local_38,iVar18), iVar15 == 0)) goto LAB_08011aae;
iVar9 = *(int *)(iVar15 + 0xc);
*(undefined4 *)(iVar15 + 0xc) = 0;
iVar14 = FUN_080145a0(iVar15,iVar20);
if (iVar14 < 0) {
if ((((iVar9 == 0 && uVar12 == 0) && ((uVar24 & 0xfffff00000000) == 0)) &&
(0x6b00000 < (uVar11 & 0x7ff00000))) &&
((*(int *)(iVar15 + 0x14) != 0 || (1 < *(int *)(iVar15 + 0x10))))) {
iVar15 = FUN_080144c8(param_1,iVar15,1);
iVar5 = FUN_080145a0(iVar15,iVar20);
if (iVar5 < 1) goto LAB_08011f20;
LAB_08011e7e:
uVar11 = uVar11 & 0x7ff00000;
if ((local_80 == 0) || (0x6b00000 < uVar11)) {
uVar24 = CONCAT44(~(~(uVar11 - 0x100000 >> 0x14) << 0x14),0xffffffff);
goto LAB_08011f20;
}
if (uVar11 < 0x3700001) goto LAB_08011bd4;
goto LAB_08011e9a;
}
}
else {
if (iVar14 != 0) {
uVar26 = FUN_08014890(iVar15,iVar20);
uVar19 = (undefined4)((ulonglong)uVar26 >> 0x20);
uVar23 = (undefined4)uVar26;
iVar14 = FUN_08000b10(uVar23,uVar19,0,0x40000000);
if (iVar14 == 0) {
local_88 = FUN_08000618(uVar23,uVar19,0,DAT_08012168);
lVar28 = local_88;
if (iVar9 == 0) {
LAB_08011ff2:
local_88 = CONCAT44((int)((ulonglong)lVar28 >> 0x20) + -0x80000000,(int)lVar28);
}
}
else if (iVar9 == 0) {
if (uVar12 == 0) {
if ((uVar24 & 0xfffff00000000) == 0) {
iVar14 = FUN_08000afc(uVar23,uVar19,0,DAT_08012164);
if (iVar14 == 0) {
lVar28 = FUN_08000618(uVar23,uVar19,0,DAT_08012168);
}
else {
lVar28 = (ulonglong)DAT_08012168 << 0x20;
}
goto LAB_08011ff2;
}
}
else if (uVar24 == 1) goto LAB_08011bd4;
local_88 = DAT_08012138;
lVar28 = (ulonglong)DAT_08012164 << 0x20;
}
else {
local_88 = DAT_08012140;
lVar28 = DAT_08012140;
}
uVar19 = (undefined4)((ulonglong)lVar28 >> 0x20);
local_60 = (undefined4)local_88;
local_5c = local_88._4_4_;
uVar17 = DAT_0801215c & uVar11;
if (uVar17 == DAT_0801216c) {
uVar26 = FUN_08014700(uVar12);
uVar26 = FUN_08000618((int)uVar26,(int)((ulonglong)uVar26 >> 0x20),
(undefined4)local_88,local_88._4_4_);
uVar26 = fp_multiply((int)uVar26,(int)((ulonglong)uVar26 >> 0x20),uVar12,
uVar11 + 0xfcb00000);
uVar13 = (uint)((ulonglong)uVar26 >> 0x20);
if ((DAT_0801215c & uVar13) <= DAT_08012170) {
uVar24 = CONCAT44(uVar13 + 0x3500000,(int)uVar26);
goto LAB_080120ca;
}
if ((uVar11 == DAT_08012160) && (uVar12 == 0xffffffff)) goto LAB_08011aae;
uVar24 = CONCAT44(DAT_08012160,0xffffffff);
}
else {
if ((local_80 != 0) && (uVar17 < 0x6a00001)) {
iVar14 = FUN_08000b10((int)lVar28,uVar19,DAT_08012220,DAT_08012224);
if (iVar14 != 0) {
iVar14 = FUN_08000bc8((int)lVar28,uVar19);
if (iVar14 == 0) {
iVar14 = 1;
}
lVar28 = FUN_08000524(iVar14);
local_4c = (int)((ulonglong)lVar28 >> 0x20);
local_60 = (uint)lVar28;
if (iVar9 == 0) {
local_4c = local_4c + -0x80000000;
}
local_5c = local_4c;
}
local_5c = (local_5c + 0x6b00000) - uVar17;
}
uVar26 = FUN_08014700(uVar12);
uVar26 = FUN_08000618(local_60,local_5c,(int)uVar26,
(int)((ulonglong)uVar26 >> 0x20));
uVar24 = fp_multiply((int)uVar26,(int)((ulonglong)uVar26 >> 0x20),uVar12,uVar11);
LAB_080120ca:
uVar19 = (undefined4)((ulonglong)lVar28 >> 0x20);
if ((local_80 == 0) && (uVar17 == ((uint)(uVar24 >> 0x20) & 0x7ff00000))) {
FUN_08014d74((int)lVar28,uVar19);
uVar26 = FUN_080005bc();
uVar26 = fp_add((int)lVar28,uVar19,(int)uVar26,(int)((ulonglong)uVar26 >> 0x20))
;
uVar23 = (undefined4)((ulonglong)uVar26 >> 0x20);
uVar19 = (undefined4)uVar26;
uVar27 = uVar24;
if (((uVar24 & 0xfffff00000000) == 0 && (int)uVar24 == 0) && iVar9 == 0) {
iVar14 = FUN_08000afc(uVar19,uVar23,DAT_08012228,DAT_0801222c);
}
else {
iVar14 = FUN_08000afc(uVar19,uVar23,DAT_08012148,DAT_0801214c);
if (iVar14 != 0) goto LAB_08011ac4;
iVar14 = FUN_08000b38(uVar19,uVar23,DAT_08012150,DAT_08012154);
}
if (iVar14 != 0) goto LAB_08011ac4;
}
}
FUN_080140a8(param_1,local_38);
FUN_080140a8(param_1,iVar18);
FUN_080140a8(param_1,iVar20);
FUN_080140a8(param_1,iVar15);
goto LAB_08011cae;
}
if (iVar9 == 0) {
if ((uVar24 & 0xfffff00000000) == 0 && uVar12 == 0) goto LAB_08011e7e;
}
else if ((uVar11 & 0xfffff) == DAT_08012158) {
if (local_80 == 0) {
uVar3 = 0xffffffff;
}
else {
uVar3 = 0xffffffff;
if ((DAT_0801215c & uVar11) < 0x6a00001) {
uVar3 = -1 << (0x6b - ((DAT_0801215c & uVar11) >> 0x14) & 0xff);
}
}
if (uVar12 == uVar3) {
if ((uVar11 != DAT_08012160) || (uVar12 != 0xffffffff)) {
uVar24 = (ulonglong)((uVar11 & DAT_0801215c) + 0x100000) << 0x20;
goto LAB_08011f20;
}
goto LAB_08011aae;
}
}
if (local_60 == 0) {
local_60 = local_54 & uVar12;
}
else {
local_60 = local_60 & uVar11;
}
if (local_60 != 0) {
if (iVar9 == 0) {
uVar26 = FUN_08011628(uVar12,uVar11,local_80);
uVar24 = fp_add(uVar12,uVar11,(int)uVar26,(int)((ulonglong)uVar26 >> 0x20));
iVar5 = FUN_08000ae8((int)uVar24,(int)(uVar24 >> 0x20),0,0);
if (iVar5 == 0) goto LAB_08011f20;
goto LAB_08011bd4;
}
uVar26 = FUN_08011628(uVar12,uVar11,local_80);
uVar24 = fp_multiply(uVar12,uVar11,(int)uVar26,(int)((ulonglong)uVar26 >> 0x20));
}
}
LAB_08011f20:
uVar27 = uVar24;
if (local_80 == 0) goto LAB_08011ac4;
LAB_08011e9a:
uVar27 = FUN_08000618((int)uVar24,(int)(uVar24 >> 0x20),0,DAT_08011ec4);
if ((DAT_08011ec8 & (uint)(uVar27 >> 0x20)) == 0) {
*param_1 = 0x22;
}
goto LAB_08011ac4;
}
goto LAB_08011aa6;
}
uVar11 = -uVar10 & 0xf;
if (uVar11 != 0) {
puVar4 = (undefined4 *)(DAT_08011bf8 + uVar11 * 8);
uVar24 = FUN_0800086c((int)uVar24,uVar19,*puVar4,puVar4[1]);
}
uVar10 = (int)-uVar10 >> 4;
if (uVar10 == 0) goto LAB_08011b88;
if ((int)uVar10 < 0x20) {
local_80 = uVar10 & 0x10;
if (local_80 != 0) {
local_80 = 0x6a;
}
bVar21 = false;
puVar4 = DAT_08011ebc;
uVar27 = uVar24;
do {
if ((int)(uVar10 << 0x1f) < 0) {
uVar27 = FUN_08000618((int)uVar27,(int)(uVar27 >> 0x20),*puVar4,puVar4[1]);
bVar21 = true;
}
uVar10 = (int)uVar10 >> 1;
puVar4 = puVar4 + 2;
} while (uVar10 != 0);
if (bVar21) {
uVar24 = uVar27;
}
uVar10 = (uint)(uVar24 >> 0x20);
if (local_80 != 0) {
uVar11 = (uVar10 << 1) >> 0x15;
iVar18 = -uVar11;
uVar12 = iVar18 + 0x6b;
if (0 < (int)uVar12) {
if ((int)uVar12 < 0x20) {
uVar24 = CONCAT44(uVar10,-1 << (uVar12 & 0xff) & (uint)uVar24);
}
else {
bVar22 = SBORROW4(uVar12,0x34);
bVar21 = uVar12 == 0x34;
if ((int)uVar12 < 0x35) {
uVar12 = 0xffffffff;
}
if (bVar21 || iVar18 + 0x37 < 0 != bVar22) {
uVar24 = (ulonglong)(uVar12 << (0x4b - uVar11 & 0xff) & uVar10) << 0x20;
}
else {
uVar24 = 0x370000000000000;
}
}
}
}
iVar18 = FUN_08000ae8((int)uVar24,(int)(uVar24 >> 0x20),0,0);
if (iVar18 != 0) goto LAB_08011bcc;
goto LAB_08011c7c;
}
LAB_08011bcc:
iVar15 = 0;
iVar20 = 0;
local_74 = 0;
iVar18 = 0;
LAB_08011bd4:
*param_1 = 0x22;
}
else {
if ((uVar10 & 0xf) != 0) {
puVar4 = (undefined4 *)(DAT_08011bf8 + (uVar10 & 0xf) * 8);
uVar24 = FUN_08000618(*puVar4,puVar4[1],(int)uVar24,uVar19);
}
if ((uVar10 & 0xfffffff0) == 0) goto LAB_08011b88;
if ((int)(uVar10 & 0xfffffff0) < 0x135) {
bVar21 = false;
iVar18 = (int)uVar10 >> 4;
iVar14 = 0;
puVar4 = DAT_08011bfc;
uVar27 = uVar24;
while( true ) {
if (iVar18 < 2) break;
if (iVar18 << 0x1f < 0) {
uVar27 = FUN_08000618((int)uVar27,(int)(uVar27 >> 0x20),*puVar4,puVar4[1]);
bVar21 = true;
}
iVar14 = iVar14 + 1;
iVar18 = iVar18 >> 1;
puVar4 = puVar4 + 2;
}
if (bVar21) {
uVar24 = uVar27;
}
uVar26 = FUN_08000618(DAT_08011bfc[iVar14 * 2],(DAT_08011bfc + iVar14 * 2)[1],(int)uVar24,
(int)(uVar24 >> 0x20) + -0x3500000);
uVar10 = (uint)((ulonglong)uVar26 >> 0x20);
uVar11 = DAT_08011c00 & uVar10;
if (uVar11 <= DAT_08011c04) {
if (DAT_08011c04 - 0x100000 < uVar11) {
uVar24 = CONCAT44(DAT_08011c08,0xffffffff);
}
else {
uVar24 = CONCAT44(uVar10 + 0x3500000,(int)uVar26);
}
goto LAB_08011b88;
}
}
LAB_08011aa6:
iVar15 = 0;
iVar20 = 0;
local_74 = 0;
iVar18 = 0;
LAB_08011aae:
*param_1 = 0x22;
}
uVar24 = 0;
uVar27 = 0;
if (local_74 != 0) {
LAB_08011ac4:
uVar24 = uVar27;
FUN_080140a8(param_1,local_38);
FUN_080140a8(param_1,iVar18);
FUN_080140a8(param_1,iVar20);
FUN_080140a8(param_1,local_74);
FUN_080140a8(param_1,iVar15);
}
}
LAB_080116da:
if (param_3 == (undefined4 *)0x0) goto LAB_080116e2;
}
*param_3 = local_3c;
LAB_080116e2:
if (local_68 != 0) {
uVar24 = uVar24 & 0xffffffff;
}
return uVar24;
}
uint FUN_0801223c(undefined4 *param_1,byte *param_2,undefined4 *param_3,uint param_4)
{
undefined4 *puVar1;
uint uVar2;
int iVar3;
uint uVar4;
byte *pbVar5;
byte *pbVar6;
uint uVar7;
uint uVar8;
uint uVar9;
uint uVar10;
if ((0x24 < param_4) || (pbVar6 = param_2, param_4 == 1)) {
puVar1 = (undefined4 *)FUN_08012560();
*puVar1 = 0x16;
return 0;
}
do {
pbVar5 = pbVar6;
pbVar6 = pbVar5 + 1;
uVar4 = (uint)*pbVar5;
uVar7 = *(byte *)(DAT_0801232c + uVar4) & 8;
} while ((*(byte *)(DAT_0801232c + uVar4) & 8) != 0);
if (uVar4 == 0x2d) {
uVar4 = (uint)*pbVar6;
uVar7 = 1;
pbVar6 = pbVar5 + 2;
}
else if (uVar4 == 0x2b) {
uVar4 = (uint)*pbVar6;
pbVar6 = pbVar5 + 2;
}
if ((param_4 & 0xffffffef) == 0) {
if ((uVar4 == 0x30) && ((*pbVar6 & 0xdf) == 0x58)) {
uVar4 = (uint)pbVar6[1];
pbVar6 = pbVar6 + 2;
}
else if (param_4 == 0) {
if (uVar4 == 0x30) {
param_4 = 8;
}
else {
param_4 = 10;
}
goto LAB_080122a8;
}
param_4 = 0x10;
}
LAB_080122a8:
uVar10 = uVar7 + 0x7fffffff;
iVar3 = 0;
uVar9 = uVar10 / param_4;
uVar2 = 0;
do {
uVar8 = uVar4 - 0x30;
if (9 < uVar8) {
if (uVar4 - 0x41 < 0x1a) {
uVar8 = uVar4 - 0x37;
}
else {
if (0x19 < uVar4 - 0x61) break;
uVar8 = uVar4 - 0x57;
}
}
if ((int)param_4 <= (int)uVar8) break;
if (iVar3 != -1) {
if ((uVar9 < uVar2) || ((uVar9 == uVar2 && ((int)(uVar10 - param_4 * uVar9) < (int)uVar8)))) {
iVar3 = -1;
}
else {
uVar2 = uVar2 * param_4 + uVar8;
iVar3 = 1;
}
}
uVar4 = (uint)*pbVar6;
pbVar6 = pbVar6 + 1;
} while( true );
if (iVar3 == -1) {
*param_1 = 0x22;
uVar2 = uVar10;
if (param_3 == (undefined4 *)0x0) {
return uVar10;
}
}
else {
if (uVar7 != 0) {
uVar2 = -uVar2;
}
if (param_3 == (undefined4 *)0x0) {
return uVar2;
}
if (iVar3 == 0) goto LAB_08012326;
}
param_2 = pbVar6 + -1;
LAB_08012326:
*param_3 = param_2;
return uVar2;
}
uint thunk_FUN_0801223c(undefined4 *param_1,byte *param_2,undefined4 *param_3,uint param_4)
{
undefined4 *puVar1;
uint uVar2;
int iVar3;
uint uVar4;
byte *pbVar5;
byte *pbVar6;
uint uVar7;
uint uVar8;
uint uVar9;
uint uVar10;
if ((0x24 < param_4) || (pbVar6 = param_2, param_4 == 1)) {
puVar1 = (undefined4 *)FUN_08012560();
*puVar1 = 0x16;
return 0;
}
do {
pbVar5 = pbVar6;
pbVar6 = pbVar5 + 1;
uVar4 = (uint)*pbVar5;
uVar7 = *(byte *)(DAT_0801232c + uVar4) & 8;
} while ((*(byte *)(DAT_0801232c + uVar4) & 8) != 0);
if (uVar4 == 0x2d) {
uVar4 = (uint)*pbVar6;
uVar7 = 1;
pbVar6 = pbVar5 + 2;
}
else if (uVar4 == 0x2b) {
uVar4 = (uint)*pbVar6;
pbVar6 = pbVar5 + 2;
}
if ((param_4 & 0xffffffef) == 0) {
if ((uVar4 == 0x30) && ((*pbVar6 & 0xdf) == 0x58)) {
uVar4 = (uint)pbVar6[1];
pbVar6 = pbVar6 + 2;
}
else if (param_4 == 0) {
if (uVar4 == 0x30) {
param_4 = 8;
}
else {
param_4 = 10;
}
goto LAB_080122a8;
}
param_4 = 0x10;
}
LAB_080122a8:
uVar10 = uVar7 + 0x7fffffff;
iVar3 = 0;
uVar9 = uVar10 / param_4;
uVar2 = 0;
do {
uVar8 = uVar4 - 0x30;
if (9 < uVar8) {
if (uVar4 - 0x41 < 0x1a) {
uVar8 = uVar4 - 0x37;
}
else {
if (0x19 < uVar4 - 0x61) break;
uVar8 = uVar4 - 0x57;
}
}
if ((int)param_4 <= (int)uVar8) break;
if (iVar3 != -1) {
if ((uVar9 < uVar2) || ((uVar9 == uVar2 && ((int)(uVar10 - param_4 * uVar9) < (int)uVar8)))) {
iVar3 = -1;
}
else {
uVar2 = uVar2 * param_4 + uVar8;
iVar3 = 1;
}
}
uVar4 = (uint)*pbVar6;
pbVar6 = pbVar6 + 1;
} while( true );
if (iVar3 == -1) {
*param_1 = 0x22;
uVar2 = uVar10;
if (param_3 == (undefined4 *)0x0) {
return uVar10;
}
}
else {
if (uVar7 != 0) {
uVar2 = -uVar2;
}
if (param_3 == (undefined4 *)0x0) {
return uVar2;
}
if (iVar3 == 0) goto LAB_08012326;
}
param_2 = pbVar6 + -1;
LAB_08012326:
*param_3 = param_2;
return uVar2;
}
uint FUN_08012334(undefined4 param_1,code *param_2,int *param_3)
{
uint uVar1;
int iVar2;
uint uVar3;
int iVar4;
uVar3 = 0;
do {
iVar4 = param_3[1];
iVar2 = param_3[2];
while (iVar4 = iVar4 + -1, -1 < iVar4) {
if ((1 < *(ushort *)(iVar2 + 0xc)) && (*(short *)(iVar2 + 0xe) != -1)) {
uVar1 = (*param_2)(param_1,iVar2);
uVar3 = uVar3 | uVar1;
}
iVar2 = iVar2 + 0x68;
}
param_3 = (int *)*param_3;
} while (param_3 != (int *)0x0);
return uVar3;
}
void FUN_08012370(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
undefined4 uStack_c;
undefined4 uStack_8;
undefined4 uStack_4;
uStack_c = param_2;
uStack_8 = param_3;
uStack_4 = param_4;
FUN_08013c7c(*DAT_08012390,*(undefined4 *)(*DAT_08012390 + 8),param_1,&uStack_c,param_1,&uStack_c,
param_3);
return;
}
undefined4 resetSensorSubsystem(int param_1)
{
char cVar1;
int iVar2;
int iVar3;
char *pcVar4;
undefined1 *puVar5;
undefined4 *puVar6;
undefined4 uVar7;
char *pcVar8;
iVar3 = *DAT_0801244c;
puVar6 = *(undefined4 **)(iVar3 + 8);
if (*(int *)(iVar3 + 0x20) == 0) {
FUN_0801159c();
}
if ((-1 < (int)(puVar6[0x19] << 0x1f)) && (-1 < (int)((uint)*(ushort *)(puVar6 + 3) << 0x16))) {
FUN_080125b6(puVar6[0x16]);
}
if ((((int)((uint)*(ushort *)(puVar6 + 3) << 0x1c) < 0) && (puVar6[4] != 0)) ||
(iVar2 = FUN_08014a90(iVar3,puVar6), iVar2 == 0)) {
pcVar8 = (char *)(param_1 + -1);
do {
while( true ) {
pcVar8 = pcVar8 + 1;
cVar1 = *pcVar8;
iVar2 = puVar6[2] + -1;
puVar6[2] = iVar2;
if (cVar1 == '\0') {
if (iVar2 < 0) {
iVar3 = FUN_08014a12(iVar3,10,puVar6);
if (iVar3 == -1) goto LAB_080123cc;
}
else {
puVar5 = (undefined1 *)*puVar6;
*puVar6 = puVar5 + 1;
*puVar5 = 10;
}
uVar7 = 10;
goto LAB_080123d0;
}
if ((iVar2 < 0) && ((iVar2 < (int)puVar6[6] || (cVar1 == '\n')))) break;
pcVar4 = (char *)*puVar6;
*puVar6 = pcVar4 + 1;
*pcVar4 = cVar1;
}
iVar2 = FUN_08014a12(iVar3,cVar1,puVar6);
} while (iVar2 != -1);
}
LAB_080123cc:
uVar7 = 0xffffffff;
LAB_080123d0:
if ((-1 < (int)(puVar6[0x19] << 0x1f)) && (-1 < (int)((uint)*(ushort *)(puVar6 + 3) << 0x16))) {
FUN_080125b8(puVar6[0x16]);
}
return uVar7;
}
void FUN_08012450(undefined1 *param_1,undefined1 *param_2,int param_3)
{
undefined1 *puVar1;
undefined1 *puVar2;
puVar2 = param_2 + param_3;
if ((param_2 < param_1) && (param_1 < puVar2)) {
puVar1 = param_1 + param_3;
while (puVar1 != param_1) {
puVar2 = puVar2 + -1;
puVar1 = puVar1 + -1;
*puVar1 = *puVar2;
}
}
else {
param_1 = param_1 + -1;
for (; param_2 != puVar2; param_2 = param_2 + 1) {
param_1 = param_1 + 1;
*param_1 = *param_2;
}
}
return;
}
void FUN_08012484(undefined1 *param_1,undefined1 param_2,int param_3)
{
undefined1 *puVar1;
puVar1 = param_1 + param_3;
for (; param_1 != puVar1; param_1 = param_1 + 1) {
*param_1 = param_2;
}
return;
}
int FUN_08012494(byte *param_1,int param_2,int param_3)
{
byte *pbVar1;
int iVar2;
byte *pbVar3;
uint uVar4;
if (param_3 == 0) {
iVar2 = 0;
}
else {
pbVar3 = (byte *)(param_2 + -1);
pbVar1 = param_1;
do {
uVar4 = (uint)*pbVar1;
pbVar3 = pbVar3 + 1;
if ((uVar4 != *pbVar3) || (pbVar1 + 1 == param_1 + param_3)) break;
pbVar1 = pbVar1 + 1;
} while (uVar4 != 0);
iVar2 = uVar4 - *pbVar3;
}
return iVar2;
}
int FUN_08012508(uint param_1)
{
int *piVar1;
int iVar2;
undefined4 uVar3;
int *piVar4;
code *pcVar5;
undefined4 unaff_r4;
undefined4 unaff_r5;
undefined4 in_lr;
undefined4 *puVar6;
piVar4 = (int *)*DAT_08012514;
if (param_1 < 0x20) {
iVar2 = piVar4[0xf];
if ((iVar2 == 0) || (pcVar5 = *(code **)(iVar2 + param_1 * 4), pcVar5 == (code *)0x0)) {
puVar6 = DAT_08012514;
uVar3 = thunk_FUN_08007068(piVar4);
piVar1 = DAT_08012538;
*DAT_08012538 = 0;
iVar2 = FUN_0800706c(uVar3,param_1,param_1,0,puVar6,unaff_r4,unaff_r5,in_lr);
if ((iVar2 == -1) && (*piVar1 != 0)) {
*piVar4 = *piVar1;
}
return iVar2;
}
if (pcVar5 != (code *)0x1) {
if (pcVar5 == (code *)0xffffffff) {
*piVar4 = 0x16;
return 1;
}
*(undefined4 *)(iVar2 + param_1 * 4) = 0;
(*pcVar5)(param_1);
}
iVar2 = 0;
}
else {
*piVar4 = 0x16;
iVar2 = -1;
}
return iVar2;
}
undefined4 thunk_FUN_08007068(void)
{
return 1;
}
void FUN_08012540(int *param_1,undefined4 param_2)
{
int *piVar1;
int iVar2;
piVar1 = DAT_0801255c;
*DAT_0801255c = 0;
iVar2 = FUN_080070dc(param_2);
if ((iVar2 == -1) && (*piVar1 != 0)) {
*param_1 = *piVar1;
}
return;
}
undefined4 FUN_08012560(void)
{
return *DAT_08012568;
}
void FUN_0801256c(void)
{
undefined4 *puVar1;
int iVar2;
int iVar3;
undefined4 *puVar4;
int iVar5;
iVar3 = DAT_080125a8 - (int)DAT_080125a4;
puVar4 = DAT_080125a4;
for (iVar5 = 0; iVar2 = DAT_080125b0, puVar1 = DAT_080125ac, iVar5 != iVar3 >> 2;
iVar5 = iVar5 + 1) {
(*(code *)*puVar4)();
puVar4 = puVar4 + 1;
}
FUN_0801509c();
puVar4 = puVar1;
for (iVar3 = 0; iVar3 != iVar2 - (int)puVar1 >> 2; iVar3 = iVar3 + 1) {
(*(code *)*puVar4)();
puVar4 = puVar4 + 1;
}
return;
}
void FUN_080125b6(void)
{
return;
}
void FUN_080125b8(void)
{
return;
}
undefined4 FUN_080125bc(void)
{
return DAT_080125c0;
}
// Copies a block of bytes from the source buffer to the destination buffer.
// (Note: The destination pointer is initially adjusted by subtracting 1. This
// yields the same final result as a normal memcpy, but is how the decompiler
// presented the code.)
//
// Parameters:
// dest - destination buffer address (an integer value; it is adjusted internally)
// src - pointer to the source data (as an array of bytes)
// length - number of bytes to copy
void copyBuffer(int dest,undefined1 *src,int length)
{
undefined1 *nextSrc;
undefined1 *srcEnd;
undefined1 *destPtr;
srcEnd = src + length;
destPtr = (undefined1 *)(dest + -1);
if (src != srcEnd) {
do {
nextSrc = src + 1;
destPtr = destPtr + 1;
*destPtr = *src;
src = nextSrc;
} while (nextSrc != srcEnd);
return;
}
return;
}
undefined8 FUN_080125e0(void)
{
return DAT_080125e8;
}
uint FUN_080125f0(int param_1,int param_2)
{
uint *puVar1;
uint uVar2;
uint uVar3;
int iVar4;
uint *puVar5;
uint uVar6;
uint *puVar7;
uint *puVar8;
uint uVar9;
int iVar10;
uint *puVar11;
uint *puVar13;
uint *puVar12;
if (*(int *)(param_1 + 0x10) < *(int *)(param_2 + 0x10)) {
uVar6 = 0;
}
else {
iVar4 = *(int *)(param_2 + 0x10) + -1;
puVar7 = (uint *)(param_2 + 0x14);
puVar5 = (uint *)(param_1 + 0x14);
puVar1 = puVar5 + iVar4;
puVar8 = puVar7 + iVar4;
uVar6 = puVar5[iVar4] / (puVar7[iVar4] + 1);
if (puVar7[iVar4] + 1 <= puVar5[iVar4]) {
uVar9 = 0;
iVar10 = 0;
puVar11 = puVar7;
puVar13 = puVar5;
do {
puVar12 = puVar11 + 1;
uVar9 = uVar6 * (*puVar11 & 0xffff) + uVar9;
uVar3 = uVar6 * (*puVar11 >> 0x10) + (uVar9 >> 0x10);
uVar2 = ((*puVar13 & 0xffff) - (uVar9 & 0xffff)) + iVar10;
uVar9 = uVar3 >> 0x10;
iVar10 = (((int)uVar2 >> 0x10) - (uVar3 & 0xffff)) + (*puVar13 >> 0x10);
*puVar13 = uVar2 & 0xffff | iVar10 * 0x10000;
iVar10 = iVar10 >> 0x10;
puVar11 = puVar12;
puVar13 = puVar13 + 1;
} while (puVar12 <= puVar8);
if (puVar5[iVar4] == 0) {
while ((puVar1 = puVar1 + -1, puVar5 < puVar1 && (*puVar1 == 0))) {
iVar4 = iVar4 + -1;
}
*(int *)(param_1 + 0x10) = iVar4;
}
}
iVar10 = FUN_080145a0(param_1);
if (-1 < iVar10) {
iVar10 = 0;
puVar1 = puVar5;
do {
puVar11 = puVar7 + 1;
uVar9 = ((*puVar1 & 0xffff) - (*puVar7 & 0xffff)) + iVar10;
iVar10 = (((int)uVar9 >> 0x10) - (*puVar7 >> 0x10)) + (*puVar1 >> 0x10);
*puVar1 = uVar9 & 0xffff | iVar10 * 0x10000;
iVar10 = iVar10 >> 0x10;
puVar1 = puVar1 + 1;
puVar7 = puVar11;
} while (puVar11 <= puVar8);
puVar7 = puVar5 + iVar4;
if (puVar5[iVar4] == 0) {
while ((puVar7 = puVar7 + -1, puVar5 < puVar7 && (*puVar7 == 0))) {
iVar4 = iVar4 + -1;
}
*(int *)(param_1 + 0x10) = iVar4;
}
uVar6 = uVar6 + 1;
}
}
return uVar6;
}
char * FUN_08012700(int param_1,uint param_2,uint param_3,int *param_4,undefined4 *param_5,
int *param_6)
{
bool bVar1;
uint uVar2;
char cVar3;
byte bVar4;
uint *puVar5;
undefined4 uVar6;
int iVar7;
undefined4 uVar8;
int iVar9;
int iVar10;
undefined4 uVar11;
uint uVar12;
int iVar13;
bool bVar14;
char *pcVar15;
uint uVar16;
undefined4 *puVar17;
uint uVar18;
undefined4 *puVar19;
char *pcVar20;
char *pcVar21;
uint uVar22;
uint uVar23;
undefined4 uVar24;
char *pcVar25;
bool bVar26;
bool bVar27;
ulonglong in_d0;
undefined4 uVar28;
undefined8 uVar29;
undefined8 uVar30;
ulonglong uVar31;
ulonglong uVar32;
char *local_7c;
undefined8 local_78;
undefined8 local_70;
int local_68;
uint local_64;
uint local_60;
uint local_50;
uint local_4c;
undefined4 local_48;
undefined4 uStack_44;
char *local_34;
int local_30;
int local_2c [2];
uVar22 = (uint)(in_d0 >> 0x20);
uVar16 = (uint)in_d0;
local_78 = in_d0;
local_64 = param_2;
local_50 = param_3;
if (*(int *)(param_1 + 0x1c) != 0) goto LAB_0801273c;
puVar5 = (uint *)FUN_08010b28(0x10);
*(uint **)(param_1 + 0x1c) = puVar5;
uVar12 = 0;
if (puVar5 != (uint *)0x0) goto LAB_08012734;
uVar8 = 0xef;
uVar6 = DAT_080129c0;
local_78 = in_d0;
LAB_0801272e:
puVar5 = (uint *)FUN_08014cec(DAT_080129c4,uVar8,0,uVar6);
LAB_08012734:
puVar5[1] = uVar12;
puVar5[2] = uVar12;
*puVar5 = uVar12;
puVar5[3] = uVar12;
LAB_0801273c:
uVar18 = local_64;
iVar9 = **(int **)(param_1 + 0x1c);
if (iVar9 != 0) {
uVar12 = (*(int **)(param_1 + 0x1c))[1];
*(uint *)(iVar9 + 4) = uVar12;
*(int *)(iVar9 + 8) = 1 << (uVar12 & 0xff);
FUN_080140a8(param_1);
**(undefined4 **)(param_1 + 0x1c) = 0;
}
if ((int)uVar22 < 0) {
local_78 = CONCAT44(uVar22,(undefined4)local_78) & 0x7fffffffffffffff;
}
else {
*param_5 = 0;
}
uVar32 = local_78;
uVar12 = DAT_080129c8;
uVar2 = local_78._4_4_;
if ((int)uVar22 < 0) {
*param_5 = 1;
}
if ((uVar12 & ~local_78._4_4_) == 0) {
*param_4 = 9999;
if ((local_78 & 0xfffff00000000) == 0 && uVar16 == 0) {
if (param_6 == (int *)0x0) {
return DAT_08013270;
}
pcVar15 = DAT_08013270 + 8;
pcVar21 = DAT_08013270;
}
else {
if (param_6 == (int *)0x0) {
return DAT_080129dc;
}
pcVar15 = DAT_080129dc + 3;
pcVar21 = DAT_080129dc;
}
*param_6 = (int)pcVar15;
return pcVar21;
}
iVar7 = (int)local_78;
iVar9 = FUN_08000ae8(iVar7,local_78._4_4_,0,0);
if (iVar9 != 0) {
*param_4 = 1;
if (param_6 == (int *)0x0) {
return DAT_080129e0;
}
*param_6 = DAT_080129cc;
return DAT_080129e0;
}
uVar6 = FUN_080147e0(iVar7,param_1,local_2c,&local_30);
uVar22 = (local_78._4_4_ << 1) >> 0x15;
if (uVar22 == 0) {
iVar9 = local_30 + local_2c[0];
uVar22 = iVar9 + 0x432;
bVar27 = SBORROW4(uVar22,0x20);
bVar26 = uVar22 == 0x20;
if (0x20 < (int)uVar22) {
uVar22 = 0x40 - uVar22;
}
if (bVar26 || iVar9 + 0x412 < 0 != bVar27) {
uVar16 = uVar16 << (0x20 - uVar22 & 0xff);
}
else {
uVar16 = local_78._4_4_ << (uVar22 & 0xff) | uVar16 >> (iVar9 + 0x412U & 0xff);
}
uVar29 = FUN_08000524(uVar16);
iVar10 = (int)uVar29;
uVar16 = (int)((ulonglong)uVar29 >> 0x20) + 0xfe100000;
param_5 = (undefined4 *)(iVar9 + -1);
bVar26 = true;
}
else {
uVar16 = local_78._4_4_ & 0xfffff | 0x3ff00000;
param_5 = (undefined4 *)(uVar22 - 0x3ff);
bVar26 = false;
iVar10 = iVar7;
}
uVar29 = fp_add(iVar10,uVar16,0,DAT_080129d0);
uVar29 = FUN_08000618((int)uVar29,(int)((ulonglong)uVar29 >> 0x20),DAT_080129a8,DAT_080129ac);
uVar29 = fp_multiply((int)uVar29,(int)((ulonglong)uVar29 >> 0x20),DAT_080129b0,DAT_080129b4);
uVar30 = FUN_08000544(param_5);
uVar30 = FUN_08000618((int)uVar30,(int)((ulonglong)uVar30 >> 0x20),DAT_080129b8,DAT_080129bc);
uVar29 = fp_multiply((int)uVar29,(int)((ulonglong)uVar29 >> 0x20),(int)uVar30,
(int)((ulonglong)uVar30 >> 0x20));
uVar8 = (undefined4)((ulonglong)uVar29 >> 0x20);
uVar12 = FUN_08000b78();
iVar9 = FUN_08000afc((int)uVar29,uVar8,0,0);
if (iVar9 != 0) {
uVar30 = FUN_08000544(uVar12);
iVar9 = FUN_08000ae8((int)uVar30,(int)((ulonglong)uVar30 >> 0x20),(int)uVar29,uVar8);
if (iVar9 == 0) {
uVar12 = uVar12 - 1;
}
}
if (uVar12 < 0x17) {
puVar17 = (undefined4 *)(DAT_080129d4 + uVar12 * 8);
iVar9 = FUN_08000afc(iVar7,local_78._4_4_,*puVar17,puVar17[1]);
if (iVar9 == 0) {
bVar27 = false;
}
else {
uVar12 = uVar12 - 1;
bVar27 = false;
}
}
else {
bVar27 = true;
}
local_68 = (local_30 - (int)param_5) + -1;
if (local_68 < 0) {
iVar9 = 1 - (local_30 - (int)param_5);
local_68 = 0;
}
else {
iVar9 = 0;
}
if ((int)uVar12 < 0) {
local_60 = -uVar12;
iVar9 = iVar9 - uVar12;
local_4c = 0;
}
else {
local_68 = local_68 + uVar12;
local_60 = 0;
local_4c = uVar12;
}
if (9 < local_64) {
uVar16 = 1;
local_64 = 0;
switchD_080128ce_caseD_4:
bVar14 = true;
pcVar21 = (char *)0xffffffff;
local_7c = (char *)0xffffffff;
uVar18 = 0x12;
local_50 = 0;
goto LAB_0801294a;
}
if (5 < (int)local_64) {
local_64 = local_64 - 4;
}
uVar16 = (uint)((int)uVar18 < 6);
switch(local_64) {
case 2:
bVar14 = false;
break;
case 3:
bVar14 = false;
goto LAB_08012928;
case 4:
bVar14 = true;
break;
case 5:
bVar14 = true;
LAB_08012928:
pcVar21 = (char *)(uVar12 + local_50);
local_7c = (char *)((int)pcVar21 + 1);
uVar18 = (uint)local_7c;
if ((int)local_7c < 1) {
uVar18 = 1;
}
goto LAB_0801294a;
default:
goto switchD_080128ce_caseD_4;
}
if ((int)local_50 < 1) {
uVar18 = 1;
pcVar21 = (char *)0x1;
local_7c = (char *)0x1;
local_50 = uVar18;
}
else {
local_7c = (char *)local_50;
uVar18 = local_50;
pcVar21 = (char *)local_50;
}
LAB_0801294a:
iVar10 = 0;
for (iVar13 = 4; uVar22 = iVar13 + 0x14, uVar22 <= uVar18; iVar13 = iVar13 << 1) {
iVar10 = iVar10 + 1;
}
*(int *)(*(int *)(param_1 + 0x1c) + 4) = iVar10;
pcVar15 = (char *)FUN_08014028(param_1);
if (pcVar15 == (char *)0x0) {
uVar8 = 0x1af;
uVar6 = DAT_080129d8;
local_78 = uVar32;
goto LAB_0801272e;
}
**(undefined4 **)(param_1 + 0x1c) = pcVar15;
puVar17 = DAT_08012c74;
uVar18 = uVar12;
if ((local_7c < 0xf) && (uVar16 != 0)) {
if ((int)uVar12 < 1) {
if (uVar12 == 0) {
iVar10 = 2;
}
else {
puVar19 = (undefined4 *)(DAT_08012c70 + (-uVar12 & 0xf) * 8);
local_78 = FUN_08000618(iVar7,local_78._4_4_,*puVar19,puVar19[1]);
iVar13 = (int)-uVar12 >> 4;
bVar1 = false;
iVar10 = 2;
uVar31 = local_78;
while( true ) {
if (iVar13 == 0) break;
if (iVar13 << 0x1f < 0) {
uVar31 = FUN_08000618((int)uVar31,(int)(uVar31 >> 0x20),*puVar17,puVar17[1]);
iVar10 = iVar10 + 1;
bVar1 = true;
}
iVar13 = iVar13 >> 1;
puVar17 = puVar17 + 2;
}
if (bVar1) goto LAB_08012a3e;
}
}
else {
local_70 = *(undefined8 *)(DAT_08012c70 + (uVar12 & 0xf) * 8);
uVar22 = (int)uVar12 >> 4;
if ((int)(uVar12 << 0x17) < 0) {
local_78 = FUN_0800086c(iVar7,local_78._4_4_,DAT_08012c74[8],DAT_08012c74[9]);
uVar22 = uVar22 & 0xf;
iVar10 = 3;
puVar17 = DAT_08012c74;
}
else {
iVar10 = 2;
}
while( true ) {
if (uVar22 == 0) break;
if ((int)(uVar22 << 0x1f) < 0) {
local_70 = FUN_08000618((undefined4)local_70,local_70._4_4_,*puVar17,puVar17[1]);
iVar10 = iVar10 + 1;
}
uVar22 = (int)uVar22 >> 1;
puVar17 = puVar17 + 2;
}
uVar31 = FUN_0800086c((undefined4)local_78,local_78._4_4_,(undefined4)local_70,local_70._4_4_)
;
LAB_08012a3e:
local_78 = uVar31;
}
local_34 = local_7c;
if (((bVar27) &&
(iVar13 = FUN_08000afc((undefined4)local_78,local_78._4_4_,0,DAT_08012c78), iVar13 != 0)) &&
(local_7c != (char *)0x0)) {
if ((int)pcVar21 < 1) goto LAB_08012b34;
local_78 = FUN_08000618((undefined4)local_78,local_78._4_4_,0,DAT_08012c7c);
iVar10 = iVar10 + 1;
local_34 = pcVar21;
uVar18 = uVar12 - 1;
}
uVar29 = FUN_08000544(iVar10);
uVar29 = FUN_08000618((int)uVar29,(int)((ulonglong)uVar29 >> 0x20),(undefined4)local_78,
local_78._4_4_);
uVar29 = fp_multiply((int)uVar29,(int)((ulonglong)uVar29 >> 0x20),0,DAT_08012c80);
iVar10 = (int)((ulonglong)uVar29 >> 0x20);
uVar8 = (undefined4)uVar29;
iVar13 = iVar10 + -0x3400000;
if (local_34 == (char *)0x0) {
uVar29 = fp_add((undefined4)local_78,local_78._4_4_,0,DAT_08012c84);
uVar28 = (undefined4)((ulonglong)uVar29 >> 0x20);
iVar13 = FUN_08000b38((int)uVar29,uVar28,uVar8,iVar13);
if (iVar13 == 0) {
iVar10 = FUN_08000afc((int)uVar29,uVar28,uVar8,iVar10 + 0x7cc00000);
if (iVar10 == 0) goto LAB_08012b34;
goto LAB_08012b7c;
}
LAB_0801302a:
uVar16 = 0;
uVar23 = uVar16;
LAB_08013016:
local_7c = pcVar15 + 1;
*pcVar15 = '1';
uVar18 = uVar18 + 1;
goto LAB_08012b88;
}
iVar10 = DAT_08012c70 + (int)local_34 * 8;
local_34 = pcVar15 + (int)local_34;
if (bVar14) {
uVar29 = FUN_0800086c(0,DAT_08012c88);
uVar29 = fp_add((int)uVar29,(int)((ulonglong)uVar29 >> 0x20),uVar8,iVar13);
pcVar25 = pcVar15;
while( true ) {
uStack_44 = (undefined4)((ulonglong)uVar29 >> 0x20);
local_48 = (undefined4)uVar29;
cVar3 = FUN_08000b78((undefined4)local_78,local_78._4_4_);
uVar29 = FUN_08000544();
uVar29 = fp_add((undefined4)local_78,local_78._4_4_,(int)uVar29,
(int)((ulonglong)uVar29 >> 0x20));
uVar28 = (undefined4)((ulonglong)uVar29 >> 0x20);
uVar8 = (undefined4)uVar29;
pcVar20 = pcVar25 + 1;
*pcVar25 = cVar3 + '0';
iVar10 = FUN_08000afc(uVar8,uVar28,local_48,uStack_44);
if (iVar10 != 0) goto LAB_08012d8e;
uVar29 = fp_add(0,DAT_08012c78,uVar8,uVar28);
iVar10 = FUN_08000afc((int)uVar29,(int)((ulonglong)uVar29 >> 0x20),local_48,uStack_44);
pcVar25 = pcVar20;
if (iVar10 != 0) goto LAB_08012db0;
if (pcVar20 == local_34) break;
uVar29 = FUN_08000618(local_48,uStack_44,0,DAT_08012c7c);
local_78 = FUN_08000618(uVar8,uVar28,0,DAT_08012c7c);
}
goto LAB_08012b34;
}
uVar29 = FUN_08000618(uVar8,iVar13,*(undefined4 *)(iVar10 + -8),*(undefined4 *)(iVar10 + -4));
uVar8 = (undefined4)((ulonglong)uVar29 >> 0x20);
pcVar20 = pcVar15;
while( true ) {
cVar3 = FUN_08000b78((undefined4)local_78,local_78._4_4_);
uVar30 = FUN_08000544();
uVar30 = fp_add((undefined4)local_78,local_78._4_4_,(int)uVar30,
(int)((ulonglong)uVar30 >> 0x20));
uVar24 = (undefined4)((ulonglong)uVar30 >> 0x20);
uVar28 = (undefined4)uVar30;
pcVar25 = pcVar20 + 1;
*pcVar20 = cVar3 + '0';
if (pcVar25 == local_34) break;
local_78 = FUN_08000618(uVar28,uVar24,0,DAT_08012f80);
pcVar20 = pcVar25;
}
uVar30 = fp_multiply((int)uVar29,uVar8,0,DAT_08012f7c);
iVar10 = FUN_08000b38(uVar28,uVar24,(int)uVar30,(int)((ulonglong)uVar30 >> 0x20));
if (iVar10 != 0) goto LAB_08012db0;
uVar29 = fp_add(0,DAT_08012f7c,(int)uVar29,uVar8);
iVar10 = FUN_08000afc(uVar28,uVar24,(int)uVar29,(int)((ulonglong)uVar29 >> 0x20));
if (iVar10 != 0) goto LAB_08012d04;
}
LAB_08012b34:
if ((local_2c[0] < 0) || (0xe < (int)uVar12)) {
uVar22 = local_60;
if (bVar14) {
iVar13 = iVar9;
if ((int)local_64 < 2) {
if (bVar26) {
pcVar20 = (char *)(local_2c[0] + 0x433);
}
else {
pcVar20 = (char *)(0x36 - local_30);
}
}
else {
iVar10 = (int)local_7c - 1;
pcVar20 = local_7c;
if ((int)local_60 < iVar10) {
local_4c = local_4c + (iVar10 - local_60);
uVar22 = 0;
local_60 = iVar10;
}
else {
uVar22 = local_60 - iVar10;
if ((int)local_7c < 0) {
pcVar20 = (char *)0;
iVar13 = iVar9 - (int)local_7c;
}
}
}
local_68 = local_68 + (int)pcVar20;
iVar10 = iVar9 + (int)pcVar20;
uVar23 = FUN_080142a4(param_1,1);
iVar9 = iVar13;
}
else {
uVar23 = 0;
iVar10 = iVar9;
}
if ((iVar9 != 0) && (0 < local_68)) {
iVar13 = local_68;
if (iVar9 <= local_68) {
iVar13 = iVar9;
}
iVar10 = iVar10 - iVar13;
iVar9 = iVar9 - iVar13;
local_68 = local_68 - iVar13;
}
if (local_60 != 0) {
if (bVar14) {
uVar8 = uVar6;
if (uVar22 != 0) {
uVar23 = FUN_08014414(param_1,uVar23,uVar22);
uVar8 = FUN_080142d0(param_1,uVar23,uVar6);
FUN_080140a8(param_1,uVar6);
}
local_60 = local_60 - uVar22;
uVar6 = uVar8;
if (local_60 == 0) goto LAB_08012e7a;
}
uVar6 = FUN_08014414(param_1,uVar6,local_60);
}
LAB_08012e7a:
uVar16 = FUN_080142a4(param_1,1);
if (local_4c == 0) {
if ((int)local_64 < 2) goto LAB_08012ea0;
local_60 = local_4c;
LAB_08013234:
iVar7 = 1;
}
else {
uVar16 = FUN_08014414(param_1,uVar16,local_4c);
if ((int)local_64 < 2) {
LAB_08012ea0:
if (iVar7 == 0) {
if ((uVar32 & 0xfffff00000000) == 0) {
local_60 = uVar2 & 0x7ff00000;
if ((uVar32 & 0x7ff0000000000000) != 0) {
local_68 = local_68 + 1;
iVar10 = iVar10 + 1;
local_60 = 1;
}
}
else {
local_60 = 0;
}
}
else {
local_60 = 0;
}
if (local_4c == 0) goto LAB_08013234;
}
else {
local_60 = 0;
}
iVar7 = FUN_0801420c(*(undefined4 *)(uVar16 + *(int *)(uVar16 + 0x10) * 4 + 0x10));
iVar7 = 0x20 - iVar7;
}
uVar22 = iVar7 + local_68 & 0x1f;
if (uVar22 == 0) {
iVar7 = 0;
LAB_08012fd2:
iVar7 = iVar7 + 0x1c;
local_68 = local_68 + iVar7;
iVar10 = iVar10 + iVar7;
iVar9 = iVar9 + iVar7;
}
else {
iVar7 = 0x20 - uVar22;
if (iVar7 < 5) {
if (iVar7 != 4) goto LAB_08012fd2;
}
else {
iVar7 = 0x1c - uVar22;
local_68 = local_68 + iVar7;
iVar10 = iVar10 + iVar7;
iVar9 = iVar9 + iVar7;
}
}
if (0 < iVar10) {
uVar6 = FUN_080144c8(param_1,uVar6,iVar10);
}
if (0 < local_68) {
uVar16 = FUN_080144c8(param_1,uVar16,local_68);
}
pcVar20 = pcVar15;
if ((!bVar27) || (iVar7 = FUN_080145a0(uVar6,uVar16), -1 < iVar7)) {
pcVar21 = local_7c;
uVar18 = uVar12;
if ((int)local_7c < 1) goto LAB_08012fee;
LAB_08013032:
if (!bVar14) goto LAB_08013242;
LAB_0801303a:
uVar22 = uVar23;
if (0 < iVar9) {
uVar22 = FUN_080144c8(param_1,uVar23,iVar9);
}
uVar23 = uVar22;
if (local_60 == 0) goto LAB_08013082;
iVar9 = FUN_08014028(param_1,*(undefined4 *)(uVar22 + 4));
if (iVar9 == 0) {
uVar8 = 0x2ef;
param_5 = (undefined4 *)0x0;
uVar6 = DAT_0801326c;
local_78 = uVar32;
goto LAB_0801272e;
}
copyBuffer(iVar9 + 0xc,uVar22 + 0xc,(*(int *)(uVar22 + 0x10) + 2) * 4);
uVar23 = FUN_080144c8(param_1,iVar9,1);
LAB_08013082:
LAB_0801309a:
local_7c = pcVar20 + 1;
iVar9 = FUN_080125f0(uVar6,uVar16);
uVar12 = iVar9 + 0x30;
iVar7 = FUN_080145a0(uVar6,uVar22);
iVar10 = FUN_080145d8(param_1,uVar16,uVar23);
if (*(int *)(iVar10 + 0xc) == 0) {
iVar13 = FUN_080145a0(uVar6,iVar10);
}
else {
iVar13 = 1;
}
FUN_080140a8(param_1,iVar10);
if ((iVar13 == 0 && local_64 == 0) && (uVar32 & 1) == 0) {
if (uVar12 == 0x39) {
LAB_08013146:
*pcVar20 = '9';
pcVar21 = local_7c;
goto LAB_0801314e;
}
if (0 < iVar7) {
LAB_080130f8:
uVar12 = iVar9 + 0x31;
}
LAB_080130fe:
*pcVar20 = (char)uVar12;
goto LAB_08012b8a;
}
if ((iVar7 < 0) || ((iVar7 == 0 && local_64 == 0) && (uVar32 & 1) == 0)) {
if (0 < iVar13) {
uVar6 = FUN_080144c8(param_1,uVar6,1);
iVar7 = FUN_080145a0(uVar6,uVar16);
if ((0 < iVar7) || ((iVar7 == 0 && ((uVar12 & 1) != 0)))) {
if (uVar12 != 0x39) goto LAB_080130f8;
goto LAB_08013146;
}
}
goto LAB_080130fe;
}
if (0 < iVar13) {
if (uVar12 == 0x39) goto LAB_08013146;
*pcVar20 = (char)iVar9 + '1';
goto LAB_08012b8a;
}
*pcVar20 = (char)uVar12;
if (local_7c != pcVar15 + (int)pcVar21) {
uVar6 = FUN_080140ec(param_1,uVar6,10,0);
pcVar20 = local_7c;
if (uVar22 == uVar23) {
uVar23 = FUN_080140ec(param_1,uVar22,10,0);
uVar22 = uVar23;
}
else {
uVar22 = FUN_080140ec(param_1,uVar22,10,0);
uVar23 = FUN_080140ec(param_1,uVar23,10,0);
}
goto LAB_0801309a;
}
goto LAB_080131d2;
}
uVar18 = uVar12 - 1;
uVar6 = FUN_080140ec(param_1,uVar6,10,0);
local_7c = pcVar21;
if (bVar14) {
uVar23 = FUN_080140ec(param_1,uVar23,10,0);
if ((0 < (int)pcVar21) || ((int)local_64 < 3)) goto LAB_0801303a;
}
else {
if (0 < (int)pcVar21) goto LAB_08013242;
LAB_08012fee:
pcVar21 = local_7c;
if ((int)local_64 < 3) goto LAB_08013032;
}
if (local_7c == (char *)0x0) {
uVar16 = FUN_080140ec(param_1,uVar16,5);
iVar9 = FUN_080145a0(uVar6,uVar16);
if (0 < iVar9) goto LAB_08013016;
}
}
else {
uVar29 = *(undefined8 *)(DAT_08012c70 + uVar12 * 8);
uVar28 = (undefined4)uVar29;
uVar8 = (undefined4)((ulonglong)uVar29 >> 0x20);
pcVar21 = pcVar15;
if ((-1 < (int)local_50) || (0 < (int)local_7c)) goto LAB_08012d28;
if (local_7c == (char *)0x0) {
uVar29 = FUN_08000618(uVar28,uVar8,0,DAT_08012c84);
iVar9 = FUN_08000b24((int)uVar29,(int)((ulonglong)uVar29 >> 0x20),iVar7,uVar2);
uVar18 = uVar12;
if (iVar9 == 0) goto LAB_0801302a;
}
LAB_08012b7c:
uVar16 = 0;
uVar23 = 0;
}
uVar18 = ~local_50;
local_7c = pcVar15;
LAB_08012b88:
uVar22 = 0;
goto LAB_08012b8a;
LAB_08012d04:
do {
pcVar21 = local_34 + -1;
pcVar20 = local_34;
local_34 = local_34 + -1;
} while (*pcVar21 == '0');
goto LAB_08012d8e;
LAB_08013242:
while( true ) {
iVar9 = FUN_080125f0(uVar6,uVar16);
uVar12 = iVar9 + 0x30;
*pcVar20 = (char)uVar12;
if ((int)pcVar21 <= (int)(pcVar20 + 1) - (int)pcVar15) break;
uVar6 = FUN_080140ec(param_1,uVar6,10,0);
pcVar20 = pcVar20 + 1;
}
if ((int)pcVar21 < 1) {
pcVar21 = (char *)0x1;
}
local_7c = pcVar15 + (int)pcVar21;
uVar22 = 0;
LAB_080131d2:
uVar6 = FUN_080144c8(param_1,uVar6,1);
iVar9 = FUN_080145a0(uVar6,uVar16);
pcVar21 = local_7c;
if ((iVar9 < 1) && ((iVar9 != 0 || ((uVar12 & 1) == 0)))) {
do {
local_7c = pcVar21;
pcVar21 = local_7c + -1;
} while (local_7c[-1] == '0');
}
else {
LAB_0801314e:
do {
local_7c = pcVar21;
pcVar21 = local_7c + -1;
if (local_7c[-1] != '9') {
*pcVar21 = local_7c[-1] + '\x01';
goto LAB_08012b8a;
}
} while (pcVar15 != pcVar21);
uVar18 = uVar18 + 1;
*pcVar15 = '1';
}
LAB_08012b8a:
FUN_080140a8(param_1,uVar16);
pcVar20 = local_7c;
if (uVar23 != 0) {
if ((uVar22 != 0) && (uVar22 != uVar23)) {
FUN_080140a8(param_1,uVar22);
}
FUN_080140a8(param_1,uVar23);
}
goto LAB_08012d8e;
while( true ) {
uVar32 = FUN_08000618(uVar24,uVar11,0,DAT_08012f80);
iVar9 = FUN_08000ae8((int)uVar32,(int)(uVar32 >> 0x20),0,0);
pcVar21 = pcVar25;
uVar18 = uVar12;
if (iVar9 != 0) break;
LAB_08012d28:
uVar24 = (undefined4)(uVar32 >> 0x20);
FUN_0800086c((int)uVar32,uVar24,uVar28,uVar8);
bVar4 = FUN_08000b78();
uVar29 = FUN_08000544();
uVar29 = FUN_08000618((int)uVar29,(int)((ulonglong)uVar29 >> 0x20),uVar28,uVar8);
uVar29 = fp_add((int)uVar32,uVar24,(int)uVar29,(int)((ulonglong)uVar29 >> 0x20));
uVar11 = (undefined4)((ulonglong)uVar29 >> 0x20);
uVar24 = (undefined4)uVar29;
pcVar25 = pcVar21 + 1;
*pcVar21 = bVar4 + 0x30;
pcVar20 = pcVar25;
if (local_7c == (char *)((int)pcVar25 - (int)pcVar15)) {
uVar29 = fp_multiply(uVar24,uVar11,uVar24,uVar11);
uVar24 = (undefined4)((ulonglong)uVar29 >> 0x20);
iVar9 = FUN_08000b38((int)uVar29,uVar24,uVar28,uVar8);
uVar18 = uVar12;
if ((iVar9 != 0) ||
((iVar9 = FUN_08000ae8((int)uVar29,uVar24,uVar28,uVar8), iVar9 != 0 && ((bVar4 & 1) != 0)))
) goto LAB_08012db0;
break;
}
}
goto LAB_08012d8e;
while (pcVar15 != pcVar25) {
LAB_08012db0:
pcVar20 = pcVar25;
pcVar25 = pcVar20 + -1;
if (*pcVar25 != '9') goto LAB_08012dca;
}
uVar18 = uVar18 + 1;
*pcVar15 = '0';
LAB_08012dca:
*pcVar25 = *pcVar25 + '\x01';
LAB_08012d8e:
FUN_080140a8(param_1,uVar6);
*pcVar20 = '\0';
*param_4 = uVar18 + 1;
if (param_6 != (int *)0x0) {
*param_6 = (int)pcVar20;
}
return pcVar15;
}
void FUN_08013274(undefined4 *param_1,int param_2,undefined4 param_3,undefined4 param_4)
{
int *extraout_r1;
int *piVar1;
int iVar2;
int *piVar3;
int *piVar4;
int *piVar5;
bool bVar6;
if (param_2 == 0) {
return;
}
piVar5 = (int *)(param_2 + -4);
if (*(int *)(param_2 + -4) < 0) {
piVar5 = (int *)((int)piVar5 + *(int *)(param_2 + -4));
}
FUN_08011428();
piVar3 = DAT_08013304;
piVar4 = (int *)*DAT_08013304;
piVar1 = extraout_r1;
if (piVar4 != (int *)0x0) {
if (piVar4 <= piVar5) {
do {
piVar3 = piVar4;
piVar4 = (int *)piVar3[1];
if (piVar4 == (int *)0x0) break;
} while (piVar4 <= piVar5);
piVar1 = (int *)*piVar3;
if ((int *)((int)piVar3 + (int)piVar1) == piVar5) {
piVar1 = (int *)((int)piVar1 + *piVar5);
*piVar3 = (int)piVar1;
if (piVar4 == (int *)((int)piVar3 + (int)piVar1)) {
iVar2 = *piVar4;
piVar3[1] = piVar4[1];
*piVar3 = iVar2 + (int)piVar1;
}
}
else if (piVar5 < (int *)((int)piVar3 + (int)piVar1)) {
*param_1 = 0xc;
}
else {
piVar1 = (int *)((int)piVar5 + *piVar5);
bVar6 = piVar4 == piVar1;
if (bVar6) {
piVar1 = (int *)*piVar4;
piVar4 = (int *)piVar4[1];
}
piVar5[1] = (int)piVar4;
if (bVar6) {
piVar1 = (int *)((int)piVar1 + *piVar5);
*piVar5 = (int)piVar1;
}
piVar3[1] = (int)piVar5;
}
goto LAB_08013296;
}
piVar1 = (int *)((int)piVar5 + *piVar5);
if (piVar4 == piVar1) {
iVar2 = *piVar4;
piVar4 = (int *)piVar4[1];
piVar1 = (int *)(iVar2 + *piVar5);
*piVar5 = (int)piVar1;
}
}
piVar5[1] = (int)piVar4;
*piVar3 = (int)piVar5;
LAB_08013296:
FUN_08011434(param_1,piVar1,piVar3,param_4);
return;
}
void FUN_08013308(int param_1,uint param_2)
{
uint *puVar1;
int iVar2;
int iVar3;
uint *puVar4;
uint *puVar5;
uint *puVar6;
uint *puVar7;
uint uVar8;
bool bVar9;
iVar2 = *(int *)(param_1 + 0x10);
iVar3 = (int)param_2 >> 5;
puVar5 = (uint *)(param_1 + 0x14);
puVar4 = puVar5;
if (iVar3 < iVar2) {
param_2 = param_2 & 0x1f;
puVar6 = puVar5 + iVar2;
puVar4 = puVar5 + iVar3;
if (param_2 == 0) {
puVar7 = (uint *)(param_1 + 0x10);
for (puVar1 = puVar4; puVar1 < puVar6; puVar1 = puVar1 + 1) {
puVar7 = puVar7 + 1;
*puVar7 = *puVar1;
}
iVar3 = (iVar2 - iVar3) * 4;
if (puVar6 < (uint *)((int)puVar4 - 3U)) {
iVar3 = 0;
}
puVar4 = (uint *)(iVar3 + (int)puVar5);
}
else {
uVar8 = puVar5[iVar3];
puVar1 = puVar5;
puVar7 = puVar4;
while( true ) {
uVar8 = uVar8 >> param_2;
puVar7 = puVar7 + 1;
if (puVar6 <= puVar7) break;
*puVar1 = *puVar7 << (0x20 - param_2 & 0xff) | uVar8;
uVar8 = *puVar7;
puVar1 = puVar1 + 1;
}
iVar3 = (iVar2 - iVar3) * 4 + -4;
if (puVar6 < (uint *)((int)puVar4 + 1U)) {
iVar3 = 0;
}
*(uint *)((int)puVar5 + iVar3) = uVar8;
puVar4 = (uint *)((int)puVar5 + iVar3);
if (uVar8 != 0) {
puVar4 = (uint *)((int)puVar5 + iVar3) + 1;
}
}
}
iVar3 = (int)puVar4 - (int)puVar5;
bVar9 = puVar4 == puVar5;
if (bVar9) {
puVar4 = (uint *)0x0;
}
*(int *)(param_1 + 0x10) = iVar3 >> 2;
if (bVar9) {
*(uint **)(param_1 + 0x14) = puVar4;
}
return;
}
char FUN_080133ac(int param_1)
{
char cVar1;
cVar1 = (char)param_1;
if (param_1 - 0x30U < 10) {
cVar1 = cVar1 + -0x20;
}
else if (param_1 - 0x61U < 6) {
cVar1 = cVar1 + -0x47;
}
else {
if (5 < param_1 - 0x41U) {
return '\0';
}
cVar1 = cVar1 + -0x27;
}
return cVar1;
}
uint FUN_080133d8(undefined4 param_1,int *param_2,int *param_3,int *param_4,int *param_5,
uint param_6)
{
undefined1 *puVar1;
bool bVar2;
int iVar3;
int iVar4;
uint uVar5;
undefined4 uVar6;
int extraout_r1;
byte *pbVar7;
int iVar8;
uint uVar9;
int *piVar10;
int *piVar11;
byte *pbVar12;
byte *pbVar13;
uint *puVar14;
int iVar15;
uint *puVar16;
byte *pbVar17;
byte *pbVar18;
uint *puVar19;
byte *pbVar20;
uint uVar21;
undefined8 uVar22;
pbVar12 = (byte *)(*param_2 + 2);
do {
pbVar18 = pbVar12;
pbVar12 = pbVar18 + 1;
} while (*pbVar18 == 0x30);
pbVar20 = pbVar18 + (-2 - *param_2);
iVar3 = FUN_080133ac();
if (iVar3 == 0) {
iVar3 = FUN_08012494(pbVar18,DAT_08013688,1);
pbVar17 = pbVar18;
if ((iVar3 == 0) &&
(iVar3 = FUN_080133ac(pbVar18[1]), pbVar7 = pbVar12, pbVar17 = pbVar12, iVar3 != 0)) {
do {
pbVar18 = pbVar7;
pbVar7 = pbVar18 + 1;
} while (*pbVar18 == 0x30);
iVar3 = FUN_080133ac();
pbVar13 = (byte *)(uint)(iVar3 == 0);
pbVar20 = (byte *)0x1;
pbVar7 = pbVar18;
goto LAB_08013442;
}
iVar3 = 0;
pbVar13 = (byte *)0x1;
}
else {
pbVar13 = (byte *)0x0;
pbVar7 = pbVar18;
pbVar12 = pbVar13;
LAB_08013442:
do {
pbVar17 = pbVar7;
pbVar7 = pbVar17 + 1;
iVar3 = FUN_080133ac(*pbVar17);
} while (iVar3 != 0);
iVar3 = FUN_08012494(pbVar17,DAT_08013688,1);
if (iVar3 == 0) {
if (pbVar12 == (byte *)0x0) {
pbVar12 = pbVar17 + 1;
pbVar7 = pbVar12;
do {
pbVar17 = pbVar7;
pbVar7 = pbVar17 + 1;
iVar3 = FUN_080133ac(*pbVar17);
} while (iVar3 != 0);
}
}
else if (pbVar12 == (byte *)0x0) {
iVar3 = 0;
goto LAB_08013476;
}
iVar3 = ((int)pbVar12 - (int)pbVar17) * 4;
}
LAB_08013476:
pbVar12 = pbVar17;
if ((*pbVar17 & 0xdf) == 0x50) {
if (pbVar17[1] == 0x2b) {
bVar2 = false;
LAB_080134f0:
pbVar7 = pbVar17 + 2;
}
else {
if (pbVar17[1] == 0x2d) {
bVar2 = true;
goto LAB_080134f0;
}
pbVar7 = pbVar17 + 1;
bVar2 = false;
}
uVar22 = FUN_080133ac(*pbVar7);
if (((int)uVar22 - 1U & 0xff) < 0x19) {
while( true ) {
iVar8 = (int)uVar22 + -0x10;
puVar1 = (undefined1 *)((int)((ulonglong)uVar22 >> 0x20) + 1);
uVar22 = FUN_080133ac(*puVar1,puVar1);
pbVar12 = (byte *)((ulonglong)uVar22 >> 0x20);
if (0x18 < ((int)uVar22 - 1U & 0xff)) break;
uVar22 = CONCAT44(pbVar12,iVar8 * 10 + (int)uVar22);
}
if (bVar2) {
iVar8 = -iVar8;
}
iVar3 = iVar3 + iVar8;
}
}
*param_2 = (int)pbVar12;
if (pbVar13 != (byte *)0x0) {
if (pbVar20 != (byte *)0x0) {
return 0;
}
return 6;
}
pbVar12 = pbVar17 + (-1 - (int)pbVar18);
iVar8 = 0;
LAB_0801350a:
if (7 < (int)pbVar12) {
LAB_08013524:
iVar8 = iVar8 + 1;
pbVar12 = (byte *)((int)pbVar12 >> 1);
goto LAB_0801350a;
}
iVar8 = FUN_08014028(param_1,iVar8);
if (iVar8 == 0) {
uVar6 = 0xe4;
pbVar12 = DAT_0801368c;
LAB_0801351e:
FUN_08014cec(DAT_08013690,uVar6,0);
iVar8 = extraout_r1;
goto LAB_08013524;
}
puVar19 = (uint *)(iVar8 + 0x14);
uVar9 = 0;
uVar21 = 0;
puVar14 = puVar19;
while (pbVar18 < pbVar17) {
pbVar17 = pbVar17 + -1;
if (((*pbVar17 != 0x2e) || (pbVar17 < pbVar18)) ||
(iVar4 = FUN_08012494(pbVar17,DAT_08013688,1), iVar4 != 0)) {
puVar16 = puVar14;
if (uVar9 == 0x20) {
puVar16 = puVar14 + 1;
*puVar14 = uVar21;
uVar21 = 0;
uVar9 = 0;
}
uVar5 = FUN_080133ac(*pbVar17);
uVar21 = uVar21 | (uVar5 & 0xf) << (uVar9 & 0xff);
uVar9 = uVar9 + 4;
puVar14 = puVar16;
}
}
*puVar14 = uVar21;
iVar15 = (int)puVar14 + (4 - (int)puVar19) >> 2;
*(int *)(iVar8 + 0x10) = iVar15;
iVar4 = FUN_0801420c(uVar21);
pbVar17 = (byte *)*param_3;
iVar4 = iVar15 * 0x20 - iVar4;
if ((int)pbVar17 < iVar4) {
iVar4 = iVar4 - (int)pbVar17;
uVar9 = FUN_0801493a(iVar8,iVar4);
if (uVar9 != 0) {
uVar21 = iVar4 - 1;
uVar9 = 1;
if ((1 << (uVar21 & 0x1f) & puVar19[(int)uVar21 >> 5]) != 0) {
if (((int)uVar21 < 2) || (iVar15 = FUN_0801493a(iVar8,iVar4 + -2), iVar15 == 0)) {
uVar9 = 2;
}
else {
uVar9 = 3;
}
}
}
FUN_08013308(iVar8,iVar4);
iVar3 = iVar3 + iVar4;
}
else {
if (iVar4 < (int)pbVar17) {
iVar8 = FUN_080144c8(param_1,iVar8,(int)pbVar17 - iVar4);
iVar3 = iVar3 - ((int)pbVar17 - iVar4);
puVar19 = (uint *)(iVar8 + 0x14);
}
uVar9 = 0;
}
iVar4 = iVar8;
if (param_3[2] < iVar3) goto LAB_08013596;
if (iVar3 < param_3[1]) {
pbVar12 = (byte *)(param_3[1] - iVar3);
if ((int)pbVar17 <= (int)pbVar12) {
iVar3 = param_3[3];
if (iVar3 == 2) {
if (param_6 != 0) goto LAB_08013666;
}
else {
if (iVar3 != 3) {
if ((iVar3 != 1) || (pbVar17 != pbVar12)) goto LAB_08013666;
if (pbVar17 == (byte *)0x1) goto LAB_08013642;
param_6 = FUN_0801493a(iVar8,pbVar17 + -1);
}
if (param_6 == 0) {
LAB_08013666:
FUN_080140a8(param_1,iVar8);
*param_5 = 0;
return 0x50;
}
}
LAB_08013642:
*param_4 = param_3[1];
*(undefined4 *)(iVar8 + 0x10) = 1;
*puVar19 = 1;
*param_5 = iVar8;
return 0x62;
}
pbVar18 = pbVar12 + -1;
if (uVar9 == 0) {
if (pbVar18 != (byte *)0x0) {
uVar9 = FUN_0801493a(iVar8,pbVar18);
}
}
else {
uVar9 = 1;
}
if ((1 << ((uint)pbVar18 & 0x1f) & puVar19[(int)pbVar18 >> 5]) != 0) {
uVar9 = uVar9 | 2;
}
FUN_08013308(iVar8,pbVar12);
iVar3 = param_3[1];
pbVar17 = pbVar17 + -(int)pbVar12;
uVar21 = 2;
}
else {
uVar21 = 1;
}
if (uVar9 == 0) goto LAB_08013764;
iVar15 = param_3[3];
if (iVar15 != 2) {
uVar5 = param_6;
if (iVar15 == 3) goto joined_r0x080136f6;
if ((iVar15 == 1) && ((uVar9 & 2) != 0)) {
uVar5 = (uVar9 | *puVar19) & 1;
goto joined_r0x080136f6;
}
LAB_080136f8:
uVar21 = uVar21 | 0x10;
goto LAB_08013764;
}
param_6 = 1 - param_6;
uVar5 = param_6;
joined_r0x080136f6:
if (uVar5 == 0) goto LAB_080136f8;
iVar15 = *(int *)(iVar8 + 0x10);
piVar10 = (int *)(iVar8 + 0x14);
do {
piVar11 = piVar10 + 1;
if (*piVar10 != -1) {
*piVar10 = *piVar10 + 1;
goto LAB_0801373a;
}
*piVar10 = 0;
piVar10 = piVar11;
} while (piVar11 < (int *)(iVar8 + 0x14) + iVar15);
if (*(int *)(iVar8 + 8) <= iVar15) {
iVar4 = FUN_08014028(param_1,*(int *)(iVar8 + 4) + 1);
if (iVar4 == 0) {
uVar6 = 0x84;
pbVar18 = (byte *)0x0;
pbVar12 = DAT_080137f4;
goto LAB_0801351e;
}
copyBuffer(iVar4 + 0xc,iVar8 + 0xc,(*(int *)(iVar8 + 0x10) + 2) * 4);
FUN_080140a8(param_1,iVar8);
}
iVar8 = *(int *)(iVar4 + 0x10);
*(int *)(iVar4 + 0x10) = iVar8 + 1;
*(undefined4 *)(iVar4 + iVar8 * 4 + 0x14) = 1;
LAB_0801373a:
if (uVar21 == 2) {
uVar21 = 2;
if (((byte *)(*param_3 + -1) != pbVar17) ||
((1 << ((uint)pbVar17 & 0x1f) & *(uint *)(iVar4 + 0x14 + ((int)pbVar17 >> 5) * 4)) == 0))
goto LAB_08013760;
}
else if ((iVar15 < *(int *)(iVar4 + 0x10)) ||
((((uint)pbVar17 & 0x1f) != 0 &&
(iVar8 = FUN_0801420c(*(undefined4 *)(iVar4 + 0x14 + iVar15 * 4 + -4)),
iVar8 < (int)(0x20 - ((uint)pbVar17 & 0x1f)))))) {
FUN_08013308(iVar4,1);
iVar3 = iVar3 + 1;
if (param_3[2] < iVar3) {
LAB_08013596:
FUN_080140a8(param_1,iVar4);
*param_5 = 0;
return 0xa3;
}
}
uVar21 = 1;
LAB_08013760:
uVar21 = uVar21 | 0x20;
LAB_08013764:
*param_5 = iVar4;
*param_4 = iVar3;
return uVar21;
}
void FUN_080137f8(uint *param_1,uint *param_2,int param_3)
{
uint *puVar1;
do {
puVar1 = param_1 + 1;
*param_1 = *param_1 | *puVar1 << ((8 - param_3) * -4 + 0x20U & 0xff);
param_1 = param_1 + 1;
*param_1 = *puVar1 >> ((8 - param_3) * 4 & 0xffU);
} while (param_1 < param_2);
return;
}
undefined4 FUN_0801381c(undefined4 *param_1,byte *param_2)
{
byte bVar1;
uint uVar2;
byte *pbVar3;
pbVar3 = (byte *)*param_1;
do {
pbVar3 = pbVar3 + 1;
bVar1 = *param_2;
if (bVar1 == 0) {
*param_1 = pbVar3;
return 1;
}
uVar2 = (uint)*pbVar3;
if (uVar2 - 0x41 < 0x1a) {
uVar2 = uVar2 + 0x20;
}
param_2 = param_2 + 1;
} while (uVar2 == bVar1);
return 0;
}
undefined4 FUN_08013844(int *param_1,uint *param_2,uint *param_3)
{
byte bVar1;
uint uVar2;
undefined4 uVar3;
int iVar4;
uint *puVar5;
uint uVar6;
int iVar7;
uint *puVar8;
uint *puVar10;
uint *puVar11;
int iVar12;
uint *puVar13;
int iVar14;
int local_38;
uint *puVar9;
iVar4 = *param_1;
puVar10 = param_3 + ((int)*param_2 >> 5);
uVar6 = *param_2 & 0x1f;
if (uVar6 != 0) {
puVar10 = puVar10 + 1;
}
iVar12 = 0;
puVar13 = puVar10 + -1;
puVar10[-1] = 0;
local_38 = 0;
iVar14 = 0;
puVar11 = puVar13;
puVar5 = puVar13;
LAB_08013872:
while( true ) {
bVar1 = *(byte *)(iVar4 + 1);
iVar7 = iVar4 + 1;
if (bVar1 == 0) break;
uVar2 = FUN_080133ac(bVar1);
if (uVar2 != 0) {
iVar12 = iVar12 + 1;
iVar14 = iVar14 + 1;
if (8 < iVar12) goto code_r0x08013936;
goto LAB_08013944;
}
if (0x20 < bVar1) {
if (bVar1 != 0x29) goto LAB_08013976;
*param_1 = iVar4 + 2;
break;
}
iVar4 = iVar7;
if (local_38 < iVar14) {
if ((puVar11 < puVar5) && (iVar12 < 8)) {
FUN_080137f8(puVar11,puVar5,iVar12);
}
if (param_3 < puVar11) {
puVar5 = puVar11 + -1;
puVar11[-1] = 0;
iVar12 = 0;
puVar11 = puVar5;
local_38 = iVar14;
}
else {
iVar12 = 8;
}
}
}
if (iVar14 == 0) {
LAB_08013976:
uVar3 = 4;
}
else {
if ((puVar11 < puVar5) && (iVar12 < 8)) {
FUN_080137f8(puVar11,puVar5,iVar12);
}
if (param_3 < puVar11) {
puVar5 = param_3 + -1;
puVar8 = puVar11;
do {
puVar9 = puVar8 + 1;
puVar5 = puVar5 + 1;
*puVar5 = *puVar8;
puVar8 = puVar9;
} while (puVar9 <= puVar13);
iVar4 = ((int)puVar13 - (int)puVar11 & 0xfffffffcU) + 4;
if ((int)puVar10 - 3U < (int)puVar11 + 1U) {
iVar4 = 4;
}
puVar10 = (uint *)(iVar4 + (int)param_3);
do {
puVar11 = puVar10 + 1;
*puVar10 = 0;
puVar10 = puVar11;
} while (puVar11 <= puVar13);
}
else if (uVar6 != 0) {
puVar10[-1] = puVar10[-1] & 0xffffffffU >> (0x20 - uVar6 & 0xff);
}
for (; *puVar13 == 0; puVar13 = puVar13 + -1) {
if (puVar13 == param_3) {
*puVar13 = 1;
break;
}
}
uVar3 = 5;
}
return uVar3;
code_r0x08013936:
iVar4 = iVar7;
if (param_3 < puVar11) {
puVar11[-1] = 0;
iVar12 = 1;
puVar11 = puVar11 + -1;
LAB_08013944:
*puVar11 = uVar2 & 0xf | *puVar11 << 4;
iVar4 = iVar7;
}
goto LAB_08013872;
}
undefined4 FUN_0801397a(undefined4 *param_1,int *param_2,undefined4 param_3,uint param_4)
{
int iVar1;
uint uVar2;
uint uVar3;
int iVar4;
if ((uint)param_2[2] <= param_4) {
uVar3 = param_2[2];
if (((int)(short)param_2[3] & 0x480U) != 0) {
iVar4 = *param_2 - param_2[4];
uVar2 = param_4 + 1 + iVar4;
uVar3 = (param_2[5] * 3) / 2;
if (uVar3 < uVar2) {
uVar3 = uVar2;
}
if ((int)(short)param_2[3] << 0x15 < 0) {
iVar1 = FUN_08010b7c(param_1,uVar3);
if (iVar1 == 0) {
LAB_08013a1c:
*param_1 = 0xc;
*(ushort *)(param_2 + 3) = *(ushort *)(param_2 + 3) | 0x40;
return 0xffffffff;
}
copyBuffer(iVar1,param_2[4],iVar4);
*(ushort *)(param_2 + 3) = *(ushort *)(param_2 + 3) & 0xfb7f | 0x80;
}
else {
iVar1 = FUN_080115cc(param_1,param_2[4],uVar3);
if (iVar1 == 0) {
FUN_08013274(param_1,param_2[4]);
goto LAB_08013a1c;
}
}
param_2[4] = iVar1;
param_2[5] = uVar3;
*param_2 = iVar1 + iVar4;
param_2[2] = uVar3 - iVar4;
uVar3 = param_4;
}
if (uVar3 <= param_4) goto LAB_080139ec;
}
uVar3 = param_4;
LAB_080139ec:
FUN_08012450(*param_2,param_3,uVar3);
param_2[2] = param_2[2] - uVar3;
*param_2 = *param_2 + uVar3;
return 0;
}
int FUN_08013a30(undefined4 *param_1,int *param_2,byte *param_3,uint *param_4)
{
int iVar1;
int iVar2;
uint *puVar3;
bool bVar4;
uint uVar5;
byte *pbVar6;
int unaff_r6;
byte *pbVar7;
int iVar8;
uint *local_8c;
uint local_88;
uint local_84;
undefined4 uStack_80;
uint local_7c;
int local_74;
byte local_70;
undefined1 local_6f;
undefined1 local_6e;
undefined1 local_45;
undefined4 local_30;
if (((int)((uint)*(ushort *)(param_2 + 3) << 0x18) < 0) && (param_2[4] == 0)) {
iVar1 = FUN_08010b7c(param_1,0x40);
*param_2 = iVar1;
param_2[4] = iVar1;
if (iVar1 == 0) {
*param_1 = 0xc;
return -1;
}
param_2[5] = 0x40;
}
iVar1 = DAT_08013c14;
local_74 = 0;
local_6f = 0x20;
local_6e = 0x30;
pbVar7 = param_3;
local_8c = param_4;
LAB_08013a84:
pbVar6 = pbVar7;
if (*pbVar6 != 0) goto code_r0x08013a8c;
goto LAB_08013a90;
code_r0x08013a8c:
pbVar7 = pbVar6 + 1;
if (*pbVar6 != 0x25) goto LAB_08013a84;
LAB_08013a90:
iVar8 = (int)pbVar6 - (int)param_3;
if (iVar8 != 0) {
iVar2 = FUN_0801397a(param_1,param_2,param_3,iVar8);
if (iVar2 == -1) {
LAB_08013bf6:
if ((int)((uint)*(ushort *)(param_2 + 3) << 0x19) < 0) {
return -1;
}
return local_74;
}
local_74 = local_74 + iVar8;
}
if (*pbVar6 == 0) goto LAB_08013bf6;
local_84 = 0xffffffff;
uStack_80 = 0;
local_88 = 0;
local_7c = 0;
local_45 = 0;
local_30 = 0;
pbVar7 = pbVar6 + 1;
while( true ) {
pbVar6 = pbVar7 + 1;
iVar2 = memchr_custom(DAT_08013c14,*pbVar7,5);
iVar8 = DAT_08013c24;
if (iVar2 == 0) break;
local_88 = 1 << (iVar2 - iVar1 & 0xffU) | local_88;
pbVar7 = pbVar6;
}
if ((int)(local_88 << 0x1b) < 0) {
local_45 = 0x20;
}
if ((int)(local_88 << 0x1c) < 0) {
local_45 = 0x2b;
}
if (*pbVar7 == 0x2a) {
puVar3 = local_8c + 1;
local_7c = *local_8c;
local_8c = puVar3;
if ((int)local_7c < 0) {
local_7c = -local_7c;
local_88 = local_88 | 2;
}
}
else {
bVar4 = false;
uVar5 = local_7c;
pbVar6 = pbVar7;
while( true ) {
if (9 < *pbVar6 - 0x30) break;
uVar5 = uVar5 * 10 + (*pbVar6 - 0x30);
bVar4 = true;
pbVar6 = pbVar6 + 1;
}
if (bVar4) {
local_7c = uVar5;
}
}
if (*pbVar6 == 0x2e) {
if (pbVar6[1] == 0x2a) {
uVar5 = *local_8c;
pbVar6 = pbVar6 + 2;
local_8c = local_8c + 1;
local_84 = uVar5 | (int)uVar5 >> 0x1f;
}
else {
bVar4 = false;
local_84 = 0;
uVar5 = 0;
while( true ) {
pbVar6 = pbVar6 + 1;
if (9 < *pbVar6 - 0x30) break;
uVar5 = uVar5 * 10 + (*pbVar6 - 0x30);
bVar4 = true;
}
if (bVar4) {
local_84 = uVar5;
}
}
}
iVar2 = memchr_custom(DAT_08013c24,*pbVar6,3);
if (iVar2 != 0) {
local_88 = local_88 | 0x40 << (iVar2 - iVar8 & 0xffU);
pbVar6 = pbVar6 + 1;
}
param_3 = pbVar6 + 1;
local_70 = *pbVar6;
iVar8 = memchr_custom(DAT_08013c18,local_70,6);
if (iVar8 == 0) {
unaff_r6 = FUN_08010d58(param_1,&local_88,param_2,DAT_08013c20,&local_8c);
}
else {
if (DAT_08013c1c == 0) {
local_8c = (uint *)(((int)local_8c + 7U & 0xfffffff8) + 8);
goto LAB_08013ba4;
}
unaff_r6 = FUN_080106d4(param_1,&local_88,param_2,DAT_08013c20,&local_8c);
}
if (unaff_r6 == -1) goto LAB_08013bf6;
LAB_08013ba4:
local_74 = local_74 + unaff_r6;
pbVar7 = param_3;
goto LAB_08013a84;
}
int FUN_08013c28(undefined4 param_1,int param_2,undefined4 *param_3)
{
int iVar1;
undefined1 *puVar2;
iVar1 = param_3[2] + -1;
param_3[2] = iVar1;
if ((iVar1 < 0) && ((iVar1 < (int)param_3[6] || (param_2 == 10)))) {
iVar1 = FUN_08014a12();
return iVar1;
}
puVar2 = (undefined1 *)*param_3;
*param_3 = puVar2 + 1;
*puVar2 = (char)param_2;
return param_2;
}
int FUN_08013c56(undefined4 param_1,undefined4 param_2,undefined1 *param_3,int param_4)
{
int iVar1;
undefined1 *puVar2;
int iVar3;
puVar2 = param_3 + param_4;
iVar3 = param_4;
do {
if (param_3 == puVar2) {
return 0;
}
iVar1 = FUN_08013c28(param_1,*param_3,param_2,param_4,iVar3);
param_4 = iVar1 + 1;
param_3 = param_3 + 1;
} while (param_4 != 0);
return iVar1;
}
int FUN_08013c7c(int param_1,int param_2,byte *param_3,uint *param_4)
{
int iVar1;
int iVar2;
uint *puVar3;
bool bVar4;
uint uVar5;
byte *pbVar6;
int unaff_r7;
byte *pbVar7;
int iVar8;
uint *local_8c;
uint local_88;
uint local_84;
undefined4 uStack_80;
uint local_7c;
int local_74;
byte local_70;
undefined1 local_6f;
undefined1 local_6e;
undefined1 local_45;
undefined4 local_30;
if ((param_1 != 0) && (*(int *)(param_1 + 0x20) == 0)) {
FUN_0801159c();
}
if ((-1 < *(int *)(param_2 + 100) << 0x1f) &&
(-1 < (int)((uint)*(ushort *)(param_2 + 0xc) << 0x16))) {
FUN_080125b6(*(undefined4 *)(param_2 + 0x58));
}
if (((-1 < (int)((uint)*(ushort *)(param_2 + 0xc) << 0x1c)) || (*(int *)(param_2 + 0x10) == 0)) &&
(iVar1 = FUN_08014a90(param_1,param_2), iVar1 != 0)) {
if ((-1 < *(int *)(param_2 + 100) << 0x1f) &&
(-1 < (int)((uint)*(ushort *)(param_2 + 0xc) << 0x16))) {
FUN_080125b8(*(undefined4 *)(param_2 + 0x58));
}
return -1;
}
iVar1 = DAT_08013e98;
local_74 = 0;
local_6f = 0x20;
local_6e = 0x30;
pbVar7 = param_3;
local_8c = param_4;
LAB_08013cf6:
pbVar6 = pbVar7;
if (*pbVar6 != 0) goto code_r0x08013cfe;
goto LAB_08013d02;
code_r0x08013cfe:
pbVar7 = pbVar6 + 1;
if (*pbVar6 != 0x25) goto LAB_08013cf6;
LAB_08013d02:
iVar8 = (int)pbVar6 - (int)param_3;
if (iVar8 != 0) {
iVar2 = FUN_08013c56(param_1,param_2,param_3,iVar8);
if (iVar2 == -1) {
LAB_08013e68:
if ((-1 < *(int *)(param_2 + 100) << 0x1f) &&
(-1 < (int)((uint)*(ushort *)(param_2 + 0xc) << 0x16))) {
FUN_080125b8(*(undefined4 *)(param_2 + 0x58));
}
if ((int)((uint)*(ushort *)(param_2 + 0xc) << 0x19) < 0) {
return -1;
}
return local_74;
}
local_74 = local_74 + iVar8;
}
if (*pbVar6 == 0) goto LAB_08013e68;
local_84 = 0xffffffff;
uStack_80 = 0;
local_88 = 0;
local_7c = 0;
local_45 = 0;
local_30 = 0;
pbVar7 = pbVar6 + 1;
while( true ) {
pbVar6 = pbVar7 + 1;
iVar2 = memchr_custom(DAT_08013e98,*pbVar7,5);
iVar8 = DAT_08013ea8;
if (iVar2 == 0) break;
local_88 = 1 << (iVar2 - iVar1 & 0xffU) | local_88;
pbVar7 = pbVar6;
}
if ((int)(local_88 << 0x1b) < 0) {
local_45 = 0x20;
}
if ((int)(local_88 << 0x1c) < 0) {
local_45 = 0x2b;
}
if (*pbVar7 == 0x2a) {
puVar3 = local_8c + 1;
local_7c = *local_8c;
local_8c = puVar3;
if ((int)local_7c < 0) {
local_7c = -local_7c;
local_88 = local_88 | 2;
}
}
else {
bVar4 = false;
uVar5 = local_7c;
pbVar6 = pbVar7;
while( true ) {
if (9 < *pbVar6 - 0x30) break;
uVar5 = uVar5 * 10 + (*pbVar6 - 0x30);
bVar4 = true;
pbVar6 = pbVar6 + 1;
}
if (bVar4) {
local_7c = uVar5;
}
}
if (*pbVar6 == 0x2e) {
if (pbVar6[1] == 0x2a) {
uVar5 = *local_8c;
pbVar6 = pbVar6 + 2;
local_8c = local_8c + 1;
local_84 = uVar5 | (int)uVar5 >> 0x1f;
}
else {
bVar4 = false;
local_84 = 0;
uVar5 = 0;
while( true ) {
pbVar6 = pbVar6 + 1;
if (9 < *pbVar6 - 0x30) break;
uVar5 = uVar5 * 10 + (*pbVar6 - 0x30);
bVar4 = true;
}
if (bVar4) {
local_84 = uVar5;
}
}
}
iVar2 = memchr_custom(DAT_08013ea8,*pbVar6,3);
if (iVar2 != 0) {
local_88 = local_88 | 0x40 << (iVar2 - iVar8 & 0xffU);
pbVar6 = pbVar6 + 1;
}
param_3 = pbVar6 + 1;
local_70 = *pbVar6;
iVar8 = memchr_custom(DAT_08013e9c,local_70,6);
if (iVar8 == 0) {
unaff_r7 = FUN_08010d58(param_1,&local_88,param_2,DAT_08013ea4,&local_8c);
}
else {
if (DAT_08013ea0 == 0) {
local_8c = (uint *)(((int)local_8c + 7U & 0xfffffff8) + 8);
goto LAB_08013e16;
}
unaff_r7 = FUN_080106d4(param_1,&local_88,param_2,DAT_08013ea4,&local_8c);
}
if (unaff_r7 == -1) goto LAB_08013e68;
LAB_08013e16:
local_74 = local_74 + unaff_r7;
pbVar7 = param_3;
goto LAB_08013cf6;
}
undefined4 FUN_08013ed0(uint *param_1,int *param_2)
{
ushort uVar1;
int iVar2;
int *piVar3;
uint uVar4;
int iVar5;
code *pcVar6;
int iVar7;
uint uVar8;
bool bVar9;
uVar4 = (uint)(short)param_2[3];
if ((int)(uVar4 << 0x1c) < 0) {
iVar2 = param_2[4];
if (iVar2 != 0) {
iVar5 = uVar4 << 0x1e;
bVar9 = iVar5 == 0;
iVar7 = *param_2;
if (bVar9) {
iVar5 = param_2[5];
}
*param_2 = iVar2;
if (!bVar9) {
iVar5 = 0;
}
param_2[2] = iVar5;
for (iVar7 = iVar7 - iVar2; 0 < iVar7; iVar7 = iVar7 - iVar5) {
iVar5 = (*(code *)param_2[10])(param_1,param_2[8],iVar2,iVar7);
if (iVar5 < 1) goto LAB_08013fba;
iVar2 = iVar2 + iVar5;
}
}
}
else {
if ((param_2[1] < 1) && (param_2[0x10] < 1)) {
return 0;
}
pcVar6 = (code *)param_2[0xb];
if (pcVar6 == (code *)0x0) {
return 0;
}
uVar8 = *param_1;
iVar2 = param_2[8];
*param_1 = 0;
if ((uVar4 & 0x1000) == 0) {
iVar2 = (*pcVar6)(param_1,iVar2,0,1);
if ((iVar2 == -1) && (uVar4 = *param_1, uVar4 != 0)) {
if ((uVar4 == 0x1d) || (uVar4 == 0x16)) {
*param_1 = uVar8;
return 0;
}
LAB_08013fba:
uVar1 = *(ushort *)(param_2 + 3);
goto LAB_08013fc2;
}
}
else {
iVar2 = param_2[0x15];
}
if (((int)((uint)*(ushort *)(param_2 + 3) << 0x1d) < 0) &&
(iVar2 = iVar2 - param_2[1], param_2[0xd] != 0)) {
iVar2 = iVar2 - param_2[0x10];
}
iVar2 = (*(code *)param_2[0xb])(param_1,param_2[8],iVar2,0);
uVar1 = *(ushort *)(param_2 + 3);
if ((iVar2 == -1) &&
((0x1d < *param_1 || (-1 < (int)((DAT_08013fd4 >> (*param_1 & 0xff)) << 0x1f))))) {
LAB_08013fc2:
*(ushort *)(param_2 + 3) = uVar1 | 0x40;
return 0xffffffff;
}
param_2[1] = 0;
*param_2 = param_2[4];
if (((int)((uint)uVar1 << 0x13) < 0) && ((iVar2 != -1 || (*param_1 == 0)))) {
param_2[0x15] = iVar2;
}
piVar3 = (int *)param_2[0xd];
*param_1 = uVar8;
if (piVar3 != (int *)0x0) {
if (piVar3 != param_2 + 0x11) {
FUN_08013274(param_1);
}
param_2[0xd] = 0;
}
}
return 0;
}
undefined4 FUN_08013fd8(int param_1,int param_2)
{
undefined4 uVar1;
if (*(int *)(param_2 + 0x10) != 0) {
if ((param_1 != 0) && (*(int *)(param_1 + 0x20) == 0)) {
FUN_0801159c();
}
if (*(short *)(param_2 + 0xc) != 0) {
if ((-1 < *(int *)(param_2 + 100) << 0x1f) && (-1 < (int)*(short *)(param_2 + 0xc) << 0x16)) {
FUN_080125b6(*(undefined4 *)(param_2 + 0x58));
}
uVar1 = FUN_08013ed0(param_1,param_2);
if (*(int *)(param_2 + 100) << 0x1f < 0) {
return uVar1;
}
if ((int)((uint)*(ushort *)(param_2 + 0xc) << 0x16) < 0) {
return uVar1;
}
FUN_080125b8(*(undefined4 *)(param_2 + 0x58));
return uVar1;
}
}
return 0;
}
undefined4 * FUN_08014028(int param_1,uint param_2)
{
undefined4 *puVar1;
undefined4 uVar2;
int iVar3;
int iVar4;
if (*(int *)(param_1 + 0x1c) == 0) {
puVar1 = (undefined4 *)FUN_08010b28(0x10);
*(undefined4 **)(param_1 + 0x1c) = puVar1;
if (puVar1 == (undefined4 *)0x0) {
puVar1 = (undefined4 *)FUN_08014cec(DAT_080140a4,0x6b,0,DAT_080140a0);
}
puVar1[1] = 0;
puVar1[2] = 0;
*puVar1 = 0;
puVar1[3] = 0;
}
iVar4 = *(int *)(param_1 + 0x1c);
if (*(int *)(iVar4 + 0xc) == 0) {
uVar2 = FUN_08014d28(param_1,4,0x21);
iVar3 = *(int *)(param_1 + 0x1c);
*(undefined4 *)(iVar4 + 0xc) = uVar2;
if (*(int *)(iVar3 + 0xc) != 0) goto LAB_08014056;
LAB_0801408c:
puVar1 = (undefined4 *)0x0;
}
else {
LAB_08014056:
iVar4 = *(int *)(*(int *)(param_1 + 0x1c) + 0xc);
puVar1 = *(undefined4 **)(iVar4 + param_2 * 4);
if (puVar1 == (undefined4 *)0x0) {
iVar4 = 1 << (param_2 & 0xff);
puVar1 = (undefined4 *)FUN_08014d28(param_1,1,(iVar4 + 5) * 4);
if (puVar1 == (undefined4 *)0x0) goto LAB_0801408c;
puVar1[1] = param_2;
puVar1[2] = iVar4;
}
else {
*(undefined4 *)(iVar4 + param_2 * 4) = *puVar1;
}
puVar1[3] = 0;
puVar1[4] = 0;
}
return puVar1;
}
void FUN_080140a8(int param_1,undefined4 *param_2)
{
undefined4 *puVar1;
int iVar2;
if (*(int *)(param_1 + 0x1c) == 0) {
puVar1 = (undefined4 *)FUN_08010b28(0x10);
*(undefined4 **)(param_1 + 0x1c) = puVar1;
if (puVar1 == (undefined4 *)0x0) {
puVar1 = (undefined4 *)FUN_08014cec(DAT_080140e8,0x8f,0,DAT_080140e4);
}
puVar1[1] = 0;
puVar1[2] = 0;
*puVar1 = 0;
puVar1[3] = 0;
}
if (param_2 != (undefined4 *)0x0) {
iVar2 = *(int *)(*(int *)(param_1 + 0x1c) + 0xc);
*param_2 = *(undefined4 *)(iVar2 + param_2[1] * 4);
*(undefined4 **)(iVar2 + param_2[1] * 4) = param_2;
}
return;
}
int FUN_080140ec(undefined4 param_1,int param_2,int param_3,uint param_4)
{
int iVar1;
int iVar2;
uint uVar3;
int iVar4;
uint *puVar5;
iVar4 = *(int *)(param_2 + 0x10);
iVar1 = 0;
puVar5 = (uint *)(param_2 + 0x14);
do {
param_4 = param_3 * (*puVar5 & 0xffff) + param_4;
uVar3 = param_3 * (*puVar5 >> 0x10) + (param_4 >> 0x10);
iVar1 = iVar1 + 1;
*puVar5 = (param_4 & 0xffff) + uVar3 * 0x10000;
param_4 = uVar3 >> 0x10;
puVar5 = puVar5 + 1;
} while (iVar1 < iVar4);
iVar1 = param_2;
if (param_4 != 0) {
if (*(int *)(param_2 + 8) <= iVar4) {
iVar1 = FUN_08014028(param_1,*(int *)(param_2 + 4) + 1);
iVar2 = iVar1;
if (iVar1 == 0) {
iVar2 = FUN_08014cec(DAT_08014174,0xba,0,DAT_08014170);
}
copyBuffer(iVar2 + 0xc,param_2 + 0xc,(*(int *)(param_2 + 0x10) + 2) * 4);
FUN_080140a8(param_1,param_2);
}
*(uint *)(iVar1 + iVar4 * 4 + 0x14) = param_4;
*(int *)(iVar1 + 0x10) = iVar4 + 1;
}
return iVar1;
}
void FUN_08014178(undefined4 param_1,int param_2,int param_3,int param_4,undefined4 param_5)
{
int iVar1;
int extraout_r1;
int iVar2;
int iVar3;
byte *pbVar4;
byte *pbVar5;
int iVar6;
iVar3 = (param_4 + 8) / 9;
iVar1 = 0;
iVar2 = 1;
iVar6 = param_4;
do {
if (iVar3 <= iVar2) {
iVar2 = FUN_08014028(param_1,iVar1);
if (iVar2 != 0) {
*(undefined4 *)(iVar2 + 0x14) = param_5;
*(undefined4 *)(iVar2 + 0x10) = 1;
if (param_3 < 10) {
pbVar4 = (byte *)(param_2 + 10);
param_3 = 9;
}
else {
pbVar4 = (byte *)(param_2 + 9);
do {
pbVar5 = pbVar4 + 1;
iVar2 = FUN_080140ec(param_1,iVar2,10,*pbVar4 - 0x30,iVar6);
pbVar4 = pbVar5;
} while (pbVar5 != (byte *)(param_2 + param_3));
pbVar4 = (byte *)(param_2 + 9) + param_3 + -8;
}
param_3 = param_3 - (int)pbVar4;
for (; (int)(pbVar4 + param_3) < param_4; pbVar4 = pbVar4 + 1) {
iVar2 = FUN_080140ec(param_1,iVar2,10,*pbVar4 - 0x30,iVar6);
}
return;
}
iVar3 = DAT_08014204;
FUN_08014cec(DAT_08014208,0xd3);
iVar1 = extraout_r1;
}
iVar2 = iVar2 << 1;
iVar1 = iVar1 + 1;
} while( true );
}
int FUN_0801420c(uint param_1)
{
int iVar1;
if (param_1 < 0x10000) {
param_1 = param_1 << 0x10;
iVar1 = 0x10;
}
else {
iVar1 = 0;
}
if (param_1 < 0x1000000) {
param_1 = param_1 << 8;
iVar1 = iVar1 + 8;
}
if (param_1 < 0x10000000) {
param_1 = param_1 << 4;
iVar1 = iVar1 + 4;
}
if (param_1 < 0x40000000) {
param_1 = param_1 << 2;
iVar1 = iVar1 + 2;
}
if ((-1 < (int)param_1) && (iVar1 = iVar1 + 1, (param_1 & 0x40000000) == 0)) {
iVar1 = 0x20;
}
return iVar1;
}
int FUN_0801424a(uint *param_1)
{
int iVar1;
uint uVar2;
uVar2 = *param_1;
if ((uVar2 & 7) == 0) {
iVar1 = 0;
if ((uVar2 & 0xffff) == 0) {
uVar2 = uVar2 >> 0x10;
iVar1 = 0x10;
}
if ((uVar2 & 0xff) == 0) {
iVar1 = iVar1 + 8;
uVar2 = uVar2 >> 8;
}
if ((uVar2 & 0xf) == 0) {
uVar2 = uVar2 >> 4;
iVar1 = iVar1 + 4;
}
if ((uVar2 & 3) == 0) {
uVar2 = uVar2 >> 2;
iVar1 = iVar1 + 2;
}
if (-1 < (int)(uVar2 << 0x1f)) {
uVar2 = uVar2 >> 1;
iVar1 = iVar1 + 1;
if (uVar2 == 0) {
return 0x20;
}
}
*param_1 = uVar2;
return iVar1;
}
if ((int)(uVar2 << 0x1f) < 0) {
return 0;
}
if ((int)(uVar2 << 0x1e) < 0) {
iVar1 = 1;
*param_1 = uVar2 >> 1;
}
else {
*param_1 = uVar2 >> 2;
iVar1 = 2;
}
return iVar1;
}
void FUN_080142a4(undefined4 param_1,undefined4 param_2)
{
int iVar1;
iVar1 = FUN_08014028(param_1,1);
if (iVar1 == 0) {
iVar1 = FUN_08014cec(DAT_080142cc,0x145,0,DAT_080142c8);
}
*(undefined4 *)(iVar1 + 0x14) = param_2;
*(undefined4 *)(iVar1 + 0x10) = 1;
return;
}
void FUN_080142d0(undefined4 param_1,int param_2,int param_3)
{
int iVar1;
ushort *puVar2;
uint uVar3;
uint *puVar4;
ushort *puVar5;
int iVar6;
uint *puVar7;
int iVar8;
int iVar9;
uint uVar10;
uint *puVar11;
uint *puVar12;
int iVar13;
uint uVar14;
uint *puVar15;
uint *puVar16;
uint *puVar17;
iVar6 = param_2;
if (*(int *)(param_3 + 0x10) <= *(int *)(param_2 + 0x10)) {
iVar6 = param_3;
param_3 = param_2;
}
iVar8 = *(int *)(param_3 + 0x10);
iVar13 = *(int *)(iVar6 + 0x10);
iVar1 = *(int *)(param_3 + 4);
iVar9 = iVar8 + iVar13;
if (*(int *)(param_3 + 8) < iVar9) {
iVar1 = iVar1 + 1;
}
iVar1 = FUN_08014028(param_1,iVar1);
if (iVar1 == 0) {
iVar1 = FUN_08014cec(DAT_08014410,0x162,0,DAT_0801440c);
}
puVar7 = (uint *)(iVar1 + 0x14);
puVar17 = puVar7 + iVar9;
for (puVar4 = puVar7; puVar4 < puVar17; puVar4 = puVar4 + 1) {
*puVar4 = 0;
}
puVar12 = (uint *)(param_3 + 0x14);
puVar2 = (ushort *)(iVar6 + 0x14);
puVar4 = puVar12 + iVar8;
puVar5 = puVar2 + iVar13 * 2;
iVar6 = ((int)puVar4 + (-0x15 - param_3) & 0xfffffffcU) + 4;
if (puVar4 < (uint *)(param_3 + 0x15)) {
iVar6 = 4;
}
while (puVar2 < puVar5) {
uVar14 = (uint)*puVar2;
if (uVar14 != 0) {
uVar10 = 0;
puVar11 = puVar7;
puVar16 = puVar12;
do {
puVar15 = puVar16 + 1;
uVar10 = uVar14 * (*puVar16 & 0xffff) + (*puVar11 & 0xffff) + uVar10;
uVar3 = uVar14 * (*puVar16 >> 0x10) + (*puVar11 >> 0x10) + (uVar10 >> 0x10);
*puVar11 = uVar10 & 0xffff | uVar3 * 0x10000;
uVar10 = uVar3 >> 0x10;
puVar11 = puVar11 + 1;
puVar16 = puVar15;
} while (puVar15 < puVar4);
*(uint *)((int)puVar7 + iVar6) = uVar10;
}
uVar14 = (uint)puVar2[1];
puVar2 = puVar2 + 2;
if (uVar14 != 0) {
uVar3 = *puVar7;
uVar10 = 0;
puVar11 = puVar12;
puVar16 = puVar7;
do {
uVar10 = uVar14 * (ushort)*puVar11 + (uint)*(ushort *)((int)puVar16 + 2) + uVar10;
*puVar16 = uVar3 & 0xffff | uVar10 * 0x10000;
puVar15 = puVar11 + 1;
uVar3 = uVar14 * (*puVar11 >> 0x10) + (uint)(ushort)puVar16[1] + (uVar10 >> 0x10);
uVar10 = uVar3 >> 0x10;
puVar11 = puVar15;
puVar16 = puVar16 + 1;
} while (puVar15 < puVar4);
*(uint *)((int)puVar7 + iVar6) = uVar3;
}
puVar7 = puVar7 + 1;
}
while ((0 < iVar9 && (puVar17 = puVar17 + -1, *puVar17 == 0))) {
iVar9 = iVar9 + -1;
}
*(int *)(iVar1 + 0x10) = iVar9;
return;
}
undefined4 FUN_08014414(int param_1,undefined4 param_2,uint param_3,undefined4 param_4)
{
undefined4 *puVar1;
undefined4 *puVar2;
int iVar3;
undefined4 uVar4;
int iVar5;
if ((param_3 & 3) != 0) {
param_2 = FUN_080140ec(param_1,param_2,*(undefined4 *)(DAT_080144bc + ((param_3 & 3) - 1) * 4),0
,param_4);
}
iVar3 = (int)param_3 >> 2;
if (iVar3 != 0) {
if (*(int *)(param_1 + 0x1c) == 0) {
puVar1 = (undefined4 *)FUN_08010b28(0x10);
*(undefined4 **)(param_1 + 0x1c) = puVar1;
if (puVar1 == (undefined4 *)0x0) {
puVar1 = (undefined4 *)FUN_08014cec(DAT_080144c4,0x1b3,0,DAT_080144c0);
}
puVar1[1] = 0;
puVar1[2] = 0;
*puVar1 = 0;
puVar1[3] = 0;
}
iVar5 = *(int *)(param_1 + 0x1c);
puVar1 = *(undefined4 **)(iVar5 + 8);
uVar4 = param_2;
if (puVar1 == (undefined4 *)0x0) {
puVar1 = (undefined4 *)FUN_080142a4(param_1,0x271);
*(undefined4 **)(iVar5 + 8) = puVar1;
*puVar1 = 0;
}
while( true ) {
puVar2 = puVar1;
param_2 = uVar4;
if (iVar3 << 0x1f < 0) {
param_2 = FUN_080142d0(param_1,uVar4,puVar2);
FUN_080140a8(param_1,uVar4);
}
iVar3 = iVar3 >> 1;
if (iVar3 == 0) break;
puVar1 = (undefined4 *)*puVar2;
uVar4 = param_2;
if ((undefined4 *)*puVar2 == (undefined4 *)0x0) {
puVar1 = (undefined4 *)FUN_080142d0(param_1,puVar2,puVar2);
*puVar2 = puVar1;
*puVar1 = 0;
}
}
}
return param_2;
}
int FUN_080144c8(undefined4 param_1,int param_2,uint param_3)
{
int iVar1;
int extraout_r1;
uint *puVar2;
undefined4 *puVar3;
uint uVar4;
int iVar5;
uint *puVar6;
uint *puVar7;
int iVar8;
int iVar9;
uint uVar10;
uint *puVar11;
uint *puVar12;
iVar1 = *(int *)(param_2 + 4);
uVar4 = (int)param_3 >> 5;
iVar9 = *(int *)(param_2 + 0x10) + uVar4;
iVar5 = *(int *)(param_2 + 8);
iVar8 = iVar9 + 1;
do {
if (iVar8 <= iVar5) {
iVar1 = FUN_08014028(param_1,iVar1);
if (iVar1 != 0) {
puVar3 = (undefined4 *)(iVar1 + 0x10);
for (iVar5 = 0; iVar5 < (int)uVar4; iVar5 = iVar5 + 1) {
puVar3 = puVar3 + 1;
*puVar3 = 0;
}
puVar6 = (uint *)(param_2 + 0x14);
uVar10 = param_3 & 0x1f;
puVar2 = (uint *)(iVar1 + 0x14 + (uVar4 & ~((int)param_3 >> 0x1f)) * 4);
puVar12 = puVar6 + *(int *)(param_2 + 0x10);
if (uVar10 == 0) {
puVar2 = puVar2 + -1;
do {
puVar11 = puVar6 + 1;
puVar2 = puVar2 + 1;
*puVar2 = *puVar6;
puVar6 = puVar11;
} while (puVar11 < puVar12);
}
else {
uVar4 = 0;
puVar11 = puVar2;
do {
*puVar11 = *puVar6 << uVar10 | uVar4;
puVar7 = puVar6 + 1;
uVar4 = *puVar6 >> (0x20 - uVar10 & 0xff);
puVar6 = puVar7;
puVar11 = puVar11 + 1;
} while (puVar7 < puVar12);
iVar5 = ((int)puVar12 + (-0x15 - param_2) & 0xfffffffcU) + 4;
if (puVar12 < (uint *)(param_2 + 0x15)) {
iVar5 = 4;
}
*(uint *)((int)puVar2 + iVar5) = uVar4;
if (uVar4 != 0) {
iVar8 = iVar9 + 2;
}
}
*(int *)(iVar1 + 0x10) = iVar8 + -1;
FUN_080140a8(param_1,param_2);
return iVar1;
}
iVar5 = DAT_08014598;
FUN_08014cec(DAT_0801459c,0x1de,0);
iVar1 = extraout_r1;
}
iVar1 = iVar1 + 1;
iVar5 = iVar5 << 1;
} while( true );
}
int FUN_080145a0(int param_1,int param_2)
{
int iVar1;
uint *puVar2;
int iVar3;
uint *puVar4;
iVar3 = *(int *)(param_2 + 0x10);
iVar1 = *(int *)(param_1 + 0x10) - iVar3;
if (iVar1 == 0) {
puVar4 = (uint *)(param_1 + 0x14U) + iVar3;
puVar2 = (uint *)(param_2 + 0x14 + iVar3 * 4);
do {
puVar4 = puVar4 + -1;
puVar2 = puVar2 + -1;
if (*puVar4 != *puVar2) {
if (*puVar4 < *puVar2) {
return -1;
}
return 1;
}
} while ((uint *)(param_1 + 0x14U) < puVar4);
}
return iVar1;
}
int FUN_080145d8(undefined4 param_1,int param_2,int param_3,int param_4)
{
int iVar1;
int iVar2;
undefined4 uVar3;
uint *puVar4;
uint uVar5;
int iVar6;
uint *puVar7;
int *piVar8;
uint *puVar9;
int iVar10;
uint *puVar11;
int iVar12;
uint *puVar13;
uint *puVar14;
bool bVar15;
iVar1 = FUN_080145a0(param_2,param_3,param_3,param_4,param_1,param_2,param_3);
bVar15 = iVar1 < 0;
if (iVar1 == 0) {
iVar2 = FUN_08014028(param_1,0);
uVar5 = 0;
iVar1 = iVar2;
if (iVar2 != 0) goto LAB_08014606;
uVar3 = 0x237;
}
else {
iVar1 = param_2;
if (bVar15) {
iVar1 = param_3;
param_4 = param_2;
}
if (!bVar15) {
param_4 = param_3;
}
uVar5 = (uint)bVar15;
iVar2 = FUN_08014028(param_1,*(undefined4 *)(iVar1 + 4));
if (iVar2 != 0) {
iVar12 = *(int *)(iVar1 + 0x10);
iVar10 = *(int *)(param_4 + 0x10);
*(uint *)(iVar2 + 0xc) = uVar5;
puVar4 = (uint *)(iVar1 + 0x10);
puVar13 = (uint *)(iVar1 + 0x14 + iVar12 * 4);
puVar9 = (uint *)(param_4 + 0x14) + iVar10;
iVar10 = 0;
puVar11 = (uint *)(iVar2 + 0x14);
puVar7 = (uint *)(param_4 + 0x14);
do {
puVar14 = puVar7 + 1;
puVar4 = puVar4 + 1;
uVar5 = ((*puVar4 & 0xffff) - (*puVar7 & 0xffff)) + iVar10;
iVar10 = ((*puVar4 >> 0x10) - (*puVar7 >> 0x10)) + ((int)uVar5 >> 0x10);
*puVar11 = uVar5 & 0xffff | iVar10 * 0x10000;
iVar10 = iVar10 >> 0x10;
puVar11 = puVar11 + 1;
puVar7 = puVar14;
} while (puVar14 < puVar9);
iVar6 = ((int)puVar9 + (-0x15 - param_4) & 0xfffffffcU) + 4;
if (puVar9 < (uint *)(param_4 + 0x15)) {
iVar6 = 4;
}
puVar7 = (uint *)(iVar6 + iVar2 + 0x14);
puVar9 = (uint *)(iVar1 + 0x14 + iVar6);
puVar11 = puVar7;
for (puVar4 = puVar9; puVar4 < puVar13; puVar4 = puVar4 + 1) {
uVar5 = *puVar4;
iVar1 = (uVar5 >> 0x10) + ((int)(iVar10 + (uVar5 & 0xffff)) >> 0x10);
*puVar11 = uVar5 + iVar10 & 0xffff | iVar1 * 0x10000;
iVar10 = iVar1 >> 0x10;
puVar11 = puVar11 + 1;
}
uVar5 = (int)puVar13 + (3 - (int)puVar9) & 0xfffffffc;
if (puVar13 < (uint *)((int)puVar9 + -3)) {
uVar5 = 0;
}
piVar8 = (int *)((int)puVar7 + uVar5);
while (piVar8 = piVar8 + -1, *piVar8 == 0) {
iVar12 = iVar12 + -1;
}
*(int *)(iVar2 + 0x10) = iVar12;
return iVar2;
}
uVar3 = 0x245;
iVar1 = 0;
}
iVar2 = FUN_08014cec(DAT_080146fc,uVar3,iVar1,DAT_080146f8);
LAB_08014606:
*(undefined4 *)(iVar2 + 0x10) = 1;
*(uint *)(iVar2 + 0x14) = uVar5;
return iVar1;
}
undefined8 FUN_08014700(void)
{
uint uVar1;
int iVar2;
uint uVar3;
undefined8 in_d0;
undefined4 uStack_4;
uStack_4 = (uint)((ulonglong)in_d0 >> 0x20);
iVar2 = (DAT_08014748 & uStack_4) + 0xfcc00000;
if (iVar2 < 1) {
uVar1 = -iVar2 >> 0x14;
if (0x13fffff < -iVar2) {
uVar3 = uVar1 - 0x14;
iVar2 = uVar1 - 0x32;
if ((int)uVar3 < 0x1f) {
uVar1 = 0x80000000;
}
if (uVar3 == 0x1e || iVar2 < 0 != SBORROW4(uVar3,0x1e)) {
uVar1 = uVar1 >> (uVar3 & 0xff);
}
else {
uVar1 = 1;
}
iVar2 = 0;
goto LAB_0801473c;
}
iVar2 = 0x80000 >> (uVar1 & 0xff);
}
uVar1 = 0;
LAB_0801473c:
return CONCAT44(iVar2,uVar1);
}
undefined8 FUN_0801474c(int param_1)
{
int iVar1;
uint uVar2;
uint uVar3;
uint uVar4;
uint uVar5;
int iVar6;
uint uVar7;
uint uVar8;
undefined8 uVar9;
uVar8 = param_1 + 0x14;
iVar6 = uVar8 + *(int *)(param_1 + 0x10) * 4;
uVar7 = iVar6 - 4;
uVar3 = *(uint *)(iVar6 + -4);
uVar9 = FUN_0801420c(uVar3);
iVar1 = (int)uVar9;
*(int *)((ulonglong)uVar9 >> 0x20) = 0x20 - iVar1;
if (iVar1 < 0xb) {
uVar5 = uVar3 >> (0xbU - iVar1 & 0xff) | DAT_080147dc;
if (uVar8 < uVar7) {
uVar7 = *(uint *)(iVar6 + -8);
}
else {
uVar7 = 0;
}
uVar4 = uVar7 >> (0xbU - iVar1 & 0xff) | uVar3 << (iVar1 + 0x15U & 0xff);
}
else {
if (uVar8 < uVar7) {
uVar4 = *(uint *)(iVar6 + -8);
uVar7 = iVar6 - 8;
}
else {
uVar4 = 0;
}
uVar2 = iVar1 - 0xb;
if (uVar2 == 0) {
uVar5 = uVar3 | DAT_080147dc;
}
else {
if (uVar8 < uVar7) {
uVar7 = *(uint *)(uVar7 - 4);
}
else {
uVar7 = 0;
}
uVar5 = uVar3 << (uVar2 & 0xff) | uVar4 >> (0x20 - uVar2 & 0xff) | 0x3ff00000;
uVar4 = uVar4 << (uVar2 & 0xff) | uVar7 >> (0x20 - uVar2 & 0xff);
}
}
return CONCAT44(uVar5,uVar4);
}
int FUN_080147e0(uint param_1,uint param_2,uint param_3,int *param_4,int *param_5)
{
int iVar1;
uint uVar2;
int iVar3;
int iVar4;
uint uVar5;
uint uVar6;
uint local_28;
int *local_24;
int *piStack_20;
local_28 = param_3;
local_24 = param_4;
piStack_20 = param_5;
iVar1 = FUN_08014028(param_3,1);
if (iVar1 == 0) {
FUN_08014cec(DAT_0801488c,0x30f,0,DAT_08014888);
}
uVar6 = (param_2 << 1) >> 0x15;
local_24 = (int *)(param_2 & 0xfffff);
if (uVar6 != 0) {
local_24 = (int *)((uint)local_24 | 0x100000);
}
if (param_1 == 0) {
iVar4 = FUN_0801424a(&local_24);
*(int **)(iVar1 + 0x14) = local_24;
uVar2 = iVar4 + 0x20;
iVar4 = 1;
}
else {
local_28 = param_1;
uVar2 = FUN_0801424a(&local_28);
if (uVar2 == 0) {
*(uint *)(iVar1 + 0x14) = local_28;
}
else {
uVar5 = (int)local_24 << (0x20 - uVar2 & 0xff);
local_24 = (int *)((uint)local_24 >> (uVar2 & 0xff));
*(uint *)(iVar1 + 0x14) = uVar5 | local_28;
}
*(int **)(iVar1 + 0x18) = local_24;
if (local_24 == (int *)0x0) {
iVar4 = 1;
}
else {
iVar4 = 2;
}
}
*(int *)(iVar1 + 0x10) = iVar4;
if (uVar6 == 0) {
*param_4 = uVar2 - 0x432;
iVar3 = FUN_0801420c(*(undefined4 *)(iVar1 + iVar4 * 4 + 0x10));
iVar3 = iVar4 * 0x20 - iVar3;
}
else {
*param_4 = (uVar6 - 0x433) + uVar2;
iVar3 = 0x35 - uVar2;
}
*param_5 = iVar3;
return iVar1;
}
undefined8 FUN_08014890(int param_1,int param_2)
{
int iVar1;
int iVar2;
int iVar3;
undefined8 uVar4;
undefined8 uVar5;
int local_30;
int aiStack_2c [2];
uVar4 = FUN_0801474c(param_1,&local_30);
iVar2 = (int)((ulonglong)uVar4 >> 0x20);
uVar5 = FUN_0801474c(param_2,aiStack_2c);
iVar3 = (int)((ulonglong)uVar5 >> 0x20);
iVar1 = (local_30 - aiStack_2c[0]) + (*(int *)(param_1 + 0x10) - *(int *)(param_2 + 0x10)) * 0x20;
if (iVar1 < 1) {
iVar3 = iVar3 + iVar1 * -0x100000;
}
else {
iVar2 = iVar2 + iVar1 * 0x100000;
}
uVar4 = FUN_0800086c((int)uVar4,iVar2,(int)uVar5,iVar3);
return uVar4;
}
void FUN_080148f4(int param_1,int param_2,int param_3)
{
undefined4 *puVar1;
uint uVar2;
undefined4 *puVar3;
undefined4 *puVar4;
puVar1 = (undefined4 *)(param_3 + 0x14);
puVar3 = puVar1 + *(int *)(param_3 + 0x10);
puVar4 = (undefined4 *)(param_1 + -4);
for (; puVar1 < puVar3; puVar1 = puVar1 + 1) {
puVar4 = puVar4 + 1;
*puVar4 = *puVar1;
}
uVar2 = (int)puVar3 + (-0x11 - param_3) & 0xfffffffc;
if (puVar3 < (undefined4 *)(param_3 + 0x11U)) {
uVar2 = 0;
}
for (puVar4 = (undefined4 *)(param_1 + uVar2);
puVar4 < (undefined4 *)(param_1 + ((param_2 + -1 >> 5) + 1) * 4); puVar4 = puVar4 + 1) {
*puVar4 = 0;
}
return;
}
undefined4 FUN_0801493a(int param_1,uint param_2)
{
bool bVar1;
int iVar2;
int *piVar3;
int iVar4;
int *piVar5;
piVar3 = (int *)(param_1 + 0x14);
iVar2 = *(int *)(param_1 + 0x10);
iVar4 = (int)param_2 >> 5;
if ((((iVar2 < iVar4) || (bVar1 = iVar2 <= iVar4, iVar2 = iVar4, bVar1)) ||
(param_2 = param_2 & 0x1f, param_2 == 0)) ||
(piVar3[iVar4] == ((uint)piVar3[iVar4] >> param_2) << param_2)) {
piVar5 = piVar3 + iVar2;
do {
if (piVar5 <= piVar3) {
return 0;
}
piVar5 = piVar5 + -1;
} while (*piVar5 == 0);
}
return 1;
}
int FUN_0801497c(undefined4 param_1,int param_2)
{
int iVar1;
iVar1 = *(int *)(param_2 + -4) + -4;
if (*(int *)(param_2 + -4) < 0) {
iVar1 = iVar1 + *(int *)(param_2 + iVar1);
}
return iVar1;
}
void FUN_0801498c(undefined4 param_1,int param_2)
{
int iVar1;
uint uVar2;
bool bVar3;
iVar1 = FUN_08014c60(param_1,(int)*(short *)(param_2 + 0xe));
bVar3 = -1 < iVar1;
if (bVar3) {
uVar2 = *(int *)(param_2 + 0x54) + iVar1;
}
else {
uVar2 = *(ushort *)(param_2 + 0xc) & 0xffffefff;
}
if (bVar3) {
*(uint *)(param_2 + 0x54) = uVar2;
}
if (!bVar3) {
*(short *)(param_2 + 0xc) = (short)uVar2;
}
return;
}
void FUN_080149ae(int *param_1,int param_2,undefined4 param_3,undefined4 param_4)
{
short sVar1;
int *piVar2;
int iVar3;
undefined4 unaff_r4;
undefined4 unaff_r5;
undefined4 in_lr;
if ((int)((uint)*(ushort *)(param_2 + 0xc) << 0x17) < 0) {
FUN_08014c3c(param_1,(int)*(short *)(param_2 + 0xe),0,2);
}
sVar1 = *(short *)(param_2 + 0xe);
*(ushort *)(param_2 + 0xc) = *(ushort *)(param_2 + 0xc) & 0xefff;
piVar2 = DAT_08014ca4;
*DAT_08014ca4 = 0;
iVar3 = FUN_080070a8((int)sVar1,param_3,param_4,param_4,param_4,unaff_r4,unaff_r5,in_lr);
if ((iVar3 == -1) && (*piVar2 != 0)) {
*param_1 = *piVar2;
}
return;
}
void FUN_080149e6(undefined4 param_1,int param_2)
{
int iVar1;
ushort uVar2;
bool bVar3;
iVar1 = FUN_08014c3c(param_1,(int)*(short *)(param_2 + 0xe));
bVar3 = iVar1 == -1;
if (bVar3) {
uVar2 = *(ushort *)(param_2 + 0xc) & 0xefff;
}
else {
*(int *)(param_2 + 0x54) = iVar1;
uVar2 = *(ushort *)(param_2 + 0xc) | 0x1000;
}
if (bVar3) {
*(ushort *)(param_2 + 0xc) = uVar2;
}
if (!bVar3) {
*(ushort *)(param_2 + 0xc) = uVar2;
}
return;
}
uint FUN_08014a12(int param_1,byte param_2,int *param_3,undefined4 param_4)
{
int iVar1;
uint uVar2;
byte *pbVar3;
if ((param_1 != 0) && (*(int *)(param_1 + 0x20) == 0)) {
FUN_0801159c();
}
param_3[2] = param_3[6];
uVar2 = (uint)*(ushort *)(param_3 + 3);
iVar1 = uVar2 << 0x1c;
if (((iVar1 < 0) && (uVar2 = param_3[4], uVar2 != 0)) ||
(iVar1 = FUN_08014a90(param_1,param_3,iVar1,uVar2,param_4), iVar1 == 0)) {
iVar1 = *param_3 - param_3[4];
uVar2 = (uint)param_2;
if ((iVar1 < param_3[5]) || (iVar1 = FUN_08013fd8(param_1,param_3), iVar1 == 0)) {
param_3[2] = param_3[2] + -1;
pbVar3 = (byte *)*param_3;
*param_3 = (int)(pbVar3 + 1);
*pbVar3 = param_2;
if (param_3[5] != iVar1 + 1) {
if (-1 < (int)((uint)*(ushort *)(param_3 + 3) << 0x1f)) {
return uVar2;
}
if (uVar2 != 10) {
return uVar2;
}
}
iVar1 = FUN_08013fd8(param_1,param_3);
if (iVar1 == 0) {
return uVar2;
}
}
}
return 0xffffffff;
}
undefined4 FUN_08014a90(undefined4 *param_1,undefined4 *param_2)
{
undefined4 uVar1;
ushort uVar2;
int iVar3;
uint uVar4;
if ((*DAT_08014b38 != 0) && (*(int *)(*DAT_08014b38 + 0x20) == 0)) {
FUN_0801159c();
}
uVar2 = *(ushort *)(param_2 + 3);
iVar3 = (int)(short)uVar2;
if (-1 < iVar3 << 0x1c) {
if (-1 < iVar3 << 0x1b) {
*param_1 = 9;
goto LAB_08014ab4;
}
if (iVar3 << 0x1d < 0) {
if ((undefined4 *)param_2[0xd] != (undefined4 *)0x0) {
if ((undefined4 *)param_2[0xd] != param_2 + 0x11) {
FUN_08013274(param_1);
}
param_2[0xd] = 0;
}
*(ushort *)(param_2 + 3) = *(ushort *)(param_2 + 3) & 0xffdb;
param_2[1] = 0;
*param_2 = param_2[4];
}
*(ushort *)(param_2 + 3) = *(ushort *)(param_2 + 3) | 8;
}
if ((param_2[4] == 0) && ((*(ushort *)(param_2 + 3) & 0x280) != 0x200)) {
FUN_08014ba2(param_1,param_2);
}
uVar2 = *(ushort *)(param_2 + 3);
uVar4 = (uint)(short)uVar2;
if ((uVar4 & 1) == 0) {
uVar1 = 0;
if (-1 < (int)(uVar4 << 0x1e)) {
uVar1 = param_2[5];
}
param_2[2] = uVar1;
}
else {
param_2[2] = 0;
param_2[6] = -param_2[5];
}
if (param_2[4] != 0) {
return 0;
}
if ((uVar4 & 0x80) == 0) {
return 0;
}
LAB_08014ab4:
*(ushort *)(param_2 + 3) = uVar2 | 0x40;
return 0xffffffff;
}
undefined4 FUN_08014b56(undefined4 param_1,int param_2,undefined4 *param_3,uint *param_4)
{
int iVar1;
uint uVar2;
undefined4 uVar3;
undefined1 auStack_68 [4];
uint local_64;
if ((*(short *)(param_2 + 0xe) < 0) ||
(iVar1 = FUN_08014cc8(param_1,(int)*(short *)(param_2 + 0xe),auStack_68), iVar1 < 0)) {
uVar2 = 0;
if ((*(ushort *)(param_2 + 0xc) & 0x80) == 0) {
uVar3 = 0x400;
}
else {
uVar3 = 0x40;
}
}
else {
uVar2 = (uint)((local_64 & 0xf000) == 0x2000);
uVar3 = 0x400;
}
*param_4 = uVar2;
*param_3 = uVar3;
return 0;
}
void FUN_08014ba2(int param_1,int *param_2,undefined4 param_3)
{
ushort uVar1;
int iVar2;
int iVar3;
int local_20;
int *local_1c;
undefined4 uStack_18;
if (-1 < (int)((uint)*(ushort *)(param_2 + 3) << 0x1e)) {
local_20 = param_1;
local_1c = param_2;
uStack_18 = param_3;
uVar1 = FUN_08014b56(param_1,param_2,&local_20,&local_1c);
iVar3 = local_20;
iVar2 = FUN_08010b7c(param_1,local_20);
if (iVar2 != 0) {
*param_2 = iVar2;
*(ushort *)(param_2 + 3) = *(ushort *)(param_2 + 3) | 0x80;
param_2[4] = iVar2;
param_2[5] = iVar3;
if ((local_1c != (int *)0x0) &&
(iVar3 = FUN_08014c1c(param_1,(int)*(short *)((int)param_2 + 0xe)), iVar3 != 0)) {
*(ushort *)(param_2 + 3) = *(ushort *)(param_2 + 3) & 0xfffc | 1;
}
*(ushort *)(param_2 + 3) = uVar1 | *(ushort *)(param_2 + 3);
return;
}
if ((int)(short)*(ushort *)(param_2 + 3) << 0x16 < 0) {
return;
}
*(ushort *)(param_2 + 3) = *(ushort *)(param_2 + 3) & 0xfffc | 2;
}
*param_2 = (int)param_2 + 0x47;
param_2[4] = (int)param_2 + 0x47;
param_2[5] = 1;
return;
}
void FUN_08014c1c(int *param_1,undefined4 param_2)
{
int *piVar1;
int iVar2;
piVar1 = DAT_08014c38;
*DAT_08014c38 = 0;
iVar2 = FUN_080070d4(param_2);
if ((iVar2 == -1) && (*piVar1 != 0)) {
*param_1 = *piVar1;
}
return;
}
void FUN_08014c3c(int *param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
int *piVar1;
int iVar2;
piVar1 = DAT_08014c5c;
*DAT_08014c5c = 0;
iVar2 = FUN_080070d8(param_2,param_3,param_4,param_4,param_4);
if ((iVar2 == -1) && (*piVar1 != 0)) {
*param_1 = *piVar1;
}
return;
}
void FUN_08014c60(int *param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
int *piVar1;
int iVar2;
piVar1 = DAT_08014c80;
*DAT_08014c80 = 0;
iVar2 = FUN_08007088(param_2,param_3,param_4,param_4,param_4);
if ((iVar2 == -1) && (*piVar1 != 0)) {
*param_1 = *piVar1;
}
return;
}
void FUN_08014cc8(int *param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
int *piVar1;
int iVar2;
piVar1 = DAT_08014ce8;
*DAT_08014ce8 = 0;
iVar2 = FUN_080070ca(param_2,param_3,param_3,0,param_4);
if ((iVar2 == -1) && (*piVar1 != 0)) {
*param_1 = *piVar1;
}
return;
}
void FUN_08014cec(void)
{
undefined4 uVar1;
uVar1 = *(undefined4 *)(*DAT_08014d18 + 0xc);
do {
FUN_08014d50(uVar1,DAT_08014d20);
uVar1 = FUN_08010588();
} while( true );
}
int FUN_08014d28(undefined4 *param_1,uint param_2,uint param_3)
{
int iVar1;
undefined4 uVar2;
uVar2 = (undefined4)((ulonglong)param_2 * (ulonglong)param_3);
if ((int)((ulonglong)param_2 * (ulonglong)param_3 >> 0x20) == 0) {
iVar1 = FUN_08010b7c(param_1,uVar2);
if (iVar1 != 0) {
FUN_08012484(iVar1,0,uVar2);
}
}
else {
*param_1 = 0xc;
iVar1 = 0;
}
return iVar1;
}
void FUN_08014d50(undefined4 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4)
{
undefined4 uStack_8;
undefined4 uStack_4;
uStack_8 = param_3;
uStack_4 = param_4;
FUN_08013c7c(*DAT_08014d70,param_1,param_2,&uStack_8,param_1,&uStack_8);
return;
}
int FUN_08014d74(undefined4 param_1,int param_2)
{
int iVar1;
iVar1 = FUN_08000afc(param_1,param_2,0,0);
if (iVar1 == 0) {
iVar1 = FUN_08014da4(param_1,param_2);
return iVar1;
}
iVar1 = FUN_08014da4(param_1,param_2 + -0x80000000);
return -iVar1;
}
void FUN_08014da4(undefined4 param_1,undefined4 param_2)
{
undefined8 uVar1;
FUN_08000618(param_1,param_2,0,DAT_08014dd8);
FUN_08000bc8();
uVar1 = FUN_08000524();
uVar1 = FUN_08000618((int)uVar1,(int)((ulonglong)uVar1 >> 0x20),0,DAT_08014ddc);
fp_add(param_1,param_2,(int)uVar1,(int)((ulonglong)uVar1 >> 0x20));
FUN_08000bc8();
return;
}
// WARNING: Removing unreachable block (ram,0x0801506a)
undefined8 FUN_08014de0(uint param_1,uint param_2,uint param_3,uint param_4,uint *param_5)
{
ulonglong uVar1;
uint uVar2;
uint uVar3;
int iVar4;
uint uVar5;
uint uVar6;
uint uVar7;
uint uVar8;
uint uVar9;
uint uVar10;
bool bVar11;
if (param_4 == 0) {
iVar4 = LZCOUNT(param_3);
if (param_2 < param_3) {
if (iVar4 != 0) {
param_3 = param_3 << iVar4;
param_2 = param_2 << iVar4 | param_1 >> (0x20U - iVar4 & 0xff);
param_1 = param_1 << iVar4;
}
uVar9 = param_3 >> 0x10;
uVar3 = param_2 / uVar9;
uVar5 = param_1 >> 0x10 | (param_2 - uVar9 * uVar3) * 0x10000;
uVar2 = uVar3 * (param_3 & 0xffff);
uVar7 = uVar3;
if (uVar5 <= uVar2 && uVar2 - uVar5 != 0) {
bVar11 = CARRY4(param_3,uVar5);
uVar5 = param_3 + uVar5;
uVar7 = uVar3 - 1;
if ((!bVar11) && (uVar5 <= uVar2 && uVar2 - uVar5 != 0)) {
uVar7 = uVar3 - 2;
uVar5 = uVar5 + param_3;
}
}
uVar3 = (uVar5 - uVar2) / uVar9;
uVar5 = param_1 & 0xffff | ((uVar5 - uVar2) - uVar9 * uVar3) * 0x10000;
uVar9 = uVar3 * (param_3 & 0xffff);
uVar2 = uVar3;
if (uVar5 <= uVar9 && uVar9 - uVar5 != 0) {
bVar11 = CARRY4(param_3,uVar5);
uVar5 = param_3 + uVar5;
uVar2 = uVar3 - 1;
if ((!bVar11) && (uVar5 <= uVar9 && uVar9 - uVar5 != 0)) {
uVar5 = uVar5 + param_3;
uVar2 = uVar3 - 2;
}
}
uVar2 = uVar2 | uVar7 << 0x10;
uVar5 = uVar5 - uVar9;
uVar7 = 0;
}
else {
if (iVar4 == 0) {
param_2 = param_2 - param_3;
uVar8 = param_3 >> 0x10;
uVar10 = param_3 & 0xffff;
uVar7 = 1;
}
else {
param_3 = param_3 << iVar4;
uVar2 = param_2 >> (0x20U - iVar4 & 0xff);
uVar5 = param_1 >> (0x20U - iVar4 & 0xff) | param_2 << iVar4;
uVar8 = param_3 >> 0x10;
uVar10 = param_3 & 0xffff;
uVar7 = uVar2 / uVar8;
uVar3 = uVar5 >> 0x10 | (uVar2 - uVar8 * uVar7) * 0x10000;
uVar9 = uVar7 * uVar10;
param_1 = param_1 << iVar4;
uVar2 = uVar7;
if (uVar3 <= uVar9 && uVar9 - uVar3 != 0) {
bVar11 = CARRY4(param_3,uVar3);
uVar3 = param_3 + uVar3;
uVar2 = uVar7 - 1;
if ((!bVar11) && (uVar3 <= uVar9 && uVar9 - uVar3 != 0)) {
uVar2 = uVar7 - 2;
uVar3 = uVar3 + param_3;
}
}
uVar6 = (uVar3 - uVar9) / uVar8;
param_2 = uVar5 & 0xffff | ((uVar3 - uVar9) - uVar8 * uVar6) * 0x10000;
uVar3 = uVar6 * uVar10;
uVar7 = uVar6;
if (param_2 <= uVar3 && uVar3 - param_2 != 0) {
bVar11 = CARRY4(param_3,param_2);
param_2 = param_3 + param_2;
uVar7 = uVar6 - 1;
if ((!bVar11) && (param_2 <= uVar3 && uVar3 - param_2 != 0)) {
uVar7 = uVar6 - 2;
param_2 = param_2 + param_3;
}
}
param_2 = param_2 - uVar3;
uVar7 = uVar7 | uVar2 << 0x10;
}
uVar9 = param_2 / uVar8;
uVar5 = param_1 >> 0x10 | (param_2 - uVar8 * uVar9) * 0x10000;
uVar2 = uVar10 * uVar9;
uVar3 = uVar9;
if (uVar5 <= uVar2 && uVar2 - uVar5 != 0) {
bVar11 = CARRY4(param_3,uVar5);
uVar5 = param_3 + uVar5;
uVar3 = uVar9 - 1;
if ((!bVar11) && (uVar5 <= uVar2 && uVar2 - uVar5 != 0)) {
uVar3 = uVar9 - 2;
uVar5 = uVar5 + param_3;
}
}
uVar9 = (uVar5 - uVar2) / uVar8;
uVar5 = param_1 & 0xffff | ((uVar5 - uVar2) - uVar8 * uVar9) * 0x10000;
uVar10 = uVar10 * uVar9;
uVar2 = uVar9;
if (uVar5 <= uVar10 && uVar10 - uVar5 != 0) {
bVar11 = CARRY4(param_3,uVar5);
uVar5 = param_3 + uVar5;
uVar2 = uVar9 - 1;
if ((!bVar11) && (uVar5 <= uVar10 && uVar10 - uVar5 != 0)) {
uVar5 = uVar5 + param_3;
uVar2 = uVar9 - 2;
}
}
uVar5 = uVar5 - uVar10;
uVar2 = uVar2 | uVar3 << 0x10;
}
if (param_5 != (uint *)0x0) {
*param_5 = uVar5 >> iVar4;
param_5[1] = 0;
}
}
else if (param_2 < param_4) {
if (param_5 != (uint *)0x0) {
*param_5 = param_1;
param_5[1] = param_2;
}
uVar2 = 0;
uVar7 = uVar2;
}
else {
iVar4 = LZCOUNT(param_4);
if (iVar4 == 0) {
if ((param_4 < param_2) || (param_3 <= param_1)) {
bVar11 = param_1 < param_3;
param_1 = param_1 - param_3;
param_2 = (param_2 - param_4) - (uint)bVar11;
uVar2 = 1;
}
else {
uVar2 = 0;
}
uVar7 = 0;
if (param_5 != (uint *)0x0) {
*param_5 = param_1;
param_5[1] = param_2;
}
}
else {
uVar9 = 0x20 - iVar4;
uVar10 = param_3 >> (uVar9 & 0xff) | param_4 << iVar4;
uVar7 = param_2 >> (uVar9 & 0xff);
uVar5 = param_1 >> (uVar9 & 0xff) | param_2 << iVar4;
param_1 = param_1 << iVar4;
uVar2 = uVar10 >> 0x10;
uVar6 = uVar7 / uVar2;
uVar3 = uVar5 >> 0x10 | (uVar7 - uVar2 * uVar6) * 0x10000;
uVar8 = uVar6 * (uVar10 & 0xffff);
uVar7 = uVar6;
if (uVar3 <= uVar8 && uVar8 - uVar3 != 0) {
bVar11 = CARRY4(uVar10,uVar3);
uVar3 = uVar10 + uVar3;
uVar7 = uVar6 - 1;
if ((!bVar11) && (uVar3 <= uVar8 && uVar8 - uVar3 != 0)) {
uVar7 = uVar6 - 2;
uVar3 = uVar3 + uVar10;
}
}
uVar6 = (uVar3 - uVar8) / uVar2;
uVar3 = uVar5 & 0xffff | ((uVar3 - uVar8) - uVar2 * uVar6) * 0x10000;
uVar5 = uVar6 * (uVar10 & 0xffff);
uVar2 = uVar6;
if (uVar3 <= uVar5 && uVar5 - uVar3 != 0) {
bVar11 = CARRY4(uVar10,uVar3);
uVar3 = uVar10 + uVar3;
uVar2 = uVar6 - 1;
if ((!bVar11) && (uVar3 <= uVar5 && uVar5 - uVar3 != 0)) {
uVar2 = uVar6 - 2;
uVar3 = uVar3 + uVar10;
}
}
uVar2 = uVar2 | uVar7 << 0x10;
uVar1 = (ulonglong)uVar2 * (ulonglong)(param_3 << iVar4);
if (CONCAT44(uVar3 - uVar5,param_1) < uVar1) {
uVar2 = uVar2 - 1;
uVar1 = uVar1 - CONCAT44(uVar10,param_3 << iVar4);
}
if (param_5 != (uint *)0x0) {
uVar7 = ((uVar3 - uVar5) - (int)(uVar1 >> 0x20)) - (uint)(param_1 < (uint)uVar1);
*param_5 = uVar7 << (uVar9 & 0xff) | param_1 - (uint)uVar1 >> iVar4;
param_5[1] = uVar7 >> iVar4;
}
uVar7 = 0;
}
}
return CONCAT44(uVar7,uVar2);
}
void FUN_0801509c(void)
{
return;
}
void FUN_080150a8(void)
{
return;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment