diff --git a/data/rom.s b/data/rom.s index c3cc058..69d3e8d 100644 --- a/data/rom.s +++ b/data/rom.s @@ -2586,7 +2586,20 @@ gUnknown_086A7C24:: @ 0x086A7C24 .incbin "baserom.gba", 0x6A7C24, 0x44 gUnknown_086A7C68:: @ 0x086A7C68 - .incbin "baserom.gba", 0x6A7C68, 0xB8 + .byte 0x05, 0x02, 0x03, 0x01, 0x06, 0x01 + .align 2,0 + .byte 0x05, 0xFE, 0x03, 0xFF, 0x19, 0x02 + .align 2,0 + .byte 0xFB, 0x02, 0xFD, 0x01, 0x28, 0x01 + .align 2,0 + .byte 0xFE, 0x05, 0xFF, 0x03, 0x34, 0x02 + .align 2,0 + .byte 0xFE, 0xFB, 0xFF, 0xFD, 0x34, 0x01 + .align 2,0 + .byte 0, 0, 0, 0, 0, 0 + .align 2, 0 + + .incbin "baserom.gba", 0x6A7C98, 0x88 gUnknown_086A7D20:: @ 0x086A7D20 .incbin "baserom.gba", 0x6A7D20, 0x2C diff --git a/expected_objs/sub_C4F0.o b/expected_objs/sub_C4F0.o deleted file mode 100644 index 77c9104..0000000 Binary files a/expected_objs/sub_C4F0.o and /dev/null differ diff --git a/src/intro.c b/src/intro.c index 190cc75..f659278 100644 --- a/src/intro.c +++ b/src/intro.c @@ -81,8 +81,7 @@ struct UnkStruct_0201A450 s16 unk8; s16 unkA; s8 unkC; -}; - +}; // 0x10 size in memory extern struct UnkStruct_0201A450 gUnknown_0201A450[6]; extern struct UnkStruct_086A7768 gUnknown_086A7768[0x8]; @@ -100,6 +99,19 @@ struct UnkStruct_086A7AC0 { extern struct UnkStruct_086A7AC0 gUnknown_086A7AC0[]; extern struct UnkStruct_086A7AC0 gUnknown_086A7B34[]; +extern const struct SpriteSet *const gUnknown_086A7C24[]; + +struct UnkStruct_086A7C68 +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; + u8 unk4; + u8 unk5; +}; // 0x8 size in memory +extern const struct UnkStruct_086A7C68 gUnknown_086A7C68[]; + void IntroMain(void) { gIntroStateFuncs[gMain.subState](); @@ -1958,410 +1970,118 @@ void sub_C498(void) gIntroSceneIndex++; } -// See https://decomp.me/scratch/w2I8G -NAKED void sub_C4F0(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, #0x20\n\ - ldr r0, _0800C64C @ =gMain_spriteGroups\n\ - mov r8, r0\n\ - ldr r6, _0800C650 @ =gUnknown_0201A450\n\ - movs r1, #0x28\n\ - ldrsh r0, [r6, r1]\n\ - movs r2, #0xe6\n\ - lsls r2, r2, #2\n\ - adds r3, r0, #0\n\ - muls r3, r2, r3\n\ - movs r0, #0xb8\n\ - lsls r0, r0, #1\n\ - add r0, r8\n\ - adds r3, r3, r0\n\ - str r3, [sp]\n\ - movs r7, #0x38\n\ - ldrsh r0, [r6, r7]\n\ - muls r0, r2, r0\n\ - movs r1, #0x8a\n\ - lsls r1, r1, #2\n\ - add r1, r8\n\ - adds r0, r0, r1\n\ - str r0, [sp, #4]\n\ - adds r0, r6, #0\n\ - adds r0, #0x48\n\ - movs r1, #0\n\ - ldrsh r0, [r0, r1]\n\ - muls r0, r2, r0\n\ - movs r1, #0xb8\n\ - lsls r1, r1, #2\n\ - add r1, r8\n\ - adds r0, r0, r1\n\ - str r0, [sp, #8]\n\ - adds r0, r6, #0\n\ - adds r0, #0x58\n\ - movs r7, #0\n\ - ldrsh r0, [r0, r7]\n\ - muls r0, r2, r0\n\ - adds r1, r2, #0\n\ - add r1, r8\n\ - adds r0, r0, r1\n\ - str r0, [sp, #0xc]\n\ - adds r0, r6, #0\n\ - adds r0, #0x68\n\ - movs r1, #0\n\ - ldrsh r0, [r0, r1]\n\ - muls r0, r2, r0\n\ - movs r1, #0x8a\n\ - lsls r1, r1, #3\n\ - add r1, r8\n\ - adds r0, r0, r1\n\ - str r0, [sp, #0x10]\n\ - movs r0, #0xc\n\ - ldrsb r0, [r6, r0]\n\ - mov r2, r8\n\ - strh r0, [r2]\n\ - movs r0, #1\n\ - ldr r7, _0800C654 @ =gMain_spriteGroups_1\n\ - strh r0, [r7]\n\ - adds r0, r6, #0\n\ - adds r0, #0x2c\n\ - ldrb r0, [r0]\n\ - lsls r0, r0, #0x18\n\ - asrs r0, r0, #0x18\n\ - strh r0, [r3]\n\ - ldr r1, [sp, #4]\n\ - adds r0, r6, #0\n\ - adds r0, #0x3c\n\ - ldrb r0, [r0]\n\ - lsls r0, r0, #0x18\n\ - asrs r0, r0, #0x18\n\ - strh r0, [r1]\n\ - ldr r1, [sp, #8]\n\ - adds r0, r6, #0\n\ - adds r0, #0x4c\n\ - ldrb r0, [r0]\n\ - lsls r0, r0, #0x18\n\ - asrs r0, r0, #0x18\n\ - strh r0, [r1]\n\ - ldr r1, [sp, #0xc]\n\ - adds r0, r6, #0\n\ - adds r0, #0x5c\n\ - ldrb r0, [r0]\n\ - lsls r0, r0, #0x18\n\ - asrs r0, r0, #0x18\n\ - strh r0, [r1]\n\ - ldr r1, [sp, #0x10]\n\ - adds r0, r6, #0\n\ - adds r0, #0x6c\n\ - ldrb r0, [r0]\n\ - lsls r0, r0, #0x18\n\ - asrs r0, r0, #0x18\n\ - strh r0, [r1]\n\ - ldr r0, _0800C658 @ =gUnknown_086A7C24\n\ - movs r1, #0x11\n\ - bl LoadSpriteSets\n\ - mov r1, r8\n\ - ldrh r0, [r1]\n\ - cmp r0, #1\n\ - bne _0800C614\n\ - ldrh r0, [r6]\n\ - strh r0, [r1, #2]\n\ - ldrh r0, [r6, #2]\n\ - strh r0, [r1, #4]\n\ - mov r5, r8\n\ - adds r5, #8\n\ - ldr r4, _0800C65C @ =gOamBuffer\n\ - ldrh r1, [r1, #8]\n\ - lsls r1, r1, #3\n\ - adds r1, r1, r4\n\ - ldrb r2, [r1, #5]\n\ - movs r0, #0xd\n\ - rsbs r0, r0, #0\n\ - ands r0, r2\n\ - strb r0, [r1, #5]\n\ - mov r3, r8\n\ - ldrh r2, [r3, #8]\n\ - lsls r2, r2, #3\n\ - adds r2, r2, r4\n\ - movs r7, #2\n\ - ldrsh r1, [r5, r7]\n\ - movs r7, #2\n\ - ldrsh r0, [r3, r7]\n\ - adds r1, r1, r0\n\ - ldr r3, _0800C660 @ =0x000001FF\n\ - adds r0, r3, #0\n\ - ands r1, r0\n\ - ldrh r3, [r2, #2]\n\ - ldr r0, _0800C664 @ =0xFFFFFE00\n\ - ands r0, r3\n\ - orrs r0, r1\n\ - strh r0, [r2, #2]\n\ - mov r7, r8\n\ - ldrh r1, [r7, #8]\n\ - lsls r1, r1, #3\n\ - adds r1, r1, r4\n\ - ldrb r0, [r7, #4]\n\ - ldrb r5, [r5, #4]\n\ - adds r0, r0, r5\n\ - strb r0, [r1]\n\ -_0800C614:\n\ - movs r5, #0\n\ - str r6, [sp, #0x14]\n\ -_0800C618:\n\ - lsls r1, r5, #2\n\ - mov r2, sp\n\ - adds r0, r2, r1\n\ - ldr r0, [r0]\n\ - ldrh r0, [r0]\n\ - adds r4, r1, #0\n\ - adds r3, r5, #1\n\ - str r3, [sp, #0x18]\n\ - cmp r0, #1\n\ - beq _0800C62E\n\ - b _0800C75A\n\ -_0800C62E:\n\ - ldr r1, _0800C668 @ =gUnknown_0202A578\n\ - ldrh r0, [r1]\n\ - adds r0, #1\n\ - strh r0, [r1]\n\ - lsls r0, r0, #0x10\n\ - asrs r0, r0, #0x10\n\ - cmp r0, #5\n\ - ble _0800C670\n\ - lsls r1, r5, #3\n\ - ldr r6, _0800C66C @ =gUnknown_086A7C68\n\ - adds r0, r1, r6\n\ - ldrb r2, [r0, #2]\n\ - ldrb r0, [r0, #3]\n\ - b _0800C67A\n\ - .align 2, 0\n\ -_0800C64C: .4byte gMain_spriteGroups\n\ -_0800C650: .4byte gUnknown_0201A450\n\ -_0800C654: .4byte gMain_spriteGroups_1\n\ -_0800C658: .4byte gUnknown_086A7C24\n\ -_0800C65C: .4byte gOamBuffer\n\ -_0800C660: .4byte 0x000001FF\n\ -_0800C664: .4byte 0xFFFFFE00\n\ -_0800C668: .4byte gUnknown_0202A578\n\ -_0800C66C: .4byte gUnknown_086A7C68\n\ -_0800C670:\n\ - lsls r1, r5, #3\n\ - ldr r7, _0800C7F8 @ =gUnknown_086A7C68\n\ - adds r0, r1, r7\n\ - ldrb r2, [r0]\n\ - ldrb r0, [r0, #1]\n\ -_0800C67A:\n\ - adds r7, r1, #0\n\ - adds r3, r5, #2\n\ - lsls r1, r3, #4\n\ - ldr r6, [sp, #0x14]\n\ - adds r1, r1, r6\n\ - lsls r2, r2, #0x18\n\ - asrs r2, r2, #0x18\n\ - ldrh r6, [r1]\n\ - adds r2, r2, r6\n\ - strh r2, [r1]\n\ - lsls r0, r0, #0x18\n\ - asrs r0, r0, #0x18\n\ - ldrh r6, [r1, #2]\n\ - adds r0, r0, r6\n\ - strh r0, [r1, #2]\n\ - add r4, sp\n\ - ldr r0, [r4]\n\ - strh r2, [r0, #2]\n\ - ldr r2, [r4]\n\ - ldrh r0, [r1, #2]\n\ - strh r0, [r2, #4]\n\ - movs r0, #8\n\ - ldrsh r1, [r1, r0]\n\ - lsls r0, r1, #2\n\ - adds r0, r0, r1\n\ - adds r0, #2\n\ - adds r0, r5, r0\n\ - lsls r0, r0, #2\n\ - ldr r1, _0800C7FC @ =gUnknown_086A7C24\n\ - adds r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov sb, r0\n\ - movs r6, #0\n\ - str r3, [sp, #0x1c]\n\ - adds r5, #1\n\ - str r5, [sp, #0x18]\n\ - ldrh r2, [r0]\n\ - cmp r6, r2\n\ - bge _0800C732\n\ - ldr r3, _0800C800 @ =gOamBuffer\n\ - mov ip, r3\n\ - ldr r0, _0800C7F8 @ =gUnknown_086A7C68\n\ - adds r7, r7, r0\n\ - mov sl, r7\n\ - movs r7, #8\n\ -_0800C6D4:\n\ - ldr r0, [r4]\n\ - adds r5, r0, r7\n\ - ldrh r2, [r5]\n\ - lsls r2, r2, #3\n\ - add r2, ip\n\ - mov r0, sl\n\ - ldrb r1, [r0, #5]\n\ - movs r3, #3\n\ - ands r1, r3\n\ - lsls r1, r1, #2\n\ - ldrb r3, [r2, #5]\n\ - movs r0, #0xd\n\ - rsbs r0, r0, #0\n\ - ands r0, r3\n\ - orrs r0, r1\n\ - strb r0, [r2, #5]\n\ - ldrh r2, [r5]\n\ - lsls r2, r2, #3\n\ - add r2, ip\n\ - movs r0, #2\n\ - ldrsh r1, [r5, r0]\n\ - ldr r0, [r4]\n\ - movs r3, #2\n\ - ldrsh r0, [r0, r3]\n\ - adds r1, r1, r0\n\ - ldr r3, _0800C804 @ =0x000001FF\n\ - adds r0, r3, #0\n\ - ands r1, r0\n\ - ldrh r3, [r2, #2]\n\ - ldr r0, _0800C808 @ =0xFFFFFE00\n\ - ands r0, r3\n\ - orrs r0, r1\n\ - strh r0, [r2, #2]\n\ - ldrh r1, [r5]\n\ - lsls r1, r1, #3\n\ - add r1, ip\n\ - ldr r0, [r4]\n\ - ldrb r0, [r0, #4]\n\ - ldrb r5, [r5, #4]\n\ - adds r0, r0, r5\n\ - strb r0, [r1]\n\ - adds r7, #8\n\ - adds r6, #1\n\ - mov r0, sb\n\ - ldrh r0, [r0]\n\ - cmp r6, r0\n\ - blt _0800C6D4\n\ -_0800C732:\n\ - ldr r1, [sp, #0x1c]\n\ - lsls r0, r1, #4\n\ - ldr r2, [sp, #0x14]\n\ - adds r3, r0, r2\n\ - ldrh r0, [r3, #0xa]\n\ - adds r0, #1\n\ - movs r1, #0\n\ - strh r0, [r3, #0xa]\n\ - lsls r0, r0, #0x10\n\ - asrs r0, r0, #0x10\n\ - cmp r0, #4\n\ - ble _0800C75A\n\ - strh r1, [r3, #0xa]\n\ - ldrh r1, [r3, #8]\n\ - movs r6, #8\n\ - ldrsh r0, [r3, r6]\n\ - cmp r0, #1\n\ - bgt _0800C75A\n\ - adds r0, r1, #1\n\ - strh r0, [r3, #8]\n\ -_0800C75A:\n\ - ldr r5, [sp, #0x18]\n\ - cmp r5, #4\n\ - bgt _0800C762\n\ - b _0800C618\n\ -_0800C762:\n\ - ldr r7, _0800C80C @ =gMain_spriteGroups_1\n\ - ldrh r0, [r7]\n\ - cmp r0, #1\n\ - bne _0800C7C8\n\ - ldr r0, _0800C810 @ =gUnknown_0201A450\n\ - ldrh r1, [r0, #0x10]\n\ - strh r1, [r7, #2]\n\ - ldrh r0, [r0, #0x12]\n\ - strh r0, [r7, #4]\n\ - ldr r5, _0800C800 @ =gOamBuffer\n\ - ldr r0, _0800C808 @ =0xFFFFFE00\n\ - mov sb, r0\n\ - adds r4, r7, #0\n\ - adds r4, #8\n\ - movs r6, #3\n\ -_0800C780:\n\ - ldrh r2, [r4]\n\ - lsls r2, r2, #3\n\ - adds r2, r2, r5\n\ - ldrb r0, [r2, #5]\n\ - movs r1, #0xc\n\ - orrs r0, r1\n\ - strb r0, [r2, #5]\n\ - ldrh r3, [r4]\n\ - lsls r3, r3, #3\n\ - adds r3, r3, r5\n\ - movs r2, #2\n\ - ldrsh r1, [r4, r2]\n\ - ldr r7, _0800C80C @ =gMain_spriteGroups_1\n\ - movs r2, #2\n\ - ldrsh r0, [r7, r2]\n\ - adds r1, r1, r0\n\ - ldr r7, _0800C804 @ =0x000001FF\n\ - adds r0, r7, #0\n\ - ands r1, r0\n\ - ldrh r2, [r3, #2]\n\ - mov r0, sb\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, r5\n\ - ldr r2, _0800C80C @ =gMain_spriteGroups_1\n\ - ldrb r0, [r2, #4]\n\ - ldrb r3, [r4, #4]\n\ - adds r0, r0, r3\n\ - strb r0, [r1]\n\ - adds r4, #8\n\ - subs r6, #1\n\ - cmp r6, #0\n\ - bge _0800C780\n\ -_0800C7C8:\n\ - movs r0, #0\n\ - ldr r6, _0800C80C @ =gMain_spriteGroups_1\n\ - strh r0, [r6]\n\ - mov r7, r8\n\ - strh r0, [r7]\n\ - ldr r1, [sp]\n\ - strh r0, [r1]\n\ - ldr r1, [sp, #4]\n\ - strh r0, [r1]\n\ - ldr r1, [sp, #8]\n\ - strh r0, [r1]\n\ - ldr r1, [sp, #0xc]\n\ - strh r0, [r1]\n\ - ldr r1, [sp, #0x10]\n\ - strh r0, [r1]\n\ - add sp, #0x20\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\ -_0800C7F8: .4byte gUnknown_086A7C68\n\ -_0800C7FC: .4byte gUnknown_086A7C24\n\ -_0800C800: .4byte gOamBuffer\n\ -_0800C804: .4byte 0x000001FF\n\ -_0800C808: .4byte 0xFFFFFE00\n\ -_0800C80C: .4byte gMain_spriteGroups_1\n\ -_0800C810: .4byte gUnknown_0201A450\n\ - "); -} + struct SpriteGroup *sg0; + struct SpriteGroup *sg1; + struct SpriteGroup *spriteGroups[5]; + struct OamDataSimple *oamData; + const struct SpriteSet *p; + s32 i; + s32 j; + s8 cVar1; + s8 cVar2; + + sg0 = &gMain.spriteGroups[0]; + sg1 = &gMain.spriteGroups[1]; + + spriteGroups[0] = &gMain.spriteGroups[(5 * gUnknown_0201A450[2].unk8) + 2]; + spriteGroups[1] = &gMain.spriteGroups[(5 * gUnknown_0201A450[3].unk8) + 3]; + spriteGroups[2] = &gMain.spriteGroups[(5 * gUnknown_0201A450[4].unk8) + 4]; + spriteGroups[3] = &gMain.spriteGroups[(5 * gUnknown_0201A450[5].unk8) + 5]; + spriteGroups[4] = &gMain.spriteGroups[(5 * gUnknown_0201A450[6].unk8) + 6]; + + + sg0->available = gUnknown_0201A450[0].unkC; + sg1->available = 1; + + spriteGroups[0]->available = gUnknown_0201A450[2].unkC; + spriteGroups[1]->available = gUnknown_0201A450[3].unkC; + spriteGroups[2]->available = gUnknown_0201A450[4].unkC; + spriteGroups[3]->available = gUnknown_0201A450[5].unkC; + spriteGroups[4]->available = gUnknown_0201A450[6].unkC; + + LoadSpriteSets(gUnknown_086A7C24, 0x11, gMain.spriteGroups); + + if (sg0->available == 1) + { + sg0->baseX = gUnknown_0201A450[0].unk0; + sg0->baseY = gUnknown_0201A450[0].unk2; + oamData = &sg0->oam[0]; + gOamBuffer[oamData->oamId].priority = 0; + gOamBuffer[oamData->oamId].x = oamData->xOffset + sg0->baseX; + gOamBuffer[oamData->oamId].y = oamData->yOffset + sg0->baseY; + } + + for (i = 0; i < 5; i++) + { + if (spriteGroups[i]->available == 1) + { + gUnknown_0202A578++; + if (gUnknown_0202A578 > 5) + { + cVar1 = gUnknown_086A7C68[i].unk2; + cVar2 = gUnknown_086A7C68[i].unk3; + } + else + { + cVar1 = gUnknown_086A7C68[i].unk0; + cVar2 = gUnknown_086A7C68[i].unk1; + } + + gUnknown_0201A450[2 + i].unk0 += cVar1; + gUnknown_0201A450[2 + i].unk2 += cVar2; + spriteGroups[i]->baseX = gUnknown_0201A450[2 + i].unk0; + spriteGroups[i]->baseY = gUnknown_0201A450[2 + i].unk2; + + p = gUnknown_086A7C24[( 2 + i) + (5 * gUnknown_0201A450[2 + i].unk8)]; + + for (j = 0; j < p->count; j++) + { + oamData = &spriteGroups[i]->oam[j]; + gOamBuffer[oamData->oamId].priority = (&gUnknown_086A7C68[i])->unk5; + gOamBuffer[oamData->oamId].x = oamData->xOffset + spriteGroups[i]->baseX; + gOamBuffer[oamData->oamId].y = oamData->yOffset + spriteGroups[i]->baseY; + } + + gUnknown_0201A450[2 + i].unkA++; + + if (gUnknown_0201A450[2 + i].unkA > 0x4) + { + gUnknown_0201A450[2 + i].unkA = 0; + if (gUnknown_0201A450[2 + i].unk8 < 0x2) + { + gUnknown_0201A450[2 + i].unk8++; + } + } + } + } + + if (sg1->available == 1) + { + sg1->baseX = gUnknown_0201A450[1].unk0; + sg1->baseY = gUnknown_0201A450[1].unk2; + + for (j = 0; j < 4; j++) + { + oamData = &sg1->oam[j]; + gOamBuffer[oamData->oamId].priority = 3; + gOamBuffer[oamData->oamId].x = oamData->xOffset + sg1->baseX; + gOamBuffer[oamData->oamId].y = oamData->yOffset + sg1->baseY; + } + + } + + sg1->available = 0; + sg0->available = 0; + + spriteGroups[0]->available = 0; + spriteGroups[1]->available = 0; + spriteGroups[2]->available = 0; + spriteGroups[3]->available = 0; + spriteGroups[4]->available = 0; +} void sub_C814(void) { u16 i;