summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--asm/rom2.s131
-rw-r--r--asm/string_util.s234
-rw-r--r--asm/unk_020023C0.s154
-rw-r--r--global.inc18
-rw-r--r--src/string_util.c143
-rw-r--r--tools/mwasmarm_patcher/mwasmarm_patcher.c84
-rw-r--r--undefined_syms.txt5
8 files changed, 423 insertions, 348 deletions
diff --git a/Makefile b/Makefile
index 57488dfb..a6fd5e69 100644
--- a/Makefile
+++ b/Makefile
@@ -79,7 +79,7 @@ OBJCOPY := $(CROSS)objcopy
# ./tools/mwccarm/2.0/base/mwasmarm.exe -proc arm5te asm/arm9_thumb.s -o arm9.o
ASFLAGS = -proc arm5te
-CFLAGS = -O4,p -proc v5te -thumb -fp soft -lang c -Cpp_exceptions off -i nitro
+CFLAGS = -O4,p -proc v5te -thumb -fp soft -lang c99 -Cpp_exceptions off -i nitro
LDFLAGS = -map -nodead -w off -proc v5te -interworking -map -symtab -m Entry
####################### Other Tools #########################
diff --git a/asm/rom2.s b/asm/rom2.s
index c0ec08f4..e3c5dfc9 100644
--- a/asm/rom2.s
+++ b/asm/rom2.s
@@ -1,9 +1,138 @@
+.include "asm/macros.inc"
+
/* rom2.s TODO: Disassemble */
.section .text
-.incbin "baserom.nds", 0xD9150, 0x1747C
+.incbin "baserom.nds", 0xD9150, 0x16D3C
+
+; required to make the linker happy :
+
+ arm_func_start _u32_div_f
+_u32_div_f: ; 0x020EBE8C
+ cmp r1, #0x0
+ bxeq lr
+ cmp r0, r1
+ movcc r1, r0
+ movcc r0, #0x0
+ bxcc lr
+ mov r2, #0x1c
+ mov r3, r0, lsr #0x4
+ cmp r1, r3, lsr #0xc
+ suble r2, r2, #0x10
+ movle r3, r3, lsr #0x10
+ cmp r1, r3, lsr #0x4
+ suble r2, r2, #0x8
+ movle r3, r3, lsr #0x8
+ cmp r1, r3
+ suble r2, r2, #0x4
+ movle r3, r3, lsr #0x4
+ mov r0, r0, lsl r2
+ rsb r1, r1, #0x0
+ adds r0, r0, r0
+ add r2, r2, r2, lsl #0x1
+ add pc, pc, r2, lsl #0x2
+ mov r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ adcs r3, r1, r3, lsl #0x1
+ subcc r3, r3, r1
+ adcs r0, r0, r0
+ mov r1, r3
+ bx lr
+.incbin "baserom.nds", 0xF0070, 0x55C
.global FUN_020EC5CC
FUN_020EC5CC:
diff --git a/asm/string_util.s b/asm/string_util.s
deleted file mode 100644
index 3eafb8ef..00000000
--- a/asm/string_util.s
+++ /dev/null
@@ -1,234 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- thumb_func_start FUN_02002248
-FUN_02002248: ; 0x02002248
- ldrh r3, [r1, #0x0]
- ldr r2, _02002264 ; =0x0000FFFF
- cmp r3, r2
- beq _0200225C
-_02002250:
- add r1, r1, #0x2
- strh r3, [r0, #0x0]
- ldrh r3, [r1, #0x0]
- add r0, r0, #0x2
- cmp r3, r2
- bne _02002250
-_0200225C:
- ldr r1, _02002264 ; =0x0000FFFF
- strh r1, [r0, #0x0]
- bx lr
- nop
-_02002264: .word 0x0000FFFF
-
- thumb_func_start FUN_02002268
-FUN_02002268: ; 0x02002268
- push {r4-r5}
- mov r4, #0x0
- cmp r2, #0x0
- bls _02002280
- add r5, r0, #0x0
-_02002272:
- ldrh r3, [r1, #0x0]
- add r4, r4, #0x1
- add r1, r1, #0x2
- strh r3, [r5, #0x0]
- add r5, r5, #0x2
- cmp r4, r2
- blo _02002272
-_02002280:
- lsl r1, r2, #0x1
- add r0, r0, r1
- pop {r4-r5}
- bx lr
-
- thumb_func_start FUN_02002288
-FUN_02002288: ; 0x02002288
- ldrh r2, [r0, #0x0]
- ldr r1, _020022A0 ; =0x0000FFFF
- mov r3, #0x0
- cmp r2, r1
- beq _0200229C
-_02002292:
- add r0, r0, #0x2
- ldrh r2, [r0, #0x0]
- add r3, r3, #0x1
- cmp r2, r1
- bne _02002292
-_0200229C:
- add r0, r3, #0x0
- bx lr
- .balign 4
-_020022A0: .word 0x0000FFFF
-
- thumb_func_start FUN_020022A4
-FUN_020022A4: ; 0x020022A4
- push {r3-r4}
- ldrh r4, [r0, #0x0]
- ldrh r2, [r1, #0x0]
- cmp r4, r2
- bne _020022C6
- ldr r2, _020022CC ; =0x0000FFFF
-_020022B0:
- cmp r4, r2
- bne _020022BA
- mov r0, #0x0
- pop {r3-r4}
- bx lr
-_020022BA:
- add r0, r0, #0x2
- add r1, r1, #0x2
- ldrh r4, [r0, #0x0]
- ldrh r3, [r1, #0x0]
- cmp r4, r3
- beq _020022B0
-_020022C6:
- mov r0, #0x1
- pop {r3-r4}
- bx lr
- .balign 4
-_020022CC: .word 0x0000FFFF
-
- thumb_func_start FUN_020022D0
-FUN_020022D0: ; 0x020022D0
- push {r3-r6}
- ldrh r6, [r1, #0x0]
- ldrh r5, [r0, #0x0]
- cmp r5, r6
- bne _02002304
- ldr r3, _0200230C ; =0x0000FFFF
- add r4, r3, #0x0
-_020022DE:
- cmp r2, #0x0
- bne _020022E8
- mov r0, #0x0
- pop {r3-r6}
- bx lr
-_020022E8:
- cmp r5, r4
- bne _020022F6
- cmp r6, r3
- bne _020022F6
- mov r0, #0x0
- pop {r3-r6}
- bx lr
-_020022F6:
- add r0, r0, #0x2
- add r1, r1, #0x2
- ldrh r6, [r1, #0x0]
- ldrh r5, [r0, #0x0]
- sub r2, r2, #0x1
- cmp r5, r6
- beq _020022DE
-_02002304:
- mov r0, #0x1
- pop {r3-r6}
- bx lr
- nop
-_0200230C: .word 0x0000FFFF
-
- thumb_func_start FUN_02002310
-FUN_02002310: ; 0x02002310
- push {r3-r4}
- mov r3, #0x0
- cmp r2, #0x0
- bls _02002324
- add r4, r0, #0x0
-_0200231A:
- add r3, r3, #0x1
- strh r1, [r4, #0x0]
- add r4, r4, #0x2
- cmp r3, r2
- blo _0200231A
-_02002324:
- lsl r1, r3, #0x1
- add r0, r0, r1
- pop {r3-r4}
- bx lr
-
- thumb_func_start FUN_0200232C
-FUN_0200232C: ; 0x0200232C
- ldr r3, _02002334 ; =FUN_02002310
- add r2, r1, #0x0
- ldr r1, _02002338 ; =0x0000FFFF
- bx r3
- .balign 4
-_02002334: .word FUN_02002310
-_02002338: .word 0x0000FFFF
-
- thumb_func_start FUN_0200233C
-FUN_0200233C: ; 0x0200233C
- push {r3-r7, lr}
- add r5, r0, #0x0
- add r7, r1, #0x0
- ldr r0, _020023B4 ; =0x020ECB24
- lsl r1, r3, #0x2
- ldr r4, [r0, r1]
- add r6, r2, #0x0
- cmp r4, #0x0
- beq _020023AC
-_0200234E:
- add r0, r7, #0x0
- add r1, r4, #0x0
- blx FUN_020EBE8C
- lsl r0, r0, #0x10
- lsr r1, r0, #0x10
- add r0, r4, #0x0
- mul r0, r1
- sub r7, r7, r0
- cmp r6, #0x2
- bne _02002378
- cmp r1, #0xa
- blo _0200236C
- mov r0, #0xe2
- b _02002372
-_0200236C:
- ldr r0, _020023B8 ; =0x020ECB08
- lsl r1, r1, #0x1
- ldrh r0, [r0, r1]
-_02002372:
- strh r0, [r5, #0x0]
- add r5, r5, #0x2
- b _020023A0
-_02002378:
- cmp r1, #0x0
- bne _02002380
- cmp r4, #0x1
- bne _02002396
-_02002380:
- mov r6, #0x2
- cmp r1, #0xa
- blo _0200238A
- mov r0, #0xe2
- b _02002390
-_0200238A:
- ldr r0, _020023B8 ; =0x020ECB08
- lsl r1, r1, #0x1
- ldrh r0, [r0, r1]
-_02002390:
- strh r0, [r5, #0x0]
- add r5, r5, #0x2
- b _020023A0
-_02002396:
- cmp r6, #0x1
- bne _020023A0
- mov r0, #0x1
- strh r0, [r5, #0x0]
- add r5, r5, #0x2
-_020023A0:
- add r0, r4, #0x0
- mov r1, #0xa
- blx FUN_020EBE8C
- add r4, r0, #0x0
- bne _0200234E
-_020023AC:
- ldr r0, _020023BC ; =0x0000FFFF
- strh r0, [r5, #0x0]
- add r0, r5, #0x0
- pop {r3-r7, pc}
- .balign 4
-_020023B4: .word 0x020ECB24
-_020023B8: .word 0x020ECB08
-_020023BC: .word 0x0000FFFF
diff --git a/asm/unk_020023C0.s b/asm/unk_020023C0.s
index 33179c36..cf088d15 100644
--- a/asm/unk_020023C0.s
+++ b/asm/unk_020023C0.s
@@ -12747,7 +12747,7 @@ _020083C4:
ldr r1, [sp, #0xc]
ldr r0, [sp, #0x14]
lsl r1, r1, #0x1
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r1, #0x0
beq _020083F4
mov r0, #0xab
@@ -12766,7 +12766,7 @@ _020083C4:
_020083F4:
ldr r1, [sp, #0xc]
add r0, r4, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r1, #0x0
beq _02008416
mov r0, #0xab
@@ -12870,7 +12870,7 @@ _020084B4:
ldr r1, [sp, #0x8]
ldr r0, [sp, #0x14]
lsl r1, r1, #0x1
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r1, #0x0
beq _020084E4
mov r0, #0xab
@@ -12889,7 +12889,7 @@ _020084B4:
_020084E4:
ldr r1, [sp, #0x8]
add r0, r4, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r1, #0x0
beq _02008504
mov r0, #0xab
@@ -13066,7 +13066,7 @@ _0200862C:
ldr r1, [sp, #0x4]
ldr r0, [sp, #0x0]
lsl r1, r1, #0x1
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r1, #0x0
beq _02008654
mov r0, #0xab
@@ -13081,7 +13081,7 @@ _0200862C:
_02008654:
ldr r1, [sp, #0x4]
add r0, r4, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r1, #0x0
beq _02008672
mov r0, #0xab
@@ -19941,7 +19941,7 @@ FUN_0200B9EC: ; 0x0200B9EC
add r3, r4, #0x0
ldr r5, [sp, #0x34]
ldr r7, [sp, #0x38]
- bl FUN_0200233C
+ bl ConvertUIntToDecimalString
ldrh r1, [r6, #0x8]
ldr r0, _0200BA74 ; =0x0000FFFF
cmp r1, r0
@@ -20043,7 +20043,7 @@ FUN_0200BAAC: ; 0x0200BAAC
add r2, r3, #0x0
add r0, #0x8
add r3, r4, #0x0
- bl FUN_0200233C
+ bl ConvertUIntToDecimalString
ldrh r1, [r7, #0x8]
ldr r0, _0200BB10 ; =0x0000FFFF
cmp r1, r0
@@ -37274,7 +37274,7 @@ _02013B8A:
beq _02013BC4
bl FUN_0201B9EC
add r1, r4, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
ldr r4, [r5, #0x4]
mov r0, #0x0
mov r2, #0x1
@@ -54825,7 +54825,7 @@ _0201BB8E:
mul r0, r1
mov r1, #0x5a
lsl r1, r1, #0x2
- blx FUN_020EBE8C
+ blx _u32_div_f
lsl r0, r0, #0x10
lsr r1, r0, #0x10
_0201BBA2:
@@ -56250,7 +56250,7 @@ _0201C5DE:
lsl r2, r2, #0x4
lsl r0, r0, #0x4
mul r0, r2
- blx FUN_020EBE8C
+ blx _u32_div_f
pop {r3, pc}
.balign 4
@@ -57516,7 +57516,7 @@ _0201CF0C:
ldr r2, [sp, #0x0]
cmp r2, #0x1
bne _0201CF36
- blx FUN_020EBE8C
+ blx _u32_div_f
str r1, [r5, #0x54]
b _0201CF3E
_0201CF36:
@@ -57583,7 +57583,7 @@ _0201CF7C:
blo _0201CFB8
cmp r7, #0x4
bne _0201CFB2
- blx FUN_020EBE8C
+ blx _u32_div_f
str r1, [r5, #0x54]
b _0201CFB8
_0201CFB2:
@@ -60201,7 +60201,7 @@ _0201E2A6:
beq _0201E2B6
blx FUN_020B19C4
add r1, r4, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
pop {r4, pc}
_0201E2B6:
mov r0, #0x0
@@ -65148,7 +65148,7 @@ _02020602:
beq _02020612
blx FUN_020B19C4
add r1, r4, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
pop {r4, pc}
_02020612:
mov r0, #0x0
@@ -68130,7 +68130,7 @@ _02021B74:
_02021B80:
add r0, r6, #0x0
add r1, r4, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
lsl r0, r0, #0x10
lsr r1, r0, #0x10
add r0, r4, #0x0
@@ -68200,7 +68200,7 @@ _02021BEC:
_02021BFA:
add r0, r4, #0x0
mov r1, #0xa
- blx FUN_020EBE8C
+ blx _u32_div_f
add r4, r0, #0x0
bne _02021B80
_02021C06:
@@ -72216,14 +72216,14 @@ FUN_0202395C: ; 0x0202395C
add r4, r1, #0x0
add r5, r0, #0x0
add r0, r4, #0x0
- bl FUN_02002288
+ bl StringLength
cmp r0, #0x8
blt _02023970
bl ErrorHandling
_02023970:
add r0, r5, #0x0
add r1, r4, #0x0
- bl FUN_02002248
+ bl StringCopy
pop {r3-r5, pc}
.balign 4
@@ -72464,7 +72464,7 @@ FUN_02023AA4: ; 0x02023AA4
mov r2, #0x7
add r5, r0, #0x0
add r4, r1, #0x0
- bl FUN_020022D0
+ bl StringNotEqualN
cmp r0, #0x0
bne _02023AC0
ldr r1, [r5, #0x10]
@@ -76257,7 +76257,7 @@ FUN_02025500: ; 0x02025500
push {r3-r5, lr}
add r5, r0, #0x0
add r4, r1, #0x0
- bl FUN_020022A4
+ bl StringNotEqual
cmp r0, #0x0
bne _0202551A
ldr r1, [r5, #0x10]
@@ -76462,7 +76462,7 @@ FUN_02025658: ; 0x02025658
strb r0, [r4, #0x7]
add r0, r4, #0x0
add r0, #0x8
- bl FUN_0200232C
+ bl StringFillEOS
ldr r0, _020256A8 ; =0x0000FFFF
mov r1, #0x0
add r2, r4, #0x0
@@ -76538,7 +76538,7 @@ FUN_020256DC: ; 0x020256DC
add r1, r0, #0x0
add r0, r5, #0x0
add r0, #0x8
- bl FUN_02002248
+ bl StringCopy
add r0, r6, #0x0
bl FUN_020239CC
strb r0, [r5, #0x4]
@@ -83774,7 +83774,7 @@ _0202886A:
add r0, r6, #0x0
add r1, r5, #0x0
add r2, r7, #0x0
- bl FUN_020022D0
+ bl StringNotEqualN
cmp r0, #0x0
bne _0202887C
mov r0, #0x1
@@ -83817,7 +83817,7 @@ FUN_020288AC: ; 0x020288AC
add r0, #0x10
add r1, #0x10
mov r2, #0x8
- bl FUN_020022D0
+ bl StringNotEqualN
cmp r0, #0x0
beq _020288C4
mov r0, #0x0
@@ -83826,7 +83826,7 @@ _020288C4:
add r0, r5, #0x0
add r1, r4, #0x0
mov r2, #0x8
- bl FUN_020022D0
+ bl StringNotEqualN
cmp r0, #0x0
beq _020288D6
mov r0, #0x0
@@ -86993,21 +86993,21 @@ _02029E6C:
bls _02029EAE
add r0, r7, #0x0
mov r1, #0x3c
- blx FUN_020EBE8C
+ blx _u32_div_f
add r4, r4, r0
add r0, r7, #0x0
mov r1, #0x3c
- blx FUN_020EBE8C
+ blx _u32_div_f
add r7, r1, #0x0
cmp r4, #0x3b
bls _02029EAE
add r0, r4, #0x0
mov r1, #0x3c
- blx FUN_020EBE8C
+ blx _u32_div_f
add r6, r6, r0
add r0, r4, #0x0
mov r1, #0x3c
- blx FUN_020EBE8C
+ blx _u32_div_f
ldr r0, _02029EB8 ; =0x000003E7
add r4, r1, #0x0
cmp r6, r0
@@ -90885,18 +90885,18 @@ FUN_0202B888: ; 0x0202B888
mov r1, #0x0
str r1, [r0, #0x0]
str r1, [r0, #0x4]
- ldr r3, _0202B898 ; =FUN_0200232C
+ ldr r3, _0202B898 ; =StringFillEOS
add r0, #0x8
mov r1, #0x8
bx r3
nop
-_0202B898: .word FUN_0200232C
+_0202B898: .word StringFillEOS
thumb_func_start FUN_0202B89C
FUN_0202B89C: ; 0x0202B89C
push {r3, lr}
add r0, #0x8
- bl FUN_02002288
+ bl StringLength
cmp r0, #0x0
beq _0202B8AC
mov r0, #0x1
@@ -91024,7 +91024,7 @@ _0202B968:
mov r1, #0x1d
bl FUN_0202A150
add r1, r7, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
add r7, r0, #0x0
_0202B984:
str r7, [r5, #0x0]
@@ -91054,7 +91054,7 @@ _0202B9A0:
ldr r2, [r0, #0x28]
mov r0, #0x64
mul r0, r2
- blx FUN_020EBE8C
+ blx _u32_div_f
add r1, r0, #0x0
_0202B9C4:
str r1, [r5, #0x0]
@@ -91162,7 +91162,7 @@ FUN_0202BA80: ; 0x0202BA80
_0202BA8E:
add r0, #0x8
add r1, #0x8
- bl FUN_020022A4
+ bl StringNotEqual
cmp r0, #0x0
bne _0202BA9E
mov r0, #0x1
@@ -110996,14 +110996,14 @@ _02035010:
bne _0203502A
add r0, r6, #0x0
mov r1, #0x64
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r1, #0x0
bne _02035038
_0203502A:
mov r1, #0x19
add r0, r6, #0x0
lsl r1, r1, #0x4
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r1, #0x0
bne _0203503C
_02035038:
@@ -112485,7 +112485,7 @@ FUN_02035C18: ; 0x02035C18
add r6, r2, #0x0
bl FUN_020201DC
mov r1, #0x3
- blx FUN_020EBE8C
+ blx _u32_div_f
add r2, r0, #0x0
lsl r1, r2, #0x1
add r1, r2, r1
@@ -112531,7 +112531,7 @@ FUN_02035C78: ; 0x02035C78
add r4, r0, #0x0
bl FUN_020201DC
mov r1, #0x3
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r1, #0x1
bne _02035C9E
add r0, r4, #0x0
@@ -148719,7 +148719,7 @@ _02047E2C:
add r1, r0, #0x0
add r0, r5, #0x0
add r0, #0x3c
- bl FUN_02002248
+ bl StringCopy
add r3, r5, #0x0
add r3, #0x28
add r5, #0x90
@@ -148996,7 +148996,7 @@ FUN_020480E4: ; 0x020480E4
add r1, r0, #0x0
add r0, r4, #0x0
add r0, #0x3c
- bl FUN_02002248
+ bl StringCopy
add r3, r4, #0x0
add r3, #0x28
add r4, #0x90
@@ -175571,7 +175571,7 @@ FUN_02054C14: ; 0x02054C14
push {r4, lr}
mov r1, #0xa
add r4, r0, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r0, #0x0
bne _02054C26
mov r0, #0x1
@@ -175579,7 +175579,7 @@ FUN_02054C14: ; 0x02054C14
_02054C26:
add r0, r4, #0x0
mov r1, #0x64
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r0, #0x0
bne _02054C36
mov r0, #0x2
@@ -175588,7 +175588,7 @@ _02054C36:
mov r1, #0xfa
add r0, r4, #0x0
lsl r1, r1, #0x2
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r0, #0x0
bne _02054C48
mov r0, #0x3
@@ -175596,7 +175596,7 @@ _02054C36:
_02054C48:
ldr r1, _02054C9C ; =0x00002710
add r0, r4, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r0, #0x0
bne _02054C58
mov r0, #0x4
@@ -175604,7 +175604,7 @@ _02054C48:
_02054C58:
ldr r1, _02054CA0 ; =0x000186A0
add r0, r4, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r0, #0x0
bne _02054C68
mov r0, #0x5
@@ -175612,7 +175612,7 @@ _02054C58:
_02054C68:
ldr r1, _02054CA4 ; =0x000F4240
add r0, r4, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r0, #0x0
bne _02054C78
mov r0, #0x6
@@ -175620,7 +175620,7 @@ _02054C68:
_02054C78:
ldr r1, _02054CA8 ; =0x00989680
add r0, r4, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r0, #0x0
bne _02054C88
mov r0, #0x7
@@ -175628,7 +175628,7 @@ _02054C78:
_02054C88:
ldr r1, _02054CAC ; =0x05F5E100
add r0, r4, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r0, #0x0
bne _02054C98
mov r0, #0x8
@@ -202299,7 +202299,7 @@ FUN_020612AC: ; 0x020612AC
add r1, r0, #0x0
add r0, sp, #0x0
mov r2, #0xb
- bl FUN_02002268
+ bl StringCopyN
add r0, r5, #0x0
mov r1, #0x2
add r2, r4, #0x0
@@ -202916,7 +202916,7 @@ FUN_02061798: ; 0x02061798
strb r2, [r0, #0x6]
bl FUN_0201BA60
mov r1, #0x3
- blx FUN_020EBE8C
+ blx _u32_div_f
add r0, sp, #0x4
strb r1, [r0, #0x5]
add r0, sp, #0x8
@@ -203236,13 +203236,13 @@ FUN_020619F0: ; 0x020619F0
lsl r0, r0, #0x2
mul r0, r1
mov r1, #0xfe
- blx FUN_020EBE8C
+ blx _u32_div_f
add r0, r0, #0x5
mov r1, #0xa
- blx FUN_020EBE8C
+ blx _u32_div_f
mov r1, #0xa
add r4, r0, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
add r2, r0, #0x0
mov r0, #0x0
str r0, [sp, #0x0]
@@ -203254,7 +203254,7 @@ FUN_020619F0: ; 0x020619F0
bl FUN_0200AD38
add r0, r4, #0x0
mov r1, #0xa
- blx FUN_020EBE8C
+ blx _u32_div_f
mov r0, #0x0
add r2, r1, #0x0
str r0, [sp, #0x0]
@@ -204085,7 +204085,7 @@ _020620BE:
ble _020620D0
bl FUN_0201BA60
add r1, r4, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
add r5, r1, #0x0
b _020620D2
_020620D0:
@@ -204692,7 +204692,7 @@ FUN_0206252C: ; 0x0206252C
ble _02062552
bl FUN_0201BA60
add r1, r4, #0x0
- blx FUN_020EBE8C
+ blx _u32_div_f
add r5, r1, #0x0
b _02062554
_02062552:
@@ -210366,7 +210366,7 @@ FUN_02065178: ; 0x02065178
add r0, #0x8
mov r2, #0x8
add r5, r3, #0x0
- bl FUN_02002268
+ bl StringCopyN
ldr r0, [sp, #0x10]
str r5, [r4, #0x1c]
str r0, [r4, #0x20]
@@ -213948,7 +213948,7 @@ _02066DF4:
orr r0, r1
orr r0, r2
mov r1, #0x1c
- blx FUN_020EBE8C
+ blx _u32_div_f
lsl r0, r1, #0x10
lsr r5, r0, #0x10
add r0, r4, #0x0
@@ -216090,7 +216090,7 @@ _02067E0E:
bl FUN_0200A99C
add r0, sp, #0x34
add r1, r4, #0x0
- bl FUN_020022A4
+ bl StringNotEqual
ldr r2, [r5, #0x10]
ldr r1, _02068014 ; =0x7FFFFFFF
lsl r0, r0, #0x1f
@@ -216122,7 +216122,7 @@ _02067E40:
add r0, sp, #0x1c
add r0, #0x2
add r1, sp, #0x8
- bl FUN_020022A4
+ bl StringNotEqual
ldr r2, [r5, #0x10]
ldr r1, _02068014 ; =0x7FFFFFFF
lsl r0, r0, #0x1f
@@ -217301,7 +217301,7 @@ FUN_02068698: ; 0x02068698
mov r0, #0x64
mul r0, r1
sub r1, r6, r4
- blx FUN_020EBE8C
+ blx _u32_div_f
lsl r0, r0, #0x18
lsr r0, r0, #0x18
pop {r3-r7, pc}
@@ -217517,7 +217517,7 @@ FUN_0206885C: ; 0x0206885C
FUN_02068884: ; 0x02068884
push {r3, lr}
mov r1, #0x19
- blx FUN_020EBE8C
+ blx _u32_div_f
lsl r0, r1, #0x18
lsr r0, r0, #0x18
pop {r3, pc}
@@ -222469,7 +222469,7 @@ _0206AC08:
bne _0206AC26
ldr r1, [sp, #0xc]
add r0, r5, #0x0
- bl FUN_02002248
+ bl StringCopy
b _0206AC3E
_0206AC26:
ldr r0, [sp, #0x10]
@@ -226143,7 +226143,7 @@ FUN_0206C66C: ; 0x0206C66C
bl FUN_0202398C
add r1, r0, #0x0
add r0, r4, #0x0
- bl FUN_02002248
+ bl StringCopy
add r0, r6, #0x0
bl FUN_020239BC
str r0, [r4, #0x10]
@@ -248270,7 +248270,7 @@ _020778DE:
sub r1, #0x40
add r0, #0xd8
add r1, r4, r1
- bl FUN_020022A4
+ bl StringNotEqual
cmp r0, #0x0
beq _02077904
add r0, r4, #0x0
@@ -248289,12 +248289,12 @@ _0207790E:
add r1, r4, #0x0
add r0, r4, r0
add r1, #0xd8
- bl FUN_02002248
+ bl StringCopy
add r0, r5, #0x0
add r1, r4, #0x0
add r0, #0x1c
add r1, #0xd8
- bl FUN_02002248
+ bl StringCopy
add r1, r4, #0x0
ldr r0, [r5, #0x18]
add r1, #0xd8
@@ -248880,7 +248880,7 @@ _02077DD8:
str r0, [r4, r1]
sub r1, #0x6c
add r0, r4, r1
- bl FUN_02002288
+ bl StringLength
mov r1, #0x56
lsl r1, r1, #0x2
strh r0, [r4, r1]
@@ -250441,7 +250441,7 @@ _02078A90:
add r0, r5, #0x0
add r0, #0xd8
add r1, r5, r1
- bl FUN_02002248
+ bl StringCopy
mov r0, #0xc
str r0, [sp, #0x0]
mov r2, #0x0
@@ -252408,7 +252408,7 @@ FUN_02079A0C: ; 0x02079A0C
push {r4, lr}
add r4, r0, #0x0
mul r0, r2
- blx FUN_020EBE8C
+ blx _u32_div_f
lsl r0, r0, #0x18
lsr r0, r0, #0x18
bne _02079A22
@@ -252431,7 +252431,7 @@ FUN_02079A24: ; 0x02079A24
pop {r4, pc}
_02079A36:
mov r1, #0x5
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r4, r0
bls _02079A44
mov r0, #0x2
@@ -259240,7 +259240,7 @@ FUN_0207D0C8: ; 0x0207D0C8
lsl r0, r1, #0x10
mov r1, #0x4b
lsl r1, r1, #0x2
- blx FUN_020EBE8C
+ blx _u32_div_f
lsr r0, r0, #0x10
lsl r0, r0, #0x10
asr r0, r0, #0x10
@@ -259255,7 +259255,7 @@ _0207D0EE:
lsl r0, r1, #0x10
mov r1, #0x4b
lsl r1, r1, #0x2
- blx FUN_020EBE8C
+ blx _u32_div_f
lsr r0, r0, #0x10
lsl r0, r0, #0x10
asr r0, r0, #0x10
@@ -265473,7 +265473,7 @@ FUN_0208048C: ; 0x0208048C
add r2, r1, #0x0
bl FUN_020671BC
mov r1, #0x6
- blx FUN_020EBE8C
+ blx _u32_div_f
cmp r1, #0x5
bhi _02080510
add r0, r1, r1
@@ -270258,7 +270258,7 @@ _0208292A:
mov r1, #0x0
bl FUN_020065A4
mov r1, #0x30
- blx FUN_020EBE8C
+ blx _u32_div_f
str r0, [sp, #0x24]
ldr r1, [sp, #0x24]
add r0, r5, #0x0
diff --git a/global.inc b/global.inc
index 4ff5bac6..c5a6fb2b 100644
--- a/global.inc
+++ b/global.inc
@@ -1,6 +1,6 @@
.extern FUN_0200019E
.extern FUN_02000DF4
-.extern FUN_02000E0C
+.extern StringCopy
.extern FUN_02000E7C
.extern FUN_02000EE8
.extern FUN_02000F18
@@ -466,7 +466,7 @@
.extern FUN_020EBC30
.extern FUN_020EBC50
.extern _s32_div_f
-.extern FUN_020EBE8C
+.extern _u32_div_f
.extern FUN_020EC5CC
.extern FUN_020EC694
.extern FUN_021D74E0
@@ -943,13 +943,13 @@
.extern FUN_020020EC
.extern FUN_02002198
.extern FUN_020021AC
-.extern FUN_02002248
-.extern FUN_02002268
-.extern FUN_02002288
-.extern FUN_020022A4
-.extern FUN_020022D0
-.extern FUN_0200232C
-.extern FUN_0200233C
+.extern StringCopy
+.extern StringCopyN
+.extern StringLength
+.extern StringNotEqual
+.extern StringNotEqualN
+.extern StringFillEOS
+.extern ConvertUIntToDecimalString
.extern FUN_02002E14
.extern FUN_02002E4C
diff --git a/src/string_util.c b/src/string_util.c
new file mode 100644
index 00000000..891d945c
--- /dev/null
+++ b/src/string_util.c
@@ -0,0 +1,143 @@
+#include "nitro.h"
+
+extern u32 gPowersOfTen[]; // at 0x20ECB24
+extern u16 gDigitTable[]; // at 0x20ECB08
+
+static const u16 EOS = 0xFFFF;
+
+void StringCopy(u16 *dest, const u16 *src)
+{
+ u16 c = *src;
+ while (c != EOS)
+ {
+ src++;
+ *dest = c;
+ c = *src;
+ dest++;
+ }
+ *dest = EOS;
+}
+
+u16 *StringCopyN(u16 *dest, const u16 *src, u32 num)
+{
+ u32 copied = 0;
+ if (num > copied)
+ {
+ u16 *p = dest;
+ do
+ {
+ u16 c = *src;
+ copied++;
+ src++;
+ *p = c;
+ p++;
+ } while (num > copied);
+ }
+ return dest + num;
+}
+
+u32 StringLength(const u16 *s)
+{
+ u16 c = *s;
+ u32 len = 0;
+ while (c != EOS)
+ {
+ s++;
+ c = *s;
+ len++;
+ }
+ return len;
+}
+
+BOOL StringNotEqual(const u16 *s1, const u16 *s2)
+{
+ for (; *s1 == *s2; s1++, s2++)
+ {
+ if (*s1 == EOS)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+BOOL StringNotEqualN(const u16 *s1, const u16 *s2, u32 num)
+{
+ u16 c1, c2;
+ c2 = *s2;
+ c1 = *s1;
+ while (c1 == c2)
+ {
+ if (num == 0)
+ {
+ return FALSE;
+ }
+ if (*s1 == EOS && *s2 == EOS)
+ {
+ return FALSE;
+ }
+ s1++;
+ s2++;
+ c2 = *s2;
+ c1 = *s1;
+ num--;
+ }
+ return TRUE;
+}
+
+u16 *StringFill(u16 *dest, u16 value, u32 num)
+{
+ u32 copied = 0;
+ if (num > copied)
+ {
+ u16 *p = dest;
+ do
+ {
+ copied++;
+ *p = value;
+ p++;
+ } while (copied < num);
+ }
+ return dest + copied;
+}
+
+u16 *StringFillEOS(u16 *dest, u32 num)
+{
+ return StringFill(dest, EOS, num);
+}
+
+enum PrintingMode
+{
+ NORMAL,
+ PAD_SPACE,
+ PAD_ZEROES
+};
+
+const u16 NON_DIGIT = 0xE2;
+
+u16 *ConvertUIntToDecimalString(u16 *dest, u32 value, enum PrintingMode mode, u32 n)
+{
+ for (u32 x = gPowersOfTen[n];
+ x != 0;
+ x = x / 10)
+ {
+ u16 res = value / x;
+ value = value - x * res;
+ if (mode == PAD_ZEROES)
+ {
+ *dest = res >= 10 ? NON_DIGIT : gDigitTable[res];
+ dest++;
+ }
+ else if (res != 0 || x == 1)
+ {
+ mode = PAD_ZEROES;
+ *dest = res >= 10 ? NON_DIGIT : gDigitTable[res];
+ dest++;
+ }
+ else if (mode == PAD_SPACE)
+ {
+ *dest = 1;
+ dest++;
+ }
+ }
+ *dest = EOS;
+ return dest;
+}
diff --git a/tools/mwasmarm_patcher/mwasmarm_patcher.c b/tools/mwasmarm_patcher/mwasmarm_patcher.c
index cfea660c..2b887503 100644
--- a/tools/mwasmarm_patcher/mwasmarm_patcher.c
+++ b/tools/mwasmarm_patcher/mwasmarm_patcher.c
@@ -4,53 +4,78 @@
#include <stdarg.h>
#include <stdlib.h>
-// mwasmarm patcher v1.1
-// Patches the Metrowerk C compiler assembler to stop the line ending bug.
+// mwasmarm patcher v1.2
+// Patches the Metrowerk C compiler assembler to stop the line ending bug and the 0x400 incbin bug.
// Changelog:
// v1.1: Added patch definitions and looped over them to find the matching
// definition as well as the version.
+// v1.2: Switched to array system for applying multiple patches for compiler
+// versions and added 0x400 incbin fix for each version.
+
+struct PatchPair {
+ int offsetPatch;
+ int newByte;
+};
struct PatchDef {
char *version;
char *sha1before;
char *sha1after;
- int offsetPatch;
- int newByte;
+ struct PatchPair *patches;
+};
+
+// Patch definitions for each of the respective assembler versions.
+struct PatchPair g12BasePatches[] = {
+ { 0x57614, 0x5 },
+ { 0xD47, 0x8D },
+ {0}
+};
+
+struct PatchPair g20BasePatches[] = {
+ { 0x57644, 0x5 },
+ { 0xD47, 0x8D },
+ {0}
+};
+
+struct PatchPair g20sp2p4Patches[] = {
+ { 0x57834, 0x5 },
+ { 0xD47, 0x8D },
+ {0}
};
+// Table of definitions for each assembler version
struct PatchDef gPatchDefs[] = {
// mwasmarm 1.2/base definition
{
"mwasmarm 1.2/base",
"87f942cc0a0e90e73550d8d6f3fffcdeb5f69fa5",
- "2f1ccff22eaa443bb79235ca6477d3b86bdfd7e4",
- 0x57614,
- 0x5
+ "3395ac5decf49135d892e93a3e6dd38676025983",
+ g12BasePatches
},
// mwasmarm 2.0/base definition
{
"mwasmarm 2.0/base",
"9d63877c776245129b4727b41d3e9e63cfc9cd28",
- "f5dea73bf90791e104cb59458bebae8b08a55484",
- 0x57644,
- 0x5
+ "ef75c3fb9f8d90cb4881386c41d8dc3ab4de7153",
+ g20BasePatches
},
// mwasmarm 2.0/sp2p4 definition
{
"mwasmarm 2.0/sp2p4",
"448cb0c7f1ace4393e9a9562f819f7a9f049be83",
- "c82161527277b991a1b77e14617a93bcd19cf95c",
- 0x57834,
- 0x5
+ "caa84dd90b1987ab7b42749bd5c9dcfdcfef59f3",
+ g20sp2p4Patches
},
- {
- }
+ {0}
};
+// ---------------------------------------------------------
+// Credit to ax6 for implementation of sha1 hash functions
+// ---------------------------------------------------------
+
void sha1_process_block (const unsigned char * block, uint32_t * state);
-// Credit to ax6 for implementation
unsigned char * calculate_sha1 (const void * data, unsigned length) {
uint32_t state[5] = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0};
const char * current;
@@ -118,6 +143,10 @@ void sha1_process_block (const unsigned char * block, uint32_t * state) {
state[4] += e;
}
+// ---------------------------------------------------------
+// ax6 code end
+// ---------------------------------------------------------
+
void fatal_printf(char *str, ...) {
va_list args;
va_start(args, str);
@@ -146,21 +175,21 @@ int main(int argc, char *argv[]) {
print_help();
return 1;
} else {
- // Open the file and sha1 read it.
+ // Open the file and read it's sha1 hash.
FILE *f = fopen(argv[1], "rb+");
- if(f == NULL) {
+ if (f == NULL) {
fatal_printf("ERROR: No file detected\n");
}
int fsize = get_file_size(f);
unsigned char *string = malloc(fsize + 1);
- if(string == NULL) {
+ if (string == NULL) {
fatal_printf("ERROR: Failed to allocate string variable\n");
}
int readvar = fread(string, 1, fsize, f); // var to surpress warning
// Check if sha1 matches either known assembler hashes.
unsigned char *sha1 = calculate_sha1(string, fsize);
- if(sha1 == NULL) {
+ if (sha1 == NULL) {
fatal_printf("ERROR: Failed to retrieve sha1 hash\n");
}
free(string);
@@ -169,19 +198,26 @@ int main(int argc, char *argv[]) {
for (int i=0; i < SHA_DIGEST_LENGTH; i++) {
sprintf((unsigned char*)&(buf[i*2]), "%02x", sha1[i]);
}
+ free(sha1);
- for(int i = 0; gPatchDefs[i].sha1before != NULL; i++) {
+ // loop over each patch definition to attempt to locate a supported version and, if
+ // needed, apply the patch definitions.
+ for (int i = 0; gPatchDefs[i].sha1before != NULL; i++) {
// check if already patched for the current loop.
- if(!strcmp(buf, gPatchDefs[i].sha1after)) {
+ if (!strcmp(buf, gPatchDefs[i].sha1after)) {
printf("Supported patched version detected (%s): no action needed\n", gPatchDefs[i].version);
return 0;
} else if(!strcmp(buf, gPatchDefs[i].sha1before)) {
- fseek(f, gPatchDefs[i].offsetPatch, SEEK_SET);
- fputc(gPatchDefs[i].newByte, f);
+ // we found an unpatched version: apply the patches.
+ for (int j = 0; gPatchDefs[i].patches[j].offsetPatch != 0; j++) {
+ fseek(f, gPatchDefs[i].patches[j].offsetPatch, SEEK_SET);
+ fputc(gPatchDefs[i].patches[j].newByte, f);
+ }
printf("Supported unpatched version detected (%s): assembler patched\n", gPatchDefs[i].version);
return 0;
}
}
+ // Unable to locate supported version, quitting
fatal_printf("ERROR: Unsupported mwasmarm.exe version\n");
}
return 0;
diff --git a/undefined_syms.txt b/undefined_syms.txt
index 6b24590a..82478d71 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -385,7 +385,6 @@ _ll_udiv = 0x020EBBE8;
FUN_020EBC30 = 0x020EBC30;
FUN_020EBC50 = 0x020EBC50;
_s32_div_f = 0x020EBC80;
-FUN_020EBE8C = 0x020EBE8C;
FUN_021D74E0 = 0x021D74E0;
FUN_021D76AC = 0x021D76AC;
FUN_021D77C4 = 0x021D77C4;
@@ -851,4 +850,6 @@ gUnknown21C48B8 = 0x21C48B8;
gUnk021C4918 = 0x21C4918;
gUnk021D76C8 = 0x21D76C8;
gUnk021DBE18 = 0x21DBE18;
-gUnk027FFC20 = 0x27FFC20; \ No newline at end of file
+gUnk027FFC20 = 0x27FFC20;
+gPowersOfTen = 0x20ECB24;
+gDigitTable = 0x20ECB08;