From 56df2670c067c2cdfc977ca47fc0be6957302045 Mon Sep 17 00:00:00 2001 From: Snesrev Date: Tue, 14 Mar 2023 20:18:51 +0100 Subject: [PATCH] Clean up some code --- src/funcs.h | 3 +- src/sm_80.c | 26 +++------- src/sm_81.c | 125 ++++++++++++--------------------------------- src/sm_82.c | 15 +++--- src/sm_84.c | 73 ++++++++++++-------------- src/sm_86.c | 2 +- src/sm_88.c | 2 +- src/sm_8b.c | 4 +- src/sm_94.c | 16 +++--- src/sm_a0.c | 107 +++++++++++--------------------------- src/sm_cpu_infra.c | 5 +- 11 files changed, 124 insertions(+), 254 deletions(-) diff --git a/src/funcs.h b/src/funcs.h index 8a1b4bc..959c279 100644 --- a/src/funcs.h +++ b/src/funcs.h @@ -159,8 +159,7 @@ void VerifySRAM(void); CoroutineRet WaitForNMI_Async(void); CoroutineRet WaitForNMI_NoUpdate_Async(void); void WriteLotsOf0x1c2f(void); -void memset7E(uint16 k, uint16 a, uint16 j); -void memset7F(uint16 k, uint16 a, uint16 j); +void memset7E(uint16 *k, uint16 a, uint16 j); void sub_8088EB(uint16 a); void sub_8088FE(uint16 a); void sub_808911(uint16 a); diff --git a/src/sm_80.c b/src/sm_80.c index 6977bb2..24d5ee6 100644 --- a/src/sm_80.c +++ b/src/sm_80.c @@ -145,20 +145,10 @@ void ScreenOn(void) { reg_INIDISP &= ~0x80; } -void memset7E(uint16 k, uint16 a, uint16 j) { // 0x8083F6 +void memset7E(uint16 *k, uint16 a, uint16 j) { // 0x8083F6 do { - *(uint16 *)RomPtr_7E(k) = a; - k += 2; - j -= 2; - } while (j); -} - -void memset7F(uint16 k, uint16 a, uint16 j) { // 0x808409 - do { - *(uint16 *)RomPtr_7F(k) = a; - k += 2; - j -= 2; - } while (j); + *k++ = a; + } while (j -= 2); } CoroutineRet Vector_RESET_Async(void) { // 0x80841C @@ -377,15 +367,15 @@ void WriteLotsOf0x1c2f(void) { // 0x8088D1 } void sub_8088EB(uint16 a) { // 0x8088EB - memset7E(0x3000u, a, 0x800u); + memset7E((uint16*)(g_ram + 0x3000), a, 0x800u); } void sub_8088FE(uint16 a) { // 0x8088FE - memset7E(0x4000u, a, 0x800u); + memset7E((uint16 *)(g_ram + 0x4000), a, 0x800u); } void sub_808911(uint16 a) { // 0x808911 - memset7E(0x6000u, a, 0x800u); + memset7E((uint16 *)(g_ram + 0x6000), a, 0x800u); } void HandleFadeOut(void) { // 0x808924 @@ -504,8 +494,6 @@ void NMI_ProcessMode7QueueInner(uint16 k) { // 0x808BD3 } void NMI_ProcessVramWriteQueue(void) { // 0x808C83 - int16 v3; - if (vram_write_queue_tail) { gVramWriteEntry(vram_write_queue_tail)->size = 0; WriteRegWord(DMAP1, 0x1801u); @@ -2251,7 +2239,7 @@ void UpdateLevelOrBackgroundDataColumn(uint16 k) { // 0x80A9DE bg1_column_update_tilemap_right_halves[v13 + 1] = tile_table.tables[v10].bottom_right; } tmp_vram_base_addr = v11 + 4; - v9 = room_width_in_blocks + room_width_in_blocks + v17; + v9 = room_width_in_blocks * 2 + v17; --loopcounter; } while (loopcounter); ++ *(uint16 *)((char *)&bg1_update_col_enable + t2); diff --git a/src/sm_81.c b/src/sm_81.c index 8381030..e4c9b95 100644 --- a/src/sm_81.c +++ b/src/sm_81.c @@ -52,14 +52,13 @@ void SaveToSram(uint16 a) { // 0x818000 sram_save_station_index = load_station_index; sram_area_index = area_index; uint16 v5 = kOffsetToSaveSlot[R18_ >> 1]; - uint16 v6 = ADDR16_OF_RAM(*player_data_saved); + uint16 *v6 = player_data_saved; do { - v7 = *(uint16 *)RomPtr_7E(v6); + v7 = *v6++; *(uint16 *)(&g_sram[2 * (v5 >> 1)]) = v7; R20_ += v7; v5 += 2; - v6 += 2; - } while (v6 != ADDR16_OF_RAM(*plm_instruction_timer)); + } while (v6 != plm_instruction_timer); uint16 v8 = R18_; uint16 v9 = R20_; int v10 = R18_ >> 1; @@ -76,14 +75,13 @@ uint8 LoadFromSram(uint16 a) { // 0x818085 R20_ = 0; R18_ = 2 * (a & 3); uint16 v1 = kOffsetToSaveSlot[a & 3]; - uint16 v2 = ADDR16_OF_RAM(*player_data_saved); + uint16 *v2 = player_data_saved; do { uint16 v3 = kSramChecksum[v1 >> 1]; - *(uint16 *)RomPtr_7E(v2) = v3; + *v2++ = v3; R20_ += v3; v1 += 2; - v2 += 2; - } while (v2 != ADDR16_OF_RAM(*plm_instruction_timer)); + } while (v2 != plm_instruction_timer); int v4 = R18_ >> 1; if (R20_ == kSramChecksum[v4] && (R20_ ^ 0xffff) == kSramChecksumInverted[v4] || R20_ == kSramChecksumUpper[v4] && (R20_ ^ 0xffff) == kSramChecksumInvertedUpper[v4]) { @@ -159,8 +157,6 @@ void PackMapToSave(void) { // 0x81834B void DrawSpritemap(uint8 db, uint16 j) { // 0x81879F int16 v7; OamEnt *v8; - int16 v10; - int16 v12; char v13; char v15; @@ -183,18 +179,14 @@ void DrawSpritemap(uint8 db, uint16 j) { // 0x81879F if ((v7 & 0x100) != 0) { int v9 = v5 >> 1; if (*(int16 *)v6 >= 0) { - R28_ = kOamExtra_Address_And_X8Large[v9]; - v10 = kOamExtra_X8Small_And_Large[v9] | *(uint16 *)RomPtr_RAM(R28_); + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v9]) |= kOamExtra_X8Small_And_Large[v9]; } else { - R28_ = kOamExtra_Address_And_X8Large[v9]; - v10 = kOamExtra_Address_And_X8Large[v9 + 1] | *(uint16 *)RomPtr_RAM(R28_); + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v9]) |= kOamExtra_Address_And_X8Large[v9 + 1]; } - *(uint16 *)RomPtr_RAM(R28_) = v10; + } else if (*(int16 *)v6 < 0) { int v11 = v5 >> 1; - R28_ = kOamExtra_Address_And_X8Large[v11]; - v12 = kOamExtra_X8Small_And_Large[v11 + 1] | *(uint16 *)RomPtr_RAM(R28_); - *(uint16 *)RomPtr_RAM(R28_) = v12; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v11]) |= kOamExtra_X8Small_And_Large[v11 + 1]; } v13 = v6[2]; if (v13 >= 0) { @@ -240,8 +232,6 @@ LABEL_22: void DrawSpritemapOffScreen(uint16 j) { // 0x818853 int16 v6; OamEnt *v7; - int16 v9; - int16 v11; char v12; char v14; @@ -264,18 +254,14 @@ LABEL_25: if ((v6 & 0x100) != 0) { int v8 = v4 >> 1; if (*(int16 *)v5 >= 0) { - R28_ = kOamExtra_Address_And_X8Large[v8]; - v9 = kOamExtra_X8Small_And_Large[v8] | *(uint16 *)RomPtr_RAM(R28_); + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]) |= kOamExtra_X8Small_And_Large[v8]; } else { - R28_ = kOamExtra_Address_And_X8Large[v8]; - v9 = kOamExtra_Address_And_X8Large[v8 + 1] | *(uint16 *)RomPtr_RAM(R28_); + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]) |= kOamExtra_Address_And_X8Large[v8 + 1]; } - *(uint16 *)RomPtr_RAM(R28_) = v9; + } else if (*(int16 *)v5 < 0) { int v10 = v4 >> 1; - R28_ = kOamExtra_Address_And_X8Large[v10]; - v11 = kOamExtra_X8Small_And_Large[v10 + 1] | *(uint16 *)RomPtr_RAM(R28_); - *(uint16 *)RomPtr_RAM(R28_) = v11; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]) |= kOamExtra_X8Small_And_Large[v10 + 1]; } v12 = v5[2]; if (v12 >= 0) { @@ -314,13 +300,9 @@ LABEL_22: } void SetXCoordToInvalidPos(uint16 k) { // 0x818907 - int16 v2; - gOamEnt(k)->xcoord = 0x80; int v1 = k >> 1; - R28_ = kOamExtra_Address_And_X8Large[v1]; - v2 = kOamExtra_X8Small_And_Large[v1] | *(uint16 *)RomPtr_RAM(R28_); - *(uint16 *)RomPtr_RAM(R28_) = v2; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v1]) |= kOamExtra_X8Small_And_Large[v1]; } #define g_off_82C569 ((uint16*)RomPtr(0x82c569)) @@ -328,8 +310,6 @@ void SetXCoordToInvalidPos(uint16 k) { // 0x818907 void DrawMenuSpritemap(uint16 a, uint16 k, uint16 j) { // 0x81891F int16 v8; OamEnt *v9; - int16 v11; - int16 v13; R18_ = j; R20_ = k; @@ -347,18 +327,14 @@ void DrawMenuSpritemap(uint16 a, uint16 k, uint16 j) { // 0x81891F if ((v8 & 0x100) != 0) { int v10 = v6 >> 1; if (*(int16 *)v7 >= 0) { - R22_ = kOamExtra_Address_And_X8Large[v10]; - v11 = kOamExtra_X8Small_And_Large[v10] | *(uint16 *)RomPtr_RAM(R22_); + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]) |= kOamExtra_X8Small_And_Large[v10]; } else { - R22_ = kOamExtra_Address_And_X8Large[v10]; - v11 = kOamExtra_Address_And_X8Large[v10 + 1] | *(uint16 *)RomPtr_RAM(R22_); + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]) |= kOamExtra_Address_And_X8Large[v10 + 1]; } - *(uint16 *)RomPtr_RAM(R22_) = v11; + } else if (*(int16 *)v7 < 0) { int v12 = v6 >> 1; - R22_ = kOamExtra_Address_And_X8Large[v12]; - v13 = kOamExtra_X8Small_And_Large[v12 + 1] | *(uint16 *)RomPtr_RAM(R22_); - *(uint16 *)RomPtr_RAM(R22_) = v13; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v12]) |= kOamExtra_X8Small_And_Large[v12 + 1]; } *(uint16 *)&v9->ycoord = R18_ + *((uint16 *)v7 + 1); *(uint16 *)&v9->charnum = R3_.addr | *(uint16 *)(v7 + 3) & 0xF1FF; @@ -375,8 +351,6 @@ void DrawMenuSpritemap(uint16 a, uint16 k, uint16 j) { // 0x81891F void DrawSamusSpritemap(uint16 a, uint16 k, uint16 j) { // 0x8189AE int16 v8; OamEnt *v9; - int16 v11; - int16 v13; uint16 v15; R18_ = j; @@ -397,18 +371,13 @@ void DrawSamusSpritemap(uint16 a, uint16 k, uint16 j) { // 0x8189AE if ((v8 & 0x100) != 0) { int v10 = v6 >> 1; if (*(int16 *)v7 >= 0) { - R22_ = kOamExtra_Address_And_X8Large[v10]; - v11 = kOamExtra_X8Small_And_Large[v10] | *(uint16 *)RomPtr_RAM(R22_); + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]) |= kOamExtra_X8Small_And_Large[v10]; } else { - R22_ = kOamExtra_Address_And_X8Large[v10]; - v11 = kOamExtra_Address_And_X8Large[v10 + 1] | *(uint16 *)RomPtr_RAM(R22_); + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]) |= kOamExtra_Address_And_X8Large[v10 + 1]; } - *(uint16 *)RomPtr_RAM(R22_) = v11; } else if (*(int16 *)v7 < 0) { int v12 = v6 >> 1; - R22_ = kOamExtra_Address_And_X8Large[v12]; - v13 = kOamExtra_X8Small_And_Large[v12 + 1] | *(uint16 *)RomPtr_RAM(R22_); - *(uint16 *)RomPtr_RAM(R22_) = v13; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v12]) |= kOamExtra_X8Small_And_Large[v12 + 1]; } *(uint16 *)&v9->ycoord = R18_ + *((uint16 *)v7 + 1); *(uint16 *)&v9->charnum = *(uint16 *)(v7 + 3); @@ -442,8 +411,6 @@ void sub_818A5F(uint16 j) { // 0x818A5F uint16 v0 = j; int16 v3; OamEnt *v4; - int16 v6; - int16 v8; uint16 v10; uint16 v1 = oam_next_ptr; @@ -454,15 +421,11 @@ void sub_818A5F(uint16 j) { // 0x818A5F *(uint16 *)&v4->xcoord = v3; if ((v3 & 0x100) != 0) { int v5 = v1 >> 1; - R22_ = kOamExtra_Address_And_X8Large[v5]; - v6 = kOamExtra_X8Small_And_Large[v5] | *(uint16 *)RomPtr_RAM(R22_); - *(uint16 *)RomPtr_RAM(R22_) = v6; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v5]) |= kOamExtra_X8Small_And_Large[v5]; } if (*(int16 *)v2 < 0) { int v7 = v1 >> 1; - R22_ = kOamExtra_Address_And_X8Large[v7]; - v8 = kOamExtra_X8Small_And_Large[v7 + 1] | *(uint16 *)RomPtr_RAM(R22_); - *(uint16 *)RomPtr_RAM(R22_) = v8; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v7]) |= kOamExtra_X8Small_And_Large[v7 + 1]; } *(uint16 *)&v4->ycoord = R18_ + *((uint16 *)v2 + 1); *(uint16 *)&v4->charnum = *(uint16 *)(v2 + 3); @@ -477,8 +440,6 @@ void sub_818A5F(uint16 j) { // 0x818A5F void DrawSpritemapWithBaseTile(uint8 db, uint16 j) { // 0x818AB8 int16 v5; OamEnt *v6; - int16 v8; - int16 v10; uint16 v12; if (j == 0) @@ -495,15 +456,11 @@ void DrawSpritemapWithBaseTile(uint8 db, uint16 j) { // 0x818AB8 *(uint16 *)&v6->xcoord = v5; if ((v5 & 0x100) != 0) { int v7 = v3 >> 1; - R22_ = kOamExtra_Address_And_X8Large[v7]; - v8 = kOamExtra_X8Small_And_Large[v7] | *(uint16 *)RomPtr_RAM(R22_); - *(uint16 *)RomPtr_RAM(R22_) = v8; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v7]) |= kOamExtra_X8Small_And_Large[v7]; } if (*(int16 *)v4 < 0) { int v9 = v3 >> 1; - R22_ = kOamExtra_Address_And_X8Large[v9]; - v10 = kOamExtra_X8Small_And_Large[v9 + 1] | *(uint16 *)RomPtr_RAM(R22_); - *(uint16 *)RomPtr_RAM(R22_) = v10; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v9]) |= kOamExtra_X8Small_And_Large[v9 + 1]; } v6->ycoord = R18_ + v4[2]; *(uint16 *)&v6->charnum = R3_.addr | (R0_.addr + *(uint16 *)(v4 + 3)); @@ -558,8 +515,6 @@ void DrawSpritemapWithBaseTile2(uint8 db, uint16 j) { // 0x818B22 void DrawSpritemapWithBaseTileOffscreen(uint8 db, uint16 j) { // 0x818B96 int16 v6; OamEnt *v7; - int16 v9; - int16 v11; char v12; uint16 *v2 = (uint16 *)RomPtrWithBank(db, j); @@ -574,15 +529,11 @@ void DrawSpritemapWithBaseTileOffscreen(uint8 db, uint16 j) { // 0x818B96 *(uint16 *)&v7->xcoord = v6; if ((v6 & 0x100) != 0) { int v8 = v4 >> 1; - R22_ = kOamExtra_Address_And_X8Large[v8]; - v9 = kOamExtra_X8Small_And_Large[v8] | *(uint16 *)RomPtr_RAM(R22_); - *(uint16 *)RomPtr_RAM(R22_) = v9; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]) |= kOamExtra_X8Small_And_Large[v8]; } if (*(int16 *)v5 < 0) { int v10 = v4 >> 1; - R22_ = kOamExtra_Address_And_X8Large[v10]; - v11 = kOamExtra_X8Small_And_Large[v10 + 1] | *(uint16 *)RomPtr_RAM(R22_); - *(uint16 *)RomPtr_RAM(R22_) = v11; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]) |= kOamExtra_X8Small_And_Large[v10 + 1]; } v12 = v5[2]; @@ -608,10 +559,8 @@ void DrawSpritemapWithBaseTileOffscreen(uint8 db, uint16 j) { // 0x818B96 void DrawEnemyProjectileSpritemapWithBaseTile(uint8 db, uint16 j) { // 0x818C0A int16 v6; OamEnt *v7; - int16 v9; char v10; char v12; // cf - int16 v14; uint16 *v2 = (uint16 *)RomPtrWithBank(db, j); if (*v2) { @@ -625,9 +574,7 @@ void DrawEnemyProjectileSpritemapWithBaseTile(uint8 db, uint16 j) { // 0x818C0A *(uint16 *)&v7->xcoord = v6; if ((v6 & 0x100) != 0) { int v8 = v4 >> 1; - R22_ = kOamExtra_Address_And_X8Large[v8]; - v9 = kOamExtra_X8Small_And_Large[v8] | *(uint16 *)RomPtr_RAM(R22_); - *(uint16 *)RomPtr_RAM(R22_) = v9; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]) |= kOamExtra_X8Small_And_Large[v8]; } v10 = v5[2]; if (v10 >= 0) { @@ -648,9 +595,7 @@ LABEL_10: v12 = 0; if (*(int16 *)v5 < 0) { int v13 = v4 >> 1; - R22_ = kOamExtra_Address_And_X8Large[v13]; - v14 = kOamExtra_X8Small_And_Large[v13 + 1] | *(uint16 *)RomPtr_RAM(R22_); - *(uint16 *)RomPtr_RAM(R22_) = v14; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v13]) |= kOamExtra_X8Small_And_Large[v13 + 1]; } *(uint16 *)&v7->charnum = R28_ | (R26_ + v12 + *(uint16 *)(v5 + 3)); v4 = (v4 + 4) & 0x1FF; @@ -666,10 +611,8 @@ LABEL_10: void DrawEnemyProjectileSpritemapWithBaseTileOffscreen(uint8 db, uint16 j) { // 0x818C7F int16 v6; OamEnt *v7; - int16 v9; char v10; char v12; // cf - int16 v14; uint16 *v2 = (uint16 *)RomPtrWithBank(db, j); if (*v2) { @@ -683,9 +626,7 @@ void DrawEnemyProjectileSpritemapWithBaseTileOffscreen(uint8 db, uint16 j) { // *(uint16 *)&v7->xcoord = v6; if ((v6 & 0x100) != 0) { int v8 = v4 >> 1; - R22_ = kOamExtra_Address_And_X8Large[v8]; - v9 = kOamExtra_X8Small_And_Large[v8] | *(uint16 *)RomPtr_RAM(R22_); - *(uint16 *)RomPtr_RAM(R22_) = v9; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]) |= kOamExtra_X8Small_And_Large[v8]; } v10 = v5[2]; if (v10 >= 0) { @@ -707,9 +648,7 @@ LABEL_10: v12 = 0; if (*(int16 *)v5 < 0) { int v13 = v4 >> 1; - R22_ = kOamExtra_Address_And_X8Large[v13]; - v14 = kOamExtra_X8Small_And_Large[v13 + 1] | *(uint16 *)RomPtr_RAM(R22_); - *(uint16 *)RomPtr_RAM(R22_) = v14; + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v13]) |= kOamExtra_X8Small_And_Large[v13 + 1]; } *(uint16 *)&v7->charnum = R28_ | (R26_ + v12 + *(uint16 *)(v5 + 3)); v4 = (v4 + 4) & 0x1FF; diff --git a/src/sm_82.c b/src/sm_82.c index 09602cc..4046fdd 100644 --- a/src/sm_82.c +++ b/src/sm_82.c @@ -220,9 +220,9 @@ void InitPpuForGameplay(void) { // 0x8281DD WriteReg(SETINI, 0); reg_SETINI = 0; oam_next_ptr = 0; - memset7E(ADDR16_OF_RAM(ram3000), 0, 0x7FEu); - memset7E(ADDR16_OF_RAM(ram4000), 0x6Fu, 0x7FEu); - memset7E(ADDR16_OF_RAM(ram4000.bg2_tilemap), 0x2C0Fu, 0xFEu); + memset7E((uint16*)&ram3000, 0, 0x7FEu); + memset7E((uint16 *)&ram4000, 0x6Fu, 0x7FEu); + memset7E(ram4000.bg2_tilemap, 0x2C0Fu, 0xFEu); } #define kInitialPalette ((uint16*)RomPtr(0x9a8000)) @@ -5443,7 +5443,7 @@ void LoadControllerOptionsFromControllerBindings(void) { // 0x82F4DC uint16 v0 = 0; do { int v1 = v0 >> 1; - v2 = *(uint16 *)RomPtr_7E(off_82F54A[v1]); + v2 = *(uint16 *)&g_ram[off_82F54A[v1]]; if ((v2 & kButton_X) != 0) { LABEL_9: enemy_projectile_F[v1 + 13] = 0; @@ -5480,13 +5480,12 @@ static const Buttons word_82F575[9] = { // 0x82F558 kButton_Right, }; uint8 OptionsMenuFunc8(void) { - - uint16 v0 = 0, v2; + int v0 = 0, v2; do { v2 = v0; - *(uint16 *)RomPtr_7E(off_82F54A[v0 >> 1]) = word_82F575[(uint16)(2 * enemy_projectile_F[(v0 >> 1) + 13]) >> 1]; + *(uint16 *)&g_ram[off_82F54A[v0 >> 1]] = word_82F575[(uint16)(2 * enemy_projectile_F[(v0 >> 1) + 13]) >> 1]; v0 += 2; - } while ((int16)(v2 - 12) < 0); + } while (v2 < 12); return 0; } #define g_word_82F639 ((uint16*)RomPtr(0x82f639)) diff --git a/src/sm_84.c b/src/sm_84.c index cf49b1e..b0894cf 100644 --- a/src/sm_84.c +++ b/src/sm_84.c @@ -611,7 +611,7 @@ void ProcessPlmDrawInstruction(uint16 v0) { // 0x84861E do { level_data[v3 >> 1] = *(uint16 *)RomPtr_84orRAM(v5); v5 += 2; - v3 += room_width_in_blocks + room_width_in_blocks; + v3 += room_width_in_blocks * 2; --R22_; } while (R22_); } else { @@ -1994,7 +1994,7 @@ uint8 PlmSetup_ClearShitroidInvisibleWall(uint16 j) { // 0x84B551 v2 = 10; do { level_data[v1 >> 1] &= 0xFFFu; - v1 += room_width_in_blocks + room_width_in_blocks; + v1 += room_width_in_blocks * 2; --v2; } while (v2); return 0; @@ -2007,7 +2007,7 @@ uint8 PlmSetup_B767_ClearShitroidInvisibleWall(uint16 j) { // 0x84B56F v2 = 10; do { level_data[v1 >> 1] = level_data[v1 >> 1] & 0xFFF | 0x8000; - v1 += room_width_in_blocks + room_width_in_blocks; + v1 += room_width_in_blocks * 2; --v2; } while (v2); return 0; @@ -2047,12 +2047,12 @@ uint8 PlmSetup_B76F_SaveStation(uint16 j) { // 0x84B5EE uint8 PlmSetup_MotherBrainRoomEscapeDoor(uint16 j) { // 0x84B5F8 uint16 v1 = plm_block_indices[j >> 1]; WriteLevelDataBlockTypeAndBts(v1, 0x9001u); - uint16 v2 = room_width_in_blocks + room_width_in_blocks + v1; + uint16 v2 = room_width_in_blocks * 2 + v1; WriteLevelDataBlockTypeAndBts(v2, 0xD0FFu); - uint16 v3 = room_width_in_blocks + room_width_in_blocks + v2; + uint16 v3 = room_width_in_blocks * 2 + v2; WriteLevelDataBlockTypeAndBts(v3, 0xD0FFu); WriteLevelDataBlockTypeAndBts( - room_width_in_blocks + room_width_in_blocks + v3, + room_width_in_blocks * 2 + v3, 0xD0FFu); return 0; } @@ -2214,10 +2214,10 @@ uint16 PlmInstr_SetCrittersEscapedEvent(uint16 j, uint16 k) { // 0x84B9B9 uint8 PlmSetup_B9ED_CrittersEscapeBlock(uint16 j) { // 0x84B9C5 uint16 v1 = plm_block_indices[j >> 1]; WriteLevelDataBlockTypeAndBts(v1, 0xC04Fu); - uint16 v2 = room_width_in_blocks + room_width_in_blocks + v1; + uint16 v2 = room_width_in_blocks * 2 + v1; WriteLevelDataBlockTypeAndBts(v2, 0xD0FFu); WriteLevelDataBlockTypeAndBts( - room_width_in_blocks + room_width_in_blocks + v2, + room_width_in_blocks * 2 + v2, 0xD0FFu); return 0; } @@ -2225,11 +2225,11 @@ uint8 PlmSetup_B9ED_CrittersEscapeBlock(uint16 j) { // 0x84B9C5 uint8 sub_84B9F1(uint16 j) { // 0x84B9F1 uint16 v1 = plm_block_indices[j >> 1]; level_data[v1 >> 1] = level_data[v1 >> 1] & 0xFFF | 0x8000; - uint16 v2 = room_width_in_blocks + room_width_in_blocks + v1; + uint16 v2 = room_width_in_blocks * 2 + v1; level_data[v2 >> 1] = level_data[v2 >> 1] & 0xFFF | 0x8000; uint16 v3 = room_width_in_blocks + room_width_in_blocks + v2; level_data[v3 >> 1] = level_data[v3 >> 1] & 0xFFF | 0x8000; - int v4 = (uint16)(room_width_in_blocks + room_width_in_blocks + v3) >> 1; + int v4 = (uint16)(room_width_in_blocks * 2 + v3) >> 1; level_data[v4] = level_data[v4] & 0xFFF | 0x8000; return 0; } @@ -3142,12 +3142,12 @@ uint16 PlmInstr_MoveUpAndMakeBlueDoorFacingLeft(uint16 j, uint16 k) { // 0x84D7 } void sub_84D7EF(uint16 k) { // 0x84D7EF - uint16 v1 = room_width_in_blocks + room_width_in_blocks + k; + uint16 v1 = room_width_in_blocks * 2 + k; WriteLevelDataBlockTypeAndBts(v1, 0xD0FFu); - uint16 v2 = room_width_in_blocks + room_width_in_blocks + v1; + uint16 v2 = room_width_in_blocks * 2 + v1; WriteLevelDataBlockTypeAndBts(v2, 0xD0FEu); WriteLevelDataBlockTypeAndBts( - room_width_in_blocks + room_width_in_blocks + v2, + room_width_in_blocks * 2 + v2, 0xD0FDu); } @@ -3212,69 +3212,70 @@ void PlmPreInstr_GotoLinkIfShotWithSuperMissile(uint16 k) { // 0x84DB64 plm_instruction_timer[v2] = 1; } +void SetPlmVarPtr(uint16 k, uint16 a) { + *(uint16 *)&g_ram[plm_variable[k >> 1]] = a; +} + uint16 PlmInstr_DamageDraygonTurret(uint16 j, uint16 k) { // 0x84DB8E - *(uint16 *)RomPtr_7E(plm_variable[k >> 1]) = 1; + SetPlmVarPtr(k, 1); uint16 v2 = plm_block_indices[k >> 1]; WriteLevelDataBlockTypeAndBts(v2, 0xA003u); WriteLevelDataBlockTypeAndBts( - room_width_in_blocks + room_width_in_blocks + v2, + room_width_in_blocks * 2 + v2, 0xA003u); return j; } uint16 PlmInstr_DamageDraygonTurretFacingDownRight(uint16 j, uint16 k) { // 0x84DBB8 - *(uint16 *)RomPtr_7E(plm_variable[k >> 1]) = 1; + SetPlmVarPtr(k, 1); uint16 v2 = plm_block_indices[k >> 1]; WriteLevelDataBlockTypeAndBts(v2, 0xA003u); WriteLevelDataBlockTypeAndBts(v2 + 2, 0xA003u); uint16 v3 = plm_block_indices[plm_id >> 1]; - uint16 v4 = room_width_in_blocks + room_width_in_blocks + v3; + uint16 v4 = room_width_in_blocks * 2 + v3; WriteLevelDataBlockTypeAndBts(v4, 0xA003u); WriteLevelDataBlockTypeAndBts(v4 + 2, 0); return j; } uint16 PlmInstr_DamageDraygonTurretFacingUpRight(uint16 j, uint16 k) { // 0x84DBF7 - *(uint16 *)RomPtr_7E(plm_variable[k >> 1]) = 1; + SetPlmVarPtr(k, 1); uint16 v2 = plm_block_indices[k >> 1]; WriteLevelDataBlockTypeAndBts(v2, 0xA003u); WriteLevelDataBlockTypeAndBts(v2 + 2, 0); - uint16 v3 = plm_block_indices[plm_id >> 1]; - uint16 v4 = room_width_in_blocks + room_width_in_blocks + v3; + uint16 v4 = room_width_in_blocks * 2 + v2; WriteLevelDataBlockTypeAndBts(v4, 0xA003u); WriteLevelDataBlockTypeAndBts(v4 + 2, 0xA003u); return j; } uint16 PlmInstr_DamageDraygonTurret2(uint16 j, uint16 k) { // 0x84DC36 - *(uint16 *)RomPtr_7E(plm_variable[k >> 1]) = 1; + SetPlmVarPtr(k, 1); uint16 v2 = plm_block_indices[k >> 1]; WriteLevelDataBlockTypeAndBts(v2, 0xA003u); WriteLevelDataBlockTypeAndBts( - room_width_in_blocks + room_width_in_blocks + v2, + room_width_in_blocks * 2 + v2, 0xA003u); return j; } uint16 PlmInstr_DamageDraygonTurretFacingDownLeft(uint16 j, uint16 k) { // 0x84DC60 - *(uint16 *)RomPtr_7E(plm_variable[k >> 1]) = 1; + SetPlmVarPtr(k, 1); uint16 v2 = plm_block_indices[k >> 1]; WriteLevelDataBlockTypeAndBts(v2, 0xA003u); WriteLevelDataBlockTypeAndBts(v2 - 2, 0xA003u); - uint16 v3 = plm_block_indices[plm_id >> 1]; - uint16 v4 = room_width_in_blocks + room_width_in_blocks + v3; + uint16 v4 = room_width_in_blocks * 2 + v2; WriteLevelDataBlockTypeAndBts(v4, 0xA003u); WriteLevelDataBlockTypeAndBts(v4 - 2, 0); return j; } uint16 PlmInstr_DamageDraygonTurretFacingUpLeft(uint16 j, uint16 k) { // 0x84DC9F - *(uint16 *)RomPtr_7E(plm_variable[k >> 1]) = 1; + SetPlmVarPtr(k, 1); uint16 v2 = plm_block_indices[k >> 1]; WriteLevelDataBlockTypeAndBts(v2, 0xA003u); WriteLevelDataBlockTypeAndBts(v2 - 2, 0); - uint16 v3 = plm_block_indices[plm_id >> 1]; - uint16 v4 = room_width_in_blocks + room_width_in_blocks + v3; + uint16 v4 = v2 + room_width_in_blocks * 2; WriteLevelDataBlockTypeAndBts(v4, 0xA003u); WriteLevelDataBlockTypeAndBts(v4 - 2, 0xA003u); return j; @@ -3286,9 +3287,7 @@ uint8 PlmSetup_DraygonCannonFacingRight(uint16 j) { // 0x84DE94 plm_room_arguments[v1] = 0; uint16 v2 = plm_block_indices[v1]; WriteLevelDataBlockTypeAndBts(v2, 0xC044u); - WriteLevelDataBlockTypeAndBts( - room_width_in_blocks + room_width_in_blocks + v2, - 0xD0FFu); + WriteLevelDataBlockTypeAndBts(room_width_in_blocks * 2 + v2, 0xD0FFu); return 0; } @@ -3299,9 +3298,7 @@ uint8 PlmSetup_DraygonCannonFacingDiagonalRight(uint16 j) { // 0x84DEB9 uint16 v2 = plm_block_indices[v1]; WriteLevelDataBlockTypeAndBts(v2, 0xC044u); WriteLevelDataBlockTypeAndBts(v2 + 2, 0x50FFu); - uint16 v3 = room_width_in_blocks - + room_width_in_blocks - + plm_block_indices[v1]; + uint16 v3 = room_width_in_blocks * 2 + v2; WriteLevelDataBlockTypeAndBts(v3, 0xD0FFu); WriteLevelDataBlockTypeAndBts(v3 + 2, 0xD0FFu); return 0; @@ -3313,9 +3310,7 @@ uint8 PlmSetup_DraygonCannonFacingLeft(uint16 j) { // 0x84DEF0 plm_room_arguments[v1] = 0; uint16 v2 = plm_block_indices[v1]; WriteLevelDataBlockTypeAndBts(v2, 0xC044u); - WriteLevelDataBlockTypeAndBts( - room_width_in_blocks + room_width_in_blocks + v2, - 0xD0FFu); + WriteLevelDataBlockTypeAndBts(room_width_in_blocks * 2 + v2, 0xD0FFu); return 0; } @@ -3326,9 +3321,7 @@ uint8 PlmSetup_DraygonCannonFacingDiagonalLeft(uint16 j) { // 0x84DF15 uint16 v2 = plm_block_indices[v1]; WriteLevelDataBlockTypeAndBts(v2, 0xC044u); WriteLevelDataBlockTypeAndBts(v2 - 2, 0x5001u); - uint16 v3 = room_width_in_blocks - + room_width_in_blocks - + plm_block_indices[v1]; + uint16 v3 = room_width_in_blocks * 2 + v2; WriteLevelDataBlockTypeAndBts(v3, 0xD0FFu); WriteLevelDataBlockTypeAndBts(v3 - 2, 0xD0FFu); return 0; diff --git a/src/sm_86.c b/src/sm_86.c index e25da20..58a737c 100644 --- a/src/sm_86.c +++ b/src/sm_86.c @@ -1135,7 +1135,7 @@ uint8 EnemyProjectileBlockCollisition_Horiz(uint16 k) { // 0x8688B6 R34 = v4; uint16 v5 = 2 * (prod + (v4 >> 4)); while (!(EnemyProjectileBlockCollisition_CheckHorizontal(v5) & 1)) { - v5 += room_width_in_blocks + room_width_in_blocks; + v5 += room_width_in_blocks * 2; if ((--R26_ & 0x8000u) != 0) { int v6 = k >> 1; enemy_projectile_1A27[v6] = R22_; diff --git a/src/sm_88.c b/src/sm_88.c index 082e142..6dbc982 100644 --- a/src/sm_88.c +++ b/src/sm_88.c @@ -1811,7 +1811,7 @@ void HdmaobjPreInstr_SkyLandBG2XscrollInner(uint16 k) { // 0x88ADC2 uint16 v1 = 0; do { uint16 scroll_subspeed = kHdmaScrollEntrys[v1].scroll_subspeed; - uint8 *v3 = RomPtr_7E(kHdmaScrollEntrys[v1].hdma_data_table_entry); + uint8 *v3 = &g_ram[kHdmaScrollEntrys[v1].hdma_data_table_entry]; bool v4 = __CFADD__uint16(*(uint16 *)v3, scroll_subspeed); *(uint16 *)v3 += scroll_subspeed; *((uint16 *)v3 + 1) += v4 + kHdmaScrollEntrys[v1++].scroll_speed; diff --git a/src/sm_8b.c b/src/sm_8b.c index f86c967..b7510d9 100644 --- a/src/sm_8b.c +++ b/src/sm_8b.c @@ -66,7 +66,7 @@ void SetupPpuForTitleSequence(void) { // 0x8B8000 WriteReg(COLDATA, 0xE0u); WriteReg(SETINI, 0); reg_SETINI = 0; - memset7E(0x3000u, 0, 0x7FEu); + memset(g_ram + 0x3000u, 0, 0x7FEu); oam_next_ptr = 0; menu_option_index = 0; screen_fade_delay = 0; @@ -141,7 +141,7 @@ void SetupPpu_Intro(void) { // 0x8B80DA reg_COLDATA[1] = 64; reg_COLDATA[2] = 0x80; reg_MOSAIC = 0; - memset7E(0x3000u, 0x2Fu, 0x7FEu); + memset7E((uint16*)(g_ram + 0x3000), 0x2Fu, 0x7FEu); oam_next_ptr = 0; cinematic_var5 = 0; cinematic_var6 = 256; diff --git a/src/sm_94.c b/src/sm_94.c index c7b8ead..6a94bb2 100644 --- a/src/sm_94.c +++ b/src/sm_94.c @@ -368,7 +368,7 @@ void PostGrappleCollisionDetect_Right(void) { // 0x94834F if (v3 >= distance_to_eject_samus_left) distance_to_eject_samus_left = v3; } - v1 += room_width_in_blocks + room_width_in_blocks; + v1 += room_width_in_blocks * 2; --R26_; } while ((R26_ & 0x8000u) == 0); } @@ -394,7 +394,7 @@ void PostGrappleCollisionDetect_Left(void) { // 0x9483B1 if (v3 >= distance_to_eject_samus_right) distance_to_eject_samus_right = v3; } - v1 += room_width_in_blocks + room_width_in_blocks; + v1 += room_width_in_blocks * 2; --R26_; } while ((R26_ & 0x8000u) == 0); } @@ -1089,7 +1089,7 @@ uint8 BlockColl_Handle_Horiz(void) { // 0x949543 R32 = v1; uint16 v2 = 2 * (prod + (v1 >> 4)); while (!(BlockColl_Horiz_CheckColl(v2) & 1)) { - v2 += room_width_in_blocks + room_width_in_blocks; + v2 += room_width_in_blocks * 2; if ((--R26_ & 0x8000u) != 0) return 0; } @@ -1678,7 +1678,7 @@ uint16 BlockColl_GetBlockIndexAbove(uint16 k) { // 0x949D34 } uint16 BlockColl_GetBlockIndexRight(uint16 k) { // 0x949D3E - return room_width_in_blocks + room_width_in_blocks + k + 1 + 1; + return room_width_in_blocks * 2 + k + 1 + 1; } uint16 BlockColl_GetBlockIndexLeft(uint16 k) { // 0x949D49 @@ -1686,7 +1686,7 @@ uint16 BlockColl_GetBlockIndexLeft(uint16 k) { // 0x949D49 } uint16 BlockColl_GetBlockIndexBelow(uint16 k) { // 0x949D4E - return room_width_in_blocks + room_width_in_blocks + k + 1 + 1; + return room_width_in_blocks * 2 + k + 1 + 1; } uint8 ClearCarry_9(void) { // 0x949D59 @@ -1847,7 +1847,7 @@ void BlockFunc_A11A(uint16 a) { // 0x94A11A v4 = R28_ - R26_; do { BlockBombedReact(v3); - v3 += room_width_in_blocks + room_width_in_blocks; + v3 += room_width_in_blocks * 2; --v4; } while (v4 >= 0); } @@ -1986,7 +1986,7 @@ uint8 BlockCollNoWaveBeamHoriz(uint16 k) { // 0x94A23B return 0; do { BlockShotReactHoriz(v8); - v8 += room_width_in_blocks + room_width_in_blocks; + v8 += room_width_in_blocks * 2; --R38; } while ((R38 & 0x8000u) == 0); if ((R40 & 0x8000u) == 0) @@ -2075,7 +2075,7 @@ uint8 BlockCollWaveBeamHoriz(uint16 k) { // 0x94A352 v10 = v8; do { BlockShotReactHoriz(v10); - v10 += room_width_in_blocks + room_width_in_blocks; + v10 += room_width_in_blocks * 2; --R38; } while ((R38 & 0x8000u) == 0); } diff --git a/src/sm_a0.c b/src/sm_a0.c index 44faad0..d6a473d 100644 --- a/src/sm_a0.c +++ b/src/sm_a0.c @@ -525,8 +525,8 @@ void LoadEnemyTileData(void) { // 0xA08C6C gEnemySpawnData(i)->some_flag = kStandardSpriteTiles[(i >> 1) + 3072]; if (enemy_tile_load_data_write_pos) { uint16 v1 = 0; + EnemyTileLoadData *load_data = enemy_tile_load_data; do { - EnemyTileLoadData *load_data = (EnemyTileLoadData *)((char *)enemy_tile_load_data + v1); uint16 v2 = load_data->tile_data_ptr.addr; R18_ = load_data->tile_data_size + v2; uint16 v3 = load_data->offset_into_ram; @@ -536,6 +536,7 @@ void LoadEnemyTileData(void) { // 0xA08C6C v3 += 8; v2 += 8; } while (v2 != R18_); + load_data++; v1 += 7; } while (v1 != enemy_tile_load_data_write_pos); enemy_tile_load_data_write_pos = 0; @@ -574,12 +575,6 @@ void TransferEnemyTilesToVramAndInit(void) { // 0xA08CD7 } void ProcessEnemyTilesets(void) { // 0xA08D64 - int16 v6; - EnemyTileset *v7; - EnemyDef_A2 *v8; - EnemyTileset *v12; - EnemyTileset *EnemyTileset; - enemy_tile_load_data_write_pos = 0; g_word_7E001E = 2048; enemy_def_ptr[0] = 0; @@ -596,50 +591,28 @@ void ProcessEnemyTilesets(void) { // 0xA08D64 enemy_gfxdata_vram_ptr[3] = 0; enemy_gfx_data_write_ptr = 0; next_enemy_tiles_index = 0; - uint16 v0 = room_enemy_tilesets_ptr; - for (R28_ = room_enemy_tilesets_ptr; ; R28_ += 4) { - uint16 enemy_def = get_EnemyTileset(v0)->enemy_def; - if (enemy_def == 0xFFFF) - break; - uint16 *EnemyDef_A2 = (uint16 *)get_EnemyDef_A2(enemy_def); - R18_ = *EnemyDef_A2; - R20_ = EnemyDef_A2[1]; - enemy_population_ptr = EnemyDef_A2[6]; - EnemyTileset = get_EnemyTileset(R28_); - R22_ = Mult32(LOBYTE(EnemyTileset->vram_dst) + 8) - 15872; - uint8 v13 = enemy_population_ptr; - varE2E = 16; - uint16 v4 = R22_; - uint16 v5 = R20_; - do { - v6 = *(uint16 *)RomPtrWithBank(v13, v5); - *(uint16 *)RomPtr_7E(v4) = v6; - v4 += 2; - v5 += 2; - --varE2E; - } while (varE2E); - v7 = get_EnemyTileset(R28_); - v8 = get_EnemyDef_A2(v7->enemy_def); - R22_ = v8->tile_data.addr; - R26_ = v8->tile_data.bank; - uint16 v9 = enemy_tile_load_data_write_pos; - *(uint16 *)((char *)&enemy_tile_load_data[0].tile_data_size + enemy_tile_load_data_write_pos) = R18_ & 0x7FFF; - *(VoidP *)((char *)&enemy_tile_load_data[0].tile_data_ptr.addr + enemy_tile_load_data_write_pos) = R22_; + EnemyTileset *ET = get_EnemyTileset(room_enemy_tilesets_ptr); + EnemyTileLoadData *LD = enemy_tile_load_data; + for (; ET->enemy_def != 0xffff; ET++) { + EnemyDef_A2 *ED = get_EnemyDef_A2(ET->enemy_def); + memcpy(&target_palettes[(LOBYTE(ET->vram_dst) + 8) * 16], + RomPtrWithBank(ED->bank, ED->palette_ptr), 32); + varE2E = 0; + LD->tile_data_size = ED->tile_data_size & 0x7FFF; + LD->tile_data_ptr = ED->tile_data; uint16 v10 = g_word_7E001E; - if ((R18_ & 0x8000u) != 0) - v10 = (uint16)(get_EnemyTileset(R28_)->vram_dst & 0x3000) >> 3; - *(uint16 *)((char *)&enemy_tile_load_data[0].offset_into_ram + v9) = v10; - *(&enemy_tile_load_data[0].tile_data_ptr.bank + v9) = R26_; + if ((ED->tile_data_size & 0x8000u) != 0) + v10 = (uint16)(ET->vram_dst & 0x3000) >> 3; + LD->offset_into_ram = v10; enemy_tile_load_data_write_pos += 7; + LD++; uint16 v11 = enemy_gfx_data_write_ptr; enemy_gfxdata_tiles_index[enemy_gfx_data_write_ptr >> 1] = next_enemy_tiles_index; - enemy_def_ptr[v11 >> 1] = get_EnemyTileset(R28_)->enemy_def; - enemy_gfxdata_vram_ptr[v11 >> 1] = get_EnemyTileset(R28_)->vram_dst; + enemy_def_ptr[v11 >> 1] = ET->enemy_def; + enemy_gfxdata_vram_ptr[v11 >> 1] = ET->vram_dst; enemy_gfx_data_write_ptr += 2; - next_enemy_tiles_index += R18_ >> 5; - v12 = get_EnemyTileset(R28_); - g_word_7E001E += get_EnemyDef_A2(v12->enemy_def)->tile_data_size; - v0 = R28_ + 4; + next_enemy_tiles_index += ED->tile_data_size >> 5; + g_word_7E001E += ED->tile_data_size; } } @@ -2159,40 +2132,18 @@ void NormalEnemyFrozenAI(void) { // 0xA0957E } void ProcessExtendedTilemap(uint8 db) { // 0xA096CA - int16 v3; - - uint16 v0 = R22_ + 2; + uint8 *p = RomPtrWithBank(db, R22_ + 2); while (1) { - uint8 *v1 = RomPtrWithBank(db, v0); - if (*(uint16 *)v1 == 0xFFFF) + uint16 v2 = *(uint16 *)p; + if (v2 == 0xFFFF) break; - uint16 v2 = *(uint16 *)v1; - remaining_enemy_hitbox_entries = *((uint16 *)v1 + 1); - v0 += 4; - if (remaining_enemy_hitbox_entries & 1) { - do { - v3 = *(uint16 *)RomPtrWithBank(db, v0); - *(uint16 *)RomPtr_7E(v2) = v3; - v2 += 2; - v0 += 2; - --remaining_enemy_hitbox_entries; - } while (remaining_enemy_hitbox_entries); - } else { - do { - uint8 *v4 = RomPtrWithBank(db, v0); - uint8 *v5 = RomPtr_7E(v2); - *(uint16 *)v5 = *(uint16 *)v4; - *((uint16 *)v5 + 1) = *((uint16 *)v4 + 1); - v2 += 4; - v0 += 4; - while ((int16)(v2 - 10240) >= 0) - ; - --remaining_enemy_hitbox_entries; - --remaining_enemy_hitbox_entries; - } while (remaining_enemy_hitbox_entries); - } + int n = *((uint16 *)p + 1); + p += 4; + memcpy(g_ram + v2, p, n * 2); + p += n * 2; } ++nmi_flag_bg2_enemy_vram_transfer; + remaining_enemy_hitbox_entries = 0; } void QueueEnemyBG2TilemapTransfers(void) { // 0xA09726 @@ -4018,7 +3969,7 @@ uint8 EnemyFunc_BBBF(uint16 k) { // 0xA0BBBF R34 = v3; uint16 v4 = 2 * (prod + (v3 >> 4)); while ((level_data[v4 >> 1] & 0x8000u) == 0) { - v4 += room_width_in_blocks + room_width_in_blocks; + v4 += room_width_in_blocks * 2; if ((--R26_ & 0x8000u) != 0) return 0; } @@ -4524,7 +4475,7 @@ uint8 Enemy_MoveRight_IgnoreSlopes_Inner(uint16 k) { // 0xA0C6AD R26_ = v5; uint16 v6 = 2 * (prod + (v5 >> 4)); while (!(EnemyBlockCollReact_Horiz(v6) & 1)) { - v6 += room_width_in_blocks + room_width_in_blocks; + v6 += room_width_in_blocks * 2; if ((--R28_ & 0x8000u) != 0) { EnemyData *v7 = gEnemyData(k); bool v8 = __CFADD__uint16(v7->x_subpos, R18_); diff --git a/src/sm_cpu_infra.c b/src/sm_cpu_infra.c index 86f9158..338fff8 100644 --- a/src/sm_cpu_infra.c +++ b/src/sm_cpu_infra.c @@ -370,10 +370,11 @@ bool HookedFunctionRts(int is_long) { } static void VerifySnapshotsEq(Snapshot *b, Snapshot *a, Snapshot *prev) { + memcpy(&b->ram[0x0], &a->ram[0x0], 0x34); // R18, R20, R22 etc + memcpy(&b->ram[0x1f5b], &a->ram[0x1f5b], 0x100 - 0x5b); // stacck memcpy(&b->ram[0x44], &a->ram[0x44], 3); // decompress_dst_tmp memcpy(&b->ram[0x19b3], &a->ram[0x19b3], 1); // mode7_spawn_param - memcpy(&b->ram[0x12], &a->ram[0x12], 6); // R18, R20, R22 memcpy(&b->ram[0x1993], &a->ram[0x1993], 2); // enemy_projectile_init_param memcpy(&b->ram[0x49], &a->ram[0x49], 1); // decompress_src.bank memcpy(&b->ram[0x1B9D], &a->ram[0x1B9D], 2); // cinematic_spawn_param @@ -381,12 +382,12 @@ static void VerifySnapshotsEq(Snapshot *b, Snapshot *a, Snapshot *prev) { memcpy(&b->ram[0xA82], &a->ram[0xA82], 2); // xray_angle memcpy(&b->ram[0xad], &a->ram[0xad], 2); // ptr_to_retaddr_parameters memcpy(&b->ram[0x641], &a->ram[0x641], 2); // apu_attempts_countdown - memcpy(&b->ram[0x0], &a->ram[0x0], 3); // R0 memcpy(&b->ram[0x5e9], &a->ram[0x5e9], 4); // mult_tmp memcpy(&b->ram[0x19b3], &a->ram[0x19b3], 2); // mode7_spawn_param memcpy(&a->ram[0x611], &b->ram[0x611], 6); // coroutine_state (copy from mine to theirs) memcpy(&a->ram[0x77e], &b->ram[0x77e], 5); // my counter + memcpy(&a->ram[0xe20], &b->ram[0xe20], 2); // enemy_population_ptr if (memcmp(b->ram, a->ram, 0x20000)) {