From 72fa68ea60d08f64f6df4f3ee12fb3333e2c55dc Mon Sep 17 00:00:00 2001 From: WhenGryphonsFly <84215159+WhenGryphonsFly@users.noreply.github.com> Date: Thu, 14 Mar 2024 21:36:34 -0500 Subject: [PATCH] Decompile sub_9E90 Co-Authored-By: jiangzhengwenjz <15051292+jiangzhengwenjz@users.noreply.github.com> --- include/variables.h | 1 + src/intro.c | 451 +++++++++----------------------------------- 2 files changed, 92 insertions(+), 360 deletions(-) diff --git a/include/variables.h b/include/variables.h index bd8d8c4..e7a7e93 100644 --- a/include/variables.h +++ b/include/variables.h @@ -293,6 +293,7 @@ extern s16 gUnknown_0202ADA0[]; extern s32 gUnknown_0202BEF0; extern const struct SpriteSet *const gUnknown_086A769C[]; extern struct SpriteGroup gUnknown_0200D078[]; +extern struct SpriteGroup gUnknown_0200D638; extern struct UnkStruct_086A7768 gUnknown_086A7798[0x4]; extern s32 gUnknown_0201C188; diff --git a/src/intro.c b/src/intro.c index 77e3499..59fe3b8 100644 --- a/src/intro.c +++ b/src/intro.c @@ -76,25 +76,25 @@ struct unkStruct_201A450 u16 unk10; u16 unk12; u8 fill14[0x18 - 0x14]; - u16 unk18; + s16 unk18; u16 fill1A; - u8 unk1C; + s8 unk1C; u8 fill1D[0x20 - 0x1D]; u16 unk20; u16 unk22; u8 fill24[0x2C - 0x24]; - u8 unk2C; + s8 unk2C; u8 fill2D[0x30 - 0x2D]; u16 unk30; u16 unk32; u8 fill34[0x3A - 0x34]; s16 unk3A; - u8 unk3C; + s8 unk3C; u8 fill3D[0x40 - 0x3D]; u16 unk40; u16 unk42; u8 fill44[0x4C - 0x44]; - u8 unk4C; + s8 unk4C; }; extern struct unkStruct_201A450 gUnknown_0201A450; @@ -573,363 +573,94 @@ void sub_9D70(void) puVar4->available = 0; } -// TODO see https://decomp.me/scratch/9Nuw9 -NAKED void sub_9E90(void) { - asm_unified("\n\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, sl\n\ - mov r6, sb\n\ - mov r5, r8\n\ - push {r5, r6, r7}\n\ - sub sp, #4\n\ - ldr r3, _0800A12C @ =gMain\n\ - ldrh r0, [r3, #0x38]\n\ - movs r0, #0xf1\n\ - lsls r0, r0, #4\n\ - strh r0, [r3, #0x38]\n\ - ldr r0, _0800A130 @ =gUnknown_0201C1B8\n\ - ldrb r1, [r0]\n\ - ldr r0, _0800A134 @ =gUnknown_0202ADD4\n\ - ldrb r0, [r0]\n\ - lsls r0, r0, #8\n\ - orrs r1, r0\n\ - ldrh r0, [r3, #0x3a]\n\ - strh r1, [r3, #0x3a]\n\ - ldr r1, _0800A138 @ =0x04000050\n\ - ldrh r0, [r3, #0x38]\n\ - strh r0, [r1]\n\ - adds r1, #2\n\ - ldrh r0, [r3, #0x3a]\n\ - strh r0, [r1]\n\ - ldr r4, _0800A13C @ =gUnknown_0201A450\n\ - movs r0, #0x18\n\ - ldrsh r1, [r4, r0]\n\ - movs r0, #0xb8\n\ - muls r0, r1, r0\n\ - movs r1, #0xbe\n\ - lsls r1, r1, #2\n\ - adds r2, r3, r1\n\ - adds r0, r0, r2\n\ - mov r8, r0\n\ - movs r6, #0xa4\n\ - lsls r6, r6, #3\n\ - adds r6, r6, r3\n\ - mov sb, r6\n\ - movs r7, #0x8d\n\ - lsls r7, r7, #3\n\ - adds r7, r7, r3\n\ - mov sl, r7\n\ - movs r0, #0x1c\n\ - ldrsb r0, [r4, r0]\n\ - mov r1, r8\n\ - strh r0, [r1]\n\ - adds r0, r4, #0\n\ - adds r0, #0x2c\n\ - ldrb r0, [r0]\n\ - lsls r0, r0, #0x18\n\ - asrs r0, r0, #0x18\n\ - strh r0, [r6]\n\ - adds r0, r4, #0\n\ - adds r0, #0x3c\n\ - ldrb r0, [r0]\n\ - lsls r0, r0, #0x18\n\ - asrs r0, r0, #0x18\n\ - strh r0, [r7]\n\ - adds r0, r4, #0\n\ - adds r0, #0x4c\n\ - ldrb r0, [r0]\n\ - lsls r0, r0, #0x18\n\ - asrs r0, r0, #0x18\n\ - ldr r6, _0800A140 @ =gUnknown_0200D638\n\ - strh r0, [r6]\n\ - ldr r5, _0800A144 @ =gUnknown_086A769C\n\ - adds r0, r5, #0\n\ - movs r1, #0x31\n\ - bl LoadSpriteSets\n\ - mov r7, r8\n\ - ldrh r0, [r7]\n\ - cmp r0, #1\n\ - bne _08009F9E\n\ - ldrh r0, [r4, #0x10]\n\ - strh r0, [r7, #2]\n\ - ldrh r0, [r4, #0x12]\n\ - strh r0, [r7, #4]\n\ - movs r1, #0x18\n\ - ldrsh r0, [r4, r1]\n\ - lsls r0, r0, #2\n\ - adds r0, r0, r5\n\ - ldr r0, [r0]\n\ - str r0, [sp]\n\ - movs r5, #0\n\ - ldrh r2, [r0]\n\ - cmp r5, r2\n\ - bge _08009F9E\n\ - ldr r7, _0800A148 @ =gOamBuffer\n\ - ldr r6, _0800A14C @ =0xFFFFFE00\n\ - mov ip, r6\n\ - mov r4, r8\n\ - adds r4, #8\n\ -_08009F4C:\n\ - ldrh r2, [r4]\n\ - lsls r2, r2, #3\n\ - adds r2, r2, r7\n\ - ldrb r1, [r2, #1]\n\ - movs r0, #0xd\n\ - rsbs r0, r0, #0\n\ - ands r0, r1\n\ - movs r1, #4\n\ - orrs r0, r1\n\ - strb r0, [r2, #1]\n\ - ldrh r3, [r4]\n\ - lsls r3, r3, #3\n\ - adds r3, r3, r7\n\ - movs r0, #2\n\ - ldrsh r1, [r4, r0]\n\ - mov r2, r8\n\ - movs r6, #2\n\ - ldrsh r0, [r2, r6]\n\ - adds r1, r1, r0\n\ - ldr r2, _0800A150 @ =0x000001FF\n\ - adds r0, r2, #0\n\ - ands r1, r0\n\ - ldrh r2, [r3, #2]\n\ - mov r0, ip\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strh r0, [r3, #2]\n\ - ldrh r1, [r4]\n\ - lsls r1, r1, #3\n\ - adds r1, r1, r7\n\ - mov r6, r8\n\ - ldrb r0, [r6, #4]\n\ - ldrb r2, [r4, #4]\n\ - adds r0, r0, r2\n\ - strb r0, [r1]\n\ - adds r4, #8\n\ - adds r5, #1\n\ - ldr r6, [sp]\n\ - ldrh r6, [r6]\n\ - cmp r5, r6\n\ - blt _08009F4C\n\ -_08009F9E:\n\ - mov r7, sb\n\ - ldrh r0, [r7]\n\ - cmp r0, #1\n\ - bne _0800A01C\n\ - ldr r0, _0800A13C @ =gUnknown_0201A450\n\ - ldrh r1, [r0, #0x20]\n\ - strh r1, [r7, #2]\n\ - ldrh r0, [r0, #0x22]\n\ - strh r0, [r7, #4]\n\ - ldr r6, _0800A148 @ =gOamBuffer\n\ - movs r0, #0xd\n\ - rsbs r0, r0, #0\n\ - mov ip, r0\n\ - mov r4, sb\n\ - adds r4, #8\n\ - movs r5, #3\n\ -_08009FBE:\n\ - ldrh r1, [r4]\n\ - lsls r1, r1, #3\n\ - adds r1, r1, r6\n\ - ldrb r2, [r1, #1]\n\ - mov r0, ip\n\ - ands r0, r2\n\ - movs r2, #4\n\ - orrs r0, r2\n\ - strb r0, [r1, #1]\n\ - ldrh r1, [r4]\n\ - lsls r1, r1, #3\n\ - adds r1, r1, r6\n\ - ldrb r2, [r1, #5]\n\ - mov r0, ip\n\ - ands r0, r2\n\ - movs r7, #4\n\ - orrs r0, r7\n\ - strb r0, [r1, #5]\n\ - ldrh r3, [r4]\n\ - lsls r3, r3, #3\n\ - adds r3, r3, r6\n\ - movs r0, #2\n\ - ldrsh r1, [r4, r0]\n\ - mov r2, sb\n\ - movs r7, #2\n\ - ldrsh r0, [r2, r7]\n\ - adds r1, r1, r0\n\ - ldr r2, _0800A150 @ =0x000001FF\n\ - adds r0, r2, #0\n\ - ands r1, r0\n\ - ldrh r2, [r3, #2]\n\ - ldr r0, _0800A14C @ =0xFFFFFE00\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strh r0, [r3, #2]\n\ - ldrh r1, [r4]\n\ - lsls r1, r1, #3\n\ - adds r1, r1, r6\n\ - mov r7, sb\n\ - ldrb r0, [r7, #4]\n\ - ldrb r2, [r4, #4]\n\ - adds r0, r0, r2\n\ - strb r0, [r1]\n\ - adds r4, #8\n\ - subs r5, #1\n\ - cmp r5, #0\n\ - bge _08009FBE\n\ -_0800A01C:\n\ - mov r6, sl\n\ - ldrh r0, [r6]\n\ - cmp r0, #1\n\ - bne _0800A098\n\ - ldr r0, _0800A13C @ =gUnknown_0201A450\n\ - ldrh r1, [r0, #0x30]\n\ - strh r1, [r6, #2]\n\ - ldrh r0, [r0, #0x32]\n\ - strh r0, [r6, #4]\n\ - ldr r6, _0800A148 @ =gOamBuffer\n\ - ldr r7, _0800A14C @ =0xFFFFFE00\n\ - mov ip, r7\n\ - mov r4, sl\n\ - adds r4, #8\n\ - movs r5, #3\n\ -_0800A03A:\n\ - ldrh r1, [r4]\n\ - lsls r1, r1, #3\n\ - adds r1, r1, r6\n\ - ldrb r2, [r1, #1]\n\ - movs r0, #0xd\n\ - rsbs r0, r0, #0\n\ - ands r0, r2\n\ - strb r0, [r1, #1]\n\ - ldrh r2, [r4]\n\ - lsls r2, r2, #3\n\ - adds r2, r2, r6\n\ - ldrb r1, [r2, #5]\n\ - movs r0, #0xd\n\ - rsbs r0, r0, #0\n\ - ands r0, r1\n\ - movs r1, #4\n\ - orrs r0, r1\n\ - strb r0, [r2, #5]\n\ - ldrh r3, [r4]\n\ - lsls r3, r3, #3\n\ - adds r3, r3, r6\n\ - movs r0, #2\n\ - ldrsh r1, [r4, r0]\n\ - mov r2, sl\n\ - movs r7, #2\n\ - ldrsh r0, [r2, r7]\n\ - adds r1, r1, r0\n\ - ldr r2, _0800A150 @ =0x000001FF\n\ - adds r0, r2, #0\n\ - ands r1, r0\n\ - ldrh r2, [r3, #2]\n\ - mov r0, ip\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strh r0, [r3, #2]\n\ - ldrh r1, [r4]\n\ - lsls r1, r1, #3\n\ - adds r1, r1, r6\n\ - mov r7, sl\n\ - ldrb r0, [r7, #4]\n\ - ldrb r2, [r4, #4]\n\ - adds r0, r0, r2\n\ - strb r0, [r1]\n\ - adds r4, #8\n\ - subs r5, #1\n\ - cmp r5, #0\n\ - bge _0800A03A\n\ -_0800A098:\n\ - ldr r6, _0800A140 @ =gUnknown_0200D638\n\ - ldrh r0, [r6]\n\ - cmp r0, #1\n\ - bne _0800A10A\n\ - ldr r0, _0800A13C @ =gUnknown_0201A450\n\ - adds r1, r0, #0\n\ - adds r1, #0x40\n\ - ldrh r1, [r1]\n\ - strh r1, [r6, #2]\n\ - adds r0, #0x42\n\ - ldrh r0, [r0]\n\ - strh r0, [r6, #4]\n\ - ldr r6, _0800A148 @ =gOamBuffer\n\ - movs r7, #0xd\n\ - rsbs r7, r7, #0\n\ - mov ip, r7\n\ - ldr r4, _0800A140 @ =gUnknown_0200D638\n\ - adds r4, #8\n\ - movs r5, #7\n\ -_0800A0BE:\n\ - ldrh r2, [r4]\n\ - lsls r2, r2, #3\n\ - adds r2, r2, r6\n\ - ldrb r1, [r2, #5]\n\ - mov r0, ip\n\ - ands r0, r1\n\ - movs r1, #8\n\ - orrs r0, r1\n\ - strb r0, [r2, #5]\n\ - ldrh r3, [r4]\n\ - lsls r3, r3, #3\n\ - adds r3, r3, r6\n\ - movs r0, #2\n\ - ldrsh r1, [r4, r0]\n\ - ldr r2, _0800A140 @ =gUnknown_0200D638\n\ - movs r7, #2\n\ - ldrsh r0, [r2, r7]\n\ - adds r1, r1, r0\n\ - ldr r2, _0800A150 @ =0x000001FF\n\ - adds r0, r2, #0\n\ - ands r1, r0\n\ - ldrh r2, [r3, #2]\n\ - ldr r0, _0800A14C @ =0xFFFFFE00\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strh r0, [r3, #2]\n\ - ldrh r1, [r4]\n\ - lsls r1, r1, #3\n\ - adds r1, r1, r6\n\ - ldr r7, _0800A140 @ =gUnknown_0200D638\n\ - ldrb r0, [r7, #4]\n\ - ldrb r2, [r4, #4]\n\ - adds r0, r0, r2\n\ - strb r0, [r1]\n\ - adds r4, #8\n\ - subs r5, #1\n\ - cmp r5, #0\n\ - bge _0800A0BE\n\ -_0800A10A:\n\ - movs r0, #0\n\ - mov r6, r8\n\ - strh r0, [r6]\n\ - mov r7, sb\n\ - strh r0, [r7]\n\ - mov r1, sl\n\ - strh r0, [r1]\n\ - ldr r2, _0800A140 @ =gUnknown_0200D638\n\ - strh r0, [r2]\n\ - add sp, #4\n\ - pop {r3, r4, r5}\n\ - mov r8, r3\n\ - mov sb, r4\n\ - mov sl, r5\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0800A12C: .4byte gMain\n\ -_0800A130: .4byte gUnknown_0201C1B8\n\ -_0800A134: .4byte gUnknown_0202ADD4\n\ -_0800A138: .4byte 0x04000050\n\ -_0800A13C: .4byte gUnknown_0201A450\n\ -_0800A140: .4byte gUnknown_0200D638\n\ -_0800A144: .4byte gUnknown_086A769C\n\ -_0800A148: .4byte gOamBuffer\n\ -_0800A14C: .4byte 0xFFFFFE00\n\ -_0800A150: .4byte 0x000001FF"); + struct OamDataSimple *puVar5; + struct SpriteGroup *puVar1; + struct SpriteGroup *mainSg3; + struct SpriteGroup *mainSg2; + struct SpriteGroup *otherSg; + int i; + const u16 *p; + + gMain.blendControl = 0xF10; + gMain.blendAlpha = gUnknown_0201C1B8 | (gUnknown_0202ADD4 << 8); + REG_BLDCNT = gMain.blendControl; + REG_BLDALPHA = gMain.blendAlpha; + + puVar1 = &gMain.spriteGroups[gUnknown_0201A450.unk18]; + mainSg3 = &gMain.spriteGroups[3]; + mainSg2 = &gMain.spriteGroups[2]; + otherSg = &gUnknown_0200D638; + + puVar1->available = gUnknown_0201A450.unk1C; + mainSg3->available = gUnknown_0201A450.unk2C; + mainSg2->available = gUnknown_0201A450.unk3C; + otherSg->available = gUnknown_0201A450.unk4C; + LoadSpriteSets(gUnknown_086A769C, 0x31, gMain.spriteGroups); + + if (puVar1->available == 1) + { + puVar1->baseX = gUnknown_0201A450.unk10; + puVar1->baseY = gUnknown_0201A450.unk12; + p = &gUnknown_086A769C[gUnknown_0201A450.unk18]->count; + + for (i = 0; + i < *p; + i++) + { + puVar5 = &puVar1->oam[i]; + gOamBuffer[puVar5->oamId].objMode = 1; + gOamBuffer[puVar5->oamId].x = puVar1->oam[i].xOffset + puVar1->baseX; + gOamBuffer[puVar5->oamId].y = puVar1->oam[i].yOffset + puVar1->baseY; + } + } + if (mainSg3->available == 1) + { + mainSg3->baseX = gUnknown_0201A450.unk20; + mainSg3->baseY = gUnknown_0201A450.unk22; + + for (i = 0; i < 4; i++) + { + puVar5 = &mainSg3->oam[i]; + gOamBuffer[puVar5->oamId].objMode = 1; + gOamBuffer[puVar5->oamId].priority = 1; + gOamBuffer[puVar5->oamId].x = mainSg3->oam[i].xOffset + mainSg3->baseX; + gOamBuffer[puVar5->oamId].y = mainSg3->oam[i].yOffset + mainSg3->baseY; + } + } + if (mainSg2->available == 1) + { + mainSg2->baseX = gUnknown_0201A450.unk30; + mainSg2->baseY = gUnknown_0201A450.unk32; + + for (i = 0; i < 4; i++) + { + puVar5 = &mainSg2->oam[i]; + gOamBuffer[puVar5->oamId].objMode = 0; + gOamBuffer[puVar5->oamId].priority = 1; + gOamBuffer[puVar5->oamId].x = mainSg2->oam[i].xOffset + mainSg2->baseX; + gOamBuffer[puVar5->oamId].y = mainSg2->oam[i].yOffset + mainSg2->baseY; + } + } + if (otherSg->available == 1) + { + otherSg->baseX = gUnknown_0201A450.unk40; + otherSg->baseY = gUnknown_0201A450.unk42; + + for (i = 0; i < 8; i++) + { + puVar5 = &otherSg->oam[i]; + gOamBuffer[puVar5->oamId].priority = 2; + gOamBuffer[puVar5->oamId].x = otherSg->oam[i].xOffset + otherSg->baseX; + gOamBuffer[puVar5->oamId].y = otherSg->oam[i].yOffset + otherSg->baseY; + } + } + + puVar1->available = 0; + mainSg3->available = 0; + mainSg2->available = 0; + otherSg->available = 0; // TODO Possible Bug? } void sub_A154(void)