summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/dma3_manager.s578
-rw-r--r--asm/librfu.s8
-rw-r--r--ld_script.txt2
-rw-r--r--src/dma3_manager.c524
-rw-r--r--sym_bss.txt19
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