diff options
-rw-r--r-- | asm/rom4.s | 102 | ||||
-rw-r--r-- | src/rom4.c | 48 |
2 files changed, 44 insertions, 106 deletions
diff --git a/asm/rom4.s b/asm/rom4.s index 3898f4f8d..45377e31d 100644 --- a/asm/rom4.s +++ b/asm/rom4.s @@ -5,108 +5,6 @@ .text - thumb_func_start sub_805568C -sub_805568C: @ 805568C - push {r4,lr} - sub sp, 0x8 - adds r4, r0, 0 - ldrb r0, [r4, 0x2] - cmp r0, 0 - beq _080556A0 - cmp r0, 0x2 - beq _080556A0 - movs r0, 0 - b _0805574E -_080556A0: - ldr r0, [r4, 0x4] - ldr r1, [r4, 0x8] - str r0, [sp] - str r1, [sp, 0x4] - ldr r3, _08055710 @ =gUnknown_0821664C - ldrb r0, [r4, 0x3] - lsls r0, 3 - adds r0, r3 - ldr r0, [r0] - mov r1, sp - ldrh r1, [r1] - adds r0, r1 - lsls r0, 16 - lsrs r0, 16 - ldr r1, _08055714 @ =0xffff0000 - ldr r2, [sp] - ands r2, r1 - orrs r2, r0 - str r2, [sp] - asrs r1, r2, 16 - ldrb r0, [r4, 0x3] - lsls r0, 3 - adds r3, 0x4 - adds r0, r3 - ldr r0, [r0] - adds r0, r1 - lsls r0, 16 - ldr r1, _08055718 @ =0x0000ffff - ands r1, r2 - orrs r1, r0 - str r1, [sp] - ldr r2, _0805571C @ =0xffffff00 - ldr r0, [sp, 0x4] - ands r0, r2 - str r0, [sp, 0x4] - mov r0, sp - movs r2, 0 - ldrsh r0, [r0, r2] - asrs r1, 16 - bl sub_8055B9C - lsls r0, 24 - lsrs r1, r0, 24 - adds r2, r1, 0 - cmp r1, 0x4 - beq _08055744 - ldrb r0, [r4, 0x1] - cmp r0, 0 - beq _0805570C - ldr r0, _08055720 @ =gUnknown_03000580 - adds r0, r1, r0 - ldrb r0, [r0] - cmp r0, 0x80 - beq _08055728 -_0805570C: - ldr r0, _08055724 @ =gUnknown_081A4495 - b _0805574E - .align 2, 0 -_08055710: .4byte gUnknown_0821664C -_08055714: .4byte 0xffff0000 -_08055718: .4byte 0x0000ffff -_0805571C: .4byte 0xffffff00 -_08055720: .4byte gUnknown_03000580 -_08055724: .4byte gUnknown_081A4495 -_08055728: - adds r0, r2, 0 - bl sub_8083BF4 - cmp r0, 0 - bne _0805573C - ldr r0, _08055738 @ =gUnknown_081A4479 - b _0805574E - .align 2, 0 -_08055738: .4byte gUnknown_081A4479 -_0805573C: - ldr r0, _08055740 @ =gUnknown_081A4487 - b _0805574E - .align 2, 0 -_08055740: .4byte gUnknown_081A4487 -_08055744: - ldrb r1, [r4, 0xC] - ldrb r2, [r4, 0x3] - mov r0, sp - bl sub_80682A8 -_0805574E: - add sp, 0x8 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_805568C - thumb_func_start sub_8055758 sub_8055758: @ 8055758 push {lr} diff --git a/src/rom4.c b/src/rom4.c index 64939efe6..b1979b3a9 100644 --- a/src/rom4.c +++ b/src/rom4.c @@ -44,8 +44,8 @@ struct UnkInputStruct struct UnkStruct_8054FF8_Substruct { - u16 field_4; - u16 field_6; + s16 x; + s16 y; u8 field_8; }; @@ -64,6 +64,11 @@ struct UnkMapObjStruct u8 a, b, c, d; }; +struct UCoords32 +{ + u32 x, y; +}; + extern struct WarpData gUnknown_020297F0; extern struct WarpData gUnknown_020297F8; extern struct WarpData gUnknown_02029800; @@ -91,8 +96,13 @@ extern u16 gUnknown_0300489C; extern u8 gUnknown_0819FC74[]; extern u8 gUnknown_0819FC9F[]; +extern u8 gUnknown_081A4479[]; +extern u8 gUnknown_081A4487[]; +extern u8 gUnknown_081A4495[]; extern u8 gUnknown_081A4508[]; +extern struct UCoords32 gUnknown_0821664C[]; + extern struct MapData * const gMapAttributes[]; extern struct MapHeader * const * const gMapGroups[]; extern const struct WarpData gDummyWarpData; @@ -116,6 +126,7 @@ extern void sub_80809B0(void); extern void sub_8080990(void); extern u8 sub_80BBB24(void); extern u16 MapGridGetMetatileBehaviorAt(int, int); +extern u8 *sub_80682A8(void *, u8, u8); void sub_8053050(void); void warp_in(void); @@ -187,6 +198,7 @@ bool32 sub_8055618(struct UnkStruct_8054FF8 *); bool32 sub_8055630(struct UnkStruct_8054FF8 *); u32 sub_8055648(struct UnkStruct_8054FF8 *); bool32 sub_8055660(struct UnkStruct_8054FF8 *); +u8 *sub_805568C(struct UnkStruct_8054FF8 *); void sub_8055980(u8, s16, s16, u8); void sub_80555B0(int, int, struct UnkStruct_8054FF8 *); u8 sub_8055AE8(u8); @@ -2177,8 +2189,8 @@ void sub_80555B0(int a1, int a2, struct UnkStruct_8054FF8 *a3) val = a1; a3->d = sub_8055B30(val); sub_8055B08(val, &x, &y); - a3->sub.field_4 = x; - a3->sub.field_6 = y; + a3->sub.x = x; + a3->sub.y = y; a3->sub.field_8 = sub_8055B50(val); a3->field_C = MapGridGetMetatileBehaviorAt(x, y); } @@ -2218,3 +2230,31 @@ bool32 sub_8055660(struct UnkStruct_8054FF8 *a1) return FALSE; return TRUE; } + +u8 *sub_805568C(struct UnkStruct_8054FF8 *a1) +{ + struct UnkStruct_8054FF8_Substruct unkStruct; + u8 v5; + register int v6 asm("r2"); + + if (a1->c && a1->c != 2) + return 0; + + unkStruct = a1->sub; + unkStruct.x += gUnknown_0821664C[a1->d].x; + unkStruct.y += gUnknown_0821664C[a1->d].y; + unkStruct.field_8 = 0; + v5 = sub_8055B9C(unkStruct.x, unkStruct.y); + v6 = v5; + + if (v5 != 4) + { + if (!a1->b || gUnknown_03000580[v5] != 0x80) + return gUnknown_081A4495; + if (!sub_8083BF4(v6)) + return gUnknown_081A4479; + return gUnknown_081A4487; + } + + return sub_80682A8(&unkStruct, a1->field_C, a1->d); +} |