smw/smb1/smb1_02.c

3245 lines
89 KiB
C

#include "smb1_rtl.h"
#include "smb1_consts.h"
#include "smb1_funcs.h"
#include "smb1_variables.h"
void (*funcs_20A54[4])() = {&MaybePauseMenu_State0, &MaybePauseMenu_State1,
&MaybePauseMenu_State2,
&MaybePauseMenu_State3}; // weak
uint8 byte_1BA29[34] = {0u, 0u, 4u, 5u, 21u, 5u, 5u, 5u, 5u,
31u, 32u, 35u, 5u, 35u, 5u, 51u, 5u, 5u,
51u, 5u, 35u, 35u, 35u, 5u, 5u, 63u, 63u,
5u, 66u, 66u, 66u, 66u, 66u, 78u}; // weak
void SetupLayer2Bg() {
uint16 i; // si
uint16 v1; // ax
int16 v2; // ax
enable_layer3_bgflag = 0;
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;
}
layer2_bg_0EC0 = 0;
if (override_area_data_addr_index)
*(uint16 *)&area_data_addr_index = override_area_data_addr_index;
*(uint16 *)&R2_ = kDATA_05AD04[(uint16)(2 * area_data_addr_index) >> 1];
LOOP:
while (1) {
*(uint16 *)&R4_ = kDATA_05B557[*(uint16 *)&R2_ >> 1];
++*(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) {
SetupLayer2BgB();
} else {
if (SetupLayer2Bg_Callfunc(2 * *(uint16 *)&tempEF,
2 * *(uint16 *)&area_data_addr_index))
return;
}
}
if (*(uint16 *)&tempEF == 63) {
++layer2_bg_0EC0;
++layer2_bg_0EC0;
LOBYTE(v1) = HIBYTE(layer2_bg_0EC0);
HIBYTE(v1) = layer2_bg_0EC0;
*(uint16 *)&layer2_bgdata[v1] = -1;
GenerateLayer2Map16();
} else {
SetupLayer2BgA();
goto LOOP;
}
}
uint16 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 i; // 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 n; // di
uint16 v68; // si
uint16 m; // si
switch (byte_1BA29[j >> 1] + (k >> 1)) {
case 0:
++*(uint16 *)&tempEB;
goto LABEL_121;
case 1:
LABEL_121:
v43 = *(uint16 *)&tempEB + 32;
layer2_bgdata[(uint16)(*(uint16 *)&tempEB + 32)] = kDATA_05871E[0];
layer2_bgdata[v43 + 1] = kDATA_05871E[1];
layer2_bgdata[v43 + 16] = kDATA_05871E[2];
layer2_bgdata[v43 + 17] = kDATA_05871E[3];
layer2_bgdata[v43 + 32] = kDATA_05871E[4];
layer2_bgdata[v43 + 33] = kDATA_05871E[5];
return 0;
case 2:
++*(uint16 *)&tempEB;
goto LABEL_123;
case 3:
LABEL_123:
v44 = *(uint16 *)&tempEB + 32;
layer2_bgdata[(uint16)(*(uint16 *)&tempEB + 32) + 16] = kDATA_05871E[0];
layer2_bgdata[v44 + 17] = kDATA_05871E[1];
layer2_bgdata[v44 + 32] = kDATA_05871E[2];
layer2_bgdata[v44 + 33] = kDATA_05871E[3];
return 0;
case 4:
v8 = kDATA_0582DC[(uint16)(2 * *(uint16 *)&tempF1) >> 1];
v9 = *(uint16 *)&tempEB + 16;
while (kDATA_05B494[v8] != 0xFF) layer2_bgdata[v9++] = kDATA_05B494[v8++];
return 0;
case 5:
v48 = *(uint16 *)&tempEB;
for (i = 0; i != 36; i += 6) {
layer2_bgdata[v48 + 32] = kDATA_058971[i];
layer2_bgdata[v48 + 33] = kDATA_058971[i + 1];
layer2_bgdata[v48 + 34] = kDATA_058971[i + 2];
layer2_bgdata[v48 + 35] = kDATA_058971[i + 3];
layer2_bgdata[v48 + 36] = kDATA_058971[i + 4];
layer2_bgdata[v48 + 37] = kDATA_058971[i + 5];
v48 += 16;
}
return 0;
case 6:
case 7:
case 8:
--*(uint16 *)&tempEF;
v41 = 4 * (*(uint16 *)&tempF1 | (16 * (tempEF & 3)));
v42 = *(uint16 *)&tempEB;
layer2_bgdata[*(uint16 *)&tempEB] = kDATA_0591E4[v41];
layer2_bgdata[v42 + 1] = kDATA_0591E4[v41 + 1];
layer2_bgdata[v42 + 16] = kDATA_0591E4[v41 + 2];
layer2_bgdata[v42 + 17] = kDATA_0591E4[v41 + 3];
return 0;
case 9:
goto LABEL_134;
case 0xA:
++*(uint16 *)&tempEB;
LABEL_134:
v46 = *(uint16 *)&tempEB;
goto LABEL_135;
case 0xB:
goto LABEL_132;
case 0xC:
++*(uint16 *)&tempEB;
LABEL_132:
v46 = *(uint16 *)&tempEB + 16;
LABEL_135:
v45 = 0;
goto LABEL_136;
case 0xD:
v45 = kDATA_0587DC[0];
v46 = *(uint16 *)&tempEB + 2;
goto LABEL_136;
case 0xE:
v45 = kDATA_0587DC[1];
v46 = *(uint16 *)&tempEB + 18;
goto LABEL_136;
case 0xF:
v45 = kDATA_0587DC[2];
v46 = *(uint16 *)&tempEB + 1;
goto LABEL_136;
case 0x10:
v45 = kDATA_0587DC[3];
v46 = *(uint16 *)&tempEB + 17;
goto LABEL_136;
case 0x11:
v45 = kDATA_0587DC[4];
v46 = *(uint16 *)&tempEB + 32;
goto LABEL_136;
case 0x12:
v45 = kDATA_0587DC[5];
v46 = *(uint16 *)&tempEB + 1;
goto LABEL_136;
case 0x13:
v45 = kDATA_0587DC[6];
v46 = *(uint16 *)&tempEB + 18;
LABEL_136:
*(uint16 *)&tempE2 = v46;
while (1) {
v47 = *((uint8 *)kDATA_05B1A5 + v45);
if (v47 == 0xFF) return 0;
if (v47 != 0xFE) {
layer2_bgdata[v46] = 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 0x14:
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 0x15:
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);
}
return 1;
case 0x16:
case 0x1A:
case 0x1B:
case 0x1E:
goto LABEL_97;
case 0x17:
case 0x1D:
++*(uint16 *)&tempEB;
LABEL_97:
v35 = *(uint16 *)&tempEB;
goto LABEL_98;
case 0x18:
v35 = *(uint16 *)&tempEB + 16;
goto LABEL_98;
case 0x19:
case 0x1C:
v35 = *(uint16 *)&tempEB + 17;
LABEL_98:
*(uint16 *)&tempE2 = v35;
v36 = kDATA_0587AA[(uint16)(2 * *(uint16 *)&tempEF) >> 1];
while (2) {
v37 = kDATA_05B3E2[v36];
if (!v37) goto LABEL_103;
if (v37 != 0xFF) {
if (v37 == 0xFE) {
*(uint16 *)&tempE2 += 16;
v35 = *(uint16 *)&tempE2;
++v36;
continue;
}
layer2_bgdata[v35] = kDATA_05B3E2[v36];
LABEL_103:
++v36;
if ((++v35 & 0xF) == 0) v35 += 240;
continue;
}
return 0;
}
case 0x1F:
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) =
kDATA_0583B0[v12];
if (*(uint16 *)&tempE8) v13 += 240;
layer2_bgdata[(uint16)(*(uint16 *)&tempF1 + v13) + 1] = kDATA_0583B5[v12];
return 0;
case 0x20:
v5 = 14;
goto LABEL_5;
case 0x21:
v5 = 0;
LABEL_5:
v6 = *(uint16 *)&tempEB + 1;
layer2_bgdata[(uint16)(*(uint16 *)&tempEB + 1)] = kDATA_058223[v5];
layer2_bgdata[v6 + 1] = kDATA_058223[v5 + 1];
layer2_bgdata[v6 + 16] = kDATA_058223[v5 + 2];
layer2_bgdata[v6 + 17] = kDATA_058223[v5 + 3];
layer2_bgdata[v6 + 32] = kDATA_058223[v5 + 6];
layer2_bgdata[v6 + 33] = kDATA_058223[v5 + 7];
tempE4 = 48;
for (tempE5 = 0;; tempE5 = 0) {
v7 = *(uint16 *)&tempE4 + v6;
v6 = v7;
if ((uint8)v7 >= 0xD0u) break;
layer2_bgdata[v7] = kDATA_058223[v5 + 4];
layer2_bgdata[v7 + 1] = kDATA_058223[v5 + 5];
layer2_bgdata[v7 + 16] = kDATA_058223[v5 + 6];
layer2_bgdata[v7 + 17] = kDATA_058223[v5 + 7];
tempE4 = 32;
}
layer2_bgdata[v7] = kDATA_058223[v5 + 8];
layer2_bgdata[v7 + 1] = kDATA_058223[v5 + 9];
layer2_bgdata[v7 + 16] = kDATA_058223[v5 + 10];
layer2_bgdata[v7 + 17] = kDATA_058223[v5 + 11];
layer2_bgdata[v7 + 32] = kDATA_058223[v5 + 12];
layer2_bgdata[v7 + 33] = kDATA_058223[v5 + 13];
return 0;
case 0x22:
v2 = *(uint16 *)&tempF1;
v3 = *(uint16 *)&tempEB;
layer2_bgdata[*(uint16 *)&tempEB] = kDATA_0581E1[*(uint16 *)&tempF1];
layer2_bgdata[v3 + 16] = kDATA_0581E1[v2 + 1];
layer2_bgdata[v3 + 32] = kDATA_0581E1[v2 + 2];
layer2_bgdata[v3 + 48] = kDATA_0581E1[v2 + 3];
layer2_bgdata[v3 + 64] = kDATA_0581E1[v2 + 4];
return 0;
case 0x23:
case 0x24:
case 0x25:
case 0x26:
case 0x27:
case 0x28:
case 0x29:
case 0x2A:
case 0x2B:
case 0x2C:
case 0x2D:
case 0x2E:
case 0x2F:
case 0x30:
case 0x31:
case 0x32:
v38 = *(uint16 *)&tempEB;
*(uint16 *)&tempE2 = *(uint16 *)&tempEB;
v39 = kDATA_0587BE[(uint16)(2 * *(uint16 *)&tempEF) >> 1];
while (2) {
v40 = *((uint8 *)kDATA_05AD48 + 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 0x33:
goto LABEL_40;
case 0x34:
++*(uint16 *)&tempEB;
goto LABEL_40;
case 0x35:
goto LABEL_38;
case 0x36:
++*(uint16 *)&tempEB;
LABEL_38:
*(uint16 *)&tempEB += 16;
LABEL_40:
v17 = 0;
goto LABEL_41;
case 0x37:
goto LABEL_36;
case 0x38:
++*(uint16 *)&tempEB;
goto LABEL_36;
case 0x39:
goto LABEL_34;
case 0x3A:
++*(uint16 *)&tempEB;
LABEL_34:
*(uint16 *)&tempEB += 16;
LABEL_36:
v17 = 1;
LABEL_41:
v18 = *(uint16 *)&tempEB;
layer2_bgdata[*(uint16 *)&tempEB] = kDATA_058420[v17];
v19 = v18 + 16;
--tempF1;
do {
if (layer2_bgdata[v19] == 14) {
v20 = 13;
} else if (layer2_bgdata[v19] == 2) {
v20 = 11;
} else {
v20 = kDATA_058422[v17];
}
layer2_bgdata[v19] = v20;
v19 += 16;
--tempF1;
} while ((tempF1 & 0x80u) == 0);
return 0;
case 0x3B:
goto LABEL_28;
case 0x3C:
++*(uint16 *)&tempEB;
goto LABEL_28;
case 0x3D:
goto LABEL_26;
case 0x3E:
++*(uint16 *)&tempEB;
LABEL_26:
*(uint16 *)&tempEB += 16;
LABEL_28:
v14 = *(uint16 *)&tempEB;
v15 = *(uint16 *)&tempF1;
*(uint16 *)&tempF1 = kDATA_0583D1[*(uint16 *)&tempF1];
v16 = kDATA_0583D6[v15];
do {
layer2_bgdata[v14++] = kDATA_0583BA[v16++];
if ((v14 & 0xF) == 0) v14 += 240;
--tempF1;
} while ((tempF1 & 0x80u) == 0);
return 0;
case 0x3F:
v50 = *(uint16 *)&tempEB;
do {
layer2_bgdata[v50 + 32] = 9;
layer2_bgdata[v50 + 33] = 11;
v50 += 2;
--tempF1;
} while ((tempF1 & 0x80u) == 0);
return 0;
case 0x40:
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 0x41:
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 0x42:
case 0x43:
goto LABEL_174;
case 0x44:
v63 = *(uint16 *)&tempEB;
break;
case 0x45:
v64 = *(uint16 *)&tempEB;
do {
if (layer2_bgdata[v64 + 32] == 31) {
layer2_bgdata[v64 + 16] = kDATA_058C5B[3];
layer2_bgdata[v64 + 17] = kDATA_058C5B[4];
layer2_bgdata[v64 + 32] = kDATA_058C5B[5];
layer2_bgdata[v64 + 33] = kDATA_058C5B[6];
layer2_bgdata[v64 + 48] = kDATA_058C5B[7];
layer2_bgdata[v64 + 49] = kDATA_058C5B[8];
layer2_bgdata[v64 + 64] = kDATA_058C5B[9];
layer2_bgdata[v64++ + 65] = kDATA_058C5B[10];
--tempF1;
} else {
layer2_bgdata[v64 + 32] = kDATA_058C5B[0];
layer2_bgdata[v64 + 48] = kDATA_058C5B[1];
layer2_bgdata[v64 + 64] = kDATA_058C5B[2];
}
++v64;
--tempF1;
} while ((tempF1 & 0x80u) == 0);
return 0;
case 0x46:
v65 = *(uint16 *)&tempEB;
if (layer2_bgdata[*(uint16 *)&tempEB + 32] == 12) {
layer2_bgdata[*(uint16 *)&tempEB + 16] = kDATA_058CD0[0];
layer2_bgdata[v65 + 17] = kDATA_058CD0[1];
layer2_bgdata[v65 + 32] = kDATA_058CD0[2];
layer2_bgdata[v65 + 33] = kDATA_058CD0[3];
layer2_bgdata[v65 + 48] = kDATA_058CD0[4];
layer2_bgdata[v65 + 49] = kDATA_058CD0[5];
layer2_bgdata[v65 + 64] = kDATA_058CD0[6];
layer2_bgdata[v65 + 65] = kDATA_058CD0[7];
} else {
layer2_bgdata[*(uint16 *)&tempEB + 16] = kDATA_058CD0[8];
layer2_bgdata[v65 + 17] = kDATA_058CD0[9];
layer2_bgdata[v65 + 32] = kDATA_058CD0[10];
layer2_bgdata[v65 + 33] = kDATA_058CD0[11];
layer2_bgdata[v65 + 48] = kDATA_058CD0[12];
layer2_bgdata[v65 + 49] = kDATA_058CD0[13];
layer2_bgdata[v65 + 64] = kDATA_058CD0[14];
layer2_bgdata[v65 + 65] = kDATA_058CD0[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] = kDATA_058B4D[v62];
layer2_bgdata[v61 + 33] = kDATA_058B4F[v62];
v61 += 16;
--tempF1;
} while ((tempF1 & 0x80u) == 0);
return 0;
case 0x47:
v66 = *(uint16 *)&tempEB;
for (n = 0; n != 20; n += 4) {
layer2_bgdata[v66 + 32] = kDATA_058D76[n];
layer2_bgdata[v66 + 33] = kDATA_058D76[n + 1];
layer2_bgdata[v66 + 34] = kDATA_058D76[n + 2];
layer2_bgdata[v66 + 35] = kDATA_058D76[n + 3];
v66 += 16;
}
return 0;
case 0x48:
v59 = 0;
v60 = *(uint16 *)&tempEB;
do {
layer2_bgdata[v60 + 32] = kDATA_058B1A[v59];
layer2_bgdata[v60 + 33] = kDATA_058B1A[v59 + 1];
v60 += 16;
v59 += 2;
} while (v59 != 8);
return 0;
case 0x49:
v55 = *(uint16 *)&tempEB;
*(uint16 *)&tempF1 = 6;
v56 = *(uint16 *)&tempEB;
layer2_bgdata[*(uint16 *)&tempEB + 32] = kDATA_058A5F[0];
layer2_bgdata[v56 + 33] = kDATA_058A5F[1];
do {
layer2_bgdata[v55 + 48] = kDATA_058A5F[2];
layer2_bgdata[v55 + 49] = kDATA_058A5F[3];
v55 += 16;
--tempF1;
} while (tempF1);
layer2_bgdata[v55 + 48] = kDATA_058A5F[4];
layer2_bgdata[v55 + 49] = kDATA_058A5F[5];
layer2_bgdata[v55 + 64] = kDATA_058A5F[6];
layer2_bgdata[v55 + 65] = kDATA_058A5F[7];
layer2_bgdata[v55 + 66] = kDATA_058A5F[8];
return 0;
case 0x4A:
v57 = *(uint16 *)&tempEB + 1;
tempE5 = 0;
v58 = 0;
do {
layer2_bgdata[v57] = kCODE_058AC5[v58];
layer2_bgdata[v57 + 1] = kCODE_058AC5[v58 + 1];
layer2_bgdata[v57 + 2] = kCODE_058AC5[v58 + 2];
layer2_bgdata[v57 + 3] = kCODE_058AC5[v58 + 3];
v58 += 4;
v57 += 16;
++tempE5;
} while (tempE5 != 4);
return 0;
case 0x4B:
goto LABEL_201;
case 0x4C:
++*(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 0x4D:
*(uint16 *)&layer2_bgdata[*(uint16 *)&tempEB] = 6938;
return 0;
case 0x4E:
case 0x50:
case 0x52:
case 0x54:
case 0x56:
case 0x58:
case 0x5A:
case 0x5C:
goto LABEL_84;
case 0x4F:
case 0x51:
case 0x53:
case 0x55:
case 0x57:
case 0x59:
case 0x5B:
case 0x5D:
++*(uint16 *)&tempEB;
LABEL_84:
v32 = *(uint16 *)&tempEB;
*(uint16 *)&tempE2 = *(uint16 *)&tempEB;
v33 = kDATA_05878A[(uint16)(2 * *(uint16 *)&tempEF) >> 1];
while (2) {
v34 = kDATA_05B323[v33];
if (!v34) goto LABEL_89;
if (v34 != 0xFF) {
if (v34 == 0xFE) {
*(uint16 *)&tempE2 += 16;
v32 = *(uint16 *)&tempE2;
++v33;
continue;
}
layer2_bgdata[v32] = kDATA_05B323[v33];
LABEL_89:
++v33;
if ((++v32 & 0xF) == 0) v32 += 240;
continue;
}
return 0;
}
}
do {
if ((v63 & 0xF0) == 0) {
layer2_bgdata[v63 + 32] = kDATA_058B7A[6];
layer2_bgdata[v63 + 33] = kDATA_058B7A[7];
layer2_bgdata[v63 + 34] = kDATA_058B7A[8];
goto LABEL_182;
}
if (layer2_bgdata[v63 + 32] != 12) {
layer2_bgdata[v63 + 32] = kDATA_058B7A[0];
layer2_bgdata[v63 + 33] = kDATA_058B7A[1];
layer2_bgdata[v63 + 34] = kDATA_058B7A[2];
LABEL_182:
layer2_bgdata[v63 + 48] = kDATA_058B7A[3];
layer2_bgdata[v63 + 49] = kDATA_058B7A[4];
layer2_bgdata[v63 + 50] = kDATA_058B7A[5];
goto LABEL_184;
}
layer2_bgdata[v63 + 32] = kDATA_058B7A[9];
layer2_bgdata[v63 + 33] = kDATA_058B7A[10];
layer2_bgdata[v63 + 34] = kDATA_058B7A[11];
layer2_bgdata[v63 + 48] = kDATA_058B7A[12];
layer2_bgdata[v63 + 49] = kDATA_058B7A[13];
layer2_bgdata[v63 + 50] = kDATA_058B7A[14];
layer2_bgdata[v63 + 64] = kDATA_058B7A[15];
layer2_bgdata[v63 + 65] = kDATA_058B7A[16];
layer2_bgdata[v63 + 66] = kDATA_058B7A[17];
layer2_bgdata[v63 + 80] = kDATA_058B7A[18];
layer2_bgdata[v63 + 81] = kDATA_058B7A[19];
layer2_bgdata[v63 + 82] = kDATA_058B7A[20];
v63 += 32;
--tempF1;
LABEL_184:
v63 += 32;
--tempF1;
} while ((tempF1 & 0x80u) == 0);
return 0;
}
// 1BA29: using guessed type uint8 byte_1BA29[34];
uint8 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 SetupLayer2BgB() {
uint16 v0; // si
uint16 v1; // di
*(uint16 *)((int8 *)&tempD8.addr + 1) = 512;
tempD8.addr = kDATA_058DF9[(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 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;
}
void 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;
}
void SetupLayer2BgA() {
uint16 v0; // ax
uint16 v1; // si
uint16 n; // di
uint16 v3; // si
uint16 v4; // di
uint16 m; // si
uint16 k; // si
uint16 j; // si
int16 i; // si
uint8 v9; // al
uint16 v10; // si
uint16 v11; // di
uint16 v12; // ax
uint16 v13; // ax
uint8 t0;
v0 = kDATA_058F25[(uint16)(2 * *(uint16 *)&tempEF) >> 1];
*(uint16 *)&R0_ = v0;
switch ((uint8)(2 * tempEF) >> 1) {
case 0:
++layer2_bg_0EC0;
break;
case 1:
v9 = tempF1;
if (tempF1 == 2) v9 = -1;
if (v9 == 1) vblank_which_layer2_scroll_flag = 1;
InitializeGradientHDMA(v9);
break;
case 2:
InitializeGradientHDMA(2u);
break;
case 3:
v10 = 208;
v11 = *(uint16 *)&tempF1;
v12 = *(uint16 *)((char *)kDATA_0590DD + v11);
do SetAllLayer2BgData(v10++, v12);
while (v10 != 224);
v13 = *(uint16 *)((char *)kDATA_0590E3 + v11);
do SetAllLayer2BgData(v10++, v13);
while (v10 != 240);
SetAllLayer2BgData(0xF0u, 0x50u);
break;
case 4:
*(uint16 *)&tileset_graphics_type = *(uint16 *)&tempF1;
HandleTilesetGraphicsUploads();
break;
case 5:
t0 = (area_type == 2) ? 0 : 0x5f;
for (i = 0; i != 32; ++i) SetAllLayer2BgDataByte(i, t0);
break;
case 6:
for (j = 0; j != 2048; j += 16) {
do {
layer2_bgdata[j] = kDATA_05905B[0];
layer2_bgdata[j + 1] = kDATA_05905B[1];
layer2_bgdata[j + 16] = kDATA_05905B[2];
layer2_bgdata[j + 17] = kDATA_05905B[3];
j += 2;
} while ((j & 0xF) != 0);
}
break;
case 7:
for (k = 0; k != 32; k += 2) SetAllLayer2BgData(k, 0x202u);
do {
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] = kDATA_058F87[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 != 6);
break;
case 11:
*(uint16 *)&tileset_graphics_type = *(uint16 *)&tempF1 | 0x10;
HandleTilesetGraphicsUploads();
break;
case 12:
v1 = 208;
for (n = 0; n != 48; ++n) {
SetAllLayer2BgDataByte(v1++, kDATA_058F3F[n]);
}
break;
}
}
void 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_ =
kDATA_0591CE[kDATA_059122[*(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 ((v1 & 0xF) == 0) v3 += 64;
v0 = v3 + 4;
} while (v6 != 4095);
}
void Smb1PollJoypadInputs() {
uint8 v0; // si
uint8 v1; // si
while (ReadReg(HVBJOY) & 1)
;
WriteReg(JOYA, 0);
v0 = sram_controller1_plugged_in;
controller_hold2p1 = ReadReg((SnesRegs)(sram_controller1_plugged_in + 16920));
controller_press2p1 =
controller_hold2p1 & (HIBYTE(p1_ctrl_disable) ^ controller_hold2p1);
HIBYTE(p1_ctrl_disable) = controller_hold2p1;
saved_joypad_bits = ReadReg((SnesRegs)(v0 + 16921));
controller_press1p1 =
saved_joypad_bits & (p1_ctrl_disable ^ saved_joypad_bits);
LOBYTE(p1_ctrl_disable) = saved_joypad_bits;
v1 = sram_controller2_plugged_in;
controller_hold2p2 = ReadReg((SnesRegs)(sram_controller2_plugged_in + 16920));
controller_press2p2 =
controller_hold2p2 & (p2_ctrl_disable_hi ^ controller_hold2p2);
p2_ctrl_disable_hi = controller_hold2p2;
controller_hold1p2 = ReadReg((SnesRegs)(v1 + 16921));
controller_press1p2 =
controller_hold1p2 & (p2_ctrl_disable_lo ^ controller_hold1p2);
p2_ctrl_disable_lo = controller_hold1p2;
}
void 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;
controller_press1p1 =
controller_press2p1 & 0xC0 | controller_press1p1 & 0x7F;
controller_hold1p2 |= (uint8)(controller_hold1p2 & 0x80) >> 1;
controller_hold1p2 = controller_hold2p2 & 0xC0 | controller_hold1p2 & 0x7F;
controller_press1p2 |= (uint8)(controller_press1p2 & 0x80) >> 1;
R0_ = controller_press2p2 & 0xC0;
controller_press1p2 =
controller_press2p2 & 0xC0 | controller_press1p2 & 0x7F;
} else {
saved_joypad_bits |= controller_hold2p1 & 0xC0;
controller_press1p1 |= controller_press2p1 & 0xC0;
controller_hold1p2 |= controller_hold2p2 & 0xC0;
controller_press1p2 |= controller_press2p2 & 0xC0;
}
}
void SetLevelMusic() {
uint8 bubble; // di
uint8 v1; // al
if (game_mode) {
if (alt_entrance_ctrl != 2 &&
(player_entrance_ctrl == 6 || player_entrance_ctrl == 7)) {
bubble = 5;
} else {
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 == 27)
v1 = 1;
else
v1 = kDATA_05C8F5[bubble];
if (!set_level_music_flag) music_ch1 = v1;
}
if (area_data_addr_index == 33) set_level_music_flag = v1;
}
}
// 7E00BA: using guessed type int8;
void CODE_05C950() {
uint8 v0; // al
v0 = save_buffer_2_player_flag;
if ((save_buffer_2_player_flag & 0x80u) != 0) v0 = 0;
number_of_players = v0;
CODE_05C95B();
}
void CODE_05C95B() {
world_number = save_buffer;
offscreen_players_world = save_buffer;
level_number = save_buffer_current_level;
player_other_players_level_number_display = save_buffer_current_level;
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;
other_player_num_lives = save_buffer_other_players_life_count;
player_hard_mode_flag = save_buffer_hard_mode_active_flag;
other_player_hard_mode = save_buffer_hard_mode_active_flag;
LoadTopScoreFromSram();
}
void LoadTopScoreFromSram() {
uint8 i; // si
for (i = 0; i != 6; ++i) displayed_score[i] = sram_top_score[i];
}
void UNUSED_CODE_05C9A5() {
uint8 i; // si
area_number = sram_initial_selected_level;
player_other_players_level = sram_initial_selected_level;
level_number = original_level;
player_other_players_level_number_display = original_level;
number_of_lives = 2;
other_player_num_lives = 2;
player_coin_count = 0;
player_other_players_coin_count = 0;
for (i = 0; i != 12; ++i) marios_score[i] = 0;
}
void 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]) {
DrawCrumblingBridgeSegment_Sub(v5);
tempE7 += 32;
}
++v5;
} while (v5 < 0xDu);
}
void 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 = kDATA_05CB2D[tempE6] - 96;
tempE5 = kDATA_05CB2D[tempE6 + 1] - 96;
v1 = DrawCrumblingBridgeSegment_Sub2(tempE7, level_bridge_spr_xpos_lo[k]);
DrawCrumblingBridgeSegment_Sub2(v1, level_bridge_spr_xpos_lo[k] + 8);
v2 = tempE7;
DrawCrumblingBridgeSegment_Sub3(tempE7, tempE4);
DrawCrumblingBridgeSegment_Sub3(v2 + 16, tempE5);
v3 = tempE6;
if (tempE6 >= 4u)
v4 = 35;
else
v4 = 34;
a = v4;
v5 = DrawCrumblingBridgeSegment_Sub2(tempE7 + 3, v4);
DrawCrumblingBridgeSegment_Sub2(v5, a);
v6 = tempE7;
v7 = 8 * v3;
tempE8 = 8;
do {
get_OamEnt(oam_buf, v6)[64].charnum = kDATA_05CAE5[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 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 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 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 = kDATA_05CB38[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;
}
// 7E03B9: using guessed type int8;
uint8 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;
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 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 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] =
kDATA_05CCAF[kDATA_05CCAB[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 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 = kDATA_05CDE2[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 = kDATA_05CDE5[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];
}
// 7E03B9: using guessed type int8;
void 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 + kDATA_05CF1B[v1];
oam->ypos = rel_ypos.enemy - 4;
v11 = v1;
tempE5 = v1;
v3 = v1 + (frame_counter & 0x18);
oam->flags = kDATA_05CEFB[v3];
oam->charnum = kDATA_05CEDB[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;
}
// 7E03B9: using guessed type int8;
void 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 +
kDATA_05CF80[bowser_woozy_effect_animation_frame >> 2] + 24;
oam[63].xpos = rel_xpos_lo.enemy + kDATA_05CF8D[v0] + 24;
v2 = kDATA_05CF9A[v0];
if (v2)
v3 = rel_ypos.enemy + v2 + 16;
else
v3 = -16;
oam[62].ypos = v3;
v4 = kDATA_05CFA7[v0];
if (v4)
v5 = rel_ypos.enemy + v4 + 16;
else
v5 = -16;
oam[63].ypos = v5;
oam[62].charnum = kDATA_05CFB4[v0];
oam[63].charnum = kDATA_05CFC1[v0];
oam[62].flags = kDATA_05CFCE[v0];
oam[63].flags = kDATA_05CFDB[v0];
}
}
void 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) HandleBowserWoozy();
if (bowser_var0F4C) {
v1 = bowser_var014B;
if (bowser_var014B == 8) v1 = kDATA_05CF7E[(bowser_var0F4C & 4) != 0];
} else {
if (!enemy_frame_timer[k]) bowser_var014B = 0;
v1 = bowser_var014B >> 3;
}
bowser_var014C = kDATA_05CF74[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 = kDATA_05CF20[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;
v9 = enemy_obj_id[object_index];
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;
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;
}
DrawCrumblingBridgeSegment(v8);
}
// 7E03B9: using guessed type int8;
void 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;
}
// 7E03B9: using guessed type int8;
void ProcessContactSprites() {
uint8 i; // si
uint8 v1; // di
uint8 v2; // al
uint8 v3; // al
for (i = 0; i != 5; ++i) {
v1 = kDATA_05D46D[i];
v2 = contact_sprite_arr1[i];
if (v2) {
v3 = v2 & 0xC;
tempE4 = v3;
if (v3) {
if (v3 == 4) {
ContactSprite_Func3(i, v1);
} else if (v3 == 8) {
CODE_05D3B4(i, v1);
} else {
contact_sprite_arr1[i] = 0;
}
} else {
ContactSprite_Func1(i, v1);
}
}
}
}
void ContactSprite_Func1(uint8 k, uint8 j) {
OamEnt *oam; // rbp
uint8 v3; // al
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 ContactSprite_Func3(uint8 k, uint8 j) {
OamEnt *oam; // rbp
uint8 v3; // al
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 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;
ContactSprite_Func2(k);
v2 = contact_sprite_arr1[k] & 3;
v3 = kDATA_05D3AC[v2] + contact_sprite_some_y_pos;
oam = get_OamEnt(oam_buf, j);
oam->ypos = v3;
oam[1].ypos = v3;
v5 = kDATA_05D3B0[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 = kDATA_05D3AC[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 = kDATA_05D3B0[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 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 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:
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:
HandlePaletteAnimations();
}
void UNUSED_CODE_05D4EF() { ; }
void 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 = kDATA_05D563[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 = kDATA_05D58B[v0] - 40;
oam->charnum = kDATA_05D5BC[tempDD];
oam->flags = kDATA_05D5B3[tempE4];
v1 += 4;
++v0;
--tempE4;
} while (tempE4);
}
}
void 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_ = kDATA_05D670[v3] + v8;
*(uint16 *)&R2_ = kDATA_05D67A[v3] + v8;
v4 = tempEB;
podoboo_array_3[k] += kDATA_05D698[tempEB];
R4_ = podoboo_array_3[k] + kDATA_05D684[v4];
tempED = podoboo_array_3[k] + kDATA_05D689[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 = kDATA_05D68E[v6];
oam[65].charnum = kDATA_05D693[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 = kDATA_05D60A[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;
MovePodoboo_Sub2(v1);
}
}
}
void MovePodoboo_Sub2(uint8 j) {
uint8 i; // si
uint8 v2; // di
OamEnt *oam; // rbx
tempEC = j;
for (i = 0; i != 4; ++i) {
tempEB = 4 * tempEC;
tempEE = kDATA_05D5F2[(uint8)(4 * tempEC + i)] - 40;
tempEF = kDATA_05D610[i];
*(uint16 *)&tempF0 =
*(uint16 *)&R0_ + kDATA_05D5C2[(uint8)(2 * (4 * tempEC + i)) >> 1];
v2 = tempF2 + 4 * i;
oam = get_OamEnt(oam_buf, v2);
oam[64].xpos = tempF0;
oam[64].ypos = tempEE;
oam[64].charnum = tempED;
oam[64].flags = tempEF;
if (tempF1) oam_tile_size_buffer[v2 + 256] = 1;
}
}
void HandleTurnAroundSmoke() {
if (!turn_around_smoke_flag) TurnAroundSmoke_Sub1();
TurnAroundSmoke_Sub2();
if ((turn_around_smoke_bits[0] & 0x20) != 0) {
turn_around_smoke_flag = 0;
turn_around_smoke_flag2 = 0;
}
}
void TurnAroundSmoke_Sub1() {
uint8 i; // si
for (i = 3; (i & 0x80u) == 0; --i)
turn_around_smoke_bits[i] = kDATA_05D79D[i];
++turn_around_smoke_flag;
}
void 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 = TurnAroundSmoke_Sub3(v0);
v3 = v2 >> 2;
if (v3 >= 3u) {
LABEL_7:
get_OamEnt(oam_buf, v1)->ypos = -16;
} else {
oam = get_OamEnt(oam_buf, v1);
oam->charnum = kDATA_05D799[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 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 = kDATA_05D795[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 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_;
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;
}
}
// 7E03B9: using guessed type int8;
void 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);
}
// 7E0082: using guessed type int8;
// 7E0223: using guessed type int8;
void 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) {
SpinningCoinSprite_Draw3(bubble_obj_id[0]);
v3 = 4 * (spinning_coin_ctr2 - 1);
R4_ = 3;
do {
oam = get_OamEnt(oam_buf, v0);
oam->charnum = kDATA_05DC92[v3];
oam->flags = kDATA_05DCA6[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;
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 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;
SpinningCoinSprite_Draw2();
}
// 7E03B3: using guessed type int8;
void 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 + (kDATA_05DC80[spinning_coin_ctr2] | 0xFF00);
oam = get_OamEnt(oam_buf, j);
oam->xpos = spinning_coin_xpos0E6B + kDATA_05DC80[spinning_coin_ctr2];
oam[1].xpos = v2;
SetTwoTileSizes(j, v2);
if (HIBYTE(v2)) {
oam_tile_size_buffer[j] = 1;
oam_tile_size_buffer[j + 4] = 1;
}
v4 = spinning_coin_sprite_ypos + kDATA_05DC8C[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 + kDATA_05DC86[v1];
oam[2].xpos = v6;
oam[3].xpos = v6;
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 + kDATA_05DC8C[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 SetTwoTileSizes(uint8 j, uint8 a) {
if (a >= 0xF8u) {
oam_tile_size_buffer[j] = 1;
oam_tile_size_buffer[j + 4] = 1;
}
}
void 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 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 = kDATA_05DCE7[(frame_counter >> 1) & 3];
oam->flags = 40;
} else {
SpinningCoinSprite_Draw2();
}
} else {
SpinningCoinSprite_Draw(k, v1);
}
}
// 7E03B3: using guessed type int8;
void 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 = kFirstSprYPos[v2] + rel_ypos.misc;
*(uint16 *)&tempE4 = spr_rel_xpos16[6] + kFirstSprXPos[v2] - 8;
oam->xpos = tempE4;
oam_tile_size_buffer[v1] = 2;
if (tempE5) oam_tile_size_buffer[v1] = 3;
oam->charnum = kDATA_05DD4C[v2];
oam->flags = kHammerSprAttrib[v2];
if ((offscreen_bits.misc & 0xF) == 15 || (offscreen_bits.misc & 0xF0) != 0)
misc_state[object_index] = 0;
}
void 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 PauseMenu_Func3() {
++pausemenu_var3;
graphics_upload_ptr.bank = 9;
graphics_upload_ptr.addr = -16384;
graphics_upload_size = 2048;
graphics_upload_vramaddress = 31744;
}
void PauseMenu_Func4() {
++pausemenu_var3;
graphics_upload_ptr.bank = 4;
graphics_upload_ptr.addr = -18432;
graphics_upload_size = 2048;
graphics_upload_vramaddress = 31744;
}
void PauseMenu_Func5() {
PauseMenu_Func1();
PauseMenu_Func7_Hdma_05E21F();
w12sel_mirror = 34;
w34sel_mirror = 2;
tmw_mirror = 21;
tsw_mirror = 2;
}
void PauseMenu_Func6() {
PauseMenu_Func1();
PauseMenu_Func7_Hdma_05E21F();
PauseMenu_Func2();
PauseMenu_Func3();
display_pause_menu_flag = 1;
pausemenu_var1 = 0;
blinking_cursor_frame_counter = 0;
pausemenu_var2 = 0;
}
void MaybePauseMenuHandler() {
funcs_20A54[(uint8)(2 * pause_menu_idx) >> 1]();
}
// 20A5C: using guessed type int (*funcs_20A54[4])();
void PauseMenu_Func2() {
pausemenu_var4 = 16;
pausemenu_var5 = 100;
pausemenu_var6 = 164;
pausemenu_var7 = 196;
pausemenu_var8 = 208;
if (cutscene_var1680) {
if (number_of_players) LOBYTE(pausemenu_var4) = 14;
}
}
void MaybePauseMenu_State1() {
uint8 v0; // si
OamEnt *oam; // rbp
DrawPauseMenuLetters();
v0 = current_player;
if (cutscene_var1680 && number_of_players &&
(other_player_num_lives & 0x80u) == 0)
v0 = current_player ^ 1;
tempF2 = *(&controller_press1p1 + v0);
if ((tempF2 & 0x2C) != 0) {
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 & 0x80u) == 0) {
sound_ch3 = 1;
blinking_cursor_frame_counter = 0;
} else {
++pausemenu_var1;
}
} else if (++pausemenu_var1 < 3u) {
sound_ch3 = 1;
blinking_cursor_frame_counter = 0;
} else {
--pausemenu_var1;
}
}
oam = get_OamEnt(oam_buf, 0);
oam->xpos = 76;
oam->ypos = kDATA_05DFFA[pausemenu_var1];
oam->charnum =
kDATA_05DFFD[(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 || pausemenu_var1 == 2) {
pausemenu_var2 = 32;
if (pausemenu_var1) SaveGame_Main();
} else {
display_pause_menu_flag = 0;
game_mode_task = 14;
if (pausemenu_var1) SaveGame_Main();
}
}
}
void 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_ = 84;
while (1) {
v2 = kDATA_05DFFF[v1];
if (v2 >= 0) {
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_5;
}
++v1;
if (v2 == -1) break;
LABEL_5:
R0_ += 8;
if (R0_ >= 0xB8u) {
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 = kDATA_05DFFA[pausemenu_var1];
v6->charnum =
kDATA_05DFFD[(uint8)(blinking_cursor_frame_counter & 0x10) >> 4];
v6->flags = 33;
oam_tile_size_buffer[0] = 0;
}
void 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);
}
DrawPauseMenuLetters();
}
void 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;
PauseMenu_Func4();
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);
DrawPauseMenuLetters();
}
}
void MaybePauseMenu_State2() {
if (--pausemenu_var2 || (++pause_menu_idx, LOBYTE(pausemenu_var4) = 16,
pausemenu_var2 = 16, pausemenu_var1 != 2))
DrawPauseMenuLetters();
else
ResetGame_Main();
}
void 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, 0xE22Du);
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 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;
}
}
void 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;
}
}
// 7E03B0: using guessed type int8;
// 7E03BB: using guessed type int8;
void HandlePaletteAnimations() {
uint8 v0; // al
int v1; // rbp
int v2; // rbp
int v3; // rbp
if ((++palette_animation_frame_counter & 7) != 0) goto LABEL_2;
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] = kDATA_05E330[v1];
palette_mirror[5] = kDATA_05E378[v1];
palette_mirror[22] = kDATA_05E348[v1];
palette_mirror[20] = kDATA_05E330[v1 + 1];
palette_mirror[6] = kDATA_05E378[v1 + 1];
palette_mirror[23] = kDATA_05E348[v1 + 1];
palette_mirror[21] = kDATA_05E330[v1 + 2];
palette_mirror[7] = kDATA_05E378[v1 + 2];
palette_mirror[24] = kDATA_05E348[v1 + 2];
if (palette_anim0E20) {
LABEL_2:
HandlePaletteAnimations_Sub3();
} else if (area_data_addr_index && area_data_addr_index != 27) {
if (area_data_addr_index == 33) {
HandlePaletteAnimations_Sub1();
} else {
if (area_data_addr_index == 9) {
v2 = (uint8)((uint8)(palette_animation_frame_counter & 0x38) >> 2) >> 1;
palette_mirror[115] = kDATA_05E528[v2];
palette_mirror[116] = kDATA_05E538[v2];
palette_mirror[125] = kDATA_05E548[v2];
palette_mirror[126] = kDATA_05E558[v2];
palette_mirror[127] = kDATA_05E568[v2];
} else if (area_data_addr_index == 25 || area_data_addr_index == 26) {
v3 = (uint8)(2 * (palette_animation_frame_counter & 0x38)) >> 1;
palette_mirror[115] = kDATA_05E390[v3];
palette_mirror[116] = kDATA_05E390[v3 + 1];
palette_mirror[117] = kDATA_05E390[v3 + 2];
palette_mirror[118] = kDATA_05E390[v3 + 3];
palette_mirror[119] = kDATA_05E390[v3 + 4];
palette_mirror[120] = kDATA_05E390[v3 + 5];
}
update_entire_palette_flag = 1;
HandlePaletteAnimations_Sub3();
}
}
}
void HandlePaletteAnimations_Sub3() {
uint8 v0; // al
int v1; // rbp
if ((palette_animation_frame_counter & 3) == 0) {
v0 = ++palette_animation0E76;
if (palette_animation0E76 == 3) {
palette_animation0E76 = 0;
v0 = 0;
}
v1 = (uint8)(8 * v0) >> 1;
palette_mirror[25] = kDATA_05E360[v1];
palette_mirror[26] = kDATA_05E360[v1 + 1];
palette_mirror[27] = kDATA_05E360[v1 + 2];
update_entire_palette_flag = 1;
}
}
void HandlePaletteAnimations_Sub1() {
int v0; // rbp
int v1; // rbx
v0 = (uint8)(palette_animation_frame_counter & 0x38) >> 1;
palette_mirror[113] = kDATA_05E578[v0];
palette_mirror[114] = kDATA_05E578[v0 + 1];
palette_mirror[115] = kDATA_05E578[v0 + 2];
palette_mirror[116] = kDATA_05E578[v0 + 3];
v1 = (uint8)((uint8)(palette_animation_frame_counter & 0x38) >> 1) >> 1;
palette_mirror[126] = kDATA_05E5B8[v1];
palette_mirror[127] = kDATA_05E5B8[v1 + 1];
if (enemy_id[0] != 53) {
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;
goto LABEL_9;
}
if ((random_byte2 & 0xF) == 0) {
if (game_engine_subroutine == 8) sound_ch3 = 24;
palette_animation0EB8 = 17;
palette_animation0EB9 = 31;
palette_animation0EBA = 31;
++palette_animation0EB7;
LABEL_9:
*(uint16 *)&tempE4 = palette_animation0EB8 << 10;
*(uint16 *)&tempE4 |= *(uint16 *)&palette_animation0EBA |
(32 * palette_animation0EB9) & 0x1FFF;
palette_mirror[113] = *(uint16 *)&tempE4;
}
}
update_entire_palette_flag = 1;
HandlePaletteAnimations_Sub3();
}
void Smb1HandleLevelTileAnimations() {
int16 v0; // ax
int8 v1; // di
if (!pausemenu_var3) {
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 HandleTilesetGraphicsUploads() {
uint8 v0; // al
v0 = tileset_graphics_type;
if (tileset_graphics_type == 1) {
tileset_graphics_flag_var2f8 = tileset_graphics_type;
v0 = kDATA_05E700[current_player];
tileset_graphics_type = v0;
}
UploadTilesetGraphics(v0);
R0_ = *((uint8 *)kDATA_05E72C + (uint8)(2 * tileset_graphics_type));
R1_ = *((uint8 *)kDATA_05E72C + (uint8)(2 * tileset_graphics_type) + 1);
switch ((uint8)(2 * tileset_graphics_type) >> 1) {
case 0:
case 6:
case 8:
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:
UploadTilesetGraphics(0x11u);
break;
case 2:
case 5:
case 11:
case 12:
case 14:
case 16:
if (area_data_addr_index == 22 || area_data_addr_index == 20 ||
area_data_addr_index == 13)
goto LABEL_11;
UploadTilesetGraphics(0x17u);
break;
case 4:
UploadTilesetGraphics(0x13u);
UploadTilesetGraphics(0x14u);
break;
case 7:
case 9:
UploadTilesetGraphics(0x16u);
LABEL_11:
UploadTilesetGraphics(0x12u);
break;
case 10:
UploadTilesetGraphics(0x15u);
break;
}
tileset_graphics_type = 0;
vram_flag_028d = 0;
vram_flag_028c = 1;
}
void UploadTilesetGraphics(uint8 a) {
int v1; // rbp
graphics_upload_ptr.bank = kDATA_05E7B3[(uint8)(2 * a)];
v1 = (uint8)(2 * a) >> 1;
graphics_upload_ptr.addr = kDATA_05E7E5[v1];
graphics_upload_vramaddress = kDATA_05E817[v1];
graphics_upload_size = kDATA_05E849[v1];
UploadTilesetGraphicsDma();
}
void 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);
}
uint8 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; // 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 = CODE_05EA10(v6, v7, v8);
if ((R4_ & 0x80u) == 0)
v10 = rel_ypos.enemy + 16;
else
v10 = rel_ypos.enemy + 18;
v9 = CODE_05EA10(v6 + 2, v9, v10);
v10 = tempE4;
oam = get_OamEnt(oam_buf, v9);
oam[60].flags = R4_ | kDATA_05EA79[v10 + 0];
oam[61].flags = R4_ | kDATA_05EA79[v10 + 1];
oam[62].flags = R4_ | kDATA_05EA79[v10 + 2];
oam[63].flags = R4_ | kDATA_05EA79[v10 + 3];
++enemy_array_F40[9];
return 1;
}
// 7E03B9: using guessed type int8;
void 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 && world_number != 7) {
v0 = enemy_obj_id[object_index];
v8 = v0;
v1 = level_preview_sprites_ctr & 0x1F;
tempDD = kDATA_05E98B[level_preview_sprites_ctr & 0x1F];
v2 = OffsetYPosAndIncr(v0);
v3 = OffsetYPosAndIncr(v2);
v4 = OffsetYPosAndIncr(v3);
v5 = OffsetYPosAndIncr(v4);
v6 = OffsetYPosAndIncr(v5);
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 OffsetYPosAndIncr(uint8 j) {
OamEnt *oam; // rbp
oam = get_OamEnt(oam_buf, j);
oam[64].ypos += tempDD;
return j + 4;
}
uint8 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 = kDATA_05EA39[k];
oam[65].charnum = kDATA_05EA39[k + 1];
return j + 8;
}
void 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;
}
// 7E03B9: using guessed type int8;
void 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 = *(uint16 *)&tempE4 + 16 - screen_left_xpos16;
*(uint16 *)&tempE6 = *(uint16 *)&tempE4 + 4;
*(uint16 *)&tempE8 = *(uint16 *)&tempE4 + 12;
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 = kDATA_05EAEE[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 = kDATA_05EAE4[v3];
oam[2].charnum = kDATA_05EAE4[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;
}
void CODE_05EBAB() {
sram_hard_mode_flag = player_hard_mode_flag;
sram_world_number2 = world_number;
player_hard_mode_flag = 1;
hidden_1up_flag = 1;
title_screen_hard_mode_flag = 1;
primary_hard_mode = 1;
save_buffer_hard_mode_active_flag = 1;
music_ch1 = 0x80;
world_number = 0;
area_number = 0;
level_number = 0;
halfway_page = 0;
var0F0B = 0;
TransposePlayers_Far();
}
void DoSomeDigitsStuff() {
uint8 v0; // si
int8 v1; // di
bool v2; // cf
uint8 v3; // si
uint8 v4; // di
v0 = 5;
if (current_player) v0 = 11;
v1 = 5;
v2 = 1;
do v2 = marios_score[v0--] >= (uint8)(!v2 + displayed_score[(uint8)v1--]);
while (v1 >= 0);
if (v2) {
v3 = v0 + 1;
v4 = v1 + 1;
do displayed_score[v4++] = marios_score[v3++];
while (v4 < 6u);
}
}