diff options
-rw-r--r-- | asm/naming_screen.s | 4 | ||||
-rw-r--r-- | asm/string_util.s | 1168 | ||||
-rw-r--r-- | data/data.s | 42 | ||||
-rw-r--r-- | include/global.h | 150 | ||||
-rw-r--r-- | ld_script.txt | 3 | ||||
-rw-r--r-- | src/string_util.c | 691 |
6 files changed, 709 insertions, 1349 deletions
diff --git a/asm/naming_screen.s b/asm/naming_screen.s index 917bc047c..e4d67f534 100644 --- a/asm/naming_screen.s +++ b/asm/naming_screen.s @@ -4084,7 +4084,7 @@ sub_809F914: @ 809F914 bcs _0809F9AA add r5, sp, 0xC mov r10, r4 - ldr r0, _0809F9E4 @ =gUnknown_8415A20 + ldr r0, _0809F9E4 @ =gExpandedPlaceholder_Empty ldrb r0, [r0] mov r8, r0 _0809F956: @@ -4154,7 +4154,7 @@ _0809F9AA: _0809F9D8: .4byte gUnknown_203998C _0809F9DC: .4byte 0x00001e28 _0809F9E0: .4byte 0x00001e13 -_0809F9E4: .4byte gUnknown_8415A20 +_0809F9E4: .4byte gExpandedPlaceholder_Empty thumb_func_end sub_809F914 thumb_func_start sub_809F9E8 diff --git a/asm/string_util.s b/asm/string_util.s deleted file mode 100644 index b02b01518..000000000 --- a/asm/string_util.s +++ /dev/null @@ -1,1168 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start StringCopy10 -StringCopy10: @ 8008CF4 - push {r4,r5,lr} - adds r4, r0, 0 - movs r5, 0xA - movs r3, 0 -_08008CFC: - adds r2, r4, r3 - adds r0, r1, r3 - ldrb r0, [r0] - strb r0, [r2] - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0xFF - bne _08008D10 - adds r0, r2, 0 - b _08008D20 -_08008D10: - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, r5 - bcc _08008CFC - adds r0, r4, r3 - movs r1, 0xFF - strb r1, [r0] -_08008D20: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end StringCopy10 - - thumb_func_start StringGetEnd10 -StringGetEnd10: @ 8008D28 - push {r4,lr} - adds r3, r0, 0 - movs r4, 0xA - movs r2, 0 -_08008D30: - adds r1, r3, r2 - ldrb r0, [r1] - cmp r0, 0xFF - bne _08008D3C - adds r0, r1, 0 - b _08008D4C -_08008D3C: - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, r4 - bcc _08008D30 - adds r0, r3, r2 - movs r1, 0xFF - strb r1, [r0] -_08008D4C: - pop {r4} - pop {r1} - bx r1 - thumb_func_end StringGetEnd10 - - thumb_func_start StringCopy7 -StringCopy7: @ 8008D54 - push {r4,r5,lr} - adds r4, r0, 0 - movs r5, 0x7 - movs r3, 0 -_08008D5C: - adds r2, r4, r3 - adds r0, r1, r3 - ldrb r0, [r0] - strb r0, [r2] - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0xFF - bne _08008D70 - adds r0, r2, 0 - b _08008D7C -_08008D70: - adds r3, 0x1 - cmp r3, r5 - blt _08008D5C - adds r0, r4, r3 - movs r1, 0xFF - strb r1, [r0] -_08008D7C: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end StringCopy7 - - thumb_func_start StringCopy -StringCopy: @ 8008D84 - push {lr} - adds r3, r0, 0 - b _08008D90 -_08008D8A: - strb r2, [r3] - adds r3, 0x1 - adds r1, 0x1 -_08008D90: - ldrb r2, [r1] - adds r0, r2, 0 - cmp r0, 0xFF - bne _08008D8A - movs r0, 0xFF - strb r0, [r3] - adds r0, r3, 0 - pop {r1} - bx r1 - thumb_func_end StringCopy - - thumb_func_start StringAppend -StringAppend: @ 8008DA4 - push {lr} - adds r2, r0, 0 - b _08008DAC -_08008DAA: - adds r2, 0x1 -_08008DAC: - ldrb r0, [r2] - cmp r0, 0xFF - bne _08008DAA - adds r0, r2, 0 - bl StringCopy - pop {r1} - bx r1 - thumb_func_end StringAppend - - thumb_func_start StringCopyN -StringCopyN: @ 8008DBC - push {r4-r6,lr} - adds r4, r0, 0 - adds r6, r1, 0 - lsls r2, 24 - lsrs r5, r2, 24 - movs r3, 0 - adds r0, r5, 0 - cmp r3, r0 - bcs _08008DE2 - adds r2, r0, 0 -_08008DD0: - adds r1, r4, r3 - adds r0, r6, r3 - ldrb r0, [r0] - strb r0, [r1] - adds r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - cmp r3, r2 - bcc _08008DD0 -_08008DE2: - adds r0, r4, r5 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end StringCopyN - - thumb_func_start StringAppendN -StringAppendN: @ 8008DEC - push {lr} - adds r3, r0, 0 - lsls r2, 24 - lsrs r2, 24 - b _08008DF8 -_08008DF6: - adds r3, 0x1 -_08008DF8: - ldrb r0, [r3] - cmp r0, 0xFF - bne _08008DF6 - adds r0, r3, 0 - bl StringCopyN - pop {r1} - bx r1 - thumb_func_end StringAppendN - - thumb_func_start StringLength -StringLength: @ 8008E08 - push {lr} - adds r2, r0, 0 - movs r1, 0 - ldrb r0, [r2] - cmp r0, 0xFF - beq _08008E22 -_08008E14: - adds r0, r1, 0x1 - lsls r0, 16 - lsrs r1, r0, 16 - adds r0, r2, r1 - ldrb r0, [r0] - cmp r0, 0xFF - bne _08008E14 -_08008E22: - adds r0, r1, 0 - pop {r1} - bx r1 - thumb_func_end StringLength - - thumb_func_start StringCompare -StringCompare: @ 8008E28 - push {lr} - adds r2, r0, 0 - b _08008E3A -_08008E2E: - cmp r0, 0xFF - bne _08008E36 - movs r0, 0 - b _08008E48 -_08008E36: - adds r2, 0x1 - adds r1, 0x1 -_08008E3A: - ldrb r0, [r2] - ldrb r3, [r1] - cmp r0, r3 - beq _08008E2E - ldrb r0, [r2] - ldrb r1, [r1] - subs r0, r1 -_08008E48: - pop {r1} - bx r1 - thumb_func_end StringCompare - - thumb_func_start StringCompareN -StringCompareN: @ 8008E4C - push {r4,lr} - adds r3, r0, 0 - b _08008E64 -_08008E52: - cmp r0, 0xFF - beq _08008E60 - adds r3, 0x1 - adds r1, 0x1 - subs r2, 0x1 - cmp r2, 0 - bne _08008E64 -_08008E60: - movs r0, 0 - b _08008E72 -_08008E64: - ldrb r0, [r3] - ldrb r4, [r1] - cmp r0, r4 - beq _08008E52 - ldrb r0, [r3] - ldrb r1, [r1] - subs r0, r1 -_08008E72: - pop {r4} - pop {r1} - bx r1 - thumb_func_end StringCompareN - - thumb_func_start ConvertIntToDecimalStringN -ConvertIntToDecimalStringN: @ 8008E78 - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r4, r0, 0 - adds r6, r1, 0 - lsls r3, 24 - ldr r0, _08008EC8 @ =gUnknown_8231E3C - lsrs r3, 22 - subs r3, 0x4 - adds r3, r0 - ldr r0, [r3] - movs r7, 0 - cmp r2, 0x1 - bne _08008E96 - movs r7, 0x2 -_08008E96: - cmp r2, 0x2 - bne _08008E9C - movs r7, 0x1 -_08008E9C: - adds r5, r0, 0 - cmp r5, 0 - ble _08008F08 - ldr r0, _08008ECC @ =gUnknown_8231E2C - mov r8, r0 -_08008EA6: - adds r0, r6, 0 - adds r1, r5, 0 - bl __divsi3 - lsls r0, 16 - lsrs r2, r0, 16 - adds r0, r5, 0 - muls r0, r2 - subs r1, r6, r0 - cmp r7, 0x1 - bne _08008ED0 - adds r3, r4, 0 - adds r4, 0x1 - cmp r2, 0x9 - bls _08008EE2 - b _08008EEA - .align 2, 0 -_08008EC8: .4byte gUnknown_8231E3C -_08008ECC: .4byte gUnknown_8231E2C -_08008ED0: - cmp r2, 0 - bne _08008ED8 - cmp r5, 0x1 - bne _08008EF0 -_08008ED8: - movs r7, 0x1 - adds r3, r4, 0 - adds r4, 0x1 - cmp r2, 0x9 - bhi _08008EEA -_08008EE2: - mov r6, r8 - adds r0, r2, r6 - ldrb r0, [r0] - b _08008EEC -_08008EEA: - movs r0, 0xAC -_08008EEC: - strb r0, [r3] - b _08008EF8 -_08008EF0: - cmp r7, 0x2 - bne _08008EF8 - strb r2, [r4] - adds r4, 0x1 -_08008EF8: - adds r6, r1, 0 - adds r0, r5, 0 - movs r1, 0xA - bl __divsi3 - adds r5, r0, 0 - cmp r5, 0 - bgt _08008EA6 -_08008F08: - movs r0, 0xFF - strb r0, [r4] - adds r0, r4, 0 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end ConvertIntToDecimalStringN - - thumb_func_start sub_8008F18 -sub_8008F18: @ 8008F18 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - adds r6, r0, 0 - adds r7, r1, 0 - lsls r3, 24 - lsrs r3, 24 - movs r1, 0x1 - movs r0, 0x1 - cmp r1, r3 - bcs _08008F3C -_08008F30: - lsls r1, 4 - adds r0, 0x1 - lsls r0, 24 - lsrs r0, 24 - cmp r0, r3 - bcc _08008F30 -_08008F3C: - movs r3, 0 - cmp r2, 0x1 - bne _08008F44 - movs r3, 0x2 -_08008F44: - cmp r2, 0x2 - bne _08008F4A - movs r3, 0x1 -_08008F4A: - adds r5, r1, 0 - cmp r5, 0 - ble _08008FB8 - ldr r0, _08008F7C @ =gUnknown_8231E2C - mov r8, r0 -_08008F54: - adds r0, r7, 0 - adds r1, r5, 0 - str r3, [sp] - bl __divsi3 - adds r4, r0, 0 - adds r0, r7, 0 - adds r1, r5, 0 - bl __modsi3 - adds r1, r0, 0 - ldr r3, [sp] - cmp r3, 0x1 - bne _08008F80 - adds r2, r6, 0 - adds r6, 0x1 - cmp r4, 0xF - bls _08008F92 - b _08008F9A - .align 2, 0 -_08008F7C: .4byte gUnknown_8231E2C -_08008F80: - cmp r4, 0 - bne _08008F88 - cmp r5, 0x1 - bne _08008FA0 -_08008F88: - movs r3, 0x1 - adds r2, r6, 0 - adds r6, 0x1 - cmp r4, 0xF - bhi _08008F9A -_08008F92: - mov r7, r8 - adds r0, r4, r7 - ldrb r0, [r0] - b _08008F9C -_08008F9A: - movs r0, 0xAC -_08008F9C: - strb r0, [r2] - b _08008FA8 -_08008FA0: - cmp r3, 0x2 - bne _08008FA8 - strb r4, [r6] - adds r6, 0x1 -_08008FA8: - adds r7, r1, 0 - adds r0, r5, 0 - cmp r5, 0 - bge _08008FB2 - adds r0, 0xF -_08008FB2: - asrs r5, r0, 4 - cmp r5, 0 - bgt _08008F54 -_08008FB8: - movs r0, 0xFF - strb r0, [r6] - adds r0, r6, 0 - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8008F18 - - thumb_func_start StringExpandPlaceholders -StringExpandPlaceholders: @ 8008FCC - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 -_08008FD2: - ldrb r2, [r5] - adds r5, 0x1 - adds r0, r2, 0 - subs r0, 0xFA - cmp r0, 0x5 - bhi _080090A6 - lsls r0, 2 - ldr r1, _08008FE8 @ =_08008FEC - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08008FE8: .4byte _08008FEC - .align 2, 0 -_08008FEC: - .4byte _080090A6 - .4byte _080090A6 - .4byte _08009018 - .4byte _08009004 - .4byte _080090A6 - .4byte _080090AC -_08009004: - ldrb r0, [r5] - adds r5, 0x1 - bl GetExpandedPlaceholder - adds r1, r0, 0 - adds r0, r4, 0 - bl StringExpandPlaceholders - adds r4, r0, 0 - b _08008FD2 -_08009018: - strb r2, [r4] - adds r4, 0x1 - ldrb r2, [r5] - adds r5, 0x1 - strb r2, [r4] - adds r4, 0x1 - subs r0, r2, 0x4 - cmp r0, 0x14 - bhi _0800909C - lsls r0, 2 - ldr r1, _08009034 @ =_08009038 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08009034: .4byte _08009038 - .align 2, 0 -_08009038: - .4byte _0800908C - .4byte _0800909C - .4byte _0800909C - .4byte _08008FD2 - .4byte _0800909C - .4byte _08008FD2 - .4byte _0800909C - .4byte _08009094 - .4byte _0800909C - .4byte _0800909C - .4byte _0800909C - .4byte _08008FD2 - .4byte _0800909C - .4byte _0800909C - .4byte _0800909C - .4byte _0800909C - .4byte _0800909C - .4byte _08008FD2 - .4byte _08008FD2 - .4byte _08008FD2 - .4byte _08008FD2 -_0800908C: - ldrb r0, [r5] - strb r0, [r4] - adds r5, 0x1 - adds r4, 0x1 -_08009094: - ldrb r0, [r5] - strb r0, [r4] - adds r5, 0x1 - adds r4, 0x1 -_0800909C: - ldrb r0, [r5] - strb r0, [r4] - adds r5, 0x1 - adds r4, 0x1 - b _08008FD2 -_080090A6: - strb r2, [r4] - adds r4, 0x1 - b _08008FD2 -_080090AC: - movs r0, 0xFF - strb r0, [r4] - adds r0, r4, 0 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end StringExpandPlaceholders - - thumb_func_start StringBraille -StringBraille: @ 80090B8 - push {r4-r6,lr} - sub sp, 0xC - adds r5, r0, 0 - adds r6, r1, 0 - ldr r1, _080090F0 @ =gUnknown_8231E64 - mov r0, sp - movs r2, 0x4 - bl memcpy - add r4, sp, 0x4 - ldr r1, _080090F4 @ =gUnknown_8231E68 - adds r0, r4, 0 - movs r2, 0x5 - bl memcpy - adds r0, r5, 0 - mov r1, sp -_080090DA: - bl StringCopy - adds r5, r0, 0 -_080090E0: - ldrb r0, [r6] - adds r6, 0x1 - cmp r0, 0xFE - beq _080090F8 - cmp r0, 0xFF - bne _080090FE - b _0800910A - .align 2, 0 -_080090F0: .4byte gUnknown_8231E64 -_080090F4: .4byte gUnknown_8231E68 -_080090F8: - adds r0, r5, 0 - adds r1, r4, 0 - b _080090DA -_080090FE: - strb r0, [r5] - adds r5, 0x1 - adds r0, 0x40 - strb r0, [r5] - adds r5, 0x1 - b _080090E0 -_0800910A: - strb r0, [r5] - adds r0, r5, 0 - add sp, 0xC - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end StringBraille - - thumb_func_start sub_8009118 -sub_8009118: @ 8009118 - ldr r0, _0800911C @ =gUnknownStringVar - bx lr - .align 2, 0 -_0800911C: .4byte gUnknownStringVar - thumb_func_end sub_8009118 - - thumb_func_start sub_8009120 -sub_8009120: @ 8009120 - ldr r0, _08009128 @ =gSaveBlock2Ptr - ldr r0, [r0] - bx lr - .align 2, 0 -_08009128: .4byte gSaveBlock2Ptr - thumb_func_end sub_8009120 - - thumb_func_start sub_800912C -sub_800912C: @ 800912C - ldr r0, _08009130 @ =gStringVar1 - bx lr - .align 2, 0 -_08009130: .4byte gStringVar1 - thumb_func_end sub_800912C - - thumb_func_start sub_8009134 -sub_8009134: @ 8009134 - ldr r0, _08009138 @ =gStringVar2 - bx lr - .align 2, 0 -_08009138: .4byte gStringVar2 - thumb_func_end sub_8009134 - - thumb_func_start sub_800913C -sub_800913C: @ 800913C - ldr r0, _08009140 @ =gStringVar3 - bx lr - .align 2, 0 -_08009140: .4byte gStringVar3 - thumb_func_end sub_800913C - - thumb_func_start sub_8009144 -sub_8009144: @ 8009144 - push {lr} - ldr r0, _08009154 @ =gSaveBlock2Ptr - ldr r0, [r0] - ldrb r0, [r0, 0x8] - cmp r0, 0 - beq _0800915C - ldr r0, _08009158 @ =gUnknown_8415A22 - b _0800915E - .align 2, 0 -_08009154: .4byte gSaveBlock2Ptr -_08009158: .4byte gUnknown_8415A22 -_0800915C: - ldr r0, _08009164 @ =gUnknown_8415A21 -_0800915E: - pop {r1} - bx r1 - .align 2, 0 -_08009164: .4byte gUnknown_8415A21 - thumb_func_end sub_8009144 - - thumb_func_start sub_8009168 -sub_8009168: @ 8009168 - push {lr} - ldr r0, _08009188 @ =gSaveBlock1Ptr - ldr r0, [r0] - ldr r2, _0800918C @ =0x00003a4c - adds r1, r0, r2 - ldrb r0, [r1] - cmp r0, 0xFF - bne _080091A0 - ldr r0, _08009190 @ =gSaveBlock2Ptr - ldr r0, [r0] - ldrb r0, [r0, 0x8] - cmp r0, 0 - bne _08009198 - ldr r0, _08009194 @ =gUnknown_8415A5C - b _080091A2 - .align 2, 0 -_08009188: .4byte gSaveBlock1Ptr -_0800918C: .4byte 0x00003a4c -_08009190: .4byte gSaveBlock2Ptr -_08009194: .4byte gUnknown_8415A5C -_08009198: - ldr r0, _0800919C @ =gUnknown_8415A58 - b _080091A2 - .align 2, 0 -_0800919C: .4byte gUnknown_8415A58 -_080091A0: - adds r0, r1, 0 -_080091A2: - pop {r1} - bx r1 - thumb_func_end sub_8009168 - - thumb_func_start sub_80091A8 -sub_80091A8: @ 80091A8 - ldr r0, _080091AC @ =gUnknown_8415A2C - bx lr - .align 2, 0 -_080091AC: .4byte gUnknown_8415A2C - thumb_func_end sub_80091A8 - - thumb_func_start sub_80091B0 -sub_80091B0: @ 80091B0 - ldr r0, _080091B4 @ =gUnknown_8415A36 - bx lr - .align 2, 0 -_080091B4: .4byte gUnknown_8415A36 - thumb_func_end sub_80091B0 - - thumb_func_start sub_80091B8 -sub_80091B8: @ 80091B8 - ldr r0, _080091BC @ =gUnknown_8415A31 - bx lr - .align 2, 0 -_080091BC: .4byte gUnknown_8415A31 - thumb_func_end sub_80091B8 - - thumb_func_start sub_80091C0 -sub_80091C0: @ 80091C0 - ldr r0, _080091C4 @ =gUnknown_8415A43 - bx lr - .align 2, 0 -_080091C4: .4byte gUnknown_8415A43 - thumb_func_end sub_80091C0 - - thumb_func_start sub_80091C8 -sub_80091C8: @ 80091C8 - ldr r0, _080091CC @ =gUnknown_8415A3C - bx lr - .align 2, 0 -_080091CC: .4byte gUnknown_8415A3C - thumb_func_end sub_80091C8 - - thumb_func_start sub_80091D0 -sub_80091D0: @ 80091D0 - ldr r0, _080091D4 @ =gUnknown_8415A50 - bx lr - .align 2, 0 -_080091D4: .4byte gUnknown_8415A50 - thumb_func_end sub_80091D0 - - thumb_func_start sub_80091D8 -sub_80091D8: @ 80091D8 - ldr r0, _080091DC @ =gUnknown_8415A49 - bx lr - .align 2, 0 -_080091DC: .4byte gUnknown_8415A49 - thumb_func_end sub_80091D8 - - thumb_func_start GetExpandedPlaceholder -GetExpandedPlaceholder: @ 80091E0 - push {lr} - cmp r0, 0xD - bhi _080091F8 - ldr r1, _080091F4 @ =gUnknown_8231E70 - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - bl _call_via_r0 - b _080091FA - .align 2, 0 -_080091F4: .4byte gUnknown_8231E70 -_080091F8: - ldr r0, _08009200 @ =gUnknown_8415A20 -_080091FA: - pop {r1} - bx r1 - .align 2, 0 -_08009200: .4byte gUnknown_8415A20 - thumb_func_end GetExpandedPlaceholder - - thumb_func_start StringFill -StringFill: @ 8009204 - push {lr} - adds r3, r0, 0 - lsls r1, 24 - lsrs r1, 24 - lsls r2, 16 - lsrs r2, 16 - movs r0, 0 - cmp r0, r2 - bcs _08009224 -_08009216: - strb r1, [r3] - adds r3, 0x1 - adds r0, 0x1 - lsls r0, 16 - lsrs r0, 16 - cmp r0, r2 - bcc _08009216 -_08009224: - movs r0, 0xFF - strb r0, [r3] - adds r0, r3, 0 - pop {r1} - bx r1 - thumb_func_end StringFill - - thumb_func_start StringCopyPadded -StringCopyPadded: @ 8009230 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - lsls r2, 24 - lsrs r2, 24 - lsls r3, 16 - lsrs r3, 16 - b _08009250 -_08009240: - strb r1, [r4] - adds r5, 0x1 - adds r4, 0x1 - cmp r3, 0 - beq _08009250 - subs r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 -_08009250: - ldrb r1, [r5] - adds r0, r1, 0 - cmp r0, 0xFF - bne _08009240 - subs r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - ldr r0, _08009280 @ =0x0000ffff - cmp r3, r0 - beq _08009274 - adds r1, r0, 0 -_08009266: - strb r2, [r4] - adds r4, 0x1 - subs r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - cmp r3, r1 - bne _08009266 -_08009274: - movs r0, 0xFF - strb r0, [r4] - adds r0, r4, 0 - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_08009280: .4byte 0x0000ffff - thumb_func_end StringCopyPadded - - thumb_func_start StringFillWithTerminator -StringFillWithTerminator: @ 8009284 - push {lr} - lsls r2, r1, 16 - lsrs r2, 16 - movs r1, 0xFF - bl StringFill - pop {r1} - bx r1 - thumb_func_end StringFillWithTerminator - - thumb_func_start StringCopyN_Multibyte -StringCopyN_Multibyte: @ 8009294 - push {r4,r5,lr} - adds r4, r0, 0 - adds r3, r1, 0 - subs r2, 0x1 - movs r5, 0x1 - negs r5, r5 - b _080092BA -_080092A2: - strb r0, [r4] - adds r3, 0x1 - adds r4, 0x1 - subs r0, r3, 0x1 - ldrb r0, [r0] - cmp r0, 0xF9 - bne _080092B8 - ldrb r0, [r3] - strb r0, [r4] - adds r3, 0x1 - adds r4, 0x1 -_080092B8: - subs r2, 0x1 -_080092BA: - cmp r2, r5 - beq _080092C6 - ldrb r0, [r3] - adds r1, r0, 0 - cmp r1, 0xFF - bne _080092A2 -_080092C6: - movs r0, 0xFF - strb r0, [r4] - adds r0, r4, 0 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end StringCopyN_Multibyte - - thumb_func_start StringLength_Multibyte -StringLength_Multibyte: @ 80092D4 - push {lr} - adds r2, r0, 0 - movs r3, 0 - b _080092E6 -_080092DC: - cmp r1, 0xF9 - bne _080092E2 - adds r2, 0x1 -_080092E2: - adds r2, 0x1 - adds r3, 0x1 -_080092E6: - ldrb r1, [r2] - adds r0, r1, 0 - cmp r0, 0xFF - bne _080092DC - adds r0, r3, 0 - pop {r1} - bx r1 - thumb_func_end StringLength_Multibyte - - thumb_func_start WriteColorChangeControlCode -WriteColorChangeControlCode: @ 80092F4 - push {lr} - adds r3, r0, 0 - lsls r2, 24 - lsrs r2, 24 - movs r0, 0xFC - strb r0, [r3] - adds r3, 0x1 - cmp r1, 0x1 - beq _08009316 - cmp r1, 0x1 - bcc _08009310 - cmp r1, 0x2 - beq _0800931C - b _08009320 -_08009310: - movs r0, 0x1 - strb r0, [r3] - b _0800931E -_08009316: - movs r0, 0x3 - strb r0, [r3] - b _0800931E -_0800931C: - strb r1, [r3] -_0800931E: - adds r3, 0x1 -_08009320: - strb r2, [r3] - adds r3, 0x1 - movs r0, 0xFF - strb r0, [r3] - adds r0, r3, 0 - pop {r1} - bx r1 - thumb_func_end WriteColorChangeControlCode - - thumb_func_start GetExtCtrlCodeLength -GetExtCtrlCodeLength: @ 8009330 - push {lr} - lsls r0, 24 - lsrs r1, r0, 24 - movs r0, 0 - cmp r1, 0x18 - bhi _08009342 - ldr r0, _08009348 @ =gUnknown_8231EA8 - adds r0, r1, r0 - ldrb r0, [r0] -_08009342: - pop {r1} - bx r1 - .align 2, 0 -_08009348: .4byte gUnknown_8231EA8 - thumb_func_end GetExtCtrlCodeLength - - thumb_func_start SkipExtCtrlCode -SkipExtCtrlCode: @ 800934C - push {r4,lr} - adds r4, r0, 0 - b _08009360 -_08009352: - adds r4, 0x1 - ldrb r0, [r4] - bl GetExtCtrlCodeLength - lsls r0, 24 - lsrs r0, 24 - adds r4, r0 -_08009360: - ldrb r0, [r4] - cmp r0, 0xFC - beq _08009352 - adds r0, r4, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end SkipExtCtrlCode - - thumb_func_start StringCompareWithoutExtCtrlCodes -StringCompareWithoutExtCtrlCodes: @ 8009370 - push {r4-r6,lr} - adds r4, r0, 0 - adds r5, r1, 0 - movs r6, 0 - b _08009392 -_0800937A: - cmp r1, r0 - bcs _08009388 - movs r6, 0x1 - negs r6, r6 - cmp r0, 0xFF - bne _08009388 - movs r6, 0x1 -_08009388: - ldrb r0, [r4] - cmp r0, 0xFF - beq _080093B2 - adds r4, 0x1 - adds r5, 0x1 -_08009392: - adds r0, r4, 0 - bl SkipExtCtrlCode - adds r4, r0, 0 - adds r0, r5, 0 - bl SkipExtCtrlCode - adds r5, r0, 0 - ldrb r1, [r4] - ldrb r0, [r5] - cmp r1, r0 - bls _0800937A - movs r6, 0x1 - cmp r1, 0xFF - bne _080093B2 - subs r6, 0x2 -_080093B2: - adds r0, r6, 0 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end StringCompareWithoutExtCtrlCodes - - thumb_func_start ConvertInternationalString -ConvertInternationalString: @ 80093BC - push {r4,lr} - adds r4, r0, 0 - lsls r1, 24 - lsrs r1, 24 - cmp r1, 0x1 - bne _0800941C - bl StripExtCtrlCodes - adds r0, r4, 0 - bl StringLength - lsls r0, 24 - lsrs r2, r0, 24 - adds r1, r2, 0 - adds r0, r1, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - adds r3, r2, 0 - adds r1, r4, r1 - movs r0, 0xFC - strb r0, [r1] - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - adds r3, r4, r3 - movs r0, 0x16 - strb r0, [r3] - adds r0, r2, 0x1 - lsls r0, 24 - adds r2, r4, r2 - movs r1, 0xFF - strb r1, [r2] - movs r1, 0xFF - lsls r1, 24 - adds r0, r1 - b _0800940E -_08009404: - adds r1, r2, r4 - ldrb r0, [r1] - strb r0, [r1, 0x2] - subs r0, r2, 0x1 - lsls r0, 24 -_0800940E: - lsrs r2, r0, 24 - cmp r2, 0xFF - bne _08009404 - movs r0, 0xFC - strb r0, [r4] - movs r0, 0x15 - strb r0, [r4, 0x1] -_0800941C: - pop {r4} - pop {r0} - bx r0 - thumb_func_end ConvertInternationalString - - thumb_func_start StripExtCtrlCodes -StripExtCtrlCodes: @ 8009424 - push {r4-r6,lr} - adds r5, r0, 0 - movs r4, 0 - movs r6, 0 - ldrb r0, [r5] - cmp r0, 0xFF - beq _08009474 -_08009432: - adds r0, r5, r4 - ldrb r0, [r0] - cmp r0, 0xFC - bne _08009454 - adds r0, r4, 0x1 - lsls r0, 16 - lsrs r4, r0, 16 - adds r0, r5, r4 - ldrb r0, [r0] - bl GetExtCtrlCodeLength - lsls r0, 24 - lsrs r0, 24 - adds r0, r4, r0 - lsls r0, 16 - lsrs r4, r0, 16 - b _0800946C -_08009454: - adds r2, r6, 0 - adds r0, r2, 0x1 - lsls r0, 16 - lsrs r6, r0, 16 - adds r2, r5, r2 - adds r1, r4, 0 - adds r0, r1, 0x1 - lsls r0, 16 - lsrs r4, r0, 16 - adds r1, r5, r1 - ldrb r0, [r1] - strb r0, [r2] -_0800946C: - adds r0, r5, r4 - ldrb r0, [r0] - cmp r0, 0xFF - bne _08009432 -_08009474: - adds r1, r5, r6 - movs r0, 0xFF - strb r0, [r1] - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end StripExtCtrlCodes - - .align 2, 0 @ Don't pad with nop. diff --git a/data/data.s b/data/data.s index e164d81c5..c73a5be8b 100644 --- a/data/data.s +++ b/data/data.s @@ -1,23 +1,5 @@ .section .rodata -gUnknown_8231E2C:: @ 8231E2C - .incbin "baserom.gba", 0x231E2C, 0x10 - -gUnknown_8231E3C:: @ 8231E3C - .incbin "baserom.gba", 0x231E3C, 0x28 - -gUnknown_8231E64:: @ 8231E64 - .incbin "baserom.gba", 0x231E64, 0x4 - -gUnknown_8231E68:: @ 8231E68 - .incbin "baserom.gba", 0x231E68, 0x8 - -gUnknown_8231E70:: @ 8231E70 - .incbin "baserom.gba", 0x231E70, 0x38 - -gUnknown_8231EA8:: @ 8231EA8 - .incbin "baserom.gba", 0x231EA8, 0x1C - gUnknown_8231EC4:: @ 8231EC4 .incbin "baserom.gba", 0x231EC4, 0x20 @@ -4188,40 +4170,40 @@ gUnknown_8415A08:: @ 8415A08 gUnknown_8415A10:: @ 8415A10 .incbin "baserom.gba", 0x415A10, 0x10 -gUnknown_8415A20:: @ 8415A20 +gExpandedPlaceholder_Empty:: @ 8415A20 .incbin "baserom.gba", 0x415A20, 0x1 -gUnknown_8415A21:: @ 8415A21 +gExpandedPlaceholder_Kun:: @ 8415A21 .incbin "baserom.gba", 0x415A21, 0x1 -gUnknown_8415A22:: @ 8415A22 +gExpandedPlaceholder_Chan:: @ 8415A22 .incbin "baserom.gba", 0x415A22, 0xA -gUnknown_8415A2C:: @ 8415A2C +gExpandedPlaceholder_Ruby:: @ 8415A2C .incbin "baserom.gba", 0x415A2C, 0x5 -gUnknown_8415A31:: @ 8415A31 +gExpandedPlaceholder_Aqua:: @ 8415A31 .incbin "baserom.gba", 0x415A31, 0x5 -gUnknown_8415A36:: @ 8415A36 +gExpandedPlaceholder_Magma:: @ 8415A36 .incbin "baserom.gba", 0x415A36, 0x6 -gUnknown_8415A3C:: @ 8415A3C +gExpandedPlaceholder_Archie:: @ 8415A3C .incbin "baserom.gba", 0x415A3C, 0x7 -gUnknown_8415A43:: @ 8415A43 +gExpandedPlaceholder_Maxie:: @ 8415A43 .incbin "baserom.gba", 0x415A43, 0x6 -gUnknown_8415A49:: @ 8415A49 +gExpandedPlaceholder_Kyogre:: @ 8415A49 .incbin "baserom.gba", 0x415A49, 0x7 -gUnknown_8415A50:: @ 8415A50 +gExpandedPlaceholder_Groudon:: @ 8415A50 .incbin "baserom.gba", 0x415A50, 0x8 -gUnknown_8415A58:: @ 8415A58 +gExpandedPlaceholder_Red:: @ 8415A58 .incbin "baserom.gba", 0x415A58, 0x4 -gUnknown_8415A5C:: @ 8415A5C +gExpandedPlaceholder_Green:: @ 8415A5C .incbin "baserom.gba", 0x415A5C, 0x6 gUnknown_8415A62:: @ 8415A62 diff --git a/include/global.h b/include/global.h index d864a6ab7..50d3f9104 100644 --- a/include/global.h +++ b/include/global.h @@ -454,156 +454,10 @@ struct RecordMixingDayCareMail #define VARS_COUNT 256 #define MAIL_COUNT 16 -enum -{ - LILYCOVE_LADY_QUIZ, - LILYCOVE_LADY_FAVOUR, - LILYCOVE_LADY_CONTEST -}; - -struct LilycoveLadyQuiz -{ - /*0x000*/ u8 id; - /*0x001*/ u8 phase; - /*0x002*/ u16 unk_002[9]; - /*0x014*/ u16 unk_014; - /*0x016*/ u16 unk_016; - /*0x018*/ u8 playerName[8]; - /*0x020*/ u16 playerTrainerId[4]; - /*0x028*/ u16 itemId; - /*0x02a*/ u8 unk_02a; - /*0x02b*/ u8 unk_02b; - /*0x02c*/ u8 unk_02c; - /*0x02d*/ u8 language; -}; - -struct LilycoveLadyFavour -{ - /*0x000*/ u8 id; - /*0x001*/ u8 phase; - /*0x002*/ u8 unk_002; - /*0x003*/ u8 unk_003; - /*0x004*/ u8 playerName[8]; - /*0x00c*/ u8 unk_00c; - /*0x00e*/ u16 itemId; - /*0x010*/ u16 unk_010; - /*0x012*/ u8 language; -}; - -struct LilycoveLadyContest -{ - /*0x000*/ u8 id; - /*0x001*/ u8 phase; - /*0x002*/ u8 fave_pkblk; - /*0x003*/ u8 other_pkblk; - /*0x004*/ u8 playerName[8]; - /*0x00c*/ u8 max_sheen; - /*0x00d*/ u8 category; - /*0x00e*/ u8 language; -}; - -typedef union // TODO -{ - struct LilycoveLadyQuiz quiz; - struct LilycoveLadyFavour favour; - struct LilycoveLadyContest contest; - u8 id; -} LilycoveLady; - -struct WaldaPhrase -{ - u16 field_0; - u16 field_2; - u8 text[16]; - u8 iconId; - u8 patternId; - bool8 patternUnlocked; -}; - struct SaveBlock1 { - /*0x00*/ struct Coords16 pos; - /*0x04*/ struct WarpData location; - /*0x0C*/ struct WarpData warp1; - /*0x14*/ struct WarpData warp2; - /*0x1C*/ struct WarpData warp3; - /*0x24*/ struct WarpData warp4; - /*0x2C*/ u16 battleMusic; - /*0x2E*/ u8 weather; - /*0x2F*/ u8 filler_2F; - /*0x30*/ u8 flashUsed; - /*0x32*/ u16 mapDataId; - /*0x34*/ u16 mapView[0x100]; - /*0x234*/ u8 playerPartyCount; - /*0x238*/ struct Pokemon playerParty[6]; - /*0x490*/ u32 money; - /*0x494*/ u16 coins; - /*0x496*/ u16 registeredItem; // registered for use with SELECT button - /*0x498*/ struct ItemSlot pcItems[50]; - /*0x560*/ struct ItemSlot bagPocket_Items[30]; - /*0x5D8*/ struct ItemSlot bagPocket_KeyItems[30]; - /*0x650*/ struct ItemSlot bagPocket_PokeBalls[16]; - /*0x690*/ struct ItemSlot bagPocket_TMHM[64]; - /*0x790*/ struct ItemSlot bagPocket_Berries[46]; - /*0x848*/ struct Pokeblock pokeblocks[40]; - /*0x988*/ u8 seen1[52]; - /*0x9BC*/ u16 berryBlenderRecords[3]; - /*0x9C2*/ u8 field_9C2[6]; - /*0x9C8*/ u16 trainerRematchStepCounter; - /*0x9CA*/ u8 trainerRematches[100]; - /*0xA30*/ struct MapObject mapObjects[MAP_OBJECTS_COUNT]; - /*0xC70*/ struct MapObjectTemplate mapObjectTemplates[64]; - /*0x1270*/ u8 flags[FLAGS_COUNT]; - /*0x139C*/ u16 vars[VARS_COUNT]; - /*0x159C*/ u32 gameStats[NUM_GAME_STATS]; - /*0x169C*/ struct BerryTree berryTrees[BERRY_TREES_COUNT]; - /*0x1A9C*/ struct SecretBaseRecord secretBases[20]; - /*0x271C*/ u8 playerRoomDecor[12]; - /*0x2728*/ u8 playerRoomDecorPos[12]; - /*0x2734*/ u8 decorDesk[10]; - /*0x????*/ u8 decorChair[10]; - /*0x????*/ u8 decorPlant[10]; - /*0x????*/ u8 decorOrnament[30]; - /*0x????*/ u8 decorMat[30]; - /*0x????*/ u8 decorPoster[10]; - /*0x????*/ u8 decorDoll[40]; - /*0x????*/ u8 decorCushion[10]; - /*0x27CA*/ u8 padding_27CA[2]; - /*0x2B90*/ u16 outbreakPokemonSpecies; - /*0x2B92*/ u8 outbreakLocationMapNum; - /*0x2B93*/ u8 outbreakLocationMapGroup; - /*0x2B94*/ u8 outbreakPokemonLevel; - /*0x2B95*/ u8 outbreakUnk1; - /*0x2B96*/ u16 outbreakUnk2; - /*0x2B98*/ u16 outbreakPokemonMoves[4]; - /*0x2BA0*/ u8 outbreakUnk4; - /*0x2BA1*/ u8 outbreakPokemonProbability; - /*0x2BA2*/ u16 outbreakDaysLeft; - /*0x2BB0*/ u16 unk2BB0[6]; - /*0x2BBC*/ u16 unk2BBC[6]; - /*0x2BC8*/ u16 unk2BC8[6]; - /*0x2BD4*/ u16 unk2BD4[6]; - /*0x2BE0*/ struct MailStruct mail[MAIL_COUNT]; - /*0x2E20*/ u8 additionalPhrases[5]; // bitfield for 33 additional phrases in easy chat system - /*0x2E25*/ u8 unk2E25[3]; // possibly padding? - /*0x2E28*/ OldMan oldMan; - /*0x2e64*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff - /*0x2e90*/ struct ContestWinner contestWinners[13]; // 0 - 5 used in contest hall, 6 - 7 unused?, 8 - 12 museum - /*0x3030*/ struct DayCare daycare; - /*0x3150*/ struct LinkBattleRecord linkBattleRecords[5]; - /*0x31A0*/ u8 unk_31A0; - /*0x31A1*/ u8 filler_31A1[7]; - /*0x31A8*/ u8 giftRibbons[52]; - /*0x31DC*/ struct Roamer roamer; - /*0x31F8*/ struct EnigmaBerry enigmaBerry; - /*0x322C*/ u8 field_322C[1276]; - /*0x3728*/ struct RamScript ramScript; - /*0x3B14*/ struct RecordMixingGift recordMixingGift; - /*0x3B24*/ u8 seen2[52]; - /*0x3B58*/ LilycoveLady lilycoveLady; - /*0x3B88*/ u8 filler_3B88[0x1E8]; - /*0x3D70*/ struct WaldaPhrase waldaPhrase; - // sizeof: 0x3D88 + /*0x0000*/ u8 filler[0x3A4C]; + /*0x3A4C*/ u8 rivalName[PLAYER_NAME_LENGTH]; }; extern struct SaveBlock1* gSaveBlock1Ptr; diff --git a/ld_script.txt b/ld_script.txt index 5abc06505..8e65050bd 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -95,7 +95,7 @@ SECTIONS { src/text.o(.text); asm/text.o(.text); src/sprite.o(.text); - asm/string_util.o(.text); + src/string_util.o(.text); asm/link.o(.text); asm/multiboot.o(.text); asm/main_menu.o(.text); @@ -402,6 +402,7 @@ SECTIONS { data/text.o(.rodata); src/sprite.o(.rodata); src/bg_regs.o(.rodata); + src/string_util.o(.rodata); data/data.o(.rodata); src/m4a_tables.o(.rodata); data/sound_data.o(.rodata); diff --git a/src/string_util.c b/src/string_util.c new file mode 100644 index 000000000..e1129a5a5 --- /dev/null +++ b/src/string_util.c @@ -0,0 +1,691 @@ +#include "global.h" +#include "string_util.h" +#include "text.h" + +EWRAM_DATA u8 gUnknownStringVar[16] = {0}; + +static const u8 sDigits[] = __("0123456789ABCDEF"); + +static const s32 sPowersOfTen[] = +{ + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, +}; + +extern u8 gExpandedPlaceholder_Empty[]; +extern u8 gExpandedPlaceholder_Kun[]; +extern u8 gExpandedPlaceholder_Chan[]; +extern u8 gExpandedPlaceholder_Sapphire[]; +extern u8 gExpandedPlaceholder_Ruby[]; +extern u8 gExpandedPlaceholder_Aqua[]; +extern u8 gExpandedPlaceholder_Magma[]; +extern u8 gExpandedPlaceholder_Archie[]; +extern u8 gExpandedPlaceholder_Maxie[]; +extern u8 gExpandedPlaceholder_Kyogre[]; +extern u8 gExpandedPlaceholder_Groudon[]; +extern u8 gExpandedPlaceholder_Red[]; +extern u8 gExpandedPlaceholder_Green[]; + +u8 *StringCopy10(u8 *dest, const u8 *src) +{ + u8 i; + u32 limit = 10; + + for (i = 0; i < limit; i++) + { + dest[i] = src[i]; + + if (dest[i] == EOS) + return &dest[i]; + } + + dest[i] = EOS; + return &dest[i]; +} + +u8 *StringGetEnd10(u8 *str) +{ + u8 i; + u32 limit = 10; + + for (i = 0; i < limit; i++) + if (str[i] == EOS) + return &str[i]; + + str[i] = EOS; + return &str[i]; +} + +u8 *StringCopy7(u8 *dest, const u8 *src) +{ + s32 i; + s32 limit = 7; + + for (i = 0; i < limit; i++) + { + dest[i] = src[i]; + + if (dest[i] == EOS) + return &dest[i]; + } + + dest[i] = EOS; + return &dest[i]; +} + +u8 *StringCopy(u8 *dest, const u8 *src) +{ + while (*src != EOS) + { + *dest = *src; + dest++; + src++; + } + + *dest = EOS; + return dest; +} + +u8 *StringAppend(u8 *dest, const u8 *src) +{ + while (*dest != EOS) + dest++; + + return StringCopy(dest, src); +} + +u8 *StringCopyN(u8 *dest, const u8 *src, u8 n) +{ + u16 i; + + for (i = 0; i < n; i++) + dest[i] = src[i]; + + return &dest[n]; +} + +u8 *StringAppendN(u8 *dest, const u8 *src, u8 n) +{ + while (*dest != EOS) + dest++; + + return StringCopyN(dest, src, n); +} + +u16 StringLength(const u8 *str) +{ + u16 length = 0; + + while (str[length] != EOS) + length++; + + return length; +} + +s32 StringCompare(const u8 *str1, const u8 *str2) +{ + while (*str1 == *str2) + { + if (*str1 == EOS) + return 0; + str1++; + str2++; + } + + return *str1 - *str2; +} + +s32 StringCompareN(const u8 *str1, const u8 *str2, u32 n) +{ + while (*str1 == *str2) + { + if (*str1 == EOS) + return 0; + str1++; + str2++; + if (--n == 0) + return 0; + } + + return *str1 - *str2; +} + +u8 *ConvertIntToDecimalStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) +{ + enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; + s32 powerOfTen; + s32 largestPowerOfTen = sPowersOfTen[n - 1]; + + state = WAITING_FOR_NONZERO_DIGIT; + + if (mode == STR_CONV_MODE_RIGHT_ALIGN) + state = WRITING_SPACES; + + if (mode == STR_CONV_MODE_LEADING_ZEROS) + state = WRITING_DIGITS; + + for (powerOfTen = largestPowerOfTen; powerOfTen > 0; powerOfTen /= 10) + { + u8 *out; + u8 c; + u16 digit = value / powerOfTen; + s32 temp = value - (powerOfTen * digit); + + if (state == WRITING_DIGITS) + { + out = dest++; + + if (digit <= 9) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (digit != 0 || powerOfTen == 1) + { + state = WRITING_DIGITS; + out = dest++; + + if (digit <= 9) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (state == WRITING_SPACES) + { + *dest++ = CHAR_SPACE; + } + + value = temp; + } + + *dest = EOS; + return dest; +} + +u8 *ConvertIntToHexStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) +{ + enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; + u8 i; + s32 powerOfSixteen; + s32 largestPowerOfSixteen = 1; + + for (i = 1; i < n; i++) + largestPowerOfSixteen *= 16; + + state = WAITING_FOR_NONZERO_DIGIT; + + if (mode == STR_CONV_MODE_RIGHT_ALIGN) + state = WRITING_SPACES; + + if (mode == STR_CONV_MODE_LEADING_ZEROS) + state = WRITING_DIGITS; + + for (powerOfSixteen = largestPowerOfSixteen; powerOfSixteen > 0; powerOfSixteen /= 16) + { + u8 *out; + u8 c; + u32 digit = value / powerOfSixteen; + s32 temp = value % powerOfSixteen; + + if (state == WRITING_DIGITS) + { + out = dest++; + + if (digit <= 0xF) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (digit != 0 || powerOfSixteen == 1) + { + state = WRITING_DIGITS; + out = dest++; + + if (digit <= 0xF) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (state == WRITING_SPACES) + { + *dest++ = CHAR_SPACE; + } + + value = temp; + } + + *dest = EOS; + return dest; +} + +u8 *StringExpandPlaceholders(u8 *dest, const u8 *src) +{ + for (;;) + { + u8 c = *src++; + u8 placeholderId; + u8 *expandedString; + + switch (c) + { + case PLACEHOLDER_BEGIN: + placeholderId = *src++; + expandedString = GetExpandedPlaceholder(placeholderId); + dest = StringExpandPlaceholders(dest, expandedString); + break; + case EXT_CTRL_CODE_BEGIN: + *dest++ = c; + c = *src++; + *dest++ = c; + + switch (c) + { + case 0x07: + case 0x09: + case 0x0F: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + break; + case 0x04: + *dest++ = *src++; + case 0x0B: + *dest++ = *src++; + default: + *dest++ = *src++; + } + break; + case EOS: + *dest = EOS; + return dest; + case 0xFA: + case 0xFB: + case 0xFE: + default: + *dest++ = c; + } + } +} + +u8 *StringBraille(u8 *dest, const u8 *src) +{ + u8 setBrailleFont[] = { 0xFC, 0x06, 0x06, 0xFF }; + u8 gotoLine2[] = { 0xFE, 0xFC, 0x0E, 0x02, 0xFF }; + + dest = StringCopy(dest, setBrailleFont); + + for (;;) + { + u8 c = *src++; + + switch (c) + { + case EOS: + *dest = c; + return dest; + case 0xFE: + dest = StringCopy(dest, gotoLine2); + break; + default: + *dest++ = c; + *dest++ = c + 0x40; + break; + } + } +} + +static u8 *ExpandPlaceholder_UnknownStringVar(void) +{ + return gUnknownStringVar; +} + +static u8 *ExpandPlaceholder_PlayerName(void) +{ + return gSaveBlock2Ptr->playerName; +} + +static u8 *ExpandPlaceholder_StringVar1(void) +{ + return gStringVar1; +} + +static u8 *ExpandPlaceholder_StringVar2(void) +{ + return gStringVar2; +} + +static u8 *ExpandPlaceholder_StringVar3(void) +{ + return gStringVar3; +} + +static u8 *ExpandPlaceholder_KunChan(void) +{ + if (gSaveBlock2Ptr->playerGender == MALE) + return gExpandedPlaceholder_Kun; + else + return gExpandedPlaceholder_Chan; +} + +static u8 *ExpandPlaceholder_RivalName(void) +{ + if (gSaveBlock1Ptr->rivalName[0] == EOS) + { + if (gSaveBlock2Ptr->playerGender == MALE) + return gExpandedPlaceholder_Green; + else + return gExpandedPlaceholder_Red; + } + else + { + return gSaveBlock1Ptr->rivalName; + } +} + +static u8 *ExpandPlaceholder_Version(void) +{ + return gExpandedPlaceholder_Ruby; +} + +static u8 *ExpandPlaceholder_Magma(void) +{ + return gExpandedPlaceholder_Magma; +} + +static u8 *ExpandPlaceholder_Aqua(void) +{ + return gExpandedPlaceholder_Aqua; +} + +static u8 *ExpandPlaceholder_Maxie(void) +{ + return gExpandedPlaceholder_Maxie; +} + +static u8 *ExpandPlaceholder_Archie(void) +{ + return gExpandedPlaceholder_Archie; +} + +static u8 *ExpandPlaceholder_Groudon(void) +{ + return gExpandedPlaceholder_Groudon; +} + +static u8 *ExpandPlaceholder_Kyogre(void) +{ + return gExpandedPlaceholder_Kyogre; +} + +u8 *GetExpandedPlaceholder(u32 id) +{ + typedef u8 *(*ExpandPlaceholderFunc)(void); + + static const ExpandPlaceholderFunc funcs[] = + { + ExpandPlaceholder_UnknownStringVar, + ExpandPlaceholder_PlayerName, + ExpandPlaceholder_StringVar1, + ExpandPlaceholder_StringVar2, + ExpandPlaceholder_StringVar3, + ExpandPlaceholder_KunChan, + ExpandPlaceholder_RivalName, + ExpandPlaceholder_Version, + ExpandPlaceholder_Magma, + ExpandPlaceholder_Aqua, + ExpandPlaceholder_Maxie, + ExpandPlaceholder_Archie, + ExpandPlaceholder_Groudon, + ExpandPlaceholder_Kyogre, + }; + + if (id >= ARRAY_COUNT(funcs)) + return gExpandedPlaceholder_Empty; + else + return funcs[id](); +} + +u8 *StringFill(u8 *dest, u8 c, u16 n) +{ + u16 i; + + for (i = 0; i < n; i++) + *dest++ = c; + + *dest = EOS; + return dest; +} + +u8 *StringCopyPadded(u8 *dest, const u8 *src, u8 c, u16 n) +{ + while (*src != EOS) + { + *dest++ = *src++; + + if (n) + n--; + } + + n--; + + while (n != (u16)-1) + { + *dest++ = c; + n--; + } + + *dest = EOS; + return dest; +} + +u8 *StringFillWithTerminator(u8 *dest, u16 n) +{ + return StringFill(dest, EOS, n); +} + +u8 *StringCopyN_Multibyte(u8 *dest, u8 *src, u32 n) +{ + u32 i; + + for (i = n - 1; i != (u32)-1; i--) + { + if (*src == EOS) + { + break; + } + else + { + *dest++ = *src++; + if (*(src - 1) == 0xF9) + *dest++ = *src++; + } + } + + *dest = EOS; + return dest; +} + +u32 StringLength_Multibyte(u8 *str) +{ + u32 length = 0; + + while (*str != EOS) + { + if (*str == 0xF9) + str++; + str++; + length++; + } + + return length; +} + +u8 *WriteColorChangeControlCode(u8 *dest, u32 colorType, u8 color) +{ + *dest = 0xFC; + dest++; + + switch (colorType) + { + case 0: + *dest = 1; + dest++; + break; + case 1: + *dest = 3; + dest++; + break; + case 2: + *dest = 2; + dest++; + break; + } + + *dest = color; + dest++; + *dest = EOS; + return dest; +} + +u8 GetExtCtrlCodeLength(u8 code) +{ + static const u8 lengths[] = + { + 1, + 2, + 2, + 2, + 4, + 2, + 2, + 1, + 2, + 1, + 1, + 3, + 2, + 2, + 2, + 1, + 3, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 1, + }; + + u8 length = 0; + if (code < ARRAY_COUNT(lengths)) + length = lengths[code]; + return length; +} + +static const u8 *SkipExtCtrlCode(const u8 *s) +{ + while (*s == 0xFC) + { + s++; + s += GetExtCtrlCodeLength(*s); + } + + return s; +} + +s32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2) +{ + s32 retVal = 0; + + while (1) + { + str1 = SkipExtCtrlCode(str1); + str2 = SkipExtCtrlCode(str2); + + if (*str1 > *str2) + break; + + if (*str1 < *str2) + { + retVal = -1; + if (*str2 == 0xFF) + retVal = 1; + } + + if (*str1 == 0xFF) + return retVal; + + str1++; + str2++; + } + + retVal = 1; + + if (*str1 == 0xFF) + retVal = -1; + + return retVal; +} + +void ConvertInternationalString(u8 *s, u8 language) +{ + if (language == LANGUAGE_JAPANESE) + { + u8 i; + + StripExtCtrlCodes(s); + i = StringLength(s); + s[i++] = 0xFC; + s[i++] = 22; + s[i++] = 0xFF; + + i--; + + while (i != (u8)-1) + { + s[i + 2] = s[i]; + i--; + } + + s[0] = 0xFC; + s[1] = 21; + } +} + +void StripExtCtrlCodes(u8 *str) +{ + u16 srcIndex = 0; + u16 destIndex = 0; + while (str[srcIndex] != 0xFF) + { + if (str[srcIndex] == 0xFC) + { + srcIndex++; + srcIndex += GetExtCtrlCodeLength(str[srcIndex]); + } + else + { + str[destIndex++] = str[srcIndex++]; + } + } + str[destIndex] = 0xFF; +} |