diff --git a/asm/credits.s b/asm/credits.s deleted file mode 100644 index b95d3dcd0..000000000 --- a/asm/credits.s +++ /dev/null @@ -1,274 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start DrawCredits -DrawCredits: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x84 - mov r8, r0 - adds r5, r1, 0 - ldr r4, _080354C0 - movs r0, 0x6C - movs r1, 0x8 - bl MemoryAlloc - str r0, [r4] - movs r1, 0 - str r1, [r0, 0x60] - str r5, [r0, 0x64] - mov r1, r8 - str r1, [r0, 0x68] - ldr r2, _080354C4 - mov r12, r2 - mov r9, r4 - movs r3, 0 - movs r2, 0x3 -_08035472: - ldr r1, [r4] - adds r1, r3 - mov r0, r12 - ldm r0!, {r5-r7} - stm r1!, {r5-r7} - ldm r0!, {r5-r7} - stm r1!, {r5-r7} - adds r3, 0x18 - subs r2, 0x1 - cmp r2, 0 - bge _08035472 - mov r0, r9 - ldr r1, [r0] - ldr r0, _080354C8 - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldm r0!, {r5-r7} - stm r1!, {r5-r7} - bl ResetUnusedInputStruct - mov r1, r9 - ldr r0, [r1] - movs r1, 0x1 - movs r2, 0x1 - bl sub_800641C - movs r0, 0x2 - bl sub_8099690 - movs r0, 0 - bl sub_80073B8 - mov r2, r8 - lsls r0, r2, 2 - ldr r1, _080354CC - adds r0, r1 - ldr r1, [r0] - movs r5, 0 - b _08035542 - .align 2, 0 -_080354C0: .4byte gUnknown_203B340 -_080354C4: .4byte gUnknown_80E4A10 -_080354C8: .4byte gUnknown_80E4A28 -_080354CC: .4byte gCreditsTable -_080354D0: - ldr r2, [r1, 0x8] - movs r3, 0x4 - ldrsh r0, [r1, r3] - cmp r0, 0 - blt _080354DE - adds r5, r0, 0 - b _080354E4 -_080354DE: - movs r6, 0x4 - ldrsh r0, [r1, r6] - subs r5, r0 -_080354E4: - movs r7, 0x2 - ldrsh r6, [r1, r7] - movs r3, 0 - ldrsh r0, [r1, r3] - cmp r0, 0x1 - beq _080354FA - cmp r0, 0x2 - beq _08035514 - adds r4, r1, 0 - adds r4, 0xC - b _08035532 -_080354FA: - add r3, sp, 0x4 - ldrb r0, [r2] - adds r4, r1, 0 - adds r4, 0xC - cmp r0, 0 - beq _0803552C -_08035506: - strb r0, [r3] - adds r2, 0x1 - adds r3, 0x1 - ldrb r0, [r2] - cmp r0, 0 - bne _08035506 - b _0803552C -_08035514: - add r3, sp, 0x4 - ldrb r0, [r2] - adds r4, r1, 0 - adds r4, 0xC - cmp r0, 0 - beq _0803552C -_08035520: - strb r0, [r3] - adds r2, 0x1 - adds r3, 0x1 - ldrb r0, [r2] - cmp r0, 0 - bne _08035520 -_0803552C: - movs r0, 0 - strb r0, [r3] - add r2, sp, 0x4 -_08035532: - movs r0, 0 - str r0, [sp] - adds r0, r6, 0 - adds r1, r5, 0 - movs r3, 0 - bl xxx_call_draw_string - adds r1, r4, 0 -_08035542: - ldr r0, [r1, 0x8] - cmp r0, 0 - bne _080354D0 - movs r0, 0 - bl sub_80073E0 - movs r0, 0 - bl SelectCharmap - ldr r2, _08035570 - movs r0, 0x9 - movs r1, 0 - ldr r2, [r2] - bl sub_8099AFC - movs r0, 0x1 - add sp, 0x84 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08035570: .4byte gUnknown_80E4A40 - thumb_func_end DrawCredits - - thumb_func_start sub_8035574 -sub_8035574: - push {r4,lr} - ldr r1, _0803558C - ldr r0, [r1] - ldr r0, [r0, 0x60] - adds r4, r1, 0 - cmp r0, 0x4 - bhi _08035654 - lsls r0, 2 - ldr r1, _08035590 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0803558C: .4byte gUnknown_203B340 -_08035590: .4byte _08035594 - .align 2, 0 -_08035594: - .4byte _080355A8 - .4byte _080355D0 - .4byte _080355E8 - .4byte _08035610 - .4byte _08035638 -_080355A8: - bl sub_8099B94 - lsls r0, 24 - cmp r0, 0 - bne _08035654 - ldr r0, _080355C8 - ldr r1, [r0] - movs r0, 0x1 - str r0, [r1, 0x60] - ldr r2, _080355CC - movs r0, 0x9 - movs r1, 0x1E - ldr r2, [r2] - bl sub_8099A5C - b _08035654 - .align 2, 0 -_080355C8: .4byte gUnknown_203B340 -_080355CC: .4byte gUnknown_80E4A40 -_080355D0: - bl sub_8099B94 - lsls r0, 24 - cmp r0, 0 - bne _08035654 - ldr r0, _080355E4 - ldr r1, [r0] - movs r0, 0x2 - str r0, [r1, 0x60] - b _08035654 - .align 2, 0 -_080355E4: .4byte gUnknown_203B340 -_080355E8: - ldr r1, [r4] - ldr r0, [r1, 0x64] - cmp r0, 0 - bgt _08035600 - movs r0, 0x3 - str r0, [r1, 0x60] - ldr r2, _0803560C - movs r0, 0x9 - movs r1, 0x1E - ldr r2, [r2] - bl sub_8099AFC -_08035600: - ldr r1, [r4] - ldr r0, [r1, 0x64] - subs r0, 0x1 - str r0, [r1, 0x64] - b _08035654 - .align 2, 0 -_0803560C: .4byte gUnknown_80E4A40 -_08035610: - bl sub_8099B94 - lsls r0, 24 - cmp r0, 0 - bne _08035654 - bl ResetUnusedInputStruct - movs r0, 0 - movs r1, 0x1 - movs r2, 0x1 - bl sub_800641C - ldr r0, _08035634 - ldr r1, [r0] - movs r0, 0x4 - str r0, [r1, 0x60] - b _08035654 - .align 2, 0 -_08035634: .4byte gUnknown_203B340 -_08035638: - movs r0, 0 - bl sub_8099690 - ldr r2, _08035650 - movs r0, 0x1 - movs r1, 0 - ldr r2, [r2] - bl sub_8099A5C - movs r0, 0x3 - b _08035656 - .align 2, 0 -_08035650: .4byte gUnknown_80E4A40 -_08035654: - movs r0, 0 -_08035656: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_8035574 - - .align 2,0 diff --git a/include/input.h b/include/input.h index c66080997..78fa7ff24 100644 --- a/include/input.h +++ b/include/input.h @@ -1,6 +1,7 @@ #ifndef GUARD_INPUT_H #define GUARD_INPUT_H +// size: 0x10 struct Inputs { /* 0x0 */ u16 held; @@ -8,46 +9,47 @@ struct Inputs /* 0x4 */ u16 repeated; /* 0x6 */ u16 shortPress; /* 0x8 */ u16 heldDpad; - /* 0xA..0xB - padding */ /* 0xC */ s32 repeatTimerDpad; }; extern struct Inputs gRealInputs; +// size: 0x8 struct InputTimers { /* 0x0 */ s16 holdTimerB; /* 0x2 */ s16 holdTimerR; - /* 0x4 */ u16 unk4; - /* 0x6 */ u16 unk6; + u16 unk4; + u16 unk6; }; +// size: 0x2C struct UnusedInputStruct { - /* 0x0 */ u16 unk0; - /* 0x2 */ u16 unk2; - /* 0x4 */ u16 unk4; - /* 0x6 */ u16 unk6; - /* 0x8 */ u16 unk8; - /* 0xA */ u16 unkA; - /* 0xC */ u16 unkC; - /* 0xE */ u16 unkE; - /* 0x10 */ u16 unk10; - /* 0x12 */ u16 unk12; - /* 0x14 */ u16 unk14; - /* 0x16 */ u16 unk16; - /* 0x18 */ u16 unk18; - /* 0x1A */ u16 unk1A; - /* 0x1C */ u16 unk1C; - /* 0x1E */ u16 unk1E; - /* 0x20 */ u32 unk20; - /* 0x24 */ u16 unk24; - /* 0x24 */ u16 unk26; - /* 0x28 */ u8 unk28; - /* 0x29 */ u8 unk29; - /* 0x2A..0x2B - padding */ + u16 unk0; + u16 unk2; + u16 unk4; + u16 unk6; + u16 unk8; + u16 unkA; + u16 unkC; + u16 unkE; + u16 unk10; + u16 unk12; + u16 unk14; + u16 unk16; + u16 unk18; + u16 unk1A; + u16 unk1C; + u16 unk1E; + u32 unk20; + u16 unk24; + u16 unk26; + u8 unk28; + u8 unk29; }; +// size: 0xC struct MenuInputStructSub { u8 unk0; @@ -60,27 +62,28 @@ struct MenuInputStructSub s16 unkA; }; +// size: 0x2C struct MenuInputStruct { s32 unk0; - /* 0x4 */ u16 unk4; - /* 0x6 */ s16 unk6; - /* 0x8 */ u16 unk8; - /* 0x8 */ u16 unkA; - /* 0xC */ u16 unkC; - /* 0xE */ u16 unkE; - /* 0x10 */ u32 unk10; - /* 0x14 */ s16 unk14; - /* 0x16 */ u16 unk16; + u16 unk4; + s16 unk6; + u16 unk8; + u16 unkA; + u16 unkC; + u16 unkE; + u32 unk10; + s16 unk14; + u16 unk16; /* 0x18 */ s16 menuIndex; - /* 0x1A */ s16 unk1A; - /* 0x1C */ s16 unk1C; - /* 0x1E */ s16 unk1E; - /* 0x20 */ s16 unk20; - /* 0x22 */ s16 unk22; - /* 0x24 */ u16 unk24; - u16 unk26; - /* 0x28 */ struct MenuInputStructSub unk28; + s16 unk1A; + s16 unk1C; + s16 unk1E; + s16 unk20; + s16 unk22; + u16 unk24; + u16 unk26; + struct MenuInputStructSub unk28; }; diff --git a/include/memory.h b/include/memory.h index 618b962d3..30969cc6e 100644 --- a/include/memory.h +++ b/include/memory.h @@ -3,18 +3,22 @@ #define HEAP_SIZE 0x24000 +// size: 0x8 struct HeapSettings { /* 0x0 */ u8 *start; /* 0x4 */ u32 size; }; -struct HeapMemoryBlock { +// size: 0xC +struct HeapMemoryBlock +{ /* 0x0 */ u8 *start; /* 0x4 */ s32 size; /* 0x8 */ s32 allocatedSize; }; +// size: 0x10 struct HeapFreeListElement { /* 0x0 */ u32 unk_atb; @@ -23,6 +27,7 @@ struct HeapFreeListElement /* 0xC */ struct HeapMemoryBlock block; }; +// size: 0x1C struct HeapDescriptor { u32 unk0; diff --git a/include/text.h b/include/text.h index cfc371330..99b122e6f 100644 --- a/include/text.h +++ b/include/text.h @@ -38,6 +38,7 @@ struct UnkTextStruct2 }; void LoadCharmaps(void); +void SelectCharmap(u32); u32 xxx_update_some_bg_tiles(u32 a0); void sub_8006438(const struct UnkTextStruct2 *a0, u8 a1, u8 a2, u32 *a3); void sub_8006554(void *a0, void *a1, void *a2, void *a3, u32 a4, const struct UnkTextStruct2 *a5, u8 a6, u32 a7, u32 *a8, u32 a9); diff --git a/ld_script.txt b/ld_script.txt index c588775c7..8b7fc615a 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -152,7 +152,6 @@ SECTIONS { src/code_8031D70.o(.text); src/adventure_log.o(.text); src/friend_rescue.o(.text); - asm/credits.o(.text); src/credits.o(.text); src/main_menu.o(.text); src/trade_items_menu.o(.text); diff --git a/src/credits.c b/src/credits.c index 1e0a8aed3..b256fc638 100644 --- a/src/credits.c +++ b/src/credits.c @@ -1,39 +1,184 @@ #include "global.h" #include "input.h" #include "memory.h" +#include "text.h" -struct unkStruct_203B344 +// size: 0x6C +struct unkCreditsStruct_203B340 { - u32 state; // state variable - u32 unk4; // timer?? + struct UnkTextStruct2 unk0[4]; + s32 unk60; // Unsure if s32/u32/ptr + s32 unk64; + /* 0x68 */ s32 creditsCategoryIndex; }; -struct unkStruct_203B340 +// size: 0x8 +struct unkCreditsStruct_203B344 { - // size: 0x84 - u32 unk0; + /* 0x0 */ u32 state; // state variable + u32 unk4; // timer? }; +// size: 0xC +struct CreditsData +{ + /* 0x0 */ s16 type; + s16 x; + s16 y; + /* 0x8 */ u8 *text; +}; + +extern struct unkCreditsStruct_203B340 *gUnknown_203B340; +extern struct unkCreditsStruct_203B344 *gUnknown_203B344; + +extern struct UnkTextStruct2 gUnknown_80E4A10; +extern struct UnkTextStruct2 gUnknown_80E4A28; +extern const u32 gUnknown_80E4A40[]; +extern struct CreditsData* gCreditsTable[27]; +extern u16 gUnknown_80E5990[]; + +extern void xxx_call_draw_string(s32, u32, const u8 *, u32, u32); + extern void sub_80015C0(u32, u32); - -extern u16 gUnknown_80E5990[]; -extern struct unkStruct_203B344 *gUnknown_203B344; -extern struct unkStruct_203B340 *gUnknown_203B340; extern s32 sub_8001658(u32, u32); +extern void sub_80073B8(u32); +extern void sub_80073E0(u32); +extern void sub_8099690(u32); +extern void sub_8099A5C(u32, u32, u32); +extern void sub_8099AFC(u32, u32, u32); +extern u8 sub_8099B94(); +// Unsure if param_2 is a s32/u32/ptr +s32 DrawCredits(s32 creditsCategoryIndex, s32 param_2) +{ + s32 i; + s32 x; + s32 y; + struct CreditsData *cred; + u8 *srcText; + u8 *destText1; + u8 *destText2; + u8 curChar; + u8 buffer[128]; + + gUnknown_203B340 = (struct unkCreditsStruct_203B340 *)MemoryAlloc(sizeof(struct unkCreditsStruct_203B340), 8); + gUnknown_203B340->unk60 = 0; + gUnknown_203B340->unk64 = param_2; + gUnknown_203B340->creditsCategoryIndex = creditsCategoryIndex; + + for (i = 0; i < 4; i++) + gUnknown_203B340->unk0[i] = gUnknown_80E4A10; + gUnknown_203B340->unk0[0] = gUnknown_80E4A28; + + ResetUnusedInputStruct(); + sub_800641C(&gUnknown_203B340->unk0[0], 1, 1); + sub_8099690(2); + sub_80073B8(0); + + cred = creditsCategoryIndex[gCreditsTable]; // WTF + y = 0; + while (cred->text != NULL) { + srcText = cred->text; + if (cred->y >= 0) + y = cred->y; + else + y -= cred->y; + x = cred->x; + + switch (cred->type) { + case 1: + destText1 = buffer; + while ((curChar = *srcText) != 0) { + *destText1 = curChar; + srcText++; + destText1++; + } + *destText1 = 0; + srcText = buffer; + break; + case 2: + destText2 = buffer; + while ((curChar = *srcText) != 0) { + *destText2 = curChar; + srcText++; + destText2++; + } + *destText2 = 0; + srcText = buffer; + break; + } + + xxx_call_draw_string(x, y, srcText, 0, 0); + cred++; + } + + sub_80073E0(0); + SelectCharmap(0); + do { + const u32 *a = gUnknown_80E4A40; + int b = 9; + unsigned long long c = b; + sub_8099AFC(c, 0, a[0]); + } while(0); + return 1; +} + +s32 sub_8035574(void) +{ + #ifdef NONMATCHING + u32 const *p; + #else + register u32 const *p asm("r2"); + #endif + + switch (gUnknown_203B340->unk60) { + case 0: + if (sub_8099B94() == 0) { + gUnknown_203B340->unk60 = 1; + p = gUnknown_80E4A40; + sub_8099A5C(9, 30, p[0]); // Probably same/similar macro from the above func - Kermalis + } + break; + case 1: + if (sub_8099B94() == 0) + gUnknown_203B340->unk60 = 2; + break; + case 2: + if (gUnknown_203B340->unk64 < 1) { + gUnknown_203B340->unk60 = 3; + p = gUnknown_80E4A40; + sub_8099AFC(9, 30, p[0]); + } + gUnknown_203B340->unk64--; + break; + case 3: + if (sub_8099B94() == 0) { + ResetUnusedInputStruct(); + sub_800641C(NULL, 1, 1); + gUnknown_203B340->unk60 = 4; + } + break; + case 4: + sub_8099690(0); + p = gUnknown_80E4A40; + sub_8099A5C(1, 0, p[0]); + return 3; + } + return 0; +} + +// Frees gUnknown_203B340 void sub_803565C(void) { - if(gUnknown_203B340 != NULL) - { + if (gUnknown_203B340 != NULL) { MemoryFree(gUnknown_203B340); gUnknown_203B340 = NULL; } } - u32 sub_8035678(void) { - gUnknown_203B344 = MemoryAlloc(sizeof(struct unkStruct_203B344), 8); + gUnknown_203B344 = MemoryAlloc(sizeof(struct unkCreditsStruct_203B344), 8); gUnknown_203B344->state = 0; gUnknown_203B344->unk4 = 0; sub_80015C0(0, 0x39); @@ -48,7 +193,7 @@ u32 sub_80356A0(void) held_input = gRealInputs.held; uVar1 = gUnknown_80E5990[gUnknown_203B344->unk4]; - switch(gUnknown_203B344->state) { + switch (gUnknown_203B344->state) { case 0: gUnknown_203B344->state = 3; break; @@ -86,20 +231,19 @@ u32 sub_80356A0(void) return 3; // sub_809C478 clears the flash data when this is returned } - if (sub_8001658(0,0x39) != 0) { + if (sub_8001658(0, 0x39) != 0) { gUnknown_203B344->state = 3; return 2; } - else { + else return 0; - } } +// Frees gUnknown_203B344 void sub_8035758(void) { - if(gUnknown_203B344 != NULL) - { + if (gUnknown_203B344 != NULL) { MemoryFree(gUnknown_203B344); gUnknown_203B344 = NULL; } -} +} \ No newline at end of file diff --git a/src/wonder_mail.c b/src/wonder_mail.c index c69a5fbd0..b8557c8c5 100644 --- a/src/wonder_mail.c +++ b/src/wonder_mail.c @@ -60,9 +60,6 @@ extern u32 sub_8031DCC(); extern void sub_8031E10(); extern void sub_8031E00(); extern s32 sub_8001658(u32, u32); -extern u8 sub_8099B94(); -extern void sub_8099A5C(u32, u32, u32*); -extern void sub_8099AFC(u32, u32, u32*); extern void sub_8099690(u32); extern void sub_8031E10(void); extern void sub_803084C(void);