update mwasmarm patcher and decompile string_util.c (thanks Demki)

This commit is contained in:
ProjectRevoTPP 2020-04-20 10:23:05 -04:00
parent 4c5e350243
commit d866013b4e
8 changed files with 423 additions and 348 deletions

View File

@ -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 #########################

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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

143
src/string_util.c Normal file
View File

@ -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;
}

View File

@ -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;

View File

@ -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;
gUnk027FFC20 = 0x27FFC20;
gPowersOfTen = 0x20ECB24;
gDigitTable = 0x20ECB08;