diff --git a/asm/code_800D090.s b/asm/code_800D090.s index a6f1c4b42..132e51544 100644 --- a/asm/code_800D090.s +++ b/asm/code_800D090.s @@ -5,499 +5,8 @@ .text - thumb_func_start sub_800D224 -sub_800D224: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - str r0, [sp] - movs r6, 0 - ldr r0, _0800D280 - mov r12, r0 - ldr r1, _0800D284 - mov r10, r1 - movs r2, 0x2 - mov r9, r2 -_0800D240: - ldr r1, [sp] - asrs r1, r6 - movs r0, 0x1 - ands r1, r0 - adds r3, r6, 0x1 - mov r8, r3 - cmp r1, 0 - beq _0800D2CE - lsls r0, r6, 2 - ldr r1, _0800D288 - adds r2, r0, r1 - ldr r1, [r2] - adds r5, r0, 0 - cmp r1, 0x1 - bne _0800D2CE - lsls r0, r6, 5 - adds r0, r6 - lsls r0, 3 - ldr r1, _0800D28C - adds r7, r0, r1 - movs r4, 0 - mov r3, r12 - adds r0, r5, r3 - ldr r1, [r0] - mov r3, r10 - ldr r0, [r3] - lsrs r0, 1 - cmp r1, r0 - bcc _0800D290 - mov r0, r9 - str r0, [r2] - b _0800D2C4 - .align 2, 0 -_0800D280: .4byte gUnknown_202DB58 -_0800D284: .4byte gUnknown_202DB74 -_0800D288: .4byte gUnknown_202DB60 -_0800D28C: .4byte gUnknown_202D910 -_0800D290: - mov r1, r12 - adds r0, r5, r1 - ldr r3, [r0] - adds r2, r3, r4 - lsls r2, 1 - adds r2, r7 - lsls r0, r4, 1 - lsls r1, r6, 4 - adds r0, r1 - ldr r1, _0800D2E4 - adds r0, r1 - ldrh r0, [r0] - strh r0, [r2] - adds r4, 0x1 - cmp r4, 0x7 - bhi _0800D2C4 - adds r1, r3, r4 - mov r2, r10 - ldr r0, [r2] - lsrs r0, 1 - cmp r1, r0 - bcc _0800D290 - ldr r3, _0800D2E8 - adds r0, r5, r3 - mov r1, r9 - str r1, [r0] -_0800D2C4: - mov r2, r12 - adds r1, r5, r2 - ldr r0, [r1] - adds r0, 0x8 - str r0, [r1] -_0800D2CE: - mov r6, r8 - cmp r6, 0x1 - ble _0800D240 - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0800D2E4: .4byte gUnknown_202DB30 -_0800D2E8: .4byte gUnknown_202DB60 - thumb_func_end sub_800D224 - thumb_func_start sub_800D2EC -sub_800D2EC: - push {r4-r7,lr} - ldr r0, _0800D318 - mov r12, r0 - ldr r3, _0800D31C - adds r7, r3, 0 - ldr r6, _0800D320 - ldr r2, _0800D324 - adds r5, r2, 0 - adds r5, 0xE - ldr r4, _0800D328 -_0800D300: - ldr r0, [r4] - lsrs r0, 1 - ldr r1, [r7] - cmp r1, r0 - bcs _0800D32C - lsls r0, r1, 1 - add r0, r12 - ldrh r0, [r0] - strh r0, [r2] - adds r0, r1, 0x1 - str r0, [r3] - b _0800D32E - .align 2, 0 -_0800D318: .4byte gUnknown_202D808 -_0800D31C: .4byte gUnknown_202DB50 -_0800D320: .4byte 0x0000fcfc -_0800D324: .4byte gUnknown_202DB20 -_0800D328: .4byte gUnknown_202DB74 -_0800D32C: - strh r6, [r2] -_0800D32E: - adds r2, 0x2 - cmp r2, r5 - bls _0800D300 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_800D2EC - thumb_func_start sub_800D33C -sub_800D33C: - push {r4,r5,lr} - movs r5, 0 - ldr r1, _0800D370 - ldr r4, _0800D374 - ldr r0, [r4] - str r0, [r1] - ldr r0, _0800D378 - ldr r1, _0800D37C - bl sub_800D820 - adds r2, r0, 0 - str r2, [r4] - ldr r1, _0800D380 - ldrb r0, [r1] - cmp r0, 0 - bne _0800D384 - movs r0, 0x80 - lsls r0, 1 - ands r0, r2 - cmp r0, 0 - beq _0800D36A - movs r0, 0x1 - strb r0, [r1] -_0800D36A: - movs r0, 0 - b _0800D40E - .align 2, 0 -_0800D370: .4byte gUnknown_202DB6C -_0800D374: .4byte gUnknown_202DB68 -_0800D378: .4byte gUnknown_202DB20 -_0800D37C: .4byte gUnknown_202DB30 -_0800D380: .4byte gUnknown_202DB70 -_0800D384: - movs r0, 0x80 - lsls r0, 5 - ands r0, r2 - cmp r0, 0 - beq _0800D392 - movs r0, 0x3 - b _0800D40E -_0800D392: - movs r0, 0x80 - lsls r0, 6 - ands r0, r2 - cmp r0, 0 - beq _0800D3A0 - movs r0, 0x4 - b _0800D40E -_0800D3A0: - movs r0, 0x80 - lsls r0, 8 - ands r0, r2 - cmp r0, 0 - beq _0800D3BA - lsls r1, r2, 28 - lsrs r1, 28 - lsls r0, r2, 20 - lsrs r0, 28 - cmp r1, r0 - beq _0800D3BA - movs r0, 0x5 - b _0800D40E -_0800D3BA: - ldr r4, _0800D3F8 - ldr r0, _0800D3FC - ldr r2, [r4] - ldr r0, [r0] - orrs r0, r2 - movs r1, 0xE - ands r0, r1 - cmp r0, 0 - beq _0800D40C - ldr r0, _0800D400 - ldr r1, [r0] - lsls r1, 26 - lsrs r1, 30 - movs r0, 0x1 - lsls r0, r1 - ands r2, r0 - cmp r2, 0 - beq _0800D40C - bl sub_800D1E0 - ldr r0, [r4] - bl sub_800D224 - ldr r0, [r4] - bl sub_800D1C0 - lsls r0, 24 - cmp r0, 0 - beq _0800D404 - movs r0, 0x2 - b _0800D40E - .align 2, 0 -_0800D3F8: .4byte gUnknown_202DB68 -_0800D3FC: .4byte gUnknown_202DB6C -_0800D400: .4byte 0x04000128 -_0800D404: - ldr r0, [r4] - bl sub_800D2EC - movs r5, 0x1 -_0800D40C: - adds r0, r5, 0 -_0800D40E: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_800D33C - - thumb_func_start sub_800D414 -sub_800D414: - push {r4,lr} - ldr r0, _0800D468 - movs r4, 0 - str r4, [r0] - ldr r0, _0800D46C - str r4, [r0] - ldr r0, _0800D470 - strb r4, [r0] - ldr r0, _0800D474 - str r4, [r0] - ldr r0, _0800D478 - str r4, [r0] - str r4, [r0, 0x4] - ldr r0, _0800D47C - movs r1, 0x10 - bl MemoryClear16 - ldr r0, _0800D480 - movs r1, 0x20 - bl MemoryClear16 - ldr r0, _0800D484 - str r4, [r0] - ldr r0, _0800D488 - str r4, [r0] - str r4, [r0, 0x4] - ldr r0, _0800D48C - movs r1, 0x84 - lsls r1, 1 - bl MemoryClear16 - ldr r0, _0800D490 - movs r1, 0x84 - lsls r1, 2 - bl MemoryClear16 - bl sub_800D6AC - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0800D468: .4byte gUnknown_202DB68 -_0800D46C: .4byte gUnknown_202DB6C -_0800D470: .4byte gUnknown_202DB70 -_0800D474: .4byte gUnknown_202DB74 -_0800D478: .4byte gUnknown_202DB60 -_0800D47C: .4byte gUnknown_202DB20 -_0800D480: .4byte gUnknown_202DB30 -_0800D484: .4byte gUnknown_202DB50 -_0800D488: .4byte gUnknown_202DB58 -_0800D48C: .4byte gUnknown_202D808 -_0800D490: .4byte gUnknown_202D910 - thumb_func_end sub_800D414 - - thumb_func_start sub_800D494 -sub_800D494: - push {r4,lr} - ldr r0, _0800D4E4 - movs r4, 0 - str r4, [r0] - ldr r0, _0800D4E8 - str r4, [r0] - ldr r0, _0800D4EC - strb r4, [r0] - ldr r0, _0800D4F0 - str r4, [r0] - ldr r0, _0800D4F4 - str r4, [r0] - str r4, [r0, 0x4] - ldr r0, _0800D4F8 - movs r1, 0x10 - bl MemoryClear16 - ldr r0, _0800D4FC - movs r1, 0x20 - bl MemoryClear16 - ldr r0, _0800D500 - str r4, [r0] - ldr r0, _0800D504 - str r4, [r0] - str r4, [r0, 0x4] - ldr r0, _0800D508 - movs r1, 0x84 - lsls r1, 1 - bl MemoryClear16 - ldr r0, _0800D50C - movs r1, 0x84 - lsls r1, 2 - bl MemoryClear16 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0800D4E4: .4byte gUnknown_202DB68 -_0800D4E8: .4byte gUnknown_202DB6C -_0800D4EC: .4byte gUnknown_202DB70 -_0800D4F0: .4byte gUnknown_202DB74 -_0800D4F4: .4byte gUnknown_202DB60 -_0800D4F8: .4byte gUnknown_202DB20 -_0800D4FC: .4byte gUnknown_202DB30 -_0800D500: .4byte gUnknown_202DB50 -_0800D504: .4byte gUnknown_202DB58 -_0800D508: .4byte gUnknown_202D808 -_0800D50C: .4byte gUnknown_202D910 - thumb_func_end sub_800D494 - - thumb_func_start sub_800D510 -sub_800D510: - ldr r1, _0800D51C - movs r2, 0x80 - lsls r2, 8 - adds r0, r2, 0 - strh r0, [r1] - bx lr - .align 2, 0 -_0800D51C: .4byte 0x04000134 - thumb_func_end sub_800D510 - - thumb_func_start sub_800D520 -sub_800D520: - push {r4,r5,lr} - sub sp, 0x4 - mov r1, sp - movs r0, 0x1 - strh r0, [r1] - ldr r0, _0800D568 - ldrb r1, [r0] - movs r0, 0x30 - ands r0, r1 - cmp r0, 0 - bne _0800D55C - mov r1, sp - mov r0, sp - ldrh r0, [r0] - subs r0, 0x1 - strh r0, [r1] - ldrh r0, [r1] - ldr r1, _0800D56C - cmp r0, r1 - beq _0800D55C - mov r4, sp - adds r5, r1, 0 -_0800D54C: - bl VBlankIntrWait - ldrh r0, [r4] - subs r0, 0x1 - strh r0, [r4] - ldrh r0, [r4] - cmp r0, r5 - bne _0800D54C -_0800D55C: - bl sub_800D7D0 - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0800D568: .4byte 0x04000128 -_0800D56C: .4byte 0x0000ffff - thumb_func_end sub_800D520 - - thumb_func_start sub_800D570 -sub_800D570: - push {lr} - bl sub_800D7B8 - pop {r0} - bx r0 - thumb_func_end sub_800D570 - - thumb_func_start sub_800D57C -sub_800D57C: - ldr r0, _0800D584 - ldrb r0, [r0] - bx lr - .align 2, 0 -_0800D584: .4byte gUnknown_202DB70 - thumb_func_end sub_800D57C - - thumb_func_start sub_800D588 -sub_800D588: - ldr r0, _0800D598 - ldr r0, [r0] - movs r1, 0x80 - ands r0, r1 - lsls r0, 24 - lsrs r0, 24 - bx lr - .align 2, 0 -_0800D598: .4byte gUnknown_202DB68 - thumb_func_end sub_800D588 - - thumb_func_start sub_800D59C -sub_800D59C: - push {r4-r6,lr} - adds r3, r0, 0 - adds r2, r1, 0 - movs r5, 0 - ldr r6, _0800D5F4 - ldr r4, _0800D5F8 - adds r0, r2, 0x1 - movs r1, 0x2 - negs r1, r1 - ands r0, r1 - adds r0, 0x8 - str r0, [r4] - adds r0, r6, 0x4 - adds r1, r3, 0 - bl CpuCopy - ldr r0, _0800D5FC - strh r0, [r6] - strh r5, [r6, 0x2] - movs r2, 0 - ldr r0, [r4] - lsrs r0, 1 - subs r0, 0x2 - cmp r5, r0 - bcs _0800D5DE - adds r3, r0, 0 - adds r1, r6, 0 -_0800D5D2: - ldrh r0, [r1] - adds r5, r0 - adds r1, 0x2 - adds r2, 0x1 - cmp r2, r3 - bcc _0800D5D2 -_0800D5DE: - ldr r2, _0800D5F4 - mvns r1, r5 - ldr r0, _0800D5F8 - ldr r0, [r0] - lsrs r0, 1 - subs r1, r0 - strh r1, [r2, 0x2] - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0800D5F4: .4byte gUnknown_202D808 -_0800D5F8: .4byte gUnknown_202DB74 -_0800D5FC: .4byte 0x0000fdfd - thumb_func_end sub_800D59C thumb_func_start sub_800D600 sub_800D600: diff --git a/src/code_800D090.c b/src/code_800D090.c index b81f9c73e..8c1526501 100644 --- a/src/code_800D090.c +++ b/src/code_800D090.c @@ -1,5 +1,7 @@ #include "global.h" #include "music.h" +#include "memory.h" +#include "cpu.h" extern u32 gUnknown_202DB60[2]; extern u16 gUnknown_202DB30[2][8]; @@ -113,13 +115,13 @@ void nullsub_187(void) { } -u32 sub_800D1C0(void) +bool8 sub_800D1C0(u32 unused) { if(gUnknown_202DB60[0] != 2) - return 0; + return FALSE; if(gUnknown_202DB60[1] != 2) - return 0; - return 1; + return FALSE; + return TRUE; } void sub_800D1E0(void) @@ -137,3 +139,188 @@ void sub_800D1E0(void) } } } + +extern u32 gUnknown_202DB58[2]; +extern u32 gUnknown_202DB74; +extern u32 gUnknown_202DB50; +extern u16 gUnknown_202DB208[]; +extern u16 gUnknown_202D808[132]; +extern u16 gUnknown_202D910[2][132]; +extern u16 gUnknown_202DB30[2][8]; +extern u16 gUnknown_202DB20[8]; + +void sub_800D224(s32 a0) +{ + s32 i; + + for (i = 0; i < 2; i++) { + if (((a0 >> i) & 1) && gUnknown_202DB60[i] == 1) { + u32 j; + u16 *ptr = gUnknown_202D910[i]; + + for (j = 0; j < 8; j++) { + if (gUnknown_202DB58[i] + j >= gUnknown_202DB74 / 2) { + gUnknown_202DB60[i] = 2; + break; + } + ptr[gUnknown_202DB58[i] + j] = gUnknown_202DB30[i][j]; + } + + gUnknown_202DB58[i] += 8; + } + } +} + +void sub_800D2EC(u32 unused) +{ + u32 i; + u16 *ptr = gUnknown_202D808; + + for (i = 0; i < 8; i++) { + if (gUnknown_202DB50 < (gUnknown_202DB74 / 2)) { + gUnknown_202DB20[i] = ptr[gUnknown_202DB50++]; + } + else { + gUnknown_202DB20[i] = 0xFCFC; + } + } +} + +extern u32 gUnknown_202DB68; +extern s32 gUnknown_202DB6C; +extern u8 gUnknown_202DB70; + +u32 sub_800D820(u16 *a0, u16 *a1); + +s32 sub_800D33C(void) +{ + s32 ret = 0; + + gUnknown_202DB6C = gUnknown_202DB68; + gUnknown_202DB68 = sub_800D820(gUnknown_202DB20, gUnknown_202DB30[0]); + if (gUnknown_202DB70 == 0) { + if (gUnknown_202DB68 & 0x100) { + gUnknown_202DB70 = 1; + } + return 0; + } + else if (gUnknown_202DB68 & 0x1000) { + return 3; + } + else if (gUnknown_202DB68 & 0x2000) { + return 4; + } + else if (gUnknown_202DB68 & 0x8000) { + u32 bits1, bits2; + + bits1 = gUnknown_202DB68 << 28; + bits1 >>= 28; + + bits2 = gUnknown_202DB68 << 20; + bits2 >>= 28; + if (bits1 != bits2) + return 5; + } + + if (((gUnknown_202DB68 | gUnknown_202DB6C) & 0xE)) { + u32 si0Cnt = (*(vu32 *)REG_ADDR_SIOCNT); + si0Cnt <<= 26; + si0Cnt >>= 30; + if ((gUnknown_202DB68 & (1 << si0Cnt))) { + sub_800D1E0(); + sub_800D224(gUnknown_202DB68); + if (sub_800D1C0(gUnknown_202DB68)) { + return 2; + } + sub_800D2EC(gUnknown_202DB68); + ret = 1; + } + } + + return ret; +} + +void sub_800D6AC(void); +void sub_800D7D0(void); +void sub_800D7B8(void); + +static inline void ClearUnkMemory(void) +{ + gUnknown_202DB68 = 0; + gUnknown_202DB6C = 0; + gUnknown_202DB70 = 0; + gUnknown_202DB74 = 0; + gUnknown_202DB60[0] = 0; + gUnknown_202DB60[1] = 0; + MemoryClear16(gUnknown_202DB20, sizeof(gUnknown_202DB20)); + MemoryClear16(gUnknown_202DB30[0], sizeof(gUnknown_202DB30)); + gUnknown_202DB50 = 0; + gUnknown_202DB58[0] = 0; + gUnknown_202DB58[1] = 0; + MemoryClear16(gUnknown_202D808, sizeof(gUnknown_202D808)); + MemoryClear16(gUnknown_202D910[0], sizeof(gUnknown_202D910)); +} + +// These two are the same, except sub_800D414 calls an additional func +void sub_800D414(void) +{ + ClearUnkMemory(); + sub_800D6AC(); +} + +void sub_800D494(void) +{ + ClearUnkMemory(); +} + +void sub_800D510(void) +{ + REG_RCNT = 0x8000; +} + +void sub_800D520(void) +{ + vu16 var = 1; // Has to be u16, not s16 + u8 si0Cnt = (*(vu8 *)REG_ADDR_SIOCNT); // First 8 bits + + if (!(si0Cnt & 0x30)) { + while (--var != (u16) -1) { + VBlankIntrWait(); + } + } + sub_800D7D0(); +} + +void sub_800D570() +{ + sub_800D7B8(); +} + +UNUSED static u8 sub_800D57C(void) +{ + return gUnknown_202DB70; +} + +u8 sub_800D588(void) +{ + return (gUnknown_202DB68 & 0x80); +} + +void sub_800D59C(u16 *src, u32 size) +{ + u32 i; + u16 bits; + s32 count = 0; + u16 *dst = gUnknown_202D808; + + gUnknown_202DB74 = ((size + 1) & ~(1)) + 8; + CpuCopy(&dst[2], src, size); + bits = 0xFDFD; + dst[0] = bits; + dst[1] = 0; + for (i = 0; i < (gUnknown_202DB74 / 2) - 2; i++) { + count += dst[i]; + } + + gUnknown_202D808[1] = ~count - (gUnknown_202DB74 / 2); +}