Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- You are decompiling an assembly in ARM7 of a Gameboy Advance game.
- You know that this assembly:
- ```
- thumb_func_start sub_80583D4
- sub_80583D4: @ 0x080583D4
- push {r4, r5, r6, r7, lr}
- ldr r7, _080583FC @ =gCurTask
- ldr r0, [r7]
- ldrh r5, [r0, #6]
- movs r4, #0xc0
- lsls r4, r4, #0x12
- adds r4, r5, r4
- adds r0, r4, #0
- bl sub_80584A8
- adds r6, r0, #0
- adds r0, r4, #0
- bl sub_8058518
- cmp r0, #1
- bne _08058400
- ldr r0, [r7]
- bl TaskDestroy
- b _08058452
- .align 2, 0
- _080583FC: .4byte gCurTask
- _08058400:
- ldr r0, _08058430 @ =gUnknown_030008A0
- ldrb r1, [r0, #4]
- subs r0, r1, #1
- lsls r0, r0, #0x18
- lsrs r0, r0, #0x18
- cmp r0, #1
- bls _08058452
- cmp r1, #4
- beq _08058452
- cmp r6, #0
- bne _08058452
- ldr r0, _08058434 @ =0x03000024
- adds r4, r5, r0
- ldr r1, [r4, #8]
- movs r2, #0x80
- lsls r2, r2, #3
- adds r0, r1, #0
- ands r0, r2
- cmp r0, #0
- beq _0805843C
- ldr r0, _08058438 @ =0xFFFFFBFF
- ands r1, r0
- b _0805843E
- .align 2, 0
- _08058430: .4byte gUnknown_030008A0
- _08058434: .4byte 0x03000024
- _08058438: .4byte 0xFFFFFBFF
- _0805843C:
- orrs r1, r2
- _0805843E:
- str r1, [r4, #8]
- ldr r1, _08058458 @ =gUnknown_080D1E20
- ldrh r0, [r1]
- strh r0, [r4, #0xc]
- ldrb r0, [r1, #2]
- strb r0, [r4, #0x1a]
- ldr r0, _0805845C @ =gCurTask
- ldr r1, [r0]
- ldr r0, _08058460 @ =Task_Akatento
- str r0, [r1, #8]
- _08058452:
- pop {r4, r5, r6, r7}
- pop {r0}
- bx r0
- .align 2, 0
- _08058458: .4byte gUnknown_080D1E20
- _0805845C: .4byte gCurTask
- _08058460: .4byte Task_Akatento
- ```
- Translates to this C code:
- ```
- void Task_80583D4(void)
- {
- Akatento *enemy = TASK_DATA(gCurTask);
- AnimCmdResult acmdRes = sub_80584A8(enemy);
- if (sub_8058518(enemy) == TRUE) {
- TaskDestroy(gCurTask);
- return;
- }
- if ((gStageData.unk4 != 1) && (gStageData.unk4 != 2) && (gStageData.unk4 != 4) && (acmdRes == ACMD_RESULT__ENDED)) {
- Sprite *s = &enemy->s;
- if (s->frameFlags & SPRITE_FLAG_MASK_X_FLIP) {
- s->frameFlags &= ~SPRITE_FLAG_MASK_X_FLIP;
- } else {
- s->frameFlags |= SPRITE_FLAG_MASK_X_FLIP;
- }
- s->anim = gUnknown_080D1E20[0].anim;
- s->variant = gUnknown_080D1E20[0].variant;
- gCurTask->main = Task_Akatento;
- }
- }
- ```
- Given the above context, translate this assembly to an equivalent C code:
- ```
- thumb_func_start sub_8063ADC
- sub_8063ADC: @ 0x08063ADC
- push {r4, r5, r6, r7, lr}
- mov r7, sb
- mov r6, r8
- push {r6, r7}
- sub sp, #4
- ldr r0, _08063B6C @ =gCurTask
- mov sb, r0
- ldr r0, [r0]
- ldrh r6, [r0, #6]
- movs r0, #0xc0
- lsls r0, r0, #0x12
- adds r7, r6, r0
- ldrb r0, [r7, #4]
- cmp r0, #0
- bne _08063B0E
- ldr r1, _08063B70 @ =0x03000024
- adds r0, r6, r1
- ldr r2, _08063B74 @ =0x0300001C
- adds r1, r6, r2
- ldr r3, _08063B78 @ =0x0300000C
- adds r2, r6, r3
- ldr r4, _08063B7C @ =0x03000009
- adds r3, r6, r4
- bl sub_805CD70
- _08063B0E:
- adds r0, r7, #0
- bl sub_8063E5C
- adds r5, r0, #0
- cmp r5, #0
- bne _08063B98
- ldr r0, _08063B80 @ =0x03000038
- adds r4, r6, r0
- ldr r1, _08063B84 @ =gUnknown_080D210C
- ldrh r0, [r1]
- strh r0, [r4, #0xc]
- ldrb r0, [r1, #2]
- strb r0, [r4, #0x1a]
- movs r0, #0xff
- strb r0, [r4, #0x1b]
- mov r0, sp
- strh r5, [r0]
- ldr r2, _08063B88 @ =0x03000064
- adds r1, r6, r2
- ldr r3, _08063B8C @ =0x01000002
- mov r8, r3
- mov r2, r8
- bl CpuSet
- mov r0, sp
- adds r0, #2
- strh r5, [r0]
- ldr r2, _08063B90 @ =0x0300005C
- adds r1, r6, r2
- mov r2, r8
- bl CpuSet
- adds r0, r4, #0
- bl UpdateSpriteAnimation
- strh r5, [r7, #0x10]
- strh r5, [r7, #0x12]
- movs r0, #0x80
- lsls r0, r0, #2
- str r0, [r7, #0x14]
- str r5, [r7, #0x18]
- mov r3, sb
- ldr r1, [r3]
- ldr r0, _08063B94 @ =Task_MarunInit
- str r0, [r1, #8]
- b _08063BAA
- .align 2, 0
- _08063B6C: .4byte gCurTask
- _08063B70: .4byte 0x03000024
- _08063B74: .4byte 0x0300001C
- _08063B78: .4byte 0x0300000C
- _08063B7C: .4byte 0x03000009
- _08063B80: .4byte 0x03000038
- _08063B84: .4byte gUnknown_080D210C
- _08063B88: .4byte 0x03000064
- _08063B8C: .4byte 0x01000002
- _08063B90: .4byte 0x0300005C
- _08063B94: .4byte Task_MarunInit
- _08063B98:
- adds r0, r7, #0
- bl sub_8063D38
- cmp r0, #1
- bne _08063BAA
- mov r4, sb
- ldr r0, [r4]
- bl TaskDestroy
- _08063BAA:
- add sp, #4
- pop {r3, r4}
- mov r8, r3
- mov sb, r4
- pop {r4, r5, r6, r7}
- pop {r0}
- bx r0
- ```
- Use the following structure for the `enemy` variable in the new code:
- ```
- typedef struct {
- /* 0x00 */ MapEntity *me;
- /* 0x04 */ u8 unk4;
- /* 0x05 */ u8 unk5;
- /* 0x06 */ u8 id;
- /* 0x07 */ u8 spriteX;
- /* 0x08 */ u8 unk8;
- /* 0x09 */ u8 unk9;
- /* 0x0A */ s8 direction;
- /* 0x0C */ u16 region[2];
- /* 0x10 */ u16 rotation;
- /* 0x12 */ u16 unk12;
- /* 0x14 */ s32 unk14;
- /* 0x18 */ s32 unk18;
- /* 0x1C */ Vec2_32 qUnk1C;
- /* 0x24 */ Vec2_32 qPos;
- /* 0x2C */ SpriteTransform transform;
- /* 0x38 */ Sprite s;
- /* 0x60 */ Hitbox reserved;
- } Marun; /* size: 0x68 */
- ```
- You know that the `Sprite` has the following structure:
- ```
- typedef struct {
- /* 0x00 */ u8 *tiles; // in VRAM
- /* 0x04 */ u32 frameNum;
- // Bitfield description from KATAM decomp
- /* 0x08 */ u32 frameFlags; // bit 0-4: affine-index / rotscale param selection
- // bit 5: rotscale enable
- // bit 6: rotscale double-size
- // bit 7-8: obj mode -- different (1 bit) in SA3?
- // bit 9
- // bit 10 X-Flip
- // bit 11 Y-Flip
- // bit 12-13: priority
- // bit 14: Animation finished
- // bit 15-16: Background ID
- // bit 17
- // bit 18
- // bit 19-25(?)
- // bit 26
- // bit 27-29(?)
- // bit 30
- // bit 31
- /* 0x0C */ u16 anim;
- /* 0x0E */ u16 animCursor;
- /* 0x10 */ s16 x;
- /* 0x12 */ s16 y;
- /* 0x14 */ s16 oamFlags; // bit 6-10: OAM order index
- /* 0x16 */ s16 qAnimDelay; // Q_8_8, in frames
- /* 0x18 */ u16 prevAnim;
- /* 0x1A */ u8 variant;
- /* 0x1B */ u8 prevVariant;
- // 0x08 = 0.5x, 0x10 = 1.0x, 0x20 = 2.0x ...
- /* 0x1C */ u8 animSpeed;
- /* 0x1D */ u8 oamBaseIndex;
- /* 0x1E */ u8 numSubFrames;
- /* 0x1F */ u8 palId; // (0 - 15)
- /* 0x20 */ Hitbox hitboxes[1];
- } Sprite; /* size: 0x28 (more with multiple Hitboxes) */
- ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement