mirror of https://github.com/snesrev/smw.git
1491 lines
40 KiB
C
1491 lines
40 KiB
C
#include "smbll_consts.h"
|
|
#include "smbll_funcs.h"
|
|
#include "smbll_rtl.h"
|
|
#include "smbll_variables.h"
|
|
void Smbll_InitGfxStuff() {
|
|
vram_flag_028c = 1;
|
|
var0F0B = 3;
|
|
vram_flag_028e = 0;
|
|
var0E67 = 0;
|
|
WriteReg(OBSEL, 3u);
|
|
WriteReg(BG1SC, 1u);
|
|
WriteReg(BG2SC, 9u);
|
|
WriteReg(BG3SC, 0x59u);
|
|
WriteReg(BG4SC, 0);
|
|
WriteReg(BG12NBA, 0x11u);
|
|
WriteReg(BG34NBA, 5u);
|
|
WriteReg(SETINI, 0);
|
|
game_mode = 0;
|
|
game_mode_task = 0;
|
|
g_byte_7FFFFF = 0;
|
|
layer1_xpos_lo = 0;
|
|
layer1_ypos_lo = 0;
|
|
WriteReg(BG1HOFS, 0);
|
|
WriteReg(BG1HOFS, 0);
|
|
WriteReg(BG1VOFS, 0);
|
|
WriteReg(BG1VOFS, 0);
|
|
WriteReg(BG2HOFS, 0);
|
|
WriteReg(BG2HOFS, 0);
|
|
WriteReg(BG2VOFS, 0);
|
|
WriteReg(BG2VOFS, 0);
|
|
WriteReg(BG3HOFS, 0);
|
|
WriteReg(BG3HOFS, 0);
|
|
WriteReg(BG3VOFS, 0);
|
|
WriteReg(BG3VOFS, 0);
|
|
bgmode_mirror = 9;
|
|
mosaic_mirror = 0;
|
|
tm_mirror = 16;
|
|
ts_mirror = 0;
|
|
w12sel_mirror = 0;
|
|
w34sel_mirror = 0;
|
|
wobjsel_mirror = 0;
|
|
cgwsel_mirror = 0;
|
|
cgadsub_mirror = 32;
|
|
coldata1_mirror = 32;
|
|
coldata2_mirror = 64;
|
|
coldata3_mirror = 0x80;
|
|
hdmaenable_mirror = 0;
|
|
inidisp_mirror = 0x80;
|
|
wait_for_vblank = 0;
|
|
global_frame_advance_debug_active_flag = 0;
|
|
fade_direction = 0;
|
|
display_pause_menu_flag = 0;
|
|
sprite0_hit_detect_flag = 0x80;
|
|
var0E67 = 0;
|
|
obj_yspeed.bubble[0] = 0;
|
|
render_graphics_var0EC9 = 0;
|
|
game_loop_toggler = 0;
|
|
vblank_upload_from_7f0000_flag = 0;
|
|
vblank_flag_0ED4 = 0;
|
|
update_entire_palette_flag = 0;
|
|
vram_buffer_addr_ctrl = 0;
|
|
vram_flag_028d = 0;
|
|
palette_mirror[0] = 0;
|
|
palette_mirror[128] = 0;
|
|
*(uint16 *)&vram_buffer1[2] = -1;
|
|
upload_buffer_3[1] = -1;
|
|
layer3_tilemap_upload_buf[1] = -1;
|
|
WriteReg(VMAIN, 0x80u);
|
|
WriteRegWord(VMADDL, 0x1000u);
|
|
WriteRegWord(DMAP0, 0x1801u);
|
|
WriteRegWord(A1T0L, 0x8000u);
|
|
WriteReg(A1B0, 3u);
|
|
WriteRegWord(DAS0L, 0x4000u);
|
|
WriteReg(MDMAEN, 1u);
|
|
WriteRegWord(VMADDL, 0x6000u);
|
|
WriteRegWord(A1T0L, 0x8000u);
|
|
WriteReg(A1B0, 4u);
|
|
WriteRegWord(DAS0L, 0x4000u);
|
|
WriteReg(MDMAEN, 1u);
|
|
WriteRegWord(VMADDL, 0x5000u);
|
|
WriteRegWord(A1T0L, 0xB000u);
|
|
WriteReg(A1B0, 9u);
|
|
WriteRegWord(DAS0L, 0x800u);
|
|
WriteReg(MDMAEN, 1u);
|
|
}
|
|
|
|
void Smbll_CODE_048600() {
|
|
if ((cutscene_var1680 & 0x80u) == 0) {
|
|
if (!cutscene_var1680) {
|
|
if ((controller_press1p1 & 0x10) == 0)
|
|
return;
|
|
++cutscene_var1680;
|
|
sound_ch1 = 67;
|
|
}
|
|
--cutscene_hdma_varB9A;
|
|
if ((--cutscene_hdma_varB9A & 0x80u) != 0) {
|
|
game_mode_task = 13;
|
|
player_hard_mode_flag = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Smbll_CODE_04862A() {
|
|
Smbll_PauseMenu_Func6();
|
|
if (world_number < 8u) {
|
|
cutscene_var1680 = 16;
|
|
area_number = 0;
|
|
level_number = 0;
|
|
if (smbll_varF2B) {
|
|
title_screen_hard_mode_flag = 1;
|
|
++world_number;
|
|
}
|
|
++world_number;
|
|
}
|
|
w12sel_mirror = 34;
|
|
w34sel_mirror = 2;
|
|
++game_mode_task;
|
|
if (number_of_players) {
|
|
tsw_mirror = 2;
|
|
display_pause_menu_flag = 0;
|
|
cutscene_var1680 = 4;
|
|
}
|
|
}
|
|
|
|
void Smbll_WaitForMusicAndChangeTask() {
|
|
if (!ReadReg(APUI00)) {
|
|
game_mode_task = 10;
|
|
cutscene_var1680 |= 0x80u;
|
|
}
|
|
}
|
|
|
|
void Smbll_CutsceneHdma() {
|
|
uint16 v0; // si
|
|
uint8 v1; // di
|
|
int8 v2; // di
|
|
int16 v3; // ax
|
|
uint16 v4; // ax
|
|
uint16 v5; // ax
|
|
|
|
if (cutscene_hdma_varB9A < 0x30u) {
|
|
cutscene_hdma_varB84 = 0;
|
|
cutscene_hdma_varB8E = 0;
|
|
cutscene_hdma_varB90 = 0;
|
|
cutscene_hdma_varB92 = 0;
|
|
cutscene_hdma_varB94 = kCircleHDMAData_DATA_00973E[(uint16)(2 * cutscene_hdma_varB9A) >> 1];
|
|
cutscene_hdma_varB96 = 120;
|
|
cutscene_hdma_varB98 = 176;
|
|
while (1) {
|
|
cutscene_hdma_varB80 = 256;
|
|
cutscene_hdma_varB82 = 256;
|
|
if ((uint16)(cutscene_hdma_varB90 + 1) < *(uint16 *)&cutscene_hdma_varB9A) {
|
|
cutscene_hdma_varB92 += cutscene_hdma_varB94;
|
|
WriteReg(WRMPYA, kCircleHDMAData_DATA_0096BD[cutscene_hdma_varB92 >> 9]);
|
|
WriteReg(WRMPYB, cutscene_hdma_varB9A);
|
|
cutscene_hdma_varB88 = ReadReg(RDMPYH);
|
|
cutscene_hdma_varB82 = cutscene_hdma_varB98 + cutscene_hdma_varB88;
|
|
cutscene_hdma_varB80 = cutscene_hdma_varB98 - cutscene_hdma_varB88;
|
|
}
|
|
cutscene_hdma_varB84 = 2 * (cutscene_hdma_varB96 - cutscene_hdma_varB90 - 1);
|
|
v0 = 2 * (cutscene_hdma_varB96 - cutscene_hdma_varB90 - 1);
|
|
v1 = cutscene_hdma_varB80;
|
|
if ((cutscene_hdma_varB80 & 0x8000u) != 0)
|
|
break;
|
|
if ((cutscene_hdma_varB80 & 0xFF00) != 0) {
|
|
if ((cutscene_hdma_varB80 & 0xFF00) != 256)
|
|
break;
|
|
v1 = -1;
|
|
}
|
|
LABEL_10:
|
|
cutscene_hdma_varB86 = v1;
|
|
v2 = cutscene_hdma_varB82;
|
|
if ((cutscene_hdma_varB82 & 0xFF00) != 0)
|
|
v2 = -1;
|
|
LOBYTE(v3) = 0;
|
|
HIBYTE(v3) = v2;
|
|
v4 = cutscene_hdma_varB86 | v3;
|
|
cutscene_hdma_varB86 = v4;
|
|
if (v0 < 0x1C0u) {
|
|
if (v4 == 0xFFFF)
|
|
v4 = 255;
|
|
hdma_data_array[v0 >> 1] = v4;
|
|
}
|
|
cutscene_hdma_varB8E = 2 * (cutscene_hdma_varB90 + cutscene_hdma_varB96 - 1);
|
|
if ((uint16)(2 * (cutscene_hdma_varB90 + cutscene_hdma_varB96 - 1)) < 0x1C0u) {
|
|
v5 = cutscene_hdma_varB86;
|
|
if (cutscene_hdma_varB86 == 0xFFFF)
|
|
v5 = 255;
|
|
hdma_data_array[(uint16)(2 * (cutscene_hdma_varB90 + cutscene_hdma_varB96 - 1)) >> 1] = v5;
|
|
}
|
|
++cutscene_hdma_varB90;
|
|
if (cutscene_hdma_varB84 >= 0x1C0u && cutscene_hdma_varB8E >= 0x1C0u) {
|
|
++cutscene_hdma_varB9A;
|
|
return;
|
|
}
|
|
}
|
|
v1 = 0;
|
|
goto LABEL_10;
|
|
}
|
|
}
|
|
|
|
void Smbll_DecodeAreaData_Sub_New() {
|
|
uint8 v0; // si
|
|
|
|
v0 = 0;
|
|
do {
|
|
level_data_map16_hi[v0] = 0;
|
|
level_data_map16_hi[v0 + 16] = 0;
|
|
level_data_map16_hi[v0 + 32] = 0;
|
|
level_data_map16_hi[v0 + 48] = 0;
|
|
level_data_map16_hi[v0 + 64] = 0;
|
|
level_data_map16_hi[v0 + 80] = 0;
|
|
level_data_map16_hi[v0 + 96] = 0;
|
|
level_data_map16_hi[v0 + 112] = 0;
|
|
level_data_map16_hi[v0 + 128] = 0;
|
|
level_data_map16_hi[v0 + 144] = 0;
|
|
level_data_map16_hi[v0 + 160] = 0;
|
|
level_data_map16_hi[v0 + 176] = 0;
|
|
level_data_map16_hi[v0++ + 192] = 0;
|
|
} while ((v0 & 0xF) != 0);
|
|
level_data_map16_hi[112] = 102;
|
|
level_data_map16_hi[113] = 102;
|
|
level_data_map16_hi[114] = 102;
|
|
level_data_map16_hi[163] = 102;
|
|
level_data_map16_hi[164] = 102;
|
|
level_data_map16_hi[165] = 102;
|
|
level_data_map16_hi[166] = 102;
|
|
level_data_map16_hi[121] = 102;
|
|
level_data_map16_hi[122] = 102;
|
|
level_data_map16_hi[123] = 102;
|
|
level_data_map16_hi[124] = 102;
|
|
level_data_map16_hi[125] = 102;
|
|
level_data_map16_hi[126] = 102;
|
|
render_graphics_var0EC9 = 1;
|
|
}
|
|
|
|
void Smbll_HandleLayersScroll() {
|
|
int8 v0; // al
|
|
int8 v1; // cl
|
|
bool v2; // cf
|
|
int8 v3; // al
|
|
uint16 v4; // ax
|
|
uint8 i; // di
|
|
int v6; // rbp
|
|
uint16 v7; // ax
|
|
|
|
tempF6 = 0;
|
|
*(uint16 *)&tempF3 = layers_scroll_0EEC;
|
|
*(uint16 *)&tempF7 = 0;
|
|
do {
|
|
v0 = *((uint8 *)kDATA_048949 + *(uint16 *)&tempF3);
|
|
v1 = 0;
|
|
v2 = __CFSHL__(v0, 1);
|
|
v3 = 2 * v0;
|
|
if (v2)
|
|
v1 = 1;
|
|
tempF5 = (2 * v3 + v1) & 1;
|
|
v4 = (uint8)(tempF5 + 2 * *((uint8 *)kDATA_048949 + *(uint16 *)&tempF3 + 1));
|
|
if (v4 >= 0x80u)
|
|
v4 |= 0xFF00u;
|
|
layer3_tilemap_upload_buf[*(uint16 *)&tempF7 >> 1] = layer2_xpos + v4 + 8;
|
|
*(uint16 *)&tempF3 = (*(uint16 *)&tempF3 + 16) & 0x1FF;
|
|
++*(uint16 *)&tempF7;
|
|
++*(uint16 *)&tempF7;
|
|
} while (*(uint16 *)&tempF7 != 64);
|
|
layers_scroll_0EEC = (layers_scroll_0EEC + 4) & 0x1FF;
|
|
for (i = 62; (i & 0x80u) == 0; i -= 2) {
|
|
v6 = i >> 1;
|
|
v7 = layer3_tilemap_upload_buf[v6];
|
|
layer3_tilemap_upload_buf[v6 + 32] = v7;
|
|
layer3_tilemap_upload_buf[v6 + 64] = v7;
|
|
layer3_tilemap_upload_buf[v6 + 96] = v7;
|
|
layer3_tilemap_upload_buf[v6 + 128] = v7;
|
|
layer3_tilemap_upload_buf[v6 + 160] = v7;
|
|
layer3_tilemap_upload_buf[v6 + 192] = v7;
|
|
layer3_tilemap_upload_buf[v6 + 224] = v7;
|
|
}
|
|
}
|
|
|
|
void Smbll_CODE_048B49() {
|
|
Smbll_CODE_048B59();
|
|
}
|
|
|
|
void Smbll_SMB3_BufferLayer3Tilemap() {
|
|
if (enable_layer3_bgflag) {
|
|
Smbll_CODE_048C77();
|
|
Smbll_CODE_048B59();
|
|
}
|
|
}
|
|
|
|
void Smbll_CODE_048B59() {
|
|
game_loop_toggler &= 0x80u;
|
|
if (area_type) {
|
|
if (area_type != 1)
|
|
return;
|
|
Smbll_SMB3_BufferLayer3CloudTilemap();
|
|
vblank_flag_0ED4 = 1;
|
|
} else {
|
|
Smbll_BufferAnimatedWaterSurfaceTiles();
|
|
vram_buffer_addr_ctrl = 6;
|
|
}
|
|
vblank_enable_vtimel_flag = 1;
|
|
}
|
|
|
|
void Smbll_SMB3_BufferLayer3CloudTilemap() {
|
|
uint16 v0; // si
|
|
uint16 v1; // ax
|
|
int v2; // rbp
|
|
int v3; // rbp
|
|
int v4; // rbx
|
|
|
|
*(uint16 *)&tempF7 = 14;
|
|
*(uint16 *)&R0_ = buffer_layer3_cloud_tilemap_offs;
|
|
v0 = layer3_tilemap_upload_buf[0];
|
|
LOBYTE(v1) = tempF4;
|
|
HIBYTE(v1) = tempF3;
|
|
v2 = layer3_tilemap_upload_buf[0] >> 1;
|
|
layer3_tilemap_upload_buf[v2 + 1] = v1;
|
|
layer3_tilemap_upload_buf[v2 + 30] = v1 + 1;
|
|
do {
|
|
v3 = (uint16)(8 * g_byte_7F3000[*(uint16 *)&R0_]) >> 1;
|
|
v4 = v0 >> 1;
|
|
layer3_tilemap_upload_buf[v4 + 2] = kword_1BB40[v3];
|
|
layer3_tilemap_upload_buf[v4 + 3] = kword_1BB40[v3 + 1];
|
|
layer3_tilemap_upload_buf[v4 + 31] = kword_1BB40[v3 + 2];
|
|
layer3_tilemap_upload_buf[v4 + 32] = kword_1BB40[v3 + 3];
|
|
v0 += 4;
|
|
*(uint16 *)&R0_ += 16;
|
|
--*(uint16 *)&tempF7;
|
|
} while (*(uint16 *)&tempF7);
|
|
layer3_tilemap_upload_buf[(layer3_tilemap_upload_buf[0] >> 1) + 59] = -1;
|
|
layer3_tilemap_upload_buf[0] += 116;
|
|
if ((((uint8)buffer_layer3_cloud_tilemap_offs + 1) & 0xF) != 0)
|
|
++buffer_layer3_cloud_tilemap_offs;
|
|
else
|
|
buffer_layer3_cloud_tilemap_offs = (buffer_layer3_cloud_tilemap_offs & 0xFFF0) + 224;
|
|
if (buffer_layer3_cloud_tilemap_offs >= 0xA80u)
|
|
buffer_layer3_cloud_tilemap_offs = 0;
|
|
*(uint16 *)&tempF3 += 512;
|
|
}
|
|
|
|
void Smbll_BufferAnimatedWaterSurfaceTiles() {
|
|
uint16 v0; // ax
|
|
int v1; // rbp
|
|
uint16 v2; // ax
|
|
uint16 v3; // di
|
|
|
|
v0 = *(uint16 *)&tempF3;
|
|
v1 = vram_buffer2[0] >> 1;
|
|
vram_buffer2[v1 + 1] = *(uint16 *)&tempF3;
|
|
v0 += 256;
|
|
vram_buffer2[v1 + 4] = v0;
|
|
*(uint16 *)&tempF3 = v0 + 256;
|
|
vram_buffer2[v1 + 2] = 256;
|
|
vram_buffer2[v1 + 5] = 256;
|
|
if ((*(uint16 *)&tempF3 & 0x200) != 0) {
|
|
v2 = 11310;
|
|
v3 = 11311;
|
|
} else {
|
|
v2 = 11308;
|
|
v3 = 11309;
|
|
}
|
|
vram_buffer2[v1 + 3] = v2;
|
|
vram_buffer2[v1 + 6] = v3;
|
|
vram_buffer2[v1 + 7] = -1;
|
|
vram_buffer2[0] += 12;
|
|
}
|
|
|
|
void Smbll_CODE_048C77() {
|
|
int16 v0; // ax
|
|
|
|
LOBYTE(v0) = (uint16)(layer3_xpos + 288) >> 8;
|
|
HIBYTE(v0) = layer3_xpos + 32;
|
|
*(uint16 *)&tempF3 = v0;
|
|
Smbll_CODE_048C85();
|
|
}
|
|
|
|
void Smbll_CODE_048C85() {
|
|
uint8 v0; // al
|
|
|
|
if ((tempF3 & 1) != 0)
|
|
v0 = 92;
|
|
else
|
|
v0 = 88;
|
|
tempF3 = v0;
|
|
tempF4 = (tempF4 >> 3) + 0x80;
|
|
}
|
|
|
|
void Smbll_SpawnCastleTilesWithPriority() {
|
|
uint16 v0; // si
|
|
uint16 v1; // di
|
|
uint8 *v2; // rdx
|
|
int16 v3; // ax
|
|
uint16 v4; // si
|
|
int16 v5; // ax
|
|
int16 v6; // di
|
|
int16 v7; // ax
|
|
int16 v8; // di
|
|
|
|
tempF5 = 1;
|
|
*(uint16 *)&tempF3 = koff_1874C[(uint8)((2 * (render_graphics_var0EE6 & 1)) & 2) >> 1];
|
|
v0 = *(uint16 *)vram_buffer1;
|
|
v1 = 0;
|
|
do {
|
|
v2 = IndirPtr(*(LongPtr *)&tempF3, v1);
|
|
v3 = *(uint16 *)v2;
|
|
*(uint16 *)&vram_buffer1[v0 + 2] = *(uint16 *)v2;
|
|
v1 += 2;
|
|
v0 += 2;
|
|
} while (v3 != -1);
|
|
v4 = *(uint16 *)vram_buffer1;
|
|
if ((render_graphics_var0EF4 & 0x20) != 0)
|
|
*(uint16 *)&render_graphics_var0EF4 = *(uint16 *)&render_graphics_var0EF4 & 0xFDF ^ 0x400;
|
|
LOBYTE(v5) = (uint16)((*(uint16 *)&render_graphics_var0EF4 + 705) & 0xFDF) >> 8;
|
|
HIBYTE(v5) = (render_graphics_var0EF4 - 63) & 0xDF;
|
|
*(uint16 *)&vram_buffer1[*(uint16 *)vram_buffer1 + 2] = v5;
|
|
v6 = __PAIR16__(v5, HIBYTE(v5)) + 1;
|
|
if (((HIBYTE(v5) + 1) & 0x20) != 0)
|
|
v6 = v6 & 0xFDF ^ 0x400;
|
|
LOBYTE(v7) = HIBYTE(v6);
|
|
HIBYTE(v7) = v6;
|
|
*(uint16 *)&vram_buffer1[v4 + 14] = v7;
|
|
v8 = v6 + 1;
|
|
LOBYTE(v7) = HIBYTE(v8);
|
|
HIBYTE(v7) = v8;
|
|
*(uint16 *)&vram_buffer1[v4 + 26] = v7;
|
|
*(uint16 *)vram_buffer1 += 36;
|
|
render_graphics_var0EE6 = 0;
|
|
vram_buffer_addr_ctrl = 6;
|
|
}
|
|
|
|
void Smbll_CODE_048D71() {
|
|
int16 v0; // ax
|
|
uint8 v1; // si
|
|
int16 v2; // ax
|
|
int v3; // edx
|
|
int16 v4; // ax
|
|
int v5; // edx
|
|
|
|
v0 = *(uint16 *)&vram_buffer1[LOBYTE(vram_buffer2[0]) + 760];
|
|
if (v0 == 36 || v0 == 4260) {
|
|
if ((uint8)render_area_gfx_0ECE)
|
|
return;
|
|
++render_area_gfx_0ECE;
|
|
v1 = vram_buffer1[0];
|
|
LOBYTE(v2) = (uint16)(((render_graphics_var0ecc - 1) & 0x41F) + 832) >> 8;
|
|
HIBYTE(v2) = ((render_graphics_var0ecc - 1) & 0x1F) + 64;
|
|
v3 = vram_buffer1[0];
|
|
*(uint16 *)&vram_buffer1[vram_buffer1[0] + 2] = v2;
|
|
*(uint16 *)&vram_buffer1[v3 + 4] = 1920;
|
|
*(uint16 *)&vram_buffer1[v1 + 6] = 2573;
|
|
*(uint16 *)&vram_buffer1[v1 + 8] = 2589;
|
|
*(uint16 *)&vram_buffer1[v1 + 10] = 2575;
|
|
*(uint16 *)&vram_buffer1[v1 + 12] = 2591;
|
|
goto LABEL_10;
|
|
}
|
|
if (v0 == 2568) {
|
|
if (HIBYTE(render_area_gfx_0ECE)) {
|
|
render_area_gfx_0ECE = 0;
|
|
if (*(uint16 *)((int8 *)&screen_left_xpos16 + 1) || render_graphics_var0ecc) {
|
|
v1 = vram_buffer1[0];
|
|
LOBYTE(v4) = (uint16)(render_graphics_var0ecc + 832) >> 8;
|
|
HIBYTE(v4) = render_graphics_var0ecc + 64;
|
|
v5 = vram_buffer1[0];
|
|
*(uint16 *)&vram_buffer1[vram_buffer1[0] + 2] = v4;
|
|
*(uint16 *)&vram_buffer1[v5 + 4] = 1920;
|
|
*(uint16 *)&vram_buffer1[v1 + 6] = 2572;
|
|
*(uint16 *)&vram_buffer1[v1 + 8] = 2588;
|
|
*(uint16 *)&vram_buffer1[v1 + 10] = 2574;
|
|
*(uint16 *)&vram_buffer1[v1 + 12] = 2590;
|
|
LABEL_10:
|
|
*(uint16 *)&vram_buffer1[v1 + 14] = -1;
|
|
*(uint16 *)vram_buffer1 = v1 + 12;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void Smbll_ExtObj09_PulleyRope(uint8 k) {
|
|
uint8 v1; // di
|
|
|
|
uint8 v2 = Smbll_ChkLrgObjLength(k) >> 8;
|
|
v1 = 0;
|
|
if (!v2) {
|
|
v1 = 1;
|
|
if (!area_object_length[k])
|
|
v1 = 2;
|
|
}
|
|
metatile_buffer[0] = kPulleyRopeMetatiles[v1];
|
|
}
|
|
|
|
void Smbll_DecodeAreaData_Sub2_New(uint16 j) {
|
|
uint16 addr; // kr00_2
|
|
uint8 *v3; // rdx
|
|
uint16 v4; // si
|
|
int v5; // r14
|
|
uint8 v6; // si
|
|
uint8 v7; // di
|
|
uint8 v8; // di
|
|
uint8 v9; // di
|
|
uint8 v10; // si
|
|
uint8 v11; // di
|
|
uint8 v12; // di
|
|
uint8 v13; // di
|
|
uint8 v14; // si
|
|
uint8 slot; // si
|
|
uint8 v16; // al
|
|
int8 v17; // al
|
|
uint8 v18; // di
|
|
uint8 v19; // di
|
|
uint8 v20; // al
|
|
uint8 v21; // di
|
|
bool v22; // sf
|
|
uint8 v23; // di
|
|
uint8 v24; // di
|
|
uint8 v25; // di
|
|
uint8 v26; // di
|
|
uint8 v27; // di
|
|
uint8 i; // di
|
|
uint8 v29; // di
|
|
uint8 v30; // di
|
|
uint8 v31; // di
|
|
uint8 v32; // di
|
|
uint8 v33; // di
|
|
uint8 v34; // di
|
|
uint8 v35; // di
|
|
uint8 v36; // di
|
|
uint8 v37; // al
|
|
uint8 v38; // di
|
|
uint8 v39; // di
|
|
uint8 v40; // al
|
|
uint8 v41; // di
|
|
uint8 v42; // di
|
|
uint8 v43; // di
|
|
uint8 v44; // si
|
|
uint8 v45; // di
|
|
uint8 v46; // di
|
|
uint8 v47; // [rsp+46h] [rbp-2h]
|
|
uint8 v48; // [rsp+46h] [rbp-2h]
|
|
uint8 xpos; // [rsp+46h] [rbp-2h]
|
|
uint8 v50; // [rsp+46h] [rbp-2h]
|
|
uint8 t0;
|
|
|
|
addr = area_data_ptr.addr;
|
|
tempF4 = HIBYTE(addr);
|
|
tempF3 = addr;
|
|
tempF5 = area_data_ptr.bank;
|
|
v3 = IndirPtr(*(LongPtr *)&tempF3, j + 2);
|
|
v4 = *v3 & 0x7F;
|
|
v5 = (int)(uint8)v4 >> 1;
|
|
R0_ = *((uint8 *)koff_188C1 + (*v3 & 0x7F));
|
|
R1_ = *((uint8 *)koff_188C1 + v4 + 1);
|
|
v6 = object_index;
|
|
switch ((int8)v5) {
|
|
case 0:
|
|
v10 = 0;
|
|
v11 = 15;
|
|
goto LABEL_10;
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
case 10:
|
|
case 13:
|
|
case 14:
|
|
case 15:
|
|
case 21:
|
|
case 22:
|
|
case 23:
|
|
case 33:
|
|
case 34:
|
|
case 35:
|
|
case 36:
|
|
case 37:
|
|
case 38:
|
|
case 39:
|
|
case 41:
|
|
case 42:
|
|
case 43:
|
|
case 44:
|
|
case 45:
|
|
case 46:
|
|
case 47:
|
|
case 49:
|
|
case 50:
|
|
case 51:
|
|
case 52:
|
|
case 53:
|
|
case 54:
|
|
case 55:
|
|
case 57:
|
|
case 58:
|
|
case 59:
|
|
case 60:
|
|
case 61:
|
|
case 62:
|
|
case 63: return;
|
|
case 8:
|
|
v47 = object_index;
|
|
Smbll_RenderUnderPart_Far(1u, 0xFu, 0x44u);
|
|
v11 = Smbll_CODE_0491C0(v47);
|
|
v10 = 1;
|
|
LABEL_10:
|
|
Smbll_RenderUnderPart_Far(v10, v11, 0x40u);
|
|
return;
|
|
case 9:
|
|
v7 = Smbll_CODE_0491C0(object_index);
|
|
Smbll_ChkLrgObjFixedLength(v6, v7);
|
|
metatile_buffer[R7_] = 0;
|
|
return;
|
|
case 11:
|
|
v8 = Smbll_CODE_0491C0(object_index);
|
|
Smbll_ChkLrgObjFixedLength(v6, v8);
|
|
metatile_buffer[R7_] = 96;
|
|
return;
|
|
case 12:
|
|
v9 = Smbll_CODE_0491C0(object_index);
|
|
Smbll_ChkLrgObjFixedLength(v6, v9);
|
|
metatile_buffer[R7_] = 97;
|
|
return;
|
|
case 16:
|
|
v12 = Smbll_CODE_0491C0(object_index);
|
|
R7_ = v12;
|
|
render_graphics_var0EE7 = 0;
|
|
if (!v12)
|
|
v12 = 8;
|
|
Smbll_ChkLrgObjFixedLength(v6, v12 + 1);
|
|
v48 = v6;
|
|
v13 = area_object_length[v6];
|
|
v14 = R7_;
|
|
R6_ = 22;
|
|
do {
|
|
metatile_buffer[v14++] = kbyte_189AF[v13];
|
|
if (R6_) {
|
|
v13 += 10;
|
|
--R6_;
|
|
}
|
|
} while (v14 != 11);
|
|
if (R7_ && !area_object_length[v48])
|
|
metatile_buffer[10] = 0;
|
|
if (column_pos_hi) {
|
|
if (area_object_length[v48] == 5) {
|
|
xpos = Smbll_GetAreaObjXPosition_Far();
|
|
slot = Smbll_FindEmptyEnemySlot_Far();
|
|
obj_xpos_lo.enemy[slot] = xpos + 8;
|
|
obj_xpos_hi.enemy[slot] = __CFADD__(xpos, 8) + column_pos_hi;
|
|
obj_ypos_hi.enemy[slot] = 1;
|
|
enemy_flag[slot] = 1;
|
|
obj_ypos_lo.enemy[slot] = -112;
|
|
enemy_id[slot] = 49;
|
|
++render_graphics_var0EE7;
|
|
if (R7_)
|
|
++render_graphics_var0EE7;
|
|
}
|
|
}
|
|
if (column_pos_hi) {
|
|
switch (metatile_buffer[11]) {
|
|
case 'N': v16 = -4; break;
|
|
case '"': v16 = 36; break;
|
|
case 'p':
|
|
v16 = 115;
|
|
metatile_buffer[12] = 115;
|
|
break;
|
|
case 'f': v16 = 105; break;
|
|
default: v16 = 116; break;
|
|
}
|
|
metatile_buffer[11] = v16;
|
|
}
|
|
return;
|
|
case 17: v17 = 6; goto LABEL_39;
|
|
case 18: v17 = 7; goto LABEL_39;
|
|
case 19:
|
|
v17 = 9;
|
|
LABEL_39:
|
|
v50 = v17;
|
|
v18 = Smbll_CODE_0491C0(object_index);
|
|
Smbll_ChkLrgObjFixedLength(v6, v18);
|
|
metatile_buffer[v50] = 7;
|
|
return;
|
|
case 20:
|
|
v19 = Smbll_CODE_0491C0(object_index);
|
|
Smbll_ChkLrgObjFixedLength(v6, v19);
|
|
tempF3 = metatile_buffer[0];
|
|
if (metatile_buffer[0] == 99)
|
|
v20 = metatile_buffer[0] + 1;
|
|
else
|
|
v20 = metatile_buffer[0] - 1;
|
|
tempF4 = v20;
|
|
v21 = R7_;
|
|
if ((R7_ & 1) != 0)
|
|
goto LABEL_44;
|
|
while (1) {
|
|
metatile_buffer[v21] = tempF3;
|
|
v22 = (--area_object_length[v6] & 0x80u) != 0;
|
|
if (v22)
|
|
break;
|
|
++v21;
|
|
LABEL_44:
|
|
metatile_buffer[v21] = tempF4;
|
|
v22 = (--area_object_length[v6] & 0x80u) != 0;
|
|
if (v22)
|
|
break;
|
|
++v21;
|
|
}
|
|
return;
|
|
case 24:
|
|
v23 = Smbll_CODE_0491C0(object_index);
|
|
t0 = area_object_length[v6];
|
|
Smbll_ChkLrgObjFixedLength(v6, v23);
|
|
if (t0 & 0x80)
|
|
decode_area_data_var0734 = 9;
|
|
--decode_area_data_var0734;
|
|
Smbll_RenderUnderPart_Far(kbyte_18B24[decode_area_data_var0734], kbyte_18B1B[decode_area_data_var0734], 0x62u);
|
|
return;
|
|
case 25:
|
|
v24 = Smbll_CODE_0491C0(object_index);
|
|
Smbll_ChkLrgObjFixedLength(v6, v24);
|
|
v25 = R7_;
|
|
if (area_object_length[v6]) {
|
|
if (metatile_buffer[R7_])
|
|
goto LABEL_59;
|
|
metatile_buffer[R7_] = -10;
|
|
} else {
|
|
metatile_buffer[R7_] = -12;
|
|
if (!metatile_buffer[++v25])
|
|
metatile_buffer[v25++] = -11;
|
|
}
|
|
do {
|
|
if (!metatile_buffer[v25])
|
|
metatile_buffer[v25] = -9;
|
|
LABEL_59:
|
|
++v25;
|
|
} while (v25 != 13);
|
|
return;
|
|
case 26:
|
|
v26 = Smbll_CODE_0491C0(object_index);
|
|
Smbll_ChkLrgObjFixedLength(v6, v26);
|
|
v27 = R7_;
|
|
metatile_buffer[R7_] = 101;
|
|
for (i = v27 + 2; metatile_buffer[i] == 99 || metatile_buffer[i] == 100; i += 2)
|
|
metatile_buffer[i] = 101;
|
|
return;
|
|
case 27:
|
|
v29 = Smbll_CODE_0491C0(object_index);
|
|
Smbll_ChkLrgObjFixedLength(v6, v29);
|
|
v30 = R7_;
|
|
metatile_buffer[R7_] = -8;
|
|
v31 = v30 + 1;
|
|
do {
|
|
if (metatile_buffer[v31] == 0xEC)
|
|
break;
|
|
metatile_buffer[v31++] = -7;
|
|
} while (v31 != 13);
|
|
return;
|
|
case 28:
|
|
v32 = Smbll_CODE_0491C0(object_index);
|
|
Smbll_ChkLrgObjFixedLength(v6, v32);
|
|
v33 = R7_;
|
|
if (metatile_buffer[R7_] != 0xFD)
|
|
metatile_buffer[R7_] = -6;
|
|
v34 = v33 + 1;
|
|
do {
|
|
if (metatile_buffer[v34] == 0xF1)
|
|
break;
|
|
metatile_buffer[v34++] = -5;
|
|
} while (v34 != 13);
|
|
return;
|
|
case 29:
|
|
v35 = Smbll_CODE_0491C0(object_index);
|
|
Smbll_ChkLrgObjFixedLength(v6, v35);
|
|
v36 = R7_;
|
|
if (area_object_length[v6]) {
|
|
if (metatile_buffer[R7_] == 102)
|
|
v37 = -17;
|
|
else
|
|
v37 = -20;
|
|
metatile_buffer[R7_] = v37;
|
|
metatile_buffer[v36 + 1] = -19;
|
|
metatile_buffer[12] = 103;
|
|
} else {
|
|
if (metatile_buffer[R7_] != 104)
|
|
metatile_buffer[R7_] = 2;
|
|
metatile_buffer[v36 + 1] = -18;
|
|
}
|
|
return;
|
|
case 30:
|
|
v38 = Smbll_CODE_0491C0(object_index);
|
|
Smbll_ChkLrgObjFixedLength(v6, v38);
|
|
v39 = R7_;
|
|
if (area_object_length[v6]) {
|
|
if (metatile_buffer[R7_] != 104)
|
|
metatile_buffer[R7_] = 3;
|
|
metatile_buffer[v39 + 1] = -16;
|
|
} else {
|
|
if (metatile_buffer[R7_] == 102) {
|
|
v40 = -13;
|
|
} else {
|
|
v41 = R7_ + 2;
|
|
do
|
|
metatile_buffer[v41++] = 103;
|
|
while (v41 != 13);
|
|
v39 = R7_;
|
|
v40 = -15;
|
|
}
|
|
metatile_buffer[v39] = v40;
|
|
metatile_buffer[v39 + 1] = -14;
|
|
}
|
|
return;
|
|
case 31:
|
|
v42 = Smbll_CODE_0491C0(object_index);
|
|
Smbll_ChkLrgObjFixedLength(v6, v42);
|
|
v43 = R7_;
|
|
do {
|
|
metatile_buffer[v43++] = 112;
|
|
v22 = (--area_object_length[v6] & 0x80u) != 0;
|
|
} while (!v22);
|
|
return;
|
|
case 32:
|
|
Smbll_ChkLrgObjFixedLength(object_index, 3u);
|
|
R5_ = Smbll_CODE_0491C0(v6) - 2;
|
|
R6_ = area_object_length[v6];
|
|
v44 = R5_ + 1;
|
|
if (kbyte_18C96[R6_]) {
|
|
v44 = Smbll_RenderUnderPart_Far(0, R5_, kbyte_18C96[R6_]);
|
|
}
|
|
v45 = R6_;
|
|
metatile_buffer[v44] = kbyte_18C9A[R6_];
|
|
metatile_buffer[v44 + 1] = kbyte_18C9E[v45];
|
|
return;
|
|
case 40:
|
|
v46 = Smbll_CODE_0491C0(object_index);
|
|
Smbll_RenderUnderPart_Far(2u, v46, 0x78u);
|
|
return;
|
|
case 48: Smbll_sub_AAC0(v6, 1); goto lbl_56;
|
|
case 56:
|
|
Smbll_sub_AAC0(v6, 4);
|
|
lbl_56:
|
|
metatile_buffer[v6] = 28;
|
|
if (*(&block_buffer_column_pos + v6) == 27)
|
|
++metatile_buffer[v6];
|
|
return;
|
|
}
|
|
}
|
|
|
|
uint8 Smbll_CODE_0491C0(uint8 k) {
|
|
uint16 v1; // di
|
|
|
|
v1 = area_obj_offset_buffer[(uint16)(2 * k) >> 1] + 1;
|
|
R7_ = *IndirPtr(*(LongPtr *)&tempF3, v1) >> 4;
|
|
return *IndirPtr(*(LongPtr *)&tempF3, v1) & 0xF;
|
|
}
|
|
|
|
uint8 Smbll_CODE_0491DD() {
|
|
uint16 v0; // si
|
|
uint16 v1; // di
|
|
uint16 v2; // ax
|
|
uint16 v3; // ax
|
|
uint16 i; // si
|
|
uint16 v5; // ax
|
|
PairU16 v6; // edx
|
|
PairU16 v7; // edx
|
|
uint8 result; // di
|
|
|
|
v0 = 0;
|
|
v1 = vram_buffer2[0];
|
|
if (current_player) {
|
|
while (1) {
|
|
v2 = kGameOverScreenStripeImage_Luigi[v0 >> 1];
|
|
vram_buffer2[(v1 >> 1) + 1] = v2;
|
|
if (v2 == 0xFFFF)
|
|
break;
|
|
v0 += 2;
|
|
v1 += 2;
|
|
}
|
|
} else {
|
|
while (1) {
|
|
v3 = kGameOverScreenStripeImage[v0 >> 1];
|
|
vram_buffer2[(v1 >> 1) + 1] = v3;
|
|
if (v3 == 0xFFFF)
|
|
break;
|
|
v0 += 2;
|
|
v1 += 2;
|
|
}
|
|
}
|
|
for (i = 0;; i += 2) {
|
|
v5 = kGameOverScreenStripeImage_TitleLogo[i >> 1];
|
|
vram_buffer2[(v1 >> 1) + 1] = v5;
|
|
if (v5 == 0xFFFF)
|
|
break;
|
|
v1 += 2;
|
|
}
|
|
vram_buffer2[0] = v1;
|
|
*(uint16 *)&R2_ = -19366;
|
|
v6 = Smbll_CODE_049724(0xA0u, 0);
|
|
v7 = Smbll_CODE_049724(v6.first, v6.second);
|
|
result = Smbll_CODE_049724(v7.first, v7.second).second;
|
|
layer2_xpos = 0;
|
|
layer3_xpos = 0;
|
|
vram_buffer_addr_ctrl = 6;
|
|
vblank_which_layer2_scroll_flag = 0;
|
|
WriteReg(BG2HOFS, 0);
|
|
WriteReg(BG2HOFS, 0);
|
|
WriteReg(BG3HOFS, 0);
|
|
WriteReg(BG3HOFS, 0);
|
|
tm_mirror = 23;
|
|
tileset_graphics_type = 10;
|
|
update_entire_palette_flag = 1;
|
|
Smbll_HandleTilesetGraphicsUploads();
|
|
override_player_xpos2_flag = -1;
|
|
smbll_varF26 = 0;
|
|
layer2_ypos = 0;
|
|
WriteReg(BG2VOFS, 0);
|
|
WriteReg(BG2VOFS, 0);
|
|
return result;
|
|
}
|
|
|
|
void Smbll_sub_18F08() {
|
|
smbll_varF26 = kbyte_18E0A[area_data_addr_index];
|
|
}
|
|
|
|
void Smbll_CODE_0492E7() {
|
|
uint16 v0; // di
|
|
int v1; // rbp
|
|
uint16 v2; // di
|
|
uint16 v3; // si
|
|
uint16 v4; // ax
|
|
uint16 v5; // di
|
|
uint16 v6; // si
|
|
uint16 v7; // ax
|
|
uint16 v8; // si
|
|
uint16 v9; // ax
|
|
uint16 v10; // si
|
|
uint16 v11; // ax
|
|
uint8 v12; // al
|
|
|
|
if (unused_byte_7E0E1A)
|
|
unused_byte_7E0E1A = 0;
|
|
Smbll_sub_18F08();
|
|
music_ch1 = 0x80;
|
|
tileset_graphics_type = kbyte_18E52[(uint8)(level_level_preview_image_to_use - 1)] & 0x1F;
|
|
disable_screen_flag = 1;
|
|
game_loop_toggler = 1;
|
|
Smbll_HandleTilesetGraphicsUploads();
|
|
area_parser_ctr1 = 0;
|
|
tree_ledge_saved_x = 0;
|
|
tree_ledge_arr130F[0] = 0;
|
|
set_level_music_flag = 0;
|
|
vblank_which_layer2_scroll_flag = 0;
|
|
render_graphics_var0EC9 = 0;
|
|
var0EDB = 0;
|
|
cutscene_hdma_varB9A = 0;
|
|
cutscene_var1680 = 0;
|
|
enable_layer3_bgflag = 0;
|
|
Smbll_Dma_CODE_0480EF();
|
|
*(uint16 *)&tree_ledge_countdown = 0;
|
|
*(uint16 *)&tree_ledge_arr130F[1] = 0;
|
|
*(uint16 *)&tree_ledge_arr130F[3] = 0;
|
|
v0 = vram_buffer2[0];
|
|
v1 = vram_buffer2[0] >> 1;
|
|
vram_buffer2[v1 + 1] = -14583;
|
|
vram_buffer2[v1 + 2] = 4800;
|
|
vram_buffer2[v1 + 3] = 12450;
|
|
vram_buffer2[v1 + 4] = -10231;
|
|
vram_buffer2[v1 + 5] = 4800;
|
|
vram_buffer2[v1 + 6] = 28834;
|
|
vram_buffer2[v1 + 7] = -22519;
|
|
vram_buffer2[v1 + 8] = 7744;
|
|
vram_buffer2[v1 + 9] = 12408;
|
|
vram_buffer2[v1 + 10] = 2059;
|
|
vram_buffer2[v1 + 11] = 7744;
|
|
vram_buffer2[v1 + 12] = -20360;
|
|
v2 = v0 + 24;
|
|
v3 = 0;
|
|
do {
|
|
v4 = kLevelPreviewStripeImages[v3 >> 1];
|
|
vram_buffer2[(v2 >> 1) + 1] = v4;
|
|
v3 += 2;
|
|
v2 += 2;
|
|
} while (v4 != 0xFFFF);
|
|
v5 = v2 - 2;
|
|
v6 = koff_18DA2[(uint16)(2 * (uint8)(level_level_preview_image_to_use - 1)) >> 1];
|
|
do {
|
|
v7 = kLevelPreviewStripeImages_Main[v6 >> 1];
|
|
vram_buffer2[(v5 >> 1) + 1] = v7;
|
|
v6 += 2;
|
|
v5 += 2;
|
|
} while (v7 != 0xFFFF);
|
|
if (background_color_ctrl_0 == 17) {
|
|
v5 -= 2;
|
|
v8 = 0;
|
|
do {
|
|
v9 = kword_1ABA6[v8 >> 1];
|
|
vram_buffer2[(v5 >> 1) + 1] = v9;
|
|
v8 += 2;
|
|
v5 += 2;
|
|
} while (v9 != 0xFFFF);
|
|
}
|
|
if ((background_color_ctrl_0 & 0xF0) != 0 && background_color_ctrl_0 != 22) {
|
|
v5 -= 2;
|
|
v10 = 0;
|
|
do {
|
|
v11 = kword_1ABD2[v10 >> 1];
|
|
vram_buffer2[(v5 >> 1) + 1] = v11;
|
|
v10 += 2;
|
|
v5 += 2;
|
|
} while (v11 != 0xFFFF);
|
|
}
|
|
vram_buffer2[0] = v5;
|
|
Smbll_CODE_0495E2();
|
|
--screen_routine_task;
|
|
update_entire_palette_flag = 1;
|
|
palette_mirror[0] = 0;
|
|
tempEB = player_status;
|
|
player_status = 1;
|
|
v12 = background_color_ctrl_0 & 0xF0;
|
|
if ((background_color_ctrl_0 & 0xF0) != 0)
|
|
v12 = 4;
|
|
background_color_ctrl = v12;
|
|
if (background_color_ctrl_0 == 2)
|
|
background_color_ctrl = 3;
|
|
if (area_data_addr_index == 8)
|
|
background_color_ctrl = 1;
|
|
Smbll_GetPlayerColors();
|
|
--update_entire_palette_flag;
|
|
player_status = tempEB;
|
|
background_color_ctrl_0 = 0;
|
|
tm_mirror = 23;
|
|
vram_buffer_addr_ctrl = 6;
|
|
vblank_enable_vtimel_flag = 0;
|
|
layer2_ypos = 0;
|
|
WriteReg(BG2VOFS, 0);
|
|
WriteReg(BG2VOFS, 0);
|
|
}
|
|
|
|
void Smbll_CODE_0494EA() {
|
|
uint16 v0; // kr00_2
|
|
|
|
if (draw_level_preview_sprites_var009B) {
|
|
draw_level_preview_sprites_var009B = 0;
|
|
v0 = screen_left_xpos16_b;
|
|
screen_left_xpos_hi = HIBYTE(v0);
|
|
screen_left_xpos_lo = v0;
|
|
layer1_xpos_lo = screen_left_xpos16_b;
|
|
layer2_xpos = screen_left_xpos16_b >> 1;
|
|
layer3_xpos = screen_left_xpos16_b >> 2;
|
|
UNUSED_word_7E0ED7 = screen_left_xpos16_b >> 2;
|
|
}
|
|
g_byte_7E0EF6 = HIBYTE(layer2_xpos) & 1;
|
|
area_parser_flag0EFC = 0;
|
|
HIBYTE(g_word_7E0EF7) = 0;
|
|
Smbll_SetupLayer2Bg();
|
|
Smbll_CODE_049B96();
|
|
Smbll_CODE_049BBC();
|
|
Smbll_CODE_049BBC();
|
|
Smbll_CODE_049BBC();
|
|
Smbll_CODE_049BBC();
|
|
Smbll_CODE_049BBC();
|
|
Smbll_CODE_049BBC();
|
|
if (obj_yspeed.bubble[0] != 3) {
|
|
Smbll_CODE_049BBC();
|
|
Smbll_CODE_049BBC();
|
|
Smbll_CODE_049BBC();
|
|
Smbll_CODE_049BBC();
|
|
if (vblank_which_layer2_scroll_flag) {
|
|
Smbll_CODE_049BBC();
|
|
Smbll_CODE_049BBC();
|
|
Smbll_CODE_049BBC();
|
|
Smbll_CODE_049BBC();
|
|
Smbll_CODE_049BBC();
|
|
Smbll_CODE_049BBC();
|
|
}
|
|
}
|
|
}
|
|
|
|
void Smbll_CODE_04956B() {
|
|
uint8 v0; // al
|
|
uint8 v1; // si
|
|
|
|
Smbll_CODE_0494EA();
|
|
layer2_ypos = 0;
|
|
if (area_type) {
|
|
if (area_type == 1)
|
|
LOBYTE(layer2_ypos) = -8;
|
|
v0 = 6;
|
|
cgwsel_mirror = 6;
|
|
v1 = 17;
|
|
} else {
|
|
WriteRegWord(DMAP2, 0xF42u);
|
|
WriteRegWord(A1T2L, 0x9113u);
|
|
WriteReg(A1B2, 1u);
|
|
WriteReg(DAS20, 0x7Fu);
|
|
LOBYTE(layers_scroll_0EEC) = 0;
|
|
UNUSED_byte_7E0EF3 = 0;
|
|
hdmaenable_mirror |= 4u;
|
|
v0 = 0;
|
|
v1 = 23;
|
|
}
|
|
tm_mirror = v1;
|
|
ts_mirror = v0;
|
|
LOBYTE(buffer_layer3_cloud_tilemap_offs) = 0;
|
|
vtimel_mirror = 31;
|
|
if (vblank_which_layer2_scroll_flag) {
|
|
if (cloud_type_override) {
|
|
vblank_which_layer2_scroll_flag = 0;
|
|
} else {
|
|
vtimel_mirror = -81;
|
|
vblank_enable_vtimel_flag = 1;
|
|
}
|
|
}
|
|
Smbll_CODE_0495E2();
|
|
}
|
|
|
|
void Smbll_CODE_0495E2() {
|
|
int16 v0; // ax
|
|
uint16 v1; // di
|
|
uint16 v2; // si
|
|
int v3; // rbp
|
|
int v4; // rbx
|
|
uint16 v5; // di
|
|
uint16 v6; // si
|
|
uint16 v7; // ax
|
|
|
|
if (override_area_data_addr_index) {
|
|
area_data_addr_index = override_area_data_addr_index;
|
|
override_area_data_addr_index = 0;
|
|
} else if (area_data_addr_index == 23 || area_data_addr_index == 38) {
|
|
override_area_data_addr_index = area_data_addr_index;
|
|
if (!world_number || world_number == 4 || world_number == 9) {
|
|
area_data_addr_index = 55;
|
|
smbll_varF26 = 3;
|
|
} else {
|
|
area_data_addr_index = 62;
|
|
}
|
|
}
|
|
*(uint16 *)&R6_ = 16 * area_data_addr_index;
|
|
*(uint16 *)&R2_ = 0;
|
|
do {
|
|
v0 = kbyte_1938B[*(uint16 *)&R6_];
|
|
++*(uint16 *)&R6_;
|
|
v1 = kword_1AC76[(uint16)(2 * v0) >> 1];
|
|
v2 = *(uint16 *)&R2_;
|
|
*(uint16 *)&R4_ = 7;
|
|
do {
|
|
v3 = v1 >> 1;
|
|
v4 = v2 >> 1;
|
|
palette_mirror[v4] = kword_1ACFA[v3];
|
|
palette_mirror[v4 + 8] = kword_1AD0A[v3];
|
|
v2 += 2;
|
|
v1 += 2;
|
|
--*(uint16 *)&R4_;
|
|
} while (*(int16 *)&R4_ >= 0);
|
|
*(uint16 *)&R2_ = v2 + 16;
|
|
} while (v2 != 464);
|
|
if (*(uint16 *)&tileset_graphics_flag_var2f8 && current_player) {
|
|
v5 = 0;
|
|
v6 = 224;
|
|
do {
|
|
palette_mirror[v6 >> 1] = kword_19237[v5 >> 1];
|
|
v6 += 2;
|
|
v5 += 2;
|
|
} while (v5 != 32);
|
|
}
|
|
layer3_xpos = screen_left_xpos16 >> 2;
|
|
*(uint16 *)&tempF3 = (uint16)((screen_left_xpos16 >> 2) & 0xFF00) >> 8;
|
|
v7 = 2 * world_number;
|
|
if (v7 >= 0xCu)
|
|
v7 = 0;
|
|
*(uint16 *)&tempF3 += v7;
|
|
buffer_layer3_cloud_tilemap_offs = 0;
|
|
while (*(uint16 *)&tempF3) {
|
|
buffer_layer3_cloud_tilemap_offs += 224;
|
|
--*(uint16 *)&tempF3;
|
|
}
|
|
buffer_layer3_cloud_tilemap_offs += (uint8)(layer3_xpos & 0xF0) >> 4;
|
|
if (buffer_layer3_cloud_tilemap_offs >= 0xA80u)
|
|
buffer_layer3_cloud_tilemap_offs = 0;
|
|
Smbll_CODE_04973C();
|
|
if (enable_layer3_bgflag) {
|
|
tempF3 = HIBYTE(layer3_xpos);
|
|
tempF4 = layer3_xpos;
|
|
Smbll_CODE_048C85();
|
|
tempF5 = 19;
|
|
do {
|
|
Smbll_CODE_048B49();
|
|
if (tempF4 >= 0xA0u) {
|
|
tempF3 ^= 4u;
|
|
tempF4 = 0x80;
|
|
}
|
|
--tempF5;
|
|
} while (tempF5);
|
|
}
|
|
update_entire_palette_flag = 1;
|
|
++screen_routine_task;
|
|
}
|
|
|
|
PairU16 Smbll_CODE_049724(uint8 k, uint8 j) {
|
|
*(uint16 *)&R4_ = 1;
|
|
*(uint16 *)&R0_ = 16;
|
|
do {
|
|
palette_mirror[k >> 1] = *(uint16 *)IndirPtr(*(LongPtr *)&R2_, j);
|
|
j += 2;
|
|
k += 2;
|
|
--*(uint16 *)&R0_;
|
|
} while (*(uint16 *)&R0_);
|
|
return MakePairU16(k, j);
|
|
}
|
|
|
|
void Smbll_CODE_04973C() {
|
|
uint8 v0; // si
|
|
uint16 v1; // ax
|
|
uint16 v2; // di
|
|
int16 v3; // cx
|
|
|
|
v0 = 0;
|
|
do {
|
|
g_byte_7F3000[v0] = 0;
|
|
g_byte_7F3000[v0 + 256] = 0;
|
|
g_byte_7F3000[v0 + 512] = 0;
|
|
g_byte_7F3000[v0 + 768] = 0;
|
|
g_byte_7F3000[v0 + 1024] = 0;
|
|
g_byte_7F3000[v0 + 1280] = 0;
|
|
g_byte_7F3000[v0 + 1536] = 0;
|
|
g_byte_7F3000[v0 + 1792] = 0;
|
|
g_byte_7F3000[v0 + 2048] = 0;
|
|
g_byte_7F3000[v0 + 2304] = 0;
|
|
g_byte_7F3000[v0-- + 2560] = 0;
|
|
} while (v0);
|
|
tempF5 = 127;
|
|
tempF6 = 0;
|
|
*(uint16 *)&tempF3 = 12288;
|
|
for (*(uint16 *)&tempF8 = 0;;) {
|
|
v1 = kword_1B4BA[*(uint16 *)&tempF8 >> 1];
|
|
if (v1 == 0xFFFF)
|
|
break;
|
|
if ((int16)(v1 + 1) < 0)
|
|
*(uint16 *)&tempF3 += 224;
|
|
v2 = (uint8)v1;
|
|
v3 = __CFSHL__uint16(2 * v1);
|
|
HIBYTE(v1) = 0;
|
|
*(uint16 *)&tempF6 = v3;
|
|
tempF7 = *((uint8 *)kword_1B4BA + (uint16)(*(uint16 *)&tempF8 + 1)) & 0x3F;
|
|
while (1) {
|
|
IndirWriteByte(*(LongPtr *)&tempF3, v2, tempF7);
|
|
if (!tempF6 || (v2 & 0xF0) == 0xD0)
|
|
break;
|
|
LOBYTE(v1) = v2 + 16;
|
|
v2 = v1;
|
|
}
|
|
++*(uint16 *)&tempF8;
|
|
++*(uint16 *)&tempF8;
|
|
}
|
|
}
|
|
|
|
void Smbll_GetBackgroundColor_0() {
|
|
if (!background_color_ctrl_0) {
|
|
++screen_routine_task;
|
|
Smbll_GetPlayerColors();
|
|
}
|
|
}
|
|
|
|
void Smbll_GetPlayerColors() {
|
|
uint8 bubble; // al
|
|
uint16 v1; // ax
|
|
int16 v2; // ax
|
|
int8 v3; // t0
|
|
uint8 v4; // di
|
|
uint8 i; // si
|
|
int v6; // rbp
|
|
int v7; // rbx
|
|
|
|
bubble = background_color_ctrl;
|
|
if (!background_color_ctrl)
|
|
bubble = obj_yspeed.bubble[0];
|
|
if (!cloud_type_override || (background_color_ctrl & 4) != 0 || (number_of_lives & 0x80) != 0)
|
|
v1 = kword_197FB[(uint16)(2 * bubble) >> 1];
|
|
else
|
|
v1 = 21034;
|
|
palette_mirror[0] = v1;
|
|
*(uint16 *)&coldata1_mirror = (v1 & 0x1F) + 32;
|
|
v2 = 8 * (v1 & 0x3E0);
|
|
v3 = v2;
|
|
LOBYTE(v2) = HIBYTE(v2);
|
|
HIBYTE(v2) = v3;
|
|
*(uint16 *)&coldata2_mirror = v2 + 64;
|
|
LOBYTE(v2) = (uint16)((uint16)(palette_mirror[0] & 0x7C00) >> 2) >> 8;
|
|
HIBYTE(v2) = 0;
|
|
*(uint16 *)&coldata3_mirror = v2 + 128;
|
|
palette_mirror[0] = 0;
|
|
if (!player_disable_auto_palette_update) {
|
|
v4 = 0;
|
|
if (current_player)
|
|
v4 = 32;
|
|
if (player_status == 2)
|
|
v4 += 64;
|
|
for (i = 0; i != 16; i += 2) {
|
|
v6 = v4 >> 1;
|
|
v7 = i >> 1;
|
|
palette_mirror[v7 + 240] = kword_1980B[v6];
|
|
palette_mirror[v7 + 248] = kword_1981B[v6];
|
|
v4 += 2;
|
|
}
|
|
++update_entire_palette_flag;
|
|
}
|
|
}
|
|
|
|
void Smbll_CODE_049B35() {
|
|
uint8 v0; // al
|
|
uint8 v1; // al
|
|
int8 v2; // al
|
|
|
|
v0 = HIBYTE(layer2_xpos);
|
|
if (HIBYTE(layer2_xpos) == 127)
|
|
v0 = smbll_varED0;
|
|
else
|
|
smbll_varED0 = HIBYTE(layer2_xpos);
|
|
tempF3 = v0;
|
|
R0_ = 32;
|
|
if (obj_yspeed.bubble[0] == 3)
|
|
R0_ *= 2;
|
|
LOBYTE(g_word_7E0EF7) = (uint8)((R0_ + layer2_xpos) & 0xF0) >> 2;
|
|
R0_ = (uint8)((R0_ + layer2_xpos) & 0xF0) >> 3;
|
|
if (R0_) {
|
|
if ((tempF3 & 1) != 0)
|
|
v1 = 16;
|
|
else
|
|
v1 = 20;
|
|
} else if (g_byte_7E0EF6) {
|
|
g_byte_7E0EF6 = 0;
|
|
v1 = 20;
|
|
} else {
|
|
v1 = 16;
|
|
g_byte_7E0EF6 = 16;
|
|
}
|
|
R1_ = v1;
|
|
v2 = tempF3 & 0xF;
|
|
if (!R0_)
|
|
++v2;
|
|
HIBYTE(g_word_7E0EF7) = 8 * (v2 + 1);
|
|
Smbll_CODE_049BBC();
|
|
}
|
|
|
|
void Smbll_CODE_049B96() {
|
|
uint8 v0; // al
|
|
|
|
LOBYTE(g_word_7E0EF7) = (uint8)(layer2_xpos & 0xF0) >> 2;
|
|
R0_ = (uint8)(layer2_xpos & 0xF0) >> 3;
|
|
HIBYTE(g_word_7E0EF7) = 8 * HIBYTE(layer2_xpos);
|
|
if ((layer2_xpos & 0x100) != 0)
|
|
v0 = 20;
|
|
else
|
|
v0 = 16;
|
|
R1_ = v0;
|
|
}
|
|
|
|
void Smbll_CODE_049BBC() {
|
|
uint16 v0; // di
|
|
uint16 v1; // si
|
|
|
|
g_word_7E0EFA = 4;
|
|
if (obj_yspeed.bubble[0] == 3)
|
|
g_word_7E0EFA *= 2;
|
|
v0 = upload_buffer_3[0];
|
|
do {
|
|
if ((R0_ & 0x20) != 0)
|
|
*(uint16 *)&R0_ = (*(uint16 *)&R0_ + 1024) & 0x16C0;
|
|
upload_buffer_3[(v0 >> 1) + 1] = *(uint16 *)&R0_ - 2048;
|
|
*(uint16 *)&R2_ = 32;
|
|
if ((g_word_7E0EF7 & 0x40) != 0)
|
|
g_word_7E0EF7 = (g_word_7E0EF7 + 2048) & 0xFF00;
|
|
v1 = g_word_7E0EF7;
|
|
*(uint16 *)&R4_ = g_word_7E0EF7;
|
|
do {
|
|
upload_buffer_3[(v0 >> 1) + 2] = layer2_map16_table[v1 >> 1];
|
|
v0 += 2;
|
|
*(uint16 *)&R4_ += 64;
|
|
v1 = *(uint16 *)&R4_;
|
|
--*(uint16 *)&R2_;
|
|
} while (*(int16 *)&R2_ >= 0);
|
|
upload_buffer_3[v0 >> 1] = 36;
|
|
++g_word_7E0EF7;
|
|
++g_word_7E0EF7;
|
|
++*(uint16 *)&R0_;
|
|
--g_word_7E0EFA;
|
|
} while (g_word_7E0EFA);
|
|
upload_buffer_3[0] = v0;
|
|
upload_buffer_3[(v0 >> 1) + 1] = -1;
|
|
vblank_upload_from_7f0000_flag = 1;
|
|
}
|
|
|
|
void Smbll_LoadAreaPointer() {
|
|
int8 v0; // al
|
|
|
|
area_pointer = Smbll_FindAreaPointer();
|
|
v0 = 4 * (area_pointer & 0x60) + __CFSHL__(area_pointer & 0x60, 1);
|
|
area_type = 2 * (2 * v0 + __CFSHL__(2 * (area_pointer & 0x60), 1)) + __CFSHL__(v0, 1);
|
|
obj_yspeed.bubble[0] = area_type;
|
|
if (world_number == 7 && area_number == 3)
|
|
obj_yspeed.bubble[0] = 3;
|
|
}
|
|
|
|
uint8 Smbll_FindAreaPointer() {
|
|
uint8 v0; // di
|
|
|
|
v0 = world_number;
|
|
if (world_number >= 0xDu) {
|
|
area_number = 0;
|
|
level_number = 0;
|
|
v0 = 0;
|
|
world_number = 0;
|
|
}
|
|
return kAreaAddrOffsets[(uint8)(area_number + kWorldAddrOffsets[v0])];
|
|
}
|
|
|
|
uint8 Smbll_sub_1C396(uint8 a) {
|
|
if (world_number >= 9u && (area_pointer & 0x60) == 32) {
|
|
if (a == 31) {
|
|
return 9;
|
|
} else if (a == 30) {
|
|
return 27;
|
|
} else {
|
|
a += 29;
|
|
}
|
|
}
|
|
return a;
|
|
}
|
|
|
|
void Smbll_GetAreaDataAddrs() {
|
|
int8 v0; // al
|
|
uint8 v1; // di
|
|
int v3; // edx
|
|
uint8 v4; // al
|
|
uint8 v5; // al
|
|
bool v6; // cf
|
|
uint8 v7; // [rsp+46h] [rbp-2h]
|
|
uint8 v8; // [rsp+46h] [rbp-2h]
|
|
|
|
v0 = 4 * (area_pointer & 0x60) + __CFSHL__(area_pointer & 0x60, 1);
|
|
area_type = 2 * (2 * v0 + __CFSHL__(2 * (area_pointer & 0x60), 1)) + __CFSHL__(v0, 1);
|
|
obj_yspeed.bubble[0] = area_type;
|
|
v1 = area_type;
|
|
if (world_number == 7 && area_number == 3)
|
|
obj_yspeed.bubble[0] = 3;
|
|
area_addrs_l_offset = Smbll_sub_1C396(area_pointer & 0x1f);
|
|
v3 = (uint8)(area_addrs_l_offset + kbyte_1C4EC[v1]);
|
|
LOBYTE(enemy_data_ptr.addr) = kbyte_1C4F0[v3];
|
|
HIBYTE(enemy_data_ptr.addr) = kbyte_1C537[v3];
|
|
enemy_data_ptr.bank = 1;
|
|
area_data_addr_index = area_addrs_l_offset + kbyte_1C57E[area_type];
|
|
LOBYTE(area_data_ptr.addr) = kbyte_1C582[area_data_addr_index];
|
|
HIBYTE(area_data_ptr.addr) = kbyte_1C5C9[area_data_addr_index];
|
|
area_data_ptr.bank = 1;
|
|
v7 = *IndirPtr(area_data_ptr, 0);
|
|
v4 = v7 & 7;
|
|
if ((v7 & 7u) >= 4) {
|
|
background_color_ctrl = v7 & 7;
|
|
v4 = 0;
|
|
}
|
|
foreground_scenery = v4;
|
|
player_entrance_ctrl = (uint8)(v7 & 0x38) >> 3;
|
|
game_timer_setting = 2 * (4 * (v7 & 0xC0) + __CFSHL__(v7 & 0xC0, 1)) + __CFSHL__(2 * (v7 & 0xC0), 1);
|
|
v8 = *IndirPtr(area_data_ptr, 1u);
|
|
terrain_control = v8 & 0xF;
|
|
background_scenery = (uint8)(v8 & 0x30) >> 4;
|
|
v5 = 2 * (4 * (v8 & 0xC0) + __CFSHL__(v8 & 0xC0, 1)) + __CFSHL__(2 * (v8 & 0xC0), 1);
|
|
if (v5 == 3) {
|
|
cloud_type_override = 3;
|
|
v5 = 0;
|
|
}
|
|
area_style = v5;
|
|
Smbll_UpdateVineAtEntrance_New();
|
|
v6 = __CFADD__(area_data_ptr.addr, 2);
|
|
LOBYTE(area_data_ptr.addr) += 2;
|
|
HIBYTE(area_data_ptr.addr) += v6;
|
|
area_parser_var3 = 0;
|
|
}
|
|
|
|
void Smbll_UpdateVineAtEntrance_New() {
|
|
if (cloud_type_override)
|
|
goto LABEL_6;
|
|
if (area_data_addr_index == 35) {
|
|
if ((uint8)screen_left_xpos16)
|
|
return;
|
|
goto LABEL_6;
|
|
}
|
|
if (area_data_addr_index == 34)
|
|
LABEL_6:
|
|
vine_at_entrance_flag = 1;
|
|
}
|