From 1cbdcf5a36f09f569e2a0925e050d1a065ff58a9 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Wed, 5 Aug 2020 17:46:53 -0500 Subject: [PATCH 1/6] Finish decompiling object49.c --- asm/object49.s | 377 ------------------------------------ include/functions.h | 4 +- include/structures.h | 4 +- linker.ld | 1 - src/enemy/lakitu.c | 8 +- src/enemy/miniFireballGuy.c | 8 +- src/npc/postman.c | 2 +- src/npc/zelda.c | 3 +- src/object/object49.c | 167 ++++++++++++++-- 9 files changed, 165 insertions(+), 409 deletions(-) delete mode 100644 asm/object49.s diff --git a/asm/object49.s b/asm/object49.s deleted file mode 100644 index 968070dd..00000000 --- a/asm/object49.s +++ /dev/null @@ -1,377 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_0808F370 -sub_0808F370: @ 0x0808F370 - push {r4, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0xc] - cmp r1, #0 - bne _0808F388 - ldr r0, [r4, #0x50] - ldrb r0, [r0, #0xd] - cmp r0, #1 - bne _0808F3DA - strb r0, [r4, #0xc] - str r1, [r4, #0x70] - b _0808F3CC -_0808F388: - ldr r0, [r4, #0x50] - ldrb r0, [r0, #0xd] - subs r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #4 - bhi _0808F3D4 - ldr r0, [r4, #0x70] - cmp r0, #0 - bne _0808F3C4 - ldr r0, [r4, #0x74] - subs r0, #1 - str r0, [r4, #0x74] - movs r1, #1 - rsbs r1, r1, #0 - cmp r0, r1 - bne _0808F3DA - bl Random - ldr r2, _0808F3C0 @ =gUnk_08121EA0 - movs r1, #1 - ands r1, r0 - lsls r1, r1, #1 - adds r1, r1, r2 - ldrh r0, [r1] - str r0, [r4, #0x70] - b _0808F3DA - .align 2, 0 -_0808F3C0: .4byte gUnk_08121EA0 -_0808F3C4: - subs r0, #1 - str r0, [r4, #0x70] - cmp r0, #0 - bne _0808F3DA -_0808F3CC: - adds r0, r4, #0 - bl sub_0808F5EC - b _0808F3DA -_0808F3D4: - movs r0, #0 - strb r0, [r4, #0xc] - str r0, [r4, #0x74] -_0808F3DA: - pop {r4, pc} - - thumb_func_start sub_0808F3DC -sub_0808F3DC: @ 0x0808F3DC - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _0808F438 - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - movs r0, #1 - strb r0, [r4, #0xc] - movs r0, #0x78 - strb r0, [r4, #0xe] - ldrb r1, [r4, #0xa] - adds r1, #1 - adds r0, r4, #0 - bl InitializeAnimation - ldrb r0, [r4, #0xa] - cmp r0, #8 - beq _0808F41A - cmp r0, #7 - bne _0808F42E - ldr r0, [r4, #0x54] - adds r1, r4, #0 - bl sub_0806FAD8 - b _0808F494 -_0808F41A: - ldr r0, [r4, #0x54] - adds r0, #0x3f - ldrb r0, [r0] - adds r1, r4, #0 - adds r1, #0x3f - strb r0, [r1] - ldr r0, [r4, #0x54] - adds r0, #0x3f - movs r1, #0x7e - strb r1, [r0] -_0808F42E: - ldr r0, [r4, #0x54] - adds r1, r4, #0 - bl ResolveEntityOnTop - b _0808F494 -_0808F438: - ldr r0, [r4, #0x50] - ldr r0, [r0, #0x74] - cmp r0, #0 - bne _0808F456 - ldrb r0, [r4, #0xa] - cmp r0, #8 - bne _0808F452 - ldr r0, [r4, #0x54] - adds r1, r4, #0 - adds r1, #0x3f - ldrb r1, [r1] - adds r0, #0x3f - strb r1, [r0] -_0808F452: - bl DeleteThisEntity -_0808F456: - ldrb r0, [r4, #0xa] - cmp r0, #5 - bne _0808F486 - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _0808F486 - ldr r0, [r4, #0x54] - movs r1, #0x49 - movs r2, #8 - movs r3, #0 - bl CreateObjectWithParent - adds r1, r0, #0 - cmp r1, #0 - beq _0808F486 - ldr r0, [r4, #0x50] - str r0, [r1, #0x50] - ldr r0, [r4, #0x50] - ldr r0, [r0, #0x50] - str r0, [r1, #0x54] -_0808F486: - adds r0, r4, #0 - bl GetNextFrame - ldr r0, [r4, #0x54] - adds r1, r4, #0 - bl CopyPositionAndSpriteOffset -_0808F494: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0808F498 -sub_0808F498: @ 0x0808F498 - push {r4, r5, r6, lr} - adds r5, r0, #0 - ldrb r0, [r5, #0xc] - cmp r0, #0 - beq _0808F4EC - adds r0, r5, #0 - bl sub_0806F3E4 - cmp r0, #0 - beq _0808F4C2 - ldr r0, _0808F4E4 @ =gScreenTransition - ldr r0, [r0] - movs r1, #0xf - ands r0, r1 - cmp r0, #0 - bne _0808F4BE - movs r0, #0xef - bl PlaySFX -_0808F4BE: - bl DeleteThisEntity -_0808F4C2: - ldrb r0, [r5, #0xe] - subs r0, #1 - strb r0, [r5, #0xe] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0xff - bne _0808F4D4 - bl DeleteThisEntity -_0808F4D4: - ldr r0, _0808F4E8 @ =gLinkState - ldrb r0, [r0, #0x1c] - cmp r0, #1 - beq _0808F550 - bl DeleteThisEntity - b _0808F550 - .align 2, 0 -_0808F4E4: .4byte gScreenTransition -_0808F4E8: .4byte gLinkState -_0808F4EC: - movs r0, #1 - strb r0, [r5, #0xc] - movs r0, #0x40 - strb r0, [r5, #0xe] - ldrb r0, [r5, #0xb] - movs r6, #0x2b - cmp r0, #0 - beq _0808F4FE - movs r6, #0x2c -_0808F4FE: - ldr r0, [r5, #0x50] - ldr r0, [r0, #0x48] - ldrb r1, [r0, #6] - ldrh r0, [r5, #0x2e] - subs r0, r0, r1 - strh r0, [r5, #0x2e] - bl Random - ldr r4, [r5, #0x50] - ldr r1, [r4, #0x48] - ldrb r1, [r1, #6] - lsls r1, r1, #1 - bl __modsi3 - ldrh r1, [r5, #0x2e] - adds r1, r1, r0 - strh r1, [r5, #0x2e] - ldr r0, [r4, #0x48] - ldrb r1, [r0, #7] - ldrh r0, [r5, #0x32] - subs r0, r0, r1 - strh r0, [r5, #0x32] - bl Random - ldr r1, [r5, #0x50] - ldr r1, [r1, #0x48] - ldrb r1, [r1, #7] - lsls r1, r1, #1 - bl __modsi3 - ldrh r1, [r5, #0x32] - adds r1, r1, r0 - strh r1, [r5, #0x32] - adds r0, r5, #0 - adds r1, r6, #0 - bl sub_0801D2B4 - adds r0, r5, #0 - movs r1, #4 - bl InitializeAnimation -_0808F550: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_0808F554 -sub_0808F554: @ 0x0808F554 - push {r4, r5, lr} - adds r5, r0, #0 - ldr r0, [r5, #0x50] - adds r1, r5, #0 - bl CopyPositionAndSpriteOffset - adds r1, r5, #0 - adds r1, #0x63 - ldrb r0, [r1] - subs r0, #0x18 - strb r0, [r1] - ldr r0, [r5, #0x50] - adds r1, r0, #0 - adds r1, #0x62 - movs r0, #0 - ldrsb r0, [r1, r0] - cmp r0, #0 - beq _0808F588 - adds r2, r5, #0 - adds r2, #0x62 - lsrs r1, r0, #0x1f - adds r0, r0, r1 - asrs r0, r0, #1 - ldrb r1, [r2] - adds r0, r0, r1 - strb r0, [r2] -_0808F588: - ldrb r0, [r5, #0xc] - cmp r0, #0 - beq _0808F5AC - adds r1, r5, #0 - adds r1, #0x84 - ldr r0, [r1] - cmp r0, #0 - beq _0808F5A4 - subs r0, #1 - str r0, [r1] - cmp r0, #0 - bne _0808F5A4 - bl DeleteThisEntity -_0808F5A4: - adds r0, r5, #0 - bl GetNextFrame - b _0808F5E8 -_0808F5AC: - movs r0, #1 - strb r0, [r5, #0xc] - ldr r4, [r5, #0x50] - ldrb r2, [r4, #0x19] - lsrs r2, r2, #6 - lsls r2, r2, #6 - ldrb r3, [r5, #0x19] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r3 - orrs r0, r2 - strb r0, [r5, #0x19] - ldrb r0, [r4, #0x1b] - lsrs r0, r0, #6 - lsls r0, r0, #6 - ldrb r2, [r5, #0x1b] - ands r1, r2 - orrs r1, r0 - strb r1, [r5, #0x1b] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r2] - adds r0, r5, #0 - movs r1, #3 - bl InitializeAnimation -_0808F5E8: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_0808F5EC -sub_0808F5EC: @ 0x0808F5EC - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #0x54] - movs r1, #0x49 - movs r2, #5 - movs r3, #0 - bl CreateObjectWithParent - adds r1, r0, #0 - cmp r1, #0 - beq _0808F608 - str r4, [r1, #0x50] - ldr r0, [r4, #0x54] - str r0, [r1, #0x54] -_0808F608: - ldr r0, [r4, #0x54] - movs r1, #0x49 - movs r2, #6 - movs r3, #0 - bl CreateObjectWithParent - adds r1, r0, #0 - cmp r1, #0 - beq _0808F620 - str r4, [r1, #0x50] - ldr r0, [r4, #0x54] - str r0, [r1, #0x54] -_0808F620: - ldr r0, [r4, #0x54] - movs r1, #0x49 - movs r2, #7 - movs r3, #0 - bl CreateObjectWithParent - adds r1, r0, #0 - cmp r1, #0 - beq _0808F638 - str r4, [r1, #0x50] - ldr r0, [r4, #0x54] - str r0, [r1, #0x54] -_0808F638: - movs r0, #0x96 - lsls r0, r0, #2 - str r0, [r4, #0x74] - pop {r4, pc} diff --git a/include/functions.h b/include/functions.h index acf20f1f..9796376b 100644 --- a/include/functions.h +++ b/include/functions.h @@ -57,7 +57,7 @@ extern void sub_080791D0(); extern void sub_0805EC9C(); extern void sub_0805EC60(); extern void sub_080873D0(); -extern void sub_080045D4(); +extern u8 sub_080045D4(s16, s16, u16, u16); extern void sub_0806F69C(); extern void sub_0805E3A0(Entity*, u32); extern void sub_0806D0B0(Entity*); @@ -191,7 +191,7 @@ extern void sub_0801E738(u32); extern void sub_080A70AC(void*); extern void sub_080A7114(u32); extern void sub_08001242(void); -extern void sub_08003FC4(Entity*, u32); +extern u32 sub_08003FC4(Entity*, u32); extern u8 sub_080043E8(Entity*); extern void sub_08001290(Entity*, u32); extern void sub_08004488(u32); diff --git a/include/structures.h b/include/structures.h index ff29f0da..69e6e65a 100644 --- a/include/structures.h +++ b/include/structures.h @@ -43,8 +43,8 @@ typedef struct { extern struct_02002A40 gUnk_02002A40; typedef struct { - u16 frameCount; // regular frame count? does anything reset it? - u8 field_0x2[6]; + u32 frameCount; // regular frame count? does anything reset it? + u8 field_0x4[0x4]; bool8 transitioningOut; u8 transitionType; // transition when changing areas u8 field_0xa; // seems to be a tile type diff --git a/linker.ld b/linker.ld index d0de7636..2b36cabf 100644 --- a/linker.ld +++ b/linker.ld @@ -748,7 +748,6 @@ SECTIONS { src/object/heartContainer.o(.text); src/object/object48.o(.text); src/object/object49.o(.text); - asm/object49.o(.text); asm/backgroundCloud.o(.text); asm/object4B.o(.text); asm/pushableFurniture.o(.text); diff --git a/src/enemy/lakitu.c b/src/enemy/lakitu.c index 146523f0..94dbd2f4 100644 --- a/src/enemy/lakitu.c +++ b/src/enemy/lakitu.c @@ -1,12 +1,12 @@ #include "global.h" #include "entity.h" +#include "functions.h" #include "trig.h" #include "random.h" #include "link.h" // Lakitu extern void EnemyFunctionHandler(Entity *, void (*const funcs[])(Entity*)); -extern void SetChildOffset(Entity *, u32, u32, u32); // sub_0803C758 extern void sub_0803CAD0(Entity *); @@ -41,7 +41,6 @@ extern void sub_0803CB64(Entity *); extern void sub_0803CB34(Entity *); // sub_0803CA0C -extern u32 sub_08003FC4(Entity *, u32); extern void sub_0803CC08(Entity *this); // sub_0803CA4C @@ -51,12 +50,7 @@ extern u32 sub_080041A0(Entity *, Entity *, u32, u32); // sub_0803CA84 extern u32 GetFacingDirection(Entity *, Entity *); -// sub_0803CAD0 -extern u8 sub_080045D4(s16, s16, u16, u16); -extern void sub_080AEFE0(Entity *); - // sub_0803CB64 -extern void PositionRelative(Entity *, Entity *, u32, u32); extern void sub_08004488(u32); typedef struct { diff --git a/src/enemy/miniFireballGuy.c b/src/enemy/miniFireballGuy.c index 820381c4..a4c169d7 100644 --- a/src/enemy/miniFireballGuy.c +++ b/src/enemy/miniFireballGuy.c @@ -1,13 +1,11 @@ #include "global.h" #include "entity.h" +#include "functions.h" extern void EnemyFunctionHandler(Entity*, void (*const func[])(Entity*)); -extern void sub_0804AA30(Entity*, void (*const func[][])(Entity*)); extern void sub_0804A7D4(Entity*); extern void sub_0804A720(Entity*); extern void sub_08045678(Entity*); -extern void sub_080AEFE0(void); -extern u32 sub_08003FC4(Entity*, u32); extern void sub_08045678(Entity*); extern void (*const gUnk_080D1868[])(Entity*); @@ -25,7 +23,7 @@ void sub_080455BC(Entity *this) void sub_080455D4(Entity *this) { - sub_0804AA30(this, &gUnk_080D1868); + sub_0804AA30(this, gUnk_080D1868); } void sub_080455E4(Entity *this) @@ -53,7 +51,7 @@ void sub_08045618(Entity *this) void sub_08045654(Entity *this) { - sub_080AEFE0(); + sub_080AEFE0(this); GetNextFrame(this); if (sub_08003FC4(this, 0x1800) == 0) { sub_08045678(this); diff --git a/src/npc/postman.c b/src/npc/postman.c index 6df8f21b..d920cba8 100644 --- a/src/npc/postman.c +++ b/src/npc/postman.c @@ -1,5 +1,6 @@ #include "global.h" #include "entity.h" +#include "functions.h" #include "npc.h" #include "textbox.h" #include "link.h" @@ -28,7 +29,6 @@ extern void sub_080606D8(Entity*); extern void sub_0807DD94(Entity*, u32); extern void sub_080788E0(Entity*); extern void sub_08004488(u32); -extern void sub_08003FC4(Entity*, u32); extern void sub_080606C0(Entity*); extern void sub_0800451C(Entity*); extern void sub_08078784(Entity*, u32); diff --git a/src/npc/zelda.c b/src/npc/zelda.c index 087e8fe8..43a8e36f 100644 --- a/src/npc/zelda.c +++ b/src/npc/zelda.c @@ -1,5 +1,6 @@ #include "global.h" #include "entity.h" +#include "functions.h" #include "room.h" #include "flags.h" @@ -16,10 +17,8 @@ void DeleteThisEntity(void); extern Entity* GetEntityByType(u32, u32); extern void sub_080686C4(Entity*, Entity*); extern void sub_0806F62C(Entity*, u32, u32); -extern u32 sub_08003FC4(Entity*, u32); extern void PlaySFX(u32); extern void SetTileType(u32, u32, u32); -extern void sub_0807BA8C(u16, u32); extern Entity gLinkEntity; extern RoomControls gRoomControls; diff --git a/src/object/object49.c b/src/object/object49.c index a586e520..925e47ea 100644 --- a/src/object/object49.c +++ b/src/object/object49.c @@ -1,19 +1,22 @@ #include "global.h" #include "entity.h" +#include "functions.h" +#include "position.h" +#include "random.h" +#include "structures.h" + +static void sub_0808F2B0(Entity*); +static void sub_0808F14C(Entity*); +static void sub_0808F244(Entity*); -extern u32 Random(void); -extern void sub_0808F2B0(Entity*); -extern u32 sub_08003FC4(Entity*, u32); -void sub_0808F14C(Entity*); -extern void PlaySFX(u32); extern void sub_0806FCF4(Entity*, u32, u32, u32); -extern void sub_0808F244(Entity*); -extern void sub_0805EC9C(Entity*, u32, u32, u32); +extern void sub_0808F5EC(Entity*); +extern bool32 sub_0806F3E4(Entity *); extern void (*const gUnk_08121E5C[])(Entity*); extern void (*const gUnk_08121E88[])(Entity*); extern void (*const gUnk_08121E98[])(Entity*); - +extern const u16 gUnk_08121EA0[]; void Object49(Entity* this) { gUnk_08121E5C[this->entityType.form](this); @@ -52,7 +55,7 @@ void sub_0808F0D0(Entity* this) { sub_0808F14C(this); } -void sub_0808F14C(Entity* this) { +static void sub_0808F14C(Entity* this) { sub_0808F2B0(this); if (sub_08003FC4(this, 0x2000) == 0) { this->action++; @@ -103,7 +106,7 @@ void sub_0808F1F8(Entity *this) sub_0808F244(this); } -void sub_0808F244(Entity *this) +static void sub_0808F244(Entity *this) { this->spriteSettings.b.draw = this->parent->spriteSettings.b.draw; @@ -119,7 +122,7 @@ void sub_0808F244(Entity *this) } } -void sub_0808F2B0(Entity *this) +static void sub_0808F2B0(Entity *this) { sub_0805EC9C(this, *(u32 *)&this->field_0x74, *(u32 *)&this->field_0x78, this->field_0x70.WORD); } @@ -152,4 +155,144 @@ void sub_0808F2C0(Entity *this) if (this->action == 0xff) { DeleteThisEntity(); } -} \ No newline at end of file +} + +void sub_0808F370(Entity* this) { + if (this->action == 0) { + if (this->parent->previousActionFlag == 1) { + this->action = 1; + this->field_0x70.WORD = 0; + sub_0808F5EC(this); + } + } else { + u8 flag = this->parent->previousActionFlag - 1; + if (flag < 5) { + if (this->field_0x70.WORD == 0) { + if (--(*(u32 *)&this->field_0x74) == -1) { + this->field_0x70.WORD = gUnk_08121EA0[Random() & 1]; + } + } else { + if (--this->field_0x70.WORD == 0) { + sub_0808F5EC(this); + } + } + } else { + this->action = 0; + *(u32 *)&this->field_0x74 = 0; + } + } +} + +void sub_0808F3DC(Entity* this) { + if (this->action == 0) { + this->spriteSettings.b.draw = 1; + this->action = 1; + this->actionDelay = 120; + InitializeAnimation(this, this->entityType.form + 1); + // TODO: This block of code might supposed to be a switch statement. + if (this->entityType.form != 8) { + if (this->entityType.form == 7) { + sub_0806FAD8(this->attachedEntity, this); + return; + } + } else { + this->damageType = this->attachedEntity->damageType; + this->attachedEntity->damageType = 0x7E; + } + ResolveEntityOnTop(this->attachedEntity, this); + } else { + if (*(u32 *)&this->parent->field_0x74 == 0) { + if (this->entityType.form == 8) { + this->attachedEntity->damageType = this->damageType; + } + DeleteThisEntity(); + } + + if (this->entityType.form == 5 && this->frames.b.f0) { + Entity* entity = CreateObjectWithParent(this->attachedEntity, 0x49, 8, 0); + if (entity) { + entity->parent = this->parent; + entity->attachedEntity = this->parent->parent; + } + } + + GetNextFrame(this); + CopyPositionAndSpriteOffset(this->attachedEntity, this); + } +} + +void sub_0808F498(Entity* this) { + u32 var0; + + if (this->action != 0) { + if (sub_0806F3E4(this)) { + if (gScreenTransition.frameCount % 16 == 0) { + PlaySFX(0xEF); + } + DeleteThisEntity(); + } + + if (--this->actionDelay == 0xFF) { + DeleteThisEntity(); + } + + if (gLinkState.field_0x1c != 1) { + DeleteThisEntity(); + } + } else { + this->action = 1; + this->actionDelay = 64; + var0 = this->entityType.parameter != 0 ? 44 : 43; + this->x.HALF.HI -= this->parent->boundingBox->field_0x6; + this->x.HALF.HI += (s32)Random() % (this->parent->boundingBox->field_0x6 * 2); + this->y.HALF.HI -= this->parent->boundingBox->field_0x7; + this->y.HALF.HI += (s32)Random() % (this->parent->boundingBox->field_0x7 * 2); + sub_0801D2B4(this, var0); + InitializeAnimation(this, 4); + } +} + +void sub_0808F554(Entity* this) { + CopyPositionAndSpriteOffset(this->parent, this); + this->spriteOffsetY -= 24; + if ((s8)this->parent->spriteOffsetX != 0) { + this->spriteOffsetX += (s8)this->parent->spriteOffsetX / 2; + } + + if (this->action != 0) { + if (*(u32 *)&this->cutsceneBeh) { + if (--(*(u32 *)&this->cutsceneBeh) == 0) { + DeleteThisEntity(); + } + } + GetNextFrame(this); + } else { + this->action = 1; + this->spriteRendering.b3 = this->parent->spriteRendering.b3; + this->spriteOrientation.flipY = this->parent->spriteOrientation.flipY; + this->spritePriority.b0 = 0; + InitializeAnimation(this, 3); + } +} + +void sub_0808F5EC(Entity* this) { + Entity* entity = CreateObjectWithParent(this->attachedEntity, 0x49, 5, 0); + if (entity) { + entity->parent = this; + entity->attachedEntity = this->attachedEntity; + } + + entity = CreateObjectWithParent(this->attachedEntity, 0x49, 6, 0); + if (entity) { + entity->parent = this; + entity->attachedEntity = this->attachedEntity; + } + + entity = CreateObjectWithParent(this->attachedEntity, 0x49, 7, 0); + if (entity) { + entity->parent = this; + entity->attachedEntity = this->attachedEntity; + } + + *(u32 *)&this->field_0x74 = 600; +} From acdc85a61dce2edcfcf19face76b3376976db42d Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Wed, 5 Aug 2020 17:47:00 -0500 Subject: [PATCH 2/6] Match MainLoop() --- asm/non_matching/mainLoop.inc | 115 ---------------------------------- include/main.h | 43 ++++++------- include/structures.h | 8 +++ src/introSetTransition.c | 16 ++--- src/mainLoop.c | 109 ++++++++++---------------------- 5 files changed, 69 insertions(+), 222 deletions(-) delete mode 100644 asm/non_matching/mainLoop.inc diff --git a/asm/non_matching/mainLoop.inc b/asm/non_matching/mainLoop.inc deleted file mode 100644 index 24e3f299..00000000 --- a/asm/non_matching/mainLoop.inc +++ /dev/null @@ -1,115 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - push {r4, r5, r6, lr} - bl sub_08055F70 - bl sub_080A3204 - bl sub_0805616C - bl sub_0807CE90 - bl sub_080560B8 - bl sub_08056208 - ldr r1, _08055EEC @ =gUnk_02000010 - movs r0, #0xc1 - strb r0, [r1, #4] - bl sub_0804FFE4 - ldr r1, _08055EF0 @ =0x040000D4 - movs r0, #0xa0 - lsls r0, r0, #0x13 - str r0, [r1] - ldr r0, _08055EF4 @ =gUnk_020176A0 - str r0, [r1, #4] - ldr r0, _08055EF8 @ =0x84000080 - str r0, [r1, #8] - ldr r0, [r1, #8] - movs r0, #1 - bl sub_0804FF84 - bl sub_08056418 - bl sub_080ADD30 - ldr r1, _08055EFC @ =gRand - ldr r0, _08055F00 @ =0x01234567 - str r0, [r1] - ldr r4, _08055F04 @ =gUnk_03001000 - adds r0, r4, #0 - movs r1, #0x10 - bl _DmaZero - movs r0, #0 - bl sub_08056010 - adds r6, r4, #0 -_08055EC8: - bl ReadKeyInput - bl sub_08055FF4 - cmp r0, #0 - beq _08055ED8 - bl sub_080560A8 -_08055ED8: - ldrb r0, [r6, #1] - ldr r1, _08055F04 @ =gUnk_03001000 - cmp r0, #0 - beq _08055F08 - cmp r0, #1 - bne _08055F08 - bl sub_08056260 - b _08055F64 - .align 2, 0 -_08055EEC: .4byte gUnk_02000010 -_08055EF0: .4byte 0x040000D4 -_08055EF4: .4byte gUnk_020176A0 -_08055EF8: .4byte 0x84000080 -_08055EFC: .4byte gRand -_08055F00: .4byte 0x01234567 -_08055F04: .4byte gUnk_03001000 -_08055F08: - ldrb r0, [r1, #8] - cmp r0, #0 - beq _08055F22 - ldr r4, _08055F34 @ =gUnk_03001000 - movs r5, #0xff -_08055F12: - bl VBlankIntrWait - ldrb r0, [r4, #8] - subs r0, #1 - strb r0, [r4, #8] - ands r0, r5 - cmp r0, #0 - bne _08055F12 -_08055F22: - ldr r1, _08055F34 @ =gUnk_03001000 - ldrb r0, [r1, #9] - cmp r0, #0 - beq _08055F44 - subs r0, #1 - strb r0, [r1, #9] - ldrb r4, [r1, #0xa] - b _08055F3C - .align 2, 0 -_08055F34: .4byte gUnk_03001000 -_08055F38: - bl VBlankIntrWait -_08055F3C: - adds r0, r4, #0 - subs r4, #1 - cmp r0, #0 - bgt _08055F38 -_08055F44: - ldrh r0, [r6, #0xc] - adds r0, #1 - strh r0, [r6, #0xc] - ldr r1, _08055F6C @ =gUnk_08100CBC - ldrb r0, [r6, #2] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - bl _call_via_r0 - bl sub_08056458 - bl sub_08050154 - bl sub_080A3480 -_08055F64: - bl sub_08016E78 - b _08055EC8 - .align 2, 0 -_08055F6C: .4byte gUnk_08100CBC - .syntax divided \ No newline at end of file diff --git a/include/main.h b/include/main.h index 4cceb41e..c98a1e9a 100644 --- a/include/main.h +++ b/include/main.h @@ -17,13 +17,16 @@ typedef struct { // 0x03001000 typedef struct { u8 interruptFlag; u8 field_0x1; + u8 loadType; u8 funcIndex; - u8 field_0x3; u8 transition; u8 field_0x5; u8 muteAudio; - u8 field_0x8; + u8 field_0x7; u8 countdown; + u8 field_0x9; + u8 field_0xa; + u16 ticks; } Main; typedef struct { @@ -43,27 +46,25 @@ extern UI gUnk_02032EC0; -extern s32 sub_08055F70(); -extern s32 sub_080A3204(s32); -extern s32 sub_0807CE90(s32); -extern s32 sub_080560B8(s32); -extern void sub_08056208(s32); -extern void sub_0804FFE4(); -extern s32 sub_08056418(); -extern void sub_080ADD30(s32); +extern void sub_08055F70(void); +extern void sub_080A3204(void); +extern void sub_0807CE90(void); +extern void sub_080560B8(void); +extern void sub_08056208(void); +extern void sub_0804FFE4(void); +extern void sub_08056418(void); +extern void sub_080ADD30(void); -extern s32 sub_08056010(s32); -extern s32 sub_08016E78(s32); -extern s32 ReadKeyInput(); -extern s32 sub_08055FF4(u8); -extern void sub_080560A8(); -extern s32 sub_08056260(); +extern void sub_08056010(u32); +extern void sub_08016E78(void); +extern void ReadKeyInput(void); +extern u32 sub_08055FF4(void); +extern void sub_080560A8(void); +extern void sub_08056260(void); extern void VBlankIntrWait(); extern s32 _call_via_r0(s32); -extern s32 sub_08056458(s32); -extern s32 sub_08050154(s32); -extern s32 sub_080A3480(s32); +extern void sub_08056458(void); +extern void sub_08050154(void); +extern void sub_080A3480(void); -extern s32 gRand; -extern s32 gUnk_08100CBC; #endif \ No newline at end of file diff --git a/include/structures.h b/include/structures.h index 69e6e65a..f3ca87d5 100644 --- a/include/structures.h +++ b/include/structures.h @@ -25,6 +25,14 @@ typedef struct { #define gUnk_02000000 ((struct_02000000*)(0x2000000)) //extern struct_02000000 gUnk_02000000; +typedef struct { + u8 filler0[0x4]; + u8 field_0x4; + u8 field_0x5; +} struct_02000010; + +extern struct_02000010 gUnk_02000010; + typedef struct { /*0x000*/ u8 filler0[0x6]; /*0x006*/ u8 unk6; diff --git a/src/introSetTransition.c b/src/introSetTransition.c index 33f0e62c..ea42ecd9 100644 --- a/src/introSetTransition.c +++ b/src/introSetTransition.c @@ -18,17 +18,10 @@ typedef struct { extern struct_03000FD0 gUnk_03000FD0; -typedef struct { - u8 filler[5]; - u8 field_0x5; -} struct_02000010; - -extern struct_02000010 gUnk_02000010; - u32 IntroSetTransition(u32 transition) { gUnk_02032EC0.transitionType = transition; - gUnk_03001000.field_0x3 = 2; + gUnk_03001000.funcIndex = 2; _DmaZero((u32 *)&gMenu, 48); DoFade(7, 8); } @@ -36,7 +29,7 @@ u32 IntroSetTransition(u32 transition) void sub_080AD380() { sub_080AD90C(); - switch (gUnk_03001000.field_0x3) { + switch (gUnk_03001000.funcIndex) { case 0: sub_08056418(); _DmaZero(&gUnk_02032EC0, 0x3b4); @@ -50,7 +43,7 @@ void sub_080AD380() return; } sub_0801DA90(1); - gUnk_03001000.field_0x3 = 1; + gUnk_03001000.funcIndex = 1; break; } sub_080AD918(); @@ -112,7 +105,8 @@ void sub_080AD474(void) gMenu.transitionTimer = 0x1e; gMenu.field_0x4 = 7; EraseAllEntities(); - sub_080ADD30(sub_0801CFA8(0)); + sub_0801CFA8(0); + sub_080ADD30(); gUnk_02024490 = 1; sub_0801D7EC(2); if (((struct_02000000*)0x2000000)->gameLanguage == 0) { diff --git a/src/mainLoop.c b/src/mainLoop.c index 4e07b882..0d04e5a8 100644 --- a/src/mainLoop.c +++ b/src/mainLoop.c @@ -1,58 +1,17 @@ #include "global.h" +#include "functions.h" #include "main.h" +#include "random.h" -#if 0 - -typedef struct { - u8 interruptFlag; - u8 field_0x1; - u8 loadType; - u8 funcIndex; - u8 transition; - u16 field_0x5; - u8 muteAudio; - u8 field_0x8; - u8 countdown; - u8 field_0xa; - u8 field_0xb; - u16 ticks; - u8 field_0xe; - u8 field_0xf; -} MainStruct; - -extern void sub_08055F70(void); -extern void sub_080A3204(void); -extern void sub_0805616C(void); -extern void sub_0807CE90(void); -extern void sub_080560B8(void); -extern void sub_08056208(void); -extern void sub_0804FFE4(void); extern void sub_0804FF84(u32); -extern void sub_08056418(void); -extern void sub_080ADD30(void); extern void _DmaZero(void*, u32); -extern void sub_08056010(u32); -extern void ReadKeyInput(); -extern u32 sub_08055FF4(); -extern void sub_080560A8(void); -extern void sub_08056458(void); -extern void sub_08050154(void); -extern void sub_080A3480(void); -extern void sub_08016E78(void); -extern void sub_08056260(void); -extern u8 gUnk_02000014; extern u32 gUnk_020176A0; -extern u32 gRand; -extern MainStruct gUnk_03001000; -extern void (*gUnk_08100CBC[])(); +extern const void (*gUnk_08100CBC[])(); extern void VBlankInterruptWait(void); void MainLoop(void) { - bool32 codeInputted; - u8 cVar1; - u32 uVar2; - MainStruct *s; + int var0; sub_08055F70(); sub_080A3204(); @@ -60,49 +19,49 @@ void MainLoop(void) { sub_0807CE90(); sub_080560B8(); sub_08056208(); - gUnk_02000014 = 193; + gUnk_02000010.field_0x4 = 193; sub_0804FFE4(); DmaSet(3, 0x5000000U, &gUnk_020176A0, 0x84000080U); sub_0804FF84(1); sub_08056418(); sub_080ADD30(); gRand = 0x1234567; - s = &gUnk_03001000; - _DmaZero(s, 16); + _DmaZero(&gUnk_03001000, 16); sub_08056010(0); while (1) { ReadKeyInput(); - codeInputted = sub_08055FF4(); - if (codeInputted) { + if (sub_08055FF4()) { sub_080560A8(); } - if ((s->field_0x1 != 0) || (s->field_0x1 == 1)) { - sub_08056260(); - } else if (s->field_0x8 != 0) { - while (--s->field_0x8) { - VBlankInterruptWait(); + + switch (gUnk_03001000.field_0x1) { + case 1: + sub_08056260(); + break; + case 0: + default: + if (gUnk_03001000.countdown != 0) { + do { + VBlankIntrWait(); + } while (--gUnk_03001000.countdown); } - } - if (s->countdown != 0) { - s->countdown--; - uVar2 = s->field_0xa; - while (uVar2 > 0) { - VBlankIntrWait(); - uVar2--; + + if (gUnk_03001000.field_0x9 != 0) { + gUnk_03001000.field_0x9--; + var0 = gUnk_03001000.field_0xa; + while (var0-- > 0) { + VBlankIntrWait(); + } } - } - s->ticks++; - gUnk_08100CBC[s->loadType](); - sub_08056458(); - sub_08050154(); - sub_080A3480(); + + gUnk_03001000.ticks++; + gUnk_08100CBC[gUnk_03001000.loadType](); + sub_08056458(); + sub_08050154(); + sub_080A3480(); + break; } + sub_08016E78(); -} - -#endif - -NAKED -void MainLoop(void) { - asm(".include \"asm/non_matching/mainLoop.inc\""); + } } From 946de7529d7496fa5c7a0d35caca425eb834386a Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Wed, 5 Aug 2020 17:47:03 -0500 Subject: [PATCH 3/6] Dump Nintendo + Capcom intro screen graphics --- data/data_08121C58.s | 19 +++++++++++++++++-- graphics/intro/capcom.pal | 19 +++++++++++++++++++ graphics/intro/nintendo.pal | 19 +++++++++++++++++++ graphics/intro/nintendo_capcom.png | Bin 0 -> 1613 bytes graphics_file_rules.mk | 4 ++++ 5 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 graphics/intro/capcom.pal create mode 100644 graphics/intro/nintendo.pal create mode 100644 graphics/intro/nintendo_capcom.png diff --git a/data/data_08121C58.s b/data/data_08121C58.s index 9c5f3788..a691f57a 100755 --- a/data/data_08121C58.s +++ b/data/data_08121C58.s @@ -19322,7 +19322,16 @@ gUnk_085BD440:: @ 085BD440 .incbin "baserom.gba", 0x5BD440, 0x00000E0 gUnk_085BD520:: @ 085BD520 - .incbin "baserom.gba", 0x5BD520, 0x00029D8 + .incbin "baserom.gba", 0x5BD520, 0x0000100 + +gUnk_085BD620:: @ 085BD620 + .incbin "graphics/intro/capcom.gbapal" + +gUnk_085BD640:: @ 085BD640 + .incbin "graphics/intro/nintendo.gbapal" + +gUnk_085BD660:: @ 085BD660 + .incbin "baserom.gba", 0x5BD660, 0x0002898 gUnk_085BFEF8:: @ 085BFEF8 .incbin "baserom.gba", 0x5BFEF8, 0x000002E @@ -22535,7 +22544,13 @@ gUnk_088C065C:: @ 088C065C .incbin "baserom.gba", 0x8C065C, 0x00002A4 gUnk_088C0900:: @ 088C0900 - .incbin "baserom.gba", 0x8C0900, 0x000598C + .incbin "baserom.gba", 0x8C0900, 0x0001980 + +gUnk_088C2280:: @ 088C2280 + .incbin "graphics/intro/nintendo_capcom.4bpp" + +gUnk_088C31E0:: @ 088C31E0 + .incbin "baserom.gba", 0x8C31E0, 0x00030AC gUnk_088C628C:: @ 088C628C .incbin "baserom.gba", 0x8C628C, 0x00003FC diff --git a/graphics/intro/capcom.pal b/graphics/intro/capcom.pal new file mode 100644 index 00000000..97dc7b18 --- /dev/null +++ b/graphics/intro/capcom.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 255 255 +41 0 238 +74 115 180 +98 131 123 +139 156 106 +205 164 24 +238 197 49 +255 230 0 +106 139 189 +164 172 197 +213 213 222 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/intro/nintendo.pal b/graphics/intro/nintendo.pal new file mode 100644 index 00000000..32b3f094 --- /dev/null +++ b/graphics/intro/nintendo.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 255 255 +255 57 0 +255 98 8 +255 131 41 +255 156 74 +255 180 115 +255 205 156 +255 238 213 +255 255 255 +255 156 74 +255 180 115 +255 205 156 +255 238 213 +0 0 0 +0 0 0 +255 222 0 diff --git a/graphics/intro/nintendo_capcom.png b/graphics/intro/nintendo_capcom.png new file mode 100644 index 0000000000000000000000000000000000000000..15439c4c4a12da78cff2fb83baf656b083d205d2 GIT binary patch literal 1613 zcmV-T2D15yP)ZzjM<_6vySx_zLo*D99cfDZ!>yJi*LdWsV87N+vO_ZLrf4N7|IK4UUc~ z*Fk5`HMzNlnd`2*|0w?f_kHil#)Je0hn-2Z+LiZx_WjzomX)`EX{Giz|Mn9a9;J-P zo62hMv+Q>skoG~wF7Wj`YyKJcWO6S5pVj0O{fZx7TGm}GJmhyFC~|MA5ABM4qRRX; zW|8M@>E1U1M&r?0NcS0_Z#o_)7uH5A z2^*$eQ2;nZ*MUVOW})^ydA3Z)F@wI*AarF__5=Vdo8Y?u)e+pV!T?493TpzBz#9<; z0>C+886c7l09^CBWz+|2IlyBESdt{l%3cOrM_&WH41(QJXWYq-sjL89PqPYwAU-&N zXaRTtSN9!ty{iE2h5!&f&jH-I2A%}9-)QSJz}O~?4C7$*B($Gp*&CuJ0C<#k;e8g+o!n?C~gfV@UkX7&{6)~>4a1*7~P}w zPH@C1Vs~sgwMs;52m)zQDgdvxDWmzumz}W63||05^z1XhZWH?kzywl{$;Ie8(%$o9 zTE}J_j2=yV`Jn>L9&r|)BB`$-BDaH0Y_S4>WZ$QECEyJdpfL|a6IM-h1>h~Y3jjA8 zk<9>OY_f$EvV{cMkZ=|Z#50SqJ&s_z zN6HBcaCVF+Saw326ZF(slU~oXA-YX+>V?E%DD}{=3THSt zOlWZ!MIa9Kr}Hqhd97;zBUeku8|C!pfHhHIhhk0N&*HA6Gmlg zIT6{}*);%c?XmcP05sJEOFp292%EHb`T~G|;%zt_xIRdA){%+?rHR`Y`ApcUSj(x{ zmc#Wb0OAf&umD&@0Ub@`5Y1Du6nnN5VD zMbTFQ5b--O<{V(+FXsXE!Sg%=zQ49)ORYJ9zDarNO{HQj&kG_sjyG|>26`ML6K3Ne z$esibv$qhrbt)&sHeQho4nvYro1>?#$MFxezdn4>N?jTk6Dt)Y@zbX*JSKTTqE-GB z4mGvd8xv30?)iN1RpxhxuNzPNjFRk6RdA_Ns#tw<2=CYXLcnQ%P|oiTHvrtaD8;=X z6bDQTv+~R`2IXfsmHUFk!@!&B-Qfm+pHY@mO+v1KW|?GN0eIIJHXl>x-_*d*xR`K_ zo%rX4LKy%t0Gj6tASH5`ejDJnS2NrTxW+#5riEDnCKzy*JC|{*q_&a%%>cK*obo Date: Wed, 5 Aug 2020 17:47:06 -0500 Subject: [PATCH 4/6] Decompile some more of mainLoop.c --- asm/code_08050038.s | 8 ++-- asm/code_080526F8.s | 2 +- asm/code_08055FF4.s | 101 ------------------------------------------- asm/code_0805E744.s | 2 +- asm/code_0807CC3C.s | 2 +- asm/code_080A3480.s | 2 +- asm/sub_08055F70.s | 60 ------------------------- data/data_080B2A70.s | 2 + include/main.h | 17 +++++--- linker.ld | 1 - src/code_0804AA84.c | 19 +------- src/input.c | 21 ++++----- src/mainLoop.c | 79 ++++++++++++++++++++++++++++++--- src/sub_080AD834.c | 11 ++--- 14 files changed, 108 insertions(+), 219 deletions(-) delete mode 100644 asm/sub_08055F70.s diff --git a/asm/code_08050038.s b/asm/code_08050038.s index 3f48d62d..6a621a70 100644 --- a/asm/code_08050038.s +++ b/asm/code_08050038.s @@ -593,7 +593,7 @@ sub_0805060C: @ 0x0805060C cmp r0, #0 bne _0805061C movs r0, #2 - bl sub_08056010 + bl InitScreen _0805061C: pop {pc} .align 2, 0 @@ -3486,7 +3486,7 @@ sub_08051D2C: @ 0x08051D2C movs r1, #8 bl DoFade movs r0, #3 - bl sub_08056010 + bl InitScreen pop {pc} .align 2, 0 @@ -4270,12 +4270,12 @@ _080523AC: cmp r0, #0 bne _080523C8 movs r0, #2 - bl sub_08056010 + bl InitScreen b _080523CC .align 2, 0 _080523C4: .4byte gUnk_03000FD0 _080523C8: - bl sub_080560A8 + bl DoSoftReset _080523CC: pop {r4, pc} .align 2, 0 diff --git a/asm/code_080526F8.s b/asm/code_080526F8.s index 9e43fbd2..81b19e6a 100644 --- a/asm/code_080526F8.s +++ b/asm/code_080526F8.s @@ -2755,7 +2755,7 @@ sub_08053C60: @ 0x08053C60 ldr r0, _08053C80 @ =0x80100000 bl PlaySFX movs r0, #3 - bl sub_08056010 + bl InitScreen pop {pc} .align 2, 0 _08053C80: .4byte 0x80100000 diff --git a/asm/code_08055FF4.s b/asm/code_08055FF4.s index 2be77ac1..0ce62bc1 100644 --- a/asm/code_08055FF4.s +++ b/asm/code_08055FF4.s @@ -4,107 +4,6 @@ .syntax unified .text - - thumb_func_start sub_08055FF4 -sub_08055FF4: @ 0x08055FF4 - push {lr} - movs r2, #0 - ldr r0, _0805600C @ =gUnk_03000FF0 - ldrh r1, [r0] - movs r0, #0xf - ands r0, r1 - cmp r0, #0xf - bne _08056006 - movs r2, #1 -_08056006: - adds r0, r2, #0 - pop {pc} - .align 2, 0 -_0805600C: .4byte gUnk_03000FF0 - - thumb_func_start sub_08056010 -sub_08056010: @ 0x08056010 - ldr r1, _0805601C @ =gUnk_03001000 - movs r2, #0 - strb r0, [r1, #2] - strb r2, [r1, #3] - strb r2, [r1, #4] - bx lr - .align 2, 0 -_0805601C: .4byte gUnk_03001000 - - thumb_func_start sub_08056020 -sub_08056020: @ 0x08056020 - push {r4, lr} - ldr r2, _08056088 @ =0x04000208 - movs r1, #0 - strh r1, [r2] - ldr r0, _0805608C @ =0x04000200 - strh r1, [r0] - ldr r0, _08056090 @ =0x04000004 - strh r1, [r0] - ldr r0, _08056094 @ =0x04000202 - strh r1, [r0] - strh r1, [r2] - ldr r1, _08056098 @ =0x040000B0 - ldrh r2, [r1, #0xa] - ldr r4, _0805609C @ =0x0000C5FF - adds r0, r4, #0 - ands r0, r2 - strh r0, [r1, #0xa] - ldrh r2, [r1, #0xa] - ldr r3, _080560A0 @ =0x00007FFF - adds r0, r3, #0 - ands r0, r2 - strh r0, [r1, #0xa] - ldrh r0, [r1, #0xa] - adds r1, #0xc - ldrh r2, [r1, #0xa] - adds r0, r4, #0 - ands r0, r2 - strh r0, [r1, #0xa] - ldrh r2, [r1, #0xa] - adds r0, r3, #0 - ands r0, r2 - strh r0, [r1, #0xa] - ldrh r0, [r1, #0xa] - adds r1, #0xc - ldrh r2, [r1, #0xa] - adds r0, r4, #0 - ands r0, r2 - strh r0, [r1, #0xa] - ldrh r2, [r1, #0xa] - adds r0, r3, #0 - ands r0, r2 - strh r0, [r1, #0xa] - ldrh r0, [r1, #0xa] - ldr r0, _080560A4 @ =0x040000D4 - ldrh r1, [r0, #0xa] - ands r4, r1 - strh r4, [r0, #0xa] - ldrh r1, [r0, #0xa] - ands r3, r1 - strh r3, [r0, #0xa] - ldrh r0, [r0, #0xa] - pop {r4, pc} - .align 2, 0 -_08056088: .4byte 0x04000208 -_0805608C: .4byte 0x04000200 -_08056090: .4byte 0x04000004 -_08056094: .4byte 0x04000202 -_08056098: .4byte 0x040000B0 -_0805609C: .4byte 0x0000C5FF -_080560A0: .4byte 0x00007FFF -_080560A4: .4byte 0x040000D4 - - thumb_func_start sub_080560A8 -sub_080560A8: @ 0x080560A8 - push {lr} - bl sub_08056020 - movs r0, #0xde - bl SoftReset - pop {pc} - .align 2, 0 thumb_func_start sub_080560B8 sub_080560B8: @ 0x080560B8 diff --git a/asm/code_0805E744.s b/asm/code_0805E744.s index 5f06dd29..1e196837 100644 --- a/asm/code_0805E744.s +++ b/asm/code_0805E744.s @@ -2771,7 +2771,7 @@ _0805FBC0: .4byte gScreen sub_0805FBC4: @ 0x0805FBC4 push {lr} movs r0, #0 - bl sub_08056010 + bl InitScreen pop {pc} .align 2, 0 diff --git a/asm/code_0807CC3C.s b/asm/code_0807CC3C.s index 4ededc8c..61f52c24 100644 --- a/asm/code_0807CC3C.s +++ b/asm/code_0807CC3C.s @@ -6253,7 +6253,7 @@ _0807FB90: .4byte gLinkEntity sub_0807FB94: @ 0x0807FB94 push {lr} movs r0, #4 - bl sub_08056010 + bl InitScreen pop {pc} .align 2, 0 diff --git a/asm/code_080A3480.s b/asm/code_080A3480.s index 4b5ad21e..c629c34d 100644 --- a/asm/code_080A3480.s +++ b/asm/code_080A3480.s @@ -661,7 +661,7 @@ sub_080A3980: @ 0x080A3980 ldrb r0, [r0] cmp r0, #0 bne _080A398E - bl sub_080560A8 + bl DoSoftReset _080A398E: pop {pc} .align 2, 0 diff --git a/asm/sub_08055F70.s b/asm/sub_08055F70.s deleted file mode 100644 index 5cb4e821..00000000 --- a/asm/sub_08055F70.s +++ /dev/null @@ -1,60 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_08055F70 -sub_08055F70: @ 0x08055F70 - push {lr} - bl sub_08056020 - movs r0, #0xfe - bl RegisterRamReset - movs r1, #0xa0 - lsls r1, r1, #0x13 - ldr r2, _08055FC8 @ =0x00007FFF - adds r0, r2, #0 - strh r0, [r1] - ldr r1, _08055FCC @ =0x04000204 - ldr r2, _08055FD0 @ =0x00004014 - adds r0, r2, #0 - strh r0, [r1] - ldr r2, _08055FD4 @ =0x0003FFD0 - ldr r0, _08055FD8 @ =gUnk_02000030 - adds r1, r2, #0 - bl _DmaZero - ldr r0, _08055FDC @ =gUnk_080B2CD8 - ldr r3, _08055FE0 @ =sub_080B197C - subs r2, r0, r3 - cmp r2, #0 - beq _08055FAA - ldr r1, _08055FE4 @ =gUnk_030056F0 - adds r0, r3, #0 - bl sub_0801D66C -_08055FAA: - ldr r0, _08055FE8 @ =gUnk_080B2CD8 - ldr r3, _08055FEC @ =gUnk_080B2CD8 - subs r2, r0, r3 - cmp r2, #0 - beq _08055FBC - ldr r1, _08055FF0 @ =gUnk_02038560 - adds r0, r3, #0 - bl sub_0801D66C -_08055FBC: - movs r0, #0 - bl sub_0801DA90 - bl sub_08016B34 - pop {pc} - .align 2, 0 -_08055FC8: .4byte 0x00007FFF -_08055FCC: .4byte 0x04000204 -_08055FD0: .4byte 0x00004014 -_08055FD4: .4byte 0x0003FFD0 -_08055FD8: .4byte gUnk_02000030 -_08055FDC: .4byte gUnk_080B2CD8 -_08055FE0: .4byte sub_080B197C -_08055FE4: .4byte gUnk_030056F0 -_08055FE8: .4byte gUnk_080B2CD8 -_08055FEC: .4byte gUnk_080B2CD8 -_08055FF0: .4byte gUnk_02038560 diff --git a/data/data_080B2A70.s b/data/data_080B2A70.s index bee9d349..b90f8e8e 100644 --- a/data/data_080B2A70.s +++ b/data/data_080B2A70.s @@ -8,4 +8,6 @@ gUnk_080B2A70:: @ 080B2A70 .incbin "baserom.gba", 0x0B2A70, 0x0000268 gUnk_080B2CD8:: @ 080B2CD8 +gUnk_080B2CD8_2:: @ 080B2CD8 +gUnk_080B2CD8_3:: @ 080B2CD8 .incbin "baserom.gba", 0x0B2CD8, 0x0000010 \ No newline at end of file diff --git a/include/main.h b/include/main.h index c98a1e9a..4a58a344 100644 --- a/include/main.h +++ b/include/main.h @@ -14,10 +14,18 @@ typedef struct { // 0x03001000 u32 spritePriority; } MainStruct; +enum { + SCREEN_INTRO, + SCREEN_CHOOSE_FILE, + SCREEN_GAMEPLAY, + SCREEN_GAME_OVER, + SCREEN_CREDITS, +}; + typedef struct { u8 interruptFlag; u8 field_0x1; - u8 loadType; + u8 screen; u8 funcIndex; u8 transition; u8 field_0x5; @@ -45,8 +53,6 @@ extern Main gUnk_03001000; extern UI gUnk_02032EC0; - -extern void sub_08055F70(void); extern void sub_080A3204(void); extern void sub_0807CE90(void); extern void sub_080560B8(void); @@ -55,11 +61,10 @@ extern void sub_0804FFE4(void); extern void sub_08056418(void); extern void sub_080ADD30(void); -extern void sub_08056010(u32); +extern void InitScreen(u32); extern void sub_08016E78(void); extern void ReadKeyInput(void); -extern u32 sub_08055FF4(void); -extern void sub_080560A8(void); +extern void DoSoftReset(void); extern void sub_08056260(void); extern void VBlankIntrWait(); extern s32 _call_via_r0(s32); diff --git a/linker.ld b/linker.ld index 2b36cabf..07210c60 100644 --- a/linker.ld +++ b/linker.ld @@ -462,7 +462,6 @@ SECTIONS { src/sub_08055E08.o(.text); asm/sub_08055E24.o(.text); src/mainLoop.o(.text); - asm/sub_08055F70.o(.text); asm/code_08055FF4.o(.text); src/textbox.o(.text); asm/code_08056418.o(.text); diff --git a/src/code_0804AA84.c b/src/code_0804AA84.c index 5eddfc28..f861d4f0 100644 --- a/src/code_0804AA84.c +++ b/src/code_0804AA84.c @@ -1,26 +1,10 @@ #include "global.h" #include "entity.h" #include "area.h" +#include "main.h" #include "functions.h" #include "screen.h" -typedef struct { - u8 interruptFlag; - u8 field_0x1; - u8 loadType; - u8 funcIndex; - u8 transition; - u16 field_0x5; - u8 muteAudio; - u8 field_0x8; - u8 countdown; - u8 field_0xa; - u8 field_0xb; - u8 ticks; - u8 field_0xe; - u8 field_0xf; -} Main; - typedef struct { u8 filler [18]; u32 unk; @@ -32,7 +16,6 @@ extern void (*const gUnk_080D4120[])(); extern void (*const gUnk_080D412C[])(); -extern Main gUnk_03001000; extern struct_02018EB0 gUnk_02018EB0; extern u8 gUnk_03000FD0; diff --git a/src/input.c b/src/input.c index 438a6e6b..101a3ac6 100644 --- a/src/input.c +++ b/src/input.c @@ -2,26 +2,23 @@ #include "entity.h" #include "readKeyInput.h" -void StoreKeyInput(Input *pkeyInput, u32 ioKeyInput); +static void StoreKeyInput(Input*, u32); void ReadKeyInput(void) { - u32 reg = ~*(u16*)0x04000130 & 0x3FF; - Input* input = &gUnk_03000FF0; - StoreKeyInput(input, reg); + u32 keyInput = ~REG_KEYINPUT & KEYS_MASK; + StoreKeyInput(&gUnk_03000FF0, keyInput); } -void StoreKeyInput(Input *input, u32 ioKeyInput) +static void StoreKeyInput(Input *input, u32 keyInput) { - u32 difference; - u32 temp = input->heldKeys; - - difference = ioKeyInput & ~temp; + u32 heldKeys = input->heldKeys; + u32 difference = keyInput & ~heldKeys; input->newKeys = difference; - if (ioKeyInput == temp) { + if (keyInput == heldKeys) { if (--input->unk7 == 0) { input->unk7 = 4; - input->unk4 = ioKeyInput; + input->unk4 = keyInput; } else { input->unk4 = 0; @@ -31,5 +28,5 @@ void StoreKeyInput(Input *input, u32 ioKeyInput) input->unk7 = 0x14; input->unk4 = difference; } - input->heldKeys = ioKeyInput; + input->heldKeys = keyInput; } \ No newline at end of file diff --git a/src/mainLoop.c b/src/mainLoop.c index 0d04e5a8..f1c8df1c 100644 --- a/src/mainLoop.c +++ b/src/mainLoop.c @@ -2,13 +2,18 @@ #include "functions.h" #include "main.h" #include "random.h" +#include "readKeyInput.h" extern void sub_0804FF84(u32); -extern void _DmaZero(void*, u32); - extern u32 gUnk_020176A0; extern const void (*gUnk_08100CBC[])(); extern void VBlankInterruptWait(void); +extern void DisableInterruptsAndDMA(void); +extern void sub_0801D66C(void*, u8*, int); +extern void sub_08016B34(void); + +static void sub_08055F70(void); +static bool32 SoftResetKeysPressed(void); void MainLoop(void) { int var0; @@ -27,11 +32,11 @@ void MainLoop(void) { sub_080ADD30(); gRand = 0x1234567; _DmaZero(&gUnk_03001000, 16); - sub_08056010(0); + InitScreen(SCREEN_INTRO); while (1) { ReadKeyInput(); - if (sub_08055FF4()) { - sub_080560A8(); + if (SoftResetKeysPressed()) { + DoSoftReset(); } switch (gUnk_03001000.field_0x1) { @@ -55,7 +60,7 @@ void MainLoop(void) { } gUnk_03001000.ticks++; - gUnk_08100CBC[gUnk_03001000.loadType](); + gUnk_08100CBC[gUnk_03001000.screen](); sub_08056458(); sub_08050154(); sub_080A3480(); @@ -65,3 +70,65 @@ void MainLoop(void) { sub_08016E78(); } } + +// Interrupt handlers that are loaded into RAM. +extern u8 sub_080B197C[]; +extern u8 gUnk_030056F0[]; +extern u8 gUnk_02038560[]; +extern u8 gUnk_080B2CD8[]; +extern u8 gUnk_080B2CD8_2[]; +extern u8 gUnk_080B2CD8_3[]; +extern u8 gUnk_02000030[]; + +static void sub_08055F70(void) { + u32 size; + + DisableInterruptsAndDMA(); + RegisterRamReset(RESET_ALL & ~RESET_EWRAM); + *(vu16 *)BG_PLTT = 0x7FFF; + REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3; + size = 0x3FFD0; + _DmaZero(gUnk_02000030, size); + size = (u32)gUnk_080B2CD8 - (u32)sub_080B197C; + if (size != 0) { + sub_0801D66C(sub_080B197C, gUnk_030056F0, size); + } + + size = (u32)gUnk_080B2CD8_2 - (u32)gUnk_080B2CD8_3; + if (size != 0) { + sub_0801D66C(gUnk_080B2CD8_3, gUnk_02038560, size); + } + + sub_0801DA90(0); + sub_08016B34(); +} + +#define SOFT_RESET_KEYS (A_BUTTON | B_BUTTON | SELECT_BUTTON | START_BUTTON) + +static bool32 SoftResetKeysPressed(void) { + return (gUnk_03000FF0.heldKeys & SOFT_RESET_KEYS) == SOFT_RESET_KEYS; +} + +void InitScreen(u32 screen) { + gUnk_03001000.screen = screen; + gUnk_03001000.funcIndex = 0; + gUnk_03001000.transition = 0; +} + +void DisableInterruptsAndDMA(void) { + REG_IME = 0; + REG_IE = 0; + REG_DISPSTAT = 0; + REG_IF = 0; + REG_IME = 0; + + DmaStop(0); + DmaStop(1); + DmaStop(2); + DmaStop(3); +} + +void DoSoftReset(void) { + DisableInterruptsAndDMA(); + SoftReset(RESET_ALL & ~(RESET_EWRAM | RESET_SIO_REGS)); +} diff --git a/src/sub_080AD834.c b/src/sub_080AD834.c index b7b01918..9b1dd87b 100644 --- a/src/sub_080AD834.c +++ b/src/sub_080AD834.c @@ -1,13 +1,10 @@ #include "global.h" +#include "main.h" -extern void sub_08056010(u32); extern u8 gUnk_03000FD0; -void sub_080AD834(void) - -{ - if (gUnk_03000FD0 == '\0') { - sub_08056010(1); +void sub_080AD834(void) { + if (gUnk_03000FD0 == 0) { + InitScreen(SCREEN_CHOOSE_FILE); } - return; } From 83e6edf470500c5b8cb6b14736b4d45bd79364bd Mon Sep 17 00:00:00 2001 From: theo3 Date: Wed, 5 Aug 2020 20:47:10 -0700 Subject: [PATCH 5/6] wisp.c OK --- asm/code_0807B9B8.s | 33 +- asm/code_0807CC3C.s | 32 -- asm/wisp.s | 335 ------------------ asm/zeldaFollower.s | 55 --- baserom.gba.pal | Bin 0 -> 100 bytes baserom.gba.spr | Bin 0 -> 3592 bytes graphics/gameover.pal | 19 + graphics/gameover.png | Bin 0 -> 904 bytes include/functions.h | 10 +- include/link.h | 9 +- linker.ld | 4 +- src/code_0807CC3C.c | 25 +- src/code_080808D8.c | 25 -- src/code_0808091C.c | 30 +- src/enemy/bombPeahat.c | 1 - src/enemy/wisp.c | 149 ++++++++ src/npc/zeldaFollower.c | 25 ++ src/room.c | 2 +- src/sub_0807C998.c | 19 +- tools/gbagfx/link.pal | 19 + .../minishmaker-license.txt | 0 21 files changed, 300 insertions(+), 492 deletions(-) delete mode 100644 asm/wisp.s create mode 100644 baserom.gba.pal create mode 100644 baserom.gba.spr create mode 100644 graphics/gameover.pal create mode 100644 graphics/gameover.png delete mode 100644 src/code_080808D8.c create mode 100644 src/enemy/wisp.c create mode 100644 src/npc/zeldaFollower.c create mode 100644 tools/gbagfx/link.pal rename minishmaker-license.txt => tools/minishmaker-license.txt (100%) diff --git a/asm/code_0807B9B8.s b/asm/code_0807B9B8.s index f0d37f9c..83800962 100644 --- a/asm/code_0807B9B8.s +++ b/asm/code_0807B9B8.s @@ -1994,35 +1994,4 @@ _0807C956: mov r8, r3 mov sb, r4 pop {r4, r5, r6, r7, pc} - .align 2, 0 - - thumb_func_start sub_0807C960 -sub_0807C960: @ 0x0807C960 - push {lr} - adds r2, r0, #0 - movs r0, #1 - rsbs r0, r0, #0 - cmp r1, r0 - beq _0807C994 - ldr r0, _0807C984 @ =0x7FFFFFFF - ands r0, r1 - ldr r1, _0807C988 @ =gUnk_08324AE4 - adds r1, r0, r1 - lsrs r0, r2, #0x18 - cmp r0, #6 - bne _0807C98C - adds r0, r1, #0 - adds r1, r2, #0 - bl LZ77UnCompVram - b _0807C994 - .align 2, 0 -_0807C984: .4byte 0x7FFFFFFF -_0807C988: .4byte gUnk_08324AE4 -_0807C98C: - adds r0, r1, #0 - adds r1, r2, #0 - bl LZ77UnCompWram -_0807C994: - pop {pc} - .align 2, 0 - \ No newline at end of file + .align 2, 0 \ No newline at end of file diff --git a/asm/code_0807CC3C.s b/asm/code_0807CC3C.s index 4ededc8c..87939789 100644 --- a/asm/code_0807CC3C.s +++ b/asm/code_0807CC3C.s @@ -5,38 +5,6 @@ .text - thumb_func_start sub_0807CF48 -sub_0807CF48: @ 0x0807CF48 - push {r4, r5, lr} - bl sub_0807D1C4 - adds r4, r0, #0 - ldrh r0, [r4, #4] - ldr r5, _0807CF64 @ =gUnk_0811E4AC - adds r1, r5, #0 - bl sub_0807D184 - ldrh r0, [r4, #2] - adds r1, r5, #0 - bl sub_0807D184 - pop {r4, r5, pc} - .align 2, 0 -_0807CF64: .4byte gUnk_0811E4AC - - thumb_func_start sub_0807CF68 -sub_0807CF68: @ 0x0807CF68 - push {r4, r5, lr} - bl sub_0807D1C4 - adds r4, r0, #0 - ldr r5, _0807CF84 @ =gUnk_0811E4A4 - ldrh r0, [r4, #4] - adds r1, r5, #0 - bl sub_0807D184 - ldrh r0, [r4, #2] - adds r1, r5, #0 - bl sub_0807D184 - pop {r4, r5, pc} - .align 2, 0 -_0807CF84: .4byte gUnk_0811E4A4 - thumb_func_start sub_0807CF88 sub_0807CF88: @ 0x0807CF88 push {r4, r5, r6, r7, lr} diff --git a/asm/wisp.s b/asm/wisp.s deleted file mode 100644 index ac62efac..00000000 --- a/asm/wisp.s +++ /dev/null @@ -1,335 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Wisp -Wisp: @ 0x0803353C - push {lr} - ldr r1, _08033548 @ =gUnk_080CEB74 - bl EnemyFunctionHandler - pop {pc} - .align 2, 0 -_08033548: .4byte gUnk_080CEB74 - - thumb_func_start sub_0803354C -sub_0803354C: @ 0x0803354C - push {lr} - ldr r2, _08033560 @ =gUnk_080CEB8C - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08033560: .4byte gUnk_080CEB8C - - thumb_func_start sub_08033564 -sub_08033564: @ 0x08033564 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08033628 - movs r0, #0x3f - ands r0, r1 - cmp r0, #0xe - beq _080335E4 - cmp r0, #0xe - bgt _08033586 - cmp r0, #0 - beq _08033590 - b _08033628 -_08033586: - cmp r0, #0x14 - beq _080335EE - cmp r0, #0x15 - beq _080335E4 - b _08033628 -_08033590: - movs r0, #2 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - subs r0, #6 - ands r0, r1 - strb r0, [r4, #0x18] - ldrb r1, [r4, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r4, #0x10] - adds r1, r4, #0 - adds r1, #0x7c - movs r0, #0x9f - lsls r0, r0, #2 - strh r0, [r1] - ldr r2, _080335DC @ =gLinkState - ldr r0, [r2, #0x30] - movs r1, #0x80 - lsls r1, r1, #7 - orrs r0, r1 - str r0, [r2, #0x30] - ldr r1, _080335E0 @ =gUnk_02002A40 - ldrb r2, [r4, #0xa] - adds r0, r2, #1 - adds r3, r1, #0 - adds r3, #0xba - strb r0, [r3] - adds r1, #0xc8 - movs r0, #0x96 - lsls r0, r0, #2 - strh r0, [r1] - lsls r2, r2, #0x18 - cmp r2, #0 - beq _08033628 - bl DeleteThisEntity - b _08033628 - .align 2, 0 -_080335DC: .4byte gLinkState -_080335E0: .4byte gUnk_02002A40 -_080335E4: - adds r1, r4, #0 - adds r1, #0x45 - movs r0, #0 - strb r0, [r1] - b _08033628 -_080335EE: - ldrb r1, [r4, #0x10] - movs r0, #0x7f - ands r0, r1 - movs r1, #0 - strb r0, [r4, #0x10] - adds r0, r4, #0 - adds r0, #0x3d - strb r1, [r0] - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r4, #0x18] - adds r0, r4, #0 - movs r1, #2 - movs r2, #0 - bl CreateFx - adds r1, r0, #0 - cmp r1, #0 - beq _08033624 - str r1, [r4, #0x54] - movs r0, #0xe - strb r0, [r4, #0xe] - adds r0, r4, #0 - bl CopyPosition -_08033624: - bl DeleteThisEntity -_08033628: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0803362C -sub_0803362C: @ 0x0803362C - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F520 - cmp r0, #0 - beq _08033648 - ldr r0, _0803364C @ =gUnk_080CEB98 - ldrb r1, [r4, #0xd] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r4, #0 - bl _call_via_r1 -_08033648: - pop {r4, pc} - .align 2, 0 -_0803364C: .4byte gUnk_080CEB98 - - thumb_func_start sub_08033650 -sub_08033650: @ 0x08033650 - movs r1, #2 - strb r1, [r0, #0xd] - bx lr - .align 2, 0 - - thumb_func_start sub_08033658 -sub_08033658: @ 0x08033658 - push {lr} - bl sub_0806F4E8 - pop {pc} - - thumb_func_start sub_08033660 -sub_08033660: @ 0x08033660 - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F3E4 - cmp r0, #0 - beq _08033672 - adds r0, r4, #0 - bl sub_0804A7D4 -_08033672: - pop {r4, pc} - - thumb_func_start sub_08033674 -sub_08033674: @ 0x08033674 - push {r4, lr} - adds r4, r0, #0 - bl sub_0804A720 - movs r0, #0 - strb r0, [r4, #0xe] - movs r0, #1 - strb r0, [r4, #0xc] - strb r0, [r4, #0x1c] - ldrh r1, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x80 - strh r1, [r0] - ldrh r0, [r4, #0x32] - adds r1, r4, #0 - adds r1, #0x82 - strh r0, [r1] - adds r0, r4, #0 - bl sub_08033744 - ldrb r1, [r4, #0xb] - adds r0, r4, #0 - bl InitializeAnimation - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_080336A8 -sub_080336A8: @ 0x080336A8 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080336C0 - adds r0, r4, #0 - bl sub_08033744 - b _080336CE -_080336C0: - ldrh r0, [r4, #0x2a] - cmp r0, #0 - beq _080336CE - adds r1, r0, #0 - adds r0, r4, #0 - bl sub_0800417E -_080336CE: - adds r0, r4, #0 - bl sub_080AEF88 - adds r0, r4, #0 - bl GetNextFrame - pop {r4, pc} - - thumb_func_start sub_080336DC -sub_080336DC: @ 0x080336DC - push {lr} - adds r2, r0, #0 - adds r1, r2, #0 - adds r1, #0x7c - ldrh r0, [r1] - subs r0, #1 - strh r0, [r1] - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - cmp r0, #0xc - beq _0803371E - cmp r0, #0xc - bgt _080336FC - cmp r0, #0 - beq _0803372E - b _08033740 -_080336FC: - cmp r0, #0x18 - beq _08033716 - cmp r0, #0x24 - bne _08033740 - adds r0, r2, #0 - adds r0, #0x80 - ldrh r0, [r0] - strh r0, [r2, #0x2e] - adds r0, r2, #0 - adds r0, #0x82 - ldrh r0, [r0] - strh r0, [r2, #0x32] - b _08033740 -_08033716: - adds r0, r2, #0 - bl sub_080A29BC - b _08033740 -_0803371E: - ldrb r0, [r2, #0x18] - movs r1, #4 - rsbs r1, r1, #0 - ands r1, r0 - movs r0, #1 - orrs r1, r0 - strb r1, [r2, #0x18] - b _08033740 -_0803372E: - movs r0, #1 - strb r0, [r2, #0xc] - ldrb r1, [r2, #0x10] - movs r0, #0x80 - orrs r0, r1 - strb r0, [r2, #0x10] - adds r0, r2, #0 - bl sub_08033744 -_08033740: - pop {pc} - .align 2, 0 - - thumb_func_start sub_08033744 -sub_08033744: @ 0x08033744 - push {r4, r5, r6, lr} - adds r6, r0, #0 - bl Random - adds r5, r0, #0 - movs r0, #0xff - ands r5, r0 - ldr r1, _0803378C @ =gUnk_080CEBA4 - movs r0, #0x70 - ands r0, r5 - lsrs r0, r0, #4 - adds r0, r0, r1 - ldrb r0, [r0] - strb r0, [r6, #0xe] - movs r0, #0xc - ands r0, r5 - lsls r4, r0, #1 - adds r0, r6, #0 - bl sub_08049FA0 - cmp r0, #0 - bne _08033796 - movs r0, #3 - ands r0, r5 - cmp r0, #0 - beq _08033796 - adds r0, r6, #0 - bl sub_08049EE4 - adds r4, r0, #0 - movs r0, #0x80 - ands r5, r0 - cmp r5, #0 - beq _08033790 - adds r4, #4 - b _08033792 - .align 2, 0 -_0803378C: .4byte gUnk_080CEBA4 -_08033790: - adds r4, #0x1c -_08033792: - movs r0, #0x18 - ands r4, r0 -_08033796: - strb r4, [r6, #0x15] - pop {r4, r5, r6, pc} - .align 2, 0 diff --git a/asm/zeldaFollower.s b/asm/zeldaFollower.s index a85b9394..42000df5 100644 --- a/asm/zeldaFollower.s +++ b/asm/zeldaFollower.s @@ -6,61 +6,6 @@ .text - - thumb_func_start ZeldaFollower -ZeldaFollower: @ 0x080682B0 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - adds r2, r0, #0 - cmp r2, #0 - bne _080682F4 - adds r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - movs r0, #4 - strb r0, [r4, #0x14] - adds r0, r4, #0 - adds r0, #0x68 - strb r2, [r0] - adds r0, #1 - strb r2, [r0] - adds r0, r4, #0 - movs r1, #2 - bl sub_0805E3A0 - adds r0, r4, #0 - movs r1, #0 - bl InitAnimationForceUpdate - adds r0, r4, #0 - movs r1, #0 - bl sub_0806854C -_080682F4: - adds r0, r4, #0 - adds r0, #0x68 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - beq _0806830A - adds r0, r4, #0 - bl sub_08068318 - b _08068314 -_0806830A: - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r4, #0x18] -_08068314: - pop {r4, pc} - .align 2, 0 - thumb_func_start sub_08068318 sub_08068318: @ 0x08068318 push {r4, r5, r6, r7, lr} diff --git a/baserom.gba.pal b/baserom.gba.pal new file mode 100644 index 0000000000000000000000000000000000000000..0d552603df0d988e1cc87fe8844003ac427a0470 GIT binary patch literal 100 zcmb1fVUQ5g;pUh$nOj0>3b#ZY5H|twBOqS1kXzyv5Qi<|mZ$>aTOfKhw*=Q3Ziy@) u-gcE+!s;5gM8Zpc2|Xr3iA(B25^K~AC3rsiNC0p-TwG zF>=XegA7f}EppLija<$Vjgy|u3>A}A>?o1qr6Mmy>8btx@qRtu+wb|kUeD|IdY&gw zrC_m_f@j5Eq0=fT7oUqjoq{dmfS<$cv)Z{H%iOQNN?~y-9p-RM7`K14vLfFytpE636FPVAF<&BnG@T@`{JND zDm*$>Oc!&-GO<={7S{)5Uoq*d>?+>iBb5zB(b<7l(n7= zic!(ONn)Y=gUpEgLS5%cQkN$oA9+$U>`BxAdD1Q_MH>9u0NxYG@G) zj!8`rgk^yjPNNs4qCU=xCb3O4RC&?6-HW9M zyikAUMcFkkPJZjfCGomW%SAEYTgw`8M0omWDHeM~-V81E;*eOlS&O4pi^rd}{8LOm zpyhe-p6ER&{Yg3sSL!G`pyNqVE-FN&s1~cmI#DBPMV)9Cj*oRb*QaCq86D0+9hXLR ze0NL7FJkI#9UVXGDEL)Jz%*~ZndQytdEN|(5ius7GI>)a<}`V;Q!ESd;fDwxx>I~m z75ng~MLrxBSB2Ljvsn{9o3l}~iN7$LTV8XxrJchak^Jf$E-snNp1;m#eqbn5fbNkTuX>afFF%U;t>2R*EW#$9 z2@B_&ufn--IUMCkIPYH#$76<``C`&cJ&~gMAw8!>=R7@c8}$qn>bWA+&*|B*QP0K( zJ^kXUur=!WeUqMFzSQG!PEW9i5&wHl&kgaT_}z7xn{1#+fqwrTp zGj5C~BtIJ0nrIg6h^D(cn$io=7?md415JeInsAnwsC>>u_bLxj!7s*jOwL$~cmy#<9RN4!0(bIrS@?eh{a#YmnbacKfM&n9rZK7mWy6BzACK>61MhI_*43}EDEIL+M=~->1e7%*VjaEL`Y9;qInfc7h(C1d}d|{>a zw3Uwst&ELW=^C?g^tP2|LmEefGC7Uu_B5ih(`ZuI!jr_(0}#LuETIGv%V(_uwAZB6M^zmv`uas1nK{BNgI7G$GU^gnE4 zW{!=%d>i2|8{;K51~%DnZ?$o(%|`D<8@ENkhz(zFI~k&8x}9pPo%h5EyPc1gOTJ#> z7wpV>!%la*of{%xr=4@%b~-+>Q+LYFKg7+mb_Rd7qx#K`X|jVrKL;!4Iq;8kkS%Is z9E>h<(E5ynjuj3nn;mQyciwRD(}xZw4m$|?9|z$#92AS5aR;X+W#IWh1`fXrhGu4P zQTPUB$a^+}PD=(~iknNMw;_YQdos9mD1+qF8SJ~8!SSh19+>7tX>xKW-AVOQC;jzK z+S?^R>ty1FlZx-0sDE&xz2zkHw&eGn^!&dQ)2~wh&B>4=Q=VfcWf_?qU6M)2>zOqF zEt8u^G8ya7#Ccibu}o?dS#djL%~NtIQ{~bhm`im`E`K-Yay&Pe);Du$ zZp%fnCzp_8xg>v^%b@7j=iw^JBk1uwPSi-eHIJU{d33br(f4T{myYEzuFR)zNU3IU?QY|z6AyNItplARzSmx1vI}Uy?&{GQy^!f zkP^Q_S^^5?927F#Sjh3W3mG_E$nML9sFg*G=M*u#z6iyuMVNOLvHC<2wHJ$M|GtP0 zog3p!H?0r3Sv1$px<}mfncP&m-S}3!8C&mWZ;M;L6K?AExyiocrZcRVj)lc6j3}l# zs~F$q#kd=bX*yqw;$kt%OU1N|N^QKD<9CZOP84(hp3MFxHDw81(@F?>poC7(67~r{ zO$kcx64VctFdAIKP-qGJ+e>(SS}C<#7PDE@iF(l>UJ*@Vt7sP6M2pxiTE&~9UF;AY zVwc!0-W7Yr`=V3q6J6qf=oSY>k2oYkXO-g!ET=^*nO)8Y$Chv^e<_E0m*TT{8E2wa zaOP?8t5{gYjOA6Vs;r`TMHMmClCP{{&swpriuc5x4OKk!b2WWFD+y0sg}Q9D{CBUR zEOjGUXKKi5dx6lWUZgbaB@}VBC_WJxn^2q)i#DV9S}gwqmu|nzjA;!lTH45#WsO`F u^OiSqW8o{*e$hmSUmN#D(DXJ+#ejbsJ;6IU=+{GIOb=7zPSR^T&A$O@b4XGE literal 0 HcmV?d00001 diff --git a/graphics/gameover.pal b/graphics/gameover.pal new file mode 100644 index 00000000..32050439 --- /dev/null +++ b/graphics/gameover.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 255 172 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +255 230 0 +255 172 16 +246 115 0 +238 65 0 +230 0 0 +180 65 90 +0 0 90 diff --git a/graphics/gameover.png b/graphics/gameover.png new file mode 100644 index 0000000000000000000000000000000000000000..f82d6e33ec3775c9f105f6247b43f44d92a2f65d GIT binary patch literal 904 zcmV;319$w1P)S^xlA>6n150009M zNklMI$ITOk8DdLL+x$1D$xly za%w=mYa5*(^ zt~TcY6!hfWP)4AnYQVWV0bW{4ci`ZJ1Fs0cpVA9pvf~^rHPph=V3_(Uh*tpc&W`NH zgu9G-R62_axus+ia$Eg`wY-R0#0xajRRXxat&?})i1Rf83c9StJL;<>k|Z2LBuQLv ztZ4)ZJ9j5Zz*!eIl7Q20azO%4t22ru;ACG%5^(a0B;Z5{mLZavbM0J=WCTzHIW{4Z z)xeSA`Vb$ZTrxhqpz3GD$9SuF7ZolS^{BiaIsk3sZYUW+(*Yj1C7KdM9`+J|2au`~ z=++tM{&=n%*lY0K9A?OLLz^A#yTb&W2!wlE;;a$aQbwKW;Lr(xuMrPTK{HU=Y>(Ur z;3nX*M&MQj{hER9fbw$9>3IguSB{8$HkAQRj|e~rUZJu%v1SQxtJQtpecP4R#`&%x zEAjgaYOG_L;%WQZ3czP23BW9YJ?E+5Ks~ACv5LDz48oOfANuL_oB$-c$s@p51Dya> zQs^1@*hD+HqUh|^BtT;N13>HKE_aHJ>9r`r-*+uw`w|UYEc0?yx=)HvXRTO&e z>X#s)d*;4>q^+py_1o`U3?wD~#5OrypwJH~a8twIcPu#WPFdP9%^y|-uAe_dqg&qg zUXMG)?lt|!3vsU=#C|}~e365F7Tc@d)y{2CTDYN+J)28^cYx5(aV|8r`rO9}#C;wy zOB#ES1*PsyoMIFcW^@v{|3qCOhZtrpte8*~jtC8DWGxb3dy;6@M3M|fOd>fwNqa~- z1p?%n0?TkvKc%;*$CJ10H@=!y!cRHAB5WN+9qYWP9{_AxKYC1#`WVyH`8lu@d5ec+ z2Tu>j7juz7dJ6BrvkaKhmU06Fc`_*TDMvXM1E_K%wy;rsA-`YP(pr4KK#(field_0x4, gUnk_0811E4AC); + sub_0807D184(temp->field_0x2, gUnk_0811E4AC); +} + +void sub_0807CF68(u32 arg0) +{ + struct_0807D1C4 *temp; + char* str; + + temp = sub_0807D1C4(arg0); + str = gUnk_0811E4A4; + sub_0807D184(temp->field_0x4, str); + sub_0807D184(temp->field_0x2, str); +} \ No newline at end of file diff --git a/src/code_080808D8.c b/src/code_080808D8.c deleted file mode 100644 index e9b9f8f5..00000000 --- a/src/code_080808D8.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "global.h" -#include "entity.h" -#include "structures.h" -#include "functions.h" - -void sub_080808D8(void) { - gScreenTransition.transitionType = 0; -} - -void sub_080808E4(void) { - - if (sub_08052638(gScreenTransition.areaID)) { - gScreenTransition.transitionType = 0; - } else { - gScreenTransition.transitionType = 5; - } -} - -void sub_08080904(void) { - gScreenTransition.transitionType = 1; -} - -void sub_08080910(void) { - gScreenTransition.transitionType = 1; -} \ No newline at end of file diff --git a/src/code_0808091C.c b/src/code_0808091C.c index 1607ddf0..dcb86728 100644 --- a/src/code_0808091C.c +++ b/src/code_0808091C.c @@ -1,4 +1,7 @@ #include "global.h" +#include "entity.h" +#include "structures.h" +#include "functions.h" #include "room.h" extern void sub_0805E5A8(); @@ -6,16 +9,35 @@ extern void sub_0805E5A8(); extern RoomControls gRoomControls; extern u32 gUnk_0200B650; extern u32 gUnk_02025EB0; -extern u8 gScreenTransition[10]; -extern void DoExitTransition(Entity*); +extern void DoExitTransition(ScreenTransitionData*); extern void sub_080809D4(); -void sub_0808091C(Entity* param_1, u32 param_2) +void sub_080808D8(void) { + gScreenTransition.transitionType = 0; +} +void sub_080808E4(void) { + + if (sub_08052638(gScreenTransition.areaID)) { + gScreenTransition.transitionType = 0; + } else { + gScreenTransition.transitionType = 5; + } +} + +void sub_08080904(void) { + gScreenTransition.transitionType = 1; +} + +void sub_08080910(void) { + gScreenTransition.transitionType = 1; +} + +void sub_0808091C(ScreenTransitionData* param_1, u32 param_2) { DoExitTransition(param_1); - gScreenTransition[9] = param_2; + gScreenTransition.transitionType = param_2; return; } diff --git a/src/enemy/bombPeahat.c b/src/enemy/bombPeahat.c index da782b85..1dc3d30f 100644 --- a/src/enemy/bombPeahat.c +++ b/src/enemy/bombPeahat.c @@ -8,7 +8,6 @@ extern u32 GetNextFunction(Entity*); extern void sub_0802AD54(Entity*); extern void sub_0802B048(Entity*); extern void sub_0806F4E8(Entity*); -extern void sub_0806F3E4(Entity*); extern void (*const gUnk_080012C8[])(Entity*); extern void (*const gUnk_080CD0F0[])(Entity*); diff --git a/src/enemy/wisp.c b/src/enemy/wisp.c new file mode 100644 index 00000000..d6729201 --- /dev/null +++ b/src/enemy/wisp.c @@ -0,0 +1,149 @@ +#include "global.h" +#include "entity.h" +#include "enemy.h" +#include "structures.h" +#include "link.h" +#include "functions.h" + +extern void (*const gUnk_080CEB74[])(Entity*); +extern void (*const gUnk_080CEB8C[])(Entity*); +extern void (*const gUnk_080CEB98[])(Entity*); + +extern u8 gUnk_080CEBA4[]; + +void Wisp(Entity* this) { + EnemyFunctionHandler(this, gUnk_080CEB74); +} + +void sub_0803354C(Entity* this) { + gUnk_080CEB8C[this->action](this); +} + +void sub_08033564(Entity* this) { + u32 bits; + Entity* ent; + + bits = this->bitfield; + if ((bits & 0x80) == 0) { + return; + } + + switch ((s32)bits & 0x3f) { + case 0: + this->action = 2; + this->spriteSettings.b.draw = FALSE; + this->flags &= 0x7f; + this->field_0x7c.HALF.LO = 0x27c; + gLinkState.flags.all |= 0x4000; + gUnk_02002A40.stats.filler2[4] = this->entityType.form + 1; + gUnk_02002A40.stats.field_0x20 = 600; + if (this->entityType.form == 0) { + break; + } + DeleteThisEntity(); + break; + case 0xe: + case 0x15: + this->currentHealth = 0; + break; + case 0x14: + this->flags &= 0x7f; + this->hurtBlinkTime = 0; + this->spriteSettings.b.draw = FALSE; + ent = CreateFx(this, 2, 0); + if (ent != NULL) { + this->attachedEntity = ent; + this->actionDelay = 0xe; + CopyPosition(this, ent); + } + DeleteThisEntity(); + break; + } +} + +void sub_0803362C(Entity* this) { + if (sub_0806F520() != 0) { + gUnk_080CEB98[this->previousActionFlag](this); + } +} + +void sub_08033650(Entity* this) { + this->previousActionFlag = 2; +} + +void sub_08033658(Entity* this) { + sub_0806F4E8(); +} + +void sub_08033660(Entity* this) { + if (sub_0806F3E4(this)) { + sub_0804A7D4(this); + } +} + +void sub_08033674(Entity* this) { + sub_0804A720(this); + this->actionDelay = 0; + this->action = 1; + this->filler[0] = 1; + this->field_0x80.HWORD = this->x.HALF.HI; + this->field_0x82.HWORD = this->y.HALF.HI; + sub_08033744(this); + InitializeAnimation(this, this->entityType.parameter); +} + +void sub_080336A8(Entity* this) { + if (--this->actionDelay == 0) { + sub_08033744(this); + } else if (this->collisions != 0) { + sub_0800417E(this, this->collisions); + } + sub_080AEF88(this); + GetNextFrame(this); +} + +void sub_080336DC(Entity* this) { + switch ((u16)-- this->field_0x7c.HALF.LO) { + case 0x24: + this->x.HALF.HI = this->field_0x80.HWORD; + this->y.HALF.HI = this->field_0x82.HWORD; + break; + case 0x18: + sub_080A29BC(this); + break; + case 0xc: + this->spriteSettings.b.draw = TRUE; + break; + case 0x0: + this->action = 1; + this->flags |= 0x80; + sub_08033744(this); + break; + } +} + +void sub_08033744(Entity* this) { + u32 temp; + u32 rand = (u32)Random() % 256; + + // 8 potential options + this->actionDelay = gUnk_080CEBA4[(rand & 0x70) >> 4]; + + // 4 potential options + temp = ((rand & 0xc) * 2); + + // 75% chance to pass + if ((sub_08049FA0(this) == 0) && ((rand % 4) != 0)) { + temp = sub_08049EE4(this); + + // 50% chance to pass + if ((rand & 0x80) != 0) { + temp += 0x4; + temp &= 0x18; + } else { + temp += 0x1c; + temp &= 0x18; + } + } + this->direction = temp; +} \ No newline at end of file diff --git a/src/npc/zeldaFollower.c b/src/npc/zeldaFollower.c new file mode 100644 index 00000000..3dec4d10 --- /dev/null +++ b/src/npc/zeldaFollower.c @@ -0,0 +1,25 @@ +#include "global.h" +#include "entity.h" +#include "functions.h" + +extern void sub_08068318(Entity*); +extern void sub_0806854C(Entity*, u32); + +void ZeldaFollower(Entity *this) +{ + if (this->action == 0) { + this->action++; + this->spriteSettings.b.draw = TRUE; + this->animationState = 4; + this->field_0x68.HALF.LO = 0; + this->field_0x68.HALF.HI = 0; + sub_0805E3A0(this, 2); + InitAnimationForceUpdate(this, 0); + sub_0806854C(this, 0); + } + if ((s8)this->field_0x68.HALF.LO != 0) { + sub_08068318(this); + } else { + this->spriteSettings.b.draw = FALSE; + } +} \ No newline at end of file diff --git a/src/room.c b/src/room.c index 4246c675..7d9e46d4 100644 --- a/src/room.c +++ b/src/room.c @@ -665,7 +665,7 @@ void sub_0804BC70(void) { } } -extern u32 gUnk_0813AB80; +extern ScreenTransitionData gUnk_0813AB80; void sub_0804BCDC() { sub_0808091C(&gUnk_0813AB80, 4); diff --git a/src/sub_0807C998.c b/src/sub_0807C998.c index a1d16fdf..bc31e322 100644 --- a/src/sub_0807C998.c +++ b/src/sub_0807C998.c @@ -1,12 +1,29 @@ #include "global.h" +#include "entity.h" extern void sub_0807C960(); extern u32 gUnk_0202CEB4; extern u32 gUnk_02012654; +extern u8 gUnk_08324AE4; + +void sub_0807C960(void* dest, u32 offset) +{ + void* temp; + + if (offset != -1) { + temp = &gUnk_08324AE4 + (offset & 0x7fffffff); + if ((u32)dest >> 0x18 == 6) { + LZ77UnCompVram(temp, (void *)dest); + } + else { + LZ77UnCompWram(temp, (void *)dest); + } + } +} void sub_0807C998(u32* a1) { sub_0807C960(&gUnk_0202CEB4, a1[0]); sub_0807C960(&gUnk_0202CEB4 - 0x800, a1[1]); sub_0807C960(&gUnk_02012654, a1[2]); sub_0807C960(&gUnk_02012654 - 0x800, a1[3]); -} +} \ No newline at end of file diff --git a/tools/gbagfx/link.pal b/tools/gbagfx/link.pal new file mode 100644 index 00000000..f7ee0b1d --- /dev/null +++ b/tools/gbagfx/link.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +65 180 139 +222 41 41 +123 16 41 +16 123 41 +65 164 41 +16 255 8 +49 82 255 +189 255 164 +222 172 82 +255 255 0 +115 65 32 +164 123 65 +213 180 139 +255 230 189 +255 255 255 +0 0 0 diff --git a/minishmaker-license.txt b/tools/minishmaker-license.txt similarity index 100% rename from minishmaker-license.txt rename to tools/minishmaker-license.txt From b235f9ae3e291a0fcf330440241700730262bfd6 Mon Sep 17 00:00:00 2001 From: notyouraveragehooman <65437533+notyouraveragehooman@users.noreply.github.com> Date: Wed, 5 Aug 2020 21:01:23 -0700 Subject: [PATCH 6/6] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f8ea57d6..04250606 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # The Legend of Zelda: The Minish Cap -**Progress:** [⬛⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜] 5% +**Progress:** [⬛⬛⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜] 10% ```diff - WARNING! -