diff --git a/include/sections.h b/include/sections.h index 40ca6775..88c186e6 100644 --- a/include/sections.h +++ b/include/sections.h @@ -483,5 +483,6 @@ extern u32 fragment1_relocs_ROM_END[]; extern u8 _675FA0_ROM_START[]; extern u8 _675FA0_ROM_END[]; +extern u8 _783760_ROM_START[]; #endif // _SECTIONS_H_ diff --git a/src/2E110.c b/src/2E110.c index 70bfded3..6c98e8b5 100644 --- a/src/2E110.c +++ b/src/2E110.c @@ -1,15 +1,134 @@ #include "2E110.h" +#include "src/3FB0.h" +#include "src/memory.h" -#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D510.s") +static BinArchive* D_800AF740; +static char** D_800AF744; -#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D5AC.s") +void func_8002D510(void) { + s32 i; -#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D5D4.s") + D_800AF740 = func_800044F4(_783760_ROM_START, NULL, 1, 0); + D_800AF744 = main_pool_alloc(0xA8, 0); -#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D600.s") + for (i = 0; i < 42; i++) { + D_800AF744[i] = NULL; + } +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D628.s") +char* func_8002D5AC(s32 file_number) { + return (char*)func_8000484C(D_800AF740, file_number); +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D7C0.s") +void func_8002D5D4(u32 arg0, s32 arg1) { + if ((arg0 >= 0x14) && (arg0 < 0x2A)) { + D_800AF744[arg0] = arg1; + } +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D80C.s") +void func_8002D600(u32 arg0, s32 arg1) { + if ((arg0 != 0) && (arg0 < 0xA)) { + D_800AF744[arg0] = arg1; + } +} + +void func_8002D628(char* arg0, u32 arg1, s8* arg2) { + u32 i; + s32 var_s2; + s32 temp_v0; + char sp58[12]; + s8* var_s4; + char* sp54; + u32 var_s3; + + var_s2 = 0; + var_s3 = 0; + sp54 = var_s4; + var_s4 = sp54; + i = 0; + + while (i < arg1 - 1u) { + switch (var_s2) { + case 0: + temp_v0 = *arg2++; + if (temp_v0 == 0) { + goto end; + } + + if (temp_v0 == 0x23) { + temp_v0 = *arg2++; + + temp_v0 -= 0x30; + temp_v0 = (*arg2++ + (temp_v0 * 10)) - 0x30; + if ((temp_v0 > 0) && (temp_v0 < 0xA)) { + sprintf(&sp58, "%d", D_800AF744[temp_v0]); + var_s4 = &sp58; + var_s2 = 1; + continue; + } + + if ((temp_v0 >= 0x14) && (temp_v0 < 0x2A)) { + if (D_800AF744[temp_v0] != 0) { + var_s4 = D_800AF744[temp_v0]; + var_s2 = 1; + } + continue; + } + } else { + *arg0++ = temp_v0; + var_s3++; + i++; + } + break; + + case 1: + temp_v0 = *var_s4++; + if (temp_v0 == 0) { + var_s2 = 0; + } else { + *arg0++ = temp_v0; + var_s3++; + i++; + } + break; + } + } + + sp54 = var_s4; +end: + *arg0++ = 0; +} + +char* func_8002D7C0(char* arg0, s32 arg1, char** arg2, s32 file_number) { + char* sp1C; + char* sp18 = (u32)arg2 + (u32)arg2[file_number + 1]; + + if (arg0 == NULL) { + sp1C = sp18; + } else { + sp1C = arg0; + func_8002D628(arg0, arg1, sp18); + } + + return sp1C; +} + +s32 func_8002D80C(s8* arg0) { + s32 last_chr = 0; + s32 line_count = 0; + s32 chr = *arg0++; + + while (chr != 0) { + last_chr = chr; + if (chr == '\n') { + line_count++; + } + chr = *arg0++; + } + + if (last_chr != '\n') { + line_count++; + } + + return line_count; +} diff --git a/src/2E110.h b/src/2E110.h index efb513ec..b8749404 100644 --- a/src/2E110.h +++ b/src/2E110.h @@ -4,10 +4,10 @@ #include "global.h" void func_8002D510(void); -s32 func_8002D5AC(s32); -void func_8002D600(s32, s16); -char* func_8002D7C0(char* arg0, s32 arg1, s32 arg2, s32 arg3); -s32 func_8002D80C(char*); +char* func_8002D5AC(s32); +void func_8002D600(u32, s32); +char* func_8002D7C0(char* arg0, s32 arg1, char** arg2, s32 arg3); +s32 func_8002D80C(s8*); #endif // _2E110_H_ diff --git a/src/fragments/2/fragment2.c b/src/fragments/2/fragment2.c index 5927f592..6ece5996 100644 --- a/src/fragments/2/fragment2.c +++ b/src/fragments/2/fragment2.c @@ -17,7 +17,7 @@ extern u32 D_87806670[]; extern u32 D_878065B0[]; extern u32 D_87806730[]; -s32 D_87806330 = 0; +char** D_87806330 = NULL; static s32 D_8780FA20; static s32 D_8780FA24; diff --git a/src/fragments/2/fragment2.h b/src/fragments/2/fragment2.h index 0d920327..a501fd7d 100644 --- a/src/fragments/2/fragment2.h +++ b/src/fragments/2/fragment2.h @@ -8,7 +8,7 @@ typedef struct unk_func_87801684 { /* 0x04 */ s16 unk_04; } unk_func_87801684; // size = 0x8 -extern s32 D_87806330; +extern char** D_87806330; extern s16 D_87806338; extern u32* D_8780633C[]; extern u32* D_8780634C[]; diff --git a/yamls/us/rom.yaml b/yamls/us/rom.yaml index b42a26a5..6016db6c 100644 --- a/yamls/us/rom.yaml +++ b/yamls/us/rom.yaml @@ -419,7 +419,7 @@ - [0x7CD40, .rodata, 26820] - [0x7CEC0, .rodata, 29BA0] - [0x7CFD0, .rodata, 2C1C0] - - [0x7D030, rodata, rom_rodata_7D030] + - [0x7D030, .rodata, 2E110] - [0x7D040, rodata, rom_rodata_7D040] - [0x7D0F0, .rodata, 30640] - [0x7D110, rodata, rom_rodata_7D110] @@ -497,7 +497,8 @@ - {vram: 0x800AC880, type: .bss, name: 20330} - {vram: 0x800AC890, type: bss, name: unk_bss_11} - {vram: 0x800AE520, type: .bss, name: 29BA0} - - {vram: 0x800AF740, type: bss, name: unk_bss_7} + - {vram: 0x800AF740, type: .bss, name: 2E110} + - {vram: 0x800AF750, type: bss, name: unk_bss_7} - {vram: 0x800B32A0, type: .bss, name: 373A0} - {vram: 0x800FC7A0, type: .bss, name: 38BB0} - {vram: 0x800FC820, type: bss, name: unk_bss_12}