summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/MI_dma_card.s44
-rw-r--r--arm9/lib/include/MI_dma.h3
-rw-r--r--arm9/lib/include/MI_dma_card.h8
-rw-r--r--arm9/lib/src/MI_dma_card.c24
4 files changed, 35 insertions, 44 deletions
diff --git a/arm9/asm/MI_dma_card.s b/arm9/asm/MI_dma_card.s
deleted file mode 100644
index 75d15a1f..00000000
--- a/arm9/asm/MI_dma_card.s
+++ /dev/null
@@ -1,44 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start MIi_CardDmaCopy32
-MIi_CardDmaCopy32: ; 0x020CE5BC
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r5, r1
- mov r6, r0
- mov r7, r3
- mvn r1, #0x0
- mov r4, r2
- bl MIi_CheckAnotherAutoDMA
- mov r0, r6
- mov r1, r5
- mov r2, r7
- mov r3, #0x1000000
- bl MIi_CheckDma0SourceAddress
-_020CE5F0:
- cmp r7, #0x0
- addeq sp, sp, #0x4
- ldmeqia sp!, {r4-r7, lr}
- bxeq lr
- mov r0, #0x3
- mul r1, r6, r0
- ldr r0, _020CE640
- add r1, r1, #0x2
- add r1, r0, r1, lsl #0x2
-_020CE614:
- ldr r0, [r1]
- ands r0, r0, #0x80000000
- bne _020CE614
- ldr r3, _020CE644
- mov r0, r6
- mov r1, r5
- mov r2, r4
- bl MIi_DmaSetParams
- add sp, sp, #0x4
- ldmia sp!, {r4-r7, lr}
- bx lr
-_020CE640: .word 0x040000B0
-_020CE644: .word 0xAf000001
diff --git a/arm9/lib/include/MI_dma.h b/arm9/lib/include/MI_dma.h
index e8938ef9..bf07129a 100644
--- a/arm9/lib/include/MI_dma.h
+++ b/arm9/lib/include/MI_dma.h
@@ -16,6 +16,9 @@ typedef void (*MIDmaCallback)(void *);
#define MI_CNT_COPY32_IF(size) (0xc4000000 | ((size)/4))
#define MI_CNT_COPY16(size) (0x80000000 | ((size)/2))
+#define MI_DMA_SRC_FIX (2UL << 23)
+#define MIi_DMA_TIMING_ANY (u32)(~0)
+
typedef union
{
u32 b32;
diff --git a/arm9/lib/include/MI_dma_card.h b/arm9/lib/include/MI_dma_card.h
new file mode 100644
index 00000000..efd70ba6
--- /dev/null
+++ b/arm9/lib/include/MI_dma_card.h
@@ -0,0 +1,8 @@
+#ifndef POKEDIAMOND_MI_DMA_CARD_H
+#define POKEDIAMOND_MI_DMA_CARD_H
+
+#include "nitro/types.h"
+
+void MIi_CardDmaCopy32(u32 dmaNo, const void *src, void *dest, u32 size);
+
+#endif //POKEDIAMOND_MI_DMA_CARD_H
diff --git a/arm9/lib/src/MI_dma_card.c b/arm9/lib/src/MI_dma_card.c
new file mode 100644
index 00000000..c3b8b897
--- /dev/null
+++ b/arm9/lib/src/MI_dma_card.c
@@ -0,0 +1,24 @@
+#include "MI_dma_card.h"
+#include "MI_dma.h"
+#include "function_target.h"
+
+ARM_FUNC void MIi_CardDmaCopy32(u32 dmaNo, const void *src, void *dest, u32 size)
+{
+ MIi_CheckAnotherAutoDMA(dmaNo, MIi_DMA_TIMING_ANY);
+ MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_FIX);
+
+ if (size == 0)
+ {
+ return;
+ }
+
+ vu32 *dmaCntp;
+
+ do
+ {
+ dmaCntp = &((vu32 *)REG_ADDR_DMA0SAD)[dmaNo * 3 + 2];
+ while (*dmaCntp & 0x80000000) {}
+ } while(0);
+
+ MIi_DmaSetParams(dmaNo, (u32)src, (u32)dest, (u32)(0xaf000001));
+}