From 407670a45ed0906f8ea54bde922949fd2c1928b4 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 21 Apr 2025 20:28:45 -0400 Subject: [PATCH] through ov101_021F0E0C --- asm/pokegear_app_phone.s | 158 ------------------ .../pokegear/phone/phone_internal.h | 77 +++++---- .../pokegear/phone/overlay_101_021F0880.c | 54 +++++- .../pokegear/phone/pokegear_phone.c | 6 +- 4 files changed, 99 insertions(+), 196 deletions(-) diff --git a/asm/pokegear_app_phone.s b/asm/pokegear_app_phone.s index 1c5caff4f..50b41fc15 100644 --- a/asm/pokegear_app_phone.s +++ b/asm/pokegear_app_phone.s @@ -25,164 +25,6 @@ .extern ov101_021F09B0 .extern ov101_021F0ACC - thumb_func_start ov101_021F0D90 -ov101_021F0D90: ; 0x021F0D90 - push {r3, r4, r5, lr} - add r4, r0, #0 - add r1, r4, #0 - add r1, #0xd8 - ldr r1, [r1] - mov r0, #0 - ldrb r2, [r1, #1] - add r1, r4, #0 - add r1, #0xd0 - ldr r1, [r1] - add r0, r0, #1 - strb r2, [r1] - add r1, r4, #0 - add r1, #0xd8 - ldr r2, [r1] - lsl r0, r0, #0x18 - ldr r1, [r2, #8] - lsr r0, r0, #0x18 - cmp r1, r2 - beq _021F0DD6 -_021F0DB8: - add r3, r4, #0 - add r3, #0xd0 - ldrb r5, [r1, #1] - add r2, r0, #0 - ldr r3, [r3] - add r0, r0, #1 - strb r5, [r3, r2] - add r2, r4, #0 - add r2, #0xd8 - lsl r0, r0, #0x18 - ldr r1, [r1, #8] - ldr r2, [r2] - lsr r0, r0, #0x18 - cmp r1, r2 - bne _021F0DB8 -_021F0DD6: - add r2, r4, #0 - ldr r0, [r4, #0xc] - add r1, r4, #0 - add r2, #0xcd - add r1, #0xd0 - ldrb r2, [r2] - ldr r0, [r0, #0x28] - ldr r1, [r1] - bl GSPlayerMisc_SetPhonebookFromBuffer - add r2, r4, #0 - add r2, #0xcd - add r0, r4, #0 - ldrb r3, [r2] - add r0, #0xd4 - mov r2, #0xc - ldr r0, [r0] - mov r1, #0 - mul r2, r3 - bl MI_CpuFill8 - add r4, #0xd4 - ldr r0, [r4] - bl FreeToHeap - pop {r3, r4, r5, pc} - .balign 4, 0 - thumb_func_end ov101_021F0D90 - - thumb_func_start ov101_021F0E0C -ov101_021F0E0C: ; 0x021F0E0C - push {r3, r4, r5, r6} - ldr r5, [r1, #8] - ldr r4, [r1, #4] - mov r3, #0 - str r5, [r4, #8] - ldr r5, [r1, #4] - ldr r4, [r1, #8] - str r5, [r4, #4] - add r4, r0, #0 - add r4, #0xd8 - ldr r4, [r4] - cmp r1, r4 - bne _021F0E2E - add r4, r0, #0 - ldr r5, [r1, #8] - add r4, #0xd8 - str r5, [r4] -_021F0E2E: - add r4, r0, #0 - add r4, #0xdc - ldr r4, [r4] - cmp r1, r4 - bne _021F0E40 - add r4, r0, #0 - ldr r5, [r1, #4] - add r4, #0xdc - str r5, [r4] -_021F0E40: - add r4, r0, #0 - add r4, #0xcd - ldrb r4, [r4] - sub r4, r4, #1 - cmp r2, r4 - bne _021F0E76 - add r2, r0, #0 - add r2, #0xdc - ldr r2, [r2] - str r2, [r1, #4] - add r2, r0, #0 - add r2, #0xdc - ldr r2, [r2] - ldr r2, [r2, #8] - str r2, [r1, #8] - add r2, r0, #0 - add r2, #0xdc - ldr r2, [r2] - str r1, [r2, #8] - add r2, r0, #0 - add r2, #0xd8 - ldr r2, [r2] - add r0, #0xdc - str r1, [r2, #4] - str r1, [r0] - pop {r3, r4, r5, r6} - bx lr -_021F0E76: - add r4, r0, #0 - add r4, #0xd8 - ldr r6, [r4] - add r4, r6, #0 -_021F0E7E: - add r5, r3, #0 - add r3, r3, #1 - cmp r5, r2 - beq _021F0E8A - ldr r4, [r4, #8] - b _021F0EA6 -_021F0E8A: - str r4, [r1, #8] - ldr r2, [r4, #4] - str r2, [r1, #4] - str r1, [r2, #8] - add r2, r0, #0 - str r1, [r4, #4] - add r2, #0xd8 - ldr r2, [r2] - cmp r4, r2 - bne _021F0EAA - add r0, #0xd8 - str r1, [r0] - pop {r3, r4, r5, r6} - bx lr -_021F0EA6: - cmp r4, r6 - bne _021F0E7E -_021F0EAA: - pop {r3, r4, r5, r6} - bx lr - .balign 4, 0 - thumb_func_end ov101_021F0E0C - thumb_func_start ov101_021F0EB0 ov101_021F0EB0: ; 0x021F0EB0 push {r3, r4, r5, r6, r7, lr} diff --git a/include/application/pokegear/phone/phone_internal.h b/include/application/pokegear/phone/phone_internal.h index d84781c4e..1d09506b5 100644 --- a/include/application/pokegear/phone/phone_internal.h +++ b/include/application/pokegear/phone/phone_internal.h @@ -17,9 +17,17 @@ typedef struct UnkStruct_ov101_021F8404 { typedef struct PokegearPhoneAppData PokegearPhoneAppData; +typedef struct PokegearPhoneApp_Sub0D8 PokegearPhoneApp_Sub0D8; +struct PokegearPhoneApp_Sub0D8 { + u8 unk_00; + PhoneContact contact; + PokegearPhoneApp_Sub0D8 *prev; + PokegearPhoneApp_Sub0D8 *next; +}; + typedef struct PokegearPhoneApp_Sub0E0_Sub00C { u8 filler_0[4]; - int unk_4; + PokegearPhoneApp_Sub0D8 *unk_4; u8 unk_8; } PokegearPhoneApp_Sub0E0_Sub00C; @@ -67,38 +75,39 @@ typedef struct PokegearPhoneApp_Sub0C4 { } PokegearPhoneApp_Sub0C4; struct PokegearPhoneAppData { - HeapID heapId; // 0x000 - int unk_004; // 0x004 - int unk_008; // 0x008 - PokegearAppData *pokegear; // 0x00C - u8 unk_010; // 0x010 - u8 unk_011; // 0x011 - u8 filler_012[2]; // 0x012 - MsgData *unk_014; // 0x014 - MessageFormat *unk_018; // 0x018 - String *unk_01C; // 0x01C - String *unk_020; // 0x020 - String *unk_024[8]; // 0x024 - u8 unk_044; // 0x044 - Window unk_048[4]; // 0x048 - Sprite *unk_088[14]; // 0x088 - TouchscreenListMenuSpawner *unk_0C0; // 0x0C0 - PokegearPhoneApp_Sub0C4 *unk_0C4; // 0x0C4 type pending - u8 unk_0C8; // 0x0C8 - u8 unk_0C9; // 0x0C9 - u8 unk_0CA; // 0x0CA - u8 unk_0CB; // 0x0CB - u8 unk_0CC; // 0x0CC - u8 unk_0CD; // 0x0CD - u8 filler_0CE[2]; // 0x0CE - PhoneContact *unk_0D0; // 0x0D0 - PokegearPhoneApp_Sub0D4 *unk_0D4; // 0x0D4 - u8 filler_0D8[0x8]; // 0x0D4 - PokegearPhoneApp_Sub0E0 unk_0E0; // 0x0E0 - LISTMENUITEM *unk_4E8[7]; // 0x4E8 - TouchscreenListMenu *unk_504; // 0x504 - void *unk_508; // 0x508 - NNSG2dScreenData *unk_50C; // 0x50C + HeapID heapId; // 0x000 + int unk_004; // 0x004 + int unk_008; // 0x008 + PokegearAppData *pokegear; // 0x00C + u8 unk_010; // 0x010 + u8 unk_011; // 0x011 + u8 filler_012[2]; // 0x012 + MsgData *unk_014; // 0x014 + MessageFormat *unk_018; // 0x018 + String *unk_01C; // 0x01C + String *unk_020; // 0x020 + String *unk_024[8]; // 0x024 + u8 unk_044; // 0x044 + Window unk_048[4]; // 0x048 + Sprite *unk_088[14]; // 0x088 + TouchscreenListMenuSpawner *unk_0C0; // 0x0C0 + PokegearPhoneApp_Sub0C4 *unk_0C4; // 0x0C4 type pending + u8 unk_0C8; // 0x0C8 + u8 unk_0C9; // 0x0C9 + u8 unk_0CA; // 0x0CA + u8 unk_0CB; // 0x0CB + u8 unk_0CC; // 0x0CC + u8 numContacts; // 0x0CD + u8 filler_0CE[2]; // 0x0CE + PhoneContact *saveContacts; // 0x0D0 + PokegearPhoneApp_Sub0D4 *unk_0D4; // 0x0D4 + PokegearPhoneApp_Sub0D8 *contactListHead; // 0x0D8 + PokegearPhoneApp_Sub0D8 *contactListTail; // 0x0DC + PokegearPhoneApp_Sub0E0 unk_0E0; // 0x0E0 + LISTMENUITEM *unk_4E8[7]; // 0x4E8 + TouchscreenListMenu *unk_504; // 0x504 + void *unk_508; // 0x508 + NNSG2dScreenData *unk_50C; // 0x50C }; // size: 0x510 BOOL ov101_021EFD20(PokegearPhoneAppData *phoneApp); @@ -144,7 +153,7 @@ int ov101_021F0C4C(PokegearPhoneAppData *phoneApp); BOOL ov101_021F0CE4(PokegearPhoneAppData *phoneApp); void ov101_021F0D6C(PokegearPhoneAppData *phoneApp); void ov101_021F0D90(PokegearPhoneAppData *phoneApp); -void ov101_021F0E0C(PokegearPhoneAppData *phoneApp, int a1, u8 a2); +void ov101_021F0E0C(PokegearPhoneAppData *phoneApp, PokegearPhoneApp_Sub0D8 *a1, u8 a2); void ov101_021F0EB0(PokegearPhoneAppData *phoneApp, u8 a1); void ov101_021F0F48(PokegearPhoneAppData *phoneApp); diff --git a/src/application/pokegear/phone/overlay_101_021F0880.c b/src/application/pokegear/phone/overlay_101_021F0880.c index dcfc5f372..05df03c48 100644 --- a/src/application/pokegear/phone/overlay_101_021F0880.c +++ b/src/application/pokegear/phone/overlay_101_021F0880.c @@ -213,6 +213,58 @@ BOOL ov101_021F0CE4(PokegearPhoneAppData *phoneApp) { } void ov101_021F0D6C(PokegearPhoneAppData *phoneApp) { - phoneApp->unk_0D4 = AllocFromHeap(phoneApp->heapId, phoneApp->unk_0CD * sizeof(PokegearPhoneApp_Sub0D4)); + phoneApp->unk_0D4 = AllocFromHeap(phoneApp->heapId, phoneApp->numContacts * sizeof(PokegearPhoneApp_Sub0D4)); ov101_021F1840(phoneApp); } + +void ov101_021F0D90(PokegearPhoneAppData *phoneApp) { + u8 i = 0; + PokegearPhoneApp_Sub0D8 *ptr; + + phoneApp->saveContacts[i++].id = phoneApp->contactListHead->contact.id; + ptr = phoneApp->contactListHead->next; + while (ptr != phoneApp->contactListHead) { + phoneApp->saveContacts[i++].id = ptr->contact.id; + ptr = ptr->next; + } + GSPlayerMisc_SetPhonebookFromBuffer(phoneApp->pokegear->savePokegear, phoneApp->saveContacts, phoneApp->numContacts); + MI_CpuClear8(phoneApp->unk_0D4, phoneApp->numContacts * sizeof(PokegearPhoneApp_Sub0D4)); + FreeToHeap(phoneApp->unk_0D4); +} + +void ov101_021F0E0C(PokegearPhoneAppData *phoneApp, PokegearPhoneApp_Sub0D8 *a1, u8 a2) { + int i = 0; + PokegearPhoneApp_Sub0D8 *r4; + + a1->prev->next = a1->next; + a1->next->prev = a1->prev; + if (a1 == phoneApp->contactListHead) { + phoneApp->contactListHead = a1->next; + } + if (a1 == phoneApp->contactListTail) { + phoneApp->contactListTail = a1->prev; + } + if (a2 == phoneApp->numContacts - 1) { + a1->prev = phoneApp->contactListTail; + a1->next = phoneApp->contactListTail->next; + phoneApp->contactListTail->next = a1; + phoneApp->contactListHead->prev = a1; + phoneApp->contactListTail = a1; + } else { + r4 = phoneApp->contactListHead; + do { + if (i++ != a2) { + r4 = r4->next; + } else { + a1->next = r4; + a1->prev = r4->prev; + a1->prev->next = a1; + r4->prev = a1; + if (r4 == phoneApp->contactListHead) { + phoneApp->contactListHead = a1; + } + return; + } + } while (r4 != phoneApp->contactListHead); + } +} diff --git a/src/application/pokegear/phone/pokegear_phone.c b/src/application/pokegear/phone/pokegear_phone.c index aa379857c..5166edac6 100644 --- a/src/application/pokegear/phone/pokegear_phone.c +++ b/src/application/pokegear/phone/pokegear_phone.c @@ -105,8 +105,8 @@ void ov101_021EF96C(PokegearPhoneAppData *phoneApp) { phoneApp->pokegear->childAppdata = phoneApp; phoneApp->pokegear->unk_05C = ov101_021F0944; phoneApp->unk_011 = sub_0202EE7C(phoneApp->pokegear->savePokegear); - phoneApp->unk_0D0 = GSPlayerMisc_AllocAndCopyPhonebook(phoneApp->pokegear->savePokegear, phoneApp->heapId); - phoneApp->unk_0CD = GSPlayerMisc_FindEmptyGearPhonebookSlot(phoneApp->pokegear->savePokegear); + phoneApp->saveContacts = GSPlayerMisc_AllocAndCopyPhonebook(phoneApp->pokegear->savePokegear, phoneApp->heapId); + phoneApp->numContacts = GSPlayerMisc_FindEmptyGearPhonebookSlot(phoneApp->pokegear->savePokegear); ov101_021F0D6C(phoneApp); if (phoneApp->pokegear->args->kind == 1) { phoneApp->unk_0CB = 1; @@ -124,7 +124,7 @@ void ov101_021EF96C(PokegearPhoneAppData *phoneApp) { void ov101_021EFA04(PokegearPhoneAppData *phoneApp) { ov101_021F0D90(phoneApp); - FreeToHeap(phoneApp->unk_0D0); + FreeToHeap(phoneApp->saveContacts); phoneApp->pokegear->unk_05C = NULL; phoneApp->pokegear->unk_060 = NULL; }