diff options
author | yenatch <yenatch@gmail.com> | 2017-05-21 15:40:42 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-21 15:40:42 -0400 |
commit | 9d4dfedb483ea13a16c309689877ed087c32b0e2 (patch) | |
tree | f6fa6e07ed80f01d41c78d9ac975cdfe94b70cf0 | |
parent | 8cbbd78f0032dd243555b3e2c0ecdf06e72d46d5 (diff) | |
parent | 67dd78ddc1989009efc68994fcdb11f688fc7092 (diff) |
Merge pull request #297 from marijnvdwerf/decompile/easy-chat-2
Decompile more of easy_chat
-rw-r--r-- | asm/easy_chat.s | 334 | ||||
-rw-r--r-- | include/asm.inc.h | 2 | ||||
-rw-r--r-- | src/easy_chat.c | 231 |
3 files changed, 229 insertions, 338 deletions
diff --git a/asm/easy_chat.s b/asm/easy_chat.s index 466d371a1..2983deea0 100644 --- a/asm/easy_chat.s +++ b/asm/easy_chat.s @@ -10831,338 +10831,4 @@ _080EB4AC: .4byte gEasyChatGroupWords _080EB4B0: .4byte 0x0000ffff thumb_func_end sub_80EB3FC - thumb_func_start ConvertEasyChatWordsToString -ConvertEasyChatWordsToString: @ 80EB4B4 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x4 - adds r4, r0, 0 - adds r5, r1, 0 - lsls r2, 16 - lsls r3, 16 - lsrs r3, 16 - mov r9, r3 - ldr r0, _080EB53C @ =0xffff0000 - adds r2, r0 - lsrs r7, r2, 16 - movs r0, 0 - cmp r0, r9 - bcs _080EB524 -_080EB4D6: - movs r6, 0 - adds r0, 0x1 - mov r8, r0 - cmp r6, r7 - bcs _080EB508 - ldr r2, _080EB540 @ =0x0000ffff -_080EB4E2: - ldrh r1, [r5] - adds r0, r4, 0 - str r2, [sp] - bl sub_80EB3FC - adds r4, r0, 0 - ldrh r0, [r5] - ldr r2, [sp] - cmp r0, r2 - beq _080EB4FC - movs r0, 0 - strb r0, [r4] - adds r4, 0x1 -_080EB4FC: - adds r5, 0x2 - adds r0, r6, 0x1 - lsls r0, 16 - lsrs r6, r0, 16 - cmp r6, r7 - bcc _080EB4E2 -_080EB508: - ldrh r1, [r5] - adds r5, 0x2 - adds r0, r4, 0 - bl sub_80EB3FC - adds r4, r0, 0 - movs r0, 0xFE - strb r0, [r4] - adds r4, 0x1 - mov r1, r8 - lsls r0, r1, 16 - lsrs r0, 16 - cmp r0, r9 - bcc _080EB4D6 -_080EB524: - subs r4, 0x1 - movs r0, 0xFF - strb r0, [r4] - adds r0, r4, 0 - add sp, 0x4 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080EB53C: .4byte 0xffff0000 -_080EB540: .4byte 0x0000ffff - thumb_func_end ConvertEasyChatWordsToString - - thumb_func_start sub_80EB544 -sub_80EB544: @ 80EB544 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - adds r4, r0, 0 - adds r5, r1, 0 - lsls r2, 16 - lsls r3, 16 - lsrs r3, 16 - mov r10, r3 - ldr r0, _080EB5B0 @ =0xffff0000 - adds r2, r0 - lsrs r2, 16 - mov r8, r2 - movs r7, 0 - cmp r7, r10 - bcs _080EB5C8 -_080EB56A: - movs r6, 0 - adds r1, r7, 0x1 - mov r9, r1 - cmp r6, r8 - bcs _080EB59C - ldr r2, _080EB5B4 @ =0x0000ffff -_080EB576: - ldrh r1, [r5] - adds r0, r4, 0 - str r2, [sp] - bl sub_80EB3FC - adds r4, r0, 0 - ldrh r0, [r5] - ldr r2, [sp] - cmp r0, r2 - beq _080EB590 - movs r0, 0 - strb r0, [r4] - adds r4, 0x1 -_080EB590: - adds r5, 0x2 - adds r0, r6, 0x1 - lsls r0, 16 - lsrs r6, r0, 16 - cmp r6, r8 - bcc _080EB576 -_080EB59C: - ldrh r1, [r5] - adds r5, 0x2 - adds r0, r4, 0 - bl sub_80EB3FC - adds r4, r0, 0 - cmp r7, 0 - bne _080EB5B8 - movs r0, 0xFE - b _080EB5BA - .align 2, 0 -_080EB5B0: .4byte 0xffff0000 -_080EB5B4: .4byte 0x0000ffff -_080EB5B8: - movs r0, 0xFA -_080EB5BA: - strb r0, [r4] - adds r4, 0x1 - mov r1, r9 - lsls r0, r1, 16 - lsrs r7, r0, 16 - cmp r7, r10 - bcc _080EB56A -_080EB5C8: - subs r4, 0x1 - movs r0, 0xFF - strb r0, [r4] - adds r0, r4, 0 - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80EB544 - - thumb_func_start unref_sub_80EB5E0 -unref_sub_80EB5E0: @ 80EB5E0 - push {lr} - lsls r1, r0, 16 - lsrs r3, r1, 16 - ldr r0, _080EB5F0 @ =0x0000ffff - cmp r3, r0 - bne _080EB5F4 - movs r0, 0 - b _080EB67C - .align 2, 0 -_080EB5F0: .4byte 0x0000ffff -_080EB5F4: - lsrs r1, 25 - ldr r2, _080EB608 @ =0x000001ff - ands r2, r3 - cmp r1, 0x13 - bgt _080EB60C - cmp r1, 0x12 - bge _080EB620 - cmp r1, 0 - beq _080EB610 - b _080EB630 - .align 2, 0 -_080EB608: .4byte 0x000001ff -_080EB60C: - cmp r1, 0x15 - bne _080EB630 -_080EB610: - movs r0, 0xB - adds r1, r2, 0 - muls r1, r0 - ldr r0, _080EB61C @ =gSpeciesNames - adds r1, r0 - b _080EB660 - .align 2, 0 -_080EB61C: .4byte gSpeciesNames -_080EB620: - movs r0, 0xD - adds r1, r2, 0 - muls r1, r0 - ldr r0, _080EB62C @ =gMoveNames - adds r1, r0 - b _080EB660 - .align 2, 0 -_080EB62C: .4byte gMoveNames -_080EB630: - ldr r0, _080EB664 @ =gEasyChatGroupWords - lsls r1, 2 - adds r1, r0 - ldr r1, [r1] - subs r0, r2, 0x1 - lsls r0, 16 - lsrs r2, r0, 16 - ldr r0, _080EB668 @ =0x0000ffff - cmp r2, r0 - beq _080EB660 - adds r3, r0, 0 -_080EB646: - ldrb r0, [r1] - adds r1, 0x1 - subs r2, 0x1 - cmp r0, 0xFF - beq _080EB658 -_080EB650: - ldrb r0, [r1] - adds r1, 0x1 - cmp r0, 0xFF - bne _080EB650 -_080EB658: - lsls r0, r2, 16 - lsrs r2, r0, 16 - cmp r2, r3 - bne _080EB646 -_080EB660: - movs r2, 0 - b _080EB674 - .align 2, 0 -_080EB664: .4byte gEasyChatGroupWords -_080EB668: .4byte 0x0000ffff -_080EB66C: - adds r1, 0x1 - adds r0, r2, 0x1 - lsls r0, 16 - lsrs r2, r0, 16 -_080EB674: - ldrb r0, [r1] - cmp r0, 0xFF - bne _080EB66C - adds r0, r2, 0 -_080EB67C: - pop {r1} - bx r1 - thumb_func_end unref_sub_80EB5E0 - - thumb_func_start sub_80EB680 -sub_80EB680: @ 80EB680 - movs r0, 0 - bx lr - thumb_func_end sub_80EB680 - - thumb_func_start unref_sub_80EB684 -unref_sub_80EB684: @ 80EB684 - push {r4,lr} - lsls r0, 24 - lsrs r0, 24 - adds r2, r0, 0 - lsls r1, 16 - lsrs r1, 16 - cmp r0, 0x7 - beq _080EB6B4 - cmp r0, 0x7 - bgt _080EB69E - cmp r0, 0x5 - beq _080EB6A4 - b _080EB6EE -_080EB69E: - cmp r2, 0x8 - beq _080EB6C4 - b _080EB6EE -_080EB6A4: - movs r2, 0x6 - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _080EB6B0 @ =gSaveBlock1 + 0x273C - b _080EB6CE - .align 2, 0 -_080EB6B0: .4byte gSaveBlock1 + 0x273C -_080EB6B4: - movs r2, 0x2 - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _080EB6C0 @ =gSaveBlock1 + 0x2754 - b _080EB6CE - .align 2, 0 -_080EB6C0: .4byte gSaveBlock1 + 0x2754 -_080EB6C4: - movs r2, 0x1 - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _080EB6F4 @ =gSaveBlock1 + 0x273A -_080EB6CE: - adds r1, r0, r1 - subs r0, r2, 0x1 - lsls r0, 16 - lsrs r2, r0, 16 - ldr r0, _080EB6F8 @ =0x0000ffff - cmp r2, r0 - beq _080EB6EE - adds r4, r0, 0 - adds r3, r0, 0 -_080EB6E0: - strh r4, [r1] - adds r1, 0x2 - subs r0, r2, 0x1 - lsls r0, 16 - lsrs r2, r0, 16 - cmp r2, r3 - bne _080EB6E0 -_080EB6EE: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080EB6F4: .4byte gSaveBlock1 + 0x273A -_080EB6F8: .4byte 0x0000ffff - thumb_func_end unref_sub_80EB684 - .align 2, 0 @ Don't pad with nop. diff --git a/include/asm.inc.h b/include/asm.inc.h index 72c43f4fd..3c1d52ffe 100644 --- a/include/asm.inc.h +++ b/include/asm.inc.h @@ -328,7 +328,7 @@ void sub_80C8F34(u8); // asm/easy_chat.o void InitEasyChatPhrases(void); u8* sub_80EB3FC(u8 *, u16); -u8 ConvertEasyChatWordsToString(u8 *dst, u16 *words, u16, u16); +u8 *ConvertEasyChatWordsToString(u8 *dst, u16 *words, u16, u16); // asm/pokenav.o void sub_80EBA5C(void); diff --git a/src/easy_chat.c b/src/easy_chat.c index ee1e37b9b..86719a2ae 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -5,27 +5,252 @@ #include "field_message_box.h" #include "pokedex.h" #include "rng.h" +#include "string_util.h" +#include "strings.h" #include "text.h" +u8 sub_80EB37C(u16); u8 sub_80EB8C0(void); u8 sub_80EB868(u8); u16 sub_80EAE88(u8); void sub_80EB890(u8); u16 sub_80EB784(u16 group); u8 sub_80EAD7C(u8 group); -u8 sub_80EB680(u16 *, u16, u16, u16); +static bool8 sub_80EB680(u16 *, u16, u16, u16); static u16 sub_80EB9D8(void); static u16 sub_80EB960(void); u16 sub_80EB72C(u16); +extern const u8 gSpeciesNames[][11]; +extern u8 gMoveNames[][13]; extern void *gEasyChatGroupWords[]; extern const u8 gEasyChatGroupSizes[]; extern u16 gSpecialVar_0x8004; +extern const u8 gOtherText_ThreeQuestions[]; + +#ifdef NONMATCHING +u8 *sub_80EB3FC(u8 *dst, u16 word) { + int group, wordIndex; + u8 *src; + u16 i; + + + if (sub_80EB37C(word)) + { + return StringCopy(dst, gOtherText_ThreeQuestions); + } + + if (word != 0xFFFF) + { + group = word >> 9; + wordIndex = word & 0x1FF; + switch (group) + { + case EC_GROUP_POKEMON: // 0 + case EC_GROUP_POKEMON_2: // 21 + dst = StringCopy(dst, gSpeciesNames[wordIndex]); + break; + + case EC_GROUP_MOVE_1: // 18 + case EC_GROUP_MOVE_2: // 19 + dst = StringCopy(dst, gMoveNames[wordIndex]); + break; + + default: + src = gEasyChatGroupWords[group]; + + i = wordIndex - 1; + while (i != 0xFFFF) + { + while (*src++ != EOS) + { + } + i--; + } + dst = StringCopy(dst, src); + break; + } + } + + dst[0] = EOS; + return dst; +} +#endif + +u8 *ConvertEasyChatWordsToString(u8 *dst, u16 *words, u16 arg2, u16 arg3) { + u16 i; + u16 n; + + const u16 i1 = arg2 - 1; + + for (i = 0; i < arg3; i++) + { + u16 word; + + for (n = 0; n < i1; n++) + { + dst = sub_80EB3FC(dst, words[0]); + + if (words[0] != 0xFFFF) + { + dst[0] = CHAR_SPACE; + dst++; + } + + words++; + } + + word = words[0]; + words++; + dst = sub_80EB3FC(dst, word); + + dst[0] = 0xFE; + dst++; + } + + dst--; + dst[0] = EOS; + + return dst; +} + +u8 *sub_80EB544(u8 *dst, u16 *words, u16 arg2, u16 arg3) { + u16 i; + u16 n; + + const u16 i1 = arg2 - 1; + + for (i = 0; i < arg3; i++) + { + u16 word; + + for (n = 0; n < i1; n++) + { + dst = sub_80EB3FC(dst, words[0]); + + if (words[0] != 0xFFFF) + { + dst[0] = CHAR_SPACE; + dst++; + } + + words++; + } + + word = words[0]; + words++; + dst = sub_80EB3FC(dst, word); + + // Only difference with ConvertEasyChatWordsToString + dst[0] = (i == 0) ? 0xFE : 0xFA; + dst++; + } + + dst--; + dst[0] = EOS; + + return dst; +} + + +u16 unref_sub_80EB5E0(u16 arg0) { + u8 *chars; + u16 i; + u16 strlen; + int group, word; + + + if (arg0 == 0xFFFF) + { + return 0; + } + + group = arg0 >> 9; + word = arg0 & 0x1FF; + switch (group) + { + case EC_GROUP_POKEMON: // 0 + case EC_GROUP_POKEMON_2: // 21 + chars = (u8 *) gSpeciesNames[word]; + break; + + case EC_GROUP_MOVE_1: // 18 + case EC_GROUP_MOVE_2: // 19 + chars = gMoveNames[word]; + break; + + default: + chars = gEasyChatGroupWords[group]; + + i = word - 1; + while (i != 0xFFFF) + { + while (*chars++ != EOS) + { + } + i--; + } + break; + } + + strlen = 0; + while (*chars != EOS) + { + chars++; + strlen += 1; + } + + return strlen; +} + +static bool8 sub_80EB680(u16 *arg0, u16 arg1, u16 arg2, u16 arg3) { + return FALSE; +} + +void unref_sub_80EB684(u8 arg0, u16 arg1) { + u16 *ptr; + u16 c; + + // FIXME: find actual tv shows used + switch (arg0) + { + case 5: + c = 6; + ptr = (u16*)((void *)&gSaveBlock1.tvShows.shows[arg1] + 0x04); + break; + case 7: + c = 2; + ptr = (u16*)((void *)&gSaveBlock1.tvShows.shows[arg1] + 0x1C); + break; + case 8: + c = 1; + ptr = (u16*)((void *)&gSaveBlock1.tvShows.shows[arg1] + 0x02); + break; + + default: + return; + } + + c -= 1; + while (c != 0xFFFF) + { + *ptr = -1; + ptr++; + c -= 1; + } +} + void sub_80EB6FC(u16 *arg0, u16 arg1) { - for (arg1--; arg1!=0xffff; arg1--) - *(arg0++) = 0xffff; + u16 i; + + for (i = arg1 - 1; i != 0xFFFF; i--) + { + *arg0 = 0xFFFF; + arg0++; + } + } u16 sub_80EB72C(u16 group) { |