smw/smbll/smbll_02.c

3510 lines
94 KiB
C

#include "smbll_consts.h"
#include "smbll_funcs.h"
#include "smbll_rtl.h"
#include "smbll_variables.h"
void (*funcs_1BA38[4])() = {&Smbll_MaybePauseMenu_State0, &Smbll_MaybePauseMenu_State1, &Smbll_MaybePauseMenu_State2,
&Smbll_MaybePauseMenu_State3}; // weak
uint8 byte_17FD9[72] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 12u, 28u, 28u, 0u, 0u, 0u, 12u, 28u, 44u, 28u, 28u,
28u, 45u, 44u, 28u, 28u, 28u, 44u, 45u, 44u, 45u, 61u, 28u, 28u, 28u, 45u, 28u, 44u, 45u,
64u, 28u, 28u, 28u, 28u, 28u, 28u, 28u, 61u, 28u, 44u, 28u, 28u, 28u, 45u, 45u, 76u, 28u,
28u, 86u, 86u, 28u, 86u, 28u, 86u, 28u, 89u, 89u, 89u, 93u, 89u, 89u, 89u, 89u, 89u, 28u}; // weak
void Smbll_SetupLayer2Bg() {
uint16 i; // si
uint16 v1; // ax
int16 v2; // ax
Smbll_sub_18F08();
enable_layer3_bgflag = 0;
smbll_varF35 = area_data_addr_index;
if (area_data_addr_index == 35 && HIBYTE(screen_left_xpos16) == 12)
area_data_addr_index = 71;
for (i = 0; i != 256; i += 2) {
*(uint16 *)&layer2_bgdata[i] = 0;
*(uint16 *)&layer2_bgdata[i + 256] = 0;
*(uint16 *)&layer2_bgdata[i + 512] = 0;
*(uint16 *)&layer2_bgdata[i + 768] = 0;
*(uint16 *)&layer2_bgdata[i + 1024] = 0;
*(uint16 *)&layer2_bgdata[i + 1280] = 0;
*(uint16 *)&layer2_bgdata[i + 1536] = 0;
*(uint16 *)&layer2_bgdata[i + 1792] = 0;
*(uint16 *)&layer2_bgdata[i + 2048] = 0;
*(uint16 *)&layer2_bgdata[i + 2304] = 0;
*(uint16 *)&layer2_bgdata[i + 2560] = 0;
*(uint16 *)&layer2_bgdata[i + 2816] = 0;
*(uint16 *)&layer2_bgdata[i + 3072] = 0;
*(uint16 *)&layer2_bgdata[i + 3328] = 0;
*(uint16 *)&layer2_bgdata[i + 3584] = 0;
*(uint16 *)&layer2_bgdata[i + 3840] = 0;
*(uint16 *)&layer2_bgdata[i + 4096] = 0;
*(uint16 *)&layer2_bgdata[i + 4352] = 0;
*(uint16 *)&layer2_bgdata[i + 4608] = 0;
}
layer2_bg_0EC0 = 0;
if (override_area_data_addr_index)
*(uint16 *)&area_data_addr_index = override_area_data_addr_index;
*(uint16 *)&R2_ = kword_2AE02[(uint16)(2 * area_data_addr_index) >> 1];
while (1) {
while (1) {
*(uint16 *)&R4_ = *(uint16 *)&kbyte_2B6A1[*(uint16 *)&R2_];
++*(uint16 *)&R2_;
++*(uint16 *)&R2_;
*(uint16 *)&tempEF = (uint16)(*(uint16 *)&R4_ & 0x3F0) >> 4;
*(uint16 *)&tempF1 = R4_ & 0xF;
*(uint16 *)&tempED = (uint8)((uint16)(*(uint16 *)&R4_ & 0xE000 | (*(uint16 *)&R4_ >> 1) & 0xE00) >> 8);
if ((tempED & 0xF0) == 224)
break;
LOBYTE(v2) = HIBYTE(layer2_bg_0EC0);
HIBYTE(v2) = layer2_bg_0EC0;
*(uint16 *)&tempEB = *(uint16 *)&tempED + v2;
if (*(uint16 *)&tempEF < 0x10u) {
if (Smbll_SetupLayer2Bg_Callfunc(2 * *(uint16 *)&tempEF, 2 * *(uint16 *)&area_data_addr_index))
return;
} else {
Smbll_SetupLayer2BgB();
}
}
if (*(uint16 *)&tempEF == 63)
break;
Smbll_SetupLayer2BgA();
}
++layer2_bg_0EC0;
++layer2_bg_0EC0;
LOBYTE(v1) = HIBYTE(layer2_bg_0EC0);
HIBYTE(v1) = layer2_bg_0EC0;
*(uint16 *)&layer2_bgdata[v1] = -1;
Smbll_GenerateLayer2Map16();
}
uint16 Smbll_SetupLayer2Bg_Callfunc(uint16 k, uint16 j) {
uint16 v2; // di
uint16 v3; // si
uint16 v5; // di
uint16 v6; // si
uint16 v7; // ax
uint16 v8; // di
uint16 v9; // si
uint16 v10; // si
uint16 v11; // si
uint16 v12; // ax
int16 v13; // si
uint16 v14; // si
int v15; // edx
uint16 v16; // di
uint16 v17; // di
int16 v18; // si
uint16 v19; // si
uint8 v20; // al
uint16 v21; // si
uint8 v22; // al
uint8 v23; // al
uint8 v24; // al
uint8 v25; // al
uint8 v26; // al
uint16 v27; // si
uint8 v28; // al
uint8 v29; // al
uint16 v30; // si
uint8 v31; // al
uint16 v32; // si
uint16 v33; // di
uint8 v34; // al
uint16 v35; // si
uint16 v36; // di
uint8 v37; // al
uint16 v38; // si
uint16 v39; // di
uint8 v40; // al
uint16 v41; // di
uint16 v42; // si
uint16 v43; // si
uint16 v44; // si
uint16 v45; // di
uint16 v46; // si
uint8 v47; // al
uint16 v48; // si
uint16 m; // di
uint16 v50; // si
uint16 v51; // si
uint8 v52; // al
uint16 v53; // si
uint8 v54; // al
uint16 v55; // si
int v56; // edx
uint16 v57; // si
uint16 v58; // di
uint16 v59; // di
uint16 v60; // si
uint16 v61; // si
uint16 v62; // di
uint16 v63; // si
uint16 v64; // si
uint16 v65; // si
uint16 v66; // si
uint16 i; // di
uint16 v68; // si
uint16 n; // si
switch (byte_17FD9[j >> 1] + (k >> 1)) {
case 0:
case 1: goto LABEL_174;
case 2: v63 = *(uint16 *)&tempEB; break;
case 3:
v64 = *(uint16 *)&tempEB;
do {
if (layer2_bgdata[v64 + 32] == 31) {
layer2_bgdata[v64 + 16] = kbyte_28CF3[3];
layer2_bgdata[v64 + 17] = kbyte_28CF3[4];
layer2_bgdata[v64 + 32] = kbyte_28CF3[5];
layer2_bgdata[v64 + 33] = kbyte_28CF3[6];
layer2_bgdata[v64 + 48] = kbyte_28CF3[7];
layer2_bgdata[v64 + 49] = kbyte_28CF3[8];
layer2_bgdata[v64 + 64] = kbyte_28CF3[9];
layer2_bgdata[v64++ + 65] = kbyte_28CF3[10];
--tempF1;
} else {
layer2_bgdata[v64 + 32] = kbyte_28CF3[0];
layer2_bgdata[v64 + 48] = kbyte_28CF3[1];
layer2_bgdata[v64 + 64] = kbyte_28CF3[2];
}
++v64;
--tempF1;
} while ((tempF1 & 0x80u) == 0);
return 0;
case 4:
v65 = *(uint16 *)&tempEB;
if (layer2_bgdata[*(uint16 *)&tempEB + 32] == 12) {
layer2_bgdata[*(uint16 *)&tempEB + 16] = kbyte_28D68[0];
layer2_bgdata[v65 + 17] = kbyte_28D68[1];
layer2_bgdata[v65 + 32] = kbyte_28D68[2];
layer2_bgdata[v65 + 33] = kbyte_28D68[3];
layer2_bgdata[v65 + 48] = kbyte_28D68[4];
layer2_bgdata[v65 + 49] = kbyte_28D68[5];
layer2_bgdata[v65 + 64] = kbyte_28D68[6];
layer2_bgdata[v65 + 65] = kbyte_28D68[7];
} else {
layer2_bgdata[*(uint16 *)&tempEB + 16] = kbyte_28D68[8];
layer2_bgdata[v65 + 17] = kbyte_28D68[9];
layer2_bgdata[v65 + 32] = kbyte_28D68[10];
layer2_bgdata[v65 + 33] = kbyte_28D68[11];
layer2_bgdata[v65 + 48] = kbyte_28D68[12];
layer2_bgdata[v65 + 49] = kbyte_28D68[13];
layer2_bgdata[v65 + 64] = kbyte_28D68[14];
layer2_bgdata[v65 + 65] = kbyte_28D68[15];
}
--*(uint16 *)&tempF1;
--*(uint16 *)&tempF1;
--*(uint16 *)&tempF1;
*(uint16 *)&tempEB += 48;
*(uint16 *)&tempEF = 1;
LABEL_174:
v61 = *(uint16 *)&tempEB;
v62 = *(uint16 *)&tempEF;
do {
layer2_bgdata[v61 + 32] = kbyte_28BE5[v62];
layer2_bgdata[v61 + 33] = kbyte_28BE5[v62 + 2];
v61 += 16;
--tempF1;
} while ((tempF1 & 0x80u) == 0);
return 0;
case 5:
v66 = *(uint16 *)&tempEB;
for (i = 0; i != 20; i += 4) {
layer2_bgdata[v66 + 32] = kbyte_28E0E[i];
layer2_bgdata[v66 + 33] = kbyte_28E0E[i + 1];
layer2_bgdata[v66 + 34] = kbyte_28E0E[i + 2];
layer2_bgdata[v66 + 35] = kbyte_28E0E[i + 3];
v66 += 16;
}
return 0;
case 6:
v59 = 0;
v60 = *(uint16 *)&tempEB;
do {
layer2_bgdata[v60 + 32] = kbyte_28BB2[v59];
layer2_bgdata[v60 + 33] = kbyte_28BB2[v59 + 1];
v60 += 16;
v59 += 2;
} while (v59 != 8);
return 0;
case 7:
v55 = *(uint16 *)&tempEB;
*(uint16 *)&tempF1 = 6;
v56 = *(uint16 *)&tempEB;
layer2_bgdata[*(uint16 *)&tempEB + 32] = kbyte_28AF7[0];
layer2_bgdata[v56 + 33] = kbyte_28AF7[1];
do {
layer2_bgdata[v55 + 48] = kbyte_28AF7[2];
layer2_bgdata[v55 + 49] = kbyte_28AF7[3];
v55 += 16;
--tempF1;
} while (tempF1);
layer2_bgdata[v55 + 48] = kbyte_28AF7[4];
layer2_bgdata[v55 + 49] = kbyte_28AF7[5];
layer2_bgdata[v55 + 64] = kbyte_28AF7[6];
layer2_bgdata[v55 + 65] = kbyte_28AF7[7];
layer2_bgdata[v55 + 66] = kbyte_28AF7[8];
return 0;
case 8:
v57 = *(uint16 *)&tempEB + 1;
tempE5 = 0;
v58 = 0;
do {
layer2_bgdata[v57] = kbyte_28B5D[v58];
layer2_bgdata[v57 + 1] = kbyte_28B5D[v58 + 1];
layer2_bgdata[v57 + 2] = kbyte_28B5D[v58 + 2];
layer2_bgdata[v57 + 3] = kbyte_28B5D[v58 + 3];
v58 += 4;
v57 += 16;
++tempE5;
} while (tempE5 != 4);
return 0;
case 9: goto LABEL_201;
case 0xA:
++*(uint16 *)&tempEB;
LABEL_201:
v68 = *(uint16 *)&tempEB + 16;
layer2_bgdata[(uint16)(*(uint16 *)&tempEB + 16)] = 103;
layer2_bgdata[v68 + 1] = 105;
layer2_bgdata[v68 + 16] = 104;
layer2_bgdata[v68 + 17] = 106;
return 0;
case 0xB: *(uint16 *)&layer2_bgdata[*(uint16 *)&tempEB] = 6938; return 0;
case 0xC:
case 0xE:
case 0x10:
case 0x12:
case 0x14:
case 0x16:
case 0x18:
case 0x1A: goto LABEL_84;
case 0xD:
case 0xF:
case 0x11:
case 0x13:
case 0x15:
case 0x17:
case 0x19:
case 0x1B:
++*(uint16 *)&tempEB;
LABEL_84:
v32 = *(uint16 *)&tempEB;
*(uint16 *)&tempE2 = *(uint16 *)&tempEB;
v33 = kword_287FF[(uint16)(2 * *(uint16 *)&tempEF) >> 1];
while (2) {
v34 = kbyte_2B46D[v33];
if (!v34)
goto LABEL_89;
if (v34 != 0xFF) {
if (v34 == 0xFE) {
*(uint16 *)&tempE2 += 16;
v32 = *(uint16 *)&tempE2;
++v33;
continue;
}
layer2_bgdata[v32] = kbyte_2B46D[v33];
LABEL_89:
++v33;
if ((++v32 & 0xF) == 0)
v32 += 240;
continue;
}
return 0;
}
case 0x1C:
v48 = *(uint16 *)&tempEB;
for (m = 0; m != 36; m += 6) {
layer2_bgdata[v48 + 32] = kbyte_289E6[m];
Smbll_sub_28A66();
layer2_bgdata[v48 + 32] = kbyte_289E6[m + 1];
Smbll_sub_28A66();
layer2_bgdata[v48 + 32] = kbyte_289E6[m + 2];
Smbll_sub_28A66();
layer2_bgdata[v48 + 32] = kbyte_289E6[m + 3];
Smbll_sub_28A66();
layer2_bgdata[v48 + 32] = kbyte_289E6[m + 4];
Smbll_sub_28A66();
layer2_bgdata[v48 + 32] = kbyte_289E6[m + 5];
v48 += 16;
}
return 0;
case 0x1D:
case 0x1E:
case 0x1F:
--*(uint16 *)&tempEF;
v41 = 4 * (*(uint16 *)&tempF1 | (16 * (tempEF & 3)));
v42 = *(uint16 *)&tempEB;
layer2_bgdata[*(uint16 *)&tempEB] = kbyte_292E2[v41];
layer2_bgdata[v42 + 1] = kbyte_292E2[v41 + 1];
layer2_bgdata[v42 + 16] = kbyte_292E2[v41 + 2];
layer2_bgdata[v42 + 17] = kbyte_292E2[v41 + 3];
return 0;
case 0x20: goto LABEL_134;
case 0x21:
++*(uint16 *)&tempEB;
LABEL_134:
v46 = *(uint16 *)&tempEB;
goto LABEL_135;
case 0x22: goto LABEL_132;
case 0x23:
++*(uint16 *)&tempEB;
LABEL_132:
v46 = *(uint16 *)&tempEB + 16;
LABEL_135:
v45 = 0;
goto LABEL_136;
case 0x24:
v45 = kword_28833[15];
v46 = *(uint16 *)&tempEB + 2;
goto LABEL_136;
case 0x25:
v45 = kword_28833[16];
v46 = *(uint16 *)&tempEB + 18;
goto LABEL_136;
case 0x26:
v45 = kword_28833[17];
v46 = *(uint16 *)&tempEB + 1;
goto LABEL_136;
case 0x27:
v45 = kword_28833[18];
v46 = *(uint16 *)&tempEB + 17;
goto LABEL_136;
case 0x28:
v45 = kword_28833[19];
v46 = *(uint16 *)&tempEB + 32;
goto LABEL_136;
case 0x29:
v45 = kword_28833[20];
v46 = *(uint16 *)&tempEB + 1;
goto LABEL_136;
case 0x2A:
v45 = kword_28833[21];
v46 = *(uint16 *)&tempEB + 18;
LABEL_136:
*(uint16 *)&tempE2 = v46;
while (1) {
v47 = kbyte_2B2EF[v45];
if (v47 == 0xFF)
return 0;
if (v47 != 0xFE) {
layer2_bgdata[v46] = Smbll_SetupLayer2Bg_Helper1(v46, v47);
++v45;
if ((++v46 & 0xF) == 0)
v46 += 240;
continue;
}
++v45;
if (((*(uint16 *)&tempE2 + 16) & 0xF0) == 0)
return 0;
v46 = *(uint16 *)&tempE2 + 15;
if (((tempE2 + 15) & 0xF) == 15)
v46 = *(uint16 *)&tempE2 - 225;
*(uint16 *)&tempE2 = v46;
}
case 0x2B:
v21 = *(uint16 *)&tempEB + 16;
layer2_bgdata[(uint16)(*(uint16 *)&tempEB + 16) + 48] = 78;
if (layer2_bgdata[v21])
v22 = 56;
else
v22 = 52;
layer2_bgdata[v21] = v22;
v23 = layer2_bgdata[v21 + 16];
if (!v23 || v23 == 18)
v24 = 64;
else
v24 = 68;
layer2_bgdata[v21 + 16] = v24;
v25 = layer2_bgdata[v21 + 32];
if (!v25 || v25 == 18)
v26 = 76;
else
v26 = 77;
layer2_bgdata[v21 + 32] = v26;
v27 = v21 + 1;
v28 = layer2_bgdata[v27];
switch (v28) {
case 0u:
case 0x12u: v29 = 53; break;
case 0x18u:
case 7u: v29 = 54; break;
case 0x17u: v29 = 61; break;
default: v29 = 57; break;
}
layer2_bgdata[v27] = v29;
layer2_bgdata[v27 + 16] = 65;
layer2_bgdata[v27 + 32] = 72;
layer2_bgdata[v27 + 48] = 78;
v30 = v27 + 1;
while (--tempF1) {
v31 = layer2_bgdata[v30];
if (v31) {
if (v31 == 24) {
layer2_bgdata[v30] = 54;
layer2_bgdata[v30 + 1] = 53;
} else {
layer2_bgdata[v30] = 58;
layer2_bgdata[v30 + 1] = 57;
}
layer2_bgdata[v30 + 16] = 66;
layer2_bgdata[v30 + 17] = 65;
} else {
layer2_bgdata[v30] = 54;
layer2_bgdata[v30 + 1] = 53;
layer2_bgdata[v30 + 16] = 66;
layer2_bgdata[v30 + 17] = 65;
}
layer2_bgdata[v30 + 32] = 71;
layer2_bgdata[v30 + 33] = 72;
layer2_bgdata[v30 + 48] = 78;
layer2_bgdata[v30 + 49] = 78;
v30 += 2;
if ((v30 & 0xF) == 0)
v30 += 240;
}
layer2_bgdata[v30 + 16] = 66;
layer2_bgdata[v30 + 32] = 71;
layer2_bgdata[v30 + 48] = 78;
layer2_bgdata[v30 + 49] = 78;
if (layer2_bgdata[v30]) {
layer2_bgdata[v30] = 58;
layer2_bgdata[v30 + 1] = 59;
layer2_bgdata[v30 + 17] = 69;
layer2_bgdata[v30 + 33] = 74;
} else {
layer2_bgdata[v30] = 54;
layer2_bgdata[v30 + 1] = 55;
layer2_bgdata[v30 + 17] = 67;
layer2_bgdata[v30 + 33] = 73;
}
return 0;
case 0x2C:
v10 = *(uint16 *)&tempEB;
*(uint16 *)&tempE6 = *(uint16 *)&tempF1;
tempE8 = 0;
do {
layer2_bgdata[v10] = 9;
layer2_bgdata[v10 + 16] = 14;
layer2_bgdata[v10 + 48] = 14;
layer2_bgdata[v10 + 80] = 14;
layer2_bgdata[v10 + 32] = 18;
layer2_bgdata[v10 + 64] = 18;
v11 = v10 + 1;
v12 = v11 & 0xF;
if ((v11 & 0xF) == 0) {
v12 = v11 + 240;
v11 += 240;
++*(uint16 *)&tempE8;
}
if ((--tempE6 & 0x80u) != 0)
break;
layer2_bgdata[v11] = 9;
layer2_bgdata[v11 + 16] = 15;
layer2_bgdata[v11 + 48] = 15;
layer2_bgdata[v11 + 80] = 15;
layer2_bgdata[v11 + 32] = 19;
layer2_bgdata[v11 + 64] = 19;
v10 = v11 + 1;
v12 = v10 & 0xF;
if ((v10 & 0xF) == 0) {
v12 = v10 + 240;
v10 += 240;
++*(uint16 *)&tempE8;
}
--tempE6;
} while ((tempE6 & 0x80u) == 0);
v13 = *(uint16 *)&tempEB;
LOBYTE(v12) = tempF1;
if (tempF1 >= 4u)
LOBYTE(v12) = 4;
*((uint8 *)&layer2_map16_table[22527] + *(uint16 *)&tempEB + 1) = kbyte_28425[v12];
if (*(uint16 *)&tempE8)
v13 += 240;
layer2_bgdata[(uint16)(*(uint16 *)&tempF1 + v13) + 1] = kbyte_2842A[v12];
return 0;
case 0x2D:
case 0x2E:
case 0x2F:
case 0x30:
case 0x31:
case 0x32:
case 0x33:
case 0x34:
case 0x35:
case 0x36:
case 0x37:
case 0x38:
case 0x39:
case 0x3A:
case 0x3B:
case 0x3C:
v38 = *(uint16 *)&tempEB;
*(uint16 *)&tempE2 = *(uint16 *)&tempEB;
v39 = kword_28833[(uint16)(2 * *(uint16 *)&tempEF) >> 1];
while (2) {
v40 = kbyte_2AE92[v39];
if (!v40)
goto LABEL_113;
if (v40 != 0xFF) {
if (v40 != 0xFE) {
layer2_bgdata[v38] = v40;
LABEL_113:
++v39;
if ((++v38 & 0xF) == 0)
v38 += 240;
continue;
}
*(uint16 *)&tempE2 += 16;
v38 = *(uint16 *)&tempE2;
if ((tempE2 & 0xF0) != 240) {
++v39;
continue;
}
}
return 0;
}
case 0x3D: v5 = 14; goto LABEL_5;
case 0x3E:
v5 = 0;
LABEL_5:
v6 = *(uint16 *)&tempEB + 1;
layer2_bgdata[(uint16)(*(uint16 *)&tempEB + 1)] = kbyte_28298[v5];
layer2_bgdata[v6 + 1] = kbyte_28298[v5 + 1];
layer2_bgdata[v6 + 16] = kbyte_28298[v5 + 2];
layer2_bgdata[v6 + 17] = kbyte_28298[v5 + 3];
layer2_bgdata[v6 + 32] = kbyte_28298[v5 + 6];
layer2_bgdata[v6 + 33] = kbyte_28298[v5 + 7];
tempE4 = 48;
for (tempE5 = 0;; tempE5 = 0) {
v7 = *(uint16 *)&tempE4 + v6;
v6 = v7;
if ((uint8)v7 >= 0xD0u)
break;
layer2_bgdata[v7] = kbyte_28298[v5 + 4];
layer2_bgdata[v7 + 1] = kbyte_28298[v5 + 5];
layer2_bgdata[v7 + 16] = kbyte_28298[v5 + 6];
layer2_bgdata[v7 + 17] = kbyte_28298[v5 + 7];
tempE4 = 32;
}
layer2_bgdata[v7] = kbyte_28298[v5 + 8];
layer2_bgdata[v7 + 1] = kbyte_28298[v5 + 9];
layer2_bgdata[v7 + 16] = kbyte_28298[v5 + 10];
layer2_bgdata[v7 + 17] = kbyte_28298[v5 + 11];
layer2_bgdata[v7 + 32] = kbyte_28298[v5 + 12];
layer2_bgdata[v7 + 33] = kbyte_28298[v5 + 13];
return 0;
case 0x3F:
v2 = *(uint16 *)&tempF1;
v3 = *(uint16 *)&tempEB;
layer2_bgdata[*(uint16 *)&tempEB] = kbyte_28256[*(uint16 *)&tempF1];
layer2_bgdata[v3 + 16] = kbyte_28256[v2 + 1];
layer2_bgdata[v3 + 32] = kbyte_28256[v2 + 2];
layer2_bgdata[v3 + 48] = kbyte_28256[v2 + 3];
layer2_bgdata[v3 + 64] = kbyte_28256[v2 + 4];
return 0;
case 0x40: goto LABEL_40;
case 0x41: ++*(uint16 *)&tempEB; goto LABEL_40;
case 0x42: goto LABEL_38;
case 0x43:
++*(uint16 *)&tempEB;
LABEL_38:
*(uint16 *)&tempEB += 16;
LABEL_40:
v17 = 0;
goto LABEL_41;
case 0x44: goto LABEL_36;
case 0x45: ++*(uint16 *)&tempEB; goto LABEL_36;
case 0x46: goto LABEL_34;
case 0x47:
++*(uint16 *)&tempEB;
LABEL_34:
*(uint16 *)&tempEB += 16;
LABEL_36:
v17 = 1;
LABEL_41:
v18 = *(uint16 *)&tempEB;
layer2_bgdata[*(uint16 *)&tempEB] = kbyte_28495[v17];
v19 = v18 + 16;
--tempF1;
do {
if (layer2_bgdata[v19] == 14) {
v20 = 13;
} else if (layer2_bgdata[v19] == 2) {
v20 = 11;
} else {
v20 = kbyte_28497[v17];
}
layer2_bgdata[v19] = v20;
v19 += 16;
--tempF1;
} while ((tempF1 & 0x80u) == 0);
return 0;
case 0x48: goto LABEL_28;
case 0x49: ++*(uint16 *)&tempEB; goto LABEL_28;
case 0x4A: goto LABEL_26;
case 0x4B:
++*(uint16 *)&tempEB;
LABEL_26:
*(uint16 *)&tempEB += 16;
LABEL_28:
v14 = *(uint16 *)&tempEB;
v15 = *(uint16 *)&tempF1;
*(uint16 *)&tempF1 = kbyte_2842A[*(uint16 *)&tempF1 + 28];
v16 = kbyte_2842A[v15 + 33];
do {
layer2_bgdata[v14++] = kbyte_2842A[v16++ + 5];
if ((v14 & 0xF) == 0)
v14 += 240;
--tempF1;
} while ((tempF1 & 0x80u) == 0);
return 0;
case 0x4C:
for (n = 128; n < 0x1000u; n += 240) {
do {
*(uint16 *)&layer2_bgdata[n] = 1027;
*(uint16 *)&layer2_bgdata[n + 16] = 2313;
*(uint16 *)&layer2_bgdata[n + 32] = 2313;
*(uint16 *)&layer2_bgdata[n + 48] = 2313;
*(uint16 *)&layer2_bgdata[n + 64] = 2313;
*(uint16 *)&layer2_bgdata[n + 80] = 2313;
*(uint16 *)&layer2_bgdata[n + 96] = 2313;
n += 2;
} while ((n & 0xF) != 0);
}
return 1;
case 0x4D:
case 0x51:
case 0x52:
case 0x55: goto LABEL_97;
case 0x4E:
case 0x54:
++*(uint16 *)&tempEB;
LABEL_97:
v35 = *(uint16 *)&tempEB;
goto LABEL_98;
case 0x4F: v35 = *(uint16 *)&tempEB + 16; goto LABEL_98;
case 0x50:
case 0x53:
v35 = *(uint16 *)&tempEB + 17;
LABEL_98:
*(uint16 *)&tempE2 = v35;
v36 = kword_2881F[(uint16)(2 * *(uint16 *)&tempEF) >> 1];
while (2) {
v37 = kbyte_2B52C[v36];
if (!v37)
goto LABEL_103;
if (v37 != 0xFF) {
if (v37 == 0xFE) {
*(uint16 *)&tempE2 += 16;
v35 = *(uint16 *)&tempE2;
++v36;
continue;
}
layer2_bgdata[v35] = kbyte_2B52C[v36];
LABEL_103:
++v36;
if ((++v35 & 0xF) == 0)
v35 += 240;
continue;
}
return 0;
}
case 0x56:
v50 = *(uint16 *)&tempEB;
do {
layer2_bgdata[v50 + 32] = 9;
layer2_bgdata[v50 + 33] = 11;
v50 += 2;
--tempF1;
} while ((tempF1 & 0x80u) == 0);
return 0;
case 0x57:
v51 = *(uint16 *)&tempEB;
do {
if (layer2_bgdata[v51 + 32] == 9)
v52 = 10;
else
v52 = 4;
layer2_bgdata[v51 + 32] = v52;
layer2_bgdata[v51 + 48] = 1;
v51 += 32;
--tempF1;
} while ((tempF1 & 0x80u) == 0);
return 0;
case 0x58:
v53 = *(uint16 *)&tempEB;
do {
if (layer2_bgdata[v53 + 33] == 11)
v54 = 10;
else
v54 = 4;
layer2_bgdata[v53 + 33] = v54;
layer2_bgdata[v53 + 49] = 1;
v53 += 32;
--tempF1;
} while ((tempF1 & 0x80u) == 0);
return 0;
case 0x59: ++*(uint16 *)&tempEB; goto LABEL_121;
case 0x5A:
LABEL_121:
v43 = *(uint16 *)&tempEB + 32;
layer2_bgdata[(uint16)(*(uint16 *)&tempEB + 32)] = kbyte_28793;
layer2_bgdata[v43 + 1] = kbyte_28794;
layer2_bgdata[v43 + 16] = kbyte_28795;
layer2_bgdata[v43 + 17] = kbyte_28796;
layer2_bgdata[v43 + 32] = kbyte_28797;
layer2_bgdata[v43 + 33] = kbyte_28798;
return 0;
case 0x5B: ++*(uint16 *)&tempEB; goto LABEL_123;
case 0x5C:
LABEL_123:
v44 = *(uint16 *)&tempEB + 32;
layer2_bgdata[(uint16)(*(uint16 *)&tempEB + 32) + 16] = kbyte_28793;
layer2_bgdata[v44 + 17] = kbyte_28794;
layer2_bgdata[v44 + 32] = kbyte_28795;
layer2_bgdata[v44 + 33] = kbyte_28796;
return 0;
case 0x5D:
v8 = kword_28351[(uint16)(2 * *(uint16 *)&tempF1) >> 1];
v9 = *(uint16 *)&tempEB + 16;
while (kbyte_2B5DE[v8] != 0xFF)
layer2_bgdata[v9++] = kbyte_2B5DE[v8++];
return 0;
}
do {
if ((v63 & 0xF0) == 0) {
layer2_bgdata[v63 + 32] = kbyte_28C12[6];
layer2_bgdata[v63 + 33] = kbyte_28C12[7];
layer2_bgdata[v63 + 34] = kbyte_28C12[8];
goto LABEL_182;
}
if (layer2_bgdata[v63 + 32] != 12) {
layer2_bgdata[v63 + 32] = kbyte_28C12[0];
layer2_bgdata[v63 + 33] = kbyte_28C12[1];
layer2_bgdata[v63 + 34] = kbyte_28C12[2];
LABEL_182:
layer2_bgdata[v63 + 48] = kbyte_28C12[3];
layer2_bgdata[v63 + 49] = kbyte_28C12[4];
layer2_bgdata[v63 + 50] = kbyte_28C12[5];
goto LABEL_184;
}
layer2_bgdata[v63 + 32] = kbyte_28C12[9];
layer2_bgdata[v63 + 33] = kbyte_28C12[10];
layer2_bgdata[v63 + 34] = kbyte_28C12[11];
layer2_bgdata[v63 + 48] = kbyte_28C12[12];
layer2_bgdata[v63 + 49] = kbyte_28C12[13];
layer2_bgdata[v63 + 50] = kbyte_28C12[14];
layer2_bgdata[v63 + 64] = kbyte_28C12[15];
layer2_bgdata[v63 + 65] = kbyte_28C12[16];
layer2_bgdata[v63 + 66] = kbyte_28C12[17];
layer2_bgdata[v63 + 80] = kbyte_28C12[18];
layer2_bgdata[v63 + 81] = kbyte_28C12[19];
layer2_bgdata[v63 + 82] = kbyte_28C12[20];
v63 += 32;
--tempF1;
LABEL_184:
v63 += 32;
--tempF1;
} while ((tempF1 & 0x80u) == 0);
return 0;
}
uint8 Smbll_SetupLayer2Bg_Helper1(uint16 k, uint8 a) {
uint8 v2; // al
uint8 v3; // al
uint8 v4; // al
uint8 v5; // al
uint8 v6; // al
tempE4 = a;
switch (a) {
case 0x12u:
v2 = layer2_bgdata[k];
if (v2) {
switch (v2) {
case 0x18u: return 2;
case 6u: return 17;
case 0x16u: return 1;
case 5u: return 98;
default: return 16;
}
} else {
return tempE4;
}
case 3u:
if (layer2_bgdata[k])
return 54;
else
return tempE4;
case 4u:
v3 = layer2_bgdata[k];
if (v3) {
if (v3 == 18)
return 20;
else
return 55;
} else {
return tempE4;
}
case 5u:
v4 = layer2_bgdata[k];
if (v4) {
if (v4 == 19)
return 21;
else
return 56;
} else {
return tempE4;
}
case 0x18u:
v5 = layer2_bgdata[k];
if (v5) {
if (v5 == 22) {
return 30;
} else if (v5 == 19) {
return 30;
} else {
return 29;
}
} else {
return tempE4;
}
case 7u:
v6 = layer2_bgdata[k];
if (v6) {
switch (v6) {
case 0x16u: return 14;
case 4u: return 112;
case 0xBu: return -112;
default: return 73;
}
} else {
return tempE4;
}
}
return a;
}
void Smbll_sub_28A66() {
;
}
void Smbll_SetupLayer2BgB() {
uint16 v0; // si
uint16 v1; // di
*(uint16 *)((int8 *)&tempD8.addr + 1) = 512;
tempD8.addr = koff_28E91[(uint16)(2 * area_type) >> 1];
if (area_type >= 2u)
v0 = *(uint16 *)&tempEB;
else
v0 = *(uint16 *)&tempEB + 16;
do {
v1 = 4 * (*(uint16 *)&tempEF - 16);
layer2_bgdata[v0 + 32] = *IndirPtr(tempD8, v1++);
layer2_bgdata[v0 + 33] = *IndirPtr(tempD8, v1++);
layer2_bgdata[v0 + 48] = *IndirPtr(tempD8, v1);
layer2_bgdata[v0 + 49] = *IndirPtr(tempD8, v1 + 1);
v0 += 2;
--*(uint16 *)&tempF1;
} while (*(int16 *)&tempF1 >= 0);
}
void Smbll_SetAllLayer2BgData(uint16 k, uint16 a) {
*(uint16 *)&layer2_bgdata[k] = a;
*(uint16 *)&layer2_bgdata[k + 256] = a;
*(uint16 *)&layer2_bgdata[k + 512] = a;
*(uint16 *)&layer2_bgdata[k + 768] = a;
*(uint16 *)&layer2_bgdata[k + 1024] = a;
*(uint16 *)&layer2_bgdata[k + 1280] = a;
*(uint16 *)&layer2_bgdata[k + 1536] = a;
*(uint16 *)&layer2_bgdata[k + 1792] = a;
*(uint16 *)&layer2_bgdata[k + 2048] = a;
*(uint16 *)&layer2_bgdata[k + 2304] = a;
*(uint16 *)&layer2_bgdata[k + 2560] = a;
*(uint16 *)&layer2_bgdata[k + 2816] = a;
*(uint16 *)&layer2_bgdata[k + 3072] = a;
*(uint16 *)&layer2_bgdata[k + 3328] = a;
*(uint16 *)&layer2_bgdata[k + 3584] = a;
*(uint16 *)&layer2_bgdata[k + 3840] = a;
}
void Smbll_SetAllLayer2BgDataByte(uint16 k, uint8 a) {
layer2_bgdata[k] = a;
layer2_bgdata[k + 256] = a;
layer2_bgdata[k + 512] = a;
layer2_bgdata[k + 768] = a;
layer2_bgdata[k + 1024] = a;
layer2_bgdata[k + 1280] = a;
layer2_bgdata[k + 1536] = a;
layer2_bgdata[k + 1792] = a;
layer2_bgdata[k + 2048] = a;
layer2_bgdata[k + 2304] = a;
layer2_bgdata[k + 2560] = a;
layer2_bgdata[k + 2816] = a;
layer2_bgdata[k + 3072] = a;
layer2_bgdata[k + 3328] = a;
layer2_bgdata[k + 3584] = a;
layer2_bgdata[k + 3840] = a;
}
void Smbll_SetupLayer2BgA() {
uint16 v0; // di
uint16 v1; // ax
uint16 v2; // si
uint16 v3; // si
uint16 v4; // di
uint16 m; // si
uint16 k; // si
uint16 j; // si
uint16 i; // si
uint8 v9; // al
uint16 v10; // si
uint16 v11; // di
uint16 v12; // ax
uint16 v13; // ax
uint8 t0;
v1 = koff_28FC1[(uint16)(2 * *(uint16 *)&tempEF) >> 1];
*(uint16 *)&R0_ = v1;
switch ((uint8)(2 * tempEF) >> 1) {
case 0: ++layer2_bg_0EC0; break;
case 1:
if (world_number != 1 || area_type == 2) {
v9 = tempF1;
if (tempF1 == 2)
v9 = -1;
} else {
v9 = 1;
}
if (v9 == 1)
vblank_which_layer2_scroll_flag = 1;
Smbll_InitializeGradientHDMA(v9);
break;
case 2: Smbll_InitializeGradientHDMA(2u); break;
case 3:
v10 = 208;
v11 = *(uint16 *)&tempF1;
v12 = *(uint16 *)((char *)kword_2918A + v11);
do
Smbll_SetAllLayer2BgData(v10++, v12);
while (v10 != 224);
v13 = *(uint16 *)((char *)kword_29190 + v11);
do
Smbll_SetAllLayer2BgData(v10++, v13);
while (v10 != 240);
Smbll_SetAllLayer2BgData(0xF0u, 0x50u);
break;
case 4:
*(uint16 *)&tileset_graphics_type = *(uint16 *)&tempF1;
Smbll_HandleTilesetGraphicsUploads();
break;
case 5:
t0 = (area_type == 2) ? 0 : 0x5f;
for (i = 0; i != 32; ++i)
Smbll_SetAllLayer2BgDataByte(i, t0);
break;
case 6:
for (j = 0; j != 2048; j += 16) {
do {
layer2_bgdata[j] = kbyte_290F7[0];
layer2_bgdata[j + 1] = kbyte_290F7[1];
layer2_bgdata[j + 16] = kbyte_290F7[2];
layer2_bgdata[j + 17] = kbyte_290F7[3];
j += 2;
} while ((j & 0xF) != 0);
}
break;
case 7:
for (k = 0; k != 32; k += 2)
Smbll_SetAllLayer2BgData(k, 0x202u);
do {
Smbll_SetAllLayer2BgData(k, 0x101u);
k += 2;
} while (k != 48);
break;
case 8:
for (m = 128; m < 0x1000u; m += 240) {
do {
*(uint16 *)&layer2_bgdata[m] = 1027;
*(uint16 *)&layer2_bgdata[m + 16] = 2313;
*(uint16 *)&layer2_bgdata[m + 32] = 2313;
*(uint16 *)&layer2_bgdata[m + 48] = 2313;
*(uint16 *)&layer2_bgdata[m + 64] = 2313;
*(uint16 *)&layer2_bgdata[m + 80] = 2313;
*(uint16 *)&layer2_bgdata[m + 96] = 2313;
m += 2;
} while ((m & 0xF) != 0);
}
break;
case 9: enable_layer3_bgflag = tempF1; break;
case 10:
*(uint16 *)&tempE4 = 0;
do {
v3 = (tempE4 << 8) + 160;
v4 = 0;
do {
layer2_bgdata[v3] = kbyte_29023[v4];
if ((v3 & 1) != 0) {
layer2_bgdata[v3 + 16] = 13;
layer2_bgdata[v3 + 48] = 13;
layer2_bgdata[v3 + 80] = 13;
layer2_bgdata[v3 + 32] = 17;
layer2_bgdata[v3 + 64] = 17;
} else {
layer2_bgdata[v3 + 16] = 12;
layer2_bgdata[v3 + 48] = 12;
layer2_bgdata[v3 + 80] = 12;
layer2_bgdata[v3 + 32] = 16;
layer2_bgdata[v3 + 64] = 16;
}
++v3;
++v4;
} while ((v4 & 0xF) != 0);
++*(uint16 *)&tempE4;
} while (*(uint16 *)&tempE4 != 8);
break;
case 11:
*(uint16 *)&tileset_graphics_type = *(uint16 *)&tempF1 | 0x10;
Smbll_HandleTilesetGraphicsUploads();
break;
case 12:
v2 = 208;
v0 = 0;
do {
Smbll_SetAllLayer2BgDataByte(v2++, kbyte_28FDB[v0]);
++v0;
} while (v0 != 48);
break;
}
}
void Smbll_GenerateLayer2Map16() {
int16 v0; // si
uint16 v1; // di
int16 v2; // ax
int16 v3; // si
uint16 v4; // di
int v5; // rbp
uint16 v6; // [rsp+45h] [rbp-3h]
*(uint16 *)&R0_ = koff_292CC[kword_2923C[*(uint16 *)&area_data_addr_index]];
*(uint16 *)&R2_ = 2;
v0 = 0;
v1 = 0;
do {
*(uint16 *)&tempE4 = v0;
v2 = *(uint16 *)&layer2_bgdata[v1];
if (v2 == -1)
break;
v6 = v1;
v3 = *(uint16 *)&tempE4;
v4 = 8 * (uint8)v2;
v5 = *(uint16 *)&tempE4 >> 1;
layer2_map16_table[v5] = *(uint16 *)IndirPtr(*(LongPtr *)&R0_, v4);
v4 += 2;
layer2_map16_table[v5 + 1] = *(uint16 *)IndirPtr(*(LongPtr *)&R0_, v4);
v4 += 2;
layer2_map16_table[v5 + 32] = *(uint16 *)IndirPtr(*(LongPtr *)&R0_, v4);
layer2_map16_table[v5 + 33] = *(uint16 *)IndirPtr(*(LongPtr *)&R0_, v4 + 2);
v1 = v6 + 1;
if ((((uint8)v6 + 1) & 0xF) == 0)
v3 += 64;
v0 = v3 + 4;
} while (v6 != 4607);
area_data_addr_index = smbll_varF35;
}
void Smbll_ControllerStuff_05C860() {
if (sram_controller_type_x) {
saved_joypad_bits |= (uint8)(saved_joypad_bits & 0x80) >> 1;
saved_joypad_bits = controller_hold2p1 & 0xC0 | saved_joypad_bits & 0x7F;
controller_press1p1 |= (uint8)(controller_press1p1 & 0x80) >> 1;
R0_ = controller_press2p1 & 0xC0;
controller_press1p1 = controller_press2p1 & 0xC0 | controller_press1p1 & 0x7F;
} else {
saved_joypad_bits |= controller_hold2p1 & 0xC0;
controller_press1p1 |= controller_press2p1 & 0xC0;
}
}
void Smbll_CODE_05C95B() {
if (smbll_varF03) {
Smbll_UNUSED_CODE_05C9A5();
} else {
world_number = save_buffer;
offscreen_players_world = save_buffer;
level_number = g_byte_7FFB01;
player_other_players_level_number_display = g_byte_7FFB01;
area_number = save_buffer_area_number_original + ((save_buffer_area_number_original & 0x80u) != 0);
player_other_players_level = area_number;
number_of_lives = save_buffer_current_life_count;
smbll_varF2B = save_buffer_hard_mode_active_flag;
Smbll_LoadTopScoreFromSram();
}
}
void Smbll_LoadTopScoreFromSram() {
uint8 i; // si
for (i = 0; i != 6; ++i)
displayed_score[i] = sram_top_score[i];
}
void Smbll_UNUSED_CODE_05C9A5() {
uint8 i; // si
area_number = sram_initial_selected_level;
level_number = original_level;
number_of_lives = 2;
player_coin_count = 0;
smbll_varF2B = 0;
for (i = 0; i != 6; ++i)
marios_score[i] = 0;
}
void Smbll_DrawCrumblingBridgeSegment(uint8 k) {
uint8 v1; // di
uint8 i; // si
OamEnt *oam; // rbp
OamEnt *v4; // rdx
uint8 v5; // si
if (bridge_collapse_offset) {
v1 = enemy_obj_id[k];
for (i = 0; i != 32; ++i) {
oam = get_OamEnt(oam_buf, v1);
v4 = get_OamEnt(oam_buf, i);
v4->xpos = oam[64].xpos;
if ((v1 & 3) == 1 && v4->xpos >= 0xF0u) {
v4->xpos = -16;
oam_tile_size_buffer[v1 + 256] = 0;
}
oam_tile_size_buffer[i] = oam_tile_size_buffer[v1 + 256];
oam_tile_size_buffer[v1 + 256] = 0;
oam[64].xpos = -16;
++v1;
}
}
v5 = 0;
tempE7 = 0;
do {
if (bridge_sprite_slot_exists_flag[v5]) {
Smbll_DrawCrumblingBridgeSegment_Sub(v5);
tempE7 += 32;
}
++v5;
} while (v5 < 0xDu);
}
void Smbll_DrawCrumblingBridgeSegment_Sub(uint8 k) {
uint8 v1; // di
uint8 v2; // di
uint8 v3; // si
uint8 v4; // al
uint8 v5; // di
uint8 v6; // di
uint8 v7; // si
uint8 a; // [rsp+46h] [rbp-2h]
bowser_enemy_slot_plus1 = object_index + 1;
tempE6 = bridge_animation_frame[k];
tempE4 = kbyte_2D215[tempE6] - 96;
tempE5 = kbyte_2D215[tempE6 + 1] - 96;
v1 = Smbll_DrawCrumblingBridgeSegment_Sub2(tempE7, level_bridge_spr_xpos_lo[k]);
Smbll_DrawCrumblingBridgeSegment_Sub2(v1, level_bridge_spr_xpos_lo[k] + 8);
v2 = tempE7;
Smbll_DrawCrumblingBridgeSegment_Sub3(tempE7, tempE4);
Smbll_DrawCrumblingBridgeSegment_Sub3(v2 + 16, tempE5);
v3 = tempE6;
if (tempE6 >= 4u)
v4 = 35;
else
v4 = 34;
a = v4;
v5 = Smbll_DrawCrumblingBridgeSegment_Sub2(tempE7 + 3, v4);
Smbll_DrawCrumblingBridgeSegment_Sub2(v5, a);
v6 = tempE7;
v7 = 8 * v3;
tempE8 = 8;
do {
get_OamEnt(oam_buf, v6)[64].charnum = kbyte_2D1CD[v7];
v6 += 4;
++v7;
--tempE8;
} while (tempE8);
if (!--level_bridge_spr_animation_frame_timer[k]) {
level_bridge_spr_animation_frame_timer[k] = 3;
if ((++bridge_animation_frame[k] & 0xF) == 9)
bridge_sprite_slot_exists_flag[k] = 0;
}
}
void Smbll_DrawCrumblingBridgeSegment_Sub3(uint8 j, uint8 a) {
OamEnt *oam; // rbp
uint8 v3; // al
oam = get_OamEnt(oam_buf, j);
oam[64].ypos = a;
v3 = a + 8;
oam[65].ypos = v3;
v3 += 8;
oam[66].ypos = v3;
oam[67].ypos = v3 + 8;
}
uint8 Smbll_DrawCrumblingBridgeSegment_Sub2(uint8 j, uint8 a) {
OamEnt *oam; // rbp
oam = get_OamEnt(oam_buf, j);
oam[64].xpos = a;
oam[65].xpos = a;
oam[66].xpos = a;
oam[67].xpos = a;
return j + 16;
}
void Smbll_EnemyGfxHandler_Sub1(uint8 k) {
uint8 v1; // di
uint8 v2; // al
OamEnt *oam; // rbp
uint8 v4; // si
uint8 v5; // si
v1 = enemy_obj_id[k] + 4;
v2 = enemy_moving_dir[k];
if (v2 == 2)
v2 = 65;
oam = get_OamEnt(oam_buf, v1);
oam[64].flags = v2 ^ 0x2B;
if (enemy_id[k] != 8 && bullet_bill_arr0EA2[k] < 0xAu)
oam[64].flags ^= 0x20u;
tempE4 = (enemy_arr0F4F[k] >> 2) & 0xF;
if ((enemy_state[k] & 0x20) != 0 || tempE4 >= 9u)
enemy_arr0F4F[k] = 0;
if (game_engine_subroutine < 9u && !var0E67)
++enemy_arr0F4F[k];
v4 = tempE4;
oam[64].xpos = rel_xpos_lo.enemy;
oam[64].ypos = rel_ypos.enemy + 8;
oam[64].charnum = kbyte_2D220[v4];
oam_tile_size_buffer[v1 + 256] = 2;
v5 = object_index;
tempE4 = obj_xpos_lo.enemy[object_index];
tempE5 = obj_xpos_hi.enemy[object_index];
*(uint16 *)&tempE4 -= screen_left_xpos16;
if (tempE5)
oam_tile_size_buffer[v1 + 256] = 3;
if (rel_ypos.enemy >= 0xE0u || obj_ypos_hi.enemy[v5] != 1)
oam[64].ypos = -16;
}
uint8 Smbll_HandleMarioGoalWalk() {
uint8 v1; // al
if (flagpole_timer_var03fa) {
tempE4 = obj_xpos_lo.player;
tempE5 = obj_xpos_hi.player;
HIBYTE(some_xpos16_var02fd) = 0;
if ((uint16)(flagpole_player_xpos16 + some_xpos16_var02fd) >= *(uint16 *)&tempE4)
return 1;
flagpole_timer_var03fa = 0;
draw_bubble_var3 = 52;
mario_goal_walk_var03cf = 52;
}
if (mario_goal_walk_var03cf) {
if (mario_goal_walk_var03cf < 0x28u)
v1 = -16;
else
v1 = -8;
mario_goal_walk_var03ce = v1;
if (player_size)
mario_goal_walk_var03ce -= 16;
--mario_goal_walk_var03cf;
obj_xspeed.player = 0;
player_x_move_force = 0;
return 0;
} else {
scroll_lock = 1;
player_disable_auto_palette_update = 1;
Smbll_HandleMarioGoalWalk_Sub();
mario_goal_walk_var03ce = 0;
if (flagpole_timer_var03fb) {
--flagpole_timer_var03fb;
return 1;
} else {
if (!star_flag_task_control)
++star_flag_task_control;
return 0;
}
}
}
void Smbll_HandleMarioGoalWalk_Sub() {
uint8 i; // si
int v1; // rbp
for (i = 0; i != 32; i += 2) {
v1 = i >> 1;
*(uint16 *)&tempE4 = palette_mirror[v1 + 240];
if ((*(uint16 *)&tempE4 & 0x7C00) != 0)
*(uint16 *)&tempE4 -= 1024;
if ((*(uint16 *)&tempE4 & 0x3E0) != 0)
*(uint16 *)&tempE4 -= 32;
if ((tempE4 & 0x1F) != 0)
--*(uint16 *)&tempE4;
palette_mirror[v1 + 240] = *(uint16 *)&tempE4;
}
++update_entire_palette_flag;
}
void Smbll_BrowserDraw_Sub1() {
uint8 v0; // di
uint8 v1; // si
uint8 v2; // al
v0 = browser_front_offset;
v1 = bowser_flame_enemy_index;
obj_xpos_lo.enemy[bowser_flame_enemy_index] = obj_xpos_lo.enemy[browser_front_offset] - 14;
obj_xpos_hi.enemy[v1] = obj_xpos_hi.enemy[v0];
obj_ypos_lo.enemy[v1] = obj_ypos_lo.enemy[v0] + 8;
v2 = *(&random_byte1 + v1) & 3;
obj_sub_ypos.enemy[v1] = v2;
obj_sub_yspeed.enemy[v1] = kbyte_2D397[kbyte_2D393[v2] >= obj_ypos_lo.enemy[v1]];
enemy_frenzy_buffer = 0;
enemy_hitbox_ctrl[v1] = 8;
obj_ypos_hi.enemy[v1] = 1;
enemy_flag[v1] = 1;
obj_xpos_fract.enemy[v1] = 0;
enemy_state[v1] = 0;
}
void Smbll_ProcBowserFlame_Sub(uint8 k) {
uint8 v1; // di
uint8 enemy; // al
OamEnt *oam; // rbp
uint8 v4; // al
uint8 v5; // al
uint8 v6; // al
uint8 v7; // si
uint8 v8; // al
uint8 v9; // si
uint8 v10; // al
uint8 v11; // al
uint8 v12; // al
v1 = enemy_obj_id[k];
enemy = rel_xpos_lo.enemy;
oam = get_OamEnt(oam_buf, v1);
oam[64].xpos = rel_xpos_lo.enemy;
oam[65].xpos = enemy + 8;
v4 = rel_ypos.enemy;
oam[64].ypos = rel_ypos.enemy;
oam[65].ypos = v4;
oam[64].flags = 33;
oam[65].flags = 33;
v5 = enemy_array_0F58[k] >> 3;
if (v5 == 3) {
enemy_array_0F36[k] = 0;
enemy_array_0F36[k] = 1;
v6 = obj_xpos_lo.enemy[k];
enemy_array_0F62[k] = v6 + 16;
enemy_array_0F6B[k] = __CFADD__(v6, 16) + obj_xpos_hi.enemy[k];
enemy_array_0F74[k] = rel_ypos.enemy;
v5 = 0;
enemy_array_0F58[k] = 0;
}
v7 = v5;
v8 = kbyte_2D4CA[v5];
oam[64].charnum = v8;
oam[65].charnum = v8 + 1;
tempE4 = v7;
v9 = object_index;
tempE5 = obj_xpos_lo.enemy[object_index];
tempE6 = obj_xpos_hi.enemy[object_index];
*(uint16 *)&tempE5 -= screen_left_xpos16;
*(uint16 *)&tempE7 = *(uint16 *)&tempE5 + 8;
tempE9 = 2;
v10 = tempE6;
if (tempE6)
v10 = 1;
oam_tile_size_buffer[v1 + 256] = tempE9 | v10;
v11 = tempE8;
if (tempE8)
v11 = 1;
oam_tile_size_buffer[v1 + 260] = tempE9 | v11;
if (enemy_array_0F36[v9]) {
tempE5 = enemy_array_0F62[v9];
tempE6 = enemy_array_0F6B[v9];
*(uint16 *)&tempE5 -= screen_left_xpos16;
oam[66].xpos = tempE5;
oam[66].ypos = enemy_array_0F74[v9] + (enemy_array_0F58[v9] >> 1) + 4;
oam[66].charnum = kbyte_2D4CD[tempE4];
oam[66].flags = 40;
tempE9 = 0;
v12 = tempE6;
if (tempE6)
v12 = 1;
oam_tile_size_buffer[v1 + 264] = tempE9 | v12;
}
++enemy_array_0F58[object_index];
}
void Smbll_DrawLargePlatform_Sub1() {
uint8 v0; // di
uint8 v1; // si
OamEnt *oam; // rdx
uint8 v3; // si
uint8 v4; // di
uint8 v5; // si
OamEnt *v6; // rdx
uint8 v7; // al
OamEnt *v8; // rdx
uint8 v9; // al
OamEnt *v10; // rbp
uint8 v11; // [rsp+46h] [rbp-2h]
v0 = 4;
player_entered_coin_heaven_flag = 4;
tempE4 = rel_xpos_lo.enemy - 8;
v1 = 0;
do {
oam = get_OamEnt(oam_buf, v0);
oam->xpos = tempE4 + kbyte_2D603[v1];
oam->ypos = rel_ypos.enemy - 4;
v11 = v1;
tempE5 = v1;
v3 = v1 + (frame_counter & 0x18);
oam->flags = kbyte_2D5E3[v3];
oam->charnum = kbyte_2D5C3[v3];
v0 += 4;
v1 = v11 + 1;
} while (v11 != 4);
tempE5 = obj_xpos_lo.enemy[object_index];
tempE6 = obj_xpos_hi.enemy[object_index];
*(uint16 *)&tempE9 = *(uint16 *)&tempE5 - 8 - screen_left_xpos16;
*(uint16 *)&tempE8 = *(uint16 *)&tempE9 + 16;
*(uint16 *)&tempDF = *(uint16 *)&tempE8 + 4;
*(uint16 *)&tempDD = *(uint16 *)&tempE8 + 12;
*(uint16 *)&tempE7 = *(uint16 *)&tempE8 + 16;
*(uint16 *)&tempE6 = *(uint16 *)&tempE7 + 16;
*(uint16 *)&tempE5 = *(uint16 *)&tempE6 - 16;
tempE4 = 2;
v4 = 4;
v5 = 5;
do {
oam_tile_size_buffer[v4] = tempE4 | (*(&tempE5 + v5) != 0);
v4 += 4;
--v5;
} while (v5);
tempE4 = 0;
if (secondary_hard_mode) {
v8 = get_OamEnt(oam_buf, 0);
v8[3].ypos = -16;
v8[4].ypos = -16;
v9 = tempE0;
if (tempE0)
v9 = 1;
oam_tile_size_buffer[0] = tempE4 | v9;
v8->xpos = tempDF;
} else {
v6 = get_OamEnt(oam_buf, 0);
v6[5].ypos = -16;
v7 = tempDE;
if (tempDE)
v7 = 1;
oam_tile_size_buffer[0] = tempE4 | v7;
v6->xpos = tempDD;
}
v10 = get_OamEnt(oam_buf, 0);
v10->ypos = rel_ypos.enemy + ((uint8)(frame_counter & 0x10) >> 4);
v10->charnum = -25;
v10->flags = 44;
}
void Smbll_HandleBowserWoozy() {
uint8 v0; // si
OamEnt *oam; // rbp
uint8 v2; // al
int8 v3; // al
uint8 v4; // al
int8 v5; // al
if (++bowser_woozy_effect_animation_frame >= 0x34u) {
bowser_feeling_woozy_flag = 0;
} else {
v0 = bowser_woozy_effect_animation_frame >> 2;
oam = get_OamEnt(oam_buf, 0);
oam[62].xpos = rel_xpos_lo.enemy + kbyte_2D668[bowser_woozy_effect_animation_frame >> 2] + 24;
oam[63].xpos = rel_xpos_lo.enemy + kbyte_2D675[v0] + 24;
v2 = kbyte_2D682[v0];
if (v2)
v3 = rel_ypos.enemy + v2 + 16;
else
v3 = -16;
oam[62].ypos = v3;
v4 = kbyte_2D68F[v0];
if (v4)
v5 = rel_ypos.enemy + v4 + 16;
else
v5 = -16;
oam[63].ypos = v5;
oam[62].charnum = kbyte_2D69C[v0];
oam[63].charnum = kbyte_2D6A9[v0];
oam[62].flags = kbyte_2D6B6[v0];
oam[63].flags = kbyte_2D6C3[v0];
}
}
void Smbll_BowserDraw(uint8 k) {
uint8 v1; // di
uint8 v2; // di
uint8 enemy; // al
OamEnt *oam; // rbp
uint8 v5; // al
int8 v6; // al
uint8 v7; // si
uint8 v8; // si
uint8 v9; // di
uint8 v10; // di
int8 v11; // si
OamEnt *v12; // rbp
OamEnt *v13; // rbx
uint8 v14; // al
uint8 v15; // al
uint8 v16; // al
if (bowser_feeling_woozy_flag)
Smbll_HandleBowserWoozy();
if (bowser_var0F4C) {
v1 = bowser_var014B;
if (bowser_var014B == 8)
v1 = kbyte_2D666[(bowser_var0F4C & 4) != 0];
} else {
if (!enemy_frame_timer[k])
bowser_var014B = 0;
v1 = bowser_var014B >> 3;
}
bowser_var014C = kbyte_2D65C[v1];
v2 = enemy_obj_id[k];
enemy = rel_xpos_lo.enemy;
oam = get_OamEnt(oam_buf, v2);
oam[64].xpos = rel_xpos_lo.enemy;
oam[65].xpos = enemy;
enemy += 8;
oam[66].xpos = enemy;
enemy += 8;
oam[67].xpos = enemy;
oam[68].xpos = enemy;
oam[69].xpos = enemy;
v5 = rel_ypos.enemy;
oam[64].ypos = rel_ypos.enemy;
oam[67].ypos = v5;
v5 += 16;
oam[65].ypos = v5;
oam[68].ypos = v5;
v5 -= 24;
oam[66].ypos = v5;
oam[69].ypos = v5;
tempDE = enemy_moving_dir[k];
if (tempDE == 1)
v6 = 33;
else
v6 = 97;
oam[64].flags = v6;
oam[65].flags = v6;
oam[66].flags = v6;
oam[67].flags = v6;
oam[68].flags = v6;
oam[69].flags = v6;
object_index = k;
v7 = 6 * bowser_var014C;
tempDD = 6 * bowser_var014C + 6;
if (tempDE != 1) {
tempDD += 42;
v7 = tempDD - 6;
}
do {
get_OamEnt(oam_buf, v2)[64].charnum = kbyte_2D608[v7];
oam_tile_size_buffer[v2 + 256] = 2;
v2 += 4;
++v7;
} while (v7 != tempDD);
oam_tile_size_buffer[v2 + 252] = 0;
oam_tile_size_buffer[v2 + 240] = 0;
v8 = object_index;
tempE4 = obj_xpos_lo.enemy[object_index];
tempE5 = obj_xpos_hi.enemy[object_index];
*(uint16 *)&tempE4 -= screen_left_xpos16;
*(uint16 *)&tempE6 = *(uint16 *)&tempE4 + 8;
*(uint16 *)&tempE8 = *(uint16 *)&tempE4 + 16;
*(uint16 *)&tempE2 = *(uint16 *)&tempE4 + 64;
v9 = enemy_obj_id[object_index];
if ((uint16)(*(uint16 *)&tempE4 + 64) >> 8 == 0xFF) {
enemy_flag[object_index] = 0;
enemy_state[v8] = 0;
enemy_id[v8] = 0;
}
if (tempE5) {
oam_tile_size_buffer[v9 + 256] = 3;
oam_tile_size_buffer[v9 + 260] = 3;
}
if (tempE7)
oam_tile_size_buffer[v9 + 264] = 1;
if (tempE9) {
oam_tile_size_buffer[v9 + 268] = 1;
oam_tile_size_buffer[v9 + 272] = 1;
oam_tile_size_buffer[v9 + 276] = 1;
}
if (bowser_var0F4C) {
if (!--bowser_var0F4C) {
if (bowser_var014B == 6) {
++bowser_var014B;
bowser_var0F4C = 40;
sound_ch1 = 58;
Smbll_BrowserDraw_Sub1();
} else {
bowser_var014B = 0;
}
}
} else {
bowser_var0F4C = 0;
if (++bowser_var014B >= 0x30u)
bowser_var014B = 0;
}
if (!bowser_hit_points) {
v10 = enemy_obj_id[object_index];
v11 = 6;
do {
v12 = get_OamEnt(oam_buf, v10);
v12[64].flags |= 0x80u;
v10 += 4;
--v11;
} while (v11);
v8 = object_index;
v13 = get_OamEnt(oam_buf, enemy_obj_id[object_index]);
v14 = v13[64].ypos + 8;
v13[64].ypos = v14;
v13[67].ypos = v14;
v15 = v13[65].ypos - 24;
v13[65].ypos = v15;
v13[68].ypos = v15;
v16 = v13[66].ypos + 32;
v13[66].ypos = v16;
v13[69].ypos = v16;
}
Smbll_DrawCrumblingBridgeSegment(v8);
}
void Smbll_SetLevelMusic() {
uint8 bubble; // di
uint8 v1; // al
if (game_mode) {
if (alt_entrance_ctrl == 2 || (bubble = 5, player_entrance_ctrl != 6) && player_entrance_ctrl != 7) {
bubble = obj_yspeed.bubble[0];
if (cloud_type_override)
bubble = 4;
}
v1 = game_engine_subroutine;
if (game_engine_subroutine != 4 && game_engine_subroutine != 5) {
if (area_data_addr_index == 57 || area_data_addr_index == 59 || area_data_addr_index == 61)
v1 = 1;
else
v1 = kbyte_2D8F0[bubble];
if (!set_level_music_flag)
music_ch1 = v1;
}
if (area_data_addr_index == 7)
set_level_music_flag = v1;
}
}
void Smbll_HandlePauseMenu() {
if (game_mode != 2 && game_mode == 1 && game_mode_task == 3 && !var0E67 && inidisp_mirror == 15) {
if (pausemenu_delay) {
--pausemenu_delay;
} else if (game_engine_subroutine != 2 && game_engine_subroutine != 3 && !auto_control_player_var1 && pause_menu_idx < 2u) {
if (pausemenu_var2) {
--pausemenu_var2;
} else if (!pause_menu_idx && (controller_press1p1 & 0x10) != 0) {
pausemenu_delay = 17;
music_ch1 = -15;
sound_ch1 = 67;
Smbll_PauseMenu_Func6();
}
}
}
}
void Smbll_PauseMenu_Func3() {
++pausemenu_var3;
graphics_upload_ptr.bank = 9;
graphics_upload_ptr.addr = -16384;
graphics_upload_size = 2048;
graphics_upload_vramaddress = 31744;
}
void Smbll_PauseMenu_Func4() {
++pausemenu_var3;
graphics_upload_ptr.bank = 4;
graphics_upload_ptr.addr = -18432;
graphics_upload_size = 2048;
graphics_upload_vramaddress = 31744;
}
void Smbll_PauseMenu_Func5() {
Smbll_PauseMenu_Func1();
Smbll_PauseMenu_Func7_Hdma_05E21F();
w12sel_mirror = 34;
w34sel_mirror = 2;
tmw_mirror = 21;
tsw_mirror = 2;
}
void Smbll_PauseMenu_Func6() {
Smbll_PauseMenu_Func1();
Smbll_PauseMenu_Func7_Hdma_05E21F();
Smbll_PauseMenu_Func2();
Smbll_PauseMenu_Func3();
display_pause_menu_flag = 1;
pausemenu_var1 = 0;
blinking_cursor_frame_counter = 0;
pausemenu_var2 = 0;
}
void Smbll_MaybePauseMenuHandler() {
funcs_1BA38[(uint8)(2 * pause_menu_idx) >> 1]();
}
// 1BA40: using guessed type int (*funcs_1BA38[4])();
void Smbll_PauseMenu_Func2() {
pausemenu_var4 = 16;
pausemenu_var5 = 100;
pausemenu_var6 = 164;
pausemenu_var7 = 196;
pausemenu_var8 = 208;
}
void Smbll_MaybePauseMenu_State1() {
uint8 v0; // al
OamEnt *oam; // rbp
Smbll_DrawPauseMenuLetters();
tempF2 = controller_press1p1;
if ((controller_press1p1 & 0x2C) != 0) {
if (!cutscene_var1680 || (cutscene_var1680 & 0x10) == 16) {
if ((tempF2 & 0x20) != 0) {
if (++pausemenu_var1 >= 3u)
pausemenu_var1 = 0;
sound_ch3 = 1;
blinking_cursor_frame_counter = 0;
} else {
if ((tempF2 & 8) == 0) {
if (++pausemenu_var1 >= 3u) {
--pausemenu_var1;
goto LABEL_20;
}
goto LABEL_13;
}
if ((--pausemenu_var1 & 0x80u) == 0) {
sound_ch3 = 1;
blinking_cursor_frame_counter = 0;
} else {
++pausemenu_var1;
}
}
} else {
if ((tempF2 & 0x20) != 0) {
v0 = pausemenu_var1 ^ 2;
LABEL_6:
pausemenu_var1 = v0;
LABEL_13:
sound_ch3 = 1;
blinking_cursor_frame_counter = 0;
goto LABEL_20;
}
v0 = (uint8)(tempF2 & 4) >> 1;
if (v0 != pausemenu_var1)
goto LABEL_6;
}
}
LABEL_20:
oam = get_OamEnt(oam_buf, 0);
oam->xpos = 76;
oam->ypos = kbyte_2DB91[pausemenu_var1];
oam->charnum = kbyte_2DB94[(uint8)(blinking_cursor_frame_counter & 0x10) >> 4];
oam->flags = 33;
oam_tile_size_buffer[0] = 0;
++blinking_cursor_frame_counter;
if ((tempF2 & 0x10) != 0) {
music_ch1 = -14;
blinking_cursor_frame_counter = 0;
if (pausemenu_var1) {
pausemenu_var2 = 48;
pause_menu_idx = 2;
sound_ch1 = 59;
if (pausemenu_var1 == 2)
music_ch1 = -13;
} else {
pausemenu_var2 = 16;
LOBYTE(pausemenu_var4) = 16;
pause_menu_idx = 2;
sound_ch1 = 67;
}
if (cutscene_var1680 != 16 || pausemenu_var1 == 2) {
pausemenu_var2 = 32;
if (pausemenu_var1)
Smbll_SaveGame_Main();
} else {
display_pause_menu_flag = 0;
game_mode_task = 14;
if (pausemenu_var1)
Smbll_SaveGame_Main();
}
}
}
void Smbll_DrawPauseMenuLetters() {
uint16 v0; // di
uint16 v1; // si
int8 v2; // al
OamEnt *oam; // rdx
uint8 v4; // al
OamEnt *v5; // rdx
OamEnt *v6; // rbp
v0 = 16;
v1 = 0;
R1_ = 72;
LABEL_2:
R0_ = 88;
while (1) {
if (cutscene_var1680 && (cutscene_var1680 & 0x10) != 16) {
v2 = kbyte_2DBE5[v1];
if (v2 < 0) {
++v1;
if (v2 == -1)
break;
goto LABEL_10;
}
LABEL_12:
oam = get_OamEnt(oam_buf, v0);
oam->charnum = v2 - 64;
oam->xpos = R0_;
oam->ypos = R1_;
oam->flags = 33;
oam_tile_size_buffer[v0] = 0;
++v1;
v0 += 4;
goto LABEL_10;
}
v2 = kbyte_2DB96[v1];
if (v2 >= 0)
goto LABEL_12;
++v1;
if (v2 == -1)
break;
LABEL_10:
R0_ += 8;
if (R0_ >= 0xC0u) {
R1_ += 8;
goto LABEL_2;
}
}
for (R1_ = 64;; R1_ += 16) {
R0_ = 64;
do {
v4 = R0_;
v5 = get_OamEnt(oam_buf, v0);
v5->xpos = R0_;
R0_ = v4 + 16;
v5->ypos = R1_;
v5->charnum = -51;
v5->flags = 33;
oam_tile_size_buffer[v0] = 2;
v0 += 4;
} while (R0_ < 0xC0u);
if (R1_ >= 0x80u)
break;
}
v6 = get_OamEnt(oam_buf, 0);
v6->xpos = 76;
v6->ypos = kbyte_2DB91[pausemenu_var1];
v6->charnum = kbyte_2DB94[(uint8)(blinking_cursor_frame_counter & 0x10) >> 4];
v6->flags = 33;
oam_tile_size_buffer[0] = 0;
}
void Smbll_MaybePauseMenu_State0() {
uint16 i; // si
int v1; // rbp
int16 v2; // ax
uint16 v3; // ax
uint16 v4; // si
if ((int8)pausemenu_var4 <= 0) {
++pause_menu_idx;
} else {
--pausemenu_var4;
--pausemenu_var5;
--pausemenu_var5;
++pausemenu_var6;
++pausemenu_var6;
--pausemenu_var7;
--pausemenu_var7;
--pausemenu_var7;
--pausemenu_var7;
++pausemenu_var8;
++pausemenu_var8;
++pausemenu_var8;
++pausemenu_var8;
for (i = 126; (i & 0x8000u) == 0; i -= 2) {
v1 = i >> 1;
hdma_data_array[v1] = 255;
hdma_data_array[v1 + 64] = 255;
hdma_data_array[v1 + 128] = 255;
hdma_data_array[v1 + 192] = 255;
}
LOBYTE(v2) = HIBYTE(pausemenu_var6);
HIBYTE(v2) = pausemenu_var6;
v3 = pausemenu_var5 | v2;
v4 = pausemenu_var7;
do {
hdma_data_array[v4 >> 1] = v3;
v4 += 2;
} while (v4 != pausemenu_var8);
}
Smbll_DrawPauseMenuLetters();
}
void Smbll_MaybePauseMenu_State3() {
uint16 i; // si
int v1; // rbp
int16 v2; // ax
uint16 v3; // ax
uint16 v4; // si
if ((int8)pausemenu_var4 <= 0) {
pause_menu_idx = 0;
inidisp_mirror = 15;
display_pause_menu_flag = 0;
wobjsel_mirror ^= 3u;
tmw_mirror ^= 0x10u;
Smbll_PauseMenu_Func4();
Smbll_ResetAllSpriteOams_Far();
hdmaenable_mirror &= ~8u;
} else {
++pausemenu_var5;
++pausemenu_var5;
--pausemenu_var6;
--pausemenu_var6;
++pausemenu_var7;
++pausemenu_var7;
++pausemenu_var7;
++pausemenu_var7;
--pausemenu_var8;
--pausemenu_var8;
--pausemenu_var8;
--pausemenu_var8;
--pausemenu_var4;
for (i = 126; (i & 0x8000u) == 0; i -= 2) {
v1 = i >> 1;
hdma_data_array[v1] = 255;
hdma_data_array[v1 + 64] = 255;
hdma_data_array[v1 + 128] = 255;
hdma_data_array[v1 + 192] = 255;
}
LOBYTE(v2) = HIBYTE(pausemenu_var6);
HIBYTE(v2) = pausemenu_var6;
v3 = pausemenu_var5 | v2;
v4 = pausemenu_var7;
do {
hdma_data_array[v4 >> 1] = v3;
v4 += 2;
} while (v4 != pausemenu_var8);
Smbll_DrawPauseMenuLetters();
}
}
void Smbll_MaybePauseMenu_State2() {
if (!--pausemenu_var2 &&
((++pause_menu_idx, LOBYTE(pausemenu_var4) = 16, pausemenu_var2 = 16, cutscene_var1680 == 1) || pausemenu_var1 == 2)) {
Smbll_ResetGame_Main();
} else {
Smbll_DrawPauseMenuLetters();
}
}
void Smbll_PauseMenu_Func7_Hdma_05E21F() {
uint16 i; // si
int v1; // rbp
for (i = 126; (i & 0x8000u) == 0; i -= 2) {
v1 = i >> 1;
hdma_data_array[v1] = 0;
hdma_data_array[v1 + 64] = 0;
hdma_data_array[v1 + 128] = 0;
hdma_data_array[v1 + 192] = 0;
}
WriteRegWord(DMAP3, 0x2641u);
WriteRegWord(A1T3L, 0xDE7Eu);
WriteReg(A1B3, 2u);
WriteReg(DAS30, 0x7Fu);
w12sel_mirror = 0;
w34sel_mirror = 0;
wobjsel_mirror |= 3u;
tmw_mirror |= 0x10u;
tsw_mirror = 0;
hdmaenable_mirror |= 8u;
}
void Smbll_PauseMenu_Func1() {
uint16 i; // si
int v1; // rbp
for (i = 416; (i & 0x8000u) == 0; i -= 32) {
v1 = i >> 1;
hdma_data_array[v1] = 255;
hdma_data_array[v1 + 1] = 255;
hdma_data_array[v1 + 2] = 255;
hdma_data_array[v1 + 3] = 255;
hdma_data_array[v1 + 4] = 255;
hdma_data_array[v1 + 5] = 255;
hdma_data_array[v1 + 6] = 255;
hdma_data_array[v1 + 7] = 255;
hdma_data_array[v1 + 8] = 255;
hdma_data_array[v1 + 9] = 255;
hdma_data_array[v1 + 10] = 255;
hdma_data_array[v1 + 11] = 255;
hdma_data_array[v1 + 12] = 255;
hdma_data_array[v1 + 13] = 255;
hdma_data_array[v1 + 14] = 255;
hdma_data_array[v1 + 15] = 255;
hdma_data_array_2[v1] = 255;
hdma_data_array_2[v1 + 1] = 255;
hdma_data_array_2[v1 + 2] = 255;
hdma_data_array_2[v1 + 3] = 255;
hdma_data_array_2[v1 + 4] = 255;
hdma_data_array_2[v1 + 5] = 255;
hdma_data_array_2[v1 + 6] = 255;
hdma_data_array_2[v1 + 7] = 255;
hdma_data_array_2[v1 + 8] = 255;
hdma_data_array_2[v1 + 9] = 255;
hdma_data_array_2[v1 + 10] = 255;
hdma_data_array_2[v1 + 11] = 255;
hdma_data_array_2[v1 + 12] = 255;
hdma_data_array_2[v1 + 13] = 255;
hdma_data_array_2[v1 + 14] = 255;
hdma_data_array_2[v1 + 15] = 255;
}
}
uint8 Smbll_DebugCode() {
uint8 v0; // al
bool v1; // cf
uint8 v2; // di
if ((*(&controller_press2p1 + current_player_mirror) & 0xC0) != 0) {
if ((*(&controller_press2p1 + current_player_mirror) & 0x80) != 0) {
player_size = 0;
player_status = 1;
} else {
player_size = 0;
player_status = 2;
}
}
if ((controller_press1p1 & 0x20) != 0) {
level_free_movement_debug_flag ^= controller_press1p1 & 0x20;
disable_collision_detection = level_free_movement_debug_flag >> 5;
}
if (!level_free_movement_debug_flag)
return 1;
player_star_power_timer = 16;
if ((controller_hold2p1 & 0x10) == 0 || (frame_counter & 7) != 0) {
if ((frame_counter & 7) == 0 && (controller_press1p1 & 0x80u) != 0) {
player_size ^= 1u;
player_status ^= 2u;
Smbll_GetPlayerColors();
}
v0 = saved_joypad_bits & 3;
if ((saved_joypad_bits & 3) != 0) {
player_facing_dir = buttons_left_right;
v1 = __CFADD__(kbyte_2DFED[v0 - 1], obj_xpos_lo.player);
obj_xpos_lo.player += kbyte_2DFED[v0 - 1];
obj_xpos_hi.player += kbyte_2DFEF[v0 - 1] + v1;
}
if ((saved_joypad_bits & 0xC) != 0) {
v2 = (uint8)(saved_joypad_bits & 0xC) >> 2;
v1 = __CFADD__(kbyte_2DFED[v2 - 1], obj_ypos_lo.player);
obj_ypos_lo.player += kbyte_2DFED[v2 - 1];
obj_ypos_hi.player += kbyte_2DFEF[v2 - 1] + v1;
}
} else if (saved_joypad_bits & 1) {
level_timer_tens = 9;
level_timer_ones = 9;
level_timer_hundreds = 9;
} else if ((saved_joypad_bits & 2) != 0) {
level_timer_tens = 0;
level_timer_ones = 0;
level_timer_hundreds = 0;
level_free_movement_debug_flag = 0;
} else if ((saved_joypad_bits & 4) == 0 && (saved_joypad_bits & 8) != 0) {
Smbll_GiveExtraLife();
}
return 0;
}
void Smbll_InitializeContactSprite(uint8 k) {
uint8 v1; // di
int16 v2; // ax
int16 v3; // ax
v1 = 0;
while (contact_sprite_arr1[v1]) {
if (++v1 == 5) {
v1 = 0;
break;
}
}
contact_sprite_arr1[v1] = 1;
HIBYTE(v2) = obj_xpos_hi.enemy[k];
LOBYTE(v2) = obj_xpos_lo.enemy[k];
if ((obj_xspeed.enemy[k] & 0x80u) == 0)
v3 = v2 + 8;
else
v3 = v2 - 8;
contact_sprite_x_lo[v1] = v3;
contact_sprite_x_hi[v1] = HIBYTE(v3);
contact_sprite_y[v1] = rel_ypos.enemy + 12;
}
void Smbll_ProcessContactSprites() {
uint8 i; // si
uint8 v1; // di
uint8 v2; // al
uint8 v3; // al
for (i = 0; i != 5; ++i) {
v1 = kbyte_2E268[i];
v2 = contact_sprite_arr1[i];
if (v2) {
v3 = v2 & 0xC;
tempE4 = v3;
if (v3) {
if (v3 == 4) {
Smbll_ContactSprite_Func3(i, v1);
} else if (v3 == 8) {
Smbll_CODE_05D3B4(i, v1);
} else {
contact_sprite_arr1[i] = 0;
}
} else {
Smbll_ContactSprite_Func1(i, v1);
}
}
}
}
void Smbll_ContactSprite_Func1(uint8 k, uint8 j) {
OamEnt *oam; // rbp
uint8 v3; // al
Smbll_ContactSprite_Func2(k);
oam = get_OamEnt(oam_buf, j);
oam->ypos = contact_sprite_some_y_pos + 4;
oam->charnum = 38;
oam->flags = 37;
contact_sprite_some_x_pos = contact_sprite_some_x_pos + 4 - screen_left_xpos16;
oam->xpos = contact_sprite_some_x_pos;
v3 = HIBYTE(contact_sprite_some_x_pos);
if (HIBYTE(contact_sprite_some_x_pos))
v3 = 1;
oam_tile_size_buffer[j] = v3;
++contact_sprite_arr1[k];
}
void Smbll_ContactSprite_Func3(uint8 k, uint8 j) {
OamEnt *oam; // rbp
uint8 v3; // al
Smbll_ContactSprite_Func2(k);
oam = get_OamEnt(oam_buf, j);
oam->ypos = contact_sprite_some_y_pos;
oam->charnum = 96;
oam->flags = 37;
contact_sprite_some_x_pos -= screen_left_xpos16;
oam->xpos = contact_sprite_some_x_pos;
if (HIBYTE(contact_sprite_some_x_pos))
v3 = 3;
else
v3 = 2;
oam_tile_size_buffer[j] = v3;
++contact_sprite_arr1[k];
}
void Smbll_CODE_05D3B4(uint8 k, uint8 j) {
uint8 v2; // si
uint8 v3; // al
OamEnt *oam; // rbp
uint8 v5; // al
uint8 v6; // al
uint8 v7; // al
uint8 v8; // al
uint8 v9; // al
tempF1 = k;
Smbll_ContactSprite_Func2(k);
v2 = contact_sprite_arr1[k] & 3;
v3 = kbyte_2E1A7[v2] + contact_sprite_some_y_pos;
oam = get_OamEnt(oam_buf, j);
oam->ypos = v3;
oam[1].ypos = v3;
v5 = kbyte_2E1AB[v2] + contact_sprite_some_y_pos + 8;
oam[2].ypos = v5;
oam[3].ypos = v5;
oam->charnum = 57;
oam[1].charnum = 57;
oam[2].charnum = 57;
oam[3].charnum = 57;
oam->flags = 37;
oam[1].flags = 37;
oam[2].flags = 37;
oam[3].flags = 37;
tempEF = kbyte_2E1A7[v2];
tempF0 = -1;
*(uint16 *)&tempED = *(uint16 *)&tempEF + contact_sprite_some_x_pos - screen_left_xpos16;
v6 = tempEF + contact_sprite_some_x_pos - screen_left_xpos16;
oam->xpos = v6;
oam[2].xpos = v6;
v7 = tempEE;
if (tempEE)
v7 = 1;
oam_tile_size_buffer[j] = v7;
oam_tile_size_buffer[j + 8] = v7;
tempEF = kbyte_2E1AB[v2];
tempF0 = 0;
*(uint16 *)&tempED = *(uint16 *)&tempEF + contact_sprite_some_x_pos + 8 - screen_left_xpos16;
v8 = tempEF + contact_sprite_some_x_pos + 8 - screen_left_xpos16;
oam[1].xpos = v8;
oam[3].xpos = v8;
v9 = tempEE;
if (tempEE)
v9 = 1;
oam_tile_size_buffer[j + 4] = v9;
oam_tile_size_buffer[j + 12] = v9;
++contact_sprite_arr1[tempF1];
}
void Smbll_ContactSprite_Func2(uint8 k) {
uint16 v1; // ax
contact_sprite_some_y_pos = contact_sprite_y[k];
HIBYTE(v1) = contact_sprite_x_hi[k];
LOBYTE(v1) = contact_sprite_x_lo[k];
contact_sprite_some_x_pos = v1;
}
void Smbll_CheckIfBowserTouchedLava() {
uint8 i; // si
uint8 v1; // al
uint8 v2; // si
uint8 v3; // al
if (bowser_var0201 != 1 && world_number != 8 && obj_yspeed.bubble[0] == 3) {
if (bowser_var0096) {
LABEL_16:
Smbll_CheckIfBowserTouchedLava_Sub2();
goto LABEL_17;
}
if (bowser_enemy_slot_plus1) {
for (i = 8; (i & 0x80u) == 0; --i) {
if (enemy_id[i] == 45) {
if (obj_ypos_lo.enemy[i] < 0xB8u)
goto LABEL_17;
if ((enemy_flag[i] & 0x80u) == 0) {
v1 = obj_xpos_lo.enemy[i];
LOBYTE(bowser_xpos16) = v1 + 16;
HIBYTE(bowser_xpos16) = __CFADD__(v1, 16) + obj_xpos_hi.enemy[i];
bowser_var0096 = 8;
goto LABEL_15;
}
}
}
v2 = bowser_enemy_slot_plus1 - 1;
if (obj_ypos_lo.enemy[(uint8)(bowser_enemy_slot_plus1 - 1)] < 0xB8u)
goto LABEL_17;
v3 = obj_xpos_lo.enemy[v2];
LOBYTE(bowser_xpos16) = v3 + 4;
HIBYTE(bowser_xpos16) = __CFADD__(v3, 4) + obj_xpos_hi.enemy[v2];
bowser_var0096 = 4;
LABEL_15:
sound_ch1 = 37;
sound_ch3 = 32;
goto LABEL_16;
}
}
LABEL_17:
Smbll_HandlePaletteAnimations();
}
void Smbll_CheckIfBowserTouchedLava_Sub2() {
uint8 v0; // si
uint8 v1; // di
OamEnt *oam; // rdx
uint8 v3; // al
tempE4 = bowser_var0096;
if ((uint8)(++bowser_timer_02f9 >> 2) >= 6u) {
bowser_enemy_slot_plus1 = 0;
bowser_var0096 = 0;
} else {
tempDD = bowser_timer_02f9 >> 2;
v0 = 8 * (bowser_timer_02f9 >> 2);
v1 = 32;
tempE9 = 0;
do {
tempE8 = (v0 & 1) - 1;
tempE7 = kbyte_2E35E[v0];
*(uint16 *)&tempE7 = bowser_xpos16 + *(uint16 *)&tempE7 - screen_left_xpos16;
oam = get_OamEnt(oam_buf, v1);
oam->xpos = tempE7;
v3 = tempE8;
if (tempE8)
v3 = 0;
oam_tile_size_buffer[v1] = tempE9 | v3;
oam->ypos = kbyte_2E386[v0] - 40;
oam->charnum = kbyte_2E3B7[tempDD];
oam->flags = kbyte_2E3AE[tempE4];
v1 += 4;
++v0;
--tempE4;
} while (tempE4);
}
}
void Smbll_MovePodoboo_Sub1(uint8 k) {
uint8 v1; // al
uint8 v2; // al
int v3; // rbp
uint8 v4; // di
uint8 v5; // di
uint8 v6; // si
OamEnt *oam; // rbx
int16 v8; // [rsp+43h] [rbp-5h]
if (podoboo_array_1[k] == 2) {
v2 = podoboo_array_2[k] >> 3;
if (v2 < 5u) {
tempEB = podoboo_array_2[k] >> 3;
R0_ = obj_xpos_lo.enemy[k];
R1_ = obj_xpos_hi.enemy[k];
v8 = *(uint16 *)&R0_ + 8 - screen_left_xpos16;
v3 = (uint8)(2 * v2) >> 1;
*(uint16 *)&R0_ = kword_2E46B[v3] + v8;
*(uint16 *)&R2_ = kword_2E475[v3] + v8;
v4 = tempEB;
podoboo_array_3[k] += kbyte_2E493[tempEB];
R4_ = podoboo_array_3[k] + kbyte_2E47F[v4];
tempED = podoboo_array_3[k] + kbyte_2E484[v4];
v5 = enemy_obj_id[k] + 4;
v6 = tempEB;
oam = get_OamEnt(oam_buf, v5);
oam[64].xpos = R0_;
oam[65].xpos = R2_;
oam[64].ypos = R4_;
oam[65].ypos = tempED;
oam[64].charnum = kbyte_2E489[v6];
oam[65].charnum = kbyte_2E48E[v6];
oam[64].flags = 40;
oam[65].flags = 40;
if (R1_)
oam_tile_size_buffer[v5 + 256] = 1;
if (R3_)
oam_tile_size_buffer[v5 + 260] = 1;
} else {
podoboo_array_2[k] = 48;
}
} else if (podoboo_array_1[k] & 1) {
v1 = podoboo_array_2[k] >> 2;
if (v1 == 6) {
++podoboo_array_1[k];
podoboo_array_2[k] = 0;
if (podoboo_array_1[k] == 2)
podoboo_array_3[k] = obj_ypos_lo.enemy[k];
} else {
tempED = kbyte_2E405[v1];
R0_ = obj_xpos_lo.enemy[k];
R1_ = obj_xpos_hi.enemy[k];
*(uint16 *)&R0_ = *(uint16 *)&R0_ + 8 - screen_left_xpos16;
tempF2 = enemy_obj_id[k] + 4;
Smbll_MovePodoboo_Sub2(v1);
}
}
}
void Smbll_MovePodoboo_Sub2(uint8 j) {
uint8 i; // si
uint8 v2; // di
uint8 v3; // di
OamEnt *oam; // rbx
tempEC = j;
for (i = 0; i != 4; ++i) {
tempEB = 4 * tempEC;
v2 = 4 * tempEC + i;
tempEE = kbyte_2E3ED[v2] - 40;
if (!area_type)
tempEE = -16;
tempEF = kbyte_2E40B[i];
*(uint16 *)&tempF0 = *(uint16 *)&R0_ + kword_2E3BD[(uint8)(2 * v2) >> 1];
v3 = tempF2 + 4 * i;
oam = get_OamEnt(oam_buf, v3);
oam[64].xpos = tempF0;
oam[64].ypos = tempEE;
oam[64].charnum = tempED;
oam[64].flags = tempEF;
if (tempF1)
oam_tile_size_buffer[v3 + 256] = 1;
}
}
void Smbll_HandleTurnAroundSmoke() {
if (!turn_around_smoke_flag)
Smbll_TurnAroundSmoke_Sub1();
Smbll_TurnAroundSmoke_Sub2();
if ((turn_around_smoke_bits[0] & 0x20) != 0) {
turn_around_smoke_flag = 0;
turn_around_smoke_flag2 = 0;
}
}
void Smbll_TurnAroundSmoke_Sub1() {
uint8 i; // si
for (i = 3; (i & 0x80u) == 0; --i)
turn_around_smoke_bits[i] = kbyte_2E5A0[i];
++turn_around_smoke_flag;
}
void Smbll_TurnAroundSmoke_Sub2() {
uint8 v0; // si
uint8 v1; // di
uint8 v2; // al
uint8 v3; // al
OamEnt *oam; // rbp
v0 = 3;
v1 = 48;
do {
v2 = turn_around_smoke_bits[v0];
if ((v2 & 0x80u) != 0)
goto LABEL_7;
if (!v2)
v2 = Smbll_TurnAroundSmoke_Sub3(v0);
v3 = v2 >> 2;
if (v3 >= 3u) {
LABEL_7:
get_OamEnt(oam_buf, v1)->ypos = -8;
} else {
oam = get_OamEnt(oam_buf, v1);
oam->charnum = kbyte_2E59C[v3];
oam->flags = 56;
oam->xpos = turn_around_smoke_xpos[v0] - screen_left_xpos_lo;
oam->ypos = turn_around_smoke_ypos[v0];
}
v1 += 4;
++turn_around_smoke_bits[v0--];
} while ((v0 & 0x80u) == 0);
}
uint8 Smbll_TurnAroundSmoke_Sub3(uint8 k) {
uint8 v1; // al
uint8 result; // al
if (player_facing_dir & 1)
v1 = obj_xpos_lo.player + 6;
else
v1 = obj_xpos_lo.player + 2;
turn_around_smoke_xpos[k] = v1;
if (player_gfx_offset == 24 || player_gfx_offset == 120) {
result = kbyte_2E598[0] + __CFADD__(rel_ypos.player, (random_byte2 & 4) - 2) + rel_ypos.player + (random_byte2 & 4) - 2;
turn_around_smoke_ypos[k] = result;
} else {
result = -8;
turn_around_smoke_ypos[k] = -8;
}
return result;
}
void Smbll_DrawTitleScreen_Sub() {
uint16 v0; // si
uint16 i; // di
uint16 v2; // ax
UNUSED_byte_7E0EC8 = 1;
v0 = *(uint16 *)vram_buffer1;
for (i = 0;; i += 2) {
v2 = kTitleScreenLogoAndMenuStripeImage[i >> 1];
*(uint16 *)&vram_buffer1[v0 + 2] = v2;
if (v2 == 0xFFFF)
break;
v0 += 2;
}
*(uint16 *)vram_buffer1 = v0;
smbll_varF2B = 0;
Smbll_LoadFileSelectMenu_Main();
}
void Smbll_DrawVine(uint8 j) {
int v1; // rdi
uint8 enemy; // al
OamEnt *oam; // rdx
int8 i; // si
uint8 v5; // si
uint8 v6; // di
R0_ = j;
R2_ = enemy_obj_id[vine_obj_offset[j]];
v1 = R2_;
Smbll_DrawVine_Sub(R2_, rel_ypos.enemy - 1);
enemy = rel_xpos_lo.enemy;
oam = get_OamEnt(oam_buf, (uint8)v1);
oam[64].xpos = rel_xpos_lo.enemy;
oam[66].xpos = enemy;
oam[68].xpos = enemy;
oam[65].xpos = enemy;
oam[67].xpos = enemy;
oam[69].xpos = enemy;
oam[70].xpos = enemy;
oam[71].xpos = enemy;
oam[72].xpos = enemy;
oam[64].flags = 27;
oam[66].flags = 27;
oam[68].flags = 27;
oam[65].flags = 27;
oam[67].flags = 27;
oam[69].flags = 27;
oam[70].flags = 27;
oam[71].flags = 27;
oam[72].flags = 27;
for (i = 8; i >= 0; --i) {
get_OamEnt(oam_buf, (uint8)v1)[64].charnum = 44;
LOBYTE(v1) = v1 + 4;
}
if (!R0_)
get_OamEnt(oam_buf, R2_)[64].charnum = 42;
v5 = (vine_height >> 4) + 1;
v6 = R2_ + 4 * v5;
while (v5 < 9u) {
get_OamEnt(oam_buf, v6)[64].ypos = -16;
v6 += 4;
++v5;
}
}
void Smbll_DrawVine_Sub(uint8 j, uint8 a) {
int8 v2; // si
OamEnt *oam; // rbp
uint8 v4; // al
uint8 v5; // [rsp+47h] [rbp-1h]
v2 = 9;
do {
oam = get_OamEnt(oam_buf, j);
oam[64].ypos = a;
v5 = a;
tempE4 = obj_xpos_lo.enemy[9];
tempE5 = obj_xpos_hi.enemy[9];
*(uint16 *)&tempE4 -= screen_left_xpos16;
tempDD = 2;
v4 = tempE5;
if (tempE5)
v4 = 1;
oam_tile_size_buffer[j + 256] = tempDD | v4;
if (!vine_at_entrance_flag && (int8)oam[64].ypos <= -17)
oam[64].ypos = -16;
a = v5 + 16;
j += 4;
--v2;
} while (v2);
}
void Smbll_SpinningCoinSprite_Draw2() {
uint8 v0; // di
OamEnt *v1; // rbp
uint8 v2; // al
uint8 v3; // si
OamEnt *oam; // rbp
v0 = bubble_obj_id[0];
spinning_coin_xpos0E6B = spinning_coin_sprite_xpos - screen_left_xpos16;
if (spinning_coin_ctr2) {
if (spinning_coin_ctr2 < 6u) {
Smbll_SpinningCoinSprite_Draw3(bubble_obj_id[0]);
v3 = 4 * (spinning_coin_ctr2 - 1);
R4_ = 3;
do {
oam = get_OamEnt(oam_buf, v0);
oam->charnum = kbyte_2EAB8[v3];
oam->flags = kbyte_2EACC[v3];
v0 += 4;
++v3;
--R4_;
} while ((R4_ & 0x80u) == 0);
if (!--spinning_coin_ctr) {
spinning_coin_ctr = 6;
++spinning_coin_ctr2;
}
}
} else {
v1 = get_OamEnt(oam_buf, bubble_obj_id[0]);
v1->ypos = spinning_coin_sprite_ypos;
v2 = spinning_coin_xpos0E6B;
Smbll_SetTwoTileSizes(v0, spinning_coin_xpos0E6B);
v1->xpos = v2;
v1->charnum = 38;
v1->flags = 41;
if (!--spinning_coin_ctr) {
spinning_coin_ctr = 6;
++spinning_coin_ctr2;
}
}
}
void Smbll_SpinningCoinSprite_Draw(uint8 k, uint8 j) {
OamEnt *oam; // rbp
if (!(frame_counter & 1))
--obj_ypos_lo.misc[k];
oam = get_OamEnt(oam_buf, j);
oam->ypos = obj_ypos_lo.misc[k];
oam->xpos = rel_xpos_lo.misc;
oam_tile_size_buffer[j] = 2;
oam->flags = 35;
oam->charnum = 46;
Smbll_SpinningCoinSprite_Draw2();
}
void Smbll_SpinningCoinSprite_Draw3(uint8 j) {
uint8 v1; // si
int16 v2; // ax
OamEnt *oam; // rbp
uint8 v4; // al
uint8 v5; // al
int16 v6; // ax
uint8 v7; // al
uint8 v8; // al
v1 = spinning_coin_ctr2;
v2 = spinning_coin_xpos0E6B + (kbyte_2EAA6[spinning_coin_ctr2] | 0xFF00);
oam = get_OamEnt(oam_buf, j);
oam->xpos = spinning_coin_xpos0E6B + kbyte_2EAA6[spinning_coin_ctr2];
oam[1].xpos = v2;
Smbll_SetTwoTileSizes(j, v2);
if (HIBYTE(v2)) {
oam_tile_size_buffer[j] = 1;
oam_tile_size_buffer[j + 4] = 1;
}
v4 = spinning_coin_sprite_ypos + kbyte_2EAB2[v1];
oam->ypos = v4;
v5 = v4 + 8;
oam[1].ypos = v5;
if (v5 < 0xF8u && v5 >= 0xB0u) {
oam->ypos = -16;
oam[1].ypos = -16;
}
v6 = spinning_coin_xpos0E6B + kbyte_2EAAC[v1];
oam[2].xpos = v6;
oam[3].xpos = v6;
Smbll_SetTwoTileSizes(j, v6);
if (HIBYTE(v6)) {
oam_tile_size_buffer[j + 8] = 1;
oam_tile_size_buffer[j + 12] = 1;
}
v7 = spinning_coin_sprite_ypos + kbyte_2EAB2[v1];
oam[2].ypos = v7;
v8 = v7 + 8;
oam[3].ypos = v8;
if (v8 < 0xF8u && v8 >= 0xB0u) {
oam[2].ypos = -16;
oam[3].ypos = -16;
}
}
void Smbll_SetTwoTileSizes(uint8 j, uint8 a) {
if (a >= 0xF8u) {
oam_tile_size_buffer[j] = 1;
oam_tile_size_buffer[j + 4] = 1;
}
}
void Smbll_SpinningCoinSprite_Init(uint8 k) {
spinning_coin_sprite_ypos = obj_ypos_lo.misc[k] + 4;
LOBYTE(spinning_coin_sprite_xpos) = obj_xpos_lo.misc[k];
HIBYTE(spinning_coin_sprite_xpos) = obj_xpos_hi.misc[k];
spinning_coin_ctr = 6;
spinning_coin_ctr2 = 0;
}
void Smbll_DrawSpinningCoinSprite(uint8 k) {
uint8 v1; // di
uint8 v2; // al
OamEnt *oam; // rdx
uint8 v4; // al
v1 = misc_spr_oam_id[k];
if (misc_state[k] < 2u) {
if ((obj_yspeed.misc[k] & 0x80u) != 0) {
v2 = obj_ypos_lo.misc[k];
if (v2 >= 0xB0u)
v2 = -16;
oam = get_OamEnt(oam_buf, v1);
oam->ypos = v2;
tempE4 = rel_xpos_lo.misc - 4;
if ((uint8)(rel_xpos_lo.misc - 4) >= 0xF0u)
v4 = 3;
else
v4 = 2;
oam_tile_size_buffer[v1] = v4;
oam->xpos = tempE4;
oam->charnum = kbyte_2EB0D[(frame_counter >> 1) & 3];
oam->flags = 40;
} else {
Smbll_SpinningCoinSprite_Draw2();
}
} else {
Smbll_SpinningCoinSprite_Draw(k, v1);
}
}
void Smbll_DrawHammer(uint8 k) {
uint8 v1; // di
uint8 v2; // si
OamEnt *oam; // rbp
v1 = misc_spr_oam_id[k];
if (!timer_control && (misc_state[k] & 0x7F) == 1)
v2 = (frame_counter >> 2) & 3;
else
v2 = 0;
oam = get_OamEnt(oam_buf, v1);
oam->ypos = kHammerFirstSprYPos[v2] + rel_ypos.misc;
*(uint16 *)&tempE4 = spr_rel_xpos16[6] + kHammerFirstSprXPos[v2] - 8;
oam->xpos = tempE4;
oam_tile_size_buffer[v1] = 2;
if (tempE5)
oam_tile_size_buffer[v1] = 3;
oam->charnum = kHammerSecondSprTilenum[v2];
oam->flags = kHammerSprAttrib[v2];
if ((offscreen_bits.misc & 0xF) == 15 || (offscreen_bits.misc & 0xF0) != 0)
misc_state[object_index] = 0;
}
void Smbll_CompressOAMTileSizeBuffer() {
uint16 v0; // si
uint16 v1; // di
uint8 v2; // al
int8 v3; // cf
uint8 v4; // al
int8 v5; // cl
uint8 v6; // al
int8 v7; // cl
uint16 v8; // di
uint8 v9; // al
uint8 v10; // al
int8 v11; // cl
uint8 v12; // al
int8 v13; // cl
v0 = 0;
v1 = 0;
do {
v2 = oam_tile_size_buffer[v0 + 12];
v3 = v2 & 1;
v4 = v2 >> 1;
v5 = 0;
if (v3)
v5 = 0x80;
v3 = v4 & 1;
v6 = (v4 >> 1) + v5;
v7 = 0;
if (v3)
v7 = 0x80;
oam_tile_size_buffer[1] = (v6 >> 1) + v7;
oam_tile_size_buffer[1] |= 16 * oam_tile_size_buffer[v0 + 8];
oam_tile_size_buffer[1] |= 4 * oam_tile_size_buffer[v0 + 4];
compressed_oam_size_buf[v1] = oam_tile_size_buffer[1] | oam_tile_size_buffer[v0];
v8 = v1 + 1;
v9 = oam_tile_size_buffer[v0 + 28];
v3 = v9 & 1;
v10 = v9 >> 1;
v11 = 0;
if (v3)
v11 = 0x80;
v3 = v10 & 1;
v12 = (v10 >> 1) + v11;
v13 = 0;
if (v3)
v13 = 0x80;
oam_tile_size_buffer[1] = (v12 >> 1) + v13;
oam_tile_size_buffer[1] |= 16 * oam_tile_size_buffer[v0 + 24];
oam_tile_size_buffer[1] |= 4 * oam_tile_size_buffer[v0 + 20];
compressed_oam_size_buf[v8] = oam_tile_size_buffer[1] | oam_tile_size_buffer[v0 + 16];
v1 = v8 + 1;
v0 += 32;
} while (v0 < 0x200u);
}
void Smbll_DrawBubble(uint8 k) {
OamEnt *oam; // rdx
int8 v2; // al
if (!draw_bubble_var3 && obj_ypos_hi.player == 1 && (offscreen_bits.bubble & 8) == 0) {
oam = get_OamEnt(oam_buf, bubble_obj_id[k]);
oam->xpos = rel_xpos_lo.bubble;
oam->ypos = rel_ypos.bubble;
oam->charnum = -97;
if (game_engine_subroutine == 7)
v2 = 10;
else
v2 = 42;
oam->flags = v2;
}
}
void Smbll_HandlePaletteAnimations() {
uint8 v0; // al
int v1; // rbp
uint8 v2; // si
uint8 v3; // al
int v4; // rbp
int v5; // rbp
int v6; // rbp
int v7; // rbp
int v8; // rbx
if (error_screen_palette_mirror)
return;
if ((++palette_animation_frame_counter & 7) == 0) {
v0 = ++coin_palette_animation_frame_counter;
if (coin_palette_animation_frame_counter == 3) {
coin_palette_animation_frame_counter = 0;
v0 = 0;
}
v1 = (uint8)(8 * v0) >> 1;
palette_mirror[19] = kword_2EC80[v1];
palette_mirror[5] = kword_2ECC8[v1];
palette_mirror[22] = kword_2EC98[v1];
palette_mirror[20] = kword_2EC80[v1 + 1];
palette_mirror[6] = kword_2ECC8[v1 + 1];
palette_mirror[23] = kword_2EC98[v1 + 1];
palette_mirror[21] = kword_2EC80[v1 + 2];
palette_mirror[7] = kword_2ECC8[v1 + 2];
palette_mirror[24] = kword_2EC98[v1 + 2];
if (!smbll_varF26)
goto LABEL_7;
v2 = smbll_varF26 - 1;
tempE4 = koff_2EDDA[v2];
tempE5 = HIBYTE(koff_2EDDA[v2]);
tempE6 = 5;
switch ((unsigned int)(v2 * 2) >> 1) {
case 0u:
v5 = (uint8)((uint8)(palette_animation_frame_counter & 0x38) >> 2) >> 1;
palette_mirror[115] = kword_2EE7D[v5];
palette_mirror[116] = kword_2EE8D[v5];
palette_mirror[125] = kword_2EE9D[v5];
palette_mirror[126] = kword_2EEAD[v5];
palette_mirror[127] = kword_2EEBD[v5];
goto LABEL_7;
case 1u: goto LABEL_7;
case 2u:
v6 = (uint8)(2 * (palette_animation_frame_counter & 0x38)) >> 1;
palette_mirror[115] = kword_2ECE0[v6];
palette_mirror[116] = kword_2ECE0[v6 + 1];
palette_mirror[117] = kword_2ECE0[v6 + 2];
palette_mirror[118] = kword_2ECE0[v6 + 3];
palette_mirror[119] = kword_2ECE0[v6 + 4];
palette_mirror[120] = kword_2ECE0[v6 + 5];
goto LABEL_7;
case 3u:
v7 = (uint8)(palette_animation_frame_counter & 0x38) >> 1;
palette_mirror[113] = kword_2EECD[v7];
palette_mirror[114] = kword_2EECD[v7 + 1];
palette_mirror[115] = kword_2EECD[v7 + 2];
palette_mirror[116] = kword_2EECD[v7 + 3];
v8 = (uint8)((uint8)(palette_animation_frame_counter & 0x38) >> 1) >> 1;
palette_mirror[126] = kword_2EF0D[v8];
palette_mirror[127] = kword_2EF0D[v8 + 1];
if (enemy_id[0] == 53)
goto LABEL_7;
if (palette_animation0EB7) {
--palette_animation0EB8;
--palette_animation0EB9;
--palette_animation0EB9;
--palette_animation0EBA;
--palette_animation0EBA;
--palette_animation0EB8;
--palette_animation0EB9;
--palette_animation0EB9;
--palette_animation0EBA;
--palette_animation0EBA;
if (palette_animation0EB8 == 3)
palette_animation0EB7 = 0;
} else {
if ((random_byte2 & 0xF) != 0) {
LABEL_7:
update_entire_palette_flag = 1;
break;
}
if (game_engine_subroutine == 8)
sound_ch3 = 24;
palette_animation0EB8 = 17;
palette_animation0EB9 = 31;
palette_animation0EBA = 31;
++palette_animation0EB7;
}
*(uint16 *)&tempE4 = palette_animation0EB8 << 10;
*(uint16 *)&tempE4 |= *(uint16 *)&palette_animation0EBA | (32 * palette_animation0EB9) & 0x1FFF;
palette_mirror[113] = *(uint16 *)&tempE4;
goto LABEL_7;
}
}
if ((palette_animation_frame_counter & 3) == 0) {
v3 = ++palette_animation0E76;
if (palette_animation0E76 == 3) {
palette_animation0E76 = 0;
v3 = 0;
}
v4 = (uint8)(8 * v3) >> 1;
palette_mirror[25] = kword_2ECB0[v4];
palette_mirror[26] = kword_2ECB0[v4 + 1];
palette_mirror[27] = kword_2ECB0[v4 + 2];
update_entire_palette_flag = 1;
}
}
void Smbll_HandleLevelTileAnimations() {
int16 v0; // ax
int8 v1; // di
vram_flag_028d = 0;
if ((frame_counter & 7) != 0) {
LOBYTE(graphics_upload_ptr.addr) = frame_counter + 4;
if (((frame_counter + 4) & 7) == 0) {
graphics_upload_ptr.bank = 9;
graphics_upload_ptr.addr = 8 * (graphics_upload_ptr.addr & 0x38) - 19712;
graphics_upload_vramaddress = 20832;
graphics_upload_size = 64;
++vram_flag_028d;
}
} else {
R4_ = (uint8)(frame_counter & 0x38) >> 3;
graphics_upload_ptr.bank = 3;
v0 = 0x8000;
v1 = (uint8)(frame_counter & 0x38) >> 3;
while (--v1 >= 0)
v0 += 2048;
graphics_upload_ptr.addr = v0 + 0x4000;
graphics_upload_vramaddress = 7168;
graphics_upload_size = 1536;
++vram_flag_028d;
}
}
void Smbll_HandleTilesetGraphicsUploads() {
uint8 v0; // al
v0 = tileset_graphics_type;
if (tileset_graphics_type == 1) {
tileset_graphics_flag_var2f8 = tileset_graphics_type;
v0 = kbyte_2F050[current_player];
tileset_graphics_type = v0;
}
Smbll_UploadTilesetGraphics(v0);
R0_ = *((uint8 *)koff_2F07C + (uint8)(2 * tileset_graphics_type));
R1_ = *((uint8 *)koff_2F07C + (uint8)(2 * tileset_graphics_type) + 1);
switch ((uint8)(2 * tileset_graphics_type) >> 1) {
case 0:
case 6:
case 13:
case 15:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31: break;
case 1:
case 3:
case 24: Smbll_UploadTilesetGraphics(0x11u); break;
case 2:
case 5:
case 11:
case 12:
case 14:
case 16:
if (area_data_addr_index == 19 || area_data_addr_index == 25 || area_data_addr_index == 47)
goto LABEL_13;
Smbll_UploadTilesetGraphics(0x17u);
break;
case 4:
Smbll_UploadTilesetGraphics(0x13u);
Smbll_UploadTilesetGraphics(0x14u);
break;
case 7:
case 9:
Smbll_UploadTilesetGraphics(0x16u);
LABEL_13:
Smbll_UploadTilesetGraphics(0x12u);
break;
case 8:
if (world_number == 8) {
tileset_graphics_type = 17;
Smbll_UploadTilesetGraphics(0x11u);
}
break;
case 10: Smbll_UploadTilesetGraphics(0x15u); break;
}
tileset_graphics_type = 0;
vram_flag_028d = 0;
vram_flag_028c = 1;
}
void Smbll_UploadTilesetGraphics(uint8 a) {
int v1; // rbp
graphics_upload_ptr.bank = kbyte_2F112[(uint8)(2 * a)];
v1 = (uint8)(2 * a) >> 1;
graphics_upload_ptr.addr = kword_2F144[v1];
graphics_upload_vramaddress = kword_2F176[v1];
graphics_upload_size = kword_2F1A8[v1];
Smbll_UploadTilesetGraphicsDma();
}
void Smbll_UploadTilesetGraphicsDma() {
WriteReg(VMAIN, 0x80u);
WriteRegWord(VMADDL, graphics_upload_vramaddress);
WriteRegWord(DMAP0, 0x1801u);
WriteRegWord(A1T0L, graphics_upload_ptr.addr);
WriteReg(A1B0, graphics_upload_ptr.bank);
WriteRegWord(DAS0L, graphics_upload_size);
WriteReg(MDMAEN, 1u);
}
void Smbll_MovePlayerHoriz2_Sub() {
uint8 v0; // di
bool v1; // cf
if (smbll_varF04 && area_type == 1) {
v0 = 1;
if (!__CFSHL__(frame_counter, 1))
v0 = 3;
R0_ = v0;
if ((v0 & frame_counter) == 0) {
v1 = __CFADD__(obj_xpos_lo.player++, 1);
obj_xpos_hi.player += v1;
++player_x_scroll;
}
}
}
void Smbll_sub_2F282() {
uint8 v0; // si
uint8 v1; // di
OamEnt *oam; // rbp
if (!var0E67 && smbll_varF04) {
Smbll_sub_2F2E7();
v0 = 0;
v1 = 0;
do {
while (get_OamEnt(oam_buf, v1)[64].ypos != 0xF0) {
v1 += 4;
if (!v1)
return;
}
oam = get_OamEnt(oam_buf, v1);
oam[64].ypos = smbll_varF18[v0];
oam[64].charnum = kbyte_2F276[v0];
oam[64].flags = 42;
oam[64].xpos = smbll_varF0C[v0];
oam_tile_size_buffer[v1 + 256] = 0;
v1 += 4;
++v0;
} while (v0 != 12);
}
}
void Smbll_sub_2F2E7() {
uint8 i; // si
for (i = 11; (i & 0x80u) == 0; --i) {
smbll_varF0C[i] += kbyte_2F2CF[i] + __CFADD__(kbyte_2F2CF[i], smbll_varF0C[i]) + kbyte_2F2CF[i];
smbll_varF18[i] += kbyte_2F2CF[i];
}
}
void Smbll_ExtObj34_() {
uint8 i; // si
for (i = 11; (i & 0x80u) == 0; --i) {
smbll_varF0C[i] = kbyte_2F26A[i];
smbll_varF18[i] = kbyte_2F25E[i];
}
g_byte_7E0F4B = 16;
sound_ch2 |= 0x10u;
smbll_varF04 = 1;
}
void Smbll_ExtObj35_() {
g_byte_7E0F4B = 0;
sound_ch2 |= 0x20u;
smbll_varF04 = 0;
}
void Smbll_DrawMushroomIcon() {
uint8 i; // di
uint8 v1; // di
for (i = 20; (i & 0x80u) == 0; --i)
vram_buffer1[i] = kTitleScreenMenuCursorStripeImage[i];
v1 = 4 * number_of_players;
vram_buffer1[v1 + 6] = 46;
vram_buffer1[v1 + 7] = 18;
--vram_buffer1[0];
--vram_buffer1[0];
}
uint8 Smbll_TitleScreen_Func1() {
uint8 v0; // si
uint8 v1; // cf
bool rv;
v0 = title_screen_menu_var0717;
if (title_screen_menu_var0718 || (++title_screen_menu_var0717, v0 = title_screen_menu_var0717, rv = true,
title_screen_menu_var0718 = kbyte_2F72C[v0], v1 = 0, title_screen_menu_var0718)) {
saved_joypad_bits = kbyte_2F71B[v0];
--title_screen_menu_var0718;
rv = false;
}
return rv;
}
void Smbll_CODE_039F3E(uint8 j) {
int8 v1; // si
uint8 v2; // si
v1 = 7;
R6_ = 0;
do {
R7_ = v1;
do {
if (v1 != 1 || j < 0x50u)
RomPtr_RAM(*(uint16 *)&R6_)[j] = 0;
--j;
} while (j != 0xFF);
--v1;
} while (v1 >= 0);
vram_buffer1[2] = -1;
contact_sprite_arr1[0] = 0;
contact_sprite_arr1[1] = 0;
contact_sprite_arr1[2] = 0;
contact_sprite_arr1[3] = 0;
contact_sprite_arr1[4] = 0;
v2 = 64;
do
*(&g_byte_7E0F00 + v2++) = 0;
while (v2);
if (var0F0B) {
if (!--var0F0B)
Smbll_LoadTopScoreFromSram();
}
}
void Smbll_EnemyGfxHandler_Sub4(uint8 k) {
uint8 v1; // di
OamEnt *oam; // rbp
uint8 enemy; // al
int8 v4; // al
v1 = enemy_obj_id[k];
oam = get_OamEnt(oam_buf, v1);
oam[64].xpos = rel_xpos_lo.enemy;
if (obj_ypos_hi.enemy[k] >= 2u || (enemy = rel_ypos.enemy, rel_ypos.enemy >= 0xE8u))
enemy = -16;
oam[64].ypos = enemy;
if ((obj_yspeed.enemy[k] & 0x80u) != 0)
v4 = 41;
else
v4 = -87;
oam[64].flags = v4;
oam[64].charnum = ((uint8)(podoboo_animation_frame_counter & 0x18) >> 2) + 98;
tempE4 = obj_xpos_lo.enemy[k];
tempE5 = obj_xpos_hi.enemy[k];
*(uint16 *)&tempE6 = *(uint16 *)&tempE4 - screen_left_xpos16;
oam_tile_size_buffer[v1 + 256] = 2;
if (tempE7)
oam_tile_size_buffer[v1 + 256] = 3;
}
uint8 Smbll_CODE_05E8CA(uint8 j) {
uint8 v1; // si
int8 v2; // al
uint8 v4; // al
uint8 v5; // al
uint8 v6; // si
uint8 v7; // di
uint8 v8; // al
uint8 v9; // di
uint8 v10; // al
uint8 v11; // di
uint8 v12; // si
OamEnt *oam; // rbp
enemy_array_F40[9] = 0;
v1 = object_index;
if (enemy_id[object_index] >= 4u)
return 0;
v2 = enemy_state[object_index];
if (v2 >= 0 && (v2 & 6) != 0)
return 0;
v4 = enemy_state[object_index];
tempE0 = v4;
if (v4 == 2 || v4 == 3 || v4 == 4) {
enemy_array_F40[object_index] = 0;
} else {
if ((v4 & 0x80) == 0)
return 0;
if (game_engine_subroutine < 0xAu)
++enemy_array_F40[object_index];
}
tempE4 = enemy_array_F40[v1] & 0xC;
v5 = enemy_id[v1];
v6 = tempE4;
if (v5 == 2)
v6 = tempE4 + 16;
if ((tempE0 & 0xF) == 4) {
v6 += 32;
R4_ |= 0x80u;
}
v7 = j + 8;
v8 = rel_ypos.enemy + 8;
if ((uint8)(rel_ypos.enemy + 8) >= 0xF0u)
v8 = -16;
if ((R4_ & 0x80u) != 0)
v8 += 2;
v9 = Smbll_CODE_05EA10(v6, v7, v8);
if ((R4_ & 0x80u) == 0)
v10 = rel_ypos.enemy + 16;
else
v10 = rel_ypos.enemy + 18;
v11 = Smbll_CODE_05EA10(v6 + 2, v9, v10);
v12 = tempE4;
oam = get_OamEnt(oam_buf, v11);
oam[60].flags = R4_ | kbyte_2FB49[tempE4];
oam[61].flags = R4_ | kbyte_2FB49[v12 + 1];
oam[62].flags = R4_ | kbyte_2FB49[v12 + 2];
oam[63].flags = R4_ | kbyte_2FB49[v12 + 3];
++enemy_array_F40[9];
return 1;
}
void Smbll_DrawLevelPreviewSprites_Sub8() {
uint8 v0; // di
uint8 v1; // si
uint8 v2; // di
uint8 v3; // di
uint8 v4; // di
uint8 v5; // di
uint8 v6; // di
OamEnt *oam; // rbp
uint8 v8; // [rsp+45h] [rbp-3h]
if (enemy_id[object_index] == 53 && !cutscene_0EC4) {
v0 = enemy_obj_id[object_index];
v8 = v0;
v1 = level_preview_sprites_ctr & 0x1F;
tempDD = kbyte_2FA5D[level_preview_sprites_ctr & 0x1F];
v2 = Smbll_OffsetYPosAndIncr(v0);
v3 = Smbll_OffsetYPosAndIncr(v2);
v4 = Smbll_OffsetYPosAndIncr(v3);
v5 = Smbll_OffsetYPosAndIncr(v4);
v6 = Smbll_OffsetYPosAndIncr(v5);
Smbll_OffsetYPosAndIncr(v6);
if (v1 < 0x10u) {
oam = get_OamEnt(oam_buf, v8);
oam[64].charnum = -1;
oam[65].charnum = -1;
oam[66].charnum = -41;
oam[67].charnum = -41;
oam[68].charnum = -18;
oam[69].charnum = -18;
}
++level_preview_sprites_ctr;
}
}
uint8 Smbll_OffsetYPosAndIncr(uint8 j) {
OamEnt *oam; // rbp
oam = get_OamEnt(oam_buf, j);
oam[64].ypos += tempDD;
return j + 4;
}
uint8 Smbll_CODE_05EA10(uint8 k, uint8 j, uint8 a) {
OamEnt *oam; // rbp
uint8 x; // al
oam = get_OamEnt(oam_buf, j);
oam[64].ypos = a;
oam[65].ypos = a;
x = rel_xpos_lo.enemy;
oam[64].xpos = x;
oam[65].xpos = x + 8;
oam[64].charnum = kbyte_2FB09[k];
oam[65].charnum = kbyte_2FB09[k + 1];
return j + 8;
}
void Smbll_sub_2FB79() {
int v0; // rbp
v0 = (uint8)((uint8)(frame_counter & 0x18) >> 2) >> 1;
palette_mirror[102] = kword_2FB59[v0];
palette_mirror[103] = kword_2FB61[v0];
palette_mirror[104] = kword_2FB69[v0];
palette_mirror[109] = kword_2FB71[v0];
++update_entire_palette_flag;
}
uint8 Smbll_sub_2FBA4() {
uint16 v0; // si
int v1; // rbp
int16 v2; // ax
v0 = 0;
*(uint16 *)&tempE6 = 0;
do {
v1 = v0 >> 1;
*(uint16 *)&tempE4 = palette_mirror[v1];
if ((*(uint16 *)&tempE4 & 0x7C00) != 0)
*(uint16 *)&tempE4 -= 1024;
if ((*(uint16 *)&tempE4 & 0x3E0) != 0)
*(uint16 *)&tempE4 -= 32;
if ((tempE4 & 0x1F) != 0)
--*(uint16 *)&tempE4;
v2 = *(uint16 *)&tempE4;
palette_mirror[v1] = *(uint16 *)&tempE4;
*(uint16 *)&tempE6 |= v2;
v0 += 2;
} while (v0 < 0x200u);
if (*(uint16 *)&tempE6) {
palette_animation0EB8 = tempE6;
error_screen_palette_mirror = tempE6;
update_entire_palette_flag = 1;
return 0;
} else {
palette_animation0EB8 = 0;
error_screen_palette_mirror = 0;
return 1;
}
}
void Smbll_sub_2FC02(uint8 k) {
uint8 v1; // di
OamEnt *oam; // rbp
OamEnt *v3; // rbp
OamEnt *v4; // rbp
if ((obj_xspeed.enemy[k] & 0x80u) != 0)
tempE4 = R0_;
else
tempE4 = R0_ - 24;
tempE4 = obj_ypos_lo.enemy[k] - tempE4;
v1 = enemy_obj_id[k];
if (tempE4 >= 0x18u) {
oam = get_OamEnt(oam_buf, v1);
oam[68].flags |= 0x20u;
oam[69].flags |= 0x20u;
}
if (tempE4 >= 0x10u) {
v3 = get_OamEnt(oam_buf, v1);
v3[66].flags |= 0x20u;
v3[67].flags |= 0x20u;
}
if (tempE4 >= 8u) {
v4 = get_OamEnt(oam_buf, v1);
v4[64].flags |= 0x20u;
v4[65].flags |= 0x20u;
}
}
void Smbll_FlagpoleGfxHandler(uint8 k) {
OamEnt *oam; // rbp
uint8 v2; // si
uint8 v3; // si
uint8 v4; // al
uint8 v5; // al
uint8 v6; // al
uint8 v7; // al
tempE4 = obj_xpos_lo.enemy[k];
tempE5 = obj_xpos_hi.enemy[k];
*(uint16 *)&tempE4 -= screen_left_xpos16;
*(uint16 *)&tempE6 = *(uint16 *)&tempE4 + 4;
*(uint16 *)&tempE8 = *(uint16 *)&tempE4 + 12;
if ((int16)(*(uint16 *)&tempE4 + 12) > -129) {
oam = get_OamEnt(oam_buf, 0xF0u);
oam->xpos = tempE4;
oam->ypos = obj_ypos_lo.enemy[k];
oam->flags = 43;
v2 = (uint8)(frame_counter & 0x18) >> 3;
if (v2 == 3)
v2 = 1;
oam->charnum = kbyte_2FC6D[v2];
v3 = k;
if (climbing_ypos_unk) {
v3 = 2 * flagpole_score;
oam[1].xpos = tempE6;
oam[2].xpos = tempE8;
v4 = flagpole_score_ypos_lo;
oam[1].ypos = flagpole_score_ypos_lo;
oam[2].ypos = v4;
oam[1].charnum = kbyte_2FC61[v3];
oam[2].charnum = kbyte_2FC61[v3 + 1];
oam[1].flags = 34;
oam[2].flags = 34;
if (v3 < 4u)
oam[2].flags = 35;
}
tempDD = 2;
v5 = tempE5;
if (tempE5)
v5 = 1;
oam_tile_size_buffer[240] = tempDD | v5;
tempDD = 0;
v6 = tempE7;
if (tempE7)
v6 = 1;
oam_tile_size_buffer[244] = tempDD | v6;
if (v3 < 4u)
tempDD = 2;
v7 = tempE9;
if (tempE9)
v7 = 1;
oam_tile_size_buffer[248] = tempDD | v7;
}
}