diff options
-rw-r--r-- | asm/dma3_manager.s | 578 | ||||
-rw-r--r-- | asm/librfu.s | 8 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/dma3_manager.c | 524 | ||||
-rw-r--r-- | sym_bss.txt | 19 |
5 files changed, 532 insertions, 599 deletions
diff --git a/asm/dma3_manager.s b/asm/dma3_manager.s deleted file mode 100644 index 3d08f98de..000000000 --- a/asm/dma3_manager.s +++ /dev/null @@ -1,578 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start ClearDma3Requests -ClearDma3Requests: @ 8000BFC - push {lr} - ldr r2, _08000C28 @ =gUnknown_30008C8 - movs r0, 0x1 - strb r0, [r2] - ldr r1, _08000C2C @ =gUnknown_30008C9 - movs r0, 0 - strb r0, [r1] - movs r3, 0 - ldr r0, _08000C30 @ =gUnknown_30000C8 - movs r1, 0x7F -_08000C10: - strh r3, [r0, 0x8] - str r3, [r0] - str r3, [r0, 0x4] - adds r0, 0x10 - subs r1, 0x1 - cmp r1, 0 - bge _08000C10 - movs r0, 0 - strb r0, [r2] - pop {r0} - bx r0 - .align 2, 0 -_08000C28: .4byte gUnknown_30008C8 -_08000C2C: .4byte gUnknown_30008C9 -_08000C30: .4byte gUnknown_30000C8 - thumb_func_end ClearDma3Requests - - thumb_func_start ProcessDma3Requests -ProcessDma3Requests: @ 8000C34 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xC - ldr r0, _08000CB0 @ =gUnknown_30008C8 - ldrb r0, [r0] - cmp r0, 0 - beq _08000C4A - b _08000E8A -_08000C4A: - movs r0, 0 - str r0, [sp, 0x8] - ldr r1, _08000CB4 @ =gUnknown_30000C8 - ldr r2, _08000CB8 @ =gUnknown_30008C9 - ldrb r0, [r2] - lsls r0, 4 - adds r0, r1 - ldrh r0, [r0, 0x8] - mov r12, r2 - cmp r0, 0 - bne _08000C62 - b _08000E8A -_08000C62: - mov r8, r1 - adds r1, 0x4 - mov r10, r1 - movs r6, 0x80 - lsls r6, 5 - ldr r7, _08000CBC @ =0x040000d4 - movs r2, 0 - mov r9, r2 -_08000C72: - mov r3, r12 - ldrb r0, [r3] - lsls r5, r0, 4 - mov r0, r8 - adds r1, r5, r0 - ldrh r0, [r1, 0x8] - ldr r2, [sp, 0x8] - adds r0, r2, r0 - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0x8] - movs r0, 0xA0 - lsls r0, 8 - ldr r3, [sp, 0x8] - cmp r3, r0 - bls _08000C94 - b _08000E8A -_08000C94: - ldr r0, _08000CC0 @ =0x04000006 - ldrb r0, [r0] - cmp r0, 0xE0 - bls _08000C9E - b _08000E8A -_08000C9E: - ldrh r0, [r1, 0xA] - cmp r0, 0x2 - beq _08000D14 - cmp r0, 0x2 - bgt _08000CC4 - cmp r0, 0x1 - beq _08000CD0 - b _08000E34 - .align 2, 0 -_08000CB0: .4byte gUnknown_30008C8 -_08000CB4: .4byte gUnknown_30000C8 -_08000CB8: .4byte gUnknown_30008C9 -_08000CBC: .4byte 0x040000d4 -_08000CC0: .4byte 0x04000006 -_08000CC4: - cmp r0, 0x3 - beq _08000D80 - cmp r0, 0x4 - bne _08000CCE - b _08000DCC -_08000CCE: - b _08000E34 -_08000CD0: - ldr r3, [r1] - mov r2, r10 - adds r0, r5, r2 - ldr r2, [r0] - ldrh r1, [r1, 0x8] - cmp r1, r6 - bhi _08000CEA - str r3, [r7] - str r2, [r7, 0x4] - lsrs r0, r1, 2 - movs r1, 0x84 - lsls r1, 24 - b _08000DEE -_08000CEA: - ldr r4, _08000D0C @ =0x040000d4 - str r3, [r4] - str r2, [r4, 0x4] - ldr r0, _08000D10 @ =0x84000400 - str r0, [r4, 0x8] - ldr r0, [r4, 0x8] - adds r3, r6 - adds r2, r6 - subs r1, r6 - cmp r1, r6 - bhi _08000CEA - str r3, [r4] - str r2, [r4, 0x4] - lsrs r0, r1, 2 - movs r1, 0x84 - lsls r1, 24 - b _08000DBA - .align 2, 0 -_08000D0C: .4byte 0x040000d4 -_08000D10: .4byte 0x84000400 -_08000D14: - mov r3, r10 - adds r0, r5, r3 - ldr r4, [r0] - ldrh r1, [r1, 0x8] - cmp r1, r6 - bhi _08000D38 - mov r0, r8 - adds r0, 0xC - adds r0, r5, r0 - ldr r0, [r0] - str r0, [sp] - mov r5, sp - str r5, [r7] - str r4, [r7, 0x4] - lsrs r0, r1, 2 - movs r1, 0x85 - lsls r1, 24 - b _08000DEE -_08000D38: - mov r2, r12 - ldrb r0, [r2] - lsls r0, 4 - mov r5, r8 - adds r5, 0xC - adds r0, r5 - ldr r0, [r0] - str r0, [sp] - ldr r3, _08000D78 @ =0x040000d4 - mov r0, sp - str r0, [r3] - str r4, [r3, 0x4] - ldr r0, _08000D7C @ =0x85000400 - str r0, [r3, 0x8] - ldr r0, [r3, 0x8] - adds r4, r6 - subs r1, r6 - cmp r1, r6 - bhi _08000D38 - ldrb r0, [r2] - lsls r0, 4 - adds r0, r5 - ldr r0, [r0] - str r0, [sp] - mov r2, sp - str r2, [r3] - str r4, [r3, 0x4] - lsrs r0, r1, 2 - movs r1, 0x85 - lsls r1, 24 - b _08000E2E - .align 2, 0 -_08000D78: .4byte 0x040000d4 -_08000D7C: .4byte 0x85000400 -_08000D80: - ldr r3, [r1] - mov r2, r10 - adds r0, r5, r2 - ldr r2, [r0] - ldrh r1, [r1, 0x8] - cmp r1, r6 - bhi _08000D9A - str r3, [r7] - str r2, [r7, 0x4] - lsrs r0, r1, 1 - movs r1, 0x80 - lsls r1, 24 - b _08000DEE -_08000D9A: - ldr r4, _08000DC4 @ =0x040000d4 - str r3, [r4] - str r2, [r4, 0x4] - ldr r0, _08000DC8 @ =0x80000800 - str r0, [r4, 0x8] - ldr r0, [r4, 0x8] - adds r3, r6 - adds r2, r6 - subs r1, r6 - cmp r1, r6 - bhi _08000D9A - str r3, [r4] - str r2, [r4, 0x4] - lsrs r0, r1, 1 - movs r1, 0x80 - lsls r1, 24 -_08000DBA: - orrs r0, r1 - str r0, [r4, 0x8] - ldr r0, [r4, 0x8] - b _08000E34 - .align 2, 0 -_08000DC4: .4byte 0x040000d4 -_08000DC8: .4byte 0x80000800 -_08000DCC: - mov r3, r10 - adds r0, r5, r3 - ldr r2, [r0] - ldrh r4, [r1, 0x8] - add r1, sp, 0x4 - cmp r4, r6 - bhi _08000DF6 - mov r0, r8 - adds r0, 0xC - adds r0, r5, r0 - ldr r0, [r0] - strh r0, [r1] - str r1, [r7] - str r2, [r7, 0x4] - lsrs r0, r4, 1 - movs r1, 0x81 - lsls r1, 24 -_08000DEE: - orrs r0, r1 - str r0, [r7, 0x8] - ldr r0, [r7, 0x8] - b _08000E34 -_08000DF6: - mov r5, r12 - ldrb r0, [r5] - lsls r0, 4 - ldr r3, _08000E9C @ =gUnknown_30000D4 - adds r0, r3 - ldr r0, [r0] - strh r0, [r1] - ldr r3, _08000EA0 @ =0x040000d4 - str r1, [r3] - str r2, [r3, 0x4] - ldr r0, _08000EA4 @ =0x81000800 - str r0, [r3, 0x8] - ldr r0, [r3, 0x8] - adds r2, r6 - subs r4, r6 - cmp r4, r6 - bhi _08000DF6 - ldrb r0, [r5] - lsls r0, 4 - ldr r5, _08000E9C @ =gUnknown_30000D4 - adds r0, r5 - ldr r0, [r0] - strh r0, [r1] - str r1, [r3] - str r2, [r3, 0x4] - lsrs r0, r4, 1 - movs r1, 0x81 - lsls r1, 24 -_08000E2E: - orrs r0, r1 - str r0, [r3, 0x8] - ldr r0, [r3, 0x8] -_08000E34: - ldr r1, _08000EA8 @ =gUnknown_30000C8 - mov r3, r12 - ldrb r0, [r3] - lsls r0, 4 - adds r0, r1 - mov r2, r9 - str r2, [r0] - ldrb r0, [r3] - lsls r0, 4 - add r0, r10 - str r2, [r0] - ldrb r0, [r3] - lsls r0, 4 - adds r0, r1 - movs r4, 0 - strh r2, [r0, 0x8] - ldrb r0, [r3] - lsls r0, 4 - adds r0, r1 - mov r5, r9 - strh r5, [r0, 0xA] - ldrb r0, [r3] - lsls r0, 4 - adds r1, 0xC - adds r0, r1 - mov r1, r9 - str r1, [r0] - ldrb r0, [r3] - adds r0, 0x1 - strb r0, [r3] - lsls r0, 24 - cmp r0, 0 - bge _08000E78 - strb r4, [r3] -_08000E78: - mov r2, r12 - ldrb r0, [r2] - lsls r0, 4 - ldr r3, _08000EA8 @ =gUnknown_30000C8 - adds r0, r3 - ldrh r0, [r0, 0x8] - cmp r0, 0 - beq _08000E8A - b _08000C72 -_08000E8A: - add sp, 0xC - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08000E9C: .4byte gUnknown_30000D4 -_08000EA0: .4byte 0x040000d4 -_08000EA4: .4byte 0x81000800 -_08000EA8: .4byte gUnknown_30000C8 - thumb_func_end ProcessDma3Requests - - thumb_func_start RequestDma3Copy -RequestDma3Copy: @ 8000EAC - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - mov r12, r0 - mov r8, r1 - lsls r2, 16 - lsrs r7, r2, 16 - lsls r3, 24 - lsrs r4, r3, 24 - movs r5, 0 - ldr r1, _08000EF8 @ =gUnknown_30008C8 - movs r0, 0x1 - strb r0, [r1] - ldr r0, _08000EFC @ =gUnknown_30008C9 - ldrb r2, [r0] - mov r10, r1 - ldr r6, _08000F00 @ =gUnknown_30000C8 - mov r9, r6 - lsls r0, r2, 4 - adds r1, r0, r6 -_08000ED8: - lsls r3, r2, 4 - ldrh r0, [r1, 0x8] - cmp r0, 0 - bne _08000F18 - mov r0, r12 - str r0, [r1] - mov r0, r9 - adds r0, 0x4 - adds r0, r3, r0 - mov r3, r8 - str r3, [r0] - strh r7, [r1, 0x8] - cmp r4, 0x1 - bne _08000F04 - strh r4, [r1, 0xA] - b _08000F08 - .align 2, 0 -_08000EF8: .4byte gUnknown_30008C8 -_08000EFC: .4byte gUnknown_30008C9 -_08000F00: .4byte gUnknown_30000C8 -_08000F04: - movs r0, 0x3 - strh r0, [r1, 0xA] -_08000F08: - movs r0, 0 - ldr r1, _08000F14 @ =gUnknown_30008C8 - strb r0, [r1] - lsls r0, r2, 16 - asrs r0, 16 - b _08000F34 - .align 2, 0 -_08000F14: .4byte gUnknown_30008C8 -_08000F18: - adds r1, 0x10 - adds r2, 0x1 - cmp r2, 0x7F - ble _08000F24 - adds r1, r6, 0 - movs r2, 0 -_08000F24: - adds r5, 0x1 - cmp r5, 0x7F - ble _08000ED8 - movs r0, 0 - mov r3, r10 - strb r0, [r3] - movs r0, 0x1 - negs r0, r0 -_08000F34: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end RequestDma3Copy - - thumb_func_start RequestDma3Fill -RequestDma3Fill: @ 8000F44 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - mov r9, r0 - mov r8, r1 - lsls r2, 16 - lsrs r7, r2, 16 - lsls r3, 24 - lsrs r5, r3, 24 - movs r6, 0 - ldr r0, _08000F9C @ =gUnknown_30008C9 - ldrb r2, [r0] - ldr r1, _08000FA0 @ =gUnknown_30008C8 - movs r0, 0x1 - strb r0, [r1] - mov r10, r1 - ldr r0, _08000FA4 @ =gUnknown_30000C8 - mov r12, r0 - mov r4, r12 - lsls r0, r2, 4 - adds r0, 0x8 - adds r1, r0, r4 -_08000F74: - lsls r3, r2, 4 - ldrh r0, [r1] - cmp r0, 0 - bne _08000FBC - adds r0, r4, 0x4 - adds r0, r3, r0 - mov r6, r8 - str r6, [r0] - strh r7, [r1] - strh r5, [r1, 0x2] - adds r0, r4, 0 - adds r0, 0xC - adds r0, r3, r0 - mov r3, r9 - str r3, [r0] - cmp r5, 0x1 - bne _08000FA8 - movs r0, 0x2 - b _08000FAA - .align 2, 0 -_08000F9C: .4byte gUnknown_30008C9 -_08000FA0: .4byte gUnknown_30008C8 -_08000FA4: .4byte gUnknown_30000C8 -_08000FA8: - movs r0, 0x4 -_08000FAA: - strh r0, [r1, 0x2] - movs r0, 0 - ldr r6, _08000FB8 @ =gUnknown_30008C8 - strb r0, [r6] - lsls r0, r2, 16 - asrs r0, 16 - b _08000FDA - .align 2, 0 -_08000FB8: .4byte gUnknown_30008C8 -_08000FBC: - adds r1, 0x10 - adds r2, 0x1 - cmp r2, 0x7F - ble _08000FCA - mov r1, r12 - adds r1, 0x8 - movs r2, 0 -_08000FCA: - adds r6, 0x1 - cmp r6, 0x7F - ble _08000F74 - movs r0, 0 - mov r1, r10 - strb r0, [r1] - movs r0, 0x1 - negs r0, r0 -_08000FDA: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end RequestDma3Fill - - thumb_func_start CheckForSpaceForDma3Request -CheckForSpaceForDma3Request: @ 8000FE8 - push {lr} - movs r2, 0 - lsls r0, 16 - asrs r1, r0, 16 - movs r3, 0x1 - negs r3, r3 - cmp r1, r3 - bne _08001010 - ldr r1, _0800100C @ =gUnknown_30000C8 -_08000FFA: - ldrh r0, [r1, 0x8] - cmp r0, 0 - bne _0800101C - adds r1, 0x10 - adds r2, 0x1 - cmp r2, 0x7F - ble _08000FFA -_08001008: - movs r0, 0 - b _08001020 - .align 2, 0 -_0800100C: .4byte gUnknown_30000C8 -_08001010: - ldr r0, _08001024 @ =gUnknown_30000C8 - lsls r1, 4 - adds r1, r0 - ldrh r0, [r1, 0x8] - cmp r0, 0 - beq _08001008 -_0800101C: - movs r0, 0x1 - negs r0, r0 -_08001020: - pop {r1} - bx r1 - .align 2, 0 -_08001024: .4byte gUnknown_30000C8 - thumb_func_end CheckForSpaceForDma3Request - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/librfu.s b/asm/librfu.s index f63867658..6995a9ac1 100644 --- a/asm/librfu.s +++ b/asm/librfu.s @@ -2770,11 +2770,11 @@ _081E0956: sub_81E095C: @ 81E095C push {lr} ldr r2, _081E0964 @ =gUnknown_86FC068 - ldr r3, _081E0968 @ =gUnknown_30000F0 + ldr r3, _081E0968 @ =0x30000F0 b _081E0976 .align 2, 0 _081E0964: .4byte gUnknown_86FC068 -_081E0968: .4byte gUnknown_30000F0 +_081E0968: .4byte 0x30000F0 _081E096C: ldrb r0, [r3] adds r3, 0x1 @@ -2800,7 +2800,7 @@ _081E0984: lsrs r1, r0, 24 cmp r1, 0x59 bls _081E0984 - ldr r0, _081E09C0 @ =gUnknown_30000FA + ldr r0, _081E09C0 @ =0x30000FA ldrh r0, [r0] cmp r3, r0 bne _081E09CC @@ -2819,7 +2819,7 @@ _081E0984: movs r0, 0 b _081E09CE .align 2, 0 -_081E09C0: .4byte gUnknown_30000FA +_081E09C0: .4byte 0x30000FA _081E09C4: .4byte gUnknown_3007460 _081E09C8: .4byte gUnknown_3007464 _081E09CC: diff --git a/ld_script.txt b/ld_script.txt index c04338479..432b55a78 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -84,7 +84,7 @@ SECTIONS { asm/crt0.o(.text); src/main.o(.text); src/gpu_regs.o(.text); - asm/dma3_manager.o(.text); + src/dma3_manager.o(.text); asm/bg.o(.text); asm/malloc.o(.text); asm/text_printer.o(.text); diff --git a/src/dma3_manager.c b/src/dma3_manager.c new file mode 100644 index 000000000..bb015c5cf --- /dev/null +++ b/src/dma3_manager.c @@ -0,0 +1,524 @@ +#include "global.h" +#include "dma3.h" + +IWRAM_DATA struct { + /* 0x00 */ const u8 *src; + /* 0x04 */ u8 *dest; + /* 0x08 */ u16 size; + /* 0x0A */ u16 mode; + /* 0x0C */ u32 value; +} gDma3Requests[128]; + +static bool8 gDma3ManagerLocked; +static u8 gDma3RequestCursor; + +void ClearDma3Requests(void) +{ + int i; + + gDma3ManagerLocked = TRUE; + gDma3RequestCursor = 0; + + for(i = 0; i < (u8)ARRAY_COUNT(gDma3Requests); i++) + { + gDma3Requests[i].size = 0; + gDma3Requests[i].src = 0; + gDma3Requests[i].dest = 0; + } + + gDma3ManagerLocked = FALSE; +} + +#ifdef NONMATCHING +void ProcessDma3Requests(void) +{ + // NOTE: the fillerA member of the DMA struct is actually u32 value; + u16 total_size; + + if (gDma3ManagerLocked) + return; + + total_size = 0; + + // as long as there are DMA requests to process (unless size or vblank is an issue), do not exit + while (gDma3Requests[gDma3RequestCursor].size) + { + total_size += gDma3Requests[gDma3RequestCursor].size; + + if (total_size > 0xA000) + return; // don't do too much at once + + if (REG_VCOUNT > 224) + return;// we're about to leave vblank, stop + + switch (gDma3Requests[gDma3RequestCursor].mode) + { + case 1: // regular 32-bit copy + // _08000C8C + if(gDma3Requests[gDma3RequestCursor].size <= 0x1000) + { + DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size); + break; + } + while (gDma3Requests[gDma3RequestCursor].size > 0x1000) + { + DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, 0x1000); + gDma3Requests[gDma3RequestCursor].src += 0x1000; + gDma3Requests[gDma3RequestCursor].dest += 0x1000; + gDma3Requests[gDma3RequestCursor].size -= 0x1000; + } + DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size); + break; + case 2: // repeat a single 32-bit value across RAM + // _08000CD0 + while (gDma3Requests[gDma3RequestCursor].size > 0x1000) + { + DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, 0x1000); + gDma3Requests[gDma3RequestCursor].dest += 0x1000; + gDma3Requests[gDma3RequestCursor].size -= 0x1000; + } + DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size); + break; + case 3: // regular 16-bit copy + // _08000D3C + while (gDma3Requests[gDma3RequestCursor].size > 0x1000) + { + DmaCopy16(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, 0x1000); + gDma3Requests[gDma3RequestCursor].src += 0x1000; + gDma3Requests[gDma3RequestCursor].dest += 0x1000; + gDma3Requests[gDma3RequestCursor].size -= 0x1000; + } + DmaCopy16(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size); + break; + case 4: // repeat a single 16-bit value across RAM + // _08000D88 + while (gDma3Requests[gDma3RequestCursor].size > 0x1000) + { + DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, 0x1000); + gDma3Requests[gDma3RequestCursor].dest += 0x1000; + gDma3Requests[gDma3RequestCursor].size -= 0x1000; + } + DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size); + break; + } + gDma3Requests[gDma3RequestCursor].src = NULL; + gDma3Requests[gDma3RequestCursor].dest = NULL; + gDma3Requests[gDma3RequestCursor].size = 0; + gDma3Requests[gDma3RequestCursor].mode = 0; + gDma3Requests[gDma3RequestCursor].value = 0; + gDma3RequestCursor++; + + if (gDma3RequestCursor >= 128) // loop back to the first DMA request + gDma3RequestCursor = 0; + } +} +#else +__attribute__((naked)) +void ProcessDma3Requests(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0xC\n\ + ldr r0, =gDma3ManagerLocked\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _08000C06\n\ + b _08000E46\n\ +_08000C06:\n\ + movs r0, 0\n\ + str r0, [sp, 0x8]\n\ + ldr r1, =gDma3Requests\n\ + ldr r2, =gDma3RequestCursor\n\ + ldrb r0, [r2]\n\ + lsls r0, 4\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x8]\n\ + mov r12, r2\n\ + cmp r0, 0\n\ + bne _08000C1E\n\ + b _08000E46\n\ +_08000C1E:\n\ + mov r8, r1\n\ + adds r1, 0x4\n\ + mov r10, r1\n\ + movs r6, 0x80\n\ + lsls r6, 5\n\ + ldr r7, =0x040000D4 @REG_DMA3\n\ + movs r2, 0\n\ + mov r9, r2\n\ +_08000C2E:\n\ + mov r3, r12 @ gDma3RequestCursor\n\ + ldrb r0, [r3]\n\ + lsls r5, r0, 4\n\ + mov r0, r8 @ gDma3Requests\n\ + adds r1, r5, r0 @ gDma3Requests[gDma3RequestCursor]\n\ + ldrh r0, [r1, 0x8] @ gDma3Requests[gDma3RequestCursor].size\n\ + ldr r2, [sp, 0x8]\n\ + adds r0, r2, r0\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x8]\n\ + movs r0, 0xA0\n\ + lsls r0, 8\n\ + ldr r3, [sp, 0x8]\n\ + cmp r3, r0\n\ + bls _08000C50\n\ + b _08000E46\n\ +_08000C50:\n\ + ldr r0, =0x04000006 @REG_VCOUNT\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xE0\n\ + bls _08000C5A\n\ + b _08000E46\n\ +_08000C5A:\n\ + ldrh r0, [r1, 0xA]\n\ + cmp r0, 0x2\n\ + beq _08000CD0\n\ + cmp r0, 0x2\n\ + bgt _08000C80\n\ + cmp r0, 0x1\n\ + beq _08000C8C\n\ + b _08000DF0\n\ + .pool\n\ +_08000C80:\n\ + cmp r0, 0x3\n\ + beq _08000D3C\n\ + cmp r0, 0x4\n\ + bne _08000C8A\n\ + b _08000D88\n\ +_08000C8A:\n\ + b _08000DF0\n\ +_08000C8C:\n\ + ldr r3, [r1]\n\ + mov r2, r10\n\ + adds r0, r5, r2\n\ + ldr r2, [r0]\n\ + ldrh r1, [r1, 0x8]\n\ + cmp r1, r6\n\ + bhi _08000CA6\n\ + str r3, [r7]\n\ + str r2, [r7, 0x4]\n\ + lsrs r0, r1, 2\n\ + movs r1, 0x84\n\ + lsls r1, 24\n\ + b _08000DAA\n\ +_08000CA6:\n\ + ldr r4, =0x040000D4 @REG_DMA3\n\ + str r3, [r4]\n\ + str r2, [r4, 0x4]\n\ + ldr r0, =0x84000400\n\ + str r0, [r4, 0x8]\n\ + ldr r0, [r4, 0x8]\n\ + adds r3, r6\n\ + adds r2, r6\n\ + subs r1, r6\n\ + cmp r1, r6\n\ + bhi _08000CA6\n\ + str r3, [r4]\n\ + str r2, [r4, 0x4]\n\ + lsrs r0, r1, 2\n\ + movs r1, 0x84\n\ + lsls r1, 24\n\ + b _08000D76\n\ + .pool\n\ +_08000CD0:\n\ + mov r3, r10\n\ + adds r0, r5, r3\n\ + ldr r4, [r0]\n\ + ldrh r1, [r1, 0x8]\n\ + cmp r1, r6\n\ + bhi _08000CF4\n\ + mov r0, r8\n\ + adds r0, 0xC\n\ + adds r0, r5, r0\n\ + ldr r0, [r0]\n\ + str r0, [sp]\n\ + mov r5, sp\n\ + str r5, [r7]\n\ + str r4, [r7, 0x4]\n\ + lsrs r0, r1, 2\n\ + movs r1, 0x85\n\ + lsls r1, 24\n\ + b _08000DAA\n\ +_08000CF4:\n\ + mov r2, r12\n\ + ldrb r0, [r2]\n\ + lsls r0, 4\n\ + mov r5, r8\n\ + adds r5, 0xC\n\ + adds r0, r5\n\ + ldr r0, [r0]\n\ + str r0, [sp]\n\ + ldr r3, =0x040000D4 @REG_DMA3\n\ + mov r0, sp\n\ + str r0, [r3]\n\ + str r4, [r3, 0x4]\n\ + ldr r0, =0x85000400\n\ + str r0, [r3, 0x8]\n\ + ldr r0, [r3, 0x8]\n\ + adds r4, r6\n\ + subs r1, r6\n\ + cmp r1, r6\n\ + bhi _08000CF4\n\ + ldrb r0, [r2]\n\ + lsls r0, 4\n\ + adds r0, r5\n\ + ldr r0, [r0]\n\ + str r0, [sp]\n\ + mov r2, sp\n\ + str r2, [r3]\n\ + str r4, [r3, 0x4]\n\ + lsrs r0, r1, 2\n\ + movs r1, 0x85\n\ + lsls r1, 24\n\ + b _08000DEA\n\ + .pool\n\ +_08000D3C:\n\ + ldr r3, [r1]\n\ + mov r2, r10\n\ + adds r0, r5, r2\n\ + ldr r2, [r0]\n\ + ldrh r1, [r1, 0x8]\n\ + cmp r1, r6\n\ + bhi _08000D56\n\ + str r3, [r7]\n\ + str r2, [r7, 0x4]\n\ + lsrs r0, r1, 1\n\ + movs r1, 0x80\n\ + lsls r1, 24\n\ + b _08000DAA\n\ +_08000D56:\n\ + ldr r4, =0x040000D4 @REG_DMA3\n\ + str r3, [r4]\n\ + str r2, [r4, 0x4]\n\ + ldr r0, =0x80000800\n\ + str r0, [r4, 0x8]\n\ + ldr r0, [r4, 0x8]\n\ + adds r3, r6\n\ + adds r2, r6\n\ + subs r1, r6\n\ + cmp r1, r6\n\ + bhi _08000D56\n\ + str r3, [r4]\n\ + str r2, [r4, 0x4]\n\ + lsrs r0, r1, 1\n\ + movs r1, 0x80\n\ + lsls r1, 24\n\ +_08000D76:\n\ + orrs r0, r1\n\ + str r0, [r4, 0x8]\n\ + ldr r0, [r4, 0x8]\n\ + b _08000DF0\n\ + .pool\n\ +_08000D88:\n\ + mov r3, r10\n\ + adds r0, r5, r3\n\ + ldr r2, [r0]\n\ + ldrh r4, [r1, 0x8]\n\ + add r1, sp, 0x4\n\ + cmp r4, r6\n\ + bhi _08000DB2\n\ + mov r0, r8\n\ + adds r0, 0xC\n\ + adds r0, r5, r0\n\ + ldr r0, [r0]\n\ + strh r0, [r1]\n\ + str r1, [r7]\n\ + str r2, [r7, 0x4]\n\ + lsrs r0, r4, 1\n\ + movs r1, 0x81\n\ + lsls r1, 24\n\ +_08000DAA:\n\ + orrs r0, r1\n\ + str r0, [r7, 0x8]\n\ + ldr r0, [r7, 0x8]\n\ + b _08000DF0\n\ +_08000DB2:\n\ + mov r5, r12\n\ + ldrb r0, [r5]\n\ + lsls r0, 4\n\ + ldr r3, =gDma3Requests + 0x0C\n\ + adds r0, r3\n\ + ldr r0, [r0]\n\ + strh r0, [r1]\n\ + ldr r3, =0x040000D4 @REG_DMA3\n\ + str r1, [r3]\n\ + str r2, [r3, 0x4]\n\ + ldr r0, =0x81000800\n\ + str r0, [r3, 0x8]\n\ + ldr r0, [r3, 0x8]\n\ + adds r2, r6\n\ + subs r4, r6\n\ + cmp r4, r6\n\ + bhi _08000DB2\n\ + ldrb r0, [r5]\n\ + lsls r0, 4\n\ + ldr r5, =gDma3Requests + 0x0C\n\ + adds r0, r5\n\ + ldr r0, [r0]\n\ + strh r0, [r1]\n\ + str r1, [r3]\n\ + str r2, [r3, 0x4]\n\ + lsrs r0, r4, 1\n\ + movs r1, 0x81\n\ + lsls r1, 24\n\ +_08000DEA:\n\ + orrs r0, r1\n\ + str r0, [r3, 0x8]\n\ + ldr r0, [r3, 0x8]\n\ +_08000DF0:\n\ + ldr r1, =gDma3Requests\n\ + mov r3, r12\n\ + ldrb r0, [r3]\n\ + lsls r0, 4\n\ + adds r0, r1\n\ + mov r2, r9\n\ + str r2, [r0]\n\ + ldrb r0, [r3]\n\ + lsls r0, 4\n\ + add r0, r10\n\ + str r2, [r0]\n\ + ldrb r0, [r3]\n\ + lsls r0, 4\n\ + adds r0, r1\n\ + movs r4, 0\n\ + strh r2, [r0, 0x8]\n\ + ldrb r0, [r3]\n\ + lsls r0, 4\n\ + adds r0, r1\n\ + mov r5, r9\n\ + strh r5, [r0, 0xA]\n\ + ldrb r0, [r3]\n\ + lsls r0, 4\n\ + adds r1, 0xC\n\ + adds r0, r1\n\ + mov r1, r9\n\ + str r1, [r0]\n\ + ldrb r0, [r3]\n\ + adds r0, 0x1\n\ + strb r0, [r3]\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bge _08000E34\n\ + strb r4, [r3]\n\ +_08000E34:\n\ + mov r2, r12\n\ + ldrb r0, [r2]\n\ + lsls r0, 4\n\ + ldr r3, =gDma3Requests\n\ + adds r0, r3\n\ + ldrh r0, [r0, 0x8]\n\ + cmp r0, 0\n\ + beq _08000E46\n\ + b _08000C2E\n\ +_08000E46:\n\ + add sp, 0xC\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided"); +} +#endif + +int RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode) +{ + int cursor; + int var = 0; + + gDma3ManagerLocked = 1; + + cursor = gDma3RequestCursor; + while(1) + { + if(!gDma3Requests[cursor].size) // an empty copy was found and the current cursor will be returned. + { + gDma3Requests[cursor].src = src; + gDma3Requests[cursor].dest = dest; + gDma3Requests[cursor].size = size; + + if(mode == 1) + gDma3Requests[cursor].mode = mode; + else + gDma3Requests[cursor].mode = 3; + + gDma3ManagerLocked = FALSE; + return (s16)cursor; + } + if(++cursor >= 0x80) // loop back to start. + { + cursor = 0; + } + if(++var >= 0x80) // max checks were made. all resulted in failure. + { + break; + } + } + gDma3ManagerLocked = FALSE; + return -1; +} + +int RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode) +{ + int cursor; + int var = 0; + + cursor = gDma3RequestCursor; + gDma3ManagerLocked = 1; + + while(1) + { + if(!gDma3Requests[cursor].size) + { + gDma3Requests[cursor].dest = dest; + gDma3Requests[cursor].size = size; + gDma3Requests[cursor].mode = mode; + gDma3Requests[cursor].value = value; + + if(mode == 1) + gDma3Requests[cursor].mode = 2; + else + gDma3Requests[cursor].mode = 4; + + gDma3ManagerLocked = FALSE; + return (s16)cursor; + } + if(++cursor >= 0x80) // loop back to start. + { + cursor = 0; + } + if(++var >= 0x80) // max checks were made. all resulted in failure. + { + break; + } + } + gDma3ManagerLocked = FALSE; + return -1; +} + +int CheckForSpaceForDma3Request(s16 index) +{ + int current = 0; + + if (index == -1) + { + for (; current < 0x80; current ++) + if (gDma3Requests[current].size) + return -1; + + return 0; + } + + if (gDma3Requests[index].size) + return -1; + + return 0; +} diff --git a/sym_bss.txt b/sym_bss.txt index a4d2e870d..be1acb833 100644 --- a/sym_bss.txt +++ b/sym_bss.txt @@ -2,24 +2,11 @@ .space 0x4 -gUnknown_30000C8: @ 30000C8 - .space 0xC + .include "src/dma3_manager.o" -gUnknown_30000D4: @ 30000D4 - .space 0x1C - -gUnknown_30000F0: @ 30000F0 - .space 0xA - -gUnknown_30000FA: @ 30000FA - .space 0x7CE - -gUnknown_30008C8: @ 30008C8 - .space 0x1 - -gUnknown_30008C9: @ 30008C9 - .space 0x7 + .space 0x4 + .align 2 gUnknown_30008D0: @ 30008D0 .space 0x18 |