diff options
-rw-r--r-- | asm/code_800B540.s | 88 | ||||
-rw-r--r-- | asm/code_800B5F0.s | 122 | ||||
-rw-r--r-- | asm/code_800C9CC.s | 249 | ||||
-rw-r--r-- | asm/code_800D090.s | 8 | ||||
-rw-r--r-- | asm/code_803D110.s | 6 | ||||
-rw-r--r-- | asm/code_80A26CC.s | 4 | ||||
-rw-r--r-- | include/bg.h | 18 | ||||
-rw-r--r-- | include/gba/io_reg.h | 35 | ||||
-rwxr-xr-x | ld_script.txt | 4 | ||||
-rw-r--r-- | src/code_2.c | 8 | ||||
-rw-r--r-- | src/code_800B5F0.c | 99 | ||||
-rw-r--r-- | src/code_800C9CC.c | 172 | ||||
-rw-r--r-- | src/cpu.c | 170 | ||||
-rw-r--r-- | src/main.c | 165 | ||||
-rw-r--r-- | src/music_pre.c | 55 |
15 files changed, 510 insertions, 693 deletions
diff --git a/asm/code_800B540.s b/asm/code_800B540.s deleted file mode 100644 index 2ac2395..0000000 --- a/asm/code_800B540.s +++ /dev/null @@ -1,88 +0,0 @@ - .include "constants/gba_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_800B540 -sub_800B540: - push {r4,lr} - ldr r1, _0800B5C8 - movs r2, 0 - adds r0, r1, 0 - adds r0, 0x14 -_0800B54A: - str r2, [r0] - subs r0, 0x4 - cmp r0, r1 - bge _0800B54A - bl nullsub_17 - bl sub_800BD08 - ldr r1, _0800B5CC -_0800B55C: - ldrh r0, [r1] - cmp r0, 0x9F - bls _0800B55C - ldr r4, _0800B5D0 - ldrh r0, [r4] - movs r1, 0x45 - eors r0, r1 - strh r0, [r4] - movs r2, 0x80 - lsls r2, 19 - ldrb r0, [r2] - movs r1, 0x80 - orrs r0, r1 - strb r0, [r2] - ldr r0, _0800B5D4 - bl sub_800B6B0 - ldr r1, _0800B5D8 - movs r0, 0xC1 - lsls r0, 16 - str r0, [r1] - ldrh r0, [r4] - ldr r2, _0800B5DC - adds r1, r2, 0 - orrs r0, r1 - strh r0, [r4] - ldr r1, _0800B5E0 - movs r0, 0x28 - strh r0, [r1] - ldr r1, _0800B5E4 - movs r2, 0x1 - negs r2, r2 - adds r0, r2, 0 - strh r0, [r1] - ldr r1, _0800B5E8 - movs r0, 0 - strh r0, [r1] - bl sub_800D6AC - bl sub_800D7D0 - ldr r1, _0800B5EC - movs r0, 0x1 - strb r0, [r1] - bl EnableInterrupts - ldr r1, _0800B5CC -_0800B5BA: - ldrh r0, [r1] - cmp r0, 0x9F - bls _0800B5BA - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0800B5C8: .4byte gUnknown_202D5F0 -_0800B5CC: .4byte 0x04000006 -_0800B5D0: .4byte 0x04000200 -_0800B5D4: .4byte gUnknown_80B9C00 -_0800B5D8: .4byte 0x0400010c -_0800B5DC: .4byte 0x00002045 -_0800B5E0: .4byte 0x04000004 -_0800B5E4: .4byte gUnknown_203B0AE -_0800B5E8: .4byte gUnknown_203B0AC -_0800B5EC: .4byte gInterruptsEnabled - thumb_func_end sub_800B540 - - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/code_800B5F0.s b/asm/code_800B5F0.s index cb44c31..b30e371 100644 --- a/asm/code_800B5F0.s +++ b/asm/code_800B5F0.s @@ -651,126 +651,4 @@ _0800BC08: .4byte 0x00008304 _0800BC0C: .4byte 0x04000208 thumb_func_end sub_800BB44 - thumb_func_start nullsub_17 -nullsub_17: - bx lr - thumb_func_end nullsub_17 - - thumb_func_start UpdateBGControlRegisters -UpdateBGControlRegisters: - push {r4,lr} - sub sp, 0x10 - ldr r0, _0800BC2C - ldrb r0, [r0] - cmp r0, 0x1 - bne _0800BC30 - str r0, [sp] - movs r0, 0x2 - str r0, [sp, 0x4] - movs r0, 0 - b _0800BC3A - .align 2, 0 -_0800BC2C: .4byte gUnknown_202D7FE -_0800BC30: - movs r0, 0 - str r0, [sp] - movs r0, 0x1 - str r0, [sp, 0x4] - movs r0, 0x2 -_0800BC3A: - str r0, [sp, 0x8] - movs r0, 0x3 - str r0, [sp, 0xC] - ldr r1, _0800BCA8 - ldr r2, _0800BCAC - ldrh r0, [r2, 0x4] - strh r0, [r1] - adds r1, 0x2 - ldrh r0, [r2, 0x6] - strh r0, [r1] - adds r1, 0x2 - ldr r2, _0800BCB0 - ldrh r0, [r2, 0x4] - strh r0, [r1] - adds r1, 0x2 - ldrh r0, [r2, 0x6] - strh r0, [r1] - adds r1, 0x2 - ldr r3, _0800BCB4 - ldrh r0, [r3, 0x4] - strh r0, [r1] - adds r1, 0x2 - ldrh r0, [r3, 0x6] - strh r0, [r1] - adds r1, 0x2 - ldr r2, _0800BCB8 - ldrh r0, [r2, 0x4] - strh r0, [r1] - adds r1, 0x2 - ldrh r0, [r2, 0x6] - strh r0, [r1] - ldr r2, _0800BCBC - ldr r0, [sp] - movs r4, 0xB0 - lsls r4, 6 - adds r1, r4, 0 - orrs r0, r1 - strh r0, [r2] - adds r2, 0x2 - ldr r0, [sp, 0x4] - movs r4, 0xB4 - lsls r4, 6 - adds r1, r4, 0 - orrs r0, r1 - strh r0, [r2] - ldrh r1, [r3, 0x2] - movs r0, 0x80 - lsls r0, 8 - cmp r1, r0 - bne _0800BCC8 - ldr r0, _0800BCC0 - ldr r1, [sp, 0x8] - ldr r3, _0800BCC4 - adds r2, r3, 0 - b _0800BCD2 - .align 2, 0 -_0800BCA8: .4byte 0x04000010 -_0800BCAC: .4byte gUnknown_202D698 -_0800BCB0: .4byte gUnknown_202D6A0 -_0800BCB4: .4byte gUnknown_202D6A8 -_0800BCB8: .4byte gUnknown_202D6B0 -_0800BCBC: .4byte 0x04000008 -_0800BCC0: .4byte 0x0400000c -_0800BCC4: .4byte 0x00002e08 -_0800BCC8: - ldr r0, _0800BCF4 - ldr r1, [sp, 0x8] - movs r4, 0xB8 - lsls r4, 6 - adds r2, r4, 0 -_0800BCD2: - orrs r1, r2 - strh r1, [r0] - ldr r2, _0800BCF8 - ldr r0, [sp, 0xC] - ldr r3, _0800BCFC - adds r1, r3, 0 - orrs r0, r1 - strh r0, [r2] - ldr r1, _0800BD00 - ldr r0, _0800BD04 - ldrh r0, [r0] - strh r0, [r1] - add sp, 0x10 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0800BCF4: .4byte 0x0400000c -_0800BCF8: .4byte 0x0400000e -_0800BCFC: .4byte 0x00002f08 -_0800BD00: .4byte 0x04000050 -_0800BD04: .4byte gUnknown_202D7FC - thumb_func_end UpdateBGControlRegisters - .align 2, 0 @ Don't pad with nop. diff --git a/asm/code_800C9CC.s b/asm/code_800C9CC.s deleted file mode 100644 index 8f34a57..0000000 --- a/asm/code_800C9CC.s +++ /dev/null @@ -1,249 +0,0 @@ - .include "constants/gba_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_800CD64 -sub_800CD64: - ldr r2, _0800CD7C - strb r1, [r2] - ldr r2, _0800CD80 - negs r1, r0 - orrs r1, r0 - asrs r1, 31 - movs r3, 0x80 - lsls r3, 8 - adds r0, r3, 0 - ands r1, r0 - strh r1, [r2, 0x2] - bx lr - .align 2, 0 -_0800CD7C: .4byte gUnknown_202D7FE -_0800CD80: .4byte gUnknown_202D6A8 - thumb_func_end sub_800CD64 - - thumb_func_start SetBGOBJEnableFlags -SetBGOBJEnableFlags: - push {r4,lr} - movs r3, 0x80 - lsls r3, 19 - ldrh r1, [r3] - ldr r2, _0800CDA4 - ands r2, r1 - lsls r0, 8 - movs r4, 0xF8 - lsls r4, 5 - adds r1, r4, 0 - bics r1, r0 - orrs r2, r1 - strh r2, [r3] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0800CDA4: .4byte 0x0000e0ff - thumb_func_end SetBGOBJEnableFlags - - thumb_func_start sub_800CDA8 -sub_800CDA8: - ldr r1, _0800CDBC - str r0, [r1] - ldr r2, _0800CDC0 - ldr r1, _0800CDC4 - lsls r0, 1 - adds r0, r1 - ldrh r0, [r0] - strh r0, [r2] - bx lr - .align 2, 0 -_0800CDBC: .4byte gUnknown_202D800 -_0800CDC0: .4byte gUnknown_202D7FC -_0800CDC4: .4byte gUnknown_203B0BE - thumb_func_end sub_800CDA8 - - thumb_func_start sub_800CDC8 -sub_800CDC8: - ldr r0, _0800CDD0 - ldr r0, [r0] - bx lr - .align 2, 0 -_0800CDD0: .4byte gUnknown_202D800 - thumb_func_end sub_800CDC8 - - thumb_func_start SetWindowTitle -SetWindowTitle: - bx lr - thumb_func_end SetWindowTitle - - thumb_func_start nullsub_23 -nullsub_23: - bx lr - thumb_func_end nullsub_23 - - thumb_func_start nullsub_182 -nullsub_182: - bx lr - thumb_func_end nullsub_182 - - thumb_func_start sub_800CDE0 -sub_800CDE0: - movs r0, 0x1 - bx lr - thumb_func_end sub_800CDE0 - - thumb_func_start CpuCopy -CpuCopy: - push {lr} - adds r3, r0, 0 - cmp r2, 0 - bge _0800CDEE - adds r2, 0x3 -_0800CDEE: - lsls r2, 9 - lsrs r2, 11 - movs r0, 0x80 - lsls r0, 19 - orrs r2, r0 - adds r0, r1, 0 - adds r1, r3, 0 - bl CpuSet - pop {r0} - bx r0 - thumb_func_end CpuCopy - - thumb_func_start CpuClear -CpuClear: - push {lr} - sub sp, 0x4 - adds r3, r0, 0 - movs r0, 0 - str r0, [sp] - cmp r1, 0 - bge _0800CE14 - adds r1, 0x3 -_0800CE14: - lsls r2, r1, 9 - lsrs r2, 11 - movs r0, 0xA0 - lsls r0, 19 - orrs r2, r0 - mov r0, sp - adds r1, r3, 0 - bl CpuSet - add sp, 0x4 - pop {r0} - bx r0 - thumb_func_end CpuClear - - thumb_func_start CpuFill -CpuFill: - push {lr} - sub sp, 0x4 - adds r3, r0, 0 - str r1, [sp] - cmp r2, 0 - bge _0800CE3A - adds r2, 0x3 -_0800CE3A: - lsls r2, 9 - lsrs r2, 11 - movs r0, 0xA0 - lsls r0, 19 - orrs r2, r0 - mov r0, sp - adds r1, r3, 0 - bl CpuSet - add sp, 0x4 - pop {r0} - bx r0 - thumb_func_end CpuFill - - thumb_func_start sub_800CE54 -sub_800CE54: - push {lr} - ldr r2, _0800CEC0 - ldrh r0, [r2] - movs r3, 0x80 - lsls r3, 8 - adds r1, r3, 0 - orrs r0, r1 - ldr r1, _0800CEC4 - ands r0, r1 - strh r0, [r2] - mov r8, r8 - mov r8, r8 - mov r8, r8 - mov r8, r8 - ldr r1, _0800CEC8 - ands r0, r1 - strh r0, [r2] - ldr r1, _0800CECC - ldr r2, _0800CED0 - adds r0, r2, 0 - strh r0, [r1] - adds r1, 0x2 - movs r0, 0x3D - strh r0, [r1] - adds r1, 0x6 - ldr r0, _0800CED4 - ldrh r0, [r0] - strh r0, [r1] - adds r1, 0x2 - ldr r0, _0800CED8 - ldrh r0, [r0] - strh r0, [r1] - ldr r0, _0800CEDC - ldrb r1, [r0] - cmp r1, 0 - beq _0800CEF4 - ldr r1, _0800CEE0 - ldr r0, _0800CEE4 - ldr r2, [r0] - adds r0, r2, 0x4 - str r0, [r1] - ldr r3, _0800CEE8 - str r3, [r1, 0x4] - ldr r0, _0800CEEC - str r0, [r1, 0x8] - ldr r0, [r1, 0x8] - ldrh r0, [r2] - strh r0, [r3] - subs r1, 0x6E - ldrh r0, [r2, 0x2] - strh r0, [r1] - ldr r0, _0800CEF0 - movs r1, 0xA0 - b _0800CEFE - .align 2, 0 -_0800CEC0: .4byte 0x040000ba -_0800CEC4: .4byte 0x0000cdff -_0800CEC8: .4byte 0x00007fff -_0800CECC: .4byte 0x04000048 -_0800CED0: .4byte 0x00003f3f -_0800CED4: .4byte gUnknown_202D7FC -_0800CED8: .4byte gUnknown_202D7FA -_0800CEDC: .4byte gUnknown_2026E38 -_0800CEE0: .4byte 0x040000b0 -_0800CEE4: .4byte gUnknown_2026E3C -_0800CEE8: .4byte 0x04000040 -_0800CEEC: .4byte 0xa2600002 -_0800CEF0: .4byte 0x04000044 -_0800CEF4: - ldr r0, _0800CF08 - strh r1, [r0] - adds r0, 0x2 - strh r1, [r0] - adds r0, 0x2 -_0800CEFE: - strh r1, [r0] - adds r0, 0x2 - strh r1, [r0] - pop {r0} - bx r0 - .align 2, 0 -_0800CF08: .4byte 0x04000040 - thumb_func_end sub_800CE54 - - .align 2,0 diff --git a/asm/code_800D090.s b/asm/code_800D090.s index a77aeab..3fd539a 100644 --- a/asm/code_800D090.s +++ b/asm/code_800D090.s @@ -7522,7 +7522,7 @@ sub_8010960: adds r1, r5 movs r2, 0 ldrsh r1, [r1, r2] - bl sub_800CCA0 + bl SetBG2RegOffsets ldr r1, [r6] adds r4, r1, r4 movs r2, 0 @@ -7530,7 +7530,7 @@ sub_8010960: adds r1, r5 movs r2, 0 ldrsh r1, [r1, r2] - bl sub_800CCAC + bl SetBG3RegOffsets movs r0, 0x1 bl sub_8010A88 bl sub_8010A00 @@ -9139,7 +9139,7 @@ sub_801169C: adds r1, r6 movs r3, 0 ldrsh r1, [r1, r3] - bl sub_800CCA0 + bl SetBG2RegOffsets ldr r1, [r5] adds r4, r1, r4 movs r2, 0 @@ -9147,7 +9147,7 @@ sub_801169C: adds r1, r6 movs r3, 0 ldrsh r1, [r1, r3] - bl sub_800CCAC + bl SetBG3RegOffsets bl sub_8010F28 bl sub_80111C4 lsls r0, 24 diff --git a/asm/code_803D110.s b/asm/code_803D110.s index 55aaf57..f5f9425 100644 --- a/asm/code_803D110.s +++ b/asm/code_803D110.s @@ -2567,7 +2567,7 @@ sub_803E490: adds r1, r4 movs r2, 0 ldrsh r1, [r1, r2] - bl sub_800CCA0 + bl SetBG2RegOffsets b _0803E4FC .align 2, 0 _0803E4D8: .4byte gUnknown_202EDD4 @@ -2582,7 +2582,7 @@ _0803E4EC: strb r0, [r1] movs r0, 0 movs r1, 0 - bl sub_800CCA0 + bl SetBG2RegOffsets _0803E4FC: ldr r4, _0803E62C ldr r2, [r4] @@ -2598,7 +2598,7 @@ _0803E4FC: adds r2, r3 ldr r2, [r2] subs r1, r2 - bl sub_800CCAC + bl SetBG3RegOffsets bl sub_806CC10 bl sub_804522C bl sub_803F9CC diff --git a/asm/code_80A26CC.s b/asm/code_80A26CC.s index ebc16bc..20676d2 100644 --- a/asm/code_80A26CC.s +++ b/asm/code_80A26CC.s @@ -4386,12 +4386,12 @@ _080A4998: .4byte 0x00000536 _080A499C: ldr r0, [r4, 0x48] ldr r1, [r4, 0x4C] - bl sub_800CCA0 + bl SetBG2RegOffsets b _080A49AE _080A49A6: ldr r0, [r4, 0x48] ldr r1, [r4, 0x4C] - bl sub_800CCAC + bl SetBG3RegOffsets _080A49AE: adds r6, 0x1 adds r5, 0x1 diff --git a/include/bg.h b/include/bg.h new file mode 100644 index 0000000..376fb6f --- /dev/null +++ b/include/bg.h @@ -0,0 +1,18 @@ +struct BGControlStruct +{ + u16 padding; + u16 unk2; + s16 hofs; + s16 vofs; +}; + +void SetBG0RegOffsets(s32 xoffset, s32 yoffset); +void SetBG1RegOffsets(s32 xoffset, s32 yoffset); +void SetBG2RegOffsets(s32 xoffset, s32 yoffset); +void SetBG3RegOffsets(s32 xoffset, s32 yoffset); +void SetBGRegOffsets(s32 reg, u32 xoffset, s32 yoffset); +void SetBGRegXOffset(s32 reg, s32 offset); +void SetBGRegYOffset(s32 reg, s32 offset); +void UpdateBGControlRegisters(void); +void SetBGOBJEnableFlags(u32 mask); + diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index 6dbe5e8..2453645 100644 --- a/include/gba/io_reg.h +++ b/include/gba/io_reg.h @@ -538,6 +538,41 @@ #define BGCNT_AFF512x512 0x8000 #define BGCNT_AFF1024x1024 0xC000 +// WININ/OUT +#define WININ_WIN0_BG0 (1 << 0) +#define WININ_WIN0_BG1 (1 << 1) +#define WININ_WIN0_BG2 (1 << 2) +#define WININ_WIN0_BG3 (1 << 3) +#define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3) +#define WININ_WIN0_OBJ (1 << 4) +#define WININ_WIN0_CLR (1 << 5) +#define WININ_WIN0_ALL (WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR) +#define WININ_WIN1_BG0 (1 << 8) +#define WININ_WIN1_BG1 (1 << 9) +#define WININ_WIN1_BG2 (1 << 10) +#define WININ_WIN1_BG3 (1 << 11) +#define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3) +#define WININ_WIN1_OBJ (1 << 12) +#define WININ_WIN1_CLR (1 << 13) +#define WININ_WIN1_ALL (WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR) + +#define WINOUT_WIN01_BG0 (1 << 0) +#define WINOUT_WIN01_BG1 (1 << 1) +#define WINOUT_WIN01_BG2 (1 << 2) +#define WINOUT_WIN01_BG3 (1 << 3) +#define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3) +#define WINOUT_WIN01_OBJ (1 << 4) +#define WINOUT_WIN01_CLR (1 << 5) +#define WINOUT_WIN01_ALL (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR) +#define WINOUT_WINOBJ_BG0 (1 << 8) +#define WINOUT_WINOBJ_BG1 (1 << 9) +#define WINOUT_WINOBJ_BG2 (1 << 10) +#define WINOUT_WINOBJ_BG3 (1 << 11) +#define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3) +#define WINOUT_WINOBJ_OBJ (1 << 12) +#define WINOUT_WINOBJ_CLR (1 << 13) +#define WINOUT_WINOBJ_ALL (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR) + // BLDCNT // Bits 0-5 select layers for the 1st target #define BLDCNT_TGT1_BG0 (1 << 0) diff --git a/ld_script.txt b/ld_script.txt index 5acc3f0..1d675cd 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -68,14 +68,12 @@ SECTIONS { asm/code_8009804.o(.text); src/file_system.o(.text); src/main.o(.text); - asm/code_800B540.o(.text); - src/code_800B5F0.o(.text); asm/code_800B5F0.o(.text); src/music_pre.o(.text); asm/music.o(.text); src/music.o(.text); src/code_800C9CC.o(.text); - asm/code_800C9CC.o(.text); + src/cpu.o(.text); src/flash.o(.text); src/code_800D090.o(.text); asm/code_800D090.o(.text); diff --git a/src/code_2.c b/src/code_2.c index 4e778e7..fcec96d 100644 --- a/src/code_2.c +++ b/src/code_2.c @@ -2,6 +2,7 @@ #include "file_system.h" #include "friend_area.h" #include "input.h" +#include "bg.h" extern void InitHeap(void); extern void NDS_DebugInit(void); @@ -37,8 +38,6 @@ extern void sub_80097B0(void); extern void sub_800CDA8(u32); extern void sub_800641C(u32, u32, u32); extern void LoadTitleScreen(void); -extern void sub_800CCA0(u32, u32); -extern void sub_800CCAC(u32, u32); extern void SetBGPaletteBufferColorRGB(s32, u8 *, s32, u8 *); extern void sub_800BDFC(u32); extern void sub_80095CC(u32, u32); @@ -47,7 +46,6 @@ extern void sub_8012468(void); extern u32 sub_8012484(void); extern void sub_8012558(void); extern u8 sub_80363E0(void); -extern void SetBGOBJEnableFlags(u32); extern void SetUpMenu(void); extern u32 UpdateMenu(void); extern void CleanUpMenu(void); @@ -134,8 +132,8 @@ void GameLoop(void) sub_800641C(0, 1, 1); gUnknown_2026E4E = 0x1000; LoadTitleScreen(); - sub_800CCA0(0, 0); - sub_800CCAC(0, 0); + SetBG2RegOffsets(0, 0); + SetBG3RegOffsets(0, 0); gUnknown_2000A80 = 0; while (gUnknown_2000A80 < 32) { s32 i; diff --git a/src/code_800B5F0.c b/src/code_800B5F0.c deleted file mode 100644 index 35b5282..0000000 --- a/src/code_800B5F0.c +++ /dev/null @@ -1,99 +0,0 @@ -#include "global.h" - -extern bool8 gInterruptsEnabled; -extern u32 gIntrTable[]; -extern u32 IntrMain; -extern u8 gUnknown_202D4B8; -extern u32 gUnknown_202D5F0[]; - -bool8 EnableInterrupts(void) -{ - if(gInterruptsEnabled == FALSE) - { - return FALSE; - } - - if((REG_IME & 1) != 0) - { - return FALSE; - } - else - { - REG_IME = 1; - return TRUE; - } -} - -bool8 DisableInterrupts(void) -{ - if(gInterruptsEnabled == 0) - { - return FALSE; - } - - if((REG_IME & 1) == 0) - { - return FALSE; - } - else - { - REG_IME = 0; - return TRUE; - } - -} - -bool8 sub_800B650(void) -{ - if(gInterruptsEnabled == FALSE) - { - return FALSE; - } - - if((REG_IME & 1) != 0) - { - return FALSE; - } - else - { - return TRUE; - } -} - -void SetInterruptFlag(u16 flag) -{ - if(gInterruptsEnabled == FALSE) - { - return; - } - - REG_IME = 0; - INTR_CHECK |= flag; - REG_IME = 1; -} - -void sub_800B6B0(const u32 *r0) -{ - CpuCopy32(r0, &gIntrTable, 0x18); // 0x18 = 0x6 * 4 (0x4f00 is 32 bits) - CpuCopy32(&IntrMain, &gUnknown_202D4B8, 0x120); // 0x120 = 0x48 * 4 (0x4f00 is 32 bits) - INTR_VECTOR = &gUnknown_202D4B8; -} - -u32 *sub_800B6E8(u32 r0) -{ - return &gIntrTable[r0]; -} - -u32 sub_800B6F4(u32 r0, u32 r1) -{ - u32 temp; - u32 interrupt_var; - - interrupt_var = DisableInterrupts(); - temp = gUnknown_202D5F0[r0]; - gUnknown_202D5F0[r0] = r1; - if(interrupt_var != FALSE){ - EnableInterrupts(); - } - return temp; -} diff --git a/src/code_800C9CC.c b/src/code_800C9CC.c index ddc49c6..28ce10a 100644 --- a/src/code_800C9CC.c +++ b/src/code_800C9CC.c @@ -1,23 +1,17 @@ #include "global.h" #include "input.h" - -struct unkStruct_809CC88 -{ - u16 padding; - u16 unk2; - u16 unk4; - u16 unk6; -}; +#include "bg.h" extern u16 gRawKeyInput; extern u8 gUnknown_202D6B8; extern u8 gUnknown_202D6B9; extern u16 gUnknown_202D7FA; +extern u8 gUnknown_202D7FE; -extern struct unkStruct_809CC88 gUnknown_202D698; -extern struct unkStruct_809CC88 gUnknown_202D6A0; -extern struct unkStruct_809CC88 gUnknown_202D6A8; -extern struct unkStruct_809CC88 gUnknown_202D6B0; +extern struct BGControlStruct gUnknown_202D698; +extern struct BGControlStruct gUnknown_202D6A0; +extern struct BGControlStruct gUnknown_202D6A8; +extern struct BGControlStruct gUnknown_202D6B0; void ReadKeyInput(struct Inputs *r0) { @@ -97,122 +91,86 @@ void sub_800CC44(s32 r0, s32 r1) } -void sub_800CC88(u32 r0, u32 r1) +void SetBG0RegOffsets(s32 xoffset, s32 yoffset) { - gUnknown_202D698.unk4 = r0; - gUnknown_202D698.unk6 = r1; + gUnknown_202D698.hofs = xoffset; + gUnknown_202D698.vofs = yoffset; } -void sub_800CC94(u32 r0, u32 r1) +void SetBG1RegOffsets(s32 xoffset, s32 yoffset) { - gUnknown_202D6A0.unk4 = r0; - gUnknown_202D6A0.unk6 = r1; + gUnknown_202D6A0.hofs = xoffset; + gUnknown_202D6A0.vofs = yoffset; } -void sub_800CCA0(u32 r0, u32 r1) +void SetBG2RegOffsets(s32 xoffset, s32 yoffset) { - gUnknown_202D6A8.unk4 = r0; - gUnknown_202D6A8.unk6 = r1; + gUnknown_202D6A8.hofs = xoffset; + gUnknown_202D6A8.vofs = yoffset; } -void sub_800CCAC(u32 r0, u32 r1) +void SetBG3RegOffsets(s32 xoffset, s32 yoffset) { - gUnknown_202D6B0.unk4 = r0; - gUnknown_202D6B0.unk6 = r1; + gUnknown_202D6B0.hofs = xoffset; + gUnknown_202D6B0.vofs = yoffset; } -void sub_800CCB8(s32 r0, u32 r1, u32 r2) +void SetBGRegOffsets(s32 reg, u32 xoffset, s32 yoffset) { - if(r0 == 1) - { - goto _0800CCD4; - } - if(r0 <= 1) - { - goto _0800CCCA; - } - if(r0 == 2) - { - goto _0800CCDE; + switch (reg) { + default: + case 0: return SetBG0RegOffsets(xoffset, yoffset); + case 1: return SetBG1RegOffsets(xoffset, yoffset); + case 2: return SetBG2RegOffsets(xoffset, yoffset); + case 3: return SetBG3RegOffsets(xoffset, yoffset); } - if(r0 == 3) - { - goto _0800CCE8; - } - - _0800CCCA: - sub_800CC88(r1, r2); - return; - _0800CCD4: - sub_800CC94(r1, r2); - return; - _0800CCDE: - sub_800CCA0(r1, r2); - return; - _0800CCE8: - sub_800CCAC(r1, r2); } -void sub_800CCF4(s32 r0, u32 r1) +void SetBGRegXOffset(s32 reg, s32 offset) { - if(r0 == 1) - { - goto _0800CD10; - } - if(r0 <= 1) - { - goto _0800CD06; + switch (reg) { + default: + case 0: + gUnknown_202D698.hofs = offset; + break; + case 1: + gUnknown_202D6A0.hofs = offset; + break; + case 2: + gUnknown_202D6A8.hofs = offset; + break; + case 3: + gUnknown_202D6B0.hofs = offset; + break; } - if(r0 == 2) - { - goto _0800CD18; - } - if(r0 == 3) - { - goto _0800CD20; - } - - _0800CD06: - gUnknown_202D698.unk4 = r1; - return; - _0800CD10: - gUnknown_202D6A0.unk4 = r1; - return; - _0800CD18: - gUnknown_202D6A8.unk4 = r1; - return; - _0800CD20: - gUnknown_202D6B0.unk4 = r1; } -void sub_800CD2C(s32 r0, u32 r1) +void SetBGRegYOffset(s32 reg, s32 offset) { - if(r0 == 1) - { - goto _0800CD48; - } - if(r0 <= 1) - { - goto _0800CD3E; - } - if(r0 == 2) - { - goto _0800CD50; - } - if(r0 == 3) - { - goto _0800CD58; + switch (reg) { + default: + case 0: + gUnknown_202D698.vofs = offset; + break; + case 1: + gUnknown_202D6A0.vofs = offset; + break; + case 2: + gUnknown_202D6A8.vofs = offset; + break; + case 3: + gUnknown_202D6B0.vofs = offset; + break; } +} - _0800CD3E: - gUnknown_202D698.unk6 = r1; - return; - _0800CD48: - gUnknown_202D6A0.unk6 = r1; - return; - _0800CD50: - gUnknown_202D6A8.unk6 = r1; - return; - _0800CD58: - gUnknown_202D6B0.unk6 = r1; +void sub_800CD64(s32 r0, u8 r1) +{ + gUnknown_202D7FE = r1; + gUnknown_202D6A8.unk2 = r0 ? 0x8000 : 0; +} + +void SetBGOBJEnableFlags(u32 mask) +{ + REG_DISPCNT = (REG_DISPCNT & 0xe0ff) | (~(mask << 8) & (DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON)); } diff --git a/src/cpu.c b/src/cpu.c new file mode 100644 index 0000000..eb1043a --- /dev/null +++ b/src/cpu.c @@ -0,0 +1,170 @@ +#include "global.h" + +extern u32 gUnknown_202D800; +extern u16 gUnknown_202D7FC; // used to update Blend Count Reg +extern u16 gUnknown_203B0BE[]; + +void sub_800CDA8(u32 r0) +{ + gUnknown_202D800 = r0; + gUnknown_202D7FC = gUnknown_203B0BE[r0]; +} + +u32 sub_800CDC8(void) +{ + return gUnknown_202D800; +} + +void SetWindowTitle(char *title) +{ +} + +void nullsub_23(void) +{ +} + +void nullsub_182(void) +{ +} + +u32 sub_800CDE0(void) +{ + return 1; +} + +void CpuCopy(void* src, void *dest, s32 size) +{ + CpuCopy32(dest, src, size); +} + +void CpuClear(void* dest, s32 size) +{ + CpuFill32(NULL, dest, size); +} + +void CpuFill(void* src, void *dest, s32 size) +{ + CpuFill32(dest, src, size); +} + +#ifdef NONMATCHING +void sub_800CE54(void) +{ + // TODO this is so gross.. looks like a macro or something else but I don't want to deal with this rn + REG_DMA0CNT_H = (REG_DMA0CNT_H | DMA_ENABLE) & 0xcdff; + asm("mov \tr8, r8"); + asm("mov \tr8, r8"); + asm("mov \tr8, r8"); + asm("mov \tr8, r8"); + REG_DMA0CNT_H &= 0x7fff; + + // Everything below matches + + REG_WININ = WININ_WIN0_ALL | WININ_WIN1_ALL; + REG_WINOUT = WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WIN01_BG3 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG0; + REG_BLDCNT = gUnknown_202D7FC; + REG_BLDALPHA = gUnknown_202D7FA; + if(gUnknown_2026E38 != 0) + { + DmaSet(0, &gUnknown_2026E3C[2], REG_ADDR_WIN0H, 0xa2600002); + REG_WIN0H = gUnknown_2026E3C[0]; + REG_WIN1H = gUnknown_2026E3C[1]; + REG_WIN0V = 160; + REG_WIN1V = 160; + } + else + { + REG_WIN0H = 0; + REG_WIN1H = 0; + REG_WIN0V = 0; + REG_WIN1V = 0; + } +} +#else +NAKED +void sub_800CE54(void) +{ + asm_unified("\tpush {lr}\n" + "\tldr r2, _0800CEC0\n" + "\tldrh r0, [r2]\n" + "\tmovs r3, 0x80\n" + "\tlsls r3, 8\n" + "\tadds r1, r3, 0\n" + "\torrs r0, r1\n" + "\tldr r1, _0800CEC4\n" + "\tands r0, r1\n" + "\tstrh r0, [r2]\n" + "\tmov r8, r8\n" + "\tmov r8, r8\n" + "\tmov r8, r8\n" + "\tmov r8, r8\n" + "\tldr r1, _0800CEC8\n" + "\tands r0, r1\n" + "\tstrh r0, [r2]\n" + "\tldr r1, _0800CECC\n" + "\tldr r2, _0800CED0\n" + "\tadds r0, r2, 0\n" + "\tstrh r0, [r1]\n" + "\tadds r1, 0x2\n" + "\tmovs r0, 0x3D\n" + "\tstrh r0, [r1]\n" + "\tadds r1, 0x6\n" + "\tldr r0, _0800CED4\n" + "\tldrh r0, [r0]\n" + "\tstrh r0, [r1]\n" + "\tadds r1, 0x2\n" + "\tldr r0, _0800CED8\n" + "\tldrh r0, [r0]\n" + "\tstrh r0, [r1]\n" + "\tldr r0, _0800CEDC\n" + "\tldrb r1, [r0]\n" + "\tcmp r1, 0\n" + "\tbeq _0800CEF4\n" + "\tldr r1, _0800CEE0\n" + "\tldr r0, _0800CEE4\n" + "\tldr r2, [r0]\n" + "\tadds r0, r2, 0x4\n" + "\tstr r0, [r1]\n" + "\tldr r3, _0800CEE8\n" + "\tstr r3, [r1, 0x4]\n" + "\tldr r0, _0800CEEC\n" + "\tstr r0, [r1, 0x8]\n" + "\tldr r0, [r1, 0x8]\n" + "\tldrh r0, [r2]\n" + "\tstrh r0, [r3]\n" + "\tsubs r1, 0x6E\n" + "\tldrh r0, [r2, 0x2]\n" + "\tstrh r0, [r1]\n" + "\tldr r0, _0800CEF0\n" + "\tmovs r1, 0xA0\n" + "\tb _0800CEFE\n" + "\t.align 2, 0\n" +"_0800CEC0: .4byte 0x040000ba\n" +"_0800CEC4: .4byte 0x0000cdff\n" +"_0800CEC8: .4byte 0x00007fff\n" +"_0800CECC: .4byte 0x04000048\n" +"_0800CED0: .4byte 0x00003f3f\n" +"_0800CED4: .4byte gUnknown_202D7FC\n" +"_0800CED8: .4byte gUnknown_202D7FA\n" +"_0800CEDC: .4byte gUnknown_2026E38\n" +"_0800CEE0: .4byte 0x040000b0\n" +"_0800CEE4: .4byte gUnknown_2026E3C\n" +"_0800CEE8: .4byte 0x04000040\n" +"_0800CEEC: .4byte 0xa2600002\n" +"_0800CEF0: .4byte 0x04000044\n" +"_0800CEF4:\n" + "\tldr r0, _0800CF08\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x2\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x2\n" +"_0800CEFE:\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x2\n" + "\tstrh r1, [r0]\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_0800CF08: .4byte 0x04000040"); +} +#endif @@ -5,8 +5,16 @@ extern char ewram_start[]; +extern u8 gUnknown_202D4B8; +extern void *gUnknown_202D5F0[6]; extern u16 gUnknown_202D7FC; extern u8 gUnknown_202D7FE; +extern u8 gInterruptsEnabled; +extern u16 gUnknown_203B0AC; +extern s16 gUnknown_203B0AE; +extern u32 gIntrTable[]; +extern u32 IntrMain; + extern char alt_203B038[]; @@ -21,6 +29,7 @@ extern char unk_code_ram[]; extern char unk_code_ram_end[]; extern u8 gUnknown_80B9BF1[]; +extern u32 gUnknown_80B9C00; extern char gUnknown_8270000[]; @@ -37,11 +46,20 @@ extern void sub_80057E8(void); extern void InitFileSystem(void); extern void sub_80098A0(void); extern void InitGraphics(void); -extern void sub_800B6F4(int, void *); extern void GameLoop(void); extern void Hang(void); extern void sub_800CE54(void); +extern void nullsub_17(void); +extern void sub_800BD08(void); // music initializer +extern void sub_800D6AC(void); +extern void sub_800D7D0(void); + +bool8 EnableInterrupts(void); +void InitIntrTable(const u32 *interrupt_table); +void *sub_800B6F4(u32 index, void * new_callback); + + void AgbMain(void) { u8 value[4]; @@ -76,16 +94,16 @@ void AgbMain(void) REG_WIN1H = 0; REG_WIN0V = 0; REG_WIN1V = 0; - REG_WININ = 16191; - REG_WINOUT = 61; - gUnknown_202D7FC = REG_BLDCNT = 15426; - REG_BLDALPHA = 1546; + REG_WININ = WININ_WIN0_ALL | WININ_WIN1_ALL; // 16191 + REG_WINOUT = WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR; // 61 + gUnknown_202D7FC = REG_BLDCNT = BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_BD | BLDCNT_TGT2_OBJ; // 15426 + REG_BLDALPHA = BLDALPHA_BLEND(10, 6); // 1546 gUnknown_202D7FE = 0; - REG_BG0CNT = 11264; - REG_BG1CNT = 11521; - REG_BG2CNT = 11786; - REG_BG3CNT = 12043; - REG_DISPCNT = 32704; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_WRAP | BGCNT_SCREENBASE(12); // 11264 + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_WRAP | BGCNT_SCREENBASE(13); // 11521 + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_WRAP | BGCNT_SCREENBASE(14); // 11786 + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(2) | BGCNT_WRAP | BGCNT_SCREENBASE(15); // 12043 + REG_DISPCNT = DISPCNT_WIN1_ON | DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_FORCED_BLANK; // 32704 sub_800CDA8(1); sub_800B540(); InitFlash(); @@ -102,7 +120,132 @@ void AgbMain(void) sub_80098A0(); InitGraphics(); sub_800B6F4(1, sub_800CE54); - REG_DISPCNT = 32576; + REG_DISPCNT = DISPCNT_WIN1_ON | DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP; // 32576 GameLoop(); Hang(); } + +void sub_800B540(void) +{ + s32 i; + for (i = 0; i < 6; i++) { + gUnknown_202D5F0[i] = NULL; + } + + nullsub_17(); + sub_800BD08(); // initialize music and stop DMAs + + while(REG_VCOUNT <= 159){} + + REG_IE ^= INTR_FLAG_TIMER3 | INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT; // 0x45 + + *(u8*)®_DISPCNT |= DISPCNT_FORCED_BLANK; + + InitIntrTable(&gUnknown_80B9C00); // set up intrrupt vector/table + + REG_TM3CNT = (TIMER_64CLK | TIMER_INTR_ENABLE | TIMER_ENABLE) << 16; + + REG_IE |= INTR_FLAG_GAMEPAK | INTR_FLAG_TIMER3 | INTR_FLAG_VCOUNT | INTR_FLAG_VBLANK; // 0x2045 + REG_DISPSTAT = DISPSTAT_VCOUNT_INTR | DISPSTAT_VBLANK_INTR; + gUnknown_203B0AE = -1; + gUnknown_203B0AC = 0; + sub_800D6AC(); // Some other IO REG update func + sub_800D7D0(); // Some other IO REG update func + gInterruptsEnabled = 1; + EnableInterrupts(); + + while(REG_VCOUNT <= 159){} +} + +bool8 EnableInterrupts(void) +{ + if(!gInterruptsEnabled) + { + return FALSE; + } + + if(REG_IME & 1) + { + return FALSE; + } + else + { + REG_IME = 1; + return TRUE; + } +} + +bool8 DisableInterrupts(void) +{ + if(!gInterruptsEnabled) + { + return FALSE; + } + + if(!(REG_IME & 1)) + { + return FALSE; + } + else + { + REG_IME = 0; + return TRUE; + } + +} + +bool8 sub_800B650(void) +{ + if(!gInterruptsEnabled) + { + return FALSE; + } + + if(REG_IME & 1) + { + return FALSE; + } + else + { + return TRUE; + } +} + +void SetInterruptFlag(u16 flag) +{ + if(!gInterruptsEnabled) + { + return; + } + + REG_IME = 0; + INTR_CHECK |= flag; + REG_IME = 1; +} + +void InitIntrTable(const u32 *interrupt_table) +{ + CpuCopy32(interrupt_table, &gIntrTable, 0x18); // 0x18 = 0x6 * 4 (0x4f00 is 32 bits) + CpuCopy32(&IntrMain, &gUnknown_202D4B8, 0x120); // 0x120 = 0x48 * 4 (0x4f00 is 32 bits) + INTR_VECTOR = &gUnknown_202D4B8; +} + +u32 *sub_800B6E8(u32 r0) +{ + return &gIntrTable[r0]; +} + +void *sub_800B6F4(u32 index, void * new_callback) +{ + void *old_callback; + u32 interrupt_var; + + interrupt_var = DisableInterrupts(); + old_callback = gUnknown_202D5F0[index]; + gUnknown_202D5F0[index] = new_callback; + if(interrupt_var){ + EnableInterrupts(); + } + return old_callback; +} + diff --git a/src/music_pre.c b/src/music_pre.c index 292f0a8..4260ea1 100644 --- a/src/music_pre.c +++ b/src/music_pre.c @@ -1,6 +1,7 @@ #include "global.h" #include "gba/io_reg.h" #include "m4a.h" +#include "bg.h" extern void nullsub_19(void); extern void nullsub_20(u16 songIndex); @@ -31,8 +32,62 @@ struct unkStruct_3000FD8 extern struct unkStruct_3000FD8 gUnknown_3000FD8[8]; +extern u8 gUnknown_202D7FE; +extern u16 gUnknown_202D7FC; +extern struct BGControlStruct gUnknown_202D698; +extern struct BGControlStruct gUnknown_202D6A0; +extern struct BGControlStruct gUnknown_202D6A8; +extern struct BGControlStruct gUnknown_202D6B0; + void sub_800BF80(void); +void nullsub_17(void) +{ +} + +void UpdateBGControlRegisters(void) +{ + u32 BG[4]; + + if(gUnknown_202D7FE == 1) + { + BG[0] = 1; + BG[1] = 2; + BG[2] = 0; + BG[3] = 3; + } + else + { + BG[0] = 0; + BG[1] = 1; + BG[2] = 2; + BG[3] = 3; + } + + REG_BG0HOFS = gUnknown_202D698.hofs; + REG_BG0VOFS = gUnknown_202D698.vofs; + REG_BG1HOFS = gUnknown_202D6A0.hofs; + REG_BG1VOFS = gUnknown_202D6A0.vofs; + REG_BG2HOFS = gUnknown_202D6A8.hofs; + REG_BG2VOFS = gUnknown_202D6A8.vofs; + REG_BG3HOFS = gUnknown_202D6B0.hofs; + REG_BG3VOFS = gUnknown_202D6B0.vofs; + + REG_BG0CNT = BG[0] | 0xB0 << 6; + REG_BG1CNT = BG[1] | 0xB4 << 6; + if(gUnknown_202D6A8.unk2 == 0x80 << 8) + { + REG_BG2CNT = BG[2] | 0x2e08; + } + else + { + REG_BG2CNT = BG[2] | 0xB8 << 6; + } + + REG_BG3CNT = BG[3] | 0x2f08; + REG_BLDCNT = gUnknown_202D7FC; +} + // Some kind of initializer for music? void sub_800BD08(void) { |