diff --git a/asm/code_80A26CC_1.s b/asm/code_80A26CC_1.s index 23ce59134..9b367c157 100644 --- a/asm/code_80A26CC_1.s +++ b/asm/code_80A26CC_1.s @@ -5,415 +5,8 @@ .text - thumb_func_start sub_80A2B40 -sub_80A2B40: - push {r4-r6,lr} - adds r5, r0, 0 - ldr r2, _080A2BFC - adds r0, r5, r2 - ldm r1!, {r2-r4} - stm r0!, {r2-r4} - ldm r1!, {r2-r4} - stm r0!, {r2-r4} - ldr r3, _080A2C00 - adds r0, r5, r3 - movs r4, 0 - ldrsh r1, [r0, r4] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 1 - movs r1, 0x6 - bl MemoryAlloc - movs r2, 0xA9 - lsls r2, 3 - adds r1, r5, r2 - str r0, [r1] - movs r6, 0 - movs r3, 0xA7 - lsls r3, 3 - adds r0, r5, r3 - movs r4, 0 - ldrsh r0, [r0, r4] - cmp r6, r0 - bge _080A2BC0 -_080A2B7C: - lsls r4, r6, 2 - ldr r0, _080A2C04 - adds r2, r5, r0 - adds r2, r4 - ldr r1, _080A2C08 - adds r0, r5, r1 - movs r3, 0 - ldrsh r0, [r0, r3] - adds r1, r6, 0x2 - adds r0, r1 - lsls r0, 11 - ldr r1, _080A2C0C - adds r0, r1 - str r0, [r2] - ldr r1, _080A2C10 - adds r0, r5, r1 - movs r2, 0 - ldrsh r0, [r0, r2] - lsls r0, 7 - movs r1, 0x6 - bl MemoryAlloc - ldr r3, _080A2C14 - adds r1, r5, r3 - adds r1, r4 - str r0, [r1] - adds r6, 0x1 - movs r4, 0xA7 - lsls r4, 3 - adds r0, r5, r4 - movs r1, 0 - ldrsh r0, [r0, r1] - cmp r6, r0 - blt _080A2B7C -_080A2BC0: - cmp r6, 0x1 - bgt _080A2BD8 - movs r1, 0 - lsls r0, r6, 2 - ldr r2, _080A2C14 - adds r0, r2 - adds r0, r5 -_080A2BCE: - str r1, [r0, 0x8] - stm r0!, {r1} - adds r6, 0x1 - cmp r6, 0x1 - ble _080A2BCE -_080A2BD8: - movs r3, 0xA8 - lsls r3, 3 - adds r0, r5, r3 - ldr r1, [r0] - cmp r1, 0 - beq _080A2C20 - ldr r4, _080A2C18 - adds r0, r5, r4 - movs r1, 0 - ldrsh r0, [r0, r1] - lsls r0, 8 - movs r1, 0x6 - bl MemoryAlloc - ldr r2, _080A2C1C - adds r1, r5, r2 - str r0, [r1] - b _080A2C26 - .align 2, 0 -_080A2BFC: .4byte 0x0000052c -_080A2C00: .4byte 0x00000534 -_080A2C04: .4byte 0x00000554 -_080A2C08: .4byte 0x00000536 -_080A2C0C: .4byte gBgTilemaps -_080A2C10: .4byte 0x0000053c -_080A2C14: .4byte 0x0000054c -_080A2C18: .4byte 0x0000053a -_080A2C1C: .4byte 0x00000544 -_080A2C20: - ldr r3, _080A2CF0 - adds r0, r5, r3 - str r1, [r0] -_080A2C26: - movs r4, 0x86 - lsls r4, 3 - adds r0, r5, r4 - movs r1, 0 - str r1, [r0] - ldr r2, _080A2CF4 - adds r0, r5, r2 - str r1, [r0] - movs r3, 0x87 - lsls r3, 3 - adds r0, r5, r3 - str r1, [r0] - adds r4, 0xC - adds r0, r5, r4 - str r1, [r0] - adds r2, 0xC - adds r0, r5, r2 - str r1, [r0] - adds r3, 0xF2 - adds r0, r5, r3 - strb r1, [r0] - adds r4, 0x8 - adds r2, r5, r4 - ldr r0, _080A2CF8 - strh r0, [r2] - movs r2, 0x8D - lsls r2, 3 - adds r0, r5, r2 - str r1, [r0] - subs r3, 0xE2 - adds r0, r5, r3 - strb r1, [r0] - adds r4, 0x5 - adds r0, r5, r4 - strb r1, [r0] - subs r2, 0x1E - adds r0, r5, r2 - strb r1, [r0] - adds r3, 0x3 - adds r0, r5, r3 - strb r1, [r0] - adds r4, 0x3 - adds r0, r5, r4 - strb r1, [r0] - adds r2, 0x3 - adds r0, r5, r2 - strb r1, [r0] - adds r2, r5, 0 - adds r3, 0x21 - adds r0, r5, r3 - str r1, [r0] - adds r4, 0x24 - adds r0, r5, r4 - strb r1, [r0] - adds r3, 0x5 - adds r0, r5, r3 - strb r1, [r0] - movs r0, 0 - movs r1, 0xD -_080A2C9C: - strh r0, [r2] - strh r0, [r2, 0x2] - str r0, [r2, 0x8] - str r0, [r2, 0x4] - subs r1, 0x1 - adds r2, 0x10 - cmp r1, 0 - bge _080A2C9C - movs r1, 0 - movs r4, 0xF8 - lsls r4, 2 - adds r0, r5, r4 - movs r2, 0x1 -_080A2CB6: - strb r1, [r0] - strb r1, [r0, 0x1] - strh r1, [r0, 0x2] - strh r1, [r0, 0x4] - str r1, [r0, 0x8] - str r1, [r0, 0xC] - str r1, [r0, 0x14] - str r1, [r0, 0x10] - str r1, [r0, 0x1C] - str r1, [r0, 0x18] - str r1, [r0, 0x20] - str r1, [r0, 0x24] - adds r0, 0x28 - subs r2, 0x1 - cmp r2, 0 - bge _080A2CB6 - movs r4, 0 -_080A2CD8: - adds r0, r5, 0 - adds r1, r4, 0 - ldr r2, _080A2CFC - bl sub_80A456C - adds r4, 0x1 - cmp r4, 0x1 - ble _080A2CD8 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080A2CF0: .4byte 0x00000544 -_080A2CF4: .4byte 0x00000434 -_080A2CF8: .4byte 0x0000ffff -_080A2CFC: .4byte gUnknown_81172B8 - thumb_func_end sub_80A2B40 - thumb_func_start sub_80A2D00 -sub_80A2D00: - push {r4-r7,lr} - adds r6, r0, 0 - bl sub_80A2DD4 - ldr r0, _080A2D5C - adds r4, r6, r0 - ldr r0, [r4] - cmp r0, 0 - beq _080A2D1A - bl MemoryFree - movs r0, 0 - str r0, [r4] -_080A2D1A: - movs r1, 0xA9 - lsls r1, 3 - adds r4, r6, r1 - ldr r0, [r4] - bl MemoryFree - movs r0, 0 - str r0, [r4] - movs r5, 0 - movs r7, 0 -_080A2D2E: - lsls r2, r5, 2 - ldr r1, _080A2D60 - adds r0, r6, r1 - adds r1, r0, r2 - ldr r0, [r1] - cmp r0, 0 - beq _080A2D3E - str r7, [r1] -_080A2D3E: - ldr r1, _080A2D64 - adds r0, r6, r1 - adds r4, r0, r2 - ldr r0, [r4] - cmp r0, 0 - beq _080A2D50 - bl MemoryFree - str r7, [r4] -_080A2D50: - adds r5, 0x1 - cmp r5, 0x1 - ble _080A2D2E - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080A2D5C: .4byte 0x00000544 -_080A2D60: .4byte 0x00000554 -_080A2D64: .4byte 0x0000054c - thumb_func_end sub_80A2D00 - thumb_func_start sub_80A2D68 -sub_80A2D68: - push {r4,lr} - ldr r1, _080A2D84 - adds r4, r0, r1 - ldr r0, [r4] - cmp r0, 0 - beq _080A2D7C - bl MemoryFree - movs r0, 0 - str r0, [r4] -_080A2D7C: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080A2D84: .4byte 0x00000544 - thumb_func_end sub_80A2D68 - - thumb_func_start sub_80A2D88 -sub_80A2D88: - push {r4-r7,lr} - adds r6, r0, 0 - movs r0, 0xA8 - lsls r0, 3 - adds r7, r6, r0 - ldr r0, [r7] - cmp r0, 0 - beq _080A2DC6 - movs r1, 0x89 - lsls r1, 3 - adds r5, r6, r1 - ldr r2, _080A2DCC - adds r4, r6, r2 - movs r1, 0 - ldrsh r0, [r4, r1] - lsls r0, 8 - movs r1, 0x6 - bl MemoryAlloc - ldr r2, _080A2DD0 - adds r1, r6, r2 - str r0, [r1] - subs r2, 0xDC - adds r1, r6, r2 - ldr r1, [r1] - movs r2, 0 - ldrsh r3, [r4, r2] - ldr r4, [r7] - adds r2, r5, 0 - bl _call_via_r4 -_080A2DC6: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080A2DCC: .4byte 0x0000053a -_080A2DD0: .4byte 0x00000544 - thumb_func_end sub_80A2D88 - - thumb_func_start sub_80A2DD4 -sub_80A2DD4: - push {r4-r6,lr} - adds r6, r0, 0 - movs r0, 0xFA - lsls r0, 2 - adds r4, r6, r0 - movs r5, 0x1 -_080A2DE0: - ldr r0, [r4] - cmp r0, 0 - beq _080A2DEE - bl CloseFile - movs r0, 0 - str r0, [r4] -_080A2DEE: - adds r4, 0x28 - subs r5, 0x1 - cmp r5, 0 - bge _080A2DE0 - ldr r0, _080A2E5C - adds r4, r6, r0 - ldr r0, [r4] - cmp r0, 0 - beq _080A2E08 - bl CloseFile - movs r0, 0 - str r0, [r4] -_080A2E08: - movs r0, 0x88 - lsls r0, 3 - adds r4, r6, r0 - ldr r0, [r4] - cmp r0, 0 - beq _080A2E1C - bl CloseFile - movs r0, 0 - str r0, [r4] -_080A2E1C: - movs r0, 0x86 - lsls r0, 3 - adds r4, r6, r0 - ldr r0, [r4] - cmp r0, 0 - beq _080A2E30 - bl CloseFile - movs r0, 0 - str r0, [r4] -_080A2E30: - ldr r0, _080A2E60 - adds r4, r6, r0 - ldr r0, [r4] - cmp r0, 0 - beq _080A2E42 - bl CloseFile - movs r0, 0 - str r0, [r4] -_080A2E42: - movs r0, 0x87 - lsls r0, 3 - adds r4, r6, r0 - ldr r0, [r4] - cmp r0, 0 - beq _080A2E56 - bl CloseFile - movs r0, 0 - str r0, [r4] -_080A2E56: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080A2E5C: .4byte 0x0000043c -_080A2E60: .4byte 0x00000434 - thumb_func_end sub_80A2DD4 thumb_func_start sub_80A2E64 sub_80A2E64: diff --git a/include/file_system.h b/include/file_system.h index 2b917cce2..566c48f46 100644 --- a/include/file_system.h +++ b/include/file_system.h @@ -12,4 +12,12 @@ OpenedFile *OpenFileAndGetFileDataPtr(const u8 *filename, const FileArchive *arc u32 sub_800A8F8(u32 value); +#define CLOSE_FILE_AND_SET_NULL(filePtr) \ +{ \ + CloseFile(filePtr); \ + filePtr = NULL; \ +} + +#define TRY_CLOSE_FILE_AND_SET_NULL(filePtr) if (filePtr != NULL) CLOSE_FILE_AND_SET_NULL(filePtr) + #endif //GUARD_FILE_SYSTEM_H diff --git a/include/ground_map.h b/include/ground_map.h index 8f48d1354..95c6395cb 100644 --- a/include/ground_map.h +++ b/include/ground_map.h @@ -1,10 +1,82 @@ #ifndef GUARD_GROUND_MAP_H #define GUARD_GROUND_MAP_H +#include "structs/str_file_system.h" + +typedef struct SubStruct_0 +{ + u16 unk0; + u16 unk2; + s32 unk4; + s32 unk8; + u8 fillC; +} SubStruct_0; + +typedef struct SubStruct_3E0 +{ + u8 unk0; + u8 unk1; + u16 unk2; + u16 unk4; + OpenedFile *unk8; + s32 unkC; + s32 unk10; + s32 unk12; + s32 unk14; + s32 unk1C; + s32 unk20; + s32 unk24; +} SubStruct_3E0; + +// size: 0x18? +typedef struct SubStruct_52C +{ + u8 fill0[8]; // 0x52C + s16 unk8; // 0x534 + s16 unkA; // 0x536 + s16 unkC; // 0x538 + s16 unkE; // 0x53A + s16 unk10; // 0x53C + s16 unk12; // 0x53E + void (*unk14)(void *, s32, void *, s32); // TODO: fix void * to proper ptr types 0x540 +} SubStruct_52C; + +#define UNK_0_ARR_COUNT 14 +#define UNK_3E0_ARR_COUNT 2 + +#define UNK_54C_ARR_COUNT 2 + // size: 0x55C typedef struct unkStruct_3001B70 { - u8 fill0[0x55C - 0x0]; + SubStruct_0 unk0[UNK_0_ARR_COUNT]; + u8 fillUnk[0x300]; + SubStruct_3E0 unk3E0[UNK_3E0_ARR_COUNT]; + OpenedFile *unk430; + OpenedFile *unk434; + OpenedFile *unk438; + OpenedFile *unk43C; + OpenedFile *unk440; + s16 unk444; + u8 fill446[2]; + u8 unk448; + u8 unk449; + u8 unk44A; + u8 unk44B; + u8 unk44C; + u8 unk44D; + u8 fill44E[0x468-0x44E]; + s32 unk468; + s32 unk46C; + u8 unk470; + u8 unk471; + u8 fill472[0x52A-0x472]; + u8 unk52A; + SubStruct_52C unk52C; + void *unk544; + void *unk548; + void *unk54C[UNK_54C_ARR_COUNT]; + u16 *unk554[UNK_54C_ARR_COUNT]; } unkStruct_3001B70; extern unkStruct_3001B70 *gGroundMapDungeon_3001B70; @@ -16,4 +88,4 @@ void FreeGroundMapAction(void); void sub_80A4B38(void); void sub_80A4B54(void); -#endif // GUARD_GROUND_MAP_H \ No newline at end of file +#endif // GUARD_GROUND_MAP_H diff --git a/include/memory.h b/include/memory.h index 98065e07d..5d3951b29 100644 --- a/include/memory.h +++ b/include/memory.h @@ -13,4 +13,12 @@ void MemoryCopy32(u32 *dest, u32 *src, s32 size); void *MemoryAlloc(s32 size, s32 group); void MemoryFree(void *a); +#define FREE_AND_SET_NULL(ptr) \ +{ \ + MemoryFree(ptr); \ + ptr = NULL; \ +} + +#define TRY_FREE_AND_SET_NULL(ptr) if (ptr != NULL) FREE_AND_SET_NULL(ptr) + #endif // GUARD_MEMORY_H diff --git a/src/code_80A26CC.c b/src/code_80A26CC.c index 8425b167f..52f8f2281 100644 --- a/src/code_80A26CC.c +++ b/src/code_80A26CC.c @@ -462,3 +462,129 @@ UNUSED static const u8 *sub_80A2B28(u16 r0) { return sub_80A2B18(GetScriptVarValue(NULL, GROUND_PLACE)); } + +#include "ground_map.h" +#include "text_1.h" +#include "memory.h" +#include "file_system.h" + +extern void sub_80A456C(unkStruct_3001B70 *, u32, const PixelPos *); +extern const PixelPos gUnknown_81172B8; + +void sub_80A2B40(unkStruct_3001B70 *mapPtr, const SubStruct_52C *a1) +{ + SubStruct_0 *unk0Ptr; + s32 id, unk0Id, unk3E0Id; + s32 i; + + mapPtr->unk52C = *a1; + mapPtr->unk548 = MemoryAlloc(mapPtr->unk52C.unk8 * 18, 6); + for (id = 0; id < mapPtr->unk52C.unkC; id++) { + mapPtr->unk554[id] = &gBgTilemaps[2 + mapPtr->unk52C.unkA + id][0][0]; + mapPtr->unk54C[id] = MemoryAlloc(mapPtr->unk52C.unk10 * 128, 6); + } + for (; id < UNK_54C_ARR_COUNT; id++) { + mapPtr->unk554[id] = NULL; + mapPtr->unk54C[id] = NULL; + } + + if (mapPtr->unk52C.unk14 != NULL) { + mapPtr->unk544 = MemoryAlloc(mapPtr->unk52C.unkE * 256, 6); + } + else { + mapPtr->unk544 = NULL; + } + + mapPtr->unk430 = NULL; + mapPtr->unk434 = NULL; + mapPtr->unk438 = NULL; + mapPtr->unk43C = NULL; + mapPtr->unk440 = NULL; + mapPtr->unk52A = 0; + mapPtr->unk444 = -1; + mapPtr->unk468 = 0; + mapPtr->unk448 = 0; + mapPtr->unk449 = 0; + mapPtr->unk44A = 0; + mapPtr->unk44B = 0; + mapPtr->unk44C = 0; + mapPtr->unk44D = 0; + unk0Ptr = &mapPtr->unk0[0]; + mapPtr->unk46C = 0; + mapPtr->unk470 = 0; + mapPtr->unk471 = 0; + + for (unk0Id = 0; unk0Id < UNK_0_ARR_COUNT; unk0Id++, unk0Ptr++) { + unk0Ptr->unk0 = 0; + unk0Ptr->unk2 = 0; + unk0Ptr->unk8 = 0; + unk0Ptr->unk4 = 0; + } + + for (unk3E0Id = 0; unk3E0Id < UNK_3E0_ARR_COUNT; unk3E0Id++) { + SubStruct_3E0 *unkPtr = &mapPtr->unk3E0[unk3E0Id]; + unkPtr->unk0 = 0; + unkPtr->unk1 = 0; + unkPtr->unk2 = 0; + unkPtr->unk4 = 0; + unkPtr->unk8 = NULL; + unkPtr->unkC = 0; + unkPtr->unk12 = 0; + unkPtr->unk10 = 0; + unkPtr->unk1C = 0; + unkPtr->unk14 = 0; + unkPtr->unk20 = 0; + unkPtr->unk24 = 0; + } + + for (i = 0; i < 2; i++) { + sub_80A456C(mapPtr, i, &gUnknown_81172B8); + } +} + +void sub_80A2DD4(unkStruct_3001B70 *mapPtr); + +void sub_80A2D00(unkStruct_3001B70 *mapPtr) +{ + s32 i; + + sub_80A2DD4(mapPtr); + TRY_FREE_AND_SET_NULL(mapPtr->unk544); + FREE_AND_SET_NULL(mapPtr->unk548); + + for (i = 0; i < UNK_54C_ARR_COUNT; i++) { + if (mapPtr->unk554[i] != NULL) { + mapPtr->unk554[i] = NULL; + } + TRY_FREE_AND_SET_NULL(mapPtr->unk54C[i]); + } +} + +void sub_80A2D68(unkStruct_3001B70 *mapPtr) +{ + TRY_FREE_AND_SET_NULL(mapPtr->unk544); +} + +void sub_80A2D88(unkStruct_3001B70 *mapPtr) +{ + if (mapPtr->unk52C.unk14 != NULL) { + void *unk448 = &mapPtr->unk448; + mapPtr->unk544 = MemoryAlloc(mapPtr->unk52C.unkE * 256, 6); + mapPtr->unk52C.unk14(mapPtr->unk544, mapPtr->unk468, unk448, mapPtr->unk52C.unkE); + } +} + +void sub_80A2DD4(unkStruct_3001B70 *mapPtr) +{ + s32 i; + + for (i = 0; i < UNK_3E0_ARR_COUNT; i++) { + SubStruct_3E0 *unkPtr = &mapPtr->unk3E0[i]; + TRY_CLOSE_FILE_AND_SET_NULL(unkPtr->unk8); + } + TRY_CLOSE_FILE_AND_SET_NULL(mapPtr->unk43C); + TRY_CLOSE_FILE_AND_SET_NULL(mapPtr->unk440); + TRY_CLOSE_FILE_AND_SET_NULL(mapPtr->unk430); + TRY_CLOSE_FILE_AND_SET_NULL(mapPtr->unk434); + TRY_CLOSE_FILE_AND_SET_NULL(mapPtr->unk438); +}