From 22211f48406a10dd6601fb5b3b10342ebebdb3ed Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Tue, 25 Jan 2022 00:19:42 +0200 Subject: [PATCH] Work on manager1 asm_func --- asm/non_matching/manager1/nullsub_494.inc | 4 - asm/non_matching/manager1/sub_0805728C.inc | 38 ---- asm/non_matching/manager1/sub_080572D4.inc | 45 ---- asm/non_matching/manager1/sub_0805732C.inc | 58 ----- assets/assets.json | 15 -- data/const/manager/manager1.s | 27 --- linker.ld | 3 +- src/manager/manager1.c | 243 +++++++++++++++++++-- 8 files changed, 226 insertions(+), 207 deletions(-) delete mode 100644 asm/non_matching/manager1/nullsub_494.inc delete mode 100644 asm/non_matching/manager1/sub_0805728C.inc delete mode 100644 asm/non_matching/manager1/sub_080572D4.inc delete mode 100644 asm/non_matching/manager1/sub_0805732C.inc delete mode 100644 data/const/manager/manager1.s diff --git a/asm/non_matching/manager1/nullsub_494.inc b/asm/non_matching/manager1/nullsub_494.inc deleted file mode 100644 index 807ea5e0..00000000 --- a/asm/non_matching/manager1/nullsub_494.inc +++ /dev/null @@ -1,4 +0,0 @@ - .syntax unified - bx lr - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/manager1/sub_0805728C.inc b/asm/non_matching/manager1/sub_0805728C.inc deleted file mode 100644 index 1a5ee0e7..00000000 --- a/asm/non_matching/manager1/sub_0805728C.inc +++ /dev/null @@ -1,38 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080572CA - movs r0, #8 - strb r0, [r4, #0xf] - ldr r2, _080572CC @ =gScreen - ldr r3, _080572D0 @ =gUnk_08107C1C - ldrb r0, [r4, #0xe] - adds r1, r0, #1 - strb r1, [r4, #0xe] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x17 - adds r0, r0, r3 - ldrh r0, [r0] - adds r2, #0x68 - strh r0, [r2] - lsls r1, r1, #0x18 - lsrs r1, r1, #0x18 - cmp r1, #0xa - bne _080572CA - movs r0, #1 - strb r0, [r4, #0xc] - adds r1, r4, #0 - adds r1, #0x22 - movs r0, #0 - strb r0, [r1] -_080572CA: - pop {r4, pc} - .align 2, 0 -_080572CC: .4byte gScreen -_080572D0: .4byte gUnk_08107C1C - .syntax divided diff --git a/asm/non_matching/manager1/sub_080572D4.inc b/asm/non_matching/manager1/sub_080572D4.inc deleted file mode 100644 index e752ae35..00000000 --- a/asm/non_matching/manager1/sub_080572D4.inc +++ /dev/null @@ -1,45 +0,0 @@ - .syntax unified - push {r4, r5, lr} - adds r3, r0, #0 - ldrb r0, [r3, #0xf] - subs r0, #1 - strb r0, [r3, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08057320 - movs r0, #8 - strb r0, [r3, #0xf] - ldr r5, _08057324 @ =gScreen - ldr r2, _08057328 @ =gUnk_08107C1C - ldrb r0, [r3, #0xe] - adds r1, r0, #0 - adds r1, #0xff - strb r1, [r3, #0xe] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x17 - adds r0, r0, r2 - ldrh r2, [r0] - adds r0, r5, #0 - adds r0, #0x68 - movs r4, #0 - strh r2, [r0] - lsls r1, r1, #0x18 - lsrs r1, r1, #0x18 - cmp r1, #0xff - bne _08057320 - movs r0, #1 - strb r0, [r3, #0xc] - adds r0, r3, #0 - adds r0, #0x22 - strb r4, [r0] - subs r0, #1 - strb r4, [r0] - adds r0, r5, #0 - adds r0, #0x6c - strb r4, [r0] -_08057320: - pop {r4, r5, pc} - .align 2, 0 -_08057324: .4byte gScreen -_08057328: .4byte gUnk_08107C1C - .syntax divided diff --git a/asm/non_matching/manager1/sub_0805732C.inc b/asm/non_matching/manager1/sub_0805732C.inc deleted file mode 100644 index c7b02ff7..00000000 --- a/asm/non_matching/manager1/sub_0805732C.inc +++ /dev/null @@ -1,58 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - adds r6, r0, #0 - adds r5, r1, #0 - ldr r2, _08057390 @ =gUnk_03003DE4 - ldrb r1, [r2] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #9 - ldr r1, _08057394 @ =gUnk_02017AA0 - adds r4, r0, r1 - movs r3, #0 - mov ip, r2 - mov r8, r1 - ldr r0, _08057398 @ =gSineTable - mov sb, r0 - movs r2, #0xff - ldr r1, _0805739C @ =gScreen -_08057354: - adds r0, r5, r3 - ands r0, r2 - lsls r0, r0, #1 - add r0, sb - movs r7, #0 - ldrsh r0, [r0, r7] - muls r0, r6, r0 - lsrs r0, r0, #8 - ldrh r7, [r1, #0x2e] - adds r0, r0, r7 - strh r0, [r4] - adds r4, #2 - adds r3, #1 - cmp r3, #0x9f - bls _08057354 - mov r0, ip - ldrb r1, [r0] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #9 - add r0, r8 - ldr r1, _080573A0 @ =0x0400001C - ldr r2, _080573A4 @ =0xA2600001 - bl sub_0805622C - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08057390: .4byte gUnk_03003DE4 -_08057394: .4byte gUnk_02017AA0 -_08057398: .4byte gSineTable -_0805739C: .4byte gScreen -_080573A0: .4byte 0x0400001C -_080573A4: .4byte 0xA2600001 - .syntax divided diff --git a/assets/assets.json b/assets/assets.json index 512883e9..0e260e55 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -33014,21 +33014,6 @@ "DEMO_JP": -2052 } }, - { - "path": "manager1/gUnk_08107C1C.bin", - "start": 1080348, - "size": 20 - }, - { - "path": "manager1/gUnk_08107C30.bin", - "start": 1080368, - "size": 16 - }, - { - "path": "manager1/gUnk_08107C40.bin", - "start": 1080384, - "size": 8 - }, { "path": "manager3/gUnk_08107C6C.bin", "start": 1080428, diff --git a/data/const/manager/manager1.s b/data/const/manager/manager1.s deleted file mode 100644 index d713920a..00000000 --- a/data/const/manager/manager1.s +++ /dev/null @@ -1,27 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08107C1C:: @ 08107C1C - .incbin "manager1/gUnk_08107C1C.bin" - -gUnk_08107C30:: @ 08107C30 - .incbin "manager1/gUnk_08107C30.bin" - -gUnk_08107C40:: @ 08107C40 - .incbin "manager1/gUnk_08107C40.bin" - -gUnk_08107C48:: @ 08107C48 - .4byte nullsub_494 - .4byte nullsub_494 - .4byte sub_080573AC - .4byte nullsub_494 - .4byte sub_08057450 - -gUnk_08107C5C:: @ 08107C5C - .4byte sub_08057118 - .4byte sub_08057174 - .4byte sub_0805728C - .4byte sub_080572D4 diff --git a/linker.ld b/linker.ld index 23016382..f7e33dd5 100644 --- a/linker.ld +++ b/linker.ld @@ -1135,7 +1135,8 @@ SECTIONS { data/map/metatile_headers.o(.rodata); data/map/map_headers.o(.rodata); src/message.o(.rodata); - data/const/manager/manager1.o(.rodata); + . = ALIGN(4); + src/manager/manager1.o(.rodata); data/const/manager/manager3.o(.rodata); data/const/manager/manager4.o(.rodata); src/manager/manager5.o(.rodata); diff --git a/src/manager/manager1.c b/src/manager/manager1.c index a47dd57b..9701738e 100644 --- a/src/manager/manager1.c +++ b/src/manager/manager1.c @@ -3,23 +3,39 @@ #include "screen.h" #include "functions.h" #include "common.h" +#include "main.h" extern void sub_08056250(void); -extern void (*const gUnk_08107C5C[])(Entity*); -extern void (*const gUnk_08107C48[])(Entity*); +void (*const gUnk_08107C5C[])(Entity*); +void (*const gUnk_08107C48[])(Entity*); +const u16 gUnk_08107C1C[]; +const u16 gUnk_08107C30[]; +const u8 gManager1GfxGroups[]; -extern u8 gUnk_08107C40[]; +extern u16 gUnk_02017AA0[]; +extern u16 gUnk_085B4180[]; + +typedef struct { + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; + u8 unk4; +} PACKED Manager1Prop; + +#define ZV(this) ((u8*)&this->zVelocity) +#define ZS(this) ((u8*)&this->speed) void Manager1_Main(Entity* this) { u8 bVar1; u8* pbVar2; gUnk_08107C5C[this->action](this); - gUnk_08107C48[((u8*)&this->zVelocity)[1]](this); - bVar1 = gUnk_08107C40[((u8*)&this->zVelocity)[1]]; - if ((bVar1 != 0) && (*(u8*)&this->zVelocity != bVar1)) { - ((u8*)&this->zVelocity)[0] = bVar1; + gUnk_08107C48[ZV(this)[1]](this); + bVar1 = gManager1GfxGroups[ZV(this)[1]]; + if ((bVar1 != 0) && (ZV(this)[0] != bVar1)) { + ZV(this)[0] = bVar1; LoadGfxGroup(bVar1); } } @@ -27,9 +43,9 @@ void Manager1_Main(Entity* this) { static void sub_080570B8(Entity* this) { u8* pbVar1; - LoadGfxGroup(((u8*)&this->zVelocity)[0]); + LoadGfxGroup(ZV(this)[0]); this->z.WORD = 0; - pbVar1 = ((u8*)&this->zVelocity + 1); + pbVar1 = &ZV(this)[1]; if (*pbVar1 == 3) { gScreen.bg3.updated = 1; } else { @@ -45,9 +61,9 @@ static void sub_080570F8(void) { void sub_08057118(Entity* this) { this->actionDelay = 0; - *(u8*)&this->zVelocity = 0; - ((u8*)&this->zVelocity)[1] = 0; - ((u8*)&this->zVelocity)[2] = 0; + ZV(this)[0] = 0; + ZV(this)[1] = 0; + ZV(this)[2] = 0; this->action = 1; gScreen.bg3.control = 0x1e04; gScreen.lcd.displayControl |= DISPCNT_BG3_ON; @@ -56,16 +72,205 @@ void sub_08057118(Entity* this) { RegisterTransitionManager(this, sub_080570B8, sub_080570F8); } -ASM_FUNC("asm/non_matching/manager1/sub_08057174.inc", void sub_08057174()) +// regalloc +NONMATCH("asm/non_matching/manager1/sub_08057174.inc", void sub_08057174(Entity* this)) { + Manager1Prop* prop = GetCurrentRoomProperty(this->type); + s32 temp; + s32 x; + s32 y; -ASM_FUNC("asm/non_matching/manager1/sub_0805728C.inc", void sub_0805728C()) + if (prop->unk0 == 0xff) + return; + temp = gPlayerEntity.x.HALF.HI; + if (temp < 0) { + temp += 0xf; + } -ASM_FUNC("asm/non_matching/manager1/sub_080572D4.inc", void sub_080572D4()) + x = temp >> 4; + temp = gPlayerEntity.y.HALF.HI; + if (temp < 0) { + temp += 0xf; + } -ASM_FUNC("asm/non_matching/manager1/sub_0805732C.inc", void sub_0805732C()) + y = temp >> 4; -ASM_FUNC("asm/non_matching/manager1/nullsub_494.inc", void nullsub_494()) + for (; prop->unk0 != 0xff; prop++) { + if (prop->unk0 != ZV(this)[1]) { + u32 x2 = (gRoomControls.origin_x >> 4) + prop->unk1; + u32 y2 = (gRoomControls.origin_y >> 4) + prop->unk2; -ASM_FUNC("asm/non_matching/manager1/sub_080573AC.inc", void sub_080573AC()) + if (y - y2 < prop->unk4 && x - x2 < prop->unk3) { + switch (prop->unk0) { + case 1: + if (ZV(this)[1] == 2) { + this->action = 3; + this->actionDelay = 9; + } + break; + case 5: + if (ZV(this)[1] == 6) { + this->action = 3; + this->actionDelay = 9; + } + break; + case 2: + if (ZV(this)[1] == 0) { + this->action = 2; + this->actionDelay = 0; + ZV(this)[0] = 0; + } + break; + case 6: + if (ZV(this)[1] == 0) { + this->action = 2; + this->actionDelay = 0; + } + break; + case 4: + if (ZV(this)[1] == 0) { + this->action = 2; + this->actionDelay = 0; + this->z.WORD = 0; + } + break; + case 3: + if (ZV(this)[1] == 4) { + this->action = 3; + this->actionDelay = 9; + } + break; + } -ASM_FUNC("asm/non_matching/manager1/sub_08057450.inc", void sub_08057450()) + if (this->action != 1) { + this->field_0xf = 8; + ZV(this)[1] = prop->unk0; + ZV(this)[2] = 1; + return; + } + } + } + } +} +END_NONMATCH + +void sub_0805728C(Entity* this) { + if (--this->field_0xf == 0) { + this->field_0xf = 8; + gScreen.controls.alphaBlend = gUnk_08107C1C[this->actionDelay++]; + + if (this->actionDelay == 10) { + this->action = 1; + ZV(this)[2] = 0; + } + } +} + +void sub_080572D4(Entity* this) { + if (--this->field_0xf == 0) { + this->field_0xf = 8; + gScreen.controls.alphaBlend = gUnk_08107C1C[this->actionDelay--]; + + if (this->actionDelay == 0xff) { + this->action = 1; + ZV(this)[2] = 0; + ZV(this)[1] = 0; + gScreen._6c = 0; + } + } +} + +void sub_0805732C(u32 param_1, u32 param_2) { + u32 index; + u16* ptr = &gUnk_02017AA0[gUnk_03003DE4 * 0x500]; + + for (index = 0; index < 0xa0; ptr++, index++) { + *ptr = gSineTable[(param_2 + index) & 0xff] * param_1 / 0x100 + gScreen.bg3.xOffset; + } + + sub_0805622C(&gUnk_02017AA0[gUnk_03003DE4 * 0x500], REG_ADDR_BG3HOFS, 0xa2600001UL); +} + +void nullsub_494() { +} + +void sub_080573AC(Entity* this) { + s32 sin, frameCount; + gRoomControls.bg3OffsetX.WORD -= 0x2000; + gRoomControls.bg3OffsetY.WORD -= 0x1000; + gScreen.bg3.xOffset = ((gRoomControls.scroll_x - gRoomControls.origin_x) >> 1) + gRoomControls.bg3OffsetX.HALF.HI; + gScreen.bg3.yOffset = ((gRoomControls.scroll_y - gRoomControls.origin_y) >> 1) + gRoomControls.bg3OffsetY.HALF.HI; + sin = gSineTable[(gRoomTransition.frameCount & 0xff) + 0x40]; + sub_0805732C((sin >> 5) + 0x10, gRoomTransition.frameCount); + if (ZV(this)[2] == 0) { + if ((gRoomTransition.frameCount & 0x1f) == 0) { + ZS(this)[0] = (ZS(this)[0] + 1) & 7; + gScreen.controls.alphaBlend = gUnk_08107C30[ZS(this)[0]]; + } + } +} + +NONMATCH("asm/non_matching/manager1/sub_08057450.inc", void sub_08057450(Entity* this)) { + s32 y; + // register s32 temp asm("r2"); + s32 temp; + s32 y2; + gScreen.bg3.xOffset = 0x10; + y = gRoomControls.scroll_y; + y -= gRoomControls.origin_y; + y >>= 2; + + // Removing temp messes with r1/r2 with regards to y + temp = 0x3f; + gScreen.bg3.yOffset = y & temp; + + if (y < 0) { + y += 0x3f; + } + + gScreen.bg3.tilemap = &gBG3Buffer[(y >> 6) << 8]; + if ((void*)this->z.WORD != gScreen.bg3.tilemap) { + this->z.WORD = (u32)gScreen.bg3.tilemap; + gScreen.bg3.updated = 1; + } + + if (ZV(this)[2] == 0 && (gRoomTransition.frameCount & 0x1f) == 0) { + ZS(this)[0] = (ZS(this)[0] + 1) & 7; + gScreen.controls.alphaBlend = gUnk_08107C30[ZS(this)[0]]; + } + + if ((gRoomTransition.frameCount & 0x7) == 0) { + u32 index; + u16* ptr = &gUnk_085B4180[(ZV(this)[3] << 4)]; + + for (index = 0, ptr = ptr + 7; index <= 3; index++) { + SetColor(index + 0x87, *(ptr + index)); + SetColor(index + 0x8c, *(ptr + index + 5)); + } + + ZV(this)[3] = (ZV(this)[3] + 1) & 3; + } +} +END_NONMATCH + +const u16 gUnk_08107C1C[] = { + 0x1000, 0xF01, 0xE02, 0xD03, 0xC04, 0xB05, 0xA06, 0x907, 0x908, 0x909, +}; + +const u16 gUnk_08107C30[] = { + 0x909, 0xA08, 0xB07, 0xC06, 0xD05, 0xC06, 0xB07, 0xA08, +}; + +const u8 gManager1GfxGroups[] = { + 0x25, 0x00, 0x24, 0x00, 0x25, 0x00, 0x00, 0x00, +}; + +void (*const gUnk_08107C48[])(Entity*) = { + nullsub_494, nullsub_494, sub_080573AC, nullsub_494, sub_08057450, +}; + +void (*const gUnk_08107C5C[])(Entity*) = { + sub_08057118, + sub_08057174, + sub_0805728C, + sub_080572D4, +};