From d866013b4e5e57f185c45ede44b38cb4d654fed4 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Mon, 20 Apr 2020 10:23:05 -0400 Subject: update mwasmarm patcher and decompile string_util.c (thanks Demki) --- Makefile | 2 +- asm/rom2.s | 131 ++++++++++++++++- asm/string_util.s | 234 ------------------------------ asm/unk_020023C0.s | 154 ++++++++++---------- global.inc | 18 +-- src/string_util.c | 143 ++++++++++++++++++ tools/mwasmarm_patcher/mwasmarm_patcher.c | 84 ++++++++--- undefined_syms.txt | 5 +- 8 files changed, 423 insertions(+), 348 deletions(-) delete mode 100644 asm/string_util.s create mode 100644 src/string_util.c 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 #include -// 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; -- cgit v1.2.3