From 45767ae6e080403f86851bb17e6d676f14b8a242 Mon Sep 17 00:00:00 2001 From: Snesrev Date: Mon, 20 Mar 2023 22:22:05 +0100 Subject: [PATCH] Clean up sprite drawing --- src/funcs.h | 3 +- src/sm_81.c | 490 ++++++++++++++-------------------------------------- 2 files changed, 133 insertions(+), 360 deletions(-) diff --git a/src/funcs.h b/src/funcs.h index 4933a25..921735a 100644 --- a/src/funcs.h +++ b/src/funcs.h @@ -286,12 +286,11 @@ void SelectFileSelectMapArea(void); void SetFileClearMenuMissilePos(void); void SetFileCopyMenuSelectionMissilePosition(void); void SetInitialFileCopyMenuSelection(void); -void SetXCoordToInvalidPos(uint16 k); void SetupInitialExpandingSquareHDMA(void); void SetupRoomSelectMapExpandingSquareTransHDMA(void); void SwitchActiveFileSelectMapArea(void); void UnpackMapFromSave(void); -void sub_818A5F(const uint8 *pp); +void DrawGrappleOrProjectileSpritemap(const uint8 *pp); void sub_819591(void); void sub_81A3D1(uint16 k); void sub_81AEC8(void); diff --git a/src/sm_81.c b/src/sm_81.c index 3fa6d24..1d1ee29 100644 --- a/src/sm_81.c +++ b/src/sm_81.c @@ -159,250 +159,111 @@ void PackMapToSave(void) { // 0x81834B } void DrawSpritemap(uint8 db, uint16 j) { // 0x81879F - int16 v7; - OamEnt *v8; - int8 v13; - int8 v15; - - const uint16 *v2 = (const uint16 *)RomPtrWithBank(db, j); - if (*v2) { - R24_ = *v2; - uint16 v3 = j + 2; - uint16 v4 = oam_next_ptr; - if ((oam_next_ptr & 0xFE00) != 0) { - oam_next_ptr = v4; - return; - } - uint16 v5 = oam_next_ptr; - while (1) { - - const uint8 *v6 = RomPtrWithBank(db, v3); - v7 = R20_ + GET_WORD(v6); - v8 = gOamEnt(v5); - *(uint16 *)&v8->xcoord = v7; - if ((v7 & 0x100) != 0) { - int v9 = v5 >> 1; - if (*(int16 *)v6 >= 0) { - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v9]) |= kOamExtra_X8Small_And_Large[v9]; - } else { - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v9]) |= kOamExtra_Address_And_X8Large[v9 + 1]; - } - - } else if (*(int16 *)v6 < 0) { - int v11 = v5 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v11]) |= kOamExtra_X8Small_And_Large[v11 + 1]; - } - v13 = v6[2]; - if (v13 >= 0) { - bool v14 = __CFADD__uint8((uint8)R18_, v13); - v15 = R18_ + v13; - if (!v14 && (uint8)v15 < 0xE0u) - goto LABEL_22; - goto LABEL_21; - } - { - bool v14; - v14 = __CFADD__uint8((uint8)R18_, v13); - v15 = R18_ + v13; - if (v14) { - if ((uint8)v15 >= 0xE0u) - goto LABEL_21; - } else if ((uint8)v15 < 0xE0u) { -LABEL_21: - SetXCoordToInvalidPos(v5); - v15 = -32; - } - } - { -LABEL_22: - v8->ycoord = v15; - *(uint16 *)&v8->charnum = R22_ | GET_WORD(v6 + 3) & 0xF1FF; - v4 = v5 + 4; - if (((v5 + 4) & 0xFE00) != 0) { - oam_next_ptr = v4; - return; - } - v5 += 4; - v3 += 5; - if (!--R24_) { - oam_next_ptr = v5; - return; - } - } - } + const uint8 *pp = RomPtrWithBank(db, j); + int n = GET_WORD(pp); + pp += 2; + int idx = oam_next_ptr; + for (; (n != 0) && (idx < 0x200); n--) { + OamEnt *oam = gOamEnt(idx); + int x = R20_ + GET_WORD(pp); + int y = (uint8)R18_ + pp[2]; + // can this be simplified? + if (!sign8(pp[2]) ? (y >= 0xe0) : (y & 0x100) ? ((uint8)y >= 0xe0) : ((uint8)y < 0xe0)) + x = 0x180, y = 0xe0; + oam->xcoord = x; + oam->ycoord = y; + *(uint16 *)&oam->charnum = R22_ | GET_WORD(pp + 3) & 0xF1FF; + oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7)); + idx += 4; + pp += 5; } + oam_next_ptr = idx; } void DrawSpritemapOffScreen(uint16 j) { // 0x818853 - int16 v6; - OamEnt *v7; - int8 v12; - int8 v14; - - const uint16 *v1 = (const uint16 *)RomPtr_8C(j); - if (*v1) { - R24_ = *v1; - uint16 v2 = j + 2; - uint16 v3 = oam_next_ptr; - if ((oam_next_ptr & 0xFE00) != 0) { - oam_next_ptr = v3; - return; - } - uint16 v4 = oam_next_ptr; - while (1) { - const uint8 *v5 = RomPtrWithBank(0x8c, v2); - v6 = R20_ + GET_WORD(v5); - v7 = gOamEnt(v4); - *(uint16 *)&v7->xcoord = v6; - if ((v6 & 0x100) != 0) { - int v8 = v4 >> 1; - if (*(int16 *)v5 >= 0) { - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]) |= kOamExtra_X8Small_And_Large[v8]; - } else { - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]) |= kOamExtra_Address_And_X8Large[v8 + 1]; - } - - } else if (*(int16 *)v5 < 0) { - int v10 = v4 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]) |= kOamExtra_X8Small_And_Large[v10 + 1]; - } - v12 = v5[2]; - if (v12 >= 0) { - bool v13 = __CFADD__uint8((uint8)R18_, v12); - v14 = R18_ + v12; - if (v13 || (uint8)v14 >= 0xE0u) - goto LABEL_22; - goto LABEL_21; - } else { - bool v13; - v13 = __CFADD__uint8((uint8)R18_, v12); - v14 = R18_ + v12; - if (v13) { - if ((uint8)v14 < 0xE0u) - goto LABEL_21; - } else if ((uint8)v14 >= 0xE0u) { -LABEL_21: - SetXCoordToInvalidPos(v4); - v14 = -32; - } - } -LABEL_22: - v7->ycoord = v14; - *(uint16 *)&v7->charnum = R22_ | *(uint16 *)(v5 + 3) & 0xF1FF; - v3 = v4 + 4; - if (((v4 + 4) & 0xFE00) != 0) { - oam_next_ptr = v3; - return; - } - v4 += 4; - v2 += 5; - if (!--R24_) { - oam_next_ptr = v4; - return; - } - } + const uint8 *pp = RomPtr_8C(j); + int n = GET_WORD(pp); + pp += 2; + int idx = oam_next_ptr; + for (; (n != 0) && (idx < 0x200); n--) { + OamEnt *oam = gOamEnt(idx); + int x = R20_ + GET_WORD(pp); + int y = (uint8)R18_ + pp[2]; + // can this be simplified? + if (!sign8(pp[2]) ? (y < 0xe0) : (y & 0x100) ? ((uint8)y < 0xe0) : ((uint8)y >= 0xe0)) + x = 0x180, y = 0xe0; + oam->xcoord = x; + oam->ycoord = y; + *(uint16 *)&oam->charnum = R22_ | *(uint16 *)(pp + 3) & 0xF1FF; + oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7)); + idx += 4; + pp += 5; } + oam_next_ptr = idx; } -void SetXCoordToInvalidPos(uint16 k) { // 0x818907 - gOamEnt(k)->xcoord = 0x80; - int v1 = k >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v1]) |= kOamExtra_X8Small_And_Large[v1]; -} - - void DrawMenuSpritemap(uint16 a, uint16 k, uint16 j) { // 0x81891F const uint8 *pp = RomPtr_82(g_off_82C569[a]); - if (GET_WORD(pp + 0)) { - int n = GET_WORD(pp + 0); - pp += 2; - int v6 = oam_next_ptr; - do { - int v10 = v6 >> 1; - uint16 *dst = (uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]); - uint16 v8 = k + GET_WORD(pp + 0); - OamEnt *v9 = gOamEnt(v6); - v9->xcoord = v8; - if ((v8 & 0x100) != 0) { - if (*(int16 *)pp >= 0) { - *dst |= kOamExtra_X8Small_And_Large[v10]; - } else { - *dst |= kOamExtra_Address_And_X8Large[v10 + 1]; - } - } else if (*(int16 *)pp < 0) { - *dst |= kOamExtra_X8Small_And_Large[v10 + 1]; - } - v9->ycoord = j + GET_BYTE(pp + 2); - *(uint16 *)&v9->charnum = R3_.addr | GET_WORD(pp + 3) & 0xF1FF; - pp += 5; - v6 = (v6 + 4) & 0x1FF; - } while (--n); - oam_next_ptr = v6; + int n = GET_WORD(pp); + pp += 2; + int idx = oam_next_ptr; + for (; n != 0; n--) { + OamEnt *oam = gOamEnt(idx); + uint16 x = k + GET_WORD(pp); + oam->xcoord = x; + oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7)); + oam->ycoord = j + pp[2]; + *(uint16 *)&oam->charnum = R3_.addr | GET_WORD(pp + 3) & 0xF1FF; + pp += 5; + idx = (idx + 4) & 0x1FF; } + oam_next_ptr = idx; } - -void DrawSamusSpritemap(uint16 a, uint16 k, uint16 j) { // 0x8189AE - uint16 v3 = kSamusSpritemapTable[a]; - if (v3 == 0) +void DrawSamusSpritemap(uint16 a, uint16 x_pos, uint16 y_pos) { // 0x8189AE + if (kSamusSpritemapTable[a] == 0) return; - const uint8 *pp = RomPtr_92(v3); - int n = GET_WORD(pp + 0); + const uint8 *pp = RomPtr_92(kSamusSpritemapTable[a]); + int idx = oam_next_ptr; + int n = GET_WORD(pp); pp += 2; - uint16 v6 = oam_next_ptr; - for(; n; n--) { - int v10 = v6 >> 1; + for(; n != 0; n--) { + int v10 = idx >> 1; uint16 *dst = (uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]); - uint16 v8 = k + GET_WORD(pp + 0); - OamEnt *v9 = gOamEnt(v6); - v9->xcoord = v8; - if ((v8 & 0x100) != 0) { - if (*(int16 *)pp >= 0) { - *dst |= kOamExtra_X8Small_And_Large[v10]; - } else { - *dst |= kOamExtra_Address_And_X8Large[v10 + 1]; - } - } else if (*(int16 *)pp < 0) { - *dst |= kOamExtra_X8Small_And_Large[v10 + 1]; - } - v9->ycoord = j + GET_BYTE(pp + 2); + uint16 x = x_pos + GET_WORD(pp); + OamEnt *v9 = gOamEnt(idx); + v9->xcoord = x; + oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7)); + v9->ycoord = y_pos + pp[2]; *(uint16 *)&v9->charnum = GET_WORD(pp + 3); pp += 5; - v6 = (v6 + 4) & 0x1FF; + idx = (idx + 4) & 0x1FF; } - oam_next_ptr = v6; + oam_next_ptr = idx; } - void DrawBeamGrappleSpritemap(uint16 a) { // 0x818A37 - sub_818A5F(RomPtr_93(g_off_93A1A1[a])); + DrawGrappleOrProjectileSpritemap(RomPtr_93(g_off_93A1A1[a])); } void DrawProjectileSpritemap(uint16 k) { // 0x818A4B - sub_818A5F(RomPtr_93(projectile_spritemap_pointers[k >> 1])); + DrawGrappleOrProjectileSpritemap(RomPtr_93(projectile_spritemap_pointers[k >> 1])); } -void sub_818A5F(const uint8 *pp) { // 0x818A5F +void DrawGrappleOrProjectileSpritemap(const uint8 *pp) { // 0x818A5F + int idx = oam_next_ptr; int n = GET_WORD(pp); - if (!n) - return; pp += 2; - uint16 idx = oam_next_ptr; - do { - int v5 = idx >> 1; - uint16 v3 = R20_ + GET_WORD(pp); + for (; n != 0; n--) { + uint16 x = R20_ + GET_WORD(pp); OamEnt *v4 = gOamEnt(idx); - v4->xcoord = v3; - uint16 *dst = (uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v5]); - if ((v3 & 0x100) != 0) - *dst |= kOamExtra_X8Small_And_Large[v5]; - if (*(int16 *)pp < 0) - *dst |= kOamExtra_X8Small_And_Large[v5 + 1]; - v4->ycoord = R18_ + GET_BYTE(pp + 2); + v4->xcoord = x; + oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7)); + v4->ycoord = R18_ + pp[2]; *(uint16 *)&v4->charnum = GET_WORD(pp + 3); pp += 5; idx = (idx + 4) & 0x1FF; - } while (--n); + } oam_next_ptr = idx; } @@ -410,183 +271,96 @@ void DrawSpritemapWithBaseTile(uint8 db, uint16 j) { // 0x818AB8 if (j == 0) return; // bug fix uint8 *pp = (uint8 *)RomPtrWithBank(db, j); + int idx = oam_next_ptr; int n = GET_WORD(pp); - uint16 v3 = oam_next_ptr; pp += 2; for(; n != 0; n--) { - int v7 = v3 >> 1; - OamEnt *oam = gOamEnt(v3); - uint16 v5 = R20_ + GET_WORD(pp + 0); - oam->xcoord = v5; - uint16 *dst = (uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v7]); - if ((v5 & 0x100) != 0) - *dst |= kOamExtra_X8Small_And_Large[v7]; - if (*(int16 *)pp < 0) - *dst |= kOamExtra_X8Small_And_Large[v7 + 1]; + OamEnt *oam = gOamEnt(idx); + uint16 x = R20_ + GET_WORD(pp + 0); + oam->xcoord = x; + oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7)); oam->ycoord = R18_ + pp[2]; *(uint16 *)&oam->charnum = R3_.addr | (R0_.addr + GET_WORD(pp + 3)); pp += 5; - v3 = (v3 + 4) & 0x1FF; + idx = (idx + 4) & 0x1FF; } - oam_next_ptr = v3; + oam_next_ptr = idx; } void DrawSpritemapWithBaseTile2(uint8 db, uint16 j) { // 0x818B22 const uint8 *pp = RomPtrWithBank(db, j); - uint16 v4 = oam_next_ptr; + int idx = oam_next_ptr; int n = GET_WORD(pp); pp += 2; for (; n != 0; n--) { - int v8 = v4 >> 1; - OamEnt *oam = gOamEnt(v4); - uint16 v6 = R20_ + GET_WORD(pp + 0); - oam->xcoord = v6; - uint16 *dst = (uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]); - if ((v6 & 0x100) != 0) - *dst |= kOamExtra_X8Small_And_Large[v8]; - if (*(int16 *)pp < 0) - *dst |= kOamExtra_X8Small_And_Large[v8 + 1]; - int y = pp[2] + LOBYTE(R18_); - if ((pp[2] & 0x80) ? (y & 0x100) == 0 : (y & 0x100) != 0) - y = 0xf0; - oam->ycoord = y; + OamEnt *oam = gOamEnt(idx); + uint16 x = R20_ + GET_WORD(pp + 0); + oam->xcoord = x; + oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7)); + int y = pp[2] + (uint8)R18_; + oam->ycoord = (!(y & 0x100) == !sign8(pp[2])) ? y : 0xf0; *(uint16 *)&oam->charnum = R3_.addr | (R0_.addr + GET_WORD(pp + 3)); pp += 5; - v4 = (v4 + 4) & 0x1FF; + idx = (idx + 4) & 0x1FF; } - oam_next_ptr = v4; + oam_next_ptr = idx; } void DrawSpritemapWithBaseTileOffscreen(uint8 db, uint16 j, uint16 r20_x, uint16 r18_y) { // 0x818B96 const uint8 *pp = RomPtrWithBank(db, j); - uint16 v4 = oam_next_ptr; - int n = GET_WORD(pp); pp += 2; - for (; n; n--) { - int v8 = v4 >> 1; - int v6 = r20_x + GET_WORD(pp + 0); - OamEnt *v7 = gOamEnt(v4); - v7->xcoord = v6; - uint16 *dst = (uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]); - if ((v6 & 0x100) != 0) - *dst |= kOamExtra_X8Small_And_Large[v8]; - if (*(int16 *)pp < 0) - *dst |= kOamExtra_X8Small_And_Large[v8 + 1]; - uint8 v12 = pp[2]; - bool v13 = __CFADD__uint8((uint8)R18_, v12); - v12 += r18_y; - if (!!sign8(pp[2]) == v13) - v12 = 0xf0; - v7->ycoord = v12; - *(uint16 *)&v7->charnum = R3_.addr | (R0_.addr + GET_WORD(pp + 3)); + int idx = oam_next_ptr; + int n = GET_WORD(pp); + pp += 2; + for (; n != 0; n--) { + OamEnt *oam = gOamEnt(idx); + int x = r20_x + GET_WORD(pp + 0); + oam->xcoord = x; + oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7)); + int y = pp[2] + (uint8)r18_y; + oam->ycoord = (!(y & 0x100) != !sign8(pp[2])) ? y : 0xf0; + *(uint16 *)&oam->charnum = R3_.addr | (R0_.addr + GET_WORD(pp + 3)); pp += 5; - v4 = (v4 + 4) & 0x1FF; + idx = (idx + 4) & 0x1FF; } - oam_next_ptr = v4; + oam_next_ptr = idx; } void DrawEnemyProjectileSpritemapWithBaseTile(uint8 db, uint16 j) { // 0x818C0A - int16 v6; - OamEnt *v7; - int8 v10; - int8 v12; // cf - - const uint16 *v2 = (const uint16 *)RomPtrWithBank(db, j); - if (*v2) { - R24_ = *v2; - uint16 v3 = j + 2; - uint16 v4 = oam_next_ptr; - while (1) { - const uint8 *v5 = RomPtrWithBank(db, v3); - v6 = R20_ + GET_WORD(v5); - v7 = gOamEnt(v4); - *(uint16 *)&v7->xcoord = v6; - if ((v6 & 0x100) != 0) { - int v8 = v4 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]) |= kOamExtra_X8Small_And_Large[v8]; - } - v10 = v5[2]; - if (v10 >= 0) { - bool v11 = __CFADD__uint8((uint8)R18_, v10); - v10 += R18_; - if (!v11) - goto LABEL_10; - if (v11) - goto LABEL_9; - } - bool v11; - v11 = __CFADD__uint8((uint8)R18_, v10); - v10 += R18_; - if (!v11) - LABEL_9: v10 = -16; -LABEL_10: - v7->ycoord = v10; - v12 = 0; - if (*(int16 *)v5 < 0) { - int v13 = v4 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v13]) |= kOamExtra_X8Small_And_Large[v13 + 1]; - } - *(uint16 *)&v7->charnum = R28_ | (R26_ + v12 + GET_WORD(v5 + 3)); - v4 = (v4 + 4) & 0x1FF; - v3 += 5; - if (!--R24_) { - oam_next_ptr = v4; - return; - } - } + const uint8 *pp = RomPtrWithBank(db, j); + int idx = oam_next_ptr; + int n = GET_WORD(pp); + pp += 2; + for (; n != 0; n--) { + OamEnt *oam = gOamEnt(idx); + uint16 x = R20_ + GET_WORD(pp); + oam->xcoord = x; + oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7)); + int y = pp[2] + (uint8)R18_; + oam->ycoord = (!(y & 0x100) == !sign8(pp[2])) ? y : 0xf0; + *(uint16 *)&oam->charnum = R28_ | (R26_ + GET_WORD(pp + 3)); + idx = (idx + 4) & 0x1FF; + pp += 5; } + oam_next_ptr = idx; } void DrawEnemyProjectileSpritemapWithBaseTileOffscreen(uint8 db, uint16 j) { // 0x818C7F - int16 v6; - OamEnt *v7; - int8 v10; - int8 v12; // cf - - const uint16 *v2 = (const uint16 *)RomPtrWithBank(db, j); - if (*v2) { - R24_ = *v2; - uint16 v3 = j + 2; - uint16 v4 = oam_next_ptr; - while (1) { - const uint8 *v5 = RomPtrWithBank(db, v3); - v6 = R20_ + GET_WORD(v5); - v7 = gOamEnt(v4); - *(uint16 *)&v7->xcoord = v6; - if ((v6 & 0x100) != 0) { - int v8 = v4 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]) |= kOamExtra_X8Small_And_Large[v8]; - } - v10 = v5[2]; - if (v10 >= 0) { - bool v11 = __CFADD__uint8((uint8)R18_, v10); - v10 += R18_; - if (v11) - goto LABEL_10; - if (!v11) - goto LABEL_9; - } - bool v11; - v11 = __CFADD__uint8((uint8)R18_, v10); - v10 += R18_; - if (v11) - LABEL_9: - v10 = -16; -LABEL_10: - v7->ycoord = v10; - v12 = 0; - if (*(int16 *)v5 < 0) { - int v13 = v4 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v13]) |= kOamExtra_X8Small_And_Large[v13 + 1]; - } - *(uint16 *)&v7->charnum = R28_ | (R26_ + v12 + GET_WORD(v5 + 3)); - v4 = (v4 + 4) & 0x1FF; - v3 += 5; - if (!--R24_) { - oam_next_ptr = v4; - return; - } - } + const uint8 *pp = RomPtrWithBank(db, j); + int idx = oam_next_ptr; + int n = GET_WORD(pp); + pp += 2; + for (; n != 0; n--) { + OamEnt *oam = gOamEnt(idx); + uint16 x = R20_ + GET_WORD(pp); + oam->xcoord = x; + oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7)); + int y = pp[2] + (uint8)R18_; + oam->ycoord = (!(y & 0x100) != !sign8(pp[2])) ? y : 0xf0; + *(uint16 *)&oam->charnum = R28_ | (R26_ + GET_WORD(pp + 3)); + idx = (idx + 4) & 0x1FF; + pp += 5; } + oam_next_ptr = idx; } void GameOverMenu_0_FadeOutConfigGfx(void) { // 0x818D0F