summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/naming_screen.s4
-rw-r--r--asm/string_util.s1168
-rw-r--r--data/data.s42
-rw-r--r--include/global.h150
-rw-r--r--ld_script.txt3
-rw-r--r--src/string_util.c691
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;
+}