This commit is contained in:
Snesrev 2023-06-18 06:37:00 +02:00
parent de17193ed9
commit b3ae9a90cc
38 changed files with 8334 additions and 8802 deletions

View File

@ -1623,17 +1623,17 @@ void UploadStripeImage() {
WriteReg(A1B1, 0);
R6_ = 0;
v0 = 0;
for (i = *IndirPtr(&R0_, 0); i >= 0; i = *IndirPtr(&R0_, v0)) {
for (i = *IndirPtr((LongPtr *)&R0_, 0); i >= 0; i = *IndirPtr((LongPtr *)&R0_, v0)) {
R4_ = i;
v2 = v0 + 1;
R3_ = *IndirPtr(&R0_, v2++);
v3 = *IndirPtr(&R0_, v2) & 0x80;
R3_ = *IndirPtr((LongPtr *)&R0_, v2++);
v3 = *IndirPtr((LongPtr *)&R0_, v2) & 0x80;
R7_ = 4 * v3 + __CFSHL__(v3, 1);
R5_ = *IndirPtr(&R0_, v2) & 0x40;
R5_ = *IndirPtr((LongPtr *)&R0_, v2) & 0x40;
WriteReg(DMAP1, (R5_ >> 3) | 1);
WriteReg(BBAD1, 0x18u);
WriteRegWord(VMADDL, *(uint16 *)&R3_);
v4 = IndirPtr(&R0_, v2);
v4 = IndirPtr((LongPtr *)&R0_, v2);
LOBYTE(v5) = HIBYTE(*(uint16 *)v4);
HIBYTE(v5) = *(uint16 *)v4;
v6 = (v5 & 0x3FFF) + 1;

View File

@ -646,7 +646,7 @@ void SpawnCastleTilesWithPriority() {
v0 = *(uint16 *)&vram_buffer1_offset;
v1 = 0;
do {
v2 = IndirPtr(&tempF3, v1);
v2 = IndirPtr((LongPtr *)&tempF3, v1);
v3 = *(uint16 *)v2;
*(uint16 *)&vram_buffer1[v0 + 1] = *(uint16 *)v2;
v1 += 2;
@ -765,7 +765,7 @@ void DecodeAreaData_Sub2_New(uint16 j) {
tempF3 = area_data_ptr.addr;
tempF4 = area_data_ptr.addr >> 8;
tempF5 = area_data_ptr.bank;
v1 = *IndirPtr(&tempF3, (j + 2)) & 0x7F;
v1 = *IndirPtr((LongPtr *)&tempF3, (j + 2)) & 0x7F;
R0_ = *((uint8 *)kDATA_048E43 + v1);
R1_ = *((uint8 *)kDATA_048E43 + v1 + 1);
v2 = object_index;
@ -1014,8 +1014,8 @@ uint8 CODE_0491C0(uint8 k) {
uint16 v1; // di
v1 = area_obj_offset_buffer[(uint16)(2 * k) >> 1] + 1;
R7_ = *IndirPtr(&tempF3, v1) >> 4;
return *IndirPtr(&tempF3, v1) & 0xF;
R7_ = *IndirPtr((LongPtr *)&tempF3, v1) >> 4;
return *IndirPtr((LongPtr *)&tempF3, v1) & 0xF;
}
uint8 CODE_0491DD() {
@ -1385,7 +1385,7 @@ PairU16 CODE_049724(uint8 k, uint8 j) {
*(uint16 *)&R4_ = 1;
*(uint16 *)&R0_ = 16;
do {
palette_mirror[k >> 1] = *(uint16 *)IndirPtr(&R2_, j);
palette_mirror[k >> 1] = *(uint16 *)IndirPtr((LongPtr *)&R2_, j);
j += 2;
k += 2;
--*(uint16 *)&R0_;
@ -1429,7 +1429,7 @@ void CODE_04973C() {
tempF7 = *((uint8 *)kDATA_04B683 + (uint16)(*(uint16 *)&tempF8 + 1)) & 0x3F;
while (1) {
uint16 t = g_ram[0xf3] | g_ram[0xf4] << 8;
IndirWriteByte(&tempF3, v2, tempF7);
IndirWriteByte((LongPtr *)&tempF3, v2, tempF7);
if (!tempF6 || (v2 & 0xF0) == 0xD0)
break;
LOBYTE(v1) = v2 + 16;

View File

@ -1112,12 +1112,12 @@ void GenerateLayer2Map16() {
v3 = *(uint16 *)&tempE4;
v4 = 8 * (uint8)v2;
v5 = *(uint16 *)&tempE4 >> 1;
layer2_map16_table[v5] = *(uint16 *)IndirPtr(&R0_, v4);
layer2_map16_table[v5] = *(uint16 *)IndirPtr((LongPtr *)&R0_, v4);
v4 += 2;
layer2_map16_table[v5 + 1] = *(uint16 *)IndirPtr(&R0_, v4);
layer2_map16_table[v5 + 1] = *(uint16 *)IndirPtr((LongPtr *)&R0_, v4);
v4 += 2;
layer2_map16_table[v5 + 32] = *(uint16 *)IndirPtr(&R0_, v4);
layer2_map16_table[v5 + 33] = *(uint16 *)IndirPtr(&R0_, 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;

View File

@ -59,10 +59,10 @@ void HandleSPCUploads_Main() {
LOBYTE(v1) = -52;
while (1) {
v13 = v1;
v9 = IndirPtr(&R0_, v0);
v9 = IndirPtr((LongPtr *)&R0_, v0);
v10 = v0 + 2;
v4 = *(uint16 *)v9;
v11 = *(uint16 *)IndirPtr(&R0_, v10);
v11 = *(uint16 *)IndirPtr((LongPtr *)&R0_, v10);
v12 = v10 + 2;
WriteRegWord(APUI02, v11);
WriteReg(APUI01, v4 != 0);
@ -71,14 +71,14 @@ void HandleSPCUploads_Main() {
;
if (Unreachable())
break;
v2 = IndirPtr(&R0_, v12);
v2 = IndirPtr((LongPtr *)&R0_, v12);
v0 = v12 + 1;
HIBYTE(v1) = *v2;
for (LOBYTE(v1) = 0;; LOBYTE(v1) = v1 + 1) {
WriteRegWord(APUI00, v1);
if (!--v4)
break;
v3 = IndirPtr(&R0_, v0++);
v3 = IndirPtr((LongPtr *)&R0_, v0++);
HIBYTE(v1) = *v3;
while ((uint8)v1 != ReadReg(APUI00))
;

View File

@ -155,6 +155,9 @@ RESET_GAME:
}
}
static void Smb1DrawPpuFrame(void) {
}
const RtlGameInfo kSmb1GameInfo = {
"smb1",
@ -164,5 +167,6 @@ const RtlGameInfo kSmb1GameInfo = {
&Smb1CpuInitialize,
&Smb1RunOneFrameOfGame,
&Smb1RunOneFrameOfGame_Emulated,
&Smb1DrawPpuFrame,
&Smb1FixSnapshotForCompare,
};

View File

@ -69,7 +69,6 @@ typedef struct SmasSpcPlayer {
SpcPlayer base;
DspRegWriteHistory *reg_write_history;
uint8 new_value_from_snes[4];
uint8 port_to_snes_a[4];
uint8 last_value_from_snes[4];
uint8 var_c;
uint8 last_written_edl; // TODO:persist
@ -202,7 +201,7 @@ static const MemMap kChannel_Maps[] = {
};
static const MemMapSized kSpcPlayer_Maps[] = {
{offsetof(SmasSpcPlayer, new_value_from_snes), 0x0, 4},
{offsetof(SmasSpcPlayer, port_to_snes_a), 0x4, 4},
{offsetof(SmasSpcPlayer, base.port_to_snes), 0x4, 4},
{offsetof(SmasSpcPlayer, last_value_from_snes), 0x8, 4},
{offsetof(SmasSpcPlayer, var_c), 0xc, 1},
{offsetof(SmasSpcPlayer, counter_sf0d), 0xd, 1},
@ -431,7 +430,7 @@ static void Spc_Loop_Part2(SmasSpcPlayer *p, uint8 ticks) {
ReadPortFromSnes(p, 2);
return;
}
if (p->port_to_snes_a[2]) {
if (p->base.port_to_snes[2]) {
Channel *c = p->channel;
for (p->cur_chan_bit = 1; p->cur_chan_bit != 0; p->cur_chan_bit <<= 1, c++) {
if (HIBYTE(c->pattern_cur_ptr))
@ -574,7 +573,7 @@ static void Port2_HandleMusic(SmasSpcPlayer *p) {
if (a == 0) {
handle_cmd_00:
if (p->var_3F8 != 0 || p->port_to_snes_a[2] == 0)
if (p->var_3F8 != 0 || p->base.port_to_snes[2] == 0)
return;
if (p->pause_music_ctr != 0 && --p->pause_music_ctr == 0)
goto HandleCmd_0xf0_PauseMusic;
@ -696,7 +695,7 @@ label_a:
goto handle_cmd_00;
} else if (a == 0xf0) HandleCmd_0xf0_PauseMusic: {
p->key_OFF = p->is_chan_on ^ 0xff;
p->port_to_snes_a[2] = 0;
p->base.port_to_snes[2] = 0;
p->port_to_snes_b[2] = 0;
p->cur_chan_bit = 0;
} else if (a == 0xf3) {
@ -720,10 +719,10 @@ less_0xf3:
}
p->pause_music_ctr = 0;
p->some_volume_flag = 0;
p->port_to_snes_a[2] = a;
p->base.port_to_snes[2] = a;
t = WORD(p->ram[0xc000 + (a - 1) * 2]);
if ((t >> 8) == 0) {
p->port_to_snes_a[2] = 0;
p->base.port_to_snes[2] = 0;
return;
}
p->music_ptr_toplevel = t;
@ -925,14 +924,14 @@ static void SmasSpcPlayer_Upload(SpcPlayer *p_in, const uint8_t *data) {
} while (--numbytes);
}
p->pause_music_ctr = 0;
p->port_to_snes_a[0] = 0;
p->port_to_snes_a[1] = 0;
p->port_to_snes_a[3] = 0;
p->base.port_to_snes[0] = 0;
p->base.port_to_snes[1] = 0;
p->base.port_to_snes[3] = 0;
p->enable_some_randomstuff = 0;
p->is_chan_on = 0;
p->extra_tempo = 0;
if (!p->var_3F8)
p->port_to_snes_a[2] = 0;
p->base.port_to_snes[2] = 0;
memset(p->base.input_ports, 0, sizeof(p->base.input_ports));
memset(p->last_value_from_snes, 0, sizeof(p->last_value_from_snes));
memset(p->new_value_from_snes, 0, sizeof(p->new_value_from_snes));
@ -1131,11 +1130,11 @@ static void HandleEffect(SmasSpcPlayer *p, Channel *c, uint8 effect) {
}
static void Sfx_TerminateSfx4(SmasSpcPlayer *p) {
if (p->port_to_snes_a[0] == 17) {
if (p->base.port_to_snes[0] == 17) {
p->var_3F8 = 0xff;
Dsp_Write(p, KOF, 0xff);
}
p->port_to_snes_a[0] = 0;
p->base.port_to_snes[0] = 0;
p->port_to_snes_b[0] = 0;
p->is_chan_on &= ~0x10;
if (p->echo_channels & 0x10) {
@ -1158,7 +1157,7 @@ static void Port0_HandleCmd(SmasSpcPlayer *p) {
}
if (p->new_value_from_snes[0] == 0x43 || p->new_value_from_snes[0] == 0x12 ||
p->new_value_from_snes[0] == 0x11 ||
p->port_to_snes_a[0] != 0x11 && p->port_to_snes_a[0] != 0x1d) {
p->base.port_to_snes[0] != 0x11 && p->base.port_to_snes[0] != 0x1d) {
if (p->new_value_from_snes[0] == 0x7f) {
p->extra_tempo = 10;
@ -1172,13 +1171,13 @@ static void Port0_HandleCmd(SmasSpcPlayer *p) {
}
if (p->var_c)
goto label_b;
if (!p->port_to_snes_a[0])
if (!p->base.port_to_snes[0])
return;
goto label_c;
label_a:
p->port_to_snes_a[0] = cmd;
if (p->var_3F8 && p->port_to_snes_a[0] == 18)
p->base.port_to_snes[0] = cmd;
if (p->var_3F8 && p->base.port_to_snes[0] == 18)
p->var_3F8 = 0;
p->var_c = 2;
Dsp_Write(p, KOF, 0x10);
@ -1188,7 +1187,7 @@ label_a:
p->channel[4].pitch_slide_length = 0;
p->channel[4].fine_tunea = 0;
p->channel[4].channel_transpositionb = 0;
if (p->port_to_snes_a[0] == 0x3b || p->port_to_snes_a[0] == 0x43) {
if (p->base.port_to_snes[0] == 0x3b || p->base.port_to_snes[0] == 0x43) {
p->reg_EON &= ~0x10;
Dsp_Write(p, EON, p->reg_EON);
}
@ -1251,7 +1250,7 @@ label_c:
goto note_continue;
} else if (cmd == 0xff) {
is_ff:
p->sfx_sound_ptr_cur = WORD(p->ram[0x17D8 + (p->port_to_snes_a[0] - 1) * 2]);
p->sfx_sound_ptr_cur = WORD(p->ram[0x17D8 + (p->base.port_to_snes[0] - 1) * 2]);
} else {
PlayNote(p, &p->channel[4], cmd);
Write_KeyOn(p, 0x10);
@ -1273,7 +1272,7 @@ note_continue:
}
static void Sfx_TerminateSfx6(SmasSpcPlayer *p) {
p->port_to_snes_a[3] = 0;
p->base.port_to_snes[3] = 0;
p->port_to_snes_b[3] = 0;
p->is_chan_on &= ~0x40;
p->reg_NON = 0;
@ -1293,18 +1292,18 @@ static void Port3_HandleCmd(SmasSpcPlayer *p) {
p->new_value_from_snes[3] &= 0x7f;
}
if (p->port_to_snes_a[3] == 29 ||
(p->new_value_from_snes[3] != 5 && p->port_to_snes_a[3] == 5) ||
if (p->base.port_to_snes[3] == 29 ||
(p->new_value_from_snes[3] != 5 && p->base.port_to_snes[3] == 5) ||
p->new_value_from_snes[3] == 0) {
if (p->port3_timeout)
goto label_b;
if (p->port_to_snes_a[3])
if (p->base.port_to_snes[3])
goto label_c;
return;
}
p->port_to_snes_a[3] = p->new_value_from_snes[3];
p->base.port_to_snes[3] = p->new_value_from_snes[3];
p->port3_timeout = 2;
Dsp_Write(p, KOF, 0x40);
p->is_chan_on |= 0x40;
@ -1317,7 +1316,7 @@ static void Port3_HandleCmd(SmasSpcPlayer *p) {
label_b:
if (--p->port3_timeout)
return;
p->port3_cur_ptr = WORD(p->ram[0x173c + (p->port_to_snes_a[3] - 1) * 2]);
p->port3_cur_ptr = WORD(p->ram[0x173c + (p->base.port_to_snes[3] - 1) * 2]);
goto lbl_begin;
@ -1490,7 +1489,7 @@ static void Port1_HandleCmd(SmasSpcPlayer *p) {
p->new_value_from_snes[1] &= 0xf;
if (p->new_value_from_snes[1] == 1) {
p->port_to_snes_a[1] = 1;
p->base.port_to_snes[1] = 1;
p->chan7_timer = 4;
Dsp_Write(p, KOF, 0x80);
p->is_chan_on |= 0x80;
@ -1498,8 +1497,8 @@ static void Port1_HandleCmd(SmasSpcPlayer *p) {
p->channel[7].pitch_slide_length = 0;
p->channel[7].fine_tunea = 0;
p->channel[7].channel_transpositionb = 0;
} else if (p->port_to_snes_a[1] != 1 && p->new_value_from_snes[1] == 4) {
p->port_to_snes_a[1] = 4;
} else if (p->base.port_to_snes[1] != 1 && p->new_value_from_snes[1] == 4) {
p->base.port_to_snes[1] = 4;
p->chan7_timer = 2;
Dsp_Write(p, KOF, 0x80);
p->is_chan_on |= 0x80;
@ -1507,7 +1506,7 @@ static void Port1_HandleCmd(SmasSpcPlayer *p) {
p->channel[7].pitch_slide_length = 0;
p->channel[7].channel_transpositionb = 0;
p->channel[7].fine_tunea = 0;
} else if (p->port_to_snes_a[1] == 1) {
} else if (p->base.port_to_snes[1] == 1) {
if (p->chan7_timer) {
if (--p->chan7_timer)
return;
@ -1527,7 +1526,7 @@ static void Port1_HandleCmd(SmasSpcPlayer *p) {
ComputePitchAdd(&p->channel[7], 0xb9);
}
} else {
p->port_to_snes_a[1] = 0;
p->base.port_to_snes[1] = 0;
p->is_chan_on &= ~0x80;
p->channel[7].pitch_slide_length = 0;
p->channel[7].channel_transpositionb = p->channel[7].channel_transpositiona;
@ -1545,7 +1544,7 @@ static void Port1_HandleCmd(SmasSpcPlayer *p) {
p->cur_chan_bit = 0;
WritePitch(p, &p->channel[7], p->channel[7].pitch);
}
} else if (p->port_to_snes_a[1] == 4) {
} else if (p->base.port_to_snes[1] == 4) {
Chan7_Func1605(p);
}
}
@ -1569,7 +1568,7 @@ static void Chan7_Func1605(SmasSpcPlayer *p) {
Dsp_Write(p, V7VOLR, 20);
Write_KeyOn(p, 0x80);
} else {
p->port_to_snes_a[1] = 0;
p->base.port_to_snes[1] = 0;
p->is_chan_on &= ~0x80;
p->channel[7].pitch_slide_length = 0;
p->channel[7].channel_transpositionb = p->channel[7].channel_transpositiona;

View File

@ -1594,17 +1594,17 @@ void Smbll_UploadStripeImage() {
R6_ = 0;
v0 = 0;
for (i = *IndirPtr(&R0_, 0); i >= 0; i = *IndirPtr(&R0_, v0)) {
for (i = *IndirPtr((LongPtr *)&R0_, 0); i >= 0; i = *IndirPtr((LongPtr *)&R0_, v0)) {
R4_ = i;
v2 = v0 + 1;
R3_ = *IndirPtr(&R0_, v2++);
v3 = *IndirPtr(&R0_, v2) & 0x80;
R3_ = *IndirPtr((LongPtr *)&R0_, v2++);
v3 = *IndirPtr((LongPtr *)&R0_, v2) & 0x80;
R7_ = 4 * v3 + __CFSHL__(v3, 1);
R5_ = *IndirPtr(&R0_, v2) & 0x40;
R5_ = *IndirPtr((LongPtr *)&R0_, v2) & 0x40;
WriteReg(DMAP1, (R5_ >> 3) | 1);
WriteReg(BBAD1, 0x18u);
WriteRegWord(VMADDL, *(uint16 *)&R3_);
v4 = IndirPtr(&R0_, v2);
v4 = IndirPtr((LongPtr *)&R0_, v2);
LOBYTE(v5) = HIBYTE(*(uint16 *)v4);
HIBYTE(v5) = *(uint16 *)v4;
v6 = (v5 & 0x3FFF) + 1;

View File

@ -401,7 +401,7 @@ void Smbll_SpawnCastleTilesWithPriority() {
v0 = *(uint16 *)vram_buffer1;
v1 = 0;
do {
v2 = IndirPtr(&tempF3, v1);
v2 = IndirPtr((LongPtr *)&tempF3, v1);
v3 = *(uint16 *)v2;
*(uint16 *)&vram_buffer1[v0 + 2] = *(uint16 *)v2;
v1 += 2;
@ -544,7 +544,7 @@ void Smbll_DecodeAreaData_Sub2_New(uint16 j) {
tempF4 = HIBYTE(addr);
tempF3 = addr;
tempF5 = area_data_ptr.bank;
v3 = IndirPtr(&tempF3, j + 2);
v3 = IndirPtr((LongPtr *)&tempF3, j + 2);
v4 = *v3 & 0x7F;
v5 = (int)(uint8)v4 >> 1;
R0_ = *((uint8 *)koff_188C1 + (*v3 & 0x7F));
@ -848,8 +848,8 @@ uint8 Smbll_CODE_0491C0(uint8 k) {
uint16 v1; // di
v1 = area_obj_offset_buffer[(uint16)(2 * k) >> 1] + 1;
R7_ = *IndirPtr(&tempF3, v1) >> 4;
return *IndirPtr(&tempF3, v1) & 0xF;
R7_ = *IndirPtr((LongPtr *)&tempF3, v1) >> 4;
return *IndirPtr((LongPtr *)&tempF3, v1) & 0xF;
}
uint8 Smbll_CODE_0491DD() {
@ -1199,7 +1199,7 @@ PairU16 Smbll_CODE_049724(uint8 k, uint8 j) {
*(uint16 *)&R4_ = 1;
*(uint16 *)&R0_ = 16;
do {
palette_mirror[k >> 1] = *(uint16 *)IndirPtr(&R2_, j);
palette_mirror[k >> 1] = *(uint16 *)IndirPtr((LongPtr *)&R2_, j);
j += 2;
k += 2;
--*(uint16 *)&R0_;
@ -1242,7 +1242,7 @@ void Smbll_CODE_04973C() {
*(uint16 *)&tempF6 = v3;
tempF7 = *((uint8 *)kword_1B4BA + (uint16)(*(uint16 *)&tempF8 + 1)) & 0x3F;
while (1) {
IndirWriteByte(&tempF3, v2, tempF7);
IndirWriteByte((LongPtr *)&tempF3, v2, tempF7);
if (!tempF6 || (v2 & 0xF0) == 0xD0)
break;
LOBYTE(v1) = v2 + 16;

View File

@ -1103,12 +1103,12 @@ void Smbll_GenerateLayer2Map16() {
v3 = *(uint16 *)&tempE4;
v4 = 8 * (uint8)v2;
v5 = *(uint16 *)&tempE4 >> 1;
layer2_map16_table[v5] = *(uint16 *)IndirPtr(&R0_, v4);
layer2_map16_table[v5] = *(uint16 *)IndirPtr((LongPtr *)&R0_, v4);
v4 += 2;
layer2_map16_table[v5 + 1] = *(uint16 *)IndirPtr(&R0_, v4);
layer2_map16_table[v5 + 1] = *(uint16 *)IndirPtr((LongPtr *)&R0_, v4);
v4 += 2;
layer2_map16_table[v5 + 32] = *(uint16 *)IndirPtr(&R0_, v4);
layer2_map16_table[v5 + 33] = *(uint16 *)IndirPtr(&R0_, v4 + 2);
layer2_map16_table[v5 + 32] = *(uint16 *)IndirPtr((LongPtr *)&R0_, v4);
layer2_map16_table[v5 + 33] = *(uint16 *)IndirPtr((LongPtr *)&R0_, v4 + 2);
v1 = v6 + 1;
if ((((uint8)v6 + 1) & 0xF) == 0)
v3 += 64;

View File

@ -58,10 +58,10 @@ void Smbll_HandleSPCUploads_Main() {
LOBYTE(v1) = -52;
while (1) {
v13 = v1;
v9 = IndirPtr(&R0_, v0);
v9 = IndirPtr((LongPtr *)&R0_, v0);
v10 = v0 + 2;
v4 = *(uint16 *)v9;
v11 = *(uint16 *)IndirPtr(&R0_, v10);
v11 = *(uint16 *)IndirPtr((LongPtr *)&R0_, v10);
v12 = v10 + 2;
WriteRegWord(APUI02, v11);
WriteReg(APUI01, v4 != 0);
@ -70,14 +70,14 @@ void Smbll_HandleSPCUploads_Main() {
;
if (Unreachable())
break;
v2 = IndirPtr(&R0_, v12);
v2 = IndirPtr((LongPtr *)&R0_, v12);
v0 = v12 + 1;
HIBYTE(v1) = *v2;
for (LOBYTE(v1) = 0;; LOBYTE(v1) = v1 + 1) {
WriteRegWord(APUI00, v1);
if (!--v4)
break;
v3 = IndirPtr(&R0_, v0++);
v3 = IndirPtr((LongPtr *)&R0_, v0++);
HIBYTE(v1) = *v3;
while ((uint8)v1 != ReadReg(APUI00))
;

View File

@ -154,7 +154,9 @@ RESET_GAME:
}
}
static void SmbllDrawPpuFrame(void) {
}
const RtlGameInfo kSmbllGameInfo = {
"smbll",
kGameID_SMBLL,
@ -163,5 +165,6 @@ const RtlGameInfo kSmbllGameInfo = {
&SmbllCpuInitialize,
&SmbllRunOneFrameOfGame,
&SmbllRunOneFrameOfGame_Emulated,
&SmbllDrawPpuFrame,
&SmbllFixSnapshotForCompare,
};

View File

@ -186,6 +186,19 @@ static void VerifySnapshotsEq(Snapshot *b, Snapshot *a, Snapshot *prev) {
}
}
if (memcmp(b->cgram, a->cgram, sizeof(uint16) * 0x100)) {
fprintf(stderr, "@%d: VRAM cgram compare failed (mine != theirs, prev):\n", snes_frame_counter);
for (size_t i = 0, j = 0; i < 0x100; i++) {
if (a->cgram[i] != b->cgram[i]) {
fprintf(stderr, "0x%.6X: %.4X != %.4X (%.4X)\n", (int)i, b->cgram[i], a->cgram[i], prev->cgram[i]);
g_fail = true;
if (++j >= 16)
break;
}
}
}
#endif
}
@ -200,6 +213,7 @@ static void MakeSnapshot(Snapshot *s) {
memcpy(s->sram, g_snes->cart->ram, g_snes->cart->ramSize);
memcpy(s->vram, g_snes->ppu->vram, sizeof(uint16) * 0x8000);
memcpy(s->oam, g_snes->ppu->oam, sizeof(uint16) * 0x120);
memcpy(s->cgram, g_snes->ppu->cgram, sizeof(uint16) * 0x100);
}
static void MakeMySnapshot(Snapshot *s) {
@ -207,6 +221,7 @@ static void MakeMySnapshot(Snapshot *s) {
memcpy(s->sram, g_snes->cart->ram, g_snes->cart->ramSize);
memcpy(s->vram, g_snes->ppu->vram, sizeof(uint16) * 0x8000);
memcpy(s->oam, g_snes->ppu->oam, sizeof(uint16) * 0x120);
memcpy(s->cgram, g_snes->ppu->cgram, sizeof(uint16) * 0x100);
}
static void RestoreSnapshot(Snapshot *s) {
@ -220,6 +235,7 @@ static void RestoreSnapshot(Snapshot *s) {
memcpy(g_snes->cart->ram, s->sram, g_snes->cart->ramSize);
memcpy(g_snes->ppu->vram, s->vram, sizeof(uint16) * 0x8000);
memcpy(g_snes->ppu->oam, s->oam, sizeof(uint16) * 0x120);
memcpy(g_snes->ppu->cgram, s->cgram, sizeof(uint16) * 0x100);
}
static bool loadRom(const char *name, Snes *snes) {
@ -344,11 +360,13 @@ static void RtlRunFrameCompare(uint16 input, int run_what) {
if (g_runmode == RM_THEIRS) {
g_use_my_apu_code = false;
g_snes->ppu = g_snes->snes_ppu;
g_snes->runningWhichVersion = 1;
g_rtl_game_info->run_frame_emulated();
g_snes->runningWhichVersion = 0;
} else if (g_runmode == RM_MINE) {
g_use_my_apu_code = true;
g_snes->ppu = g_snes->snes_ppu;
g_snes->runningWhichVersion = 2;
g_rtl_game_info->run_frame();
g_snes->runningWhichVersion = 0;

View File

@ -30,6 +30,7 @@ typedef struct RtlGameInfo {
CpuInfraInitializeFunc *initialize;
RunOneFrameOfGameFunc *run_frame;
RunOneFrameOfGameFunc *run_frame_emulated;
RunOneFrameOfGameFunc *draw_ppu_frame;
FixSnapshotForCompareFunc *fix_snapshot_for_compare;
} RtlGameInfo;
@ -44,6 +45,7 @@ typedef struct Snapshot {
uint8 sram[0x2000];
uint16 oam[0x120];
uint16 cgram[0x100];
} Snapshot;
extern const RtlGameInfo kSmwGameInfo;

View File

@ -9,7 +9,10 @@ struct StateRecorder;
static void RtlSaveMusicStateToRam_Locked();
static void RtlRestoreMusicAfterLoad_Locked(bool is_reset);
static uint8 RtlApuReadReg(int reg);
void SmwSavePlaythroughSnapshot();
void SmwLoadNextPlaybackSnapshot();
uint8 g_ram[0x20000];
uint8 *g_sram;
@ -18,6 +21,7 @@ const uint8 *g_rom;
bool g_is_uploading_apu;
bool g_did_finish_level_hook;
uint8 game_id;
bool g_playback_mode;
static uint8 *g_rtl_memory_ptr;
static RunFrameFunc *g_rtl_runframe;
@ -392,11 +396,6 @@ void RtlStopReplay(void) {
StateRecorder_StopReplay(&state_recorder);
}
enum {
// Version was bumped to 1 after I fixed bug #1
kCurrentBugFixCounter = 1,
};
bool RtlRunFrame(int inputs) {
if (g_did_finish_level_hook) {
if (game_id == kGameID_SMW && !state_recorder.replay_mode && g_config.save_playthrough) {
@ -404,6 +403,8 @@ bool RtlRunFrame(int inputs) {
RtlClearKeyLog();
}
g_did_finish_level_hook = false;
if (g_playback_mode)
SmwLoadNextPlaybackSnapshot();
}
// Avoid up/down and left/right from being pressed at the same time
@ -422,6 +423,17 @@ bool RtlRunFrame(int inputs) {
inputs = state_recorder.last_inputs;
}
StateRecorder_Record(&state_recorder, inputs);
if (game_id == kGameID_SMW) {
// This is whether APUI02 is true or false, this is used by the ancilla code.
uint8 apui02 = RtlApuReadReg(2);
if (apui02 != g_ram[kSmwRam_APUI02]) {
g_ram[kSmwRam_APUI02] = apui02;
StateRecorder_RecordPatchByte(&state_recorder, kSmwRam_APUI02, &apui02, 1);
}
}
}
g_rtl_runframe(inputs, 0);
@ -441,12 +453,48 @@ void RtlSaveSnapshot(const char *filename, bool saving_with_bug) {
fclose(f);
}
static void RtlLoadFromFile(FILE *f, bool replay) {
RtlApuLock();
Ppu *ppu = g_snes->ppu;
g_snes->ppu = g_snes->snes_ppu;
StateRecorder_Load(&state_recorder, f, replay);
ppu_copy(g_snes->my_ppu, g_snes->ppu);
g_snes->ppu = ppu;
RtlApuUnlock();
RtlSynchronizeWholeState();
}
static const char *const kBugSaves[] = {
"smb1-bug-1685653215",
"playthrough/1_1",
};
static int g_playback_ctr = ( 89 - 1) * 2; // 49
void SmwLoadNextPlaybackSnapshot() {
char name[128];
for (int i = 0; i < 100; i++) {
g_playback_ctr++;
sprintf(name, "saves/playthrough/%d_%d.sav", g_playback_ctr >> 1, (g_playback_ctr & 1) + 1);
FILE *f = fopen(name, "rb");
if (f) {
printf("Playthrough %s\n", name);
RtlLoadFromFile(f, true);
fclose(f);
return;
}
}
}
void RtlSaveLoad(int cmd, int slot) {
char name[128];
if (cmd == kSaveLoad_Replay && slot == 256) {
g_playback_mode = 1;
SmwLoadNextPlaybackSnapshot();
return;
}
if (slot >= 256) {
int i = slot - 256;
if (cmd == kSaveLoad_Save || i >= sizeof(kBugSaves) / sizeof(kBugSaves[0]))
@ -461,23 +509,19 @@ void RtlSaveLoad(int cmd, int slot) {
printf("*** %s slot %d: %s\n",
cmd == kSaveLoad_Save ? "Saving" : cmd == kSaveLoad_Load ? "Loading" : "Replaying", slot, name);
if (cmd != kSaveLoad_Save) {
FILE *f = fopen(name, "rb");
if (f == NULL) {
printf("Failed fopen: %s\n", name);
return;
}
RtlApuLock();
StateRecorder_Load(&state_recorder, f, cmd == kSaveLoad_Replay);
ppu_copy(g_snes->my_ppu, g_snes->ppu);
RtlApuUnlock();
RtlSynchronizeWholeState();
RtlLoadFromFile(f, cmd == kSaveLoad_Replay);
fclose(f);
} else {
RtlSaveSnapshot(name, false);
}
}
void MemCpy(void *dst, const void *src, int size) {
memcpy(dst, src, size);
}
@ -548,7 +592,7 @@ void WriteRegWord(uint16 reg, uint16 value) {
WriteReg(reg + 1, value >> 8);
}
uint8 *IndirPtr(void *ptr, uint16 offs) {
uint8 *IndirPtr(LongPtr *ptr, uint16 offs) {
uint32 a = (*(uint32 *)ptr & 0xffffff) + offs;
if ((a >> 16) >= 0x7e && (a >> 16) <= 0x7f || (a & 0xffff) < 0x2000) {
return &g_ram[a & 0x1ffff];
@ -557,12 +601,12 @@ uint8 *IndirPtr(void *ptr, uint16 offs) {
}
}
void IndirWriteWord(void *ptr, uint16 offs, uint16 value) {
void IndirWriteWord(LongPtr *ptr, uint16 offs, uint16 value) {
uint8 *p = IndirPtr(ptr, offs);
WORD(*p) = value;
}
void IndirWriteByte(void *ptr, uint16 offs, uint8 value) {
void IndirWriteByte(LongPtr *ptr, uint16 offs, uint8 value) {
uint8 *p = IndirPtr(ptr, offs);
p[0] = value;
}
@ -604,7 +648,7 @@ void RtlSetUploadingApu(bool uploading) {
RtlApuUnlock();
}
void RtlApuWrite(uint32 adr, uint8 val) {
void RtlApuWrite(uint16 adr, uint8 val) {
assert(adr >= APUI00 && adr <= APUI03);
if (g_is_uploading_apu) {
@ -685,6 +729,12 @@ void RtlApuReset() {
RtlApuUnlock();
}
static uint8 RtlApuReadReg(int reg) {
if (g_use_my_apu_code)
return g_spc_player->port_to_snes[reg];
return g_snes->apu->outPorts[reg];
}
void RtlRestoreMusicAfterLoad_Locked(bool is_reset) {
if (g_use_my_apu_code) {
memcpy(g_spc_player->ram, g_snes->apu->ram, 65536);
@ -764,3 +814,164 @@ void RtlWriteSram(void) {
}
}
void SmwCopyToVram(uint16 vram_addr, const uint8 *src, int n) {
for (size_t i = 0; i < (n >> 1); i++)
g_snes->ppu->vram[vram_addr + i] = WORD(src[i * 2]);
}
void SmwCopyToVramPitch32(uint16 vram_addr, const uint8 *src, int n) {
for (size_t i = 0; i < (n >> 1); i++)
g_snes->ppu->vram[vram_addr + i * 32] = WORD(src[i * 2]);
}
void SmwCopyToVramLow(uint16 vram_addr, const uint8 *src, int n) {
for (size_t i = 0; i < n; i++)
g_snes->ppu->vram[vram_addr + i] = (g_snes->ppu->vram[vram_addr + i] & 0xff00) | src[i];
}
void RtlUpdatePalette(const uint16 *src, int dst, int n) {
for(int i = 0; i < n; i++)
g_snes->ppu->cgram[dst + i] = src[i];
}
void SmwClearVram(uint16 vram_addr, uint16 value, int n) {
for (int i = 0; i < n; i++)
g_snes->ppu->vram[vram_addr + i] = value;
}
uint16 *RtlGetVramAddr() {
return g_snes->ppu->vram;
}
void RtlPpuWrite(uint16 addr, uint8 value) {
assert((addr & 0xff00) == 0x2100);
ppu_write(g_snes->ppu, addr, value);
}
void RtlPpuWriteTwice(uint16 addr, uint16 value) {
RtlPpuWrite(addr, value);
RtlPpuWrite(addr, value >> 8);
}
void RtlHdmaSetup(uint8 which, uint8 transfer_unit, uint8 reg, uint32 addr, uint8 indirect_bank) {
Dma *dma = g_snes->dma;
dma_write(dma, DMAP0 + which * 16, transfer_unit);
dma_write(dma, BBAD0 + which * 16, reg);
dma_write(dma, A1T0L + which * 16, addr);
dma_write(dma, A1T0H + which * 16, addr >> 8);
dma_write(dma, A1B0 + which * 16, addr >> 16);
dma_write(dma, DAS00 + which * 16, indirect_bank);
}
void RtlEnableVirq(int line) {
g_snes->vIrqEnabled = line >= 0;
if (line >= 0)
g_snes->vTimer = line;
}
static const uint8 kSetupHDMAWindowingEffects_DATA_00927C[] = { 0xF0,0xA0, 4,0xF0,0x80, 5, 0 };
static const uint8 *SimpleHdma_GetPtr(uint32 p) {
if (game_id == kGameID_SMW) {
switch (p) {
case 0x927c: return kSetupHDMAWindowingEffects_DATA_00927C;
}
if (p < 0x2000)
return g_ram + p;
}
printf("SimpleHdma_GetPtr: bad addr 0x%x\n", p);
return NULL;
}
void SimpleHdma_Init(SimpleHdma *c, DmaChannel *dc) {
if (!dc->hdmaActive) {
c->table = 0;
return;
}
c->table = SimpleHdma_GetPtr(dc->aAdr | dc->aBank << 16);
c->rep_count = 0;
c->mode = dc->mode | dc->indirect << 6;
c->ppu_addr = dc->bAdr;
c->indir_bank = dc->indBank;
}
void SimpleHdma_DoLine(SimpleHdma *c) {
static const uint8 bAdrOffsets[8][4] = {
{0, 0, 0, 0},
{0, 1, 0, 1},
{0, 0, 0, 0},
{0, 0, 1, 1},
{0, 1, 2, 3},
{0, 1, 0, 1},
{0, 0, 0, 0},
{0, 0, 1, 1}
};
static const uint8 transferLength[8] = {
1, 2, 2, 4, 4, 4, 2, 4
};
if (c->table == NULL)
return;
bool do_transfer = false;
if ((c->rep_count & 0x7f) == 0) {
c->rep_count = *c->table++;
if (c->rep_count == 0) {
c->table = NULL;
return;
}
if(c->mode & 0x40) {
c->indir_ptr = SimpleHdma_GetPtr(c->indir_bank << 16 | c->table[0] | c->table[1] * 256);
c->table += 2;
}
do_transfer = true;
}
if(do_transfer || c->rep_count & 0x80) {
for(int j = 0, j_end = transferLength[c->mode & 7]; j < j_end; j++) {
uint8 v = c->mode & 0x40 ? *c->indir_ptr++ : *c->table++;
RtlPpuWrite(0x2100 + c->ppu_addr + bAdrOffsets[c->mode & 7][j], v);
}
}
c->rep_count--;
}
void LoadStripeImage_UploadToVRAM(const uint8 *pp) { // 00871e
while (1) {
if ((*pp & 0x80) != 0)
break;
uint16 vram_addr = pp[0] << 8 | pp[1];
uint8 vmain = __CFSHL__(pp[2], 1);
uint8 fixed_addr = (uint8)(pp[2] & 0x40) >> 3;
uint16 num = (swap16(WORD(pp[2])) & 0x3FFF) + 1;
uint16 *dst = g_snes->ppu->vram + vram_addr;
pp += 4;
if (fixed_addr) {
uint16 src_data = WORD(*pp);
int ctr = (num + 1) >> 1;
if (vmain) {
for (int i = 0; i < ctr; i++)
dst[i * 32] = src_data;
} else {
// uhm...?
uint8 *dst_b = (uint8 *)dst;
for (int i = 0; i < num; i++)
dst_b[i + ((i & 1) << 1)] = src_data;
for (int i = 0; i < num; i += 2)
dst_b[i + 1] = src_data >> 8;
}
pp += 2;
} else {
uint16 *src = (uint16 *)pp;
if (vmain) {
for (int i = 0; i < (num >> 1); i++)
dst[i * 32] = src[i];
} else {
for (int i = 0; i < (num >> 1); i++)
dst[i] = src[i];
}
pp += num;
}
}
}

View File

@ -10,6 +10,29 @@ enum {
kGameID_SMBLL = 3,
};
enum {
// Version was bumped to 1 after I fixed bug #1
kCurrentBugFixCounter = 1,
kSmwRam_APUI02 = 0x18c5,
};
typedef struct SimpleHdma {
const uint8 *table;
const uint8 *indir_ptr;
uint8 rep_count;
uint8 mode;
uint8 ppu_addr;
uint8 indir_bank;
} SimpleHdma;
typedef struct DmaChannel DmaChannel;
void SimpleHdma_Init(SimpleHdma *c, DmaChannel *dc);
void SimpleHdma_DoLine(SimpleHdma *c);
void RtlHdmaSetup(uint8 which, uint8 transfer_unit, uint8 reg, uint32 addr, uint8 indirect_bank);
extern uint8 g_ram[0x20000];
extern uint8 *g_sram;
extern int g_sram_size;
@ -61,7 +84,6 @@ static inline const uint8 *RomPtr_0E(uint16_t addr) { return RomPtr(0x0e0000 | a
static inline const uint8 *RomPtr_0F(uint16_t addr) { return RomPtr(0x0f0000 | addr); }
static inline const uint8 *RomPtrWithBank(uint8 bank, uint16_t addr) { return RomPtr((bank << 16) | addr); }
extern void RtlApuWrite(uint32 adr, uint8 val);
uint16 Mult8x8(uint8 a, uint8 b);
uint16 SnesDivide(uint16 a, uint8 b);
uint16 SnesModulus(uint16 a, uint8 b);
@ -71,9 +93,9 @@ void WriteReg(uint16 reg, uint8 value);
void WriteRegWord(uint16 reg, uint16 value);
uint16 ReadRegWord(uint16 reg);
uint8 ReadReg(uint16 reg);
uint8_t *IndirPtr(void *ptr, uint16 offs);
void IndirWriteWord(void *ptr, uint16 offs, uint16 value);
void IndirWriteByte(void *ptr, uint16 offs, uint8 value);
uint8_t *IndirPtr(LongPtr *ptr, uint16 offs);
void IndirWriteWord(LongPtr *ptr, uint16 offs, uint16 value);
void IndirWriteByte(LongPtr *ptr, uint16 offs, uint8 value);
typedef void RunFrameFunc(uint16 input, int run_what);
@ -104,6 +126,14 @@ void RtlReadSram();
void RtlWriteSram();
void RtlSaveSnapshot(const char *filename, bool saving_with_bug);
void RtlUpdatePalette(const uint16 *src, int dst, int n);
uint16 *RtlGetVramAddr();
void RtlPpuWrite(uint16 addr, uint8 value);
void RtlPpuWriteTwice(uint16 addr, uint16 value);
void RtlApuWrite(uint16 adr, uint8 val);
void RtlEnableVirq(int line);
enum {
kJoypadL_A = 0x80,
kJoypadL_X = 0x40,

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,31 @@
#include "types.h"
#include "smw_rtl.h"
typedef struct CollInfo {
uint8 r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11;
} CollInfo;
typedef struct HdmaPtrs {
uint16 r4, r6;
} HdmaPtrs;
typedef struct PairU8 {
uint16 first, second;
} PairU8;
typedef struct CalcTiltPlatformArgs {
uint16 temp14b0;
uint16 temp14b2;
uint16 temp14bc;
uint16 temp14bf;
} CalcTiltPlatformArgs;
typedef struct CheckPlatformCollRet {
PointU16 pt;
bool retval;
bool out_of_bounds;
} CheckPlatformCollRet;
// Bank 0
PairU16 BufferFileSelectText_009DB5(uint8 k);
PairU16 GetPlayerLevelCollisionMap16ID_Entry2(uint8 k);
@ -7,32 +34,30 @@ PairU16 GetPlayerLevelCollisionMap16ID_WallRun(uint8 k);
PairU16 HexToDec(uint8 a);
PairU16 OwPrompt03_OverworldLifeExchanger_00974C(uint8 a);
uint8 CheckWaterSlope(uint8 a);
uint8 CheckWhatSlopeSpriteIsOn(uint8 a);
uint8 CheckWhatSlopeSpriteIsOn(uint8 a, uint8 r10, uint8 r12, uint8 *r8_slope_type);
uint8 GameMode07_TitleScreenDemo_009CBE(void);
uint8 GraphicsDecompressionRoutines_ReadByte(void);
uint8 HandleMenuCursor_Main_ReturnsTwice(uint8 j);
uint16 ManipulateMode7Image_008B2B(uint16 k);
uint16 ManipulateMode7Image_008B2B(uint16 k, uint8 r0);
uint8 ModifyMap16IDForSpecialBlocks(uint8 a);
uint8 PlayerGFXRt_00E45D(uint8 j);
uint8 PlayerState00_00F9A8(void);
uint8 PlayerState00_00F9BC(void);
uint8 PlayerGFXRt_00E45D(uint8 j, uint8 r4, uint8 r5, uint8 r6);
uint8 RunPlayerBlockCode_00F3E9(uint8 a, uint8 j);
uint8 RunPlayerBlockCode_00F43F(void);
uint8 RunPlayerBlockCode_00F443(void);
uint8 UpdateHDMAWindowBuffer_00CC14(uint16 j);
PairU8 UpdateHDMAWindowBuffer_00CC14(uint16 j, HdmaPtrs hptr, uint8 r1);
uint8 sub_F40A(uint8 k, uint8 j, uint8 a);
void BufferFileSelectText_Entry3(uint8 k);
void BufferFileSelectText_Entry3(uint8 k, uint8 r5);
void BufferFileSelectText(void);
void BufferLoadingLetterTiles(void);
void BufferPalettesRoutines_IggyLarryPlatform(void);
void BufferPalettesRoutines_Levels(void);
void BufferPalettesRoutines_LoadColorInVerticalStrip(uint16 k);
void BufferPalettesRoutines_LoadColors(void);
void BufferPalettesRoutines_LoadColorInVerticalStrip(uint16 k, uint16 r4);
void BufferPalettesRoutines_LoadColors(uint16 r0, uint16 r4, uint16 r6, uint16 r8);
void BufferPalettesRoutines_Overworld(void);
void BufferPalettesRoutines_Overworld(void);
void BufferPalettesRoutines_ReznorAndMode7KoopaBosses(void);
void BufferPalettesRoutines_TitleScreen(void);
void ChangeNetDoorTiles(void);
void ChangeNetDoorTiles(GenTileArgs *gta);
void CheckPowerUpSpecificPlayerAttacks(void);
void CheckIfBlockWasHit_Entry3(uint8 a, uint8 j);
void CheckIfBlockWasHit(uint8 a, uint8 j);
@ -51,19 +76,15 @@ void DamagePlayer_PitFall(void);
void DamagePlayer_SetHurtAnimationTimer(uint8 a);
void DisplayingContinueEnd(uint8 a);
void DisplayingContinueEnd(uint8 a);
void DrawLoadingLetters_Draw(uint8 k, uint8 j);
uint16 DrawLoadingLetters_Draw(uint8 k, uint8 j, uint16 r0w);
void DrawLoadingLetters(void);
void EraseLargeSwitch(void);
void EraseYoshiCoin(void);
void EraseLargeSwitch(GenTileArgs *gta);
void EraseYoshiCoin(GenTileArgs *gta);
void FileSelectColorMath(uint16 a, uint8 j);
void GameMode00_LoadNintendoPresents_0093CA(void);
void GameMode00_LoadNintendoPresents_0093EA(uint8 k, uint8 j);
void GameMode00_LoadNintendoPresents_0093F4(void);
void GameMode00_LoadNintendoPresents(void);
void GameMode00_LoadNintendoPresents_Mode04Finish(void);
void GameMode01_ShowNintendoPresents_009417(void);
void GameMode01_ShowNintendoPresents(void);
void GameMode01_ShowNintendoPresents_Return00941A(void);
void GameMode04_PrepareTitleScreen(void);
void GameMode06_CircleEffect_009440(uint8 a);
void GameMode06_CircleEffect_009443(void);
@ -84,7 +105,7 @@ void GameMode10_BufferLevelLoadMessage(void);
void GameMode11_LoadSublevel_0096CF(uint8 j, uint8 a);
void GameMode11_LoadSublevel_00A796(void);
void GameMode11_LoadSublevel_GameMode03Entry(void);
void GameMode11_LoadSublevel_SA1Pack_OptimizeThisRoutine1(void);
void GameMode11_LoadSublevel_0096D5(void);
void GameMode12_PrepareLevel_00919B(void);
void GameMode12_PrepareLevel_009860(void);
void GameMode12_PrepareLevel_009A1F(uint8 k);
@ -120,18 +141,17 @@ void GameModeXX_FadeInOrOut_MosaicFade(void);
void Gamemode_9_A_Common(void);
void GenerateTile_00BFBC(void);
void GenerateTile(void);
void GenericPage01Tile_00C0FB(uint16 j);
void GenericPage01Tile(void);
void GenericPage01Tile_00C0FB(GenTileArgs *gta, uint16 j);
void GenericPage01Tile(GenTileArgs *gta);
void GenericPage01Tile_Return00C1AB(void);
void GenericPage01Tile_SetItemMemory(void);
void GraphicsDecompressionRoutines_BeginDecompression(void);
void GenericPage01Tile_SetItemMemory(GenTileArgs *gta);
void GraphicsDecompressTo(uint8 *pdst);
void GraphicsDecompressionRoutines_DecompressGFX32And33(void);
void GraphicsDecompressionRoutines(uint8 j);
const uint8 *GraphicsDecompress(uint8 j);
void HandleMenuCursor_009E82(uint8 j);
void HandleMenuCursor_009ED4(uint8 k);
void HandlePaletteFades_00AF35(void);
void HandlePaletteFades_00AFA3(uint8 a);
void HandlePaletteFades_00AFC0(uint16 a);
void HandlePaletteFades_00AF35(bool run_code_at_end);
uint16 HandlePaletteFades_00AFC0(uint16 a, uint16 r2, uint16 r12, uint16 r14);
void HandlePaletteFades(void);
void HandlePlayerLevelColl_00E98C(void);
void HandlePlayerLevelColl_00E9C8(uint8 j, uint8 cr);
@ -154,14 +174,14 @@ void HandlePlayerPhysics_Swimming(void);
void HandlePlayerPhysics_UpdatePMeter(void);
uint8 HandlePlayerPhysics_UpdatePMeterEx(uint8 j);
void HandleSPCUploads_008134(void);
void HandleSPCUploads_StrtSPCMscUpld(void);
void HandleSPCUploads_StrtSPCMscUpld(const uint8 *p);
void HandleSPCUploads_UploadCreditsMusicBank(void);
void HandleSPCUploads_UploadDataToSPC(void);
void HandleSPCUploads_UploadDataToSPC(const uint8 *p);
void HandleSPCUploads_UploadOverworldMusicBank(void);
void HandleSPCUploads_UploadSPCEngine(void);
void HandleSPCUploads_UploadSamples(void);
void HandleStandardLevelCameraScroll_00F7F4(uint16 a);
void HandleStandardLevelCameraScroll_00F8AB(void);
uint16 HandleStandardLevelCameraScroll_00F8AB(uint16 r2w);
void HandleStandardLevelCameraScroll(void);
void IncrementSublevelsEnteredAndPrepareToLoadSublevel(void);
void InitAndMainLoop_ProcessGameMode(void);
@ -178,11 +198,11 @@ void InitializeStatusBarTilemap(void);
void LoadSaveBufferData(void);
void LoadStripeImage(void);
void LoadStripeImage(void);
void LoadStripeImage_UploadToVRAM(uint8 a);
void ManipulateMode7Image_008AE8(void);
void LoadStripeImage_UploadToVRAM(const uint8 *pp);
void ManipulateMode7Image_008AE8(uint8 r0);
void ManipulateMode7Image(void);
void OwEventProcess04_FadeInLayer2Tile_00B006(uint8 a);
void PlayerGFXRt_00F636(void);
void PlayerGFXRt_00F636(uint8 r10, uint8 r11, uint8 r12, uint8 r13);
void PlayerDraw(void);
void PlayerState00_00B03E(void);
void PlayerState00_00C95B(void);
@ -200,7 +220,7 @@ void PlayerState00_00CD8B(void);
void PlayerState00_00CD8F(void);
void PlayerState00_00CD95(uint8 j);
void PlayerState00_00F8F2(void);
void PlayerState00_00F9C9(void);
void PlayerState00_00F9C9(uint16 temp14b4, uint16 temp14b6, PointU16 pt);
void PlayerState00_CheckPlayerPitFall(void);
void PlayerState00_HandleEndOfLevel(void);
void PlayerState00_HandleLRScrolling(void);
@ -289,23 +309,23 @@ void UnusedAddToWarpPipeTimerRoutine(void);
void UnusedYoshiRelatedRoutine(void);
void UpdateCurrentPlayerPositionRAM(void);
void UpdateEntirePalette(void);
void UpdateHDMAWindowBuffer_IrisInOnPlayerEntry(uint8 a);
void UpdateHDMAWindowBuffer_KeyholeEntry(uint8 a);
void UpdateHDMAWindowBuffer_SetCircleHDMAPointer(void);
void UpdateHDMAWindowBuffer_IrisInOnPlayerEntry(uint8 a, HdmaPtrs hptr);
void UpdateHDMAWindowBuffer_KeyholeEntry(HdmaPtrs hptr, uint8 r0, uint8 r1);
HdmaPtrs UpdateHDMAWindowBuffer_SetCircleHDMAPointer(void);
void UpdatePaletteFromIndexedTable_00AE47(void);
void UpdatePaletteFromIndexedTable(void);
void UpdatePlayerSpritePosition(void);
void UpdateStatusBarCounters_009051(uint8 k, uint8 j);
void UpdateStatusBarCounters_009051(uint8 k, uint8 j, uint16 r2w);
void UpdateStatusBarCounters_DrawItemBoxItem(void);
void UpdateStatusBarCounters_Loop2(uint8 k, uint8 j);
void UpdateStatusBarCounters_Loop2(uint8 k, uint8, uint16 r0w, uint16 r2w);
void UpdateStatusBarCounters(void);
void UploadBigLayer3LettersToVRAM(void);
void ConvertGFX27IntoNormallFormat(void);
void ConvertGFX27IntoNormallFormat(uint16 *dst);
void UploadGraphicsFiles_Layer3(void);
void UploadGraphicsFiles(void);
void UploadGraphicsFiles_UploadGFXFile(uint8 j);
void UploadGraphicsFiles_UploadGFXFile(uint16 dst_addr, uint8 j);
void UploadLevelExAnimationData(void);
void UploadLevelAnimations_RedFlash(uint8 a);
void UploadLevelAnimations_RedFlash(uint8 a, uint8 r0);
void UploadLevelAnimations_YellowFlash(uint8 a);
void UploadLevelLayer1And2Tilemaps(void);
void UploadLoadingLettersTiles(void);
@ -317,8 +337,8 @@ void UploadPlayerGFX(void);
void UploadStatusBarTilemap(void);
void sub_9291(uint16 k);
void sub_9F4C(uint8 j);
void sub_C074(void);
void sub_C077(void);
void sub_C074(GenTileArgs *gta);
void sub_C077(GenTileArgs *gta);
// Bank 1
uint8 CheckAvailableExtendedSpriteSlot(uint8 k);
@ -329,41 +349,46 @@ uint8 CheckPlayerToNormalSpriteCollision(uint8 k);
uint8 CheckPlayerToNormalSpriteColl_ProcessInteract(uint8 k);
uint8 CheckPlayerToNormalSpriteColl_ReturnNoContact(void);
uint8 CheckPlayerToNormalSpriteColl_ReturnNoContact2(void);
uint8 CheckTiltingPlatformCollision(void);
CheckPlatformCollRet CheckTiltingPlatformCollision(uint16 temp14b4, uint16 temp14b6);
uint8 CheckIfNormalSpriteOffScreen(uint8 k);
uint8 CheckNormalSpriteLevelColl_Ceiling(uint8 k);
uint8 CheckNormalSpriteLevelColl_Floor(uint8 k);
uint8 CheckNormalSpriteLevelColl_Wall(uint8 k);
uint8 CheckPlayerPositionRelativeToSprite_Bank01_X(uint8 k);
uint8 CheckPlayerPositionRelativeToSprite_Bank01_Y(uint8 k);
uint8 FinishOAMWrite_01B844(void);
uint8 GetDrawInfo_Bank01_ReturnsTwice(uint8 k);
uint8 FinishOAMWrite_01B844(uint16 r4w);
typedef struct GetDrawInfoRes {
uint8 idx;
uint8 x, y;
} GetDrawInfoRes;
GetDrawInfoRes GetDrawInfo_Bank01_ReturnsTwice(uint8 k);
uint8 GetRand(void);
uint8 GetRand_01AD07(uint8 j);
uint8 HandleNormalSpriteLevelColl_019441(uint8 k, uint8 j);
uint8 HandleNormalSpriteLevelColl_01944D(uint8 k, uint8 j);
uint8 HandleNormalSpriteLevelColl_019523(uint8 k);
uint8 HandleNormalSpriteLevelColl_019441(uint8 k, uint8 j, PointU16 *pt_out);
uint8 HandleNormalSpriteLevelColl_01944D(uint8 k, uint8 j, PointU16 *pt_out);
uint8 HandleNormalSpriteLevelColl_019523(uint16 r5);
uint8 SolidSpriteBlock_Entry2(uint8 k);
uint8 SolidSpriteBlock(uint8 k);
uint8 Spr029_KoopaKid_MortonRoyLudwig_01D0C0(uint8 k);
uint8 Spr04C_ExplodingBlock_Init(uint8 k);
void Spr04C_ExplodingBlock_Init_MainV(uint8 k);
uint8 Spr05F_BrownChainedPlatform_01C9BF(void);
uint8 Spr05F_BrownChainedPlatform_01CA9C(uint8 k);
uint8 Spr0A7_IggyBall_CheckTiltingPlatformCollision(uint8 k);
uint8 Spr05F_BrownChainedPlatform_01C9BF(uint16 r9);
uint8 Spr05F_BrownChainedPlatform_01CA9C(uint8 k, PointU16 pt);
CheckPlatformCollRet Spr0A7_IggyBall_CheckTiltingPlatformCollision(uint8 k);
uint8 SprXXX_Generic_Init_MakeSpriteFacePlayer(uint8 k);
void SprXXX_Generic_Init_MakeSpriteFacePlayerV(uint8 k);
uint8 SprXXX_LineGuided_01D94D(void);
uint8 SprXXX_LineGuided_01D94D(uint16 r0w, uint16 r2w);
uint8 SprXXX_SmallMontyMole_01E3EF_ReturnsTwice(uint8 k);
uint8 SprXXX_TurnBlockBridge_01B8FF(uint8 k);
uint8 SprXXX_TurnBlockBridge_01B8FF(uint8 k, uint16 R0, uint16 r2);
uint8 sub_1B505(uint8 k);
uint8 sub_1EC50(void);
void AimTowardsPlayer_Bank01(uint8 k, uint8 a);
PointU8 AimTowardsPlayer_Bank01(uint8 k, uint8 a);
void BoostMarioSpeed(void);
void BreakThrowBlock(uint8 k);
void BreakThrowBlock_MontyMoleEntry(uint8 k, uint8 j);
void CalculateCircleCoordinatesForTiltingPlaform_01CC28(void);
void CalculateCircleCoordinatesForTiltingPlaform(void);
uint32 CalculateCircleCoordinatesForTiltingPlaform_01CC28(uint16 R0_W_, uint16 R2_W_);
PointU16 CalculateCircleCoordinatesForTiltingPlaform(CalcTiltPlatformArgs inp);
void ChangeNormalSpriteDirection_CheckIfTouchingWall(uint8 k);
void ChangeNormalSpriteDirection_FlipXSpeedAndDirection(uint8 k);
void ChangeNormalSpriteDirection(uint8 k);
@ -384,16 +409,16 @@ void CheckTiltingPlatformColl_01CCC7(void);
void CheckTiltingPlatformColl_Return01CCEA(void);
void CheckTiltingPlatformColl_Return01CCEB(void);
void DrawWingTiles_019E35(uint8 k, uint8 j);
void DrawWingTiles_019E37(uint8 k);
void DrawWingTiles_019E37(uint8 k, uint8 r2);
void DrawWingTiles(uint8 k);
void DrawWingTiles_ParaKoopaEntry(uint8 k);
void FinishOAMWrite(uint8 k, uint8 j, uint8 a);
void FinishOAMWrite(uint8 k, uint8 j, uint8 a);
void GenericGFXRtDraw1Tile16x16_019F0F(uint8 k);
void GenericGFXRtDraw1Tile16x16_019F0F(uint8 k, uint8 r4);
void GenericGFXRtDraw1Tile16x16(uint8 k);
void GenericGFXRtDraw1Tile16x16_Sub(uint8 k, uint8 a);
void GenericGFXRtDraw1Tile16x16(uint8 k);
void GenericGFXRtDraw2Tiles16x16sStacked_019DA9(uint8 k, uint8 j);
void GenericGFXRtDraw2Tiles16x16sStacked_019DA9(uint8 k, uint8 j, uint8 r0);
void GenericGFXRtDraw2Tiles16x16sStacked_Sub(uint8 k);
void GenericGFXRtDraw2Tiles16x16sStacked_UpsideDown(uint8 k);
void GenericGFXRtDraw4Tiles8x8Square_Entry1(uint8 k, uint8 a, uint8 j);
@ -407,9 +432,9 @@ void HandleNormalSpriteLevelColl_019211(uint8 k);
void HandleNormalSpriteLevelColl_01928E(uint8 k, uint8 a);
void HandleNormalSpriteLevelColl_0192C9(uint8 k);
void HandleNormalSpriteLevelColl_019330(uint8 k);
void HandleNormalSpriteLevelColl_01933B(uint8 k, uint8 a);
void HandleNormalSpriteLevelColl_019425(uint8 k);
void HandleNormalSpriteLevelColl_019435(uint8 k);
void HandleNormalSpriteLevelColl_01933B(uint8 k, uint8 a, uint8 r10, uint8 r12, uint8 r15);
void HandleNormalSpriteLevelColl_019425(uint8 k, uint16 xpos_r10w, uint16 ypos_r12w, uint8 r15);
void HandleNormalSpriteLevelColl_019435(uint8 k, uint8 r15);
void HandleNormalSpriteLevelCollision(uint8 k);
void HandleNormalSpriteLevelCollision(uint8 k);
void KickHelplessSprite(uint8 k);
@ -449,7 +474,7 @@ void SetXSpeedBasedOnNormalSpriteFacingDirection(uint8 k);
void SpawnContactEffectFromAbove(uint8 k);
void SpawnContactEffectFromSide(uint8 k);
void SpawnContactEffectFromSide_NoKickSound(uint8 k);
void SpawnNormalSpriteTurnAroundSmoke_Entry2(uint8 k);
void SpawnNormalSpriteTurnAroundSmoke_Entry2(uint8 k, uint8 r0, uint8 r1);
void SpawnNormalSpriteTurnAroundSmoke(uint8 k);
void SpawnSparkles_GoalSphereEntry(uint8 k, uint8 a);
void SpawnSparklesSpriteEntry(uint8 k);
@ -498,12 +523,12 @@ void Spr026_Thwomp(uint8 k);
void Spr026_Thwomp_Rising(uint8 k);
void Spr026_Thwomp_Waiting(uint8 k);
void Spr027_Thwimp(uint8 k);
void Spr029_KoopaKid_IggyLarry_01FC62(uint8 k);
void Spr029_KoopaKid_IggyLarry_01FD50(uint8 k);
void Spr029_KoopaKid_IggyLarry_Draw(uint8 k);
void Spr029_KoopaKid_IggyLarry_InShellDraw(uint8 k);
void Spr029_KoopaKid_IggyLarry_01FC62(uint8 k, PointU16 pt);
PointU16 Spr029_KoopaKid_IggyLarry_01FD50(uint8 k);
void Spr029_KoopaKid_IggyLarry_Draw(uint8 k, PointU16 pt);
void Spr029_KoopaKid_IggyLarry_InShellDraw(uint8 k, PointU16 pt);
void Spr029_KoopaKid_IggyLarry(uint8 k);
void Spr029_KoopaKid_IggyLarry_ThrowBall(uint8 k);
void Spr029_KoopaKid_IggyLarry_ThrowBall(uint8 k, PointU16 pt);
void Spr029_KoopaKid_MortonRoyLudwig_01D309(uint8 k);
void Spr029_KoopaKid_MortonRoyLudwig_01CE1E(uint8 k);
void Spr029_KoopaKid_MortonRoyLudwig_01CE3E(uint8 k);
@ -512,7 +537,7 @@ void Spr029_KoopaKid_MortonRoyLudwig_01D059(uint8 k);
void Spr029_KoopaKid_MortonRoyLudwig_01D2A8(uint8 k);
void Spr029_KoopaKid_MortonRoyLudwig_01D351(uint8 k);
void Spr029_KoopaKid_MortonRoyLudwig_01D3B1(uint8 k);
void Spr029_KoopaKid_MortonRoyLudwig_01D40B(uint8 k);
void Spr029_KoopaKid_MortonRoyLudwig_01D40B(uint8 k, CollInfo *ci);
void Spr029_KoopaKid_MortonRoyLudwig_GetDrawInfo(uint8 k);
void Spr029_KoopaKid_MortonRoyLudwig(uint8 k);
void Spr029_KoopaKid_MortonRoyLudwig_ProcessLudwigsAttacks(uint8 k);
@ -539,13 +564,13 @@ void Spr035_Yoshi_Init(uint8 k);
void Spr035_Yoshi_Init_Return(uint8 k);
void Spr035_Yoshi_01EDCC(uint8 k);
void Spr035_Yoshi_01EDCE(uint8 k, uint8 j);
void Spr035_Yoshi_01EF18(uint8 k);
uint8 Spr035_Yoshi_01EF18(uint8 k);
void Spr035_Yoshi_01F0A2(uint8 k);
void Spr035_Yoshi_01F295(uint8 k);
void Spr035_Yoshi_01F295(uint8 k, uint8 r0);
void Spr035_Yoshi_01F2DF(uint8 j);
void Spr035_Yoshi_01F309(void);
void Spr035_Yoshi_01F3FE(uint8 k);
void Spr035_Yoshi_01F4B2(uint8 k);
uint8 Spr035_Yoshi_01F3FE(uint8 k);
void Spr035_Yoshi_01F4B2(uint8 k, uint8 r13);
void Spr035_Yoshi_01F622(uint8 k);
void Spr035_Yoshi_01F668(uint8 k, uint8 j);
void Spr035_Yoshi_01F6CD(uint8 j);
@ -557,7 +582,7 @@ void Spr035_Yoshi_MouthState01_ExtendTongue(uint8 k);
void Spr035_Yoshi_MouthState02_RetractTongue(uint8 k);
void Spr035_Yoshi_MouthState03_Spitting(uint8 k);
void Spr035_Yoshi_Return01F3FD(void);
void Spr035_Yoshi_TryEatSprite(uint8 k, uint8 j);
void Spr035_Yoshi_TryEatSprite(uint8 k, uint8 j, CollInfo *ci);
void Spr03D_RipVanFish(uint8 k);
void Spr03E_PSwitch_Init(uint8 k);
void Spr03E_PSwitch(uint8 k);
@ -575,13 +600,13 @@ void Spr04C_ExplodingBlock(uint8 k);
void Spr04E_LedgeMontyMole(uint8 k);
void Spr052_MovingLedgeHole_Init(uint8 k);
void Spr054_ClimbingNetDoor_Init(uint8 k);
void Spr054_ClimbingNetDoor_01BC1D(void);
void Spr054_ClimbingNetDoor_01BC1D(CollInfo *ci);
void Spr054_ClimbingNetDoor(uint8 k);
void Spr057_VerticalCheckerboardPlatform_Init(uint8 k);
void Spr058_VerticalRockPlatform(uint8 k);
void Spr05F_BrownChainedPlatform_Init(uint8 k);
void Spr05F_BrownChainedPlatform_01C9E2(uint8 k);
void Spr05F_BrownChainedPlatform_01CACB(uint8 k);
CalcTiltPlatformArgs Spr05F_BrownChainedPlatform_01CACB(uint8 k);
void Spr05F_BrownChainedPlatform(uint8 k);
void Spr05F_BrownChainedPlatform_UpdateAngle(uint8 k);
void Spr060_FlatPalaceSwitch_Init(uint8 k);
@ -781,8 +806,8 @@ void SprXXX_SmallMontyMole_State02_PopOutOfGround(uint8 k);
void SprXXX_SmallMontyMole_State03_Walking(uint8 k);
void SprXXX_TurnBlockBridge_01B6B2(uint8 k);
void SprXXX_TurnBlockBridge_01B6E7(uint8 k);
void SprXXX_TurnBlockBridge_01B852(uint8 k);
void SprXXX_TurnBlockBridge_Draw(uint8 k);
void SprXXX_TurnBlockBridge_01B852(uint8 k, uint16 t);
uint16 SprXXX_TurnBlockBridge_Draw(uint8 k);
void SprXXX_TurnBlockBridge_HorizontalAndVerticalTurnBlockBridgeEntry(uint8 k);
void SprXXX_TurnBlockBridge_HorizontalTurnBlockBridgeEntry(uint8 k);
void SprXXX_TurnBlockBridge_Return01B851(void);
@ -797,7 +822,7 @@ void SprXXX_WallSpringboard(uint8 k);
void StunnedShellGFXRt_01980F(uint8 k, uint8 a);
void StunnedShellDraw(uint8 k);
void SubOffscreen_Bank01_01AC2D(uint8 k, uint8 a);
void SubOffscreen_Bank01_01AC33(uint8 k);
void SubOffscreen_Bank01_01AC33(uint8 k, uint8 r3);
void SubOffscreen_Bank01_Entry1(uint8 k);
void SubOffscreen_Bank01_Entry2(uint8 k);
void SubOffscreen_Bank01_Entry3(uint8 k);
@ -810,7 +835,7 @@ void sub_1A64A(uint8 k, uint8 j);
void sub_1A685(uint8 k, uint8 j);
void sub_1A72E(uint8 k, uint8 j);
void sub_1C9DA(uint8 k);
void sub_1C9EC(uint8 k);
void sub_1C9EC(uint8 k, PointU16 pt);
void sub_1D31E(uint8 k);
void sub_1D334(uint8 k);
void sub_1F8E1(uint8 k, uint8 a);
@ -819,22 +844,26 @@ void sub_1F8E1(uint8 k, uint8 a);
uint8 CheckAvailableScoreSpriteSlot(void);
uint8 CheckPlayerPositionRelativeToSprite_Bank23_X(uint8 k);
uint8 CheckPlayerPositionRelativeToSprite_Bank23_Y(uint8 k);
uint8 CheckPlayerPositionRelativeToSprite_Y_R15(uint8 k);
uint8 ExtSpr04_Hammer_ThrownBoneEntry(uint8 k);
uint8 FindFreeNormalSpriteSlot_02A9E6(void);
uint8 FindFreeNormalSpriteSlot_02A9E6(uint8 r14);
uint8 FindFreeNormalSpriteSlot_HighPriority(void);
uint8 FindFreeNormalSpriteSlot_LowPriority(void);
uint8 FindFreeNormalSpriteSlot_02A9E6(void);
uint8 GetDrawInfo_Bank23_ReturnsTwice(uint8 k);
uint8 FindFreeNormalSpriteSlot_02A9E6(uint8 r14);
GetDrawInfoRes GetDrawInfo_Bank23_ReturnsTwice(uint8 k);
uint8 GrabThrowBlockBlock(void);
uint8 HandleExtendedSpriteLevelColl_02A611(uint8 k);
uint8 HandleExtendedSpriteLevelCollision(uint8 k);
typedef struct ExtCollOut {
uint8 r10, r11, r12, r13;
} ExtCollOut;
uint8 HandleExtendedSpriteLevelColl_02A611(uint8 k, uint8 r15, ExtCollOut *out);
uint8 HandleExtendedSpriteLevelCollision(uint8 k, ExtCollOut *out);
uint8 InitializeBlockPunchAttack(void);
uint8 Spr08F_ScalePlatform_02E524(uint8 k, uint8 j);
uint8 Spr0A3_GreyChainedPlatform_02D870(uint8 k, uint8 a);
uint8 UpdateNormalSpritePosition_X(uint8 k);
uint8 UpdateNormalSpritePosition_Y(uint8 k);
void AimTowardsPlayer_Bank23(uint8 k, uint8 a);
PointU8 AimTowardsPlayer_Bank23(uint8 k, uint8 a);
void BobOmbExplosion_ExplodeKillSpr(uint8 k, uint8 j);
void BobOmbExplosion_ExplodeSprites(uint8 k);
void BobOmbExplosion(uint8 k);
@ -842,17 +871,17 @@ void BobOmbExplosion(uint8 k);
void BounceSpr01_TurnBlock(uint8 k);
void BounceSpr07_SpinningTurnBlock(uint8 k);
void BounceSpriteDraw(uint8 k);
void CheckBerryTileCollisionWithYoshiTongue(void);
void CheckBerryTileCollisionWithYoshiTongue(CollInfo *ci);
void CheckMarioToExtendedSpriteColl_02A469(uint8 k);
void CheckMarioToExtendedSpriteColl_02A4DE(uint8 k);
void CheckMarioToExtendedSpriteColl_LoseYoshi(void);
void CheckMarioToExtendedSpriteCollision(uint8 k);
void CheckPlayerAttackToNormalSpriteColl_029404(uint8 k);
void CheckPlayerAttackToNormalSpriteColl_CapeSwingEntry(void);
void CheckPlayerAttackToNormalSpriteColl_GetBounceSpriteClipping(uint8 j);
void CheckPlayerAttackToNormalSpriteColl_GetCapeSwingOrNetPunchClipping(void);
void CheckPlayerAttackToNormalSpriteColl_029404(uint8 k, uint8 r14);
void CheckPlayerAttackToNormalSpriteColl_CapeSwingEntry(uint8 r14);
void CheckPlayerAttackToNormalSpriteColl_GetBounceSpriteClipping(uint8 j, CollInfo *ci);
void CheckPlayerAttackToNormalSpriteColl_GetCapeSwingOrNetPunchClipping(CollInfo *ci);
void CheckPlayerAttackToNormalSpriteCollision(uint8 k);
void CheckPlayerFireballToNormalSpriteColl_GetPlayerFireballClipping(uint8 j);
void CheckPlayerFireballToNormalSpriteColl_GetPlayerFireballClipping(uint8 j, CollInfo *ci);
void CheckPlayerFireballToNormalSpriteCollision(uint8 k);
void CheckPlayerToEnemyClusterSpriteCollision(uint8 k);
void CheckPlayerToNormalSpriteColl_02B9D9(uint8 j);
@ -876,7 +905,7 @@ void ClusterSpr06_SumoBroFlame_02F9F5(void);
void ClusterSpr06_SumoBroFlame_CheckPlayerContact(uint8 k);
void ClusterSpr06_SumoBroFlame(uint8 k);
void ClusterSpr07_ReappearingBoo(uint8 k);
void DrawBigCastleGate_DrawBigCastleGate(void);
void DrawBigCastleGate_DrawBigCastleGate(uint8 r0);
void DrawBigCastleGate(void);
void DrawGhostHouseEntranceDoor(void);
void DrawGhostHouseEntranceDoor(void);
@ -896,7 +925,7 @@ void ExtSpr07_LavaSplash(uint8 k);
void EraseExtSprite(uint8 k);
void ExtSpr08_LauncherArm(uint8 k);
void ExtSpr09_Unused(uint8 k);
void ExtSpr0A_CloudCoin_029D45(uint8 j);
void ExtSpr0A_CloudCoin_029D45(uint8 j, uint8 r1);
void ExtSpr0A_CloudCoin_029D36(uint8 j, uint8 a);
void ExtSpr0A_CloudCoin(uint8 k);
void ExtSpr0C_VolcanoLotusFire(uint8 k);
@ -909,7 +938,7 @@ void GameMode14_InLevel_Bank02(void);
void GameMode14_InLevel_02827D(void);
void GameMode14_InLevel_0283CE(void);
void GameMode14_InLevel_0283F8(uint8 k);
void GameMode14_InLevel_028439(uint8 k);
void GameMode14_InLevel_028439(uint8 k, uint8 xpos);
void GenSpr01_GenerateEerie(void);
void GenSpr02_GenParachuteEnemy(void);
void GenSpr07_GenerateFish(void);
@ -917,21 +946,21 @@ void GenSpr08_TurnOffRespawningSprite(void);
void GenSpr09_GenerateSuperKoopa(void);
void GenSpr0A_GenerateBubbles(void);
void GenSpr0B_GenerateBullet(void);
void GenSpr0C_GenerateSurroundingBullets(void);
void GenSpr0C_GenerateSurroundingBullets(uint8 r13);
void GenSpr0D_GenerateDiagnalBullets(void);
void GenSpr0E_GenerateFire(void);
void GenSpr0F_TurnOffGenerator(void);
void GenSprXX_GenerateDolphins(void);
void GenericExtendedSpriteGFXRt_FireballEntry(uint8 k, uint8 j);
void GenericExtendedSpriteDraw(uint8 k);
uint8 GenericExtendedSpriteGFXRt_FireballEntry(uint8 k, uint8 j);
uint8 GenericExtendedSpriteDraw(uint8 k);
void GetBounceSpriteLevelCollisionMap16ID_029356(uint8 k);
void GetBounceSpriteLevelCollisionMap16ID(uint8 k);
void GetExtendedSpriteClipping(uint8 k);
void GetExtendedSpriteClipping(uint8 k, CollInfo *ci);
void GivePoints_02ACEF(uint8 k, uint8 a);
void GivePoints_Entry2(uint8 j, uint8 a);
void GivePoints(uint8 k, uint8 a);
void HandleCapeInteraction(void);
void HandleCapeLevelColl_029540(void);
void HandleCapeLevelColl_029540(uint8 r15);
void HandleCapeLevelCollision(void);
void HandleCapeToExtendedSpriteCollision(void);
void HandleHeldPBalloonAndInLakituCloudMovement(uint8 k);
@ -948,7 +977,7 @@ void MExtSpr0A_BooStream(uint8 k);
void MExtSpr0B_UnusedYoshiSmoke(uint8 k);
void MExtSpr_Delete(uint8 k);
void ParseLevelSpriteList_Entry2(void);
void ParseLevelSpriteList_LoadSpriteLoopStrt(uint8 k, uint8 j);
void ParseLevelSpriteList_LoadSpriteLoopStrt(uint8 k, uint8 j, uint16 r0w);
void ParseLevelSpriteList(void);
void ProcessBounceAndSmokeSprites_BounceSprites(uint8 k);
void ProcessBounceAndSmokeSprites(void);
@ -987,8 +1016,8 @@ void EraseSmokeSprite(uint8 k);
void SmokeSpr02_ContactEffect(uint8 k);
void SmokeSpr03_TurnAroundSmoke(uint8 k);
void SmokeSpr05_Glitter(uint8 k);
void SpawnBounceSprite_02887D(void);
void SpawnBounceSprite(void);
void SpawnBounceSprite_02887D(uint8 r5);
void SpawnBounceSprite(uint8 r4, uint8 r5, uint8 r6, uint8 r7);
void SpawnBounceSprite_SpawnSpinningCoins(void);
void SpawnBrickPieces(uint8 a);
void SpawnLavaSplash(uint8 k);
@ -999,20 +1028,20 @@ void SpawnMusicNoteOrZ_02C0DB(uint8 k, uint8 a);
void SpawnMusicNoteOrZ_MusicNote(uint8 k);
void SpawnMusicNoteOrZ_Z(uint8 k);
void SpawnSmokePuff(void);
void SpawnSparkles(void);
void SpawnSparkles(uint8 r0, uint8 r2);
void SpawnSparkles_PlayerEntry(void);
void SpawnWaterSplash_0284C2(uint8 k, uint8 a);
void SpawnWaterSplash_0284D8(uint8 k);
void SpawnWaterSplash_0284D8(uint8 k, uint8 r0, uint8 r2);
void SpawnWaterSplash(uint8 k);
void SpawnWaterSplash_VerticalCheepCheepEntry(uint8 k);
void SpawnYoshiStompSmoke(void);
void SpawnYoshiStompSmoke_SpawnFirstSmoke(void);
void SpawnYoshiStompSmoke_SpawnFirstSmoke(uint8 r0);
void Spr01E_Lakitu(uint8 k);
void Spr01E_Lakitu_LakituFishingLineDraw(uint8 k);
void Spr02B_SumoLightning(uint8 k);
void Spr02B_SumoLightning_02DF2C(uint8 k);
void Spr033_Podoboo_SpawnPodobooFire(uint8 k);
void Spr035_Yoshi_028BC0(uint8 k);
void Spr035_Yoshi_028BC0(uint8 k, uint8 r0);
void Spr035_Yoshi_02D0E6(uint8 k);
void Spr035_Yoshi_ChangeBerryIntoBushTile(void);
void Spr035_Yoshi_CheckBerryTileCollisionWithAdultYoshiMouth(uint8 k);
@ -1051,9 +1080,8 @@ void Spr06A_CoinGameCloud(uint8 k);
void Spr070_Pokey(uint8 k);
void Spr070_Pokey_Bank02SpriteEntry(uint8 k, uint8 j, uint8 a);
void Spr070_Pokey_02B7AC(uint8 k);
void Spr070_Pokey_02B82E(uint8 k);
void Spr070_Pokey_RemovePokeySegment(uint8 k, uint8 a);
void Spr070_Pokey_RemovePokeySgmntRt(uint8 k, uint8 a);
void Spr070_Pokey_02B82E(uint8 k, uint8 r13);
uint8 Spr070_Pokey_RemovePokeySegment(uint8 k, uint8 a);
void Spr070_Pokey_Sub(uint8 k);
void Spr086_Wiggler_Init(uint8 k);
void Spr086_Wiggler_Init_GetWigglerSegmentPosIndex(uint8 k);
@ -1091,10 +1119,10 @@ void Spr091_CharginChuck_02C579(uint8 k);
void Spr091_CharginChuck_02C5BC(uint8 k);
void Spr091_CharginChuck_02C602(uint8 k);
void Spr091_CharginChuck_02C628(uint8 k);
void Spr091_CharginChuck_DrawBody(void);
void Spr091_CharginChuck_DrawDigginChuckExtraTiles(uint8 k);
void Spr091_CharginChuck_DrawExtraTiles(uint8 k);
void Spr091_CharginChuck_DrawHead(uint8 k);
void Spr091_CharginChuck_DrawBody(uint8 k, PointU8 pt);
void Spr091_CharginChuck_DrawDigginChuckExtraTiles(uint8 k, PointU8 pt);
void Spr091_CharginChuck_DrawExtraTiles(uint8 k, PointU8 pt);
PointU8 Spr091_CharginChuck_DrawHead(uint8 k, PointU8 pt);
void Spr091_CharginChuck_Draw(uint8 k);
void Spr091_CharginChuck_ProcessPlayerInteraction(uint8 k);
void Spr091_CharginChuck_Return02CBFC(void);
@ -1130,19 +1158,19 @@ void Spr09E_BallNChain_Sub(uint8 k);
void Spr09E_BallNChain(uint8 k);
void Spr09F_BanzaiBill_Draw(uint8 k);
void Spr09F_BanzaiBill_Sub(uint8 k);
void Spr0A3_GreyChainedPlatform_02D813(uint8 k);
void Spr0A3_GreyChainedPlatform_02D848(uint8 k);
void Spr0DE_Load5Eeries(uint8 k);
void Spr0E0_Load3Platforms(void);
void Spr0E1_LoadBooCeiling(uint8 k, uint8 a);
PointU8 Spr0A3_GreyChainedPlatform_02D813(uint8 k);
PointU8 Spr0A3_GreyChainedPlatform_02D848(uint8 k);
void Spr0DE_Load5Eeries(uint8 k, uint16 r0w, uint8 r2, uint8 r3);
void Spr0E0_Load3Platforms(uint16 r0w, uint8 r2, uint8 r3);
void Spr0E1_LoadBooCeiling(uint8 k, uint8 a, uint16 r0w, uint8 r2, uint8 r3);
void SprXXX_Dolphins(uint8 k);
void SprXXX_Dolphins_Draw(uint8 k);
void SprXXX_JumpingPiranhaPlant_02E17F(uint8 k);
void SprXXX_JumpingPiranhaPlant_02E1C0(uint8 k, uint8 a);
void Spr04F_JumpingPiranhaPlant(uint8 k);
void SprXXX_LoadShooter(uint8 k, uint8 j, uint8 a);
void SprXXX_LoadShooter(uint8 k, uint8 j, uint8 a, uint16 r0w);
void SprXXX_SuperKoopas_02EB3D(uint8 k, uint8 j);
void SprXXX_SuperKoopas_02EBB5(uint8 k);
void SprXXX_SuperKoopas_02EBB5(uint8 k, uint8 r0);
void SprXXX_SuperKoopas_02EBCA(uint8 k);
void SprXXX_SuperKoopas_02EBF8(uint8 k);
void SprXXX_SuperKoopas_Draw(uint8 k);
@ -1154,12 +1182,12 @@ void Spr0A5_Sparky(uint8 k);
void SprXXX_WallFollowers_SparkyDraw(uint8 k);
void SprXXX_WallFollowers_UrchinDraw(uint8 k);
void SprXXX_WallSpringboard_Draw(uint8 k);
void SprXXX_WallSpringboard_HandlePlayerCollision(uint8 k, uint8 j);
void SprXXX_WallSpringboard_HandlePlayerCollision(uint8 k, uint8 j, uint8 r2);
void SprXXX_WallSpringboard_Return02CDFE(uint8 k);
void SprXXX_WallSpringboard_State01_PlayerIsOnTop(uint8 k);
void SprXXX_WallSpringboard_State02_Rebound(uint8 k);
void SprXXX_WallSpringboard(uint8 k);
void SubOffscreen_Bank02_02D027(uint8 k);
void SubOffscreen_Bank02_02D027(uint8 k, uint8 r3);
void SubOffscreen_Bank02_Entry1(uint8 k);
void SubOffscreen_Bank02_Entry2(uint8 k);
void SubOffscreen_Bank02_Entry3(uint8 k);
@ -1175,27 +1203,27 @@ void UpdateExtendedSpritePosition_Y(uint8 k);
void UpdateMinorExtendedSpritePosition_X(uint8 k);
void UpdateMinorExtendedSpritePosition_Y(uint8 k);
void YoshiStompRoutine(void);
void sub_284A6(uint8 k, uint8 a);
void sub_284A6(uint8 k, uint8 a, uint8 r0, uint8 r2);
void sub_2D091(uint8 k);
void sub_2DFD0(uint8 k, uint8 a);
void sub_2E980(uint8 k, uint8 a);
// Bank 3
uint8 InitializeMode7TilemapsAndPalettes_03DE39(uint8 k, uint8 j);
uint8 InitializeMode7TilemapsAndPalettes_03DE3C(uint8 k, uint8 j);
uint8 InitializeMode7TilemapsAndPalettes_03DE39(uint8 k, uint8 j, const uint8 *p0);
uint8 InitializeMode7TilemapsAndPalettes_03DE3C(uint8 k, uint8 j, const uint8 *p0);
uint8 Spr07C_PrincessPeach_03ADCC(uint8 k);
uint8 Spr0A0_ActivateBowserBattle_ReturnsTwice_03A5AD(uint8 k);
uint8 Spr0A0_ActivateBowserBattle_ReturnsTwice_03A661(uint8 k);
uint8 StandardSpriteToSpriteCollisionChecks_CheckContact(void);
uint8 StandardSpriteToSpriteCollisionChecks_CheckContact(CollInfo *ci);
void DespawnNonBossSprites(void);
void FadingBooPaletteAnimation(void);
void GameMode12_PrepareLevel_03D991(void);
void GameMode12_PrepareLevel_03D991(const uint8 *p5, uint16 r0w);
void GameMode12_PrepareLevel_UploadTiltingPlatformTilemap(void);
void GameMode14_InLevel_03C0C6(void);
void GameMode14_InLevel_03C11E(void);
void HandleNormalSpriteLevelColl_03C1CA(uint8 k);
void InitializeMode7TilemapsAndPalettes_BufferReznorWallTilemap(void);
void InitializeMode7TilemapsAndPalettes_BufferTilemap(void);
const uint8 *InitializeMode7TilemapsAndPalettes_BufferTilemap(uint16 **dstp, const uint8 *p0);
void InitializeMode7TilemapsAndPalettes(uint8 k);
void NormalSpriteBooDraw(uint8 k);
void SpawnFootball(uint8 k);
@ -1220,7 +1248,7 @@ void Spr030_ThrowingDryBones_SpawnDryBonesBone(uint8 k);
void Spr051_Ninji(uint8 k);
void Spr054_ClimbingNetDoor_UpdateClimbingNetDoorTiles(uint8 k, uint8 a);
void Spr06F_DinoTorch(uint8 k);
void Spr06F_DinoTorch_DinoFlameClipping(uint8 k);
void Spr06F_DinoTorch_DinoFlameClipping(uint8 k, CollInfo *ci);
void Spr06F_DinoTorch_DinoSetGfxFrame(uint8 k);
void Spr06F_DinoTorch_Draw(uint8 k);
void Spr06F_DinoTorch_Return039F37(void);
@ -1240,8 +1268,8 @@ void Spr07C_PrincessPeach_DisplayPeachRescueMessage(void);
void Spr07C_PrincessPeach_FadeText(uint8 k);
void Spr07C_PrincessPeach_Fireworks(uint8 k);
void Spr07C_PrincessPeach_FloatingDown(uint8 k);
void Spr07C_PrincessPeach_GFXRt_DrawHELP(uint8 k, uint8 j);
void Spr07C_PrincessPeach_GFXRt_DrawPeach(uint8 k, uint8 j);
void Spr07C_PrincessPeach_GFXRt_DrawHELP(uint8 k, uint8 j, uint8 r2, uint8 r3);
void Spr07C_PrincessPeach_GFXRt_DrawPeach(uint8 k, uint8 j, PointU8 pt, uint8 r3);
void Spr07C_PrincessPeach_KissBro(uint8 k);
void Spr07C_PrincessPeach_StandByBro(uint8 k);
void Spr07C_PrincessPeach_WaitAfterFall(uint8 k);
@ -1257,7 +1285,7 @@ void Spr0A0_ActivateBowserBattle_03A8D6(uint8 k);
void Spr0A0_ActivateBowserBattle_03AC63(uint8 k);
void Spr0A0_ActivateBowserBattle_03AF59(uint8 k);
void Spr0A0_ActivateBowserBattle_03B019(uint8 k);
void Spr0A0_ActivateBowserBattle_03B020(uint8 k);
void Spr0A0_ActivateBowserBattle_03B020(uint8 k, uint8 r2);
void Spr0A0_ActivateBowserBattle_03B078(uint8 k);
void Spr0A0_ActivateBowserBattle_03B0D2(uint8 k);
void Spr0A0_ActivateBowserBattle_03B0D6(uint8 k);
@ -1317,7 +1345,7 @@ void Spr0B1_CreateEatBlock_GenTileFromSpr1(uint8 k, uint8 a);
void Spr0B2_FallingSpike(uint8 k);
void Spr0B3_BowserStatueFire(uint8 k);
void Spr0B3_BowserStatueFire_Draw(uint8 k);
void Spr0B7_CarrotTopLiftUpperRight_038CE4(uint8 k);
void Spr0B7_CarrotTopLiftUpperRight_038CE4(uint8 k, CollInfo *ci);
void Spr0B7_CarrotTopLiftUpperRight_Draw(uint8 k);
void Spr0B8_CarrotTopLiftUpperLeft(uint8 k);
void Spr0B9_MessageBox(uint8 k);
@ -1368,10 +1396,10 @@ void SprXXX_ReflectingEnemy_ReflectingBooBuddiesEntry(uint8 k);
void SprXXX_ReflectingEnemy_ReflectingPodobooEntry(uint8 k);
void SprXXX_ReflectingEnemy_ReflectingPodobooDraw(uint8 k);
void SprXXX_ReflectingEnemy_SpawnTrailingBoo(uint8 k);
void StandardSpriteToSpriteCollisionChecks_GetMarioClipping(void);
void StandardSpriteToSpriteCollisionChecks_GetSpriteClippingA(uint8 k);
void StandardSpriteToSpriteCollisionChecks_GetSpriteClippingB(uint8 k);
void SubOffscreen_Bank03_03B85F(uint8 k);
void StandardSpriteToSpriteCollisionChecks_GetMarioClipping(CollInfo *ci);
void StandardSpriteToSpriteCollisionChecks_GetSpriteClippingA(uint8 k, CollInfo *ci);
void StandardSpriteToSpriteCollisionChecks_GetSpriteClippingB(uint8 k, CollInfo *ci);
void SubOffscreen_Bank03_03B85F(uint8 k, uint8 r3);
void SubOffscreen_Bank03_Entry1(uint8 k);
void SubOffscreen_Bank03_Entry4(uint8 k);
void TriggerHidden1up(void);
@ -1380,51 +1408,56 @@ void UpdateMode7SpriteAnimations(uint8 k);
void sub_3CDDA(uint8 k, uint8 a);
// Bank 4
uint16 CalculateOverworldPlayerPosition(uint8 k);
uint16 CalculateOverworldPlayerPosition(uint8 k, uint16 r0w, uint16 r2w);
uint16 LoadOverworldLayer1AndEvents_InitializedOverworldLayer1Tilemap(uint16 k, uint8 a);
void AddZPositionToTempYPos(uint8 k);
uint8 CheckPlayerToOverworldSpriteCollision(uint8 k);
uint8 CheckIfXIsAllowedOnYSubmap_Lightning(uint8 a);
uint8 CheckIfXIsAllowedOnYSubmap_Sprites(uint8 k);
uint8 DrawFlyingSwitchBlocks_04F39C(uint8 k, uint8 j);
uint8 DrawOverworldPlayer_DrawCurrentPlayer(uint8 k, uint8 j);
uint8 DrawOverworldSpriteShadow_04FE45(uint8 j, uint8 a);
uint16 DrawFlyingSwitchBlocks_04F39C(uint8 k, uint8 j);
uint8 DrawOverworldPlayer_DrawCurrentPlayer(uint8 k, uint8 j, PointU8 pt, uint8 tmp8c, uint16 r4w, uint8 r6);
uint8 DrawOverworldSpriteShadow_04FE45(uint8 j, uint8 a, PointU16 pt, uint8 r4, uint8 r5);
bool HandleOverworldStarPipeWarp_GetIndex(void);
uint8 OWSpr03_CheepCheep_GenericOverworldSpriteGFXRt_Draw8x8(uint8 j, uint16 a);
uint8 OWSpr04_PiranhaPlant_GenericOverworldSpriteGFXRt_Entry2(uint8 j, uint16 a, uint8 cr);
uint8 OWSpr03_CheepCheep_GenericOverworldSpriteGFXRt_Draw8x8(uint8 j, uint16 a, PointU16 pt);
uint8 OWSpr04_PiranhaPlant_GenericOverworldSpriteGFXRt_Entry2(uint8 j, uint16 a, uint8 cr, PointU16 pt);
uint8 SetOverworldSpriteFrameIndex(uint8 k);
void BufferEventTileToLayer2Tilemap_Buffer2x2Tile(uint16 k, uint16 j);
void BufferEventTileToLayer2Tilemap_Buffer6x6Tile(uint16 k, uint16 j);
void BufferEventTileToLayer2Tilemap_Entry2(uint16 k, uint16 j);
void BufferEventTileToLayer2Tilemap_Buffer2x2Tile(uint16 k, uint16 j, uint16 r4, const uint8 *r6, const uint8 *r9);
void BufferEventTileToLayer2Tilemap_Buffer6x6Tile(uint16 k, uint16 j, uint16 r4, const uint8 *r6, const uint8 *r9);
void BufferEventTileToLayer2Tilemap_Entry2(uint16 k, uint16 j, uint16 r4);
void BufferEventTileToLayer2Tilemap(void);
uint16 BufferEventTileToStripeImageTable_Buffer2x2Tile(void);
uint16 BufferEventTileToStripeImageTable_Buffer6x6Tile(void);
void BufferOverworldLayer2Tilemap(uint16 k, uint16 j);
void CheckPlayerToOverworldSpriteColl_SubOverworldHorizAndVertPos(uint8 k);
uint16 BufferEventTileToStripeImageTable_Buffer2x2Tile(uint16 r0w, uint16 r2w, uint16 r10, const uint8 *r12);
uint16 BufferEventTileToStripeImageTable_Buffer6x6Tile(uint16 r0w, uint16 r2w, uint16 r10, const uint8 *r12);
void BufferOverworldLayer2Tilemap(uint16 k, uint16 j, uint16 r14w, const uint8 *p0);
typedef struct OwHvPos {
uint16 r0;
uint16 r2;
uint16 r6;
uint16 r8;
} OwHvPos;
OwHvPos CheckPlayerToOverworldSpriteColl_SubOverworldHorizAndVertPos(uint8 k);
uint16 CheckIfDestroyTileEventIsActive(uint8 a);
void DisplayOwPrompt(uint8 a);
void DrawFlyingSwitchBlocks(void);
void DrawOverworldPlayer_DrawHalo(uint16 k);
void DrawOverworldPlayer_DrawHalo(uint16 k, uint16 r4, PointU8 pt);
void DrawOverworldPlayer(void);
void DrawOverworldSpriteShadow(uint8 k, uint8 cr);
void GameMode0C_LoadOverworld_048D91(void);
void GameMode0C_LoadOverworld_048E55(void);
void GameMode0E_ShowOverworld_Bank04(void);
void GameMode0E_ShowOverworld_UpdateMainMapFreeScrollingPosition(uint8 k, uint8 a);
void GetOverworldSpriteOnScreenPosition(uint8 k);
void GetOverworldSpriteOnScreenPosition_Y(uint8 k, uint8 j);
void GetXAndYDispOfCurrentEventTileSprite(void);
PointU16 GetOverworldSpriteOnScreenPosition(uint8 k);
uint16 GetOverworldSpriteOnScreenPosition_Y(uint8 k, uint8 j);
PointU8 GetXAndYDispOfCurrentEventTileSprite(void);
void HandleCurrentOverworldProcess(void);
void HandleOverworldPathExits(void);
void HandleOverworldPathExits_SetLayerPositions(void);
void HandleOverworldStarPipeWarp_SetPlayerDestination(void);
void InitializeOverworldTilemaps(void);
void LoadOverworldLayer1AndEvents_04D7F2(void);
void LoadOverworldLayer1AndEvents_04DA49(void);
void LoadOverworldLayer1AndEvents_04DA49(uint8 r15);
void LoadOverworldLayer1AndEvents(void);
void LoadOverworldLayer2AndEventsTilemaps_04DD40(void);
void LoadOverworldLayer2AndEventsTilemaps_04DD57(uint16 k, uint16 j);
void LoadOverworldLayer2AndEventsTilemaps_04E453(void);
void LoadOverworldLayer2AndEventsTilemaps_04DD57(uint16 k, uint16 j, const uint8 *p2);
void LoadOverworldLayer2AndEventsTilemaps_04E453(uint8 r15);
void LoadOverworldLayer2AndEventsTilemaps(void);
void LoadOverworldLayer2AndEventsTilemaps_Sub(void);
void LoadOverworldSprites(void);
@ -1435,22 +1468,22 @@ void OWSpr02_BlueBird(uint8 k);
void OWSpr03_CheepCheep_04FA7D(uint8 k);
void OWSpr03_CheepCheep_04FA83(uint8 k);
void OWSpr03_CheepCheep(uint8 k);
uint8 OWSpr04_PiranhaPlant_GenericOverworldSpriteDraw(uint8 k, uint16 a);
uint8 OWSpr04_PiranhaPlant_GenericOverworldSpriteDraw(uint8 k, uint16 a, PointU16 pt);
void OWSpr04_PiranhaPlant(uint8 k);
void OWSpr05_Cloud_04FB77(uint8 a);
void OWSpr05_Cloud_04FB7A(uint16 a);
void OWSpr05_Cloud_04FB7B(uint16 a, uint8 cr);
void OWSpr05_Cloud_04FB77(uint8 a, PointU16 pt);
void OWSpr05_Cloud_04FB7A(uint16 a, PointU16 pt);
void OWSpr05_Cloud_04FB7B(uint16 a, uint8 cr, PointU16 pt);
void OWSpr05_Cloud(uint8 k);
void OWSpr06_KoopaKid(uint8 k);
void OWSpr07_Smoke(uint8 k);
void OWSpr08_BowserSign(uint8 k);
void OWSpr09_Bowser_04FD55(uint8 k, uint8 j);
void OWSpr09_Bowser(uint8 k);
void OWSpr0A_Boo_04FDD2(uint8 k, uint8 a);
void OWSpr0A_Boo_04FDD2(uint8 k, uint8 a, uint8 r0);
void OWSpr0A_Boo(uint8 k);
void OwEventProcess00_CheckIfEventShouldRun(void);
void OwEventProcess01_DestroyTileAnimation_04ED83(void);
void OwEventProcess01_DestroyTileAnimation_04EDE6(uint16 k, uint16 j);
void OwEventProcess01_DestroyTileAnimation_04EDE6(uint16 k, uint16 j, uint16 r0w, const uint8 *p);
void OwEventProcess01_DestroyTileAnimation_04EEAA(void);
void OwEventProcess02_SetEventTileIndexes(void);
void OwEventProcess03_GetLayer2Tile_04EA62(void);
@ -1484,7 +1517,7 @@ void OwPrompt02_ExpandPromptWindow(void);
void OwPrompt03_OverworldLifeExchanger_04F60E(uint8 k, uint8 j, uint8 a);
void OwPrompt03_OverworldLifeExchanger(void);
void OwPrompt07_DisplayingSavePrompt(void);
void OwTileAnimations_0480B9(uint16 k);
void OwTileAnimations_0480B9(uint16 k, const uint8 *p0);
void OwTileAnimations_048172(uint8 k);
void OwTileAnimations(void);
void OwTileAnimations_ShiftWaterTiles(void);
@ -1494,8 +1527,8 @@ void SubmapSwitchProcess05_UpdatePalette(void);
void SubmapSwitchProcess06_EndWindowHDMA(void);
void SubmapSwitchProcess07_EndSubmapSwitch(void);
void UnlockOverworldPathBasedOnExit(void);
uint16 UpdateLevelName_049D7F(uint16 j, uint16 k);
void UpdateLevelName(void);
uint16 UpdateLevelName_049D7F(uint16 j, uint16 k, uint16 r2w);
void UpdateLevelName(uint16 r0w);
void UpdateOverworldSpritePosition(uint8 k);
void UpdateOverworldSpritePosition_X(uint8 k);
void UpdateSaveBuffer(void);
@ -1506,9 +1539,9 @@ void sub_485A7(void);
uint16 InitializeLevelData_Hi(uint16 k, uint8 a);
uint16 InitializeLevelData_Lo(uint16 k, uint8 a);
uint8 UnusedOverworldEventPassedCheck(uint8 j);
void AdjustTimeBonusDisplay(uint8 k, uint8 j);
void AdjustTimeBonusDisplay(uint8 k, uint8 j, uint16 R0_W_, uint16 r2w);
void BeginLoadingLevelData(void);
void BufferBGTilemap(void);
void BufferBGTilemap(uint8 *r13);
void BufferScrollingTiles_Layer1_Main(void);
void BufferScrollingTiles_Layer1_Init(void);
void BufferScrollingTiles_Layer1(void);
@ -1521,7 +1554,7 @@ void BufferScrollingTiles_Layer2(void);
void BufferScrollingTiles_Layer2_NoScroll(void);
void BufferScrollingTiles_Layer2_VerticalLevel(void);
void CalculateRowOrColumnOfTilemapToUpdate(void);
void CalculateTimeBonusDigits(void);
uint16 CalculateTimeBonusDigits(void);
void CheckIfLevelTilemapsNeedScrollUpdate(void);
void DisplayCourseClearTextBonusStars(void);
void DisplayMessage_DrawSwitchBlocks(uint8 k);
@ -1606,7 +1639,7 @@ void UpdateLayerPositionWithScrollSprite(uint8 k);
void sub_5B165(uint8 a);
// Bank 7
uint8 Spr07B_GoalTape_07F200(uint8 k, uint8 j);
uint8 Spr07B_GoalTape_07F200(uint8 k, uint8 j, uint16 R2, uint16 r4);
void InitializeNormalSpriteRAMTables_ClearTables(uint8 k);
void InitializeNormalSpriteRAMTables(uint8 k);
void InitializeNormalSpriteRAMTables_PropertyTables(uint8 k);
@ -1617,8 +1650,8 @@ void Spr07B_GoalTape_BonusStarNumbersDraw(uint8 k);
void Spr07B_GoalTape_GiveBonusStars(uint8 k);
// Bank C
void BufferCreditsBackgrounds_0C944C(void);
void BufferCreditsBackgrounds_0C94C0(void);
void BufferCreditsBackgrounds_0C944C(uint16 r13w, const uint8 *src);
void BufferCreditsBackgrounds_0C94C0(uint16 mask);
void BufferCreditsBackgrounds(void);
void CarryEggAwayFromCastle(void);
void CheckIfPlayerCanEndCastleDestructionCutscene(void);
@ -1630,22 +1663,22 @@ void CreditsFadeOut(void);
void CreditsFadeOut(void);
void DelayTNTExplosionUntilPlayerComesBy(void);
void DisplayCastleDestructionText(void);
void DrawCameraFacingEndingYoshis_BlueYoshi(uint8 k, uint8 j);
void DrawCastleDestructionCastleDoor_Entry3(uint8 k);
void DrawCameraFacingEndingYoshis_BlueYoshi(uint8 k, uint8 j, uint8 r14, uint8 r0, uint8 r2);
void DrawCastleDestructionCastleDoor_Entry3(uint8, uint8 r0, uint8 r1, uint8 r2);
void DrawCastleDestructionCastleDoor(void);
void DrawCreditsPeachRedAndYellowYoshi_Peach(uint8 k, uint8 j);
void DrawCreditsPeachRedAndYellowYoshi_Peach(uint8 k, uint8 j, uint16 r0w, uint8 r2);
void DrawCutsceneContactEffect(void);
void DrawEndingBabyYoshis(void);
void DrawEndingThankYou_0CA183(uint8 k, uint8 j);
void DrawEndingThankYou_Entry2(uint8 k, uint8 j);
void DrawEndingBabyYoshis(uint8 r2);
uint8 DrawEndingThankYou_0CA183(uint8 k, uint8 j, uint16 r8, uint16 r0w, uint16 r2);
void DrawEndingThankYou_Entry2(uint8 k, uint8 j, uint16 r0w, uint16 r4, uint16 r8);
void DrawEndingThankYou(void);
void DrawLeaningEndingYoshis(uint8 k, uint8 j);
void DrawLeaningEndingYoshis(uint8 k, uint8 j, uint8 r0, uint8 r2);
void DrawPlayerCough_MortonCutscene(void);
void DrawPlayerCough_RoyCutscene(void);
void DrawQuestionMark(void);
void DrawTNTFuseBox(void);
void DrawThankYouSpeechBubble(void);
void DrawWhiteFlag(uint8 k);
void DrawWhiteFlag(uint8 k, uint8 r0);
void DrawWoodHammer(void);
void DrawingTheEndMarioLuigiAndPeach(void);
void EveryoneCheeringDuringEnding(void);
@ -1660,7 +1693,7 @@ void GameMode19_Cutscene_RoyCutscene(void);
void GameMode19_Cutscene_WendyCutscene(void);
void GameMode1B_EndingCinema_Bank0C(void);
void GameMode1B_EndingCinema_BufferNextRowOfCredits(void);
void GameMode1B_EndingCinema_0C9FCB(uint8 k);
uint16 GameMode1B_EndingCinema_0C9FCB(uint8 k);
void GameMode1B_EndingCinema_Sub(void);
void GameMode1D_LoadYoshisHouse_Bank0C(void);
void GameMode1D_LoadYoshisHouse_0CA1D4(void);
@ -1701,7 +1734,7 @@ void InitializeFarawayCastleRocket(void);
void InitializeTNTExplosion(void);
void KickCastleAway(void);
void KickedCastleCreatesQuake(void);
void MakeCreditsEggsBounce(void);
void MakeCreditsEggsBounce(uint8 r14);
void PlayerDropkicksAndStompsCastle(void);
void ProcessCheeringYoshis(void);
void ProcessHammerDebris(void);
@ -1872,6 +1905,7 @@ void RopeObj3E_HorizontalLog(uint8 k);
void RopeObj3F_VerticalLog(uint8 k);
void SetMap16HighByteForCurrentObject_Page00(uint8 j);
void SetMap16HighByteForCurrentObject_Page01(uint8 j);
void SetMap16LowByte(uint16 j, uint8 a);
void StdObj05_Coins(uint8 k);
void StdObj0F_VerticalPipes(uint8 k);
void StdObj10_HorizontalPipes(uint8 k);
@ -1899,15 +1933,15 @@ void StdObj1E_ClimbingNetWithSideEdge_0DB4FE(uint8 k, uint8 j, uint8 a);
void StdObj1E_ClimbingNetWithSideEdge(uint8 k);
void StdObj1F_SkinnyVerticalPipeBoneLog(uint8 k);
void StdObj20_SkinnyHorizontalPipeBoneLog(uint8 k);
void StdObj21_WideScaleGroundLedge_0DB1E3(uint8 k);
void StdObj21_WideScaleGroundLedge_0DB1E3(uint8 k, uint8 r0, uint8 r2);
void StdObj21_WideScaleGroundLedge(uint8 k);
void StdObj21_WideScaleGroundLedge_StandardLedgeEntry(uint8 k);
void StdObjXX_Generic1RepeatedTileObject_IcyTurnBlockEntry(uint8 k);
void UndergroundObj36_4SidedGround(uint8 k);
void UndergroundObj37_LargeCanvas(uint8 k);
void UndergroundObj38_RightLavaEdge_0DDAE8(uint8 k, uint8 j, uint8 a);
void UndergroundObj38_RightLavaEdge_0DDAE8(uint8 k, uint8 j, uint8 a, uint8 r0);
void UndergroundObj38_RightLavaEdge(uint8 k);
void UndergroundObj39_SlopedCaveLava_0DDBA4(uint8 j);
void UndergroundObj39_SlopedCaveLava_0DDBA4(uint8 j, uint8 r0, uint8 r2);
void UndergroundObj39_SlopedCaveLava(uint8 k);
void UndergroundObj39_SlopedCaveLavaLeftSlope(void);
void UndergroundObj39_SlopedCaveLavaRightSlope(void);

View File

@ -41,7 +41,7 @@ void OpenGLRenderer_Create(struct RendererFuncs *funcs);
bool g_debug_flag;
bool g_want_dump_memmap_flags;
bool g_new_ppu = true;
bool g_other_image;
bool g_other_image = false;
struct SpcPlayer *g_spc_player;
static uint32_t button_state;
@ -157,6 +157,8 @@ static SDL_HitTestResult HitTestCallback(SDL_Window *win, const SDL_Point *pt, v
}
void RtlDrawPpuFrame(uint8 *pixel_buffer, size_t pitch, uint32 render_flags) {
g_rtl_game_info->draw_ppu_frame();
uint8 *ppu_pixels = g_other_image ? g_my_pixels : g_pixels;
for (size_t y = 0, y_end = g_snes_height; y < y_end; y++)
memcpy((uint8 *)pixel_buffer + y * pitch, ppu_pixels + y * 256 * 4, 256 * 4);

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
@ -38,7 +38,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
@ -131,6 +131,7 @@
</ClCompile>
<Link>
<AdditionalDependencies>$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>DebugFastLink</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2,6 +2,16 @@
#include "funcs.h"
#include "smw_rtl.h"
#include "variables.h"
static const uint8 kInitializeNormalSpriteRAMTables_Sprite1656Vals[201] = { 0x70, 0x70, 0x70, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0, 0x10, 0x10, 0x10, 0x14, 0x0, 0x0, 0x0, 0x0, 0x10, 0x10, 0x11, 0x81, 0x10, 0x10, 0x80, 0x11, 0x11, 0x82, 0x0, 0x13, 0x13, 0x13, 0x13, 0x1, 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, 0x7, 0x7, 0x7, 0x0, 0x0, 0x30, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x10, 0x10, 0x8c, 0x8c, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0xb, 0xb, 0xb, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x19, 0x30, 0xa, 0x10, 0x10, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x10, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, };
static const uint8 kInitializeNormalSpriteRAMTables_Sprite1662Vals[201] = { 0x0, 0x0, 0x0, 0x0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x0, 0xa, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x80, 0x80, 0x81, 0x1, 0x80, 0x80, 0x0, 0x81, 0x81, 0x0, 0x0, 0x81, 0x81, 0x81, 0x81, 0x6, 0x0, 0x7, 0x6, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x0, 0x37, 0x0, 0x0, 0x9, 0x1, 0x0, 0x0, 0x0, 0xe, 0xe, 0xe, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf, 0x10, 0x14, 0x0, 0xd, 0x80, 0x0, 0x1d, 0x0, 0x80, 0x80, 0x80, 0x80, 0x0, 0x0, 0x80, 0x2, 0xc, 0x3, 0x5, 0x4, 0x5, 0x4, 0x0, 0x0, 0x4, 0x5, 0x4, 0x5, 0x0, 0x1d, 0xc, 0x4, 0x4, 0x12, 0x20, 0x21, 0x2c, 0x34, 0x4, 0x4, 0x4, 0x4, 0xc, 0x16, 0x0, 0x17, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x35, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0xc, 0xc, 0x0, 0x0, 0x3a, 0x8, 0x8, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x8, 0x38, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0x0, 0xd, 0x80, 0x1d, 0x0, 0x0, 0xb6, 0x24, 0x23, 0x3b, 0x1f, 0x22, 0x0, 0x27, 0x0, 0x0, 0x28, 0x0, 0x2a, 0x2b, 0x2b, 0x0, 0x0, 0x0, 0xc, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x2e, 0x2e, 0xc, 0x1d, 0x2f, 0xc, 0x0, 0x80, 0x30, 0x32, 0x31, 0x0, 0x0, 0x33, 0x7, 0xff, 0x0, 0xc, };
static const uint8 kInitializeNormalSpriteRAMTables_Sprite166EVals[201] = { 0xa, 0x8, 0x6, 0x4, 0xa, 0x8, 0x6, 0x4, 0xa, 0xa, 0x8, 0x8, 0x4, 0x17, 0x32, 0x4, 0x4, 0x1d, 0x3d, 0x9, 0x9, 0x45, 0x45, 0x85, 0x85, 0xb, 0x8, 0x1, 0x12, 0x15, 0x9, 0x4f, 0x1c, 0x24, 0xb, 0x9, 0xb, 0x9, 0x33, 0x33, 0xfd, 0x2b, 0x8, 0x35, 0x3b, 0x3a, 0x19, 0x3a, 0x13, 0x13, 0x13, 0x34, 0x39, 0x2a, 0x15, 0xf3, 0xfd, 0xfd, 0x37, 0x37, 0x37, 0xc7, 0x30, 0x5, 0x15, 0x37, 0x37, 0x37, 0x33, 0x30, 0x8b, 0x85, 0x1d, 0x3b, 0x3b, 0x9, 0x34, 0x1, 0x1, 0x8, 0x8, 0x9, 0x20, 0x30, 0x20, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe1, 0xe1, 0xeb, 0xeb, 0xe3, 0xe3, 0xe3, 0xe1, 0xe1, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xe3, 0xf0, 0xe3, 0xf3, 0x3f, 0x3f, 0xf, 0x35, 0xb, 0x9, 0x7, 0x8, 0xa, 0x20, 0x24, 0xa, 0x3a, 0x3a, 0x20, 0x20, 0x21, 0x28, 0x20, 0x20, 0x0, 0x20, 0x20, 0x20, 0x20, 0xf5, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x3b, 0xf3, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0x9b, 0x93, 0x0, 0x30, 0x31, 0x31, 0x31, 0xfb, 0xfb, 0xbb, 0xe3, 0xf3, 0x35, 0x35, 0x39, 0x35, 0x35, 0x7d, 0x7, 0x37, 0x37, 0x3d, 0x3f, 0x3f, 0x30, 0x31, 0x31, 0x31, 0x4, 0x35, 0x3b, 0x3b, 0x36, 0x7b, 0x3b, 0x33, 0x6, 0xb, 0x11, 0xf5, 0xf5, 0xcb, 0xcd, 0xf3, 0x3f, 0xff, 0x20, 0x38, };
static const uint8 kInitializeNormalSpriteRAMTables_Sprite167AVals[201] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x2, 0x18, 0x0, 0x0, 0x81, 0x0, 0x1, 0x99, 0x99, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x83, 0x0, 0x0, 0x9a, 0x1e, 0x1, 0xbe, 0x81, 0x81, 0x81, 0x2, 0x18, 0x87, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x3e, 0x1, 0x1, 0x82, 0x82, 0x82, 0x1, 0x2, 0x81, 0x0, 0x0, 0xa2, 0x82, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x8, 0x2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0x22, 0x22, 0x22, 0x22, 0xa2, 0xa2, 0xa2, 0xa2, 0xe2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0x82, 0x82, 0xa2, 0xa2, 0x9a, 0x80, 0x82, 0x3e, 0xc2, 0x82, 0x82, 0x82, 0x92, 0x80, 0x82, 0x82, 0x82, 0x2, 0x2, 0x2, 0x2, 0xa2, 0xa2, 0x1, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0x1, 0x1, 0x1, 0xa2, 0x81, 0x0, 0x1, 0x80, 0x0, 0x19, 0xa2, 0x1, 0x1, 0x1, 0x0, 0x0, 0x81, 0x1, 0x81, 0x81, 0x81, 0x0, 0x1, 0x1, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa0, 0x1, 0x1, 0xa1, 0xa2, 0xa2, 0x1, 0x1, 0xa2, 0xa3, 0xff, 0x82, 0xa2, };
static const uint8 kInitializeNormalSpriteRAMTables_Sprite1686Vals[201] = { 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2, 0x42, 0x52, 0x52, 0x52, 0x52, 0x0, 0x9, 0x0, 0x40, 0x0, 0x1, 0x0, 0x0, 0x10, 0x10, 0x90, 0x90, 0x1, 0x10, 0x10, 0x90, 0x0, 0x11, 0x1, 0x1, 0x8, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x19, 0x80, 0x0, 0x39, 0x9, 0x9, 0x10, 0xa, 0x9, 0x9, 0x9, 0x99, 0x18, 0x29, 0x8, 0x19, 0x19, 0x19, 0x11, 0x11, 0x15, 0x10, 0xa, 0x40, 0x40, 0x8d, 0x8d, 0x8d, 0x11, 0x18, 0x11, 0x80, 0x0, 0x29, 0x29, 0x10, 0x10, 0x10, 0x10, 0x0, 0x0, 0x10, 0x29, 0x20, 0x29, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0x29, 0x29, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x29, 0x19, 0x29, 0x29, 0x59, 0x59, 0x18, 0x18, 0x10, 0x10, 0x50, 0x28, 0x28, 0x28, 0x28, 0x8, 0x29, 0x29, 0x39, 0x39, 0x29, 0x28, 0x28, 0x3a, 0x28, 0x29, 0x31, 0x31, 0x29, 0x0, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x11, 0x1, 0x39, 0x10, 0x19, 0x19, 0x19, 0x19, 0x1, 0x29, 0x98, 0x14, 0x14, 0x10, 0x18, 0x18, 0x18, 0x0, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1d, 0x1d, 0x19, 0x19, 0x18, 0x18, 0x19, 0x19, 0x19, 0x1d, 0x19, 0x18, 0x0, 0x10, 0x0, 0x99, 0x99, 0x10, 0x90, 0xa9, 0xb9, 0xff, 0x39, 0x19, };
const uint8 kInitializeNormalSpriteRAMTables_Sprite190FVals[201] = { 0x0, 0x0, 0x0, 0x0, 0xa0, 0xa0, 0xa0, 0xa0, 0xb0, 0xb0, 0xb0, 0xb0, 0xa0, 0x80, 0x44, 0x80, 0x80, 0x80, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, 0x60, 0x20, 0x4, 0x4, 0x20, 0x20, 0x20, 0x20, 0x24, 0x4, 0x0, 0x44, 0x20, 0x4, 0x44, 0xc4, 0x0, 0xc4, 0x24, 0x24, 0x24, 0x4, 0x4, 0x46, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x0, 0xc4, 0x0, 0x0, 0x5, 0x5, 0x5, 0x4, 0x44, 0x48, 0x0, 0x0, 0x40, 0x40, 0x40, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0xc4, 0x64, 0x45, 0x65, 0x45, 0x65, 0x45, 0x45, 0x45, 0x45, 0x65, 0x65, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x5, 0x5, 0x44, 0x44, 0x44, 0x44, 0x46, 0x0, 0x0, 0x0, 0x10, 0x10, 0x10, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0x42, 0x40, 0x40, 0x40, 0xc0, 0x40, 0x40, 0x40, 0x40, 0x0, 0x0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x1, 0x0, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x0, 0x40, 0x40, 0x40, 0x0, 0x4, 0x4, 0x40, 0x40, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x40, 0x40, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x41, 0x41, 0x40, 0x41, 0x40, 0x0, 0x0, 0x0, 0x20, 0x47, 0x45, 0x0, 0x0, 0x41, 0x41, 0xff, 0x40, 0x40, };
static const uint8 kSpawnSpinJumpStars_InitialXSpeed[4] = { 0xe0, 0x20, 0xe0, 0x20, };
static const uint8 kSpawnSpinJumpStars_InitialYSpeed[4] = { 0xf0, 0xf0, 0x10, 0x10, };
void InitializeNormalSpriteRAMTables_ClearTables(uint8 k) { // 07f722
spr_table164a[k] = 0;
spr_table1632[k] = 0;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,6 @@ static const uint32 kPatchedCarrys_SMW[] = {
0x18081,
0x1A2CC,
0x1B066,
0x0fe79,
0x0fe80,
0x0fe88,
@ -28,7 +27,6 @@ static const uint32 kPatchedCarrys_SMW[] = {
0x2B2F6,
0x3AD9B,
0x498A2,
0x2FBF5,
0x2FBF7,
0x2FC11,
@ -46,6 +44,7 @@ static const uint32 kPatchedCarrys_SMW[] = {
0x2C06C,
0x2AD15,
0x02DDA1,
0x0399DB,
0x1BC75,
@ -88,14 +87,14 @@ uint32 PatchBugs_SMW1(void) {
g_cpu->y = 0;
} else if (FixBugHook(0xCC32)) {
// UpdateHDMAWindowBuffer_00CC14 reads bad ptr
if (R6_W == 0) {
if (WORD(g_ram[6]) == 0) {
g_cpu->a = 0;
return 0xCC34;
}
} else if (FixBugHook(0x04FC00)) { // OWSpr06_KoopaKid uninited Y
g_cpu->y = owspr_table0df5[(uint8)g_cpu->x];
} else if (FixBugHook(0x03B830)) { // CheckPlayerPositionRelativeToSprite_Y in bank 3 writes to R15 instead of R14
R14_ = g_cpu->a;
g_ram[0xe] = g_cpu->a;
return 0x3b832;
} else if (FixBugHook(0x2F2FC)) { // Wiggler reads from spr_ylos_lo instead of hi
g_cpu->a = spr_ypos_hi[g_cpu->x & 0xff];
@ -112,10 +111,10 @@ uint32 PatchBugs_SMW1(void) {
if (LOBYTE(g_cpu->a) == 255 || LOBYTE(g_cpu->a) == 0) g_cpu->a = 1;
} else if (FixBugHook(0x4862E)) {
// DrawOverworldPlayer doesn't init
R0_W = 0;
R4_W = 0;
WORD(g_ram[0]) = 0;
WORD(g_ram[4]) = 0;
} else if (FixBugHook(0x3A0A7)) { // Spr0A8_Blargg OOB
R3_ = (spr_table1602[g_cpu->x] != 0) * 5;
g_ram[3] = (spr_table1602[g_cpu->x] != 0) * 5;
} else if (FixBugHook(0x811D)) {
if (g_use_my_apu_code)
return 0x8125;
@ -126,17 +125,45 @@ uint32 PatchBugs_SMW1(void) {
RtlSetUploadingApu(true);
} else if (FixBugHook(0x80FB)) {
RtlSetUploadingApu(false);
} else if (FixBugHook(0xE3FB)) {
g_ram[12] = g_ram[13] = 0; // R13 not initialized
} else if (FixBugHook(0x1FD50)) {
// Spr029_KoopaKid_Status08_IggyLarry_01FD50 may not init its outputs
WORD(g_ram[0x14b8]) = spr_xpos_lo[g_cpu->x];
WORD(g_ram[0x14ba]) = spr_ypos_lo[g_cpu->x];
} else if (FixBugHook(0x1d7f4)) {
WORD(g_ram[8]) = GetSprYPos(g_cpu->x);
WORD(g_ram[10]) = GetSprXPos(g_cpu->x);
} else if (FixBugHook(0x1ec36)) {
g_cpu->a = 1;
} else if (FixBugHook(0x19F1C)) {
if (g_cpu->y >= 84)
g_cpu->y = 0;
} else if (FixBugHook(0x817e)) {
g_cpu->y = g_ram[kSmwRam_APUI02];
return 0x8181;
}
return 0;
}
void SmwCpuInitialize(void) {
*SnesRomPtr(0x843B) = 0x60; // remove WaitForHBlank_Entry2
*SnesRomPtr(0x2DDA2) = 5;
*SnesRomPtr(0xCA5AC) = 7;
}
static void SmwFixSnapshotForCompare(Snapshot *b, Snapshot *a) {
memcpy(&b->ram[0x0], &a->ram[0x0], 16); // temps
memcpy(&b->ram[0x10b], &a->ram[0x10b], 0x100 - 0xb); // stack
memcpy(&b->ram[0x17bb], &a->ram[0x17bb], 1); // unusedram_7e17bb
memcpy(&b->ram[0x65], &a->ram[0x65], 12); // temp66, etc
memcpy(&b->ram[0x8a], &a->ram[0x8a], 6); // temp8a, etc
memcpy(&b->ram[0x14B0], &a->ram[0x14B0], 0x11); // temp14b0 etc
memcpy(&b->ram[0x1436], &a->ram[0x1436], 4); // temp14b0 etc
}
static uint32 RunCpuUntilPC(uint32 pc1, uint32 pc2) {
@ -171,6 +198,8 @@ void SmwRunOneFrameOfGame_Emulated(void) {
// Right after NMI completes, draw the frame, possibly triggering IRQ.
assert(!snes->cpu->i);
/*
snes->vPos = snes->hPos = 0;
snes->cpu->nmiWanted = snes->cpu->irqWanted = false;
snes->inVblank = snes->inNmi = false;
@ -183,6 +212,44 @@ void SmwRunOneFrameOfGame_Emulated(void) {
snes_runCpu(snes);
}
}
*/
}
void SmwDrawPpuFrame(void) {
SimpleHdma hdma_chans[3];
Snes *snes = g_snes;
dma_startDma(snes->dma, mirror_hdmaenable, true);
// dma_initHdma(snes->dma);
SimpleHdma_Init(&hdma_chans[0], &g_snes->dma->channel[5]);
SimpleHdma_Init(&hdma_chans[1], &g_snes->dma->channel[6]);
SimpleHdma_Init(&hdma_chans[2], &g_snes->dma->channel[7]);
int trigger = snes->vIrqEnabled ? snes->vTimer + 1 : -1;
for (int i = 0; i <= 224; i++) {
ppu_runLine(snes->ppu, i);
SimpleHdma_DoLine(&hdma_chans[0]);
SimpleHdma_DoLine(&hdma_chans[1]);
SimpleHdma_DoLine(&hdma_chans[2]);
// dma_doHdma(snes->dma);
if (i == trigger) {
SmwVectorIRQ();
trigger = snes->vIrqEnabled ? snes->vTimer + 1 : -1;
}
}
/*
while (!snes->inNmi) {
snes_handle_pos_stuff(snes);
if (snes->cpu->irqWanted) {
snes->cpu->irqWanted = false;
SmwVectorIRQ();
}
}*/
}
void SmwRunOneFrameOfGame(void) {
@ -198,19 +265,6 @@ void SmwRunOneFrameOfGame(void) {
SmwRunOneFrameOfGame_Internal();
SmwVectorNMI();
snes->vPos = snes->hPos = 0;
snes->cpu->nmiWanted = snes->cpu->irqWanted = false;
snes->inVblank = snes->inNmi = false;
while (!snes->inNmi) {
snes_handle_pos_stuff(snes);
if (snes->cpu->irqWanted) {
snes->cpu->irqWanted = false;
SmwVectorIRQ();
}
}
}
const RtlGameInfo kSmwGameInfo = {
@ -221,5 +275,6 @@ const RtlGameInfo kSmwGameInfo = {
&SmwCpuInitialize,
&SmwRunOneFrameOfGame,
&SmwRunOneFrameOfGame_Emulated,
&SmwDrawPpuFrame,
&SmwFixSnapshotForCompare,
};

View File

@ -1,6 +1,8 @@
#include "smw_rtl.h"
#include "variables.h"
#include <time.h>
#include "common_cpu_infra.h"
#include "snes/snes.h"
void AddSprXPos(uint8 k, uint16 x) {
AddHiLo(&spr_xpos_hi[k], &spr_xpos_lo[k], x);
@ -43,3 +45,9 @@ void SmwSavePlaythroughSnapshot() {
snprintf(buf, sizeof(buf), "playthrough/%d_%d_%d.sav", ow_level_number_lo, misc_exit_level_action, (int)time(NULL));
RtlSaveSnapshot(buf, false);
}
void UploadOAMBuffer() { // 008449
memcpy(g_snes->ppu->oam, g_ram + 0x200, 0x220);
RtlPpuWrite(OAMADDH, 0x80);
RtlPpuWrite(OAMADDL, mirror_oamaddress_lo);
}

View File

@ -11,6 +11,11 @@ void SmwVectorNMI();
void SmwVectorIRQ();
void SmwSavePlaythroughSnapshot();
void SmwCopyToVram(uint16 vram_addr, const uint8 *src, int n);
void SmwClearVram(uint16 vram_addr, uint16 value, int n);
void SmwCopyToVramPitch32(uint16 vram_addr, const uint8 *src, int n);
void SmwCopyToVramLow(uint16 vram_addr, const uint8 *src, int n);
extern bool g_did_finish_level_hook;
void AddSprXPos(uint8 k, uint16 x);
@ -42,3 +47,10 @@ typedef struct LevelTileAnimations {
} LevelTileAnimations;
#pragma pack (pop)
typedef struct GenTileArgs {
uint8 r6, r7;
uint16 r8;
uint16 r12, r14;
uint16 r10;
} GenTileArgs;

View File

@ -64,7 +64,7 @@ typedef struct SmwSpcPlayer {
SpcPlayer base;
DspRegWriteHistory *reg_write_history;
uint8 new_value_from_snes[4];
uint8 port_to_snes[4];
uint8 last_value_from_snes[4];
uint8 timer_cycles;
uint8 counter_sf0c;
@ -174,7 +174,7 @@ static const MemMap kChannel_Maps[] = {
};
static const MemMapSized kSpcPlayer_Maps[] = {
{offsetof(SmwSpcPlayer, new_value_from_snes), 0x0, 4},
{offsetof(SmwSpcPlayer, port_to_snes), 0x4, 4},
{offsetof(SmwSpcPlayer, base.port_to_snes), 0x4, 4},
{offsetof(SmwSpcPlayer, last_value_from_snes), 0x8, 4},
{offsetof(SmwSpcPlayer, counter_sf0c), 0xc, 1},
{offsetof(SmwSpcPlayer, sfx3_timer), 0xd, 1},
@ -345,7 +345,7 @@ static void Spc_Loop_Part2(SmwSpcPlayer *p, uint8 ticks) {
if (!p->smw_pause_music)
Music_Process(p);
ReadPortFromSnes(p, 2);
} else if (p->port_to_snes[2]) {
} else if (p->base.port_to_snes[2]) {
Channel *c = p->channel + 7;
for (p->cur_chan_bit = 0x80; p->cur_chan_bit != 0; p->cur_chan_bit >>= 1, c--) {
if (HIBYTE(c->pattern_cur_ptr))
@ -424,11 +424,11 @@ static void WritePitch(SmwSpcPlayer *p, Channel *c, uint16 pitch) {
}
static void Sfx0_TurnOffChannel(SmwSpcPlayer *p) {
if (p->port_to_snes[0] == 0x11) {
if (p->base.port_to_snes[0] == 0x11) {
p->smw_pause_music = 0x60;
Dsp_Write(p, FLG, 0x60);
}
p->port_to_snes[0] = 0;
p->base.port_to_snes[0] = 0;
p->is_chan_on &= ~0x10;
if (p->channel[4].instrument_id)
Channel_SetInstrument(p, &p->channel[4], p->channel[4].instrument_id);
@ -450,16 +450,16 @@ static void Sfx0_Process(SmwSpcPlayer *p) {
uint8 cmd;
if (p->new_value_from_snes[0] == 0x12 || p->new_value_from_snes[0] == 0x11 ||
p->port_to_snes[0] != 0x11 && p->port_to_snes[0] != 0x1d) {
p->base.port_to_snes[0] != 0x11 && p->base.port_to_snes[0] != 0x1d) {
if (p->new_value_from_snes[0] & 0x80) {
p->smw_tempo_increase = 10;
p->tempo = (p->tempo + (p->smw_tempo_increase << 8)) & ~0xff;
p->new_value_from_snes[3] = 0x1d;
p->port_to_snes[0] = 0x1d;
p->base.port_to_snes[0] = 0x1d;
goto play_it;
} else if (p->new_value_from_snes[0] != 0) {
p->port_to_snes[0] = p->new_value_from_snes[0];
p->base.port_to_snes[0] = p->new_value_from_snes[0];
goto play_it;
}
}
@ -468,7 +468,7 @@ static void Sfx0_Process(SmwSpcPlayer *p) {
if (--p->sfx0_countdown)
return;
goto restart_sfx;
} else if (p->port_to_snes[0]) {
} else if (p->base.port_to_snes[0]) {
goto keep_playing;
} else {
return;
@ -488,7 +488,7 @@ play_it:
}
p->sfx0_countdown = 2;
if (p->port_to_snes[0] == 0x11 && p->echo_channels) {
if (p->base.port_to_snes[0] == 0x11 && p->echo_channels) {
SetEchoOff(p);
}
@ -546,7 +546,7 @@ note_pitch_envelope_to:
goto note_continue;
} else if (cmd == 0xff) {
restart_sfx:
p->sfx0_sound_ptr_cur = WORD(p->ram[0x5681 + (uint8)(p->port_to_snes[0] * 2)]);
p->sfx0_sound_ptr_cur = WORD(p->ram[0x5681 + (uint8)(p->base.port_to_snes[0] * 2)]);
goto start_sfx;
} else {
PlayNote(p, &p->channel[4], cmd);
@ -565,7 +565,7 @@ note_continue:
}
static void Sfx3_TurnOffChannel(SmwSpcPlayer *p) {
p->port_to_snes[3] = 0;
p->base.port_to_snes[3] = 0;
p->is_chan_on &= ~0x40;
p->chan_bit_flags = 0;
Dsp_Write(p, NON, 0);
@ -576,9 +576,9 @@ static void Sfx3_TurnOffChannel(SmwSpcPlayer *p) {
static void Sfx3_Process(SmwSpcPlayer *p) {
uint8 cmd;
if (p->port_to_snes[3] != 0x24 && (p->new_value_from_snes[3] == 0x24 || p->port_to_snes[3] != 0x1d && p->port_to_snes[3] != 5)) {
if (p->base.port_to_snes[3] != 0x24 && (p->new_value_from_snes[3] == 0x24 || p->base.port_to_snes[3] != 0x1d && p->base.port_to_snes[3] != 5)) {
if (p->new_value_from_snes[3] != 0) {
p->port_to_snes[3] = p->new_value_from_snes[3];
p->base.port_to_snes[3] = p->new_value_from_snes[3];
p->sfx3_timer = 2;
Dsp_Write(p, KOF, 0x40);
p->is_chan_on |= 0x40;
@ -590,9 +590,9 @@ static void Sfx3_Process(SmwSpcPlayer *p) {
if (p->sfx3_timer) {
if (--p->sfx3_timer)
return;
p->sfx3_sound_ptr_cur = WORD(p->ram[0x5619 + (uint8)(p->port_to_snes[3] * 2)]);
p->sfx3_sound_ptr_cur = WORD(p->ram[0x5619 + (uint8)(p->base.port_to_snes[3] * 2)]);
goto start_sfx;
} else if (!p->port_to_snes[3]) {
} else if (!p->base.port_to_snes[3]) {
return;
}
@ -706,7 +706,7 @@ static void Sfx1_Process(SmwSpcPlayer *p) {
if (p->new_value_from_snes[1] == 2) {
// enable yoshi drums
if ((p->port_to_snes[2] == 6 || !(p->port_to_snes[2] & ~3)) && !p->smw_player_on_yoshi) {
if ((p->base.port_to_snes[2] == 6 || !(p->base.port_to_snes[2] & ~3)) && !p->smw_player_on_yoshi) {
Port1_WriteInstrument(p, 9);
p->smw_player_on_yoshi = 1;
}
@ -714,9 +714,9 @@ static void Sfx1_Process(SmwSpcPlayer *p) {
// disable yoshi drums
p->smw_player_on_yoshi = 0;
} else if (p->new_value_from_snes[1] == 1 ||
p->port_to_snes[1] != 1 && p->new_value_from_snes[1] == 4) {
p->base.port_to_snes[1] != 1 && p->new_value_from_snes[1] == 4) {
// jump & two note sfx
p->port_to_snes[1] = p->new_value_from_snes[1];
p->base.port_to_snes[1] = p->new_value_from_snes[1];
p->sfx1_countdown = 4;
Dsp_Write(p, KOF, 0x80);
p->is_chan_on |= 0x80;
@ -727,7 +727,7 @@ static void Sfx1_Process(SmwSpcPlayer *p) {
return;
}
if (p->port_to_snes[1] == 1) {
if (p->base.port_to_snes[1] == 1) {
if (p->sfx1_countdown) {
if (--p->sfx1_countdown)
return;
@ -741,7 +741,7 @@ static void Sfx1_Process(SmwSpcPlayer *p) {
Dsp_Write(p, V7VOLR, 0x38);
Write_KeyOn(p, 0x80);
} else if (--p->chan7_countdown_2 == 0) {
p->port_to_snes[1] = 0;
p->base.port_to_snes[1] = 0;
p->is_chan_on &= ~0x80;
if (p->channel[7].instrument_id)
Channel_SetInstrument(p, &p->channel[7], p->channel[7].instrument_id);
@ -756,14 +756,14 @@ static void Sfx1_Process(SmwSpcPlayer *p) {
p->did_affect_volumepitch_flag = 0;
if (p->channel[7].pitch_slide_length)
Sfx_WritePitchSweep(p, &p->channel[7]);
} else if (p->port_to_snes[1] == 4) {
} else if (p->base.port_to_snes[1] == 4) {
if (p->sfx1_countdown) {
if (--p->sfx1_countdown)
return;
p->chan7_countdown_2 = 0x18;
goto write_it;
} else if (--p->chan7_countdown_2 == 0) {
p->port_to_snes[1] = 0;
p->base.port_to_snes[1] = 0;
p->is_chan_on &= ~0x80;
if (p->channel[7].instrument_id)
Channel_SetInstrument(p, &p->channel[7], p->channel[7].instrument_id);
@ -785,8 +785,8 @@ static void Music_Process(SmwSpcPlayer *p) {
uint8 cmd;
int t;
if (p->port_to_snes[2] != 0) {
if ((p->port_to_snes[2] == 6 || !(p->port_to_snes[2] & ~3)) && !p->smw_player_on_yoshi) {
if (p->base.port_to_snes[2] != 0) {
if ((p->base.port_to_snes[2] == 6 || !(p->base.port_to_snes[2] & ~3)) && !p->smw_player_on_yoshi) {
Dsp_Write(p, KOF, 0x20);
p->is_chan_on |= 0x20;
} else {
@ -802,7 +802,7 @@ static void Music_Process(SmwSpcPlayer *p) {
}
if (p->counter_sf0c)
goto music_keep_running;
if (p->port_to_snes[2])
if (p->base.port_to_snes[2])
goto label_a;
return;
}
@ -810,7 +810,7 @@ static void Music_Process(SmwSpcPlayer *p) {
if (cmd == 0x16 || cmd == 0x10 || cmd == 0xf || cmd >= 9 && cmd < 13)
p->smw_tempo_increase = 0;
p->port_to_snes[2] = cmd;
p->base.port_to_snes[2] = cmd;
p->counter_sf0c = 2;
p->music_ptr_toplevel = WORD(p->ram[0x1360 + (cmd - 1) * 2]);
@ -848,7 +848,7 @@ Music_loop_1:
if ((t >> 8) != 0)
break;
if (t == 0) {
p->port_to_snes[2] = 0;
p->base.port_to_snes[2] = 0;
Dsp_Write(p, KOF, ~p->is_chan_on);
return;
}
@ -1320,7 +1320,7 @@ static void SmwSpcPlayer_Upload(SpcPlayer *p_in, const uint8_t *data) {
p->ram[target++ & 0xffff] = *data++;
} while (--numbytes);
}
p->port_to_snes[0] = p->port_to_snes[1] = p->port_to_snes[2] = p->port_to_snes[3] = 0;
p->base.port_to_snes[0] = p->base.port_to_snes[1] = p->base.port_to_snes[2] = p->base.port_to_snes[3] = 0;
p->is_chan_on = 0;
p->smw_tempo_increase = 0;
p->smw_pause_music = 0;

View File

@ -14,6 +14,7 @@ typedef struct SpcPlayer {
Dsp *dsp;
uint8 *ram;
uint8 input_ports[4];
uint8 port_to_snes[4];
SpcPlayer_Initialize_Func *initialize;
SpcPlayer_GenerateSamples_Func *gen_samples;

View File

@ -10,7 +10,7 @@
#include "../types.h"
//#include "../variables.h"
#include "../smw_rtl.h"
#include "../../smb1/smb1_variables.h"
#include "../variables.h"
static const int cyclesPerOpcode[256] = {
7, 6, 7, 4, 5, 3, 5, 6, 3, 2, 2, 4, 6, 4, 6, 5,
@ -746,21 +746,23 @@ static void cpu_doOpcode(Cpu* cpu, uint8_t opcode) {
pc_hist_ctr = (pc_hist_ctr + 1) & 15;
if (cur_pc == pc_bp) {
printf("Rseached BP 0x%x. A=0x%.2x, X=0x%.2x, Y=0x%.2x. C=%d. 0x%x\n",
printf("Reached BP 0x%x. A=0x%.2x, X=0x%.2x, Y=0x%.2x. C=%d. 0x%x\n",
cur_pc, (uint8)cpu->a, cpu->x, cpu->y, cpu->c,
WORD(tempE4));
0);
bp_cnt += 1;
g_snes->debug_cycles = 0;
//g_snes->debug_cycles = 1;
}
if (cur_pc == 0x29186&&0)
printf("curpc=0x%x 0x%x\n", g_cpu->a, g_cpu->x);
if (cur_pc == 0x29197 && g_cpu->x == 0x800&&0) {
printf("x=0x%x, y=0x%x, t4=0x%x\n", g_cpu->x, g_cpu->y, WORD(tempE4));
if (cur_pc == 0x85d2) {
// printf("T: upl stripe %d\n", graphics_stripe_image_to_upload);
// if (cur_pc == 0x29197 && g_cpu->x == 0x800&&0) {
// printf("x=0x%x, y=0x%x, t4=0x%x\n", g_cpu->x, g_cpu->y, WORD(tempE4));
//g_snes->debug_cycles = 1;
uint16 t = g_ram[0xf3] | g_ram[0xf4] << 8;
// printf("wr 0x%x = 0x%x\n", t + g_cpu->y, g_cpu->a & 0xff);
}
// if (cur_pc == 0x2A82E)
// printf("T: Load sprites offs %d: 0x%x\n", g_cpu->y, WORD(g_ram[0]));
restart:
switch(opcode) {
@ -1478,7 +1480,6 @@ restart:
break;
}
case 0x6b: { // rtl imp
g_snes->debug_cycles = false;
if (cpu->sp >= cpu->spBreakpoint && cpu->spBreakpoint) {
assert(cpu->sp == cpu->spBreakpoint);
cpu->spBreakpoint = 0;

View File

@ -208,7 +208,7 @@ void snes_runCycle(Snes* snes) {
snes_handle_pos_stuff(snes);
}
#define IS_ADR(x) (x == 0xffffffff)
#define IS_ADR(x) (x == 0xffffff)
void snes_runCpu(Snes *snes) {
uint32_t pc = snes->cpu->k << 16 | snes->cpu->pc;

View File

@ -196,6 +196,7 @@ typedef enum SnesRegs {
NTRL6 = 0x436A,
UNUSED6 = 0x436B,
MIRR6 = 0x436F,
DMAP7 = 0x4370,
BBAD7 = 0x4371,
A1T7L = 0x4372,
@ -203,6 +204,8 @@ typedef enum SnesRegs {
A1B7 = 0x4374,
DAS7L = 0x4375,
DAS7H = 0x4376,
DAS70 = 0x4377,
A2A7L = 0x4378,
A2A7H = 0x4379,

View File

@ -102,6 +102,10 @@ typedef struct PointU16 {
uint16 x, y;
} PointU16;
typedef struct PointU8 {
uint8 x, y;
} PointU8;
typedef struct OamEnt {
uint8 xpos;
uint8 ypos;
@ -109,7 +113,7 @@ typedef struct OamEnt {
uint8 flags;
} OamEnt;
typedef void FuncU8(uint8 k);
typedef void FuncU8(uint8 kk);
typedef void FuncV(void);
// Some convenience macros to make partial accesses nicer
@ -122,7 +126,7 @@ typedef void FuncV(void);
#define LOBYTE(x) BYTEn(x,LOW_IND(x,uint8))
#define LOWORD(x) WORDn(x,LOW_IND(x,uint16))
#define HIBYTE(x) BYTEn(x,HIGH_IND(x,uint8))
#define HIBYTE(x) BYTEn(x,1)
#define HIWORD(x) WORDn(x,HIGH_IND(x,uint16))
#define GET_HIBYTE(x) (((x) & 0xff00) >> 8)

View File

@ -1,32 +1,40 @@
#define R0_W (*(uint16*)(g_ram+0x0))
#define R1_W (*(uint16*)(g_ram+0x1))
#define R2_W (*(uint16*)(g_ram+0x2))
#define R3_W (*(uint16*)(g_ram+0x3))
#define R4_W (*(uint16*)(g_ram+0x4))
#define R5_W (*(uint16*)(g_ram+0x5))
#define R6_W (*(uint16*)(g_ram+0x6))
#define R8_W (*(uint16*)(g_ram+0x8))
#define R9_W (*(uint16*)(g_ram+0x9))
#define R10_W (*(uint16*)(g_ram+0xA))
#define R12_W (*(uint16*)(g_ram+0xC))
#define R14_W (*(uint16*)(g_ram+0xE))
//#define r0w (*(uint16*)(g_ram+0x0))
//#define r1w (*(uint16*)(g_ram+0x1))
//#define r2w (*(uint16*)(g_ram+0x2))
//#define r3w (*(uint16*)(g_ram+0x3))
//#define r4w (*(uint16*)(g_ram+0x4))
//#define r5w (*(uint16*)(g_ram+0x5))
//#define r6w (*(uint16*)(g_ram+0x6))
//#define r8w (*(uint16*)(g_ram+0x8))
//#define r9w (*(uint16*)(g_ram+0x9))
//#define r10w (*(uint16*)(g_ram+0xA))
//#define r12w (*(uint16*)(g_ram+0xC))
//#define r14w (*(uint16*)(g_ram+0xE))
//#define r0 (*(uint8*)(g_ram+0x0))
//#define r1 (*(uint8*)(g_ram+0x1))
//#define r2 (*(uint8*)(g_ram+0x2))
//#define r3 (*(uint8*)(g_ram+0x3))
//#define r4 (*(uint8*)(g_ram+0x4))
//#define r5 (*(uint8*)(g_ram+0x5))
//#define r6 (*(uint8*)(g_ram+0x6))
//#define r7 (*(uint8*)(g_ram+0x7))
//#define r8 (*(uint8*)(g_ram+0x8))
//#define r9 (*(uint8*)(g_ram+0x9))
//#define r10 (*(uint8*)(g_ram+0xA))
//#define r11 (*(uint8*)(g_ram+0xB))
//#define r12 (*(uint8*)(g_ram+0xC))
//#define r13 (*(uint8*)(g_ram+0xD))
//#define r14 (*(uint8*)(g_ram+0xE))
//#define r15 (*(uint8*)(g_ram+0xF))
#define R5_slopeptr (*(LongPtr*)(g_ram+0x5))
#define lvlload_R4W (*(uint16*)(g_ram+0x4))
#define loadlvl_R10 (*(uint8*)(g_ram+0xA))
#define loadlvl_R11 (*(uint8*)(g_ram+0xB))
#define R0_ (*(uint8*)(g_ram+0x0))
#define R1_ (*(uint8*)(g_ram+0x1))
#define R2_ (*(uint8*)(g_ram+0x2))
#define R3_ (*(uint8*)(g_ram+0x3))
#define R4_ (*(uint8*)(g_ram+0x4))
#define R5_ (*(uint8*)(g_ram+0x5))
#define R6_ (*(uint8*)(g_ram+0x6))
#define R7_ (*(uint8*)(g_ram+0x7))
#define R8_ (*(uint8*)(g_ram+0x8))
#define R9_ (*(uint8*)(g_ram+0x9))
#define R10_ (*(uint8*)(g_ram+0xA))
#define R11_ (*(uint8*)(g_ram+0xB))
#define R12_ (*(uint8*)(g_ram+0xC))
#define R13_ (*(uint8*)(g_ram+0xD))
#define R14_ (*(uint8*)(g_ram+0xE))
#define R15_ (*(uint8*)(g_ram+0xF))
#define waiting_for_vblank (*(uint8*)(g_ram+0x10))
#define flag_irqto_use (*(uint8*)(g_ram+0x11))
#define graphics_stripe_image_to_upload (*(uint8*)(g_ram+0x12))
@ -84,15 +92,16 @@
#define camera_last_screen_horiz (*(uint8*)(g_ram+0x5E))
#define camera_last_screen_vert (*(uint8*)(g_ram+0x5F))
#define sprites_tile_priority (*(uint8*)(g_ram+0x64))
#define temp65 (*(uint8*)(g_ram+0x65))
#define temp66 (*(uint8*)(g_ram+0x66))
#define temp67 (*(uint8*)(g_ram+0x67))
#define ptr_layer2_data (*(uint16*)(g_ram+0x68))
#define ptr_layer2_data_bank (*(uint8*)(g_ram+0x6A))
#define ptr_lo_map16_data (*(uint16*)(g_ram+0x6B))
#define ptr_lo_map16_data_bank (*(uint8*)(g_ram+0x6D))
#define ptr_hi_map16_data (*(uint16*)(g_ram+0x6E))
#define ptr_hi_map16_data_bank (*(uint8*)(g_ram+0x70))
// alias
#define credits_var65 (*(uint16*)(g_ram+0x65))
#define credits_index (*(uint8*)(g_ram+0x67))
#define ptr_layer1_data (*(LongPtr*)(g_ram+0x65))
#define ptr_layer2_data (*(LongPtr*)(g_ram+0x68))
#define ptr_lo_map16_data (*(LongPtr*)(g_ram+0x6B))
#define ptr_hi_map16_data (*(LongPtr*)(g_ram+0x6E))
#define player_current_state (*(uint8*)(g_ram+0x71))
#define player_in_air_flag (*(uint8*)(g_ram+0x72))
#define player_ducking_flag (*(uint8*)(g_ram+0x73))
@ -107,15 +116,17 @@
#define player_yspeed (*(uint8*)(g_ram+0x7D))
#define player_on_screen_pos_x (*(uint16*)(g_ram+0x7E))
#define player_on_screen_pos_y (*(uint16*)(g_ram+0x80))
#define ptr_slope_steepness (*(uint16*)(g_ram+0x82))
#define ptr_slope_steepness_bank (*(uint8*)(g_ram+0x84))
#define ptr_slope_steepness (*(LongPtr*)(g_ram+0x82))
#define flag_underwater_level (*(uint8*)(g_ram+0x85))
#define flag_ice_level (*(uint8*)(g_ram+0x86))
#define player_timer_pipe_warping (*(uint8*)(g_ram+0x88))
#define player_pipe_action (*(uint8*)(g_ram+0x89))
#define temp8a (*(uint8*)(g_ram+0x8A))
#define temp8b (*(uint8*)(g_ram+0x8B))
#define temp8c (*(uint8*)(g_ram+0x8C))
#define decomp_src (*(LongPtr*)(g_ram+0x8A))
#define player_collision_var8a (*(uint8*)(g_ram+0x8A))
#define player_collision_var8b (*(uint8*)(g_ram+0x8B))
#define player_collision_var8c (*(uint8*)(g_ram+0x8C))
#define temp8d (*(uint8*)(g_ram+0x8D))
#define temp8e (*(uint8*)(g_ram+0x8E))
#define temp8f (*(uint8*)(g_ram+0x8F))
@ -133,12 +144,10 @@
#define spr_yspeed ((uint8*)(g_ram+0xAA))
#define spr_xspeed ((uint8*)(g_ram+0xB6))
#define spr_table00c2 ((uint8*)(g_ram+0xC2))
#define ptr_sprite_list_data (*(uint16*)(g_ram+0xCE))
#define ptr_sprite_list_data_bank (*(uint8*)(g_ram+0xD0))
#define ptr_sprite_list_data (*(LongPtr*)(g_ram+0xCE))
#define player_current_xpos (*(uint16*)(g_ram+0xD1))
#define player_current_ypos (*(uint16*)(g_ram+0xD3))
#define spr86_wiggler_segment_pos_ptr (*(uint16*)(g_ram+0xD5))
#define spr86_wiggler_segment_pos_ptr_bank (*(uint8*)(g_ram+0xD7))
#define spr86_wiggler_segment_pos_ptr (*(LongPtr*)(g_ram+0xD5))
#define spr_ypos_lo ((uint8*)(g_ram+0xD8))
#define spr_xpos_lo ((uint8*)(g_ram+0xE4))
#define misc_game_mode (*(uint8*)(g_ram+0x100))
@ -223,8 +232,7 @@
#define players_overworld_xpos_is_going_to ((PointU16*)(g_ram+0xDC7))
#define player_overworld_xspeed (*(uint16*)(g_ram+0xDCF))
#define player_overworld_yspeed (*(uint16*)(g_ram+0xDD1))
#define ow_player_direction (*(uint8*)(g_ram+0xDD3))
#define unusedram_7e0dd4 (*(uint8*)(g_ram+0xDD4))
#define ow_player_direction (*(uint16*)(g_ram+0xDD3))
#define misc_exit_level_action (*(uint8*)(g_ram+0xDD5))
#define player_current_characterx4 (*(uint16*)(g_ram+0xDD6))
#define flag_switch_players (*(uint8*)(g_ram+0xDD8))
@ -388,10 +396,6 @@
#define timer_hdmawindow_scaling_factor (*(uint8*)(g_ram+0x1433))
#define timer_end_level_via_keyhole (*(uint8*)(g_ram+0x1434))
#define flag_keyhole_anim_phase (*(uint8*)(g_ram+0x1435))
#define temp1436 (*(uint8*)(g_ram+0x1436))
#define player_on_tilting_platform_xpos_hi (*(uint8*)(g_ram+0x1437))
#define temp1438 (*(uint8*)(g_ram+0x1438))
#define player_on_tilting_platform_ypos_hi (*(uint8*)(g_ram+0x1439))
#define flag_upload_load_screen_letters_tovram (*(uint8*)(g_ram+0x143A))
#define misc_death_message_to_display (*(uint8*)(g_ram+0x143B))
#define timer_display_death_message_animation (*(uint8*)(g_ram+0x143C))
@ -466,22 +470,55 @@
#define timer_blue_pswitch (*(uint8*)(g_ram+0x14AD))
#define timer_silver_pswitch (*(uint8*)(g_ram+0x14AE))
#define flag_on_off_switch (*(uint8*)(g_ram+0x14AF))
#define temp14b0 (*(uint8*)(g_ram+0x14B0))
#define temp14b1 (*(uint8*)(g_ram+0x14B1))
#define temp14b2 (*(uint8*)(g_ram+0x14B2))
#define temp14b3 (*(uint8*)(g_ram+0x14B3))
#define temp14b4 (*(uint8*)(g_ram+0x14B4))
#define temp14b5 (*(uint8*)(g_ram+0x14B5))
#define temp14b6 (*(uint8*)(g_ram+0x14B6))
#define temp14b7 (*(uint8*)(g_ram+0x14B7))
#define temp14b8 (*(uint8*)(g_ram+0x14B8))
#define temp14b9 (*(uint8*)(g_ram+0x14B9))
#define temp14ba (*(uint8*)(g_ram+0x14BA))
#define temp14bb (*(uint8*)(g_ram+0x14BB))
#define temp14bc (*(uint8*)(g_ram+0x14BC))
//#define temp14b0 (*(uint8*)(g_ram+0x14B0))
//#define temp14b1 (*(uint8*)(g_ram+0x14B1))
//#define temp14b2 (*(uint8*)(g_ram+0x14B2))
//#define temp14b3 (*(uint8*)(g_ram+0x14B3))
//
//#define temp14b4 (*(uint8*)(g_ram+0x14B4))
//#define temp14b5 (*(uint8*)(g_ram+0x14B5))
//#define temp14b6 (*(uint8*)(g_ram+0x14B6))
//#define temp14b7 (*(uint8*)(g_ram+0x14B7))
//
//#define temp14b8 (*(uint8*)(g_ram+0x14B8))
//#define temp14b9 (*(uint8*)(g_ram+0x14B9))
//#define temp14ba (*(uint8*)(g_ram+0x14BA))
//#define temp14bb (*(uint8*)(g_ram+0x14BB))
//
//#define temp14bc (*(uint8*)(g_ram+0x14BC))
//
//#define temp1436 (*(uint8*)(g_ram+0x1436))
//#define player_on_tilting_platform_xpos_hi (*(uint8*)(g_ram+0x1437))
#define player_on_tilting_platform_xpos (*(uint16*)(g_ram+0x1436))
#define player_on_tilting_platform_ypos (*(uint16*)(g_ram+0x1438))
//#define temp1438 (*(uint8*)(g_ram+0x1438))
//#define player_on_tilting_platform_ypos_hi (*(uint8*)(g_ram+0x1439))
// These are aliased
#define switch_block_event_oam_index (*(uint8*)(g_ram+0x1438))
#define switch_block_event_blocks_thrown_ctr (*(uint8*)(g_ram+0x1436))
#define switch_block_event_wait_counter (*(uint8*)(g_ram+0x1437))
#define switch_block_event_ejection_counter (*(uint8*)(g_ram+0x1439))
#define bowserbattle_var14b0 (*(uint8*)(g_ram+0x14B0))
#define bowserbattle_var14b1 (*(uint8*)(g_ram+0x14B1))
#define bowserbattle_var14b2 (*(uint8*)(g_ram+0x14B2))
#define bowserbattle_var14b3 (*(uint8*)(g_ram+0x14B3))
#define bowserbattle_var14b4 (*(uint8*)(g_ram+0x14B4))
#define bowserbattle_var14b5 (*(uint8*)(g_ram+0x14B5))
#define bowserbattle_var14b6 (*(uint8*)(g_ram+0x14B6))
#define bowserbattle_var14b7 (*(uint8*)(g_ram+0x14B7))
#define bowserbattle_var14b8 (*(uint8*)(g_ram+0x14B8))
#define bowserbattle_var14b9 (*(uint8*)(g_ram+0x14B9))
#define bowserbattle_var14ba (*(uint8*)(g_ram+0x14BA))
#define bowserbattle_var14bb (*(uint8*)(g_ram+0x14BB))
#define bowserbattle_var14bc (*(uint8*)(g_ram+0x14BC))
#define misc_rotating_object_xradius_hi (*(uint8*)(g_ram+0x14BD))
#define temp14bf (*(uint8*)(g_ram+0x14BF))
#define temp14c0 (*(uint8*)(g_ram+0x14C0))
//#define temp14bf (*(uint8*)(g_ram+0x14BF))
//#define temp14c0 (*(uint8*)(g_ram+0x14C0))
#define sprites_brown_rotating_platform_sine (*(uint16*)(g_ram+0x14C2))
#define sprites_brown_rotating_platform_cosine (*(uint16*)(g_ram+0x14C5))
#define spr_current_status ((uint8*)(g_ram+0x14C8))