diff --git a/src/funcs.h b/src/funcs.h index fe12a51..d323e99 100644 --- a/src/funcs.h +++ b/src/funcs.h @@ -395,7 +395,7 @@ void DrawPauseMenuDuringFadeIn(void); void DrawPauseMenuDuringFadeout(void); void DrawPauseScreenSpriteAnim(uint16 a, uint16 k, uint16 j); void DrawRoomSelectMap(void); -void DrawRoomSelectMapAreaLabel(LongPtr r0); +void DrawRoomSelectMapAreaLabel(uint16 *dst); void DrawSaveStationMapIcon(uint16 a, uint16 k, uint16 r3); void DrawSimpleMapIcons(uint16 a, uint16 k, uint16 r3); void EnsureSamusDrawnEachFrame(void); @@ -860,7 +860,7 @@ void LayerBlendingHandler(void); void MoveXrayDown(void); void MoveXrayUp(void); void RoomCode_ScrollingSkyLand(void); -void RoomMainAsm_ScrollingSky(LongPtr ptr); +void RoomMainAsm_ScrollingSky(const uint16 *src); void RoomMainAsm_ScrollingSkyOcean(void); void RoomSetupAsm_ScrollingSkyOcean(void); void SpawnBG3ScrollHdmaObject(void); @@ -3563,7 +3563,7 @@ uint8 Shitroid_CheckIfOnScreen(uint16 k); uint8 Shitroid_Func_1(uint16 k, uint16 j); uint8 Shitroid_Func_2(uint16 k, Rect16U rect); uint8 Shitroid_Func_27(uint16 k); -void CopyMoveCorpseRottingRotEntry(LongPtr r20, uint16 a, uint16 r18); +void CopyMoveCorpseRottingRotEntry(const uint16 *r20, uint16 a, uint16 r18); void CorpseRottingRotEntryFinishedHook(void); void DeadMonsters_Func_1(uint16 k); void DeadMonsters_Func_2(uint16 k); diff --git a/src/sm_80.c b/src/sm_80.c index 3f4ee9d..36caa50 100644 --- a/src/sm_80.c +++ b/src/sm_80.c @@ -2093,8 +2093,6 @@ void UploadLevelDataColumn(void) { // 0x80A9DB } void UpdateLevelOrBackgroundDataColumn(uint16 k) { // 0x80A9DE - LongPtr r54; - if (irq_enable_mode7) return; @@ -2103,8 +2101,7 @@ void UpdateLevelOrBackgroundDataColumn(uint16 k) { // 0x80A9DE uint16 v2 = 2 * (prod + v1) + 2; if (k) v2 += 0x9600; - r54.addr = v2; - r54.bank = 127; + const uint16 *r54 = (const uint16 * )(g_ram + 0x10000 + v2); uint16 v3 = (4 * vram_blocks_to_update_y_block) & 0x3C; *(uint16 *)((uint8 *)&bg1_update_col_wrapped_size + k) = v3; *(uint16 *)((uint8 *)&bg1_update_col_unwrapped_size + k) = (v3 ^ 0x3F) + 1; @@ -2134,7 +2131,7 @@ void UpdateLevelOrBackgroundDataColumn(uint16 k) { // 0x80A9DE uint16 v9 = 0; uint16 var939 = 16; do { - uint16 var93B = IndirReadWord(r54, v9); + uint16 var93B = r54[v9 >> 1]; uint16 v10 = var93B & 0x3FF; uint16 v17 = v9; uint16 v11 = var937; @@ -2185,7 +2182,6 @@ void UpdateLevelDataRow(void) { // 0x80AB75 } void UpdateLevelOrBackgroundDataRow(uint16 v0) { // 0x80AB78 - LongPtr r54; if (irq_enable_mode7) return; uint16 prod = Mult8x8(blocks_to_update_y_block, room_width_in_blocks); @@ -2193,8 +2189,7 @@ void UpdateLevelOrBackgroundDataRow(uint16 v0) { // 0x80AB78 uint16 v2 = 2 * (prod + v1) + 2; if (v0) v2 -= 27136; - r54.addr = v2; - r54.bank = 127; + const uint16 *r54 = (const uint16 *)(g_ram + 0x10000 + v2); uint16 var933 = vram_blocks_to_update_x_block & 0xF; *(uint16 *)((uint8 *)&bg1_update_row_unwrapped_size + v0) = 4 * (16 - var933); *(uint16 *)((uint8 *)&bg1_update_row_wrapped_size + v0) = 4 * (var933 + 1); @@ -2229,7 +2224,7 @@ void UpdateLevelOrBackgroundDataRow(uint16 v0) { // 0x80AB78 uint16 v9 = 0; uint16 var939 = 17; do { - uint16 var93B = IndirReadWord(r54, v9); + uint16 var93B = r54[v9 >> 1]; uint16 v10 = var93B & 0x3FF; uint16 v17 = v9; uint16 v11 = var937; diff --git a/src/sm_81.c b/src/sm_81.c index 671b146..409a2cb 100644 --- a/src/sm_81.c +++ b/src/sm_81.c @@ -117,37 +117,28 @@ void UnpackMapFromSave(void) { // 0x8182E4 for (int i = 1792; i >= 0; i -= 2) explored_map_tiles_saved[i >> 1] = 0; for(int i = 0; i < 6; i++) { - uint16 r20 = swap16(i); int n = kPackedBytesPerArea_Count[i]; - uint16 r0 = kPackedBytesPerArea_UnpackedOffs[i]; + const uint8 *r0 = RomPtr_81(kPackedBytesPerArea_UnpackedOffs[i]); int v3 = kPackedBytesPerArea_PackedOffs[i]; - LongPtr r3 = { ADDR16_OF_RAM(*explored_map_tiles_saved), 126}; + uint8 *unpacked = (uint8 *)explored_map_tiles_saved; do { - uint16 v4 = r20 + *RomPtr_81(r0); - IndirWriteByte(r3, v4, compressed_map_data[v3]); - ++r0; - ++v3; + uint16 v4 = i * 256 + *r0++; + unpacked[v4] = compressed_map_data[v3++]; } while (--n); } } void PackMapToSave(void) { // 0x81834B - uint16 r26 = 0; - do { - int n = kPackedBytesPerArea_Count[r26]; - int v0 = r26; - uint16 r0 = kPackedBytesPerArea_UnpackedOffs[v0]; - int v1 = kPackedBytesPerArea_PackedOffs[v0]; - uint16 r24 = swap16(r26); - LongPtr r3 = { ADDR16_OF_RAM(*explored_map_tiles_saved), 126 }; + for (int i = 0; i < 6; i++) { + int n = kPackedBytesPerArea_Count[i]; + const uint8 *r0 = RomPtr_81(kPackedBytesPerArea_UnpackedOffs[i]); + int v1 = kPackedBytesPerArea_PackedOffs[i]; + uint8 *unpacked = (uint8 *)explored_map_tiles_saved; do { - int v3 = r24 + *RomPtr_81(r0); - compressed_map_data[v1] = IndirReadByte(r3, v3); - ++r0; - ++v1; + int v3 = i * 256 + *r0++; + compressed_map_data[v1++] = unpacked[v3]; } while (--n); - ++r26; - } while (sign16(r26 - 6)); + } } void DrawSpritemap(uint8 db, uint16 j, uint16 x_r20, uint16 y_r18, uint16 chr_r22) { // 0x81879F @@ -1878,7 +1869,7 @@ void FileSelectMap_5_ExpandingSquare(void) { // 0x81A725 do ram4000.xray_tilemaps[v1++] = 10241; while ((int16)(v1 * 2 - 2048) < 0); - DrawRoomSelectMapAreaLabel((LongPtr) { ADDR16_OF_RAM(ram4000) + 340, 0x7e }); + DrawRoomSelectMapAreaLabel(ram4000.bg2_room_select_map_tilemap + 170); uint16 v2 = 320; uint16 v3 = 959; do { @@ -1988,17 +1979,14 @@ void SelectFileSelectMapArea(void) { // 0x81A8A9 area_index = kFileSelectMap_AreaIndexes[file_select_map_area_index]; uint16 q = *(uint16 *)&used_save_stations_and_elevators[2 * area_index]; uint16 v0 = 0; - LongPtr r0 = { addr_kMapIconDataPointers + 64, 0x82}; - r0.addr = IndirReadWord(r0, 2 * area_index); - if (!r0.addr) - InvalidInterrupt_Crash(); + const uint16 *r0 = (const uint16 *)RomPtr_82(GET_WORD(RomPtr_82(addr_kMapIconDataPointers + 64 + 2 * area_index))); uint16 r20 = 16; while (1) { v2 = q & 1; q >>= 1; if (!v2) goto LABEL_10; - v3 = IndirReadWord(r0, 4 * v0); + v3 = r0[2 * v0]; if (v3 == -2) goto LABEL_10; if (v3 != -1) @@ -2008,7 +1996,7 @@ LABEL_10: ++v0; if (!--r20) { while (1) { - v4 = IndirReadWord(r0, 4 * v0); + v4 = r0[2 * v0]; if (v4 != -2) { if (v4 != -1) goto LABEL_16; @@ -2098,7 +2086,7 @@ void FileSelectMap_7_PrepExpandSquareTransToRoomMap(void) { // 0x81AAAC reg_BG12NBA = 48; hdma_window_1_left_pos[3].field_0 = 0; hdma_window_1_right_pos[3].field_0 = 0; - DrawRoomSelectMapAreaLabel((LongPtr) { ADDR16_OF_RAM(ram4000) + 340, 0x7e }); + DrawRoomSelectMapAreaLabel(ram4000.bg2_room_select_map_tilemap + 170); uint16 v0 = vram_write_queue_tail; VramWriteEntry *v1 = gVramWriteEntry(vram_write_queue_tail); v1->size = 512; @@ -2231,7 +2219,6 @@ void FileSelectMap_9_InitRoomSelectMap(void) { // 0x81AD17 void FileSelectMap_10_RoomSelectMap(void) { // 0x81AD7F int16 v1; - VoidP *v2; int16 v3; int8 v4; // cf int16 v5; @@ -2250,19 +2237,17 @@ void FileSelectMap_10_RoomSelectMap(void) { // 0x81AD7F r24 >>= 1; --v1; } while (v1 >= 0); - v2 = (VoidP *)RomPtr_82(2 * area_index + 0xC80B); - if (!*v2) - Unreachable(); - LongPtr r0 = { *v2, 0x82 }; + + const uint16 *r0 = (const uint16 *)RomPtr_82(GET_WORD(RomPtr_82(addr_kMapIconDataPointers + 64 + 2 * area_index))); v3 = 4 * load_station_index; - uint16 r18 = IndirReadWord(r0, v3); - uint16 r20 = IndirReadWord(r0, v3 + 2); + uint16 r18 = r0[v3 >> 1]; + uint16 r20 = r0[(v3 >> 1) + 1]; if (!sign16(load_station_index - 16)) goto LABEL_23; do { if (!sign16(++load_station_index - 16)) { while (1) { - v5 = IndirReadWord(r0, 4 * load_station_index); + v5 = r0[2 * load_station_index]; if (v5 == -1) break; if (v5 != -2) @@ -2275,12 +2260,12 @@ LABEL_23: } v4 = r24 & 1; r24 >>= 1; - } while (!v4 || IndirReadWord(r0, 4 * load_station_index) >= 0xFFFE); + } while (!v4 || r0[2 * load_station_index] >= 0xFFFE); LABEL_25:; uint16 v6 = 4 * load_station_index; - uint16 w7 = IndirReadWord(r0, 4 * load_station_index); + uint16 w7 = r0[2 * load_station_index]; if (sign16(w7 - reg_BG1HOFS) || !sign16(w7 - 256 - reg_BG1HOFS)) { - v8 = reg_BG1HOFS + IndirReadWord(r0, v6) - r18; + v8 = reg_BG1HOFS + r0[v6 >> 1] - r18; if (v8 >= 0) { if ((int16)(v8 - map_min_x_scroll) >= 0) v8 = map_min_x_scroll; @@ -2290,9 +2275,9 @@ LABEL_25:; reg_BG1HOFS = v8; } uint16 v9 = v6 + 2; - uint16 v10 = IndirReadWord(r0, v9); + uint16 v10 = r0[v9 >> 1]; if (sign16(v10 - reg_BG1VOFS) || !sign16(v10 - 161 - reg_BG1VOFS)) { - uint16 v11 = reg_BG1VOFS + IndirReadWord(r0, v9) - r20; + uint16 v11 = reg_BG1VOFS + r0[v9 >> 1] - r20; if ((int16)(v11 - map_min_y_scroll) >= 0) v11 = map_min_y_scroll; reg_BG1VOFS = v11; diff --git a/src/sm_82.c b/src/sm_82.c index d5e196f..4a9b4bc 100644 --- a/src/sm_82.c +++ b/src/sm_82.c @@ -1566,29 +1566,20 @@ void LoadPauseMenuMapTilemapAndAreaLabel(void) { // 0x8293C3 } void LoadPauseMenuMapTilemap(void) { // 0x82943D - int16 v9; - uint16 r18, r38, r40; - LongPtr r0, r3, r6, r9; uint16 v0 = area_index; if (!sign16(area_index - 7)) v0 = 0; - r18 = v0; - r0 = kPauseMenuMapTilemaps[v0]; - r3.addr = ADDR16_OF_RAM(ram4000); - r3.bank = 126; - r6.addr = kPauseMenuMapData[v0]; - r6.bank = 130; + const uint16 *r0 = (const uint16 *)RomPtr(Load24(&kPauseMenuMapTilemaps[v0])); + uint16 *r3 = (uint16 *)&ram4000; + const uint16 *r6 = (const uint16 *)RomPtr_82(kPauseMenuMapData[v0]); + const uint16 *r9 = (const uint16 *)map_tiles_explored; if (map_station_byte_array[area_index]) { - r38 = swap16(IndirReadWord(r6, 0)); - r6.addr += 2; - r9.bank = 0; - r9.addr = ADDR16_OF_RAM(*map_tiles_explored); - r40 = swap16(IndirReadWord(r9, 0)); - r9.addr += 2; + uint16 r38 = swap16(*r6++); + uint16 r40 = swap16(*r9++); uint16 v8 = 0; - v9 = 16; + int v9 = 16; do { - uint16 v10 = IndirReadWord(r0, v8); + uint16 v10 = r0[v8 >> 1]; bool v11 = r40 >> 15; r40 *= 2; if (v11) { @@ -1600,13 +1591,11 @@ void LoadPauseMenuMapTilemap(void) { // 0x82943D if (!v11) v10 = 31; } - IndirWriteWord(r3, v8, v10); + r3[v8 >> 1] = v10; if (!--v9) { v9 = 16; - r38 = swap16(IndirReadWord(r6, 0)); - r6.addr += 2; - r40 = swap16(IndirReadWord(r9, 0)); - r9.addr += 2; + r38 = swap16(*r6++); + r40 = swap16(*r9++); } v8 += 2; } while ((int16)(v8 - 4096) < 0); @@ -1618,10 +1607,10 @@ void LoadPauseMenuMapTilemap(void) { // 0x82943D uint8 t = map_tiles_explored[v2]; map_tiles_explored[v2] <<= 1; if (!(t & 0x80)) { - IndirWriteWord(r3, v1, 0x1F); + r3[v1 >> 1] = 0x1f; } else { ++map_tiles_explored[v2]; - IndirWriteWord(r3, v1, IndirReadWord(r0, v1) & 0xFBFF); + r3[v1 >> 1] = r0[v1 >> 1] & 0xFBFF; } v1 += 2; if (++r18 >= 8) { @@ -1634,35 +1623,25 @@ void LoadPauseMenuMapTilemap(void) { // 0x82943D } void DrawRoomSelectMap(void) { // 0x829517 - unsigned int v7; // kr00_4 - int16 v10; - VramWriteEntry *v17; - LongPtr r0, r3, r6, r9; - uint16 r38, r40; - reg_BG12NBA = 51; reg_TM = 19; reg_BG1VOFS = -40; uint16 v0 = area_index; if (!sign16(area_index - 7)) v0 = 0; - r0 = kPauseMenuMapTilemaps[v0]; - r3.addr = ADDR16_OF_RAM(ram3000); - r3.bank = 126; - r6.bank = 130; - r6.addr = kPauseMenuMapData[v0]; + + const uint16 *r0 = (const uint16 *)RomPtr(Load24(&kPauseMenuMapTilemaps[v0])); + uint16 *r3 = (uint16 *)&ram3000; + const uint16 *r6 = (const uint16 *)RomPtr_82(kPauseMenuMapData[v0]); + const uint16 *r9 = (const uint16 *)map_tiles_explored; + if (map_station_byte_array[area_index]) { - r38 = swap16(IndirReadWord(r6, 0)); - r6.addr += 2; - v7 = 2039; - r9.bank = HIWORD(v7); - r9.addr = v7; - r40 = swap16(IndirReadWord(r9, 0)); - r9.addr += 2; + uint16 r38 = swap16(*r6++); + uint16 r40 = swap16(*r9++); uint16 v9 = 0; - v10 = 16; + int v10 = 16; do { - uint16 v11 = IndirReadWord(r0, v9); + uint16 v11 = r0[v9 >> 1]; bool v12 = r40 >> 15; r40 *= 2; if (v12) { @@ -1674,13 +1653,11 @@ void DrawRoomSelectMap(void) { // 0x829517 if (!v12) v11 = 31; } - IndirWriteWord(r3, v9, v11); + r3[v9 >> 1] = v11; if (!--v10) { v10 = 16; - r38 = swap16(IndirReadWord(r6, 0)); - r6.addr += 2; - r40 = swap16(IndirReadWord(r9, 0)); - r9.addr += 2; + r38 = swap16(*r6++); + r40 = swap16(*r9++); } v9 += 2; } while ((int16)(v9 - 4096) < 0); @@ -1692,10 +1669,10 @@ void DrawRoomSelectMap(void) { // 0x829517 uint8 what = map_tiles_explored[v2]; map_tiles_explored[v2] <<= 1; if (!(what & 0x80)) { - IndirWriteWord(r3, v1, 0xF); + r3[v1 >> 1] = 0xf; } else { ++map_tiles_explored[v2]; - IndirWriteWord(r3, v1, IndirReadWord(r0, v1) & ~0x400); + r3[v1 >> 1] = r0[v1 >> 1] & ~0x400; } v1 += 2; r18++; @@ -1707,7 +1684,7 @@ void DrawRoomSelectMap(void) { // 0x829517 } } uint16 v16 = vram_write_queue_tail; - v17 = gVramWriteEntry(vram_write_queue_tail); + VramWriteEntry *v17 = gVramWriteEntry(vram_write_queue_tail); v17->size = 4096; v17->src.addr = ADDR16_OF_RAM(ram3000); v17->src.bank = 126; @@ -1715,10 +1692,10 @@ void DrawRoomSelectMap(void) { // 0x829517 vram_write_queue_tail = v16 + 7; } -void DrawRoomSelectMapAreaLabel(LongPtr r0) { // 0x829628 - const uint8 *v2 = RomPtr_82(kPauseAreaLabelTilemap[area_index]); - for(int i = 0; i < 24; i += 2) - IndirWriteWord(r0, i, *(uint16 *)(v2 + i) & 0xEFFF); +void DrawRoomSelectMapAreaLabel(uint16 *dst) { // 0x829628 + const uint16 *v2 = (const uint16 * )RomPtr_82(kPauseAreaLabelTilemap[area_index]); + for(int i = 0; i < 12; i++) + dst[i] = v2[i] & 0xEFFF; } void SetupMapScrollingForPauseMenu(uint16 a) { // 0x829E27 @@ -1750,7 +1727,7 @@ void SetupMapScrollingForPauseMenu(uint16 a) { // 0x829E27 static const uint8 k0x80Shr[8] = { 0x80, 0x40, 0x20, 0x10, 8, 4, 2, 1, }; static const uint8 k0x80Shr_0[8] = { 0x80, 0x40, 0x20, 0x10, 8, 4, 2, 1 }; -static uint16 DetermineLeftmostMapColumn(LongPtr r0) { +static uint16 DetermineLeftmostMapColumn(const uint8 *r0) { uint16 v0; uint16 result = 0; @@ -1758,16 +1735,16 @@ LABEL_2: v0 = result & 7; uint8 r18 = k0x80Shr[v0]; uint16 v2 = 0; - while ((r18 & IndirReadByte(r0, v2)) == 0) { + while ((r18 & r0[v2]) == 0) { v2 += 4; if ((int16)(v2 - 128) >= 0) { if ((int16)(++result - 64) >= 0) return 26; if ((result & 7) == 0) { - r0.addr += 1; + r0 += 1; } if (result == 32) { - r0.addr += 123; + r0 += 123; } goto LABEL_2; } @@ -1775,37 +1752,36 @@ LABEL_2: return result; } -static uint16 DetermineRightmostMapColumn(LongPtr r0) { // 0x829FA9 +static uint16 DetermineRightmostMapColumn(const uint8 *r0) { // 0x829FA9 uint16 result = 63; LABEL_2:; uint8 r18 = k0x80Shr_0[result & 7]; uint16 v1 = 0; - while ((r18 & IndirReadByte(r0, v1)) == 0) { + while ((r18 & r0[v1]) == 0) { v1 += 4; if ((int16)(v1 - 128) >= 0) { if ((--result & 0x8000) != 0) return 28; if ((result & 7) == 7) { - bool v2 = LOBYTE(r0.addr)-- != 0; - HIBYTE(r0.addr) -= !v2; + r0--; } if (result == 31) - r0.addr -= 124; + r0 -= 124; goto LABEL_2; } } return result; } -static uint16 DetermineTopmostMapColumn(LongPtr r0) { // 0x82A009 - LongPtr r3 = (LongPtr){ r0.addr + 128, r0.bank }; +static uint16 DetermineTopmostMapColumn(const uint8 *r0) { // 0x82A009 + const uint8 *r3 = r0 + 128; uint16 result = 0; uint16 v1 = 0; - while (!IndirReadByte(r0, v1) && !IndirReadByte(r3, v1)) { + while (!r0[v1] && !r3[v1]) { if ((int16)(++v1 - 4) >= 0) { v1 = 0; - r0.addr += 4; - r3.addr += 4; + r0 += 4; + r3 += 4; if ((int16)(++result - 31) >= 0) return 1; } @@ -1813,15 +1789,15 @@ static uint16 DetermineTopmostMapColumn(LongPtr r0) { // 0x82A009 return result; } -static uint16 DetermineBottommostMapColumn(LongPtr r0) { // 0x82A053 - LongPtr r3 = (LongPtr){ r0.addr + 128, r0.bank }; +static uint16 DetermineBottommostMapColumn(const uint8 *r0) { // 0x82A053 + const uint8 *r3 = r0 + 128; uint16 result = 31; uint16 v1 = 0; - while (!IndirReadByte(r0, v1) && !IndirReadByte(r3, v1)) { + while (!r0[v1] && !r3[v1]) { if ((int16)(++v1 - 4) >= 0) { v1 = 0; - r0.addr -= 4; - r3.addr -= 4; + r0 -= 4; + r3 -= 4; if (!--result) return 11; } @@ -1830,21 +1806,18 @@ static uint16 DetermineBottommostMapColumn(LongPtr r0) { // 0x82A053 } void DetermineMapScrollLimits(void) { // 0x829EC4 - LongPtr r6; + const uint8 *r6; if (has_area_map) { - r6.bank = 130; - r6.addr = addr_kPauseMenuMapData; - r6.addr = IndirReadWord(r6, 2 * area_index); + r6 = RomPtr_82(GET_WORD(RomPtr_82(addr_kPauseMenuMapData + 2 * area_index))); } else { - r6.bank = 0; - r6.addr = 2039; + r6 = map_tiles_explored; } map_min_x_scroll = DetermineLeftmostMapColumn(r6) * 8; if (area_index == 4) map_min_x_scroll -= 24; - map_max_x_scroll = DetermineRightmostMapColumn((LongPtr) { r6.addr + 131, r6.bank }) * 8; - map_min_y_scroll = DetermineTopmostMapColumn((LongPtr) { r6.addr, r6.bank }) * 8; - map_max_y_scroll = DetermineBottommostMapColumn((LongPtr) { r6.addr + 124, r6.bank }) * 8; + map_max_x_scroll = DetermineRightmostMapColumn(r6 + 131) * 8; + map_min_y_scroll = DetermineTopmostMapColumn(r6) * 8; + map_max_y_scroll = DetermineBottommostMapColumn(r6 + 124) * 8; } void SetupPpuForPauseMenu(void) { // 0x82A09A diff --git a/src/sm_84.c b/src/sm_84.c index 9d70529..f8411db 100644 --- a/src/sm_84.c +++ b/src/sm_84.c @@ -828,7 +828,8 @@ void DrawPlm(uint16 k) { // 0x848DAA uint16 x = plm_x_block; uint16 y = plm_y_block; uint16 r3; - LongPtr r0, r6; + //LongPtr r0, r6; + uint16 *r0, *r6; LABEL_2: r26 = layer1_y_pos >> 4; if (sign16((layer1_y_pos >> 4) + 15 - y)) @@ -866,9 +867,8 @@ LABEL_2: CalculatePlmDrawTilemapVramDst(vram_write_queue_tail, r9, r12, r20, r24, r26, 0x8000); v25 = gVramWriteEntry(v24); v25[1].vram_dst = v25[0].vram_dst + 1; - r0 = v25[0].src; - r6 = v25[1].src; - + r0 = (uint16 *)(g_ram + v25[0].src.addr); + r6 = (uint16 *)(g_ram + v25[1].src.addr); vram_write_queue_tail = v24 + 14; r18 *= 2; r3 = r18 + v1 + 2; @@ -881,30 +881,30 @@ LABEL_2: v28 = x & 0xC00; if ((x & 0xC00) != 0) { if (v28 == 1024) { - IndirWriteWord(r0, v26, tile_table.tables[v27].top_right ^ 0x4000); - IndirWriteWord(r6, v26, tile_table.tables[v27].top_left ^ 0x4000); + r0[v26 >> 1] = tile_table.tables[v27].top_right ^ 0x4000; + r6[v26 >> 1] = tile_table.tables[v27].top_left ^ 0x4000; v29 = v26 + 2; - IndirWriteWord(r0, v29, tile_table.tables[v27].bottom_right ^ 0x4000); - IndirWriteWord(r6, v29, tile_table.tables[v27].bottom_left ^ 0x4000); + r0[v29 >> 1] = tile_table.tables[v27].bottom_right ^ 0x4000; + r6[v29 >> 1] = tile_table.tables[v27].bottom_left ^ 0x4000; } else if (v28 == 2048) { - IndirWriteWord(r0, v26, tile_table.tables[v27].bottom_left ^ 0x8000); - IndirWriteWord(r6, v26, tile_table.tables[v27].bottom_right ^ 0x8000); + r0[v26 >> 1] = tile_table.tables[v27].bottom_left ^ 0x8000; + r6[v26 >> 1] = tile_table.tables[v27].bottom_right ^ 0x8000; v29 = v26 + 2; - IndirWriteWord(r0, v29, tile_table.tables[v27].top_left ^ 0x8000); - IndirWriteWord(r6, v29, tile_table.tables[v27].top_right ^ 0x8000); + r0[v29 >> 1] = tile_table.tables[v27].top_left ^ 0x8000; + r6[v29 >> 1] = tile_table.tables[v27].top_right ^ 0x8000; } else { - IndirWriteWord(r0, v26, tile_table.tables[v27].bottom_right ^ 0xC000); - IndirWriteWord(r6, v26, tile_table.tables[v27].bottom_left ^ 0xC000); + r0[v26 >> 1] = tile_table.tables[v27].bottom_right ^ 0xC000; + r6[v26 >> 1] = tile_table.tables[v27].bottom_left ^ 0xC000; v29 = v26 + 2; - IndirWriteWord(r0, v29, tile_table.tables[v27].top_right ^ 0xC000); - IndirWriteWord(r6, v29, tile_table.tables[v27].top_left ^ 0xC000); + r0[v29 >> 1] = tile_table.tables[v27].top_right ^ 0xC000; + r6[v29 >> 1] = tile_table.tables[v27].top_left ^ 0xC000; } } else { - IndirWriteWord(r0, v26, tile_table.tables[v27].top_left); - IndirWriteWord(r6, v26, tile_table.tables[v27].top_right); + r0[v26 >> 1] = tile_table.tables[v27].top_left; + r6[v26 >> 1] = tile_table.tables[v27].top_right; v29 = v26 + 2; - IndirWriteWord(r0, v29, tile_table.tables[v27].bottom_left); - IndirWriteWord(r6, v29, tile_table.tables[v27].bottom_right); + r0[v29 >> 1] = tile_table.tables[v27].bottom_left; + r6[v29 >> 1] = tile_table.tables[v27].bottom_right; } v26 = v29 + 2; ++r3; @@ -989,14 +989,12 @@ LABEL_70: v10[3].size = v11; v12 = plm_draw_tilemap_index - 14648; v10->src.addr = plm_draw_tilemap_index - 14648; - r0.addr = v12; + r0 = (uint16 *)(g_ram + v12); v13 = v10->size + v12; v10[1].src.addr = v13; uint16 v14 = v10[1].size + v13; v10[2].src.addr = v14; - r0.bank = 126; - r6.bank = 126; - r6.addr = v14; + r6 = (uint16 *)(g_ram + v14); v10[3].src.addr = v10[2].size + v14; v10->src.bank = 126; v10[1].src.bank = 126; @@ -1007,8 +1005,8 @@ LABEL_70: PartiallyQueueVramForSingleScreenPlm(a, v3, r20, 0); v15 = gVramWriteEntry(v3); v15[1].vram_dst = v15[0].vram_dst + 32; - r0 = v15[0].src; - r6 = v15[1].src; + r0 = (uint16 *)(g_ram + v15[0].src.addr); + r6 = (uint16 *)(g_ram + v15[1].src.addr); vram_write_queue_tail = v3 + 14; } r18 *= 2; @@ -1020,30 +1018,30 @@ LABEL_70: v18 = x & 0xC00; if ((x & 0xC00) != 0) { if (v18 == 1024) { - IndirWriteWord(r0, v16, tile_table.tables[v17].top_right ^ 0x4000); - IndirWriteWord(r6, v16, tile_table.tables[v17].bottom_right ^ 0x4000); + r0[v16 >> 1] = tile_table.tables[v17].top_right ^ 0x4000; + r6[v16 >> 1] = tile_table.tables[v17].bottom_right ^ 0x4000; v19 = v16 + 2; - IndirWriteWord(r0, v19, tile_table.tables[v17].top_left ^ 0x4000); - IndirWriteWord(r6, v19, tile_table.tables[v17].bottom_left ^ 0x4000); + r0[v19 >> 1] = tile_table.tables[v17].top_left ^ 0x4000; + r6[v19 >> 1] = tile_table.tables[v17].bottom_left ^ 0x4000; } else if (v18 == 2048) { - IndirWriteWord(r0, v16, tile_table.tables[v17].bottom_left ^ 0x8000); - IndirWriteWord(r6, v16, tile_table.tables[v17].top_left ^ 0x8000); + r0[v16 >> 1] = tile_table.tables[v17].bottom_left ^ 0x8000; + r6[v16 >> 1] = tile_table.tables[v17].top_left ^ 0x8000; v19 = v16 + 2; - IndirWriteWord(r0, v19, tile_table.tables[v17].bottom_right ^ 0x8000); - IndirWriteWord(r6, v19, tile_table.tables[v17].top_right ^ 0x8000); + r0[v19 >> 1] = tile_table.tables[v17].bottom_right ^ 0x8000; + r6[v19 >> 1] = tile_table.tables[v17].top_right ^ 0x8000; } else { - IndirWriteWord(r0, v16, tile_table.tables[v17].bottom_right ^ 0xC000); - IndirWriteWord(r6, v16, tile_table.tables[v17].top_right ^ 0xC000); + r0[v16 >> 1] = tile_table.tables[v17].bottom_right ^ 0xC000; + r6[v16 >> 1] = tile_table.tables[v17].top_right ^ 0xC000; v19 = v16 + 2; - IndirWriteWord(r0, v19, tile_table.tables[v17].bottom_left ^ 0xC000); - IndirWriteWord(r6, v19, tile_table.tables[v17].top_left ^ 0xC000); + r0[v19 >> 1] = tile_table.tables[v17].bottom_left ^ 0xC000; + r6[v19 >> 1] = tile_table.tables[v17].top_left ^ 0xC000; } } else { - IndirWriteWord(r0, v16, tile_table.tables[v17].top_left); - IndirWriteWord(r6, v16, tile_table.tables[v17].bottom_left); + r0[v16 >> 1] = tile_table.tables[v17].top_left; + r6[v16 >> 1] = tile_table.tables[v17].bottom_left; v19 = v16 + 2; - IndirWriteWord(r0, v19, tile_table.tables[v17].top_right); - IndirWriteWord(r6, v19, tile_table.tables[v17].bottom_right); + r0[v19 >> 1] = tile_table.tables[v17].top_right; + r6[v19 >> 1] = tile_table.tables[v17].bottom_right; } v16 = v19 + 2; r3 += 2; @@ -1059,8 +1057,6 @@ LABEL_70: } } - - const uint8 *PlmInstr_MovePlmDownOneBlock(const uint8 *plmp, uint16 k) { // 0x84AB00 plm_block_indices[k >> 1] += 2 * room_width_in_blocks; return plmp; diff --git a/src/sm_88.c b/src/sm_88.c index ed32fbb..24b72a1 100644 --- a/src/sm_88.c +++ b/src/sm_88.c @@ -1708,7 +1708,7 @@ void HdmaobjPreInstr_SkyLandBG2Xscroll2(uint16 k) { // 0x88ADBA HdmaobjPreInstr_SkyLandBG2XscrollInner(k); } -void RoomMainAsm_ScrollingSky(LongPtr r0) { // 0x88AFA3 +void RoomMainAsm_ScrollingSky(const uint16 *src) { // 0x88AFA3 if (time_is_frozen_flag) { WORD(scrolling_sky_bg2_indirect_hdma[0]) = 0; } else { @@ -1726,10 +1726,10 @@ void RoomMainAsm_ScrollingSky(LongPtr r0) { // 0x88AFA3 int v2 = 8 * (uint8)tt; int y1 = (uint8)(tt >> 8); int y2 = (uint8)((tt >> 8) + 1); - VoidP v3 = IndirReadWord(r0, 2 * y1) + v2; + VoidP v3 = src[y1] + v2; v1[0].src.addr = v3; v1[1].src.addr = v3 + 64; - VoidP v5 = IndirReadWord(r0, 2 * y2) + v2; + VoidP v5 = src[y2] + v2; v1[2].src.addr = v5; v1[3].src.addr = v5 + 64; v1[0].src.bank = 0x8a; @@ -1748,11 +1748,11 @@ void RoomMainAsm_ScrollingSky(LongPtr r0) { // 0x88AFA3 } void RoomCode_ScrollingSkyLand(void) { // 0x88AF8D - RoomMainAsm_ScrollingSky((LongPtr) { addr_off_88AD9C, 0x88 }); + RoomMainAsm_ScrollingSky((const uint16 *)RomPtr_88(addr_off_88AD9C)); } void RoomMainAsm_ScrollingSkyOcean(void) { // 0x88AF99 - RoomMainAsm_ScrollingSky((LongPtr) { addr_off_88ADA6, 0x88 }); + RoomMainAsm_ScrollingSky((const uint16 *)RomPtr_88(addr_off_88ADA6)); } static const SpawnHdmaObject_Args unk_88B08C = { 0x42, 0x11, 0xb0ac }; diff --git a/src/sm_90.c b/src/sm_90.c index cd2f864..2d192d0 100644 --- a/src/sm_90.c +++ b/src/sm_90.c @@ -2229,7 +2229,6 @@ void InitializeMiniMapBroken(void) { // 0x90A8EF void UpdateMinimap(void) { // 0x90A91B int16 v4; int16 v10; - LongPtr r9; if (debug_disable_minimap || (samus_x_pos >> 4) >= room_width_in_blocks || (samus_y_pos >> 4) >= room_height_in_blocks) @@ -2258,15 +2257,14 @@ void UpdateMinimap(void) { // 0x90A91B uint16 r24 = kShr0xFc00[v6] & swap16(*(uint16 *)&map_tiles_explored[v3]); uint16 r26 = kShr0xFc00[v6] & swap16(*(uint16 *)&map_tiles_explored[v3 + 4]); uint16 r28 = kShr0xFc00[v6] & swap16(*(uint16 *)&map_tiles_explored[v3 + 8]); - r9.bank = 130; - r9.addr = kPauseMenuMapData[area_index]; - uint16 r15 = r9.addr; - r9.addr += v3; - uint16 r38 = swap16(IndirReadWord(r9, 0)); - r9.addr += 4; - uint16 r40 = swap16(IndirReadWord(r9, 0)); - r9.addr += 4; - uint16 r42 = swap16(IndirReadWord(r9, 0)); + const uint8 *r9 = RomPtr_82(kPauseMenuMapData[area_index]); + const uint8 *r15 = r9; + r9 += v3; + uint16 r38 = swap16(GET_WORD(r9)); + r9 += 4; + uint16 r40 = swap16(GET_WORD(r9)); + r9 += 4; + uint16 r42 = swap16(GET_WORD(r9)); if ((R50 & 3) == 3) { v10 = r46 ? r52 >> 1 : r32; if (!sign16(v10 - 6)) { @@ -2274,9 +2272,9 @@ void UpdateMinimap(void) { // 0x90A91B uint16 v0 = (uint8)R48; uint16 r44 = 0; - r9.addr = r15 + (uint8)R48; + r9 = r15 + (uint8)R48; LOBYTE(r44) = map_tiles_explored[(uint8)R48]; - HIBYTE(r44) = IndirReadByte(r9, 0); + HIBYTE(r44) = *r9; if ((uint8)r34 == 32) { HIBYTE(r38) = HIBYTE(r44); HIBYTE(r24) = r44; @@ -2285,8 +2283,8 @@ void UpdateMinimap(void) { // 0x90A91B LOBYTE(r24) = r44; } LOBYTE(r44) = map_tiles_explored[v0 + 4]; - r9.addr += 4; - HIBYTE(r44) = IndirReadByte(r9, 0); + r9 += 4; + HIBYTE(r44) = *r9; if ((uint8)r34 == 32) { HIBYTE(r40) = HIBYTE(r44); HIBYTE(r26) = r44; @@ -2295,8 +2293,8 @@ void UpdateMinimap(void) { // 0x90A91B LOBYTE(r26) = r44; } LOBYTE(r44) = map_tiles_explored[v0 + 8]; - r9.addr += 4; - HIBYTE(r44) = IndirReadByte(r9, 0); + r9 += 4; + HIBYTE(r44) = *r9; if ((uint8)r34 == 32) { HIBYTE(r42) = HIBYTE(r44); HIBYTE(r28) = r44; @@ -2325,7 +2323,6 @@ void UpdateMinimapInside(uint16 r18, uint16 r22, uint16 r34, uint16 r30, uint16 int16 v5; int16 v7; int16 v8; - LongPtr r0, r3, r6; LOBYTE(v0) = (uint16)(r34 + r22) >> 8; HIBYTE(v0) = r34 + r22; @@ -2335,17 +2332,15 @@ void UpdateMinimapInside(uint16 r18, uint16 r22, uint16 r34, uint16 r30, uint16 else v1 = t - 34; uint16 v2 = 2 * v1; - r0 = kPauseMenuMapTilemaps[area_index]; - r3.bank = r0.bank; - r6.bank = r0.bank; - r3.addr = r0.addr + 64; - r6.addr = r0.addr + 128; + const uint16 *r0 = (const uint16 *)RomPtr(Load24(&kPauseMenuMapTilemaps[area_index])); + const uint16 *r3 = r0 + 32; + const uint16 *r6 = r0 + 64; int n = 5; uint16 v3 = 0; do { bool v4 = r38 >> 15; r38 *= 2; - if (!v4 || (v5 = IndirReadWord(r0, v2), !has_area_map)) + if (!v4 || (v5 = r0[v2 >> 1], !has_area_map)) v5 = 31; int v6 = v3 >> 1; hud_tilemap[v6 + 26] = v5 & 0xC3FF | 0x2C00; @@ -2353,18 +2348,18 @@ void UpdateMinimapInside(uint16 r18, uint16 r22, uint16 r34, uint16 r30, uint16 v4 = r24 >> 15; r24 *= 2; if (v4) - hud_tilemap[v6 + 26] = IndirReadWord(r0, v2) & 0xC3FF | 0x2800; + hud_tilemap[v6 + 26] = r0[v2 >> 1] & 0xC3FF | 0x2800; v4 = r40 >> 15; r40 *= 2; - if (!v4 || (v7 = IndirReadWord(r3, v2), !has_area_map)) + if (!v4 || (v7 = r3[v2 >> 1], !has_area_map)) v7 = 31; hud_tilemap[v6 + 58] = v7 & 0xC3FF | 0x2C00; v4 = r26 >> 15; r26 *= 2; if (v4) { - hud_tilemap[v6 + 58] = IndirReadWord(r3, v2) & 0xC3FF | 0x2800; + hud_tilemap[v6 + 58] = r3[v2 >> 1] & 0xC3FF | 0x2800; if (n == 3 && (hud_tilemap[v6 + 58] & 0x1FF) == 40) { // MarkMapTileAboveSamusAsExplored *((uint8 *)&music_data_index + r30) |= kShr0x80[r32]; @@ -2373,14 +2368,14 @@ void UpdateMinimapInside(uint16 r18, uint16 r22, uint16 r34, uint16 r30, uint16 v4 = r42 >> 15; r42 *= 2; - if (!v4 || (v8 = IndirReadWord(r6, v2), !has_area_map)) + if (!v4 || (v8 = r6[v2 >> 1], !has_area_map)) v8 = 31; hud_tilemap[v6 + 90] = v8 & 0xC3FF | 0x2C00; v4 = r28 >> 15; r28 *= 2; if (v4) - hud_tilemap[v6 + 90] = IndirReadWord(r6, v2) & 0xC3FF | 0x2800; + hud_tilemap[v6 + 90] = r6[v2 >> 1] & 0xC3FF | 0x2800; v3 += 2; v2 += 2; diff --git a/src/sm_a6.c b/src/sm_a6.c index edf5969..cb81c81 100644 --- a/src/sm_a6.c +++ b/src/sm_a6.c @@ -3611,22 +3611,13 @@ void Ridley_Func_92(void) { // 0xA6D2D6 } void Ridley_Func_93(uint16 j, uint16 k) { // 0xA6D3B4 - int16 v3; - int16 v5; - - LongPtr r18; - r18.bank = 126; - r18.addr = j; - uint16 v2 = 0; - v3 = 7; + uint16 *dst = (uint16*)(g_ram + j); + const uint16 *src = (const uint16 *)RomPtr_A6(k); + int v3 = 7; do { - v5 = v3; - const uint16 *v4 = (const uint16 *)RomPtr_A6(k); - IndirWriteWord(r18, v2, *v4); - k += 2; - v2 += 20; - --v3; - } while (v5 != 1); + *dst = *src; + dst += 10, src++; + } while (--v3); } void Ridley_Func_94(void) { // 0xA6D3D4 diff --git a/src/sm_a9.c b/src/sm_a9.c index dbf5d32..a644232 100644 --- a/src/sm_a9.c +++ b/src/sm_a9.c @@ -4791,21 +4791,15 @@ LABEL_12: if (v15 >= E0->dms_var_47) r18 = E0->dms_var_43; - LongPtr r20; - r20.addr = E0->dms_var_44; - r20.bank = 169; - CopyMoveCorpseRottingRotEntry(r20, *v6, r18); + CopyMoveCorpseRottingRotEntry((const uint16 *)RomPtr_A9(E0->dms_var_44), *v6, r18); } goto LABEL_12; } Enemy_DeadMonsters *E = Get_DeadMonsters(0); uint16 r18 = E->dms_var_43; - LongPtr r20; - r20.addr = E->dms_var_44; - r20.bank = 169; uint16 *v11 = (uint16 *)(g_ram + dms_var_52); - CopyMoveCorpseRottingRotEntry(r20, *v11, r18); + CopyMoveCorpseRottingRotEntry((const uint16 *)RomPtr_A9(E->dms_var_44), *v11, r18); uint16 v12 = *v11 + 2; if (v12 < E->dms_var_46) { *(uint16 *)v11 = v12; @@ -4819,12 +4813,12 @@ LABEL_12: return 0; } -void CopyMoveCorpseRottingRotEntry(LongPtr r20, uint16 a, uint16 r18) { // 0xA9DBE0 +void CopyMoveCorpseRottingRotEntry(const uint16 *r20, uint16 a, uint16 r18) { // 0xA9DBE0 Enemy_DeadMonsters *E = Get_DeadMonsters(0); E->dms_var_41 = a; uint16 v1 = (uint16)(a & 0xFFF8) >> 2; uint16 v2 = a & 7; - uint16 v6 = IndirReadWord(r20, v1) + 2 * v2; + uint16 v6 = r20[v1 >> 1] + 2 * v2; if (v2 >= 6) { CallCorpseRottingMove(r18 | 0xA90000, E->dms_var_48 + v6, v6); } else { diff --git a/src/sm_rtl.c b/src/sm_rtl.c index 3e712b6..cea7f4c 100644 --- a/src/sm_rtl.c +++ b/src/sm_rtl.c @@ -522,31 +522,6 @@ const uint8 *RomPtr(uint32_t addr) { return &g_rom[(((addr >> 16) << 15) | (addr & 0x7fff)) & 0x3fffff]; } -static uint8 *IndirPtr(LongPtr ptr, uint16 offs) { - uint32 a = (ptr.bank << 16 | ptr.addr) + offs; - if (ptr.bank >= 0x7e && ptr.bank <= 0x7f || a < 0x2000) { - return &g_ram[a & 0x1ffff]; - } else { - return (uint8 *)RomPtr(a); - } -} - -uint16 IndirReadWord(LongPtr ptr, uint16 offs) { - return *(uint16 *)IndirPtr(ptr, offs); -} - -void IndirWriteWord(LongPtr ptr, uint16 offs, uint16 value) { - *(uint16 *)IndirPtr(ptr, offs) = value; -} - -uint8 IndirReadByte(LongPtr ptr, uint16 offs) { - return *(uint8_t *)IndirPtr(ptr, offs); -} - -void IndirWriteByte(LongPtr ptr, uint16 offs, uint8 value) { - *IndirPtr(ptr, offs) = value; -} - void WriteReg(uint16 reg, uint8 value) { snes_write(g_snes, reg, value); } diff --git a/src/sm_rtl.h b/src/sm_rtl.h index cda2c08..ee75c19 100644 --- a/src/sm_rtl.h +++ b/src/sm_rtl.h @@ -33,11 +33,6 @@ typedef void FuncXY_V(uint16 k, uint16 j); typedef PairU16 Func_Y_To_PairU16(uint16 j); const uint8 *RomPtr(uint32_t addr); -uint8 IndirReadByte(LongPtr ptr, uint16 offs); -uint16 IndirReadWord(LongPtr ptr, uint16 offs); -void IndirWriteByte(LongPtr ptr, uint16 offs, uint8 value); -void IndirWriteWord(LongPtr ptr, uint16 offs, uint16 value); - static inline const uint8 *RomFixedPtr(uint32_t addr) { return &g_rom[(((addr >> 16) << 15) | (addr & 0x7fff)) & 0x3fffff]; } struct LongPtr;